Gibt es einen Befehl, um zu sehen, wo eine Festplatte eingehängt ist?

28

Gibt es einen einfachen Befehl, der den Geräteknoten eines Datenträgers als Eingabe verwendet und mir sagt, wo (und ob) dieser Datenträger 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).

tückisch
quelle

Antworten:

13

Unter Linux können Sie Mount-Point-Informationen direkt vom Kernel in abrufen /proc/mounts. Das mountProgramm zeichnet ähnliche Informationen auf /etc/mtab. Die Pfade und Optionen können unterschiedlich sein, da sie /etc/mtabangeben, was mountan den Kernel übergeben wurde, während /proc/mountsdie Daten so angezeigt werden, wie sie im Kernel angezeigt werden . /proc/mountsist immer auf dem neuesten Stand, /etc/mtabmöglicherweise jedoch nicht, wenn es zu einem /etcZeitpunkt 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 keine awk hast:

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

Es gibt eine Reihe von Randfällen, in denen Sie möglicherweise nicht das bekommen, was Sie erwarten. Wenn das Gerät über einen anderen Pfad gemountet wurde /dev, der dasselbe Gerät bezeichnet, werden Sie es auf diese Weise nicht bemerken. In /proc/mountssind Binderücken nicht vom Original zu unterscheiden. Es kann mehr als eine Übereinstimmung geben, wenn ein Einhängepunkt einen anderen abschattet (dies ist ungewöhnlich).

In /proc/selfoder /proc/$pidgibt es eine mountsDatei pro Prozess , die die globale Datei nachahmt. Die Mount-Informationen können beispielsweise aufgrund von zwischen Prozessen variieren chroot. Es gibt eine zusätzliche Datei mountinfomit einem anderen Format, die 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 ein Gerät anhand der 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}'
Gilles 'SO - hör auf böse zu sein'
quelle
"Wenn das Gerät über einen anderen Pfad in / dev gemountet wurde, der dasselbe Gerät bezeichnet, werden Sie es auf diese Weise nicht bemerken." - Das ist tatsächlich der Fall: Ich habe den udisksSymlink (in / dev / disk / by-label / ...). Aber ich kann mit zu einem Geräteknoten auflösen readlink -f. Ich mag die /proc/mountsIdee, ich denke, das könnte ein bisschen zuverlässiger sein als /etc/mtab.
Detly
@detly Oder Sie können verwenden mountinfo. Rufen Sie statan, um die Gerätenummern zu erhalten (siehe meine aktualisierte Antwort, ich habe vergessen, den Befehl früher einzuschließen).
Gilles 'SO- hör auf böse zu sein'
Möglicherweise benötigen Sie die -d " "Option für cutdiesen grepBefehl.
Craig McQueen
26

Unter Linux können Sie jetzt den findmntBefehl 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 ab util-linux2.19):

$ lsblk /dev/VG_SC/home
NAME       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
VG_SC-home 254:2    0  200G  0 lvm  /home

Das ist auch nützlich, um das gesamte Dateisystem zu finden, das unter einem bestimmten Gerät (Festplatte oder Partition ...) eingehängt 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 rufen Sie nur den Mountpoint ab:

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

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

So:

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
Stéphane Chazelas
quelle
Es ist immer gut, etwas Neues zu lernen
roaima 21.07.15
6

Der mountBefehl ohne Argumente listet alle aktuell gemounteten Dateisysteme auf. Sie können grepdas für den Datenträger, den Sie möchten (oder von grep /etc/mtabdem die Datei mountdie Informationen liest):

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
Michael Mrozek
quelle
Das hat aber viel Fremdtext. Ich muss in der Lage sein, den Einhängepunkt an andere Befehle zu übergeben. (Entschuldigung, das habe ich im Q. geklärt.)
Detly
Ah, grep ${NODE} /etc/mtab | cut -d ' ' -f 2sollte es tun.
Detly
Obwohl grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"viel weniger zerbrechlich ist ...
Detly
2

Ja. Sie können für einige Anwendungsbeispiele sehen, dass nur interessante Einhängepunkte angezeigt werden / nicht interessante Typen gefiltert werden oder Verzeichnisse aufgelistet werden /, die sich nicht unter demselben Einhängepunkt befinden, aber es gibt auch einen kurzen Überblick unten. Der Befehl, nach dem Sie fragen, lautet findmnt (obwohl er lsblkauch dienen könnte) :

lsblk -f /dev/sda[12]

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

Nun ist, wie Sie sehen, /dev/sda1montiert /esp. 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 ebenfalls --bindüber den Start geladen. Okay...

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

Setzen wir nun 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'

Für eine robustere und anpassbarere Ausgabe verwenden Sie findmnt(8) , insbesondere in Ihren Skripten. Beachten Sie, dass Steuerzeichen im Mountpunktnamen durch ersetzt werden ?.

mikeserv
quelle
1

Ich kenne keine saubere und einfache Methode, um festzustellen, ob ein Geräteknoten in /deveingehängt ist oder nicht . Das kann ich aber bieten. Es behandelt direkt gemountete Geräte ( /dev/sda1) und von UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f) gemountete Geräte . 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 von /proc/mountsnach stdout, wenn er gefunden wird, und setzt den Exit-Status auf 0. Andernfalls ist der Exit-Status 1.

Roaima
quelle
-1

Führen Sie einfach den folgenden Befehl aus:

df -h
Steve
quelle