我正在开发嵌入式 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
通过以上设置,系统就可以启动到shell
nand rootfs中了!
现在为了验证initramfs
内置内核是否正在工作(或正在使用),我做了以下操作。
- 我尝试擦除FLASH中MTD5中的rootfs分区
希望停止系统启动initramfs
,但我得到了内核恐慌,如下所示,
[ 0.715989] Kernel panic - not syncing: write error
[ 0.720880] Rebooting in 10 seconds..
- 然后在
target_rootfs
我创建init
并ln -sf bin/busybox init
重建内核(保持 rootfs 未部署)中,我得到了以下内容,
[ 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
内置内核呢?
我想我可以通过阅读ramfs rootfs initramfs 的内核文档来回答部分问题
它说,
因此,在我的第一次测试中,内核没有
init
在 initramfs 中找到该文件,因此它遵循旧路径。在我的第二次测试中,内核找到init
initramfs 中的文件,并启动它运行并进行初始化。这是我在部署 rootfs 后从第二次测试中获得的日志。
我添加
printk
了init/main.c
,看起来内核首先/init
从 initramfs 运行,然后/linuxrc
按照内核命令行中的指定运行。所以现在的问题是谁安装了第二个 rootfs 并启动了
/linuxrc
?我的假设是/init
,但内核日志显示它是kernel
这样做的……以及如何停止系统
initramfs
?