前提:

1、一个作为宿主机的Linux(Redhat Enterprise Linux 5.9);

2、宿主机上提供一块额外的硬盘作为新系统的存储盘(IDE接口);

3、Linux内核源码(linux-2.6.18)和busybox源码(busybox-1.20.2)。

4、VMware平台:VMware Workstation 12 Pro


一、硬盘分区和挂载

1、硬盘分区情况
wKioL1cciregxQ3XAAA172C_hiI471.jpg
2、硬盘在宿主机上的挂载
# mount /dev/hda1 /mnt/boot# mount /dev/hda2 /mnt/sysroot

二、编译busybox

# cd /usr/src# tar -jxvf busybox-1.20.2.tar.bz2# cd  busybox-1.20.2

    在执行make menuconfig之前,将linux-2.6.38.5中include/mtd/ubi-user.h复制到busybox源码include/mtd/下(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、修改安装位置为/mnt/sysroot;方法为:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix,修改其值为/mnt/sysroot。(本文未做此修改)

# make install

    编译完成后在busybox的文件夹下会生成_instal,将其复制到/tmp下制作initrd

# mkdir -pv /tmp/busybox# cp -a /mnt/sysroot/* /tmp/busybox

三、制作initrd

# cd /tmp/busybox# rm linuxrc
1、建立rootfs
# mkdir -pv proc sys etc/init.d lib/modules dev mnt/sysroot
2、创建两个必要的设备文件:
# mknod dev/console c 5 1# mknod dev/null c 1 3
3、此版本的RHEL内核默认不能识别ext3文件系统格式,因此,要添加ext3依赖的库文件。
# cp /lib/modules/2.6.18-348.el5/kernel/fs/ext3/ext3.ko lib/modules/
# cp /lib/modules/2.6.18-348.el5/kernel/fs/jbd/jbd.ko lib/modules/
4、为initrd制作init程序,此程序的主要任务是实现rootfs的切换,因此,可以以脚本的方式来实现
# vim  init

添加如下内容:

#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
# insert modules
insmod /lib/modules/jbd.ko
insmod /lib/modules/ext3.ko
# mdev -s is to be run during boot to scan /sys and populate /dev
mdev -s
mount -t ext3 /dev/hda2 /mnt/sysroot
# switch root filesystem
exec switch_root /mnt/sysroot /sbin/init


给此脚本执行权限:

chmod  +x  init
5、制作initrd
# find  .  | cpio -H newc  --quiet -o  | gzip  -9 > /mnt/boot/initrd.gz

说明:

    在这里没有编译kernel,直接复制了宿主机的vmlinuz

#cp /boot/vmlinuz-2.6.18-348.el5 /mnt/boot/vmlinuz

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

# cd  /mnt/sysroot
1、建立rootfs
# mkdir -pv proc sys lib/modules mnt media etc/rc.d/init.d tmp dev/pts boot root var/{log,run,lock/subsys} usr/lib
2、创建两个必要的设备文件:
# mknod dev/console c 5 1# mknod dev/null c 1 3
3、建立系统初始化脚本文件
# vim etc/rc.d/rc.sysinit

添加如下内容: 

#!/bin/shecho -e "\tWelcome to \e[31mlite\e[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
swapon -a

让此脚本具有执行权限:

# chmod +x etc/init.d/rc.sysinit
4、配置init及其所需要inittab文件(init进程配置文件):
# vim etc/inittab

添加如下内容:

::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
5、为系统准备一个“文件系统表”配置文件/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

至此一个简易的基于内存运行的小系统已经构建出来了,我们接下来为此系统创建所需的引导程序。


五、grub引导程序

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

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

接下来为grub建立配置文件:

# vim  /mnt/boot/grub/grub.conf

添加类似如下内容:

default=0
timeout=3
color light-green/black light-magenta/black
title Lite Linux (2.6.18)    
    root (hd0,0)    
    kernel /vmlinuz ro root=/dev/hda2 quiet    
    initrd /initrd.gz

最后,在虚拟机上测试即可。

本文大部分参考了马哥的资料和网上的内容。