Gibt es einen einfachen Befehl, der den Geräteknoten einer Festplatte als Eingabe verwendet und mir sagt, wo (und ob) diese Festplatte eingebunden ist? Ist es möglich, den Einbindungspunkt selbst abzurufen, sodass ich ihn an einen anderen Befehl weitergeben kann?
Ich arbeite an einem Debian Squeeze-Livesystem mit einer Minimalinstallation (ich kann bei Bedarf zusätzliche Pakete installieren).
Antwort1
Unter Linux können Sie jetzt (seit Version 2.18) den findmnt
folgenden Befehl verwenden:util-linux
$ 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
Dies ist auch nützlich, um alle unter einem bestimmten Gerät (Festplatte oder Partition usw.) gemounteten Dateisysteme zu finden:
$ 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 Einhängepunkt:
$ findmnt -nr -o target -S /dev/storage/home
/home
$ lsblk -o MOUNTPOINT -nr /dev/storage/home
/home
Oben findmnt
wird ein Fehler-Exit-Status zurückgegeben, wenn das Gerät nicht gemountet ist, nicht lsblk
.
Also:
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
Antwort2
Unter Linux können Sie Einhängepunktinformationen direkt vom Kernel in abrufen /proc/mounts
. Das mount
Programm zeichnet ähnliche Informationen in auf /etc/mtab
. Die Pfade und Optionen können unterschiedlich sein, da /etc/mtab
repräsentiert, was mount
an den Kernel übergeben wurde, während /proc/mounts
die Daten so angezeigt werden, wie sie im Kernel angezeigt werden. /proc/mounts
ist immer auf dem neuesten Stand, während dies /etc/mtab
möglicherweise nicht der Fall ist, wenn /etc
es zu einem Zeitpunkt schreibgeschützt war, der von den Boot-Skripten nicht erwartet wurde. Das Format ähnelt dem von/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 Sie awk nicht haben:
grep "^$device_path " /proc/mounts | cut -d ' ' -f 2
Es gibt eine Reihe von Randfällen, in denen Sie möglicherweise nicht das erhalten, was Sie erwarten. Wenn das Gerät über einen anderen Pfad in gemountet wurde, /dev
der dasselbe Gerät bezeichnet, werden Sie es auf diese Weise nicht bemerken. In /proc/mounts
sind Bind-Mounts nicht vom Original zu unterscheiden. Es kann mehr als eine Übereinstimmung geben, wenn ein Mount-Punkt einen anderen überschattet (das ist ungewöhnlich).
In /proc/self
oder /proc/$pid
gibt es eine Datei pro Prozess mounts
, die die globale Datei nachahmt. Die Mount-Informationen können zwischen Prozessen unterschiedlich sein, beispielsweise aufgrund vonchroot
. Es gibt eine zusätzliche Datei mit dem Namen , mountinfo
die ein anderes Format hat und mehr Informationen enthält, insbesondere die Haupt- und Nebennummern des Geräts. Aus demDokumentation:
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 ein Gerät anhand der Nummer suchen, können Sie folgendermaßen vorgehen:
awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'
Antwort3
Der mount
Befehl ohne Argumente listet alle aktuell gemounteten Dateisysteme auf; Sie können grep
dies für die gewünschte Festplatte tun (oder grep
/etc/mtab
, das ist die Datei, mount
aus der die Informationen gelesen werden):
$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
Antwort4
Ich kenne keine saubere und einfache Methode, um festzustellen, ob ein Geräteknoten in /dev
gemountet ist oder nicht. Das hier ist jedoch, was ich anbieten kann. Es verarbeitet direkt gemountete Geräte ( /dev/sda1
) und per UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f
) gemountete Geräte. Es funktioniert nicht, 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 von /proc/mounts
nachstdoutwenn gefunden, wird auch der Beendigungsstatus auf 0 gesetzt. Andernfalls ist der Beendigungsstatus 1.