离上一篇启动原理间隔了那么多天,让你们久等了。这期间在制做过程中个人也遇见了些许问题,所以断断续续的才把此篇写完。

问题是在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

微型系统的开机顺序_微型linux系统_微型系统由什么组成

OK,justdoit!

ps:以下都在虚拟机中实现

step1:

首先添加一块硬碟

129GALZOPGZ`MJM$V[B]7UA

]$YG5YEW)$U~1Z%G@]C)R@A

step2:

启动寄主linux系统,对新添加的硬碟进行分区。这儿分一个boot分区,一个根分区和一个swap分区

~}7RGVM04{R98G2[FW6C(FY

可以看见,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作为引导程序

微型linux系统_微型系统由什么组成_微型系统的开机顺序

[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行

微型linux系统_微型系统的开机顺序_微型系统由什么组成

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:

微型linux系统_微型系统的开机顺序_微型系统由什么组成

移植好内核和initrd,就可以配置grub的引导配置文件了

[root@localhost~]#vi/mnt/boot/grub/grub.conf

VP[UPM$P[(1]HK92%`}CDO5

OK,历经千辛万苦linux系统安装教程,有工作全部就绪,我们开始新建一个虚拟机加载制做好的微型linux的硬碟,瞧瞧能不能启动上去

创建自定义虚拟机微型linux系统,使用刚才在宿主机上制做的,里面放置着微型linux的硬碟

7JX5Z3Q}MM~U2ONKK_Q@O)3

D{IU}M7A9M0R$_G16TM_JZH

B03LMSLYE{$(PL}V}CKWO$1

见到了么?一个配置十分龌龊和简陋的虚拟机,只搭载了64MB的显存,其余的配置能删的都删了。

step8:

好了,开始启动一下这个微型linux

开机grub启动菜单

I8)NTCU9_QKH]RDHRAP}VM3

初始化各类硬件

$DJR4PI)_~DLX9F{5X8{L`4

成功步入系统

J{B0@`6NC{@[7X]}C1AZ]NT

使用一下ls命令

KO[O1VW)QPQMXYDU8Q4$IFG

步入到bin目录下,只有bash和ls这2个程序,想要移植其它程序根据前面的方式进行移植就行了

RR[MJO0KLDVJ]BVWV`HIUS9

至此,一个微型的linux的创建成功,只有64MB的显存就启动上去了,各类扩充功能就可以根据自己的需求自由订制了

最后说下开篇说的我碰到的问题,虽然很SB的一个问题,由于宿主机是centos6.2的系统,因为6.2中使用了比较新的initramfs,上面的脚本和曾经的大不一样,于是后来使用了5.8的内核,但之前创建的minilinux的虚拟机是根据redhat6创建的,所以做好系统后仍然启动不了。后来在马哥的提醒下重新创建了redhat5的虚拟机,成功启动了。。。

这儿我想说的是,有时侯一个疏忽的小细节会造成整个系统的失败。之后工作中要谨记不要遗漏细节。。。细节决定胜败。。。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复