Existuje jednoduchý příkaz, který vezme uzel zařízení na disku jako vstup a řekne mi, kde (a zda) je tento disk připojen? Je možné získat bod připojení sám, takže jej mohu předat jinému příkazu?
Pracuji na živém systému Debian Squeeze s minimální instalací (v případě potřeby mohu nainstalovat další balíčky).
V systému Linux můžete získat informace o přípojných bodech přímo z jádra v /proc/mounts
. Program mount
zaznamenává podobné informace do /etc/mtab
. Cesty a možnosti se mohou lišit, například /etc/mtab
představuje to, co mount
předalo jádru, zatímco /proc/mounts
zobrazuje data viděná uvnitř jádra. /proc/mounts
je vždy aktuální, zatímco /etc/mtab
nemusí být, pokud /etc
bylo jen pro čtení v určitém okamžiku, což nebylo očekáváno bootovacími skripty. Formát je podobný /etc/fstab
.
V obou souborech obsahuje první pole oddělené bílými znaky cestu zařízení a druhé pole obsahuje bod připojení.
awk -v needle="$device_path" '$1==needle {print $2}' /proc/mounts
nebo pokud nemáte awk:
grep "^$device_path " /proc/mounts | cut -d ' ' -f 2
Existuje řada případů Edge, kde nemusíte dostat to, co očekáváte. Pokud bylo zařízení připojeno jinou cestou v /dev
, které označuje stejné zařízení, si toho nevšimnete. V /proc/mounts
, vázání je nerozeznatelné od originálu. Může existovat více než jedna shoda, pokud přípojný bod zastíní jiný (to je neobvyklé).
V /proc/self
nebo /proc/$pid
, existuje soubor mounts
za proces, který napodobuje globální soubor. Informace o připojení se mohou mezi procesy lišit, například z důvodu chroot
. Existuje další soubor s názvem mountinfo
, který má jiný formát a obsahuje více informací, zejména hlavní a vedlejší čísla zařízení. Z dokumentace :
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
Pokud tedy hledáte zařízení podle čísla, můžete to udělat takto:
awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'
V systému Linux můžete nyní použít příkaz findmnt
z util-linux
(od verze 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
Nebo lsblk
(také z util-linux
, od 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
Tento je také užitečný k nalezení celého souborového systému připojeného k určitému zařízení (disk nebo oddíl ...):
$ 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 /
Chcete-li získat pouze připojovací bod:
$ findmnt -nr -o target -S /dev/storage/home
/home
$ lsblk -o MOUNTPOINT -nr /dev/storage/home
/home
Nad findmnt
se nevrátí se stavem ukončení selhání, pokud zařízení není připojeno, nikoli lsblk
.
Tak:
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
Příkaz mount
bez argumentů vypíše všechny aktuálně připojené souborové systémy; můžete grep
to pro požadovaný disk (nebo grep
/etc/mtab
, což je soubor mount
přečte informace z):
$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
Ano. Můžete vidět Zobrazují se pouze zajímavé body připojení/Filtrování nezajímavých typů nebo Výpis adresářů pod /
které nejsou pod stejným připojovacím bodem pro některé příklady použití, ale níže je také krátký přehled. Příkaz, o který se ptáte, je findmnt
(ačkoliv může sloužit i lsblk
:
lsblk -f /dev/sda[12]
NAME FSTYPE LABEL UUID MOUNTPOINT
sda1 vfat ESP F0B7-5DAE /esp
sda2 btrfs sys 94749918-bde1-46e6-b77c-b66e0368ecdb /
Nyní, jak vidíte, /dev/sda1
je připojeno k /esp
. Zajímalo by mě, jestli je namontováno i jinde?
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. Chápu. Podsložka je také --bind
připojeno přes boot. OK...
Sudo umount /boot /esp
findmnt /dev/sda1
Nic. Co to k sakru?
echo "$?"
1
Ohhh ... No, to je pěkné. 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.
Jo, to je opravdu pěkné.
for d in /dev/sd*
do findmnt -noSOURCE,TARGET "$d"
done
/dev/sda2[/Arch_root] /
Nyní vraťme sda1 zpět, kam patří, a zkuste to znovu ...
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] /
Ale kde jsem našel tento magický příkaz?
man mount | sed -e:n -e'/findmnt/!d;N;/\n$/q;bn'
Pro robustnější a přizpůsobitelnější výstup použijte
findmnt
(8) , zejména ve vašich skriptech. Všimněte si, že kontrolní znaky v názvu připojovacího bodu jsou nahrazeny?
.
Nevím o čistém a jednoduchém způsobu, jak zjistit, zda uzel zařízení v /dev
je připojen. To však mohu nabídnout. Zpracovává přímo připojená zařízení (/dev/sda1
) a zařízení připojená pomocí UUID (/dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f
). Pokud název zařízení obsahuje mezeru, bude přerušen.
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
Funkce zapíše záznam z /proc/mounts
až stdout pokud je nalezen, nastaví se také stav ukončení na 0. Jinak je stav ukončení 1.