df
出力でパーティションが直接参照されていない場合、Linux でファイルシステムがマウントされているパーティションをどのように識別できますか?
たとえば、システムのfdisk
出力は次のようになります。
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
出力は次のようにdf
なります。
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
このリストから明らかなパーティションは だけです/dev/sda2
。他のパーティションについては、どのパーティションに存在するかわかりません (これを bash スクリプトで実行します)。
たとえば、両方とも同じ 20 GB のサイズであるため、が/dev/root
マウントされていることはわかっています/dev/sda1
が、スクリプトからこれをどのように識別できるでしょうか?
出力元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
答え1
この出力は誤解を招きます。
実際には に 2 つの異なるファイルシステムがマウントされています/
。
rootfs
initramfs によって作成されたファイルシステムです。ブートローダがカーネルをロードすると、initramfs をロードして tmpfs ファイルシステムに展開することができます。このファイルシステムはアンマウントできません。initramfs が処理を終えると、実際のルートファイルシステムがその上にマウントされます。
20GB と表示される理由は、df
tmpfs ファイルシステムにアクセスできないためです。 がdf
ファイルシステムを表示しようとすると、まず から現在のマウントのリストを取得します/etc/mtab
。 これにより、 を使用して 2 つのマウントが提供されます/
。 次に、statfs()
各マウントポイントで syscall を実行します。 ただし、現在のルート ファイルシステムは tmpfs initramfs の上にあるため、現在のルート ファイルシステムを 2 回 stat することになります。
さらに、/dev/root
実際にはシンボリックリンクです。シェル スクリプトを使用して実際にどこを指しているかを確認するには、 を使用できますreadlink -f /dev/root
。
更新: この場合は、もう存在しないreadlink -f /dev/root
ため動作しません。initramfs は実際のルート ファイルシステムをマウントするものなので、そこに存在していたはずです。しかし、initramfs は埋め込まれているため、もう存在しません。/dev/root
/dev/root
/dev/root
この場合、非常に困難になります。
実行できることは、 を使用してstat
マウントポイントのデバイス番号を取得し、/dev
それを検索することです。
たとえば、私のシステムでは次のようになります。
$ 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
基本的に、これは を使用してstat
デバイスのメジャー番号とマイナー番号を取得します/
。次に、すべての既知のブロック デバイスを反復処理して、同じデバイスのメジャー番号とマイナー番号を持つデバイスを探します。見た目はよくありませんが、基本的にエントリの/dev
名前が異なるため、それを検索する必要があります。
もっと効率的にできるかもしれないが、コードをシンプルにしておきたいと思った
答え2
/dev/root は実際のデバイスへのシンボリックリンクです。ls /dev/root、relink、または /proc/cmdline で root= を探すことで場所を取得できるはずです。