www.kernel.org
分类: LINUX
2012-09-10 22:09:39
在博文“Linux系统启动过程分析”中我们了解了linux系统的启动流程,今天我们就来手动一步一步从头来构建一个最小的linux系统,然后用模拟器将其加载起来。常见的模拟器有Qemu、Bochs、VMWare、VPC、Virtual Box和Xen等,以及特殊的模拟UML(User-Mode-Linux),这里我们选择用VMWare。
我们制作的Linux系统有shell功能,支持Web Server,telnet等服务,以及ifconfig,vi等常见工具。准备工作:
在 下载内核源代码 linux-2.6.21.tar.bz2;
在 下载busybox源码 busybox-1.14.4.tar.bz2。
在本地新建一个目录,例如/home/DIY,当然你可以随便选择,然后将下载的内核源码和busybox源码包拷贝到/home/DIY目录下;
A)、构造根文件系统
我们都知道标准的发行版linux其目录结构一般是如下这个样子:
我们制作的linux运行起来之后当然也应该有个类似的目录结构。这里我们只选择一些必须的目录,因为我们构建的是“最小”的Linux系统。
在/home/DIY目录下依次执行如下命令:
在rootfs/etc目录下分别建立如下各个文件group、inittab、profile、protocols、
rcS和services:
点击(此处)折叠或打开
点击(此处)折叠或打开
其他的命令行工具由接下来的busybox生成。
B)、编译busybox
在Linux系统中常用的工具,如 bash、grep命令、sed 命令、telnetd等,这里为了方便省事,我就用busybox来代替了。现在的busybox拥有非常多的工具,真正成为一个“Busy”的box。后面的例子将尝试只使用 busybox来充当所有应用层所需要的工具集。包括Shell,网络配置,web服务器,telnet等。而busybox也由此得到一个称号“嵌入式世界的瑞士军刀”。
将修改后的“ busybox.config.txt ”复制到busybox-1.14.4目录下重命名为“.config”,注意文件名前面的点“.”绝对不能省略。
之后弹出如下界面:
在配置界面下,我们依次选择:Busybox Settings => Build Options 然后选中(按空格键),这里我们将编译生成静态库的busybox,如下图中所示选项:
配置busybox的安装目录,依次选择:Busybox Settings => Installation Options ,如下:
保存配置后执行编译命令make:
编译完成后执行make install:
这样我们编译的busybox工具就安装到前面我们创建的rootfs目录中了,此时rootfs目录下的组织结构就变成了如下这个样子:
不管是bin,sbin,usr/bin还是usr/sbin目录下的命令都是到/bin/busybox应用程序的软连接。目前rootfs这个目录结构和我们常见的linux发行版的目录结构还是有些差异,所以我们继续往rootfs中增加dev,proc,tmp,var,lib,root和sys目录:
这样子就更像一个“标准”linux发行版的样子了。接下来我们来制作一个ramdisk的初始化文件,名为initrd。Linux内置支持以RAM磁盘的形式来启动。关于Linux系统的启动流程请参见博文“Linux系统启动过程分析”里的详细描述。
C)、制作initrd文件
D)、编译Linux内核源码
解压内核源码,然后将我修改后的内核配置文件“ linux.config.txt ”拷贝到linux-2.6.21目录下,重命名为“.config”,如下:
执行make menuconfig可以查看哪些配置项已经被选上:
执行make命令开始编译内核:
我们提供的内核配置文件linux.conf将模块已经静态编译到内核中去了,这样就会造成内核比较大,如果是采用动态加载模块的话,需要将所有模块安装到前面制作的ramdisk里。编译好的内核镜像,一般位于:
? 对于x86平台,压缩后的核心是 arch/x86/boot/bzImage;
? 对于MIPS平台,压缩后的核心是 arch/powerpc/boot/zImage;
? 对于arm平台,压缩后的核心是 arch/arm/boot/zImage
……
E)、用VMWare加载内核
将arch/x86/boot/bzImage和/home/DIY/initrd文件拷贝到linux系统的/boot目录下,然后修改/boot/grub/menu.lst,在其中添加如下一项:
点击(此处)折叠或打开
PS:因为我们制作的initrd文件大小就是8M,所以rootfs_size=8M。
重启VMware,在启动界面我们自己built的linux系统:
启动后效果如下:
我们可以看到eth0接口已经up了,其IP地址默认为192.168.1.1,因为我虚拟机的IP地址池是192.168.6.*网段的,所以手动将eth0的接口IP设置为192.168.6.135:
然后通过web和telnet访问我们自己做的系统,最终的访问结果如下:
小结:通过今天的学习相信大家对Linux系统的运行原理和启动流程的认识又上了一个新的台阶,更重要的是学会了如何手动构建一个“最小”的Linux“发行版”系统。那么,现在回过头来再看那些商业版的Linux系统,其实本质和我们今天做工作的差不多,所以,如果有条件我们也可以发行一个自己的系统了:)。
elviswoo2014-09-24 12:21:14
wjlkoorey258:3.12的内核就不要用我提供的内核配置文件,多半早已经不合时宜的。从报的错误来看应该是配置内核编译参数时字符设备没配好,具体3.x的内核没怎么玩儿过。如果你了解的Linux的启动过程和原理再分析这个错误的话,估计应该很快就可以解决了。
遇到和同样的问题:开机启动是遇到Warning: unable to open an initial console。就没有反应了.
我是在centOS5.5下编译的 linux内核版本为2.6.21,busybox1.14.4。求楼主给点解决思路啊
xingfengshi2014-04-30 20:20:15
楼主,我也遇到了同样的问题,开机启动是遇到Warning: unable to open an initial console。就没有反应了。然后没有打印出来,想问下这个问题应该怎么解决呢
bosswin2014-01-06 10:48:54
wjlkoorey258:3.12的内核就不要用我提供的内核配置文件,多半早已经不合时宜的。从报的错误来看应该是配置内核编译参数时字符设备没配好,具体3.x的内核没怎么玩儿过。如果你了解的Linux的启动过程和原理再分析这个错误的话,估计应该很快就可以解决了。
昨天试着VirtualBox上的Ubuntu编译了linux-2.6.34.14的内核,busybox-1.22.0;也出现了这个问题,后来赋了/etc/rcS执行权限就可以了,但是eth0网卡找不到。不知道怎么搞,
回复 | 举报wjlkoorey2582013-12-19 22:27:49
自由魂:你好,我根据您的做法做了,用的是CentOS 5.3,linux-3.12.5的内核,busybox-1.21.1,其他完整按照楼主的做法去做,但是出现的提示是y catn't open /dev/tty1: No such file or director catn't open /dev/tty2: No such file or director catn't open /dev/tty3: No such file or director 然后一遍一遍的刷新这三句话,不能启动……,求解决,谢谢。
3.12的内核就不要用我提供的内核配置文件,多半早已经不合时宜的。从报的错误来看应该是配置内核编译参数时字符设备没配好,具体3.x的内核没怎么玩儿过。如果你了解的Linux的启动过程和原理再分析这个错误的话,估计应该很快就可以解决了。
回复 | 举报