本次实验在Vmware虚拟机中完成,系统为CentOS 6.4。主要步骤:
1.首先新增加一块硬盘sdb,分两个区
2.sdb1当做boot盘,在sdb1上安装grub
3.创建grub.conf文件
4.将vmlinuz和initramfs复制到sdb1上
5.创建/mnt/sysroot,将sdb2挂载到上面 模拟根
proc sys bin sbin lib/modules tmp etc/{rc.d,init},usr,var
6.将init,bash,ls,cat拷到/mnt/sysroot对应目录下
7.将/etc/init/rcS.conf拷到/mnt/sysroot对应目录下
8.创建etc/rc.d/sysinit
详细步骤如下:
1.将sdb分成两个区,一个用于安装grub和vmlinuz及initramfs,一个为根目录所在。
fdisk /dev/sdb ... //分两个区,一个用作boot,一个用作根 mkfs.ext4 /dev/sdb1 mkfs.ext4 /dev/sdb2
2.将grub安装在sdb1.
(1). 在/mnt目录下新建一个boot目录
mkdir /mnt/boot
(2). 将/dev/sdb1挂载到/mnt/boot目录下
mount /dev/sdb1 /mnt/boot
(3). 运行grub安装命令
grub-install --root-directory=/mnt /dev/sdb
3.编写grub.conf文件
vim /mnt/boot/grub/grub.conf
注释部分不用加上。
4. 将vmlinuz和initramfs复制到sdb1上
cp /boot/initramfs-2.6.32-358.el6.i686.img /mnt/boot/initramfs cp /boot/vmlinuz-2.6.32-358.el6.i686 /mnt/boot/vmlinuz
5. 创建/mnt/sysroot,将sdb2挂载到上面,模拟根,并创建相关的文件夹
mkdir /mnt/sysroot mount /dev/sdb2 /mnt/sysroot cd /mnt/sysroot/ mkdir -pv proc sys bin sbin lib/modules tmp etc/{rc.d,init} usr var dev
6. 利用bincp.sh脚本(附件中会介绍)将init,bash,ls,cat及其依赖的库拷到/mnt/sysroot下
[root@FLyence sysroot]# sh bincp.sh A command: ls Copy /bin/ls to /mnt/sysroot finished. Copy /lib/libselinux.so.1 to /mnt/sysroot finished. Copy /lib/librt.so.1 to /mnt/sysroot finished. Copy /lib/libcap.so.2 to /mnt/sysroot finished. Copy /lib/libacl.so.1 to /mnt/sysroot finished. Copy /lib/libc.so.6 to /mnt/sysroot finished. Copy /lib/libdl.so.2 to /mnt/sysroot finished. Copy /lib/ld-linux.so.2 to /mnt/sysroot finished. Copy /lib/libpthread.so.0 to /mnt/sysroot finished. Copy /lib/libattr.so.1 to /mnt/sysroot finished. A command: init Copy /sbin/init to /mnt/sysroot finished. Copy /lib/libnih.so.1 to /mnt/sysroot finished. Copy /lib/libnih-dbus.so.1 to /mnt/sysroot finished. Copy /lib/libdbus-1.so.3 to /mnt/sysroot finished. Copy /lib/libgcc_s.so.1 to /mnt/sysroot finished. A command: bash Copy /bin/bash to /mnt/sysroot finished. Copy /lib/libtinfo.so.5 to /mnt/sysroot finished. A command: cat Copy /bin/cat to /mnt/sysroot finished.
7. 将/etc/init/rcS.conf拷到/mnt/sysroot对应目录下,并且去除启动前和启动后的脚本
cp /etc/init/rcS.conf /mnt/sysroot/etc/init/rcS.conf vim /mnt/sysroot/etc/init/rcS.conf
8. 编写/mnt/sysroot/etc/rc.d/sysinit,因为是最简单的系统,所以很简单
vim /mnt/sysroot/etc/rc.d/sysinit
好了,一个能运行最简陋的系统算是搭建完成了,没有用到模块,没有各种设备文件,只有几个命令。现在来检测一下。多执行几次sync将内存中修改的文件写回硬盘。
将当前虚拟机挂起。
新建一个虚拟机,按照原有步骤执行,不过在选择硬盘的时候,要选择现有的硬盘
选择上文中新增的sdb所对应的硬盘。安装完系统,直接启动。
首先会进入grub界面
直接按回车进入系统,之后会出现一大推启动信息,当看到如下图的时候,就说明成功进入系统
注意由于各种命令和环境都没有搭建,所以,当你输入的时候,屏幕上是不会显示的,但是结果还是会出的。直接打ls,然后按回车,出现下面的画面
还可以使用cat。
附录:现在讲一下bincp.sh脚本,该脚本主要就是为了将命令及命令所依赖的库复制到指定文件夹
主要思路讲一下:
首先明确目标的文件夹是/mnt/sysroot,即要将/bin/ls复制到/mnt/sysroot/bin/ls,同理要将/lib中的库文件复制到/mnt/sysrot/lib下。
获得命令的绝对路径:
Command=`which $Command | grep -v "^alias"`
取得该命令的目录:
ComDir=${Command%/*}
取得该命令所依赖的库文件:
ldd $Command | grep -o "[^[:space:]]*/lib[^[:space:]]*"
至于其他的步骤还是蛮简单的