Y a-t-il une command pour voir où un disque est monté?

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

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

Sous Linux, vous pouvez get des informations sur le sharepoint assembly directement depuis le kernel dans /proc/mounts mount. Le programme de mount enregistre des informations similaires dans /etc/mtab . Les paths et les options peuvent être différents, car /etc/mtab représente ce que le mount transmis au kernel alors que /proc/mounts montre datatables vues à l'intérieur du kernel. /proc/mounts est toujours à jour alors que /etc/mtab pourrait ne pas être si /etc était en lecture seule à un moment qui n'était pas attendu par les scripts de démarrage. Le format est similaire à /etc/fstab .

Dans les deux files, le premier champ séparé par des espaces contient le path du périphérique et le deuxième champ contient le sharepoint assembly.

 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 y a un certain nombre de cas extrêmes où vous pourriez ne pas get ce que vous attendez. Si le périphérique a été monté via un autre path dans /dev qui désigne le même périphérique, vous ne le remarquerez pas de cette façon. Dans /proc/mounts , les montures de liens ne peuvent pas être distinguées de l'original. Il peut y avoir plus d'une correspondance si un sharepoint assembly en ombrage un autre (ce qui est inhabituel).

Dans /proc/self ou /proc/$pid , il existe un file de mounts par process qui imite le file global. L'information de assembly peut varier entre les process, par exemple en raison de chroot . Il existe un file supplémentaire appelé mountinfo qui 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 cherchez 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 maintenant utiliser la command findmnt d' 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 d' 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 find tout le système de files 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 get le sharepoint assembly uniquement:

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

Au-dessus de findmnt returnne avec un état de sortie d'échec si l'appareil n'est pas monté, pas 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 

La command mount sans arguments listra tous les filesystems actuellement montés; vous pouvez grep que pour le disque que vous voulez (ou grep /etc/mtab , qui est la mount file lit les informations de):

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

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

Oui. Vous pouvez voir Afficher uniquement des points de assembly intéressants / Filtrage des types non intéressants ou des directorys d'annonces sous / qui ne sont pas sous le même sharepoint assembly pour un exemple d'utilisation, mais il y a aussi un bref aperçu ci-dessous. La command que vous requestz 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 request si c'est monté 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 démarrage. D'accord…

 sudo umount /boot /esp findmnt /dev/sda1 

Rien. Que se passe-t-il?

 echo "$?" 

 1 

Ohhh … 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 le sda1 là où il appartient et réessayez …

 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ù est-ce que j'ai trouvé ce commandment magique?

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

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

Exécutez simplement la command ci-dessous:

 df -h