生成CPIO格式的initrd

摘要:
因为initrd img只是用于系统启动的虚拟磁盘。系统启动后,它是无用的。因此,我决定使用busybox完成一些必要的启动任务(使用busybox-1.5.1,配置文件如下)cd/tmpmkdirinitrdcdinitrdmkdirdevprocsyslibmntmkdir plib/modules/kernel/{drivers,fs}mkdir plib/modules/kernel

因为initrd.img只是系统启动的一个虚拟磁盘而已,系统启动完成后就没有用处了,因此,我决定用busybox来完成一些必要的启动工作(用的是busybox-1.5.1,配置文件如下)
cd /tmp
mkdir initrd
cd initrd
mkdir dev proc sys lib mnt
mkdir -p lib/modules/kernel/{drivers,fs}
mkdir -p lib/modules/kernel/drivers/{ide,scsi,usb}
mkdir -p lib/modules/kernel/drivers/usb/{core,host,input,storage}
mkdir -p lib/modules/kernel/fs/{ext2,ext3,jbd}
注:复制内核模块有一些讲究,经过分析,要用U盘启动,必须要有sd_mod usb-storage内核模块才能让内核认出U盘,通过分析/lib/modules/uname -r/modules.dep这个文件可以发现:
usb-storage 依赖scsi_mod、usbcore和ide-core这三个模块,但是没有说明依赖usb/host/下面的模块,但是,只有将 drivers/usb/host/下面的模块加载以后,内核才能识别USB设备,因此,drivers/usb/host/目录下的模块是需要复制的
sd_mod 依赖scsi_mod
因为我的U盘上的文件系统是ext3的,因此还需要复制fs/ext3下的所有内核模块(为了稳妥,我同时复制了fs/ext2下的模块)
ext3 依赖 mbcache 和 jbd 模块
这么查找后,已经分析清楚U盘启动的时候需要哪些模块了

/lib/modules/`uname -r`/kernel/drivers/ide/ide-core.ko
/lib/modules/`uname -r`/kernel/drivers/scsi/scsi_mod.ko
/lib/modules/`uname -r`/kernel/drivers/scsi/sd_mod.ko
/lib/modules/`uname -r`/kernel/drivers/usb/core/usbcore.ko
/lib/modules/`uname -r`/kernel/drivers/usb/host/ehci-hcd.ko
/lib/modules/`uname -r`/kernel/drivers/usb/host/ohci-hcd.ko
/lib/modules/`uname -r`/kernel/drivers/usb/host/uhci-hcd.ko
/lib/modules/`uname -r`/kernel/drivers/usb/storage/usb-storage.ko
/lib/modules/`uname -r`/kernel/drivers/usb/input/usbhid.ko #加载这个模块是为了支持USB键盘,如果在启动过程中,如果出现无法找到root的时候,会进入一个临时的shell,因此可能需要一些简单的调试,如 果是USB键盘的话,就必须要加载这个模块了
/lib/modules/`uname -r`/kernel/fs/ext2/ext2.ko
/lib/modules/`uname -r`/kernel/fs/ext3/ext3.ko
/lib/modules/`uname -r`/kernel/fs/jbd/jbd.ko
/lib/modules/`uname -r`/kernel/fs/mbcache.ko

将这些文件按照目录结构复制到lib/modules/kernel下,我省略了uname -r,是为了简化脚本,以便在有新的内核的时候不需要修改启动脚本。

创建设备文件
mknod dev/console c 5 1
mknod dev/null c 1 3

复制可执行文件
cp -a /usr/local/src/busybox-1.5.1/_install/{bin,sbin} .

生成init文件(注, 用不同格式的initrd就需要不同名字的启动文件,这个是我爬了一周的网后得出 的结果,如果是ASCII cpio archive (SVR4 with no CRC)格式的initrd文件,那么就应该使用init,否则,就使用linuxrc,具体可参看linux: Documentation/initrd.txt,只是ramdisk的启动方式比较复杂,而initramfs的方式比较简单,因此我选择用 initramfs的方式)

cat > init < #!/bin/sh
#
# Utility functions
#
PATH="/bin:/sbin"

#
# Setting up mounts
#
mount -nt sysfs sysfs /sys
mount -nt proc proc /proc

