Partition anhand des Einhängepunkts identifizieren

Partition anhand des Einhängepunkts identifizieren

Wie können wir feststellen, auf welcher Partition in Linux ein Dateisystem gemountet ist, wenn in der dfAusgabe nicht direkt auf die Partition verwiesen wird?

fdiskDie Ausgabe unseres Systems lautet beispielsweise :

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2550    20478976   83  Linux
/dev/sda2            2550       60736   467378176   83  Linux
/dev/sda3           60736       60801      523264   82  Linux swap / Solaris

Und die Ausgabe dfist:

Filesystem      Size  Used Avail Use% Mounted on
rootfs           20G  881M   18G   5% /
/dev/root        20G  881M   18G   5% /
devtmpfs        989M  216K  989M   1% /dev
/dev/sda2       443G  199M  420G   1% /home
tmpfs           990M     0  990M   0% /dev/shm
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named
/dev/root        20G  881M   18G   5% /var/named/chroot/var/named
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.conf
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.rfc1912.zones
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/rndc.key
/dev/root        20G  881M   18G   5% /var/named/chroot/usr/lib64/bind
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.iscdlv.key
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.root.key

Aus dieser Liste ist die einzige offensichtliche Partition /dev/sda2; bei den anderen können wir nicht sehen, auf welcher Partition sie sich befinden (wir möchten dies über ein Bash-Skript tun).

Wir wissen beispielsweise, dass /dev/rootgemountet ist, /dev/sda1da beide die gleiche Größe von 20 GB haben, aber wie können wir dies anhand eines Skripts ermitteln?

Ausgabe von ls -l /dev/root /dev/sda1:

[root@server etc]# ls -l /dev/root /dev/sda1
ls: cannot access /dev/root: No such file or directory
brw-rw---- 1 root disk 8, 1 May  7 14:16 /dev/sda1

Antwort1

Diese Ausgabe ist irreführend.
Sie haben tatsächlich zwei verschiedene Dateisysteme unter gemountet /.

rootfsist das von einem Initramfs erstellte Dateisystem. Wenn der Bootloader den Kernel lädt, kann er ein Initramfs laden, das in ein tmpfs-Dateisystem entpackt wird. Dieses Dateisystem kann nicht ausgehängt werden. Wenn das Initramfs seine Arbeit erledigt hat, hängt es einfach das echte Root-Dateisystem darüber ein.

Der Grund, warum dfes als 20 GB angezeigt wird, ist, dass es nicht auf dieses tmpfs-Dateisystem zugreifen kann. Wenn es dfdie Dateisysteme anzeigen will, holt es sich zuerst eine Liste der aktuellen Mounts von /etc/mtab. Dadurch erhält es 2 Mounts mit /. Dann führt es statfs()an jedem Mountpoint einen Systemaufruf aus. Da sich das aktuelle Root-Dateisystem jedoch über dem tmpfs-Initramfs befindet, wird das aktuelle Root-Dateisystem am Ende zweimal aufgerufen.

Außerdem /dev/roothandelt es sich eigentlich um einen symbolischen Link. Um mithilfe eines Shell-Skripts herauszufinden, wohin der Link tatsächlich zeigt, können Sie verwenden readlink -f /dev/root.


Update: Ok, in diesem Fall readlink -f /dev/rootfunktioniert es also nicht, da /dev/rootes nicht mehr existiert. Denn das initramfs ist das, was Ihr echtes Root-Dateisystem gemountet hat, und /dev/roothätte dort existiert. Aber da das initramfs vergraben ist, /dev/rootist es nicht mehr da.

In diesem Fall wird es viel, viel schwieriger.
Was Sie tun können, ist, statdie Gerätenummer für den Einhängepunkt abzurufen und dann danach zu suchen /dev.

Auf meinem System ergibt das beispielsweise:

$ stat --format '%D' /
fd00

$ stat --format '%02t%02T' /dev/mapper/sys-root
fd00

$ for device in $(blkid -o device); do 
>   [ "$(stat --format '%04D' /)" = "$(stat --format '%02t%02T' "$device")" ] && \
>     echo "$device" && \
>     break
> done
/dev/mapper/sys-root

Im Grunde genommen wird hiermit statdie Geräte-Haupt- und -Nebennummer von abgerufen /. Anschließend durchlaufen wir alle bekannten Blockgeräte und suchen nach einem mit derselben Geräte-Haupt- und -Nebennummer. Das sieht nicht schön aus, aber im Grunde /devhat der Eintrag einen anderen Namen, und deshalb müssen wir danach suchen.

Dies könnte effizienter gemacht werden, aber ich wollte den Code einfach halten

Antwort2

/dev/root ist ein symbolischer Link zum realen Gerät. Sie sollten den Speicherort entweder mit ls /dev/root, realink oder durch Suchen nach root= in /proc/cmdline ermitteln können.

verwandte Informationen