离上一篇启动原理间隔了那么多天,让你们久等了。这期间在制做过程中个人也遇见了些许问题,所以断断续续的才把此篇写完。
问题是在initrd阶段辨识不到c盘设备,挂载不了rootfs,微软了查了好多资料都没得到解决。刚开始用的是centos6.2的内核,6.2更新了initrdlinux系统界面,上面的init脚本和曾经有很大的不同,于是我换到5.8的内核,还是不行,又切换到5.4的内核,问题依旧存在。火大,又自己去官网下载了2.6.18的内核源代码,基于安装的centos5.4的config重新编译了一次(编译太历时间),问题依然存在。。。那时侯真的是非常无语。最后还是找马哥交流了下,在这儿还要谢谢马哥的指导,找到了问题的关键所在。你们有哪些问题也可以在马哥的群里一起阐述,群号在马哥的博客,地址在我的博客链接中
在开始之前谈谈个人的近况。值得高兴的是pass了国家软考网路工程师,对于这个证书,个人认为之后在央企或则政府单位工作还是有点好处的,通常在国企和国企作用不是很大。不过总是比没有的好。
网工过了,下半年的计划就是把CCNA给过了,这个早已耽误了好久了。主要是对自己的en很不自信。。。呵呵。。对于CCIE。。。还是算了,网路这块,折腾到CCNP也就差不多了。。。
好了,有点啰嗦了,接出来步入题外话
总结在上一篇的linux启动原理,我们晓得要启动一个linux所必须的有的东西有以下几个
1.bootloader:系统引导程序GRUB
2.kernel:系统内核
3.initrd:引导内核的ramdisk
4.init:系统第一个进程
5.用户插口bash
5.init,bash等程序所依赖的库文件和脚本
为了防止诸位看官看的迷糊微型linux系统,首先先说下大约的一个流程
整个实验的流程:安装bootloader--复制kernel到硬碟--提供initrd--配置GRUB--提供init,bash,等必须的软件和库文件
由以上流程罗列举以下所须要的一些配置文件,程序等元素
配置文件/etc/inittab/boot/grub/grub.conf
脚本/etc/rc.d/rc.sysinit
必须的程序
kernel
/sbin/init
/bin/bash
库文件:用ldd查看具体须要什么库文件
晓得了以上所须要的东西,接出来,就可以开始动手在一块硬碟中一步步的构建一个微型的linux了
具体思路是在一个安装好的linux宿主机中添加一块新硬碟,在这块硬碟上安装一个微型的linux,再用另外一台虚拟机加载那块硬碟启动微型linux
OK,justdoit!
ps:以下都在虚拟机中实现
step1:
首先添加一块硬碟
step2:
启动寄主linux系统,对新添加的硬碟进行分区。这儿分一个boot分区,一个根分区和一个swap分区
可以看见,boot分区用了100MB,根分区我只使用了512MB。从中可以看出这是一个非常精简的linux。SWAP分区用了128MB,所以下边我将只会使用64MB的显存来启动这个linux。
分区完成后进行低格,命令如下
[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@localhostmnt]#mount/dev/sdb1/mnt/boot/
[root@localhostmnt]#mount/dev/sdb2/mnt/sysroot/
下边会将寄主系统的内核,程序等须要的文件移植到这2个目录
step4:
安装bootloader,这儿用比较常用的grub作为引导程序
[root@localhostmnt]#grub-install--root-directory=/mnt/dev/sdb#这儿指定root目录时,会手动搜救此目录下的boot目录,此命令就直接将grub全部安装完成,包括第一段的MBR和第二段放置在boot目录下的grub程序
ProbingdevicestoguessBIOSdrives.Thismaytakealongtime.
Installationfinished.Noerrorreported.
Thisisthecontentsofthedevicemap/mnt/boot/grub/device.map.
Checkifthisiscorrectornot.Ifanyofthelinesisincorrect,
fixitandre-runthescript`grub-install’.
(fd0)/dev/fd0
(hd0)/dev/sda
(hd1)/dev/sdb
安装好grub后,等放置好内核后再回去配置grub
step5:
在根目录下移植系统必须的一些基本的程序
首先创建根目录下所必须的目录
[root@localhostsysroot]#mkdir-proothomeprocsysdevetc/rc.dbinsbinlibvartmpoptbootmiscmntmediausr
之后先移植init这个系统父进程,这个进程的配置文件为/etc/inittab,加载配置文件后会执行/etc/rc.d/rc.sysinit这个系统初始化脚本来对系统进行一系列的操作
注意移植的时侯要移植到相对应的目录
[root@localhostsysroot]#cp/sbin/init/mnt/sysroot/sbin/
不仅主程序,还要移植相应的库文件,init所依赖的库文件可以使用ldd命令来查看
[root@localhostsysroot]#ldd/sbin/init
linux-gate.so.1=>(0xx0000ca5000)
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@localhostsysroot]#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@localhostsysroot]#cp/bin/bash/mnt/sysroot/bin/
[root@localhostbin]#ln-sbashsh#不要忘了为bash创建链接文件
[root@localhostsysroot]#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@localhostsysroot]#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@localhostbin]#vim/mnt/sysroot/etc/inittab
写入下边2行
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
表示默认启动的运行级别为3,和系统开机时初始化脚本的位置
创建系统初始化脚本
[root@localhostbin]#vim/mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/bash
echo-e”thelloworld,welcometotheminilinuxbylustlost”
/bin/bash
[root@localhostbin]#chmod+x/mnt/sysroot/etc/rc.d/rc.sysinit#不要忘了给脚本加上执行权限
step6:
[root@localhostdev]#yumgroupinstall”DevelopmentLibraries”-y
[root@localhostdev]#yumgroupinstall”DevelopmentTools”-y
好了,程序都移植好了,下边就可以移植内核和initrd了
我们直接使用宿主机上的内核(之前忘了说了,宿主机是最新的centos6.2minimal版本,使用的是内核版本是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-text3-odefaults,ro/dev/sda2
确保这一行指定的根文件系统是对应的,之后重新打包
[root@localhost~]#zcat/boot/initrd-2.6.18-164.el5.img|cpio–id#解包命令
[root@localhosttmp]#find.|cpio-o-Hnewc--quiet|gzip>/mnt/boot/initrd.gz#重新打包命令
之后继续移植。。。我这儿宿主机和微型linux分区是一样的,所以就重新打包演示了
[root@localhosttmp]#cp/boot/initrd-2.6.18-308.el5.img/mnt/boot/initrd.img
step7:
移植好内核和initrd,就可以配置grub的引导配置文件了
[root@localhost~]#vi/mnt/boot/grub/grub.conf
OK,历经千辛万苦linux系统安装教程,有工作全部就绪,我们开始新建一个虚拟机加载制做好的微型linux的硬碟,瞧瞧能不能启动上去
创建自定义虚拟机微型linux系统,使用刚才在宿主机上制做的,里面放置着微型linux的硬碟
见到了么?一个配置十分龌龊和简陋的虚拟机,只搭载了64MB的显存,其余的配置能删的都删了。
step8:
好了,开始启动一下这个微型linux
开机grub启动菜单
初始化各类硬件
成功步入系统
使用一下ls命令
步入到bin目录下,只有bash和ls这2个程序,想要移植其它程序根据前面的方式进行移植就行了
至此,一个微型的linux的创建成功,只有64MB的显存就启动上去了,各类扩充功能就可以根据自己的需求自由订制了
最后说下开篇说的我碰到的问题,虽然很SB的一个问题,由于宿主机是centos6.2的系统,因为6.2中使用了比较新的initramfs,上面的脚本和曾经的大不一样,于是后来使用了5.8的内核,但之前创建的minilinux的虚拟机是根据redhat6创建的,所以做好系统后仍然启动不了。后来在马哥的提醒下重新创建了redhat5的虚拟机,成功启动了。。。
这儿我想说的是,有时侯一个疏忽的小细节会造成整个系统的失败。之后工作中要谨记不要遗漏细节。。。细节决定胜败。。。