这个问题看起来很简单。只要在制作ramfs的时候,如下操作即可:
-
cd dev
-
sudo cp -a /dev/console .
但是这里必须使用sudo,有sudo很显然带来了两个坏处:
1. 在编译服务器上,不是每个人都有root权限。
2. 不方便脚本自动化处理。
如果想要不使用sudo命令,只需要在编译内核的时候不指定 CONFIG_INITRAMFS_SOURCE,而通过传参数 initrd 的方式来指定 ramdisk即可。
分析原理:
usr/gen_init_cpio.c 根据 gen_initramfs_list.sh 产生的 initramfs 文件列表,按照不同的类型在cpio包中创建对应的文件。
gen_initramfs_list.sh 里面有一个 -d 的参数, 在合适的条件下会通过 default_initramfs 生成 /dev/ /dev/console 等节点。
该参数的代码:
-
"-d") # display default initramfs list
-
default_list="$arg"
-
${dep_list}default_initramfs
其中所调用的 default_initramfs 函数代码:
-
default_initramfs() {
-
cat <<-EOF >> ${output}
-
# This is a very simple, default initramfs
-
-
dir /dev 0755 0 0
-
nod /dev/console 0600 0 0 c 5 1
-
dir /root 0700 0 0
-
# file /kinit usr/kinit/kinit 0755 0 0
-
# slink /init kinit 0755 0 0
-
EOF
-
}
这里面每一行都表示创建一个文件,具体创建请直接阅读 usr/gen_init_cpio.c 代码。知道这个后,注意一下里面的 /dev/console 这一行。
gen_initramfs_list.sh 的参数是 usr/Makefile 中传入的:
-
$(initramfs) -o $@ $(ramfs-args) $(ramfs-input)
我们关注
-
ramfs-input := $(if $(filter-out "",$(CONFIG_INITRAMFS_SOURCE)), \
-
$(shell echo $(CONFIG_INITRAMFS_SOURCE)),-d)
可见,如果CONFIG_INITRAMFS_SOURCE 为空的时候,就会传入 -d 的参数。传入了 -d 参数后,就会在编译内核的时候,自动使用 default ramfs,该 ramfs 中是有 /dev/console 节点的。
反向验证一下,通过以下命令解压出 initramfs_data.cpio.gz:
cd $KERNEL/usr
gunzip initramfs_data.cpio.gz
cpio -i < ../initramfs_data.cpio
解压出来,可以看到 dev 下是有 console 节点的。
阅读(1970) | 评论(0) | 转发(0) |