カーネルイメージに組み込まれたinitramfsを確認するには?

カーネルイメージに組み込まれたinitramfsを確認するには?

私は組み込みLinuxシステム(kernel-5.10.24)を開発しており、システムでinitramfsを有効にしようとしています。

カーネルを次のように設定しました。

CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="/home/t/target_rootfs"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
....
# CONFIG_BLK_DEV_RAM is not set

次のtarget_rootfsような内容があります。

drwxr-xr-x 2 t t 4096 Dec 13 17:47 bin
drwxr-xr-x 4 t t 4096 Jun 28 06:23 dev
drwxr-xr-x 6 t t 4096 Dec 13 20:24 etc
drwxr-xr-x 3 t t 4096 Dec 13 17:47 lib
lrwxrwxrwx 1 t t    3 Oct 23 14:59 lib32 -> lib
lrwxrwxrwx 1 t t   11 Oct 23 15:01 linuxrc -> bin/busybox
drwxr-xr-x 2 t t 4096 Jun 28 06:23 mnt
drwxr-xr-x 2 t t 4096 Jun 28 06:23 opt
drwxr-xr-x 2 t t 4096 Jun 28 06:23 proc
drwxr-xr-x 2 t t 4096 Jun 28 06:23 root
drwxr-xr-x 2 t t 4096 Jun 28 06:23 run
drwxr-xr-x 2 t t 4096 Sep 19 18:58 sbin
drwxr-xr-x 2 t t 4096 Jun 28 06:23 sys
drwxr-xr-x 2 t t 4096 Jun 28 06:23 tmp
drwxr-xr-x 5 t t 4096 Dec 13 17:47 usr
drwxr-xr-x 3 t t 4096 Jun 28 06:23 var

カーネルのコマンドラインは次のとおりです。

console=ttyS0,115200 init=/linuxrc ubi.mtd=5 root=ubi0:rootfs rootfstype=ubifs rw flashtype=nand

上記の設定でシステムをshellnand rootfsで起動できます。これで、組み込みカーネルが動作しているか(または使用されている)ことを
確認するために、次のことを行いました。initramfs

  1. FLASHのMTD5からrootfsパーティションを消去しようとしています。

システムの起動を中止したかったのですが、initramfs以下のようにカーネルパニックが発生しました。

[    0.715989] Kernel panic - not syncing: write error
[    0.720880] Rebooting in 10 seconds..
  1. その後、カーネルをtarget_rootfs作成しinitて再構築すると(rootfsをデプロイせずに)、次のような結果が得られます。ln -sf bin/busybox init
[    5.266031] VFS: Cannot open root device "ubi0:rootfs" or unknown-block(0,0): error -19
[    5.274324] Please append a correct "root=" boot option; here are the available partitions:
[    5.282987] 1f00            1024 mtdblock0
[    5.282992]  (driver?)
[    5.289753] 1f01           65536 mtdblock1
[    5.289759]  (driver?)
[    5.296540] 1f02          195584 mtdblock2
[    5.296545]  (driver?)
[    5.303320] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[    5.311876] Rebooting in 10 seconds..

では、initramfs組み込みカーネルを確認する方法は?

ベストアンサー1

私はこの質問を読めば質問の一部に答えることができると思います。ramfs カーネルドキュメント rootfs initramfs

それは言う、

initramfsとは何ですか?

すべての2.6 Linuxカーネルには、カーネルの起動時にrootfsで解凍されたgzipで圧縮された「cpio」形式のアーカイブが含まれています。解凍後、カーネルはrootfsに "init"ファイルが含まれていることを確認し、含まれている場合はPID 1を使用してファイルを実行します。見つかった場合、このinitプロセスは、実際のルートデバイス(存在する場合)の検索とマウントを含むシステムの起動を担当します。組み込みのcpioアーカイブがrootfsに抽出され、rootfsにinitプログラムが含まれていない場合、カーネルは以前のコードに置き換えてルートパーティションを見つけてマウントし、そこで/ sbin / initのいくつかのバリエーションを実行します。

したがって、最初のテストでは、カーネルはinitinitramfsでファイルを見つけることができず、以前のパスに従いました。 2番目のテストでは、カーネルはinitinitramfsでファイルを見つけて実行と初期化を開始しました。

rootfsをデプロイした後の2回目のテストで得られたログ。

[    5.352428] Warning: unable to open an initial console.
[    5.357833] ====== kernel_init_freeable, 1541, 80a7fe00 (/init)
[    5.364712] ====== kernel_init_freeable, 1544
[    5.370661] UBIFS (ubi0:0): Mounting in unauthenticated mode
[    5.376636] UBIFS (ubi0:0): background thread "ubifs_bgt0_0" started, PID 913
[    5.403187] UBIFS (ubi0:0): start fixing up free space
[    9.912861] UBIFS (ubi0:0): free space fixup complete
[    9.934491] UBIFS (ubi0:0): UBIFS: mounted UBI device 0, volume 0, name "rootfs"
[    9.942191] UBIFS (ubi0:0): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
[    9.952459] UBIFS (ubi0:0): FS size: 189702144 bytes (180 MiB, 1494 LEBs), journal size 9023488 bytes (8 MiB, 72 LEBs)
[    9.963525] UBIFS (ubi0:0): reserved for root: 0 bytes (0 KiB)
[    9.969555] UBIFS (ubi0:0): media format: w4/r0 (latest is w5/r0), UUID B61B21A3-D917-436E-986D-091B195DF275, small LPT model
[    9.981938] UBIFS (ubi0:0): full atime support is enabled.
[    9.987664] VFS: Mounted root (ubifs filesystem) on device 0:14.
[    9.994297] devtmpfs: mounted
[    9.997393] ====== kernel_init_freeable, 1550
[   10.009306] Freeing unused kernel memory: 17812K
[   10.014107] This architecture does not have kernel memory protection.
[   10.020789] ====== kernel_init, 1434, 00000000 (none)
[   10.026726] ====== kernel_init, 1450, 80007c67 (/linuxrc)
[   10.033039] Run /linuxrc as init process
.....

printkを追加しましたが、カーネルが最初にinitramfsで実行され、次にカーネルコマンドラインで指定されているとおりに実行されるようinit/main.cです。/init/linuxrc

今の質問は、誰が2番目のrootfsをインストールして起動したかということ/linuxrcです。私の仮定は次のとおりです/init。ただし、カーネルログによると、kernelこれは行われます。

そして、システムを停止する方法はinitramfs

おすすめ記事