web-dev-qa-db-fra.com

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

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).

30
detly

Sous Linux, vous pouvez obtenir des informations de point de montage directement à partir du noyau dans /proc/mounts. Le programme mount enregistre des informations similaires dans /etc/mtab. Les chemins et les options peuvent être différents, comme /etc/mtab représente ce que mount a transmis au noyau tandis que /proc/mounts montre les données telles qu'elles sont vues à l'intérieur du noyau. /proc/mounts est toujours à jour alors que /etc/mtab pourrait ne pas l'être si /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 Edge où vous n'obtiendrez peut-être pas ce que vous attendez. Si l'appareil a été monté via un chemin différent dans /dev qui désigne le même appareil, vous ne le remarquerez pas de cette façon. Dans /proc/mounts, les montures de reliure ne se distinguent pas de l'original. Il peut y avoir plusieurs correspondances si un point de montage en ombre une autre (ce qui est inhabituel).

Dans /proc/self ou /proc/$pid, il existe un fichier mounts 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é mountinfo qui a un format différent et inclut plus d'informations, en particulier les numéros majeurs et mineurs du périphérique. 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}'

Sous Linux, vous pouvez désormais utiliser la commande findmnt de 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 de 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

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

Donc:

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
27
Stéphane Chazelas

La commande mount sans arguments listera tous les systèmes de fichiers actuellement montés; vous pouvez grep celui pour le disque que vous voulez (ou grep/etc/mtab, qui est le fichier mount lit les informations):

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
6
Michael Mrozek

Oui. Vous pouvez voir Affichage uniquement des points de montage intéressants/Filtrage des types non intéressants ou Liste des 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 (bien que lsblk puisse é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/sda1 est 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 --bind monté sur le coffre. D'accord...

Sudo umount /boot /esp
findmnt /dev/sda1

Rien. Que se passe-t-il?

echo "$?"

1

Ohhh ... Eh bien, c'est sympa. 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 ?.

2
mikeserv

Je ne connais pas de moyen propre et simple de détecter si oui ou non un nœud de périphérique dans /dev est monté. C'est pourtant ce que je peux offrir. Il gère les appareils montés directement (/dev/sda1) et les périphériques 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 à partir de /proc/mounts à stdout si trouvé, définissant également l'état de sortie sur 0. Sinon, l'état de sortie est 1.

1
roaima