前提:
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、硬盘分区情况
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
最后,在虚拟机上测试即可。
本文大部分参考了马哥的资料和网上的内容。