ro=-r
INIT=/sbin/init
ROOTDELAY=10
ROOT=/dev/sda1

for i in $(cat /proc/cmdline)
do
case "$i" in
rootdelay=*)
ROOTDELAY=${i#rootdelay=}
;;
root=/dev/*)
ROOT=${i#root=}
;;
init=*)
INIT=${i#init=}
;;
ro)
ro=-r
;;
rw)
ro=
;;
esac
done

#load needed modules
insmod /lib/modules/kernel/fs/mbcache.ko
insmod /lib/modules/kernel/fs/jbd/jbd.ko
insmod /lib/modules/kernel/fs/ext2/ext2.ko
insmod /lib/modules/kernel/fs/ext3/ext3.ko

insmod /lib/modules/kernel/drivers/ide/ide-core.ko
insmod /lib/modules/kernel/drivers/scsi/scsi_mod.ko
insmod /lib/modules/kernel/drivers/usb/core/usbcore.ko
insmod /lib/modules/kernel/drivers/usb/input/usbhid.ko
insmod /lib/modules/kernel/drivers/usb/host/ehci-hcd.ko
insmod /lib/modules/kernel/drivers/usb/host/ohci-hcd.ko
insmod /lib/modules/kernel/drivers/usb/host/uhci-hcd.ko
insmod /lib/modules/kernel/drivers/usb/storage/usb-storage.ko
insmod /lib/modules/kernel/drivers/scsi/sd_mod.ko

echo "wait root ..."
sleep $ROOTDELAY

mdev -s

[ -b $ROOT ] || (echo "not find root";/bin/sh)


mount -n $ro -o errors=remount-ro $ROOT /mnt

echo "Switching root ..."
umount -n /sys
umount -n /proc
exec switch_root /mnt $INIT "$@"
EOFINIT

生成initrd

find . | cpio -o -H newc | gzip > /mnt/sda1/boot/initrd.img-2.6.18-4-686

(注:-H newc 是必须的,否则内核会认为是ramdisk,而不是initramfs,因为这个,我重新启动电脑N次(N>20))

免责声明:文章转载自《生成CPIO格式的initrd》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FastDFS集群数据整体迁移让footer固定在页面底部(CSS-Sticky-Footer)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CDH| Cloudera Manager的安装

一.  cloudera manager的概念 简单来说,Cloudera Manager是一个拥有集群自动化安装、中心化管理、集群监控、报警功能的一个工具(软件),使得安装集群从几天的时间缩短在几个小时内,运维人员从数十人降低到几人以内,极大的提高集群管理的效率。 功能: 1)   管理:对集群进行管理,如添加、删除节点等操作。 2)   监控:监控集群...

opencv配置过程 (cmake,vs2013,qt 5.4)

平台及软件: Windows 7 X86 Visual Studio 2013 OpenCV3.0.0 Cmake3.3 1、下载Windows下的安装文件OpenCV-3.0.0.exe,解压,选择需要的安装目录即可。(本文为F:\opencv) 注意相应的目录不能包含中文。 2、Cmake编译 执行CMake,用于把OpenCV的源码生成对应的VS工程...

gcc 编译器参数

一、GCC编译过程 参考:http://hi.baidu.com/zengzhaonong/item/c00e079f500adccab625314f-------------------------------------    Pre-Processing   cpp        预处理    Compiling        ccl       ...

linux动态链接库---一篇讲尽

一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory原因一般有两个, 一个是操作系统里确...

Django(一):从socket到MVC

一、socket的http套路 web应用本质上是一个socket服务端,用户的浏览器是一个socket客户端。socket处在应用层与传输层之间,是操作系统中I/O系统的延伸部分(接口),负责系统进程和应用之间的通信。 HTTP协议又称超文本传输协议。 1 //浏览器发送一个HTTP请求; 2 //服务器收到请求,根据请求信息,进行函数处理,生成一个H...

关于 angular 项目 结合 RequireJs 的问题整理

1、在 将 依赖的js 通过 require.config 设置 映射的时候,结合dataTables.bootstrap.js和 jquery.dataTables.js 时 遇到如下报错: Uncaught Error: Script error for "datatables.net", needed by: dataTablesbootstrap;...