Existe-t-il une commande pour voir où un disque est monté?

29

Existe-t-il une commande simple qui prend en entrée le nœud de périphérique d'un disque et me dit où (et si) ce disque est monté? Est-il possible d'obtenir le point de montage par lui-même, donc je peux le passer à une autre commande?

Je travaille sur un système live Debian Squeeze avec une installation minimale (je peux installer des paquets supplémentaires si nécessaire).

detly
la source

Réponses:

14

Sous Linux, vous pouvez obtenir des informations sur les points de montage directement à partir du noyau dans /proc/mounts. Le mountprogramme enregistre des informations similaires dans /etc/mtab. Les chemins et les options peuvent être différents, car ils /etc/mtabreprésentent ce qui est mountpassé au noyau tandis que /proc/mountsles données sont vues à l'intérieur du noyau. /proc/mountsest toujours à jour alors qu'il /etc/mtabpourrait ne pas l'être s'il /etcétait en lecture seule à un moment qui n'était pas prévu par les scripts de démarrage. Le format est similaire à /etc/fstab.

Dans les deux fichiers, le premier champ séparé par des espaces contient le chemin du périphérique et le deuxième champ contient le point de montage.

awk -v needle="$device_path" '$1==needle {print $2}' /proc/mounts

ou si vous n'avez pas awk:

grep "^$device_path " /proc/mounts | cut -d ' ' -f 2

Il existe un certain nombre de cas marginaux où vous n'obtiendrez peut-être pas ce que vous attendez. Si l'appareil a été monté via un chemin différent /devqui désigne le même appareil, vous ne le remarquerez pas de cette façon. Dans /proc/mounts, les montures de reliure ne peuvent être distinguées de l'original. Il peut y avoir plusieurs correspondances si un point de montage en ombre une autre (ce qui est inhabituel).

Dans /proc/selfou /proc/$pid, il existe un mountsfichier par processus qui imite le fichier global. Les informations de montage peuvent varier entre les processus, par exemple en raison de chroot. Il existe un fichier supplémentaire appelé mountinfoqui a un format différent et comprend plus d'informations, en particulier les numéros majeurs et mineurs de l'appareil. De la documentation :

36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
(1)(2)(3)   (4)   (5)      (6)      (7)   (8) (9)   (10)         (11)

(1) mount ID:  unique identifier of the mount (may be reused after umount)
(2) parent ID:  ID of parent (or of self for the top of the mount tree)
(3) major:minor:  value of st_dev for files on filesystem
(4) root:  root of the mount within the filesystem
(5) mount point:  mount point relative to the process's root
(6) mount options:  per mount options
(7) optional fields:  zero or more fields of the form "tag[:value]"
(8) separator:  marks the end of the optional fields
(9) filesystem type:  name of filesystem of the form "type[.subtype]"
(10) mount source:  filesystem specific information or "none"
(11) super options:  per super block options

Donc, si vous recherchez un appareil par numéro, vous pouvez le faire comme ceci:

awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'
Gilles 'SO- arrête d'être méchant'
la source
"Si le périphérique a été monté via un chemin différent dans / dev qui désigne le même périphérique, vous ne le remarquerez pas de cette façon." - C'est en fait le cas: j'ai le udiskslien symbolique (dans / dev / disk / by-label / ...). Mais je peux résoudre un nœud de périphérique en utilisant readlink -f. J'aime l' /proc/mountsidée, je pense que cela pourrait être un peu plus fiable que /etc/mtab.
detly
@detly Ou vous pouvez utiliser mountinfo. Appelez statpour obtenir les numéros de périphérique (voir ma réponse mise à jour, j'ai oublié d'inclure la commande plus tôt).
Gilles 'SO- arrête d'être méchant'
Vous devrez peut-être l' -d " "option pour cutdans cette grepcommande.
Craig McQueen
26

Sous Linux, vous pouvez désormais utiliser la findmntcommande depuis util-linux(depuis la version 2.18):

$ findmnt -S /dev/VG_SC/home
TARGET SOURCE                 FSTYPE OPTIONS
/home  /dev/mapper/VG_SC-home ext4   rw,relatime,errors=remount-ro,data=ordered

Ou lsblk(également depuis util-linux, depuis 2.19):

$ lsblk /dev/VG_SC/home
NAME       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
VG_SC-home 254:2    0  200G  0 lvm  /home

Celui-ci est également utile pour trouver tout le système de fichiers monté sous un périphérique spécifique (disque ou partition ...):

$ lsblk  /dev/sda2
NAME                    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda2                      8:2    0  59.5G  0 part
├─linux-debian64 (dm-1) 252:1    0    15G  0 lvm
└─linux-mint (dm-2)     252:2    0    15G  0 lvm  /

