修改initrd,创建一个微型的linux系统
2011-03-10 21:04
1031 查看
创建一个MiniLinux:
通过对RamDisk(Initrd)分析,现在了解了initrd的主要原理及工作流程,为了加深对该过程的理解,下面使用initrd创建一个微型的linux系统,也更加深对linux开机过程的原理性了解:并用脚本实现该过程;
环境:宿主机:RedHat 5.4 内核:2.6.18
要求:首先实现最基本的启动,正常启动后给用户一个shell;后期拓展,需要实现将根文件系统挂载为RW,实现命令:mount、umount、vi、ls、touch、mkdir等。也可以后期按照需求添加各项功能,逐渐丰富;
1. 配置所需的环境:新增硬盘/dev/sdb(大小512M~1G绰余)、建立所需目录(这里假定新增的硬盘为sdb)
注:在虚拟机里面添加硬盘时将硬盘放到自己容易找到的位置,最好不用默认位置;
2. 对新硬盘分区,格式化后挂载到/mnt目录下的适当位置
3. 拷贝内核文件到相应的位置,并且解包initrd
4. 修改RamDisk内容:
上步骤中将RanDisk解压出来init文件中的”mkrootdev -t ext3 -o defaults,ro /dev/VolGroup00/LogVol00”项修改为”mkrootdev -t ext3 -o defaults,ro sda2”;并且可以根据实际需求,将该文件中不需要加载的dm-mirror、dm-zero、dm-snapshrot项注释或删掉;当然为了更加精简镜像文件的大小,可以到对应的/lib文件夹下删除相应的文件;
initrd文件修改后示例:
5. 重新打包修改好的镜像到相应位置:
命令解释:找本目录下修改好的的全部文件,用管道送给cpio进行打包,使用静默模式,-H制定创建的归档文件类型为newc(是一种支持的文件个数的inode号大于65535的文件模型),并且用 -o 进行输出,输出的流用gzip压缩,使用最大压缩比9,创建出的压缩文件输出至/mnt/boot路径下
6. 安装grub到新加的硬盘上:
7. 编辑生成grub配置文件
安装后缺少grub.conf文件,需要手动建立,也可以将宿主机上的文件拷贝后进行相应的修改:
格式如下:
8. 在根分区sysroot目录下创建基本目录:
9. 拷贝基本的/sbin/init及/bin/bash文件到相应的位置(这两个是最基本的,也可附加其他的命令,自己扩展):
10. 拷贝相应命令的lib库文件:
(注意某些库文件是链接文件,需要将链接及源文件一块拷过去。)
注:linux-gate.so.1 是一个虚拟的库标志,所以不需要拷贝;
cp命令的 -d 参数可以拷贝指定的原文件(区别源文件),若拷贝的是一个链接,则拷贝的是该链接文件;若拷贝链接文件时不加-d参数会使拷贝的时库链接的源文件,这样可能造成某些共享性库的错误;
拷贝后,查看,发现有源文件需要拷贝,再拷贝链接文件指向的源文件:
在库完全链接正确后不会再有颜色显示警告;
上面只是拷贝一部分库的实例,在拷贝时需要对照拷贝进去所有的库文件;
11. 建立init的配置文件/etc/inittab (bash脚本文件注意给予相应的权限)
12. 建立系统调用系统初始化时需要的/etc/rc.d/rc.sysinit脚本:
:设置进入系统初始化界面需要的东西。可以不输出信息,但是需要运行bash,进入bash环境
注:在实际系统中init读取inittab文件,按照文件中的配置依次进行下面工作:
inittdefault 定义系统默认运行级别;
rc.sysint 初始化系统的网络,文件系统等
/etc/rc.d/rc N 执行相应的运行相应级别下的服务脚本
mingetty 提供用户登陆认证,在认证成功后自动调用/bin/bash,为用户提供接口
/etc/X11/prefdm -nodeamon 如果有设置,开启X界面
但是在该小型linux中,没有登录认证功能,所以需要在系统初始化完成后显式的为用户提供shell。
13. 关闭宿主机系统;新建一个虚拟机,硬盘选为刚才创建的硬盘,开机测试;
用shell脚本实现上述创建过程:
系统环境跟上述描述一致,需要先新建硬盘,并且过程中使用了我文章《脚本,自动查找并拷贝库》中的脚本来自动拷贝库,需要将调用的脚本路径添加到PATH路径下,否则会造成出错;
拓展参考:
http://www.ibm.com/developerworks/cn/linux/l-initrd.html(IBM上面用busybox实现了一个精简的initrd)
整理过程,难免出错,希望共同探讨;
本文出自 “Mo” 博客,请务必保留此出处http://molinux.blog.51cto.com/2536040/512081
通过对RamDisk(Initrd)分析,现在了解了initrd的主要原理及工作流程,为了加深对该过程的理解,下面使用initrd创建一个微型的linux系统,也更加深对linux开机过程的原理性了解:并用脚本实现该过程;
环境:宿主机:RedHat 5.4 内核:2.6.18
要求:首先实现最基本的启动,正常启动后给用户一个shell;后期拓展,需要实现将根文件系统挂载为RW,实现命令:mount、umount、vi、ls、touch、mkdir等。也可以后期按照需求添加各项功能,逐渐丰富;
1. 配置所需的环境:新增硬盘/dev/sdb(大小512M~1G绰余)、建立所需目录(这里假定新增的硬盘为sdb)
# mkdir -v /mnt/sysroot # mkdir -v /mnt/boot # mkdir -v /tmp/init
注:在虚拟机里面添加硬盘时将硬盘放到自己容易找到的位置,最好不用默认位置;
2. 对新硬盘分区,格式化后挂载到/mnt目录下的适当位置
# fdisk /dev/sdb (将硬盘分为两个区,第一个100M作为boot分区,第二个作为根分区) # partproble /dev/sdb # mkfs -t ext3 /dev/sdb1 # mkfs -t ext3 /dev/sdb2 # mount /dev/sdb1 /mnt/boot # mount /dev/sdb2 /mnt/sysroot # mount (查看挂载是否成功)
3. 拷贝内核文件到相应的位置,并且解包initrd
# cp /boot/vmlinuz-`uname -r`.img /mnt/boot/vmlinuz # cd /tmp/init # zcat /boot/initrd.2.6.18-164.el5.img | cpio -id &> /dev/null
4. 修改RamDisk内容:
# sed -i s/\(mkrootdev.*ro[[:space:]]\).*/\1sda2/g /tmp/init
上步骤中将RanDisk解压出来init文件中的”mkrootdev -t ext3 -o defaults,ro /dev/VolGroup00/LogVol00”项修改为”mkrootdev -t ext3 -o defaults,ro sda2”;并且可以根据实际需求,将该文件中不需要加载的dm-mirror、dm-zero、dm-snapshrot项注释或删掉;当然为了更加精简镜像文件的大小,可以到对应的/lib文件夹下删除相应的文件;
initrd文件修改后示例:
#!/bin/nash mount -t proc /proc /proc setquiet echo Mounting proc filesystem echo Mounting sysfs filesystem mount -t sysfs /sys /sys echo Creating /dev mount -o mode=0755 -t tmpfs /dev /dev mkdir /dev/pts mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts mkdir /dev/shm mkdir /dev/mapper echo Creating initial device nodes mknod /dev/null c 1 3 mknod /dev/zero c 1 5 mknod /dev/systty c 4 0 mknod /dev/tty c 5 0 mknod /dev/console c 5 1 mknod /dev/ptmx c 5 2 mknod /dev/rtc c 10 135 mknod /dev/tty0 c 4 0 mknod /dev/tty1 c 4 1 mknod /dev/tty2 c 4 2 mknod /dev/tty3 c 4 3 mknod /dev/tty4 c 4 4 mknod /dev/tty5 c 4 5 mknod /dev/tty6 c 4 6 mknod /dev/tty7 c 4 7 mknod /dev/tty8 c 4 8 mknod /dev/tty9 c 4 9 mknod /dev/tty10 c 4 10 mknod /dev/tty11 c 4 11 mknod /dev/tty12 c 4 12 mknod /dev/ttyS0 c 4 64 mknod /dev/ttyS1 c 4 65 mknod /dev/ttyS2 c 4 66 mknod /dev/ttyS3 c 4 67 echo Setting up hotplug. hotplug echo Creating block device nodes. mkblkdevs echo "Loading uhci-hcd.ko module" insmod /lib/uhci-hcd.ko echo "Loading ohci-hcd.ko module" insmod /lib/ohci-hcd.ko echo "Loading ehci-hcd.ko module" insmod /lib/ehci-hcd.ko mount -t usbfs /proc/bus/usb /proc/bus/usb echo "Loading jbd.ko module" insmod /lib/jbd.ko echo "Loading ext3.ko module" insmod /lib/ext3.ko echo "Loading scsi_mod.ko module" insmod /lib/scsi_mod.ko echo "Loading sd_mod.ko module" insmod /lib/sd_mod.ko echo "Loading scsi_transport_spi.ko module" insmod /lib/scsi_transport_spi.ko echo "Loading mptbase.ko module" insmod /lib/mptbase.ko echo "Loading mptscsih.ko module" insmod /lib/mptscsih.ko echo "Loading mptspi.ko module" insmod /lib/mptspi.ko echo "Loading dm-mod.ko module" insmod /lib/dm-mod.ko echo Waiting for driver initialization. stabilized --hash --interval 250 /proc/scsi/scsi echo Making device-mapper control node mkdmnod mkblkdevs echo Creating root device. mkrootdev -t ext3 -o defaults,ro /dev/sda2 (这里请按照自己使用的情况进行修改,我的下一步实验环境为单盘,但是如实验者的环境非但盘,请依照次序进行调整) echo Mounting root filesystem. mount /sysroot echo Setting up other filesystems. setuproot echo Switching to new root and running init. switchroot
5. 重新打包修改好的镜像到相应位置:
# find . | cpio --quiet -H newc -o |gzip -9 -n > /mnt/boot/initrd.gz # cd /mnt/boot/ ; ls (查看生成镜像)
命令解释:找本目录下修改好的的全部文件,用管道送给cpio进行打包,使用静默模式,-H制定创建的归档文件类型为newc(是一种支持的文件个数的inode号大于65535的文件模型),并且用 -o 进行输出,输出的流用gzip压缩,使用最大压缩比9,创建出的压缩文件输出至/mnt/boot路径下
6. 安装grub到新加的硬盘上:
# grub-install --root-directory=/mnt /dev/sdb 注: --root-directory指定安装的位置,并且命令会自己寻找目录下的boot目录来进行安装;
7. 编辑生成grub配置文件
安装后缺少grub.conf文件,需要手动建立,也可以将宿主机上的文件拷贝后进行相应的修改:
格式如下:
timeout=5 default=0 title MyLinux root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 initrd /initrd.gz
8. 在根分区sysroot目录下创建基本目录:
# cd /mnt/sysroot # mkdir -pv bin dev etc lib sbin sys tmp proc tmp # chmod 1777 ./tmp
9. 拷贝基本的/sbin/init及/bin/bash文件到相应的位置(这两个是最基本的,也可附加其他的命令,自己扩展):
# cp /bin/bash /mnt/sysroot/bin # cp /sbin/init /mnt/sysroot/sbin
10. 拷贝相应命令的lib库文件:
(注意某些库文件是链接文件,需要将链接及源文件一块拷过去。)
# ldd /bin/bash # ldd /sbin/init # cp -d /lib/libsepol.so.1 /mnt/sysroot/lib/ 如下ldd命令显示的信息:其中有库文件的全路径;根据路径拷贝库文件:
注:linux-gate.so.1 是一个虚拟的库标志,所以不需要拷贝;
cp命令的 -d 参数可以拷贝指定的原文件(区别源文件),若拷贝的是一个链接,则拷贝的是该链接文件;若拷贝链接文件时不加-d参数会使拷贝的时库链接的源文件,这样可能造成某些共享性库的错误;
拷贝后,查看,发现有源文件需要拷贝,再拷贝链接文件指向的源文件:
在库完全链接正确后不会再有颜色显示警告;
上面只是拷贝一部分库的实例,在拷贝时需要对照拷贝进去所有的库文件;
11. 建立init的配置文件/etc/inittab (bash脚本文件注意给予相应的权限)
# vim /mnt/sysroot/etc/inittab 文件编辑格式如下: id:3:initdefault: (设置系统默认运行级别) si::sysinit:/etc/rc.d/rc.sysinit (置系统初始化脚本位置)
12. 建立系统调用系统初始化时需要的/etc/rc.d/rc.sysinit脚本:
# vim /mnt/sysroot/etc/rc.d/rc.sysinit 编辑文件格式如下: #!/bin/bash echo -e “\tWelcome to \033[31mMyLinux\033[0m.” /bin/bash
:设置进入系统初始化界面需要的东西。可以不输出信息,但是需要运行bash,进入bash环境
注:在实际系统中init读取inittab文件,按照文件中的配置依次进行下面工作:
inittdefault 定义系统默认运行级别;
rc.sysint 初始化系统的网络,文件系统等
/etc/rc.d/rc N 执行相应的运行相应级别下的服务脚本
mingetty 提供用户登陆认证,在认证成功后自动调用/bin/bash,为用户提供接口
/etc/X11/prefdm -nodeamon 如果有设置,开启X界面
但是在该小型linux中,没有登录认证功能,所以需要在系统初始化完成后显式的为用户提供shell。
13. 关闭宿主机系统;新建一个虚拟机,硬盘选为刚才创建的硬盘,开机测试;
用shell脚本实现上述创建过程:
系统环境跟上述描述一致,需要先新建硬盘,并且过程中使用了我文章《脚本,自动查找并拷贝库》中的脚本来自动拷贝库,需要将调用的脚本路径添加到PATH路径下,否则会造成出错;
#!/bin/bash #Author: Mo #Date & Time: 2011-03-10 20:19:20 #Description: auto create a minilinux #Version : 1.2.1 tmpdir=`mktemp -d /tmp/init.XXXX` disk=/dev/sdb sysroot=/mnt/sysroot sysboot=/mnt/boot # Partition the disk echo "n p 1 1 13 n p 2 14 +1000M W" | fdisk ${disk} &>/dev/null wait #update /proc/partitions /sbin/partprobe ${disk} sleep 5 # making file system /sbin/mkfs -t ext3 ${disk}1 wait /sbin/mkfs -t ext3 ${disk}2 wait mkdir -pv ${sysboot} ${sysroot} #update /proc/partitions /sbin/partprobe &> /dev/null sleep 5 #mount disk /bin/mount -t ext3 ${disk}1 ${sysboot} /bin/mount -t ext3 ${disk}2 ${sysroot} wait #kernel; cp /boot/vmlinuz-`uname -r` /mnt/boot/vmlinuz sync #create initrd; cd ${tmpdir} /bin/zcat /boot/initrd-*.img | cpio -id &>/dev/null sed -i s@mkrootdev.*@'mkrootdev -t ext3 -o defaults,ro /dev/sda2'@ ./init sync find . | cpio --quiet -H newc -o | gzip -9 -n >/mnt/boot/initrd.gz wait #grub grub-install --root-directory=/mnt ${disk} &>/dev/null touch ${sysboot}/grub.conf echo "default=0 timeout=2 title MyLinux root (hd0,0) kernel /vmlinuz initrd /initrd.gz" > /mnt/boot/grub/grub.conf sync #create basic directorys in sysroot mkdir -p $sysroot/{etc/rc.d,dev,lib,bin,sbin,proc,sys,tmp} &>/dev/null chmod 1777 ${sysroot}/tmp wait #cp libs #bash ls mount bash vi autolib.sh -s init sleep 1 /root/bin/autolib.sh -s bash sleep 1 autolib.sh -s ls sleep 1 #/tmp/autolib.sh -s vim autolib.sh -s mount sleep 1 autolib.sh -s umount sleep 1 chmod a+x ${sysroot}/{bin,sbin}/* wait #create file /etc/inittab echo "id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit" >${sysroot}/etc/inittab #create file /etc/rc.d/rc.sysinit echo '#!/bin/bash mount -n -o remount,rw /dev/sda2 / echo -e "\tWelcome to \033[31mMy Linux\033[0m" /bin/bash' > ${sysroot}/etc/rc.d/rc.sysinit chmod a+x ${sysroot}/etc/rc.d/rc.sysinit echo "All Done....... Then you can test the miniLinix."
拓展参考:
http://www.ibm.com/developerworks/cn/linux/l-initrd.html(IBM上面用busybox实现了一个精简的initrd)
整理过程,难免出错,希望共同探讨;
本文出自 “Mo” 博客,请务必保留此出处http://molinux.blog.51cto.com/2536040/512081
相关文章推荐
- 修改initrd,创建一个微型的linux系统
- 在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)
- 通过修改配置文件,手动创建一个Linux可登陆账户
- 手动创建一个小于10M的类嵌入式linux系统
- 在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)
- 创建一个Linux小系统
- 在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)【转】
- 一个命令修改Linux系统时区
- 内核安装 ---- 教你制作一个微型linux系统
- Linux文件系统的的实现:创建一个文件的过程
- 5、修改initrd脚本--创建小型linux
- 内容输出Linux文件系统的的实现:创建一个文件的过程
- 《LINUX内核分析》第六周作业:Linux系统如何创建一个新进程
- Linux系统创建一个新的进程
- 手动订制一个基于BusyBox的微型Linux系统
- 创建一个学生系统,实现一下功能; * 1:增加学生 * 2:显示学生 * 3:修改学生 * 4:删除学生 * 5:查找学生 * 6:退出程序 * 请输入选择(
- Linux上创建一个用户,并给该用户指定目录的权限,修改时区
- Linux系统下怎么用CheckInstall从源码创建一个RPM或DEB包
- Linux系统:Ubuntu下如何在桌面创建一个应用程序的“快捷方式”?
- 在linux系统上创建一个windows的磁盘映射及免登录