it-swarm.com.de

Gibt es einen Befehl, um zu sehen, wo eine Festplatte gemountet ist?

Gibt es einen einfachen Befehl, der den Geräteknoten einer Festplatte als Eingabe verwendet und mir sagt, wo (und ob) diese Festplatte bereitgestellt ist? Ist es möglich, den Mount-Punkt selbst abzurufen, damit ich ihn an einen anderen Befehl übergeben kann?

Ich arbeite an einem Debian Squeeze Live-System mit einer minimalen Installation (ich kann bei Bedarf zusätzliche Pakete installieren).

30
detly

Unter Linux können Sie Mountpunktinformationen direkt vom Kernel in /proc/mounts Abrufen. Das Programm mount zeichnet ähnliche Informationen in /etc/mtab Auf. Die Pfade und Optionen können unterschiedlich sein, da /etc/mtab Darstellt, was mount an den Kernel übergeben wurde, während /proc/mounts Die Daten im Kernel anzeigt. /proc/mounts Ist immer auf dem neuesten Stand, während /etc/mtab Möglicherweise nicht aktuell ist, wenn /etc Zu einem Zeitpunkt schreibgeschützt war, der von den Boot-Skripten nicht erwartet wurde. Das Format ähnelt /etc/fstab .

In beiden Dateien enthält das erste durch Leerzeichen getrennte Feld den Gerätepfad und das zweite Feld den Einhängepunkt.

awk -v needle="$device_path" '$1==needle {print $2}' /proc/mounts

oder wenn du kein awk hast:

grep "^$device_path " /proc/mounts | cut -d ' ' -f 2

Es gibt eine Reihe von Edge-Fällen, in denen Sie möglicherweise nicht das bekommen, was Sie erwarten. Wenn das Gerät über einen anderen Pfad in /dev Bereitgestellt wurde, der dasselbe Gerät kennzeichnet, werden Sie dies auf diese Weise nicht bemerken. In /proc/mounts Sind Bindungshalterungen nicht vom Original zu unterscheiden. Es kann mehr als eine Übereinstimmung geben, wenn ein Einhängepunkt einen anderen beschattet (dies ist ungewöhnlich).

In /proc/self Oder /proc/$pid Gibt es eine prozessbezogene mounts -Datei, die die globale Datei nachahmt. Die Mount-Informationen können zwischen Prozessen variieren, z. B. aufgrund von chroot . Es gibt eine zusätzliche Datei namens mountinfo, die ein anderes Format hat und weitere Informationen enthält, insbesondere die Haupt- und Nebennummern des Geräts. Aus der Dokumentation :

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

Wenn Sie also nach einem Gerät nach Nummer suchen, können Sie dies folgendermaßen tun:

awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'

Unter Linux können Sie jetzt den Befehl findmnt von util-linux (Seit Version 2.18) verwenden:

$ findmnt -S /dev/VG_SC/home
TARGET SOURCE                 FSTYPE OPTIONS
/home  /dev/mapper/VG_SC-home ext4   rw,relatime,errors=remount-ro,data=ordered

Oder lsblk (auch aus util-linux, Seit 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

Dieser ist auch nützlich, um das gesamte Dateisystem zu finden, das unter einem bestimmten Gerät (Festplatte oder Partition ...) bereitgestellt ist:

$ 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  /

So erhalten Sie nur den Mountpoint:

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

Oben findmnt wird mit einem Fehler-Exit-Status zurückgegeben, wenn das Gerät nicht gemountet ist, nicht lsblk.

Damit:

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

Der Befehl mount ohne Argumente listet alle aktuell gemounteten Dateisysteme auf. Sie können grep das für die gewünschte Festplatte (oder grep/etc/mtab, das ist die Datei mount liest die Informationen aus):

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

Ja. Sie können nur interessante Einhängepunkte anzeigen/nicht interessante Typen filtern oder Auflisten von Verzeichnissen unter /, Die sich nicht unter demselben Einhängepunkt befinden für einige Verwendungsbeispiele sehen, ==. Aber es gibt auch einen kurzen Überblick unten. Der Befehl, nach dem Sie fragen, lautet findmnt (obwohl lsblk möglicherweise auch dient) :

lsblk -f /dev/sda[12]

NAME FSTYPE LABEL UUID                                 MOUNTPOINT
sda1 vfat   ESP   F0B7-5DAE                            /esp
sda2 btrfs  sys   94749918-bde1-46e6-b77c-b66e0368ecdb /    

Wie Sie sehen, ist /dev/sda1 Nun auf /esp Bereitgestellt. Ich frage mich, ob es auch woanders montiert ist?

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. Aha. Ein Unterordner wird auch --bind Über dem Boot bereitgestellt. OK...

Sudo umount /boot /esp
findmnt /dev/sda1

Nichts. Was zum Teufel?

echo "$?"

1

Ohhh ... Nun, das ist schön. 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 ja, das ist wirklich schön.

for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda2[/Arch_root] /

Jetzt setzen wir sda1 wieder dahin, wo es hingehört, und versuchen es noch einmal ...

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] /

Aber wo habe ich diesen magischen Befehl gefunden?

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

Verwenden Sie für eine robustere und anpassbarere Ausgabe findmnt (8) , insbesondere in Ihren Skripten. Beachten Sie, dass Steuerzeichen im Mountpoint-Namen durch ? ersetzt werden.

2
mikeserv

Ich kenne keine saubere und einfache Methode, um festzustellen, ob ein Geräteknoten in /dev montiert. Dies kann ich jedoch anbieten. Es verarbeitet direkt montierte Geräte (/dev/sda1) und von UUID gemountete Geräte (/dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f). Es bricht ab, wenn Ihre Gerätenamen Leerzeichen enthalten.

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

Die Funktion schreibt den Eintrag aus /proc/mounts to stdout falls gefunden, setzt auch den Exit-Status auf 0. Andernfalls ist der Exit-Status 1.

1
roaima