Pour obtenir le point de montage uniquement:

$ findmnt -nr -o target -S /dev/storage/home
/home
$ lsblk -o MOUNTPOINT -nr /dev/storage/home
/home

Ci findmnt- dessus revient avec un état de sortie d'échec si le périphérique n'est pas monté, non lsblk.

Alors:

if mountpoint=$(findmnt -nr -o target -S "$device"); then
  printf '"%s" is mounted on "%s"\n' "$device" "$mountpoint"
else
  printf '"%s" does not appear to be directly mounted\n' "$device"
fi
Stéphane Chazelas
la source
Il est toujours bon d'apprendre quelque chose de nouveau
roaima
6

La mountcommande sans arguments listera tous les systèmes de fichiers actuellement montés; vous pouvez le faire greppour le disque que vous voulez (ou grep /etc/mtab, dans lequel le fichier mountlit les informations):

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
Michael Mrozek
la source
Cela a cependant beaucoup de texte superflu. J'ai besoin de pouvoir passer le point de montage à d'autres commandes. (Désolé, j'ai clarifié cela dans le Q.)
detly
Ah, grep ${NODE} /etc/mtab | cut -d ' ' -f 2devrait le faire.
detly
Bien qu'il grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"soit beaucoup moins fragile ...
detly
2

Oui. Vous pouvez voir Afficher uniquement les points de montage intéressants / Filtrer les types non intéressants ou répertorier les répertoires sous /qui ne sont pas sous le même point de montage pour un exemple d'utilisation, mais il y a aussi un bref aperçu ci-dessous. La commande que vous demandez est findmnt (mais lsblkpourrait également servir) :

lsblk -f /dev/sda[12]

NAME FSTYPE LABEL UUID                                 MOUNTPOINT
sda1 vfat   ESP   F0B7-5DAE                            /esp
sda2 btrfs  sys   94749918-bde1-46e6-b77c-b66e0368ecdb /    

Maintenant, comme vous pouvez le voir, /dev/sda1est monté sur /esp. Je me demande si elle est montée ailleurs aussi?

findmnt /dev/sda1

TARGET SOURCE                    FSTYPE OPTIONS
/esp   /dev/sda1                 vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro
/boot  /dev/sda1[/EFI/arch_root] vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro

Aha. Je vois. Un sous-dossier est également --bindmonté sur le démarrage. D'accord...

sudo umount /boot /esp
findmnt /dev/sda1

Rien. Que se passe-t-il?

echo "$?"

1

Ohhh ... Eh bien, c'est bien. Hmmm ...

for d in 1 2
do    findmnt "/dev/sda$d" >/dev/null
      printf  "/dev/sda$d%.$((6>>!$?))s%s\n"\
              " isn't" " currently mounted."
done

/dev/sda1 isn't currently mounted.
/dev/sda2 is currently mounted.

Oh, ouais, c'est vraiment sympa.

for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda2[/arch_root] /

Maintenant, remettons sda1 à sa place et réessayons ...

sudo mount -a
for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda1                 /esp
/dev/sda1[/EFI/arch_root] /boot
/dev/sda2[/arch_root] /

Mais où ai-je trouvé cette commande magique?

man mount | sed -e:n -e'/findmnt/!d;N;/\n$/q;bn'

Pour une sortie plus robuste et personnalisable, utilisez findmnt(8) , en particulier dans vos scripts. Notez que les caractères de contrôle dans le nom du point de montage sont remplacés par ?.

mikeserv
la source
1

Je ne connais pas de moyen propre et simple de détecter si oui ou non un nœud de périphérique /devest monté. C'est pourtant ce que je peux offrir. Il gère les appareils montés directement ( /dev/sda1) et les appareils montés par UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f). Il se casse si les noms de votre appareil contiennent des espaces.

deviceIsMounted()
{
    local DEVICE="$1"
    local MOUNT=$(
        (
            echo "$DEVICE"
            find /dev -type l -lname "*${DEVICE/*\/}" -exec readlink -f {} \; -print |
                xargs -n2 |
                awk -v device="$DEVICE" '$1 == device {print $2}'
        ) |
            xargs -n1 -i{} grep -F {} /proc/mounts
    )
    test -n "$MOUNT" && echo "$MOUNT"
}

deviceIsMounted /dev/sda1 && echo yes              # Mountpoint and status
deviceIsMounted /dev/md2 >/dev/null && echo yes    # Just status

La fonction écrit l'entrée de /proc/mountsà stdout si elle est trouvée, définissant également l'état de sortie sur 0. Sinon, l'état de sortie est 1.

roaima
la source
-1

Exécutez simplement la commande ci-dessous:

df -h
Steve
la source