使用Busybox做一个小巧的Linux操作系统

1.基础知识 

一个操作系统可以简单的抽象为,引导程序 内核 文件系统。 


vmlinuz是Linux 内核的镜像文件,可以被引导程序加载,从而启动Linux系统。 


initrd的全称是boot loader initialized RAM disk,它是系统启动时所使用的根文件系统映像文件,这个文件系统中包含几个驱动模块,用来装载实际的根文件系统,比如一个IDE或SCSI硬盘的驱动模块,内核装入这个模块之后用它来驱动硬盘,挂接硬盘到ramdisk的某个子目录,然后再用其中的pivot_root命令,将硬盘文件系统变成根文件系统,并开始执行init进程,此时init ram disk被umount,寿终正寝。 


由此可见,我们可以用vmlinuz initrd.img做一个文件系同长驻内存的迷你Linux。 


现在进入正题了: 


2.编译内核 

cd /usr/src/....----进入内核源代码目录,没有的话去官方网站,随便下 

make menuconfig-----配置编译选项请注意一定加入RAM disk support 和initial RAM disk 

(initrd) support 的支持(在block device中)。另外最好将ext3文件系统编入内核,不要编成模块。配置完毕后保存为.config(默认) 

make bzImage----编译 


在许多内核编译参考中还有 

make modules 

make modules_install两步 

但我们这里没有加入对modules的支持,所以不需要。生成的bzImage文件在usr/src/linux/arch/.../boot中,省略的根据你的机器架构决定,make过程中会有提示,比如我的是x86_64. 注意这个文件非常重要,其实就是我们最终的vmlinuz. 


3.busybox 

busybox是一个集成了一百多个最常用linux命令和工具的软件,它甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分力式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl alt F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接.在我们的迷你Linux中,需要的也正是busybox的命令和工具。 


下载 http://busybox.net/downloads/ 

使用过程中许多高版本都出现编译错误,所以用了一个最原始的版本busybox-1.00 

#cp busybox-1.00.tar.gz /tmp/bunny 

#cd /tmp/bunny 

#tar xvfz busybox-1.00.tar.gz 

#cd busybox-1.00 

#make menuconfig ----编译配置 


下面是需要编译进busybox的功能选项,其他的可以根据需要自选. 

General Configuration应该选的选项 

Show verbose applet usage messages 

Runtime SUID/SGID configuration via /etc/busybox.conf 

Build Options 

Build BusyBox as a static binary (no shared libs) 


这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作. 


Installation Options 

Don't use /usr 


这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向它的链接. 


其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了. 

配置好后退出并保存.config. 

make 

make install 

编译好后在busybox目录下生成子目录_install,里面的内容: 

bin 

linuxrc -> bin/busybox 

sbin 

其中可执行文件busybox在bin目录下,其他的都是指向他的符号链接. 


4.制作自己的root fs 

1)目录结构 

mkdir /tmp/myOS/rootfs 

cd /tmp/myOS/rootfs 

mkdir etc usr var tmp proc home root dev 

其中etc,proc和dev是一定要建的,bin和sbin不用建,因为busybox中已经有了. 

其他的可以象征性的建几个就可以了. 

拷贝busybox 

#cp -R /tmp/bunny/busybox-1.00/_install/* /tmp/myOS/rootfs/ 


2)设备文件 

我是直接从FC系统/dev目录里cp的,方法如下: 

#cp -R /dev/console /tmp/myOS/rootfs/dev/ 

#cp -R /dev/null /tmp/myOS/rootfs/dev/ 

#cp -R /dev/zero /tmp/myOS/rootfs/dev/ 

你认为需要的都cp过来 

有的参考文献说fd0,hda,ram,ram1,tty1,loop1,fb0,fb,tty等是必备的,但是好像有些文件并没有 


3)建立etc目录下的配置文件 

我是直接拷贝busybox自带的例子 

cp -R tmp/bunny/busybox-1.00/examples/bootfloppy/etc/* /tmp/myOS/rootfs/etc 


4)制作initrd.img映象文件 

cd /tmp/myOS/ 

dd if=/dev/zero of=/tmp/disk bs=1M count=32 ------初始化32M内存空间 

mkfs.ext3 -m0 /tmp/disk ------格式化为ext3 

mkdir /mnt/ram 

mount -o loop /tmp/disk /mnt/ram ------挂载到/mnt/ram 

cp -R rootfs/* /mnt/ram ------把rootfs写入内存 

umount /mnt/ram 

dd if=/tmp/disk of=/tmp/myOS/initrd.img ------把内存中的内容以映象方式取出 

ok,这个initrd.img就是我们的rootfs 

有的文献使用ram0,也就是将上述过程的/tmp/disk改为/dev/ram0,虽然制作过程没有问题,但是它存在大小限制 


5.整合,启动 

1)kernel 

cp /usr/src/linux/arch/x86_64/bzImage /boot/vmlinuz 

2)rootfs 一般命名为initrd.img 

cp /tmp/myOS/initrd.img /boot 

3)有了上述两个文件,已经可以通过网络dhcp, tftp服务器启动,tftp服务器中添加启动脚本如下 

DEFAULT linux 

PROMPT 0 

LABEL linux 

KERNEL vmlinuz 

append initrd=initrd.img devfs=nomount ramdisk_size=52000 


问题:理论上这个小Linux也应该可以从grub引导。 

http://www.iwillup.com/oracle/tech/117.html


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值