Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4257365
  • 博文数量: 82
  • 博客积分: 671
  • 博客等级: 上尉
  • 技术积分: 24576
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-18 16:08
个人简介

www.kernel.org

文章分类

全部博文(82)

文章存档

2016年(1)

2015年(3)

2014年(12)

2013年(14)

2012年(52)

分类: LINUX

2012-09-10 22:09:39

     在博文“Linux系统启动过程分析”中我们了解了linux系统的启动流程,今天我们就来手动一步一步从头来构建一个最小的linux系统,然后用模拟器将其加载起来。常见的模拟器有QemuBochsVMWareVPCVirtual BoxXen等,以及特殊的模拟UML(User-Mode-Linux),这里我们选择用VMWare

我们制作的Linux系统有shell功能,支持Web Servertelnet等服务,以及ifconfigvi等常见工具。准备工作:

下载内核源代码 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目录下分别建立如下各个文件groupinittabprofileprotocols

rcSservices



点击(此处)折叠或打开

  1. ###################### /etc/group ###################### from here
  2. root:x:0:
  3. ftp:x:800:
  4. nogroup:x:65534:

  5. ######################/etc/inittab ###################### from here
  6. ::sysinit:/etc/rcS
  7. tty1::askfirst:-/bin/sh --login
  8. tty2::askfirst:-/bin/sh --login
  9. tty3::askfirst:-/bin/sh --login

  10. ######################/etc/profile ###################### from here
  11. #!/bin/sh

  12. cat <<EOF

  13. Welcome to  DIY

  14. EOF
  15. export PATH=/bin:/sbin:/usr/bin:/usr/sbin

  16. ######################/etc/protocols ###################### from here
  17. # Internet (IP) protocols
  18. #
  19. ip    0    IP
  20. icmp    1    ICMP
  21. igmp    2    IGMP
  22. ggp    3    GGP    
  23. ipencap    4    IP-ENCAP
  24. st    5    ST
  25. tcp    6    TCP
  26. egp    8    EGP
  27. igp    9    IGP
  28. pup    12    PUP
  29. udp    17    UDP
  30. hmp    20    HMP
  31. xns-idp    22    XNS-IDP
  32. rdp    27    RDP
  33. iso-tp4    29    ISO-TP4
  34. xtp    36    XTP    
  35. ddp    37    DDP    
  36. idpr-cmtp 38    IDPR-CMTP
  37. idrp    45    IDRP
  38. rsvp    46    RSVP
  39. gre    47    GRE    
  40. esp    50    IPSEC-ESP
  41. ah    51    IPSEC-AH
  42. skip    57    SKIP
  43. rspf    73    RSPF CPHB
  44. vmtp    81    VMTP
  45. eigrp    88    EIGRP
  46. ospf    89    OSPFIGP
  47. ax.25    93    AX.25
  48. ipip    94    IPIP
  49. etherip    97    ETHERIP
  50. encap    98    ENCAP
  51. pim    103    PIM    
  52. ipcomp    108    IPCOMP
  53. vrrp    112    VRRP
  54. l2tp    115    L2TP
  55. isis    124    ISIS
  56. sctp    132    SCTP
  57. fc    133    FC

  58. ######################/etc/rcS ###################### from here
  59. #!/bin/sh

  60. export PATH=/bin:/sbin:/usr/bin:/usr/sbin
  61. mount -t proc none /proc
  62. mount -t sysfs none /sys
  63. mount -t tmpfs tmpfs /dev -o size=512K,mode=0755
  64. echo DIY > /proc/sys/kernel/hostname

  65. mkdir -p /var/run /var/log /var/lock /var/state \
  66.          /var/tmp /var/mnt /dev/pts /dev/shm
  67. mount devpts /dev/pts -t devpts

  68. echo /bin/mdev > /proc/sys/kernel/hotplug
  69. mdev -s

  70. ifconfig lo 127.0.0.1 up
  71. ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up

  72. telnetd -l /bin/sh
  73. httpd -h /www

  74. ###################/etc/services ################# from here
  75. ssh    22/tcp
  76. ssh    22/udp
  77. telnet    23/tcp
  78. telnet    23/udp
  79. http    80/tcp    www www-http
  80. http    80/udp    www www-http
  81. login    513/tcp
  82. shell    514/tcp    cmd
再在rootfs/www目录下建立一个index.html文件,内容如下:



点击(此处)折叠或打开

  1. <h1>Success!</h1>
  2. <p>Welcome to DIY linux!</p>
最后rootfs目录的组织结构如下:


    其他的命令行工具由接下来的busybox生成。

B)、编译busybox

Linux系统中常用的工具,如 bashgrep命令、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目录下的组织结构就变成了如下这个样子:

不管是binsbinusr/bin还是usr/sbin目录下的命令都是到/bin/busybox应用程序的软连接。目前rootfs这个目录结构和我们常见的linux发行版的目录结构还是有些差异,所以我们继续往rootfs中增加devproctmpvarlibrootsys目录:

这样子就更像一个“标准”linux发行版的样子了。接下来我们来制作一个ramdisk的初始化文件,名为initrdLinux内置支持以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,在其中添加如下一项:




点击(此处)折叠或打开

  1. title DIY Your OS
  2.    root (hd0,0)
  3.    kernel /bzImage rw root=/dev/ram rootfs_size=8M
  4.    initrd /initrd

   PS:因为我们制作的initrd文件大小就是8M,所以rootfs_size=8M

重启VMware,在启动界面我们自己builtlinux系统:


启动后效果如下:

我们可以看到eth0接口已经up了,其IP地址默认为192.168.1.1,因为我虚拟机的IP地址池是192.168.6.*网段的,所以手动将eth0的接口IP设置为192.168.6.135

然后通过webtelnet访问我们自己做的系统,最终的访问结果如下:

小结:通过今天的学习相信大家对Linux系统的运行原理和启动流程的认识又上了一个新的台阶,更重要的是学会了如何手动构建一个“最小”的Linux“发行版”系统。那么,现在回过头来再看那些商业版的Linux系统,其实本质和我们今天做工作的差不多,所以,如果有条件我们也可以发行一个自己的系统了:)。
  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  


  

阅读(21192) | 评论(12) | 转发(39) |
给主人留下些什么吧!~~

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。就没有反应了。然后没有打印出来,想问下这个问题应该怎么解决呢

我的linux之路2014-02-25 17:26:41

楼主,我想问一下我做的系统启动到  warning:unable to open an initail 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的启动过程和原理再分析这个错误的话,估计应该很快就可以解决了。

回复 | 举报