커널 이미지에 내장된 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에서 파일을 찾지 못해 이전 경로를 따랐습니다. 두 번째 테스트에서 커널은 initinitramfs에서 파일을 찾아 실행 및 초기화를 시작했습니다.

rootfs를 배포한 후 두 번째 테스트에서 얻은 로그입니다.

[    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

이제 질문은 누가 두 번째 rootfs를 설치하고 시작했는가 하는 것 /linuxrc입니다. 내 가정은 다음과 같습니다 /init. 그러나 커널 로그에 따르면 kernel이 작업이 수행됩니다.

그리고 시스템을 중지하는 방법은 무엇입니까 initramfs?

관련 정보