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