手动订制一个基于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切换到第二或第三个终端,登入正常,效果如下: