手动订制一个基于BusyBox的微型Linux系统

前提:

1、一个作为宿主机的Linux;系统版本为Redhat Enterprise Linux 5.8;

2、busybox源码;版本为busybox-1.20.2。busbox将大量命令打包在一起

3、在宿主机上添加一块额外的硬盘作为新系统的存储盘,这里添加使用一块IDE接口的新硬盘;

4.通过https://busybox.net/和https://www.kernel.org/分别下载Linux内核源码和busybox源码

5.全部在vmware10.0下新建一个redhat5.8主机用于实验并添加额外硬盘

一、为系统上的新硬盘建立两个分区,大小自定义并格式化后,将/dev/hda1挂载至/mnt/boot目录下;将/dev/hda1挂载至/mnt/sysroot目录;

 fdisk /dev/hda 新建两个主分区hda1,hda2

 partprobe /dev/hda 让内核重新读取分区表并生效

 mke2fs -j /dev/hda1

 mke2fs -j /dev/hda2

 mkdir /mnt/boot

 mkdir /mnt/sysroot

 mount /dev/hda1 /mnt/boot

 mount /dev/hda2 /mnt/sysroot

二、获取内核:直接复制宿主机现有内核或自己按需编译新内核

 1.如果编译新内核kernel,步骤如下:

 cd  /usr/src

 tar jxvf linux-2.6.38.5.tar.bz2

 ln  -sv  linux-2.6.38.5  linux

 cd linux

 make menuconfig     按需选择保存至当前目录下.config文件

 make  SUBDIR=arch/  只编译平台核心

 cp arch/x86/boot/bzImage  /mnt/boot

提示:最好将文件系统中的ext3和网卡的驱动程序直接编译进内核,否则就需要手动装载对应模块;

 2.本实验为了方便,不重新编译内核,直接使用宿主机系统现有内核.简单明了

  cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz

三、编译busybox

 cd /usr/src

 tar  -jxvf  busybox-1.20.2.tar.bz2

 cd  busybox-1.20.2

 mkdir include/mtd 

 cp  /usr/src/linux/include/mtd/ubi-user.h  include/mtd/

 make menuconfig

说明:

1、此处需要选择 Busybox Settings --> Build Options -->  Build BusyBox as a static binary (no shared libs),这样可以把Busybox编译成一个不使用共享库的静态二进制文件,从而避免了对宿主机的共享库产生依赖;但你也可以不选择此项,完成编译后把其依赖的共享库复制至微型系统上的对应lib目录中即可;相对比较麻烦一点

2、如想修改安装位置;方法为:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix,这里可以修改安装路径,本实验保持默认不作修改

 make  install

安装后的文件均位于/usr/src/busybox-1.20.2/_install目录中;

 mkdir -pv /tmp/initrd

 cp -r /usr/src/busybox-1.20.2/_install/*  /tmp/initrd

四、制作initrd

 cd  /tmp/initrd

1、建立rootfs:

 mkdir -pv  proc  sys  etc/init.d  tmp  dev  mnt/sysroot

2、创建两个必要的设备文件:

 mknod  dev/console  c  5  1

 mknod  dev/null  c  1  3

3、为initrd制作init程序,此程序的主要任务是实现根文件系统的切换,因此可通过脚本完成:

 rm  linuxrc

 vim  init

添加如下内容:

#!/bin/sh

mount -t proc proc /proc

mount -t sysfs sysfs /sys

insmod /lib/modules/jbd.ko

insmod /lib/modules/ext3.ko

mdev -s

mount -t ext3 /dev/hda2  /mnt/sysroot

exec  switch_root  /mnt/sysroot  /sbin/init

给此脚本执行权限:

chmod  +x  init

  将ext3.ko和jbd.ko复制到对应目录下

  modinfo ext3 查找系统ext3模块路径,便于copy

  modinfo jbd 查找系统jbd模块路径,便于copy

  cp /lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko /lib/modules/ext3.ko

 cp /lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko   /lib/modules/jbd.ko

4、制作initrd

 find  .  | cpio  --quiet  -H newc  -o  | gzip  -9 -n > /mnt/boot/initrd.gz

5.制作grub引导程序

grub-install  --root-directory=/mnt  /dev/hda

说明:此处的/dev/hda为目标系统所在的那块新磁盘;

grub建立配置文件:

 vim  /mnt/boot/grub/grub.conf

添加如下内容:

default        0

timeout        5

title    BusyBox Linux (2.6.18)

    root (hd0,0)

    kernel /vmlinuz ro root=/dev/hda2 

    initrd /initrd.gz

至此/mnt/boot/目录下的系统启动所需的内核vmlinuz,initrd,grub等文件全部建立Ok

五、建立真正的根文件系统

 cd  /mnt/sysroot

 cp -r /usr/src/busybox-1.20.2/_install/* /mnt/sysroot/

1、建立rootfs:

 mkdir -pv  proc  sys  etc/rc.d/init.d  tmp  dev/pts  boot  var/log  usr/lib

2、创建两个必要的设备文件:

 mknod  /mnt/sysroot/dev/console  c  5  1

 mknod  /mnt/sysroot/dev/null  c  1  3

3、建立系统初始化脚本文件

 vim  /mnt/sysroot/etc/rc.d/rc.sysinit

添加如下内容:

#!/bin/sh

echo -e "\tWelcome to  \033[31mBusyBox\033[0m Linux"

echo -e "Remounting the root filesystem ..."

mount -t proc proc /proc

mount -t sysfs sysfs /sys

mount -o  remount,rw  / 

echo -e "Creating the files of device ..."

mdev -s 

echo -e "Mounting the filesystem ..."

mount -a

echo -e "Starting the log daemon ..."

syslogd

klogd

让此脚本具有执行权限:

chmod +x  /mnt/sysroot/etc/init.d/rc.sysinit

4、配置init及其所需要inittab文件

 cd  /mnt/sysroot

 rm  -rf  linuxrc

为init进程提供配置文件:

 vim  etc/inittab

添加如下内容:

::sysinit:/etc/rc.d/rc.sysinit

#console::respawn:-/bin/sh  让此行注销,否则系统直接进行sh

::respawn:/sbin/getty 9600 tty1  用户登入的第1个终端

::respawn:/sbin/getty 9600 tty2  用户登入的第2个终端

::respawn:/sbin/getty 9600 tty3  用户登入的第3个终端

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

5.为目标主机建立用户登入帐号等文件,从宿主机复制root和willow两个帐号即可

grep -E "^(root|willow)\>" /etc/passwd > /mnt/sysroot/etc/

grep -E "^(root|willow)\>" /etc/group > /mnt/sysroot/etc/

grep -E "^(root|willow)\>" /etc/shadow > /mnt/sysroot/etc/

6.为系统准备一个“文件系统表”配置文件/etc/fstab

 vim  etc/fstab

添加如下内容:

sysfs        /sys      sysfs    defaults       0 0

proc        /proc      proc    defaults        0 0

/dev/hda1     /boot      ext3    defaults        0 0

/dev/hda2     /         ext3    defaults        1 1

7.为微型系统订制banner信息

 cp /etc/issue  /mnt/sysroot/etc/ 如需要可以更改里面显示信息

8.为微型系统提供主机名称

 8.1.vim /mnt/sysroot/etc/hostname

 添加如下内容:

 HOSTNAME=Tiny.willow.com

 8.2.编辑系统初始化脚本rc.sysinit,实现开机过程中设定主机名称

 vim /mnt/sysroot/etc/rc.d/rc.sysinit

 echo " Setting the hostname..."

 [ -f /etc/hostname ] && . /etc/hostname

 [ -z $HOSTNAME -o $HOSTNAME == '(none)' ] && HOSTNAME=localhost

 hostname $HOSTNAME

9.由于rc.sysinit文件会产生大量日志,所以将日志发送至/var/log/messages文件;

 vim  etc/syslog.conf

 添加如下一行:

 *.info   /var/log/messages

如需监控日志,tail -f /var/log/messages

好了,至此一个简易的基于内存运行的微型小linux系统已经构建出来了

下面将宿主机关机,然后新建一台虚拟机将刚订制的IDE硬盘挂载上来,开机启动测试效果

注意:tty1终端测试输入root用户密码后无法登入,不知什么原因,望大神指教!

但Alt+F2,Alt+F3切换到第二或第三个终端,登入正常,效果如下:


wKioL1cpu_XCyIr_AACUqZ92PXQ818.jpg