本次实验在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

安装grub及搭建最简系统_系统

注释部分不用加上。


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

安装grub及搭建最简系统_最简系统_02


8. 编写/mnt/sysroot/etc/rc.d/sysinit,因为是最简单的系统,所以很简单

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

安装grub及搭建最简系统_最简系统_03


好了,一个能运行最简陋的系统算是搭建完成了,没有用到模块,没有各种设备文件,只有几个命令。现在来检测一下。多执行几次sync将内存中修改的文件写回硬盘。

将当前虚拟机挂起。

新建一个虚拟机,按照原有步骤执行,不过在选择硬盘的时候,要选择现有的硬盘

安装grub及搭建最简系统_最简系统_04

安装grub及搭建最简系统_最简系统_05

选择上文中新增的sdb所对应的硬盘。安装完系统,直接启动。

首先会进入grub界面

安装grub及搭建最简系统_安装grub_06

直接按回车进入系统,之后会出现一大推启动信息,当看到如下图的时候,就说明成功进入系统

安装grub及搭建最简系统_系统_07


注意由于各种命令和环境都没有搭建,所以,当你输入的时候,屏幕上是不会显示的,但是结果还是会出的。直接打ls,然后按回车,出现下面的画面

安装grub及搭建最简系统_最简系统_08

还可以使用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:]]*"

至于其他的步骤还是蛮简单的