web-dev-qa-db-ja.com

カーネルはどのようにしてファイルシステムの場所を知るのですか?

私はLinux、特に組み込みLinuxにかなり慣れていません。

私は、ルートファイルシステムタイプが圧縮された読み取り専用ファイルシステムタイプであるSquashFSである、組み込みデバイス上ですでに開発されたプロジェクトに取り組んでいます。

カーネルが起動すると、特に通常のEXT4タイプではなくSquashFSタイプの場合、ルートファイルシステムを見つけてマウントする方法をどのように知ることができますか?前もって感謝します。

1
Engineer999

これを行うには2つの方法があります。

  • ルートデバイス名をパラメータ(root)としてカーネルに渡すことができ、カーネルには、ストレージデバイスを見つけ、init。カーネルにファイルシステムを指示することはできますが(rootfstypeを使用)、これが必要かどうかはわかりません。

  • 現在、大多数のシステムはinitramfsを使用しています。これは、カーネルに接着された(またはブートローダーによって参照される)小さなファイルシステムイメージであり、ルートファイルシステムを準備して(必要に応じて)ユーザーランドにマウントします。 switch_root操作を実行した後、実際のルートファイルシステムのinitプロセスに制御を渡します。

2
Pedro

参照できる概念 魔法の数 があります。

magic.h ヘッダーファイルで定義されているマジックナンバーのリスト

たとえば、ディスクをチェックする場合:

Sudo file -Ls /dev/mapper/vg-home               
/dev/mapper/vg-home: Linux rev 1.0 ext4 filesystem data, UUID=fd8eb0e8-073d-4ae3-810a-87e8af0981d7 (needs journal recovery) (extents) (64bit) (large files) (huge files)

fileコマンドは、マジックナンバーに基づいてタイプと一致します。これらの値は、hexdumpツールで確認できます。

Sudo hexdump /dev/mapper/vg-home -C  | grep "53 ef"
00000430  1b da d0 5e 49 00 ff ff  53 ef 01 00 01 00 00 00

ここで0x53efはext4ファイルシステムのマジックナンバーです

squashfsの場合(マジックナンバー0x73717368)

Sudo hexdump /dev/somedisk -C  | head -n 1    
0000000  73 71 73 68 00 00 14 7e  01 ea 27 0d 00 01 00 00 |sqsh...~..'.....|
1
binarysta