LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: laowang_buaa

精通initramfs构建step by step

[复制链接]
发表于 2008-12-12 20:11:03 | 显示全部楼层
好文章,收藏了
回复 支持 反对

使用道具 举报

发表于 2008-12-13 12:04:38 | 显示全部楼层
好文啊!狂顶!
回复 支持 反对

使用道具 举报

发表于 2008-12-14 16:30:44 | 显示全部楼层
很好的文章!!!

觉得可以做为毕业论文来搞了. 呵呵.

这一段一直在 buildroot,觉得buildroot还是有一些不足.
比如配置一旦有问题,想回改,可是编译不过的地方却依旧编译不过.. make clean也没用.
感觉他的脚本没有对 "回滚" 做工作.
绝对的新手,望 laowang_buaa 多多指点啊!

clfs 的 embedded的 文档问题太多,按部就班的话肯定 连 LD都出不来...少了太多步骤了..

linux_suse9  A&T  msn*com 是我MSN,希望能和各位高手探讨探讨.
sniperpr A&T Gmail * com 是我EMAIL.
回复 支持 反对

使用道具 举报

发表于 2008-12-16 16:48:43 | 显示全部楼层
高手,精辟而且详细,学习了。顶。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2009-1-1 16:44:02 | 显示全部楼层
文章很久没有更新了

帮顶!
回复 支持 反对

使用道具 举报

发表于 2009-1-5 21:40:38 | 显示全部楼层
  1. mount -vt proc proc =proc
  2. mount -vt sysfs sysfs =sys
复制代码

这两行应该有误吧!
  1. mount -vt proc proc proc
  2. mount -vt sysfs sysfs sys
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-1-6 13:39:02 | 显示全部楼层
不错,善于总结。先收藏,再看。哈哈!
回复 支持 反对

使用道具 举报

发表于 2009-1-19 11:15:55 | 显示全部楼层
楼主,期待继续^_^
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-8 21:24:22 | 显示全部楼层

(十一)klibc

三十二、编译klibc
(1)在http://www.kernel.org/pub/linux/libs/klibc/下载klibc的源码,目前最新版本是1.5。
(2)解开源码,并在顶层目录建立一个符号链接linux,指向linux的内核源码。注意,内核源码必须已通过make menuconfig等命令配置好。
(3)执行
make
命令,编译klibc。编译完成后,在klibc源码目录树中的usr/dash 和 usr/utils 目录中有shell和一些常用的命令, 它们分成静态链接和动态链接的2种版本,分别在static和shared目录下。为了简单,我们的initramfs就使用静态编译的版本。动态链接的程序需要使用klibc的动态库文件,位于 usr/klibc/目录下。

三十三、run-init命令
与busybox类似,klibc中也有一个切换到真实根文件系统的命令,它就是run-init命令。run-init命令的使用格式与busybox中的switch_root 命令一样,它有2个参数:第一个是已挂载了真实根文件系统的目录;第二个是真实根文件系统中的init程序路径名,一般是 /sbin/init 。即
run-init /newroot /sbin/init
语句即可从initramfs切换到挂载在/newroot目录下的真实根文件系统,并执行其中的 /sbin/init 初始化程序。

三十四、试一试
现在我们已经有了编译好的klibc,也了解了关键的run-init命令,那么就可以试试用klibc来构建initramfs。我们用QEMU作为试验环境,并假设在/dev/hda8上有linux系统,根文件系统是ext3。
(1) 拷贝所需的命令到image构建目录
把klibc中的usr/dash/sh、usr/utils/static目录下的mount、mknod命令拷贝到image/bin目录下。把usr/kinit/run-init/static/run-init命令拷贝到image/sbin目录下。
klibc的静态编译版本命令不需要库文件,所以不需要拷贝。
(2)创建硬盘的设备文件
为了简单,我们不使用udev的方式创建设备文件,而是直接用mknod命令创建硬盘的设备文件。对于IDE硬盘/dev/hda,它的主设备号是3,次设备号是0,是块设备类型,所以用下面的命令在image/dev目录下创建它对应的设备文件
mknod dev/hda b 3 0
/dev/hda上的分区的主设备号也是3,次设备号与分区号相同,据此可以创建/dev/hda1 ~ /dev/hda8的设备文件。
(3)创建/init脚本
#!/bin/sh
/bin/mount -t sysfs sysfs /sys
/bin/mount -t proc proc /proc
/bin/mount -t ext3 /dev/hda6 /mnt
exec /sbin/run-init /mnt /sbin/init
(4)用cpio命令构建initramfs,然后在QEMU环境下进行试验。如果不出意外,试验系统可以正确地从initramfs切换到真实的linux系统上。


---下节预告---

到现在为止,我们已经掌握了initramfs的构建方法,该到大结局了。在大结局里,读者可应用前面step中介绍的方法,尝试分析一下Debian的initramfs,看看是否已精通了initramfs的构建方法:
精通initramfs构建step by step (十二):大结局 -测试一下
回复 支持 反对

使用道具 举报

发表于 2009-2-13 16:40:48 | 显示全部楼层
太强!!!
谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表