it-swarm-eu.dev

Existuje příkaz, abyste viděli, kde je disk připojen?

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

30
detly

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
27

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
6
Michael Mrozek

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

2
mikeserv

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/mountsstdout pokud je nalezen, nastaví se také stav ukončení na 0. Jinak je stav ukončení 1.

1
roaima