打造个人专属的微型Linux--具体实现篇
[日期:2012-07-09]
来源:Linux社区
作者:lustlost
[字体:大 中 小]
分区完成后进行格式化,命令如下
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# mkfs.ext2 /dev/sdb1
[root@localhost ~]# mkfs.ext3 /dev/sdb2
[root@localhost ~]# mkswap /dev/sdb3
step3:
在宿主机上挂在boot分区和根分区
[root@localhost ~]# mkdir /mnt/{boot,sysroot} –p
[root@localhost mnt]# mount /dev/sdb1 /mnt/boot/
[root@localhost mnt]# mount /dev/sdb2 /mnt/sysroot/
下面会将宿主系统的内核,程序等需要的文件移植到这2个目录
step4:
安装bootloader,这里用比较常用的grub作为引导程序
[root@localhost mnt]# grub-install --root-directory=/mnt /dev/sdb #这里指定root目录时,会自动搜寻此目录下的boot目录,此命令就直接将grub全部安装完成,包括第一段的MBR和第二段放置在boot目录下的grub程序
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
安装好grub后,等放置好内核后再回来配置grub
step5:
在根目录下移植系统必须的一些基本的程序
首先创建根目录下所必须的目录
[root@localhost sysroot]# mkdir -p root home proc sys dev etc/rc.d bin sbin lib var tmp opt boot misc mnt media usr
然后先移植init这个系统父进程,这个进程的配置文件为/etc/inittab,加载配置文件后会执行/etc/rc.d/rc.sysinit这个系统初始化脚本来对系统进行一系列的操作
注意移植的时候要移植到相对应的目录
[root@localhost sysroot]# cp /sbin/init /mnt/sysroot/sbin/
除了主程序,还要移植相应的库文件,init所依赖的库文件可以使用ldd命令来查看
[root@localhost sysroot]# ldd /sbin/init
linux-gate.so.1 => (0x00ca5000)
libnih.so.1 => /lib/libnih.so.1 (0x00514000)
libnih-dbus.so.1 => /lib/libnih-dbus.so.1 (0x00a1e000)
libdbus-1.so.3 => /lib/libdbus-1.so.3 (0x006a9000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00d92000)
librt.so.1 => /lib/librt.so.1 (0x0020e000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x005e1000)
libc.so.6 => /lib/libc.so.6 (0x00217000)
/lib/ld-linux.so.2 (0x0080c000)
查询到所需的库文件后,将这些库文件移植到对应的目录。
[root@localhost sysroot]# cp /lib/libnih.so.1 /lib/libnih-dbus.so.1 /lib/libdbus-1.so.3 /lib/libpthread.so.0 /lib/librt.so.1 /lib/libgcc_s.so.1 /lib/libc.so.6 /mnt/sysroot/lib/
用同样的方法再移植bash
[root@localhost sysroot]# cp /bin/bash /mnt/sysroot/bin/
[root@localhost bin]# ln -s bash sh #不要忘了为bash创建链接文件
[root@localhost sysroot]# ldd /bin/bash
linux-gate.so.1 => (0x004c4000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0x00e05000)
libdl.so.2 => /lib/libdl.so.2 (0x00c1d000)
libc.so.6 => /lib/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00954000)
[root@localhost sysroot]# cp /lib/libtinfo.so.5 /lib/libdl.so.2 /lib/ld-linux.so.2 /mnt/sysroot/lib/
/lib/libc.so.6这个库文件是init和bash都需要使用到的,之前移植init时已经cp过去了,这次就不用重复cp了
其它需要用到的程序都可以使用这种方法进行移植,这里只提供了最基本的bash,其它程序可以按照自己的需要进行移植
这里我再移植了一个ls命令,步骤这里就不再罗列出了,等制作好后登录到这个微型linux后,出了bash内置的命令外,我将只能在bash下使用ls命令
之前移植了init后,还没有创建init的配置文件,接下来就先创建init配置文件inittab
[root@localhost bin]# vim /mnt/sysroot/etc/inittab
写入下面2行
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
表示默认启动的运行级别为3,和系统开机时初始化脚本的位置
创建系统初始化脚本
[root@localhost bin]# vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\t hello world ,welcome to the mini linux by lustlost"
/bin/bash
[root@localhost bin]# chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit #不要忘了给脚本加上执行权限
step6:
[root@localhost dev]# yum groupinstall "Development Libraries" -y
[root@localhost dev]# yum groupinstall "Development Tools" -y
好了,程序都移植好了,下面就可以移植内核和initrd了
我们直接使用宿主机上的内核(之前忘了说了,宿主机是最新的CentOS6.2 minimal版本,使用的是内核版本是2.6.32-220.el6.i686)
[root@localhost ~]# cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz #内核的移植很简单,直接cp就行了
接下来要移植引导内核的initrd.img了。如果宿主机和要移植的微型linux的分区不一样的话,解包initrd编辑一下里面的init修改这一行
mkrootdev -t ext3 -o defaults,ro /dev/sda2
确保这一行指定的根文件系统是对应的,然后重新打包
[root@localhost ~]# zcat /boot/initrd-2.6.18-164.el5.img | cpio –id #解包命令
[root@localhost tmp]# find . | cpio -o -H newc --quiet | gzip > /mnt/boot/initrd.gz #重新打包命令
然后继续移植。。。我这里宿主机和微型linux分区是一样的,所以就重新打包演示了
[root@localhost tmp]# cp /boot/initrd-2.6.18-308.el5.img /mnt/boot/initrd.img