LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1826|回复: 6

Initramfs from scratch

[复制链接]
发表于 2006-3-28 19:14:16 | 显示全部楼层 |阅读模式

1) 为什么使用initramfs:我的跟分区在LVM上
2) 为什么写这篇文章:实在搞得很闹心
3) 为什么不是initrd:趋势
4) 为什么from scratch:我不喜欢自动生成的做了一堆我不知道的事情,尤其是加载一堆模块


首先实现一个目录树,里面有你要的命令。我的方法是这样的,先cp bash过去目标目录的bin子目录,然后在cd到目标目录中chroot .,他告诉你不行,你把ld-linux.2.so也cp过去,他说还是不行,但是这回他说缺了具体哪个.so,你就从主系统里cp过去,循环这个过程。当然你可以使用busybox,我图省事就那么干了。bin里面,至少放上mount,ls,chroot,udev相关的那些。


linux内核在加载initramfs后,会执行根目录下的init,一般那是个脚本,在里面有如下过程:
1 mount -t proc proc /proc
2 mount -t sysfs sys /sys
3 udev start
4 加载module,启动lvm等等,在这里完成
5 mount /dev/mapper/vol-lfs /newroot (这是我的lvm上的lfs根分区)
6 umount /sys
7 umount /proc
8 exec chroot /newroot /sbin/init


1 关于init脚本,是kernel里面定的,指定执行那个文件
2 udev依赖挂载/sys,挂载/proc
3 有些发行版initramfs里面,会在/dev上再挂一个tmpfs,我觉得手工打造的话没必要,因为本来就在内存里,注意留出一定空间就行
4 关于上面init的最后一行,最终根文件系统的init,init如果检查到自己的pid是0,他就会做初始化计算机的事情,所以前面加exec
5 关于pivot_root,如果你去看内核文档里相关内容,他会告诉你先执行pivot_root,再chroot,但实际上,你不能在2.6.13以后的内核启动到initramfs中使用pivot_root,2.6.13是可以的,2.6.14就不行,会出错误Invalid argument。有人讨论过这个问题。跟root_fs有关。但是上面例子中的做法是正确的,我看过gentoo,ubuntu的initramfs,跟上面的例子是一样的。FC的做法是使用红帽自己的nash里的内部命令switchroot,我没找到nash的原代码,得下srpm盘,有点麻烦。但估计它的做法跟chroot一样,也是调用系统调用chroot。
6 目录树先使用cpio打成一个包,然后用gzip压缩。就可以用lilo,grub等加载。具体命令:
  1) cd到那个目录
  2) find . -print | cpio -o -H newc | gzip -9 > /boot/initramfs.gz

本文将不断完善。今天有点着急,先贴个能说明大概意思的吧。
发表于 2006-3-28 21:28:26 | 显示全部楼层
不错,就是在第一中,可以用 ldd 来找到需要的 so 文件。其他的,有待楼主补充。。

我的机器可以执行 pivot,但是只是在我的主系统测试的,没有在 initramfs 中测试。不知道是否一样?
Kernel 2.6.15.6
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-28 21:56:07 | 显示全部楼层
多谢斑竹
ldd出来的东西,有时候会多显示一个,实际却不需要,我也没弄明白为什么会多出来那个。
2.6.13后在initramfs中都不能pivot_root,这里有人讨论了一下
http://www.ussg.iu.edu/hypermail/linux/kernel/0510.1/0013.html
不是initramfs的话就都可以,好象是2.6.14在sys_pivot_root中过加了几行,多检查了个东西,就不行了。
实验的方法非常简单,在脚本init的第一行加上 exec /bin/bash,这样它上来就出来个shell,并且pid是0。
回复 支持 反对

使用道具 举报

发表于 2006-3-28 23:33:56 | 显示全部楼层
pivot root 这个问题已经解决了啊。。就在你给出的页面给出了解决方案。。。

至于 ldd,就算是不需要,你也最好包括上,不然也许那个程序根本运行不了,哪怕是不需要那个so。。。
回复 支持 反对

使用道具 举报

发表于 2007-4-26 15:21:41 | 显示全部楼层
小弟安装楼主的做法
执行exec chroot /newroot /sbin/init
提示找不到/dev/initctil设备文件 失败
udev不能自动创建这个文件  
这个问题要怎样解决呢? 多谢
回复 支持 反对

使用道具 举报

发表于 2007-4-26 16:58:59 | 显示全部楼层
Post by 晨想
不错,就是在第一中,可以用 ldd 来找到需要的 so 文件。其他的,有待楼主补充。。

我的机器可以执行 pivot,但是只是在我的主系统测试的,没有在 initramfs 中测试。不知道是否一样?
Kernel 2.6.15.6


pivot一直是可以的,如果有问题strace一下,应该能找到原因。
回复 支持 反对

使用道具 举报

发表于 2007-4-26 17:05:01 | 显示全部楼层
Post by keenor

1) 为什么使用initramfs:我的跟分区在LVM上
2) 为什么写这篇文章:实在搞得很闹心
3) 为什么不是initrd:趋势
4) 为什么from scratch:我不喜欢自动生成的做了一堆我不知道的事情,尤其是加载一堆模块


首先实现一个目录树,里面有你要的命令。我的方法是这样的,先cp bash过去目标目录的bin子目录,然后在cd到目标目录中chroot .,他告诉你不行,你把ld-linux.2.so也cp过去,他说还是不行,但是这回他说缺了具体哪个.so,你就从主系统里cp过去,循环这个过程。当然你可以使用busybox,我图省事就那么干了。bin里面,至少放上mount,ls,chroot,udev相关的那些。


linux内核在加载initramfs后,会执行根目录下的init,一般那是个脚本,在里面有如下过程:
1 mount -t proc proc /proc
2 mount -t sysfs sys /sys
3 udev start
4 加载module,启动lvm等等,在这里完成
5 mount /dev/mapper/vol-lfs /newroot (这是我的lvm上的lfs根分区)
6 umount /sys
7 umount /proc
8 exec chroot /newroot /sbin/init


1 关于init脚本,是kernel里面定的,指定执行那个文件
2 udev依赖挂载/sys,挂载/proc
3 有些发行版initramfs里面,会在/dev上再挂一个tmpfs,我觉得手工打造的话没必要,因为本来就在内存里,注意留出一定空间就行
4 关于上面init的最后一行,最终根文件系统的init,init如果检查到自己的pid是0,他就会做初始化计算机的事情,所以前面加exec
5 关于pivot_root,如果你去看内核文档里相关内容,他会告诉你先执行pivot_root,再chroot,但实际上,你不能在2.6.13以后的内核启动到initramfs中使用pivot_root,2.6.13是可以的,2.6.14就不行,会出错误Invalid argument。有人讨论过这个问题。跟root_fs有关。但是上面例子中的做法是正确的,我看过gentoo,ubuntu的initramfs,跟上面的例子是一样的。FC的做法是使用红帽自己的nash里的内部命令switchroot,我没找到nash的原代码,得下srpm盘,有点麻烦。但估计它的做法跟chroot一样,也是调用系统调用chroot。
6 目录树先使用cpio打成一个包,然后用gzip压缩。就可以用lilo,grub等加载。具体命令:
  1) cd到那个目录
  2) find . -print | cpio -o -H newc | gzip -9 > /boot/initramfs.gz

本文将不断完善。今天有点着急,先贴个能说明大概意思的吧。



我跟晨想在做的东西里专门有这样个程序来处理。


3.如果你不再要了挂不挂关系不大,而有些系统可能主系统dev目录下是空的,所以一般的做法是mount --move过去。proc和sys同。
5.pivot_root是必要的,switch_root和run-init都会调用pivot_root.
回复 支持 反对

使用道具 举报

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

本版积分规则

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