Wie können wir feststellen, auf welcher Partition in Linux ein Dateisystem gemountet ist, wenn in der df
Ausgabe nicht direkt auf die Partition verwiesen wird?
fdisk
Die 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 df
ist:
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/root
gemountet ist, /dev/sda1
da 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 /
.
rootfs
ist 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 df
es als 20 GB angezeigt wird, ist, dass es nicht auf dieses tmpfs-Dateisystem zugreifen kann. Wenn es df
die 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/root
handelt 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/root
funktioniert es also nicht, da /dev/root
es nicht mehr existiert. Denn das initramfs ist das, was Ihr echtes Root-Dateisystem gemountet hat, und /dev/root
hätte dort existiert. Aber da das initramfs vergraben ist, /dev/root
ist es nicht mehr da.
In diesem Fall wird es viel, viel schwieriger.
Was Sie tun können, ist, stat
die 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 stat
die 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 /dev
hat 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.