出力にパーティションへの直接参照がない場合、Linuxはファイルシステムがマウントされているパーティションをどのように識別しますかdf
?
たとえば、私たちのシステムの出力は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によって生成されたファイルシステム。ブートローダがカーネルをロードすると、tmpfsファイルシステムに抽出されたinitramfsをロードできます。ファイルシステムをマウント解除できません。 initramfsが作業を完了したら、その上に実際のルートファイルシステムをマウントするだけです。
20GBで表示されるのは、df
tmpfsファイルシステムにアクセスできないためです。ファイルシステムを表示するときは、df
まず現在マウントされているシステムのリストを取得します/etc/mtab
。これにより、使用可能な2つのマウントが提供されます/
。その後、statfs()
各マウントポイントでシステムコールを実行します。ただし、現在のルートファイルシステムはtmpfs initramfsの上にあるため、最終的に現在のルートファイルシステムを2回計算します。
しかも/dev/root
実際にはシンボリックリンクです。シェルスクリプトを使用して実際に指している場所を見つけるにはreadlink -f /dev/root
。
アップデート:いいですね。この場合、これ以上存在しないreadlink -f /dev/root
ため動作しません。/dev/root
initramfsは実際のルートファイルシステムをマウントするので、/dev/root
すでにそこに存在します。しかし、initramfsは埋め込まれているので、もはや/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、reallinkを使用するか、/proc/cmdlineでroot =を検索して場所を取得できます。