Chinaunix首页 | 论坛 | 博客
  • 博客访问: 207292
  • 博文数量: 19
  • 博客积分: 757
  • 博客等级: 军士长
  • 技术积分: 320
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-08 07:55
个人简介

醉卧沙场君莫笑

文章分类

全部博文(19)

文章存档

2016年(5)

2015年(2)

2014年(3)

2013年(1)

2012年(5)

2011年(3)

分类: 嵌入式

2015-12-29 15:24:32


这个问题看起来很简单。只要在制作ramfs的时候,如下操作即可:

点击(此处)折叠或打开

  1. cd dev
  2. 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 等节点。

该参数的代码:

点击(此处)折叠或打开

  1. "-d") # display default initramfs list
  2.                         default_list="$arg"
  3.                         ${dep_list}default_initramfs

其中所调用的 default_initramfs 函数代码:

点击(此处)折叠或打开

  1. default_initramfs() {
  2.         cat <<-EOF >> ${output}
  3.                 # This is a very simple, default initramfs

  4.                 dir /dev 0755 0 0
  5.                 nod /dev/console 0600 0 0 c 5 1
  6.                 dir /root 0700 0 0
  7.                 # file /kinit usr/kinit/kinit 0755 0 0
  8.                 # slink /init kinit 0755 0 0
  9.         EOF
  10. }
 这里面每一行都表示创建一个文件,具体创建请直接阅读 usr/gen_init_cpio.c 代码。知道这个后,注意一下里面的 /dev/console 这一行。

gen_initramfs_list.sh 的参数是 usr/Makefile 中传入的:

点击(此处)折叠或打开

  1. $(initramfs) -o $@ $(ramfs-args) $(ramfs-input)

我们关注

点击(此处)折叠或打开

  1. ramfs-input := $(if $(filter-out "",$(CONFIG_INITRAMFS_SOURCE)), \
  2.                         $(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 节点的。
阅读(1633) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~