制作一个可以启动的linux小系统

    在一个已安装好的虚拟机上添加一块硬盘,不用太大:

# fdisk /dev/sdb   将硬盘分区    

 

Command (m for help): n   新建一个分区

Command action

   e   extended

   p   primary partition (1-4)

创建主分区

Partition number (1-4): 1   分区号

First cylinder (1-13054, default 1): 

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-13054, default 13054): +100M  分区大小

    按照上述方法,创建/dev/sdb2分区,大小为512M

mkfs -t ext3 /dev/sdb1  将分区格式化为ext3文件格式

# mkfs -t ext3 /dev/sdb2  

 

partprobe /dev/sdb    强制让内核重新找一次分区

cat /proc/partitions    查看分区

 

 

mkdir /mnt/boot    在/mnt目录下创建一个新的目录

mount /dev/sdb1 /mnt/boot/   挂载

mkdir /mnt/sysroot

mount /dev/sdb2 /mnt/sysroot/

 

mkdir /mnt/boot/grub

cp /boot/grub /mnt/boot/grub/  grub复制到/dev/sdb

cd /mnt/boot/grub/    

ls     查看是否复制成功

 

开始安装grubgrub的安装方法有两种

法一使用grub-install命令,默认将grub的所有文件复制安装到其他目录与设备中。

grub-install  --root-directory=DIR  INSTALL__DEVICE

    --root-directory=DIR 中的DIR为实际的目录

INSTALL__DEVICE  安装的设备代号

 

grub-install --root-directory=/mnt /dev/sdb

Probing devices to guess BIOS drives. This may take a long time.

Installation finished. No error reported.

This is the contents of the device map /mnt/boot/grub/device.map.

Check if this is correct or not. If any of the lines is incorrect,

fix it and re-run the script `grub-install'.

 

(fd0) /dev/fd0

(hd0) /dev/sda

(hd1) /dev/sdb       给予设备代号的对应表

法二 用这种方法,安装的时候需要卸载/dev/sdb1,否则会失败

grub>  root (hd1,0)      先设置还有grub目录的分区

 Filesystem type is ext2fs, partition type 0x83

 

grub>  setup (hd1)       将主程序安装到MBR

 Checking if "/boot/grub/stage1" exists... no

 Checking if "/grub/stage1" exists... yes

 Checking if "/grub/stage2" exists... yes

 Checking if "/grub/e2fs_stage1_5" exists... yes

 Running "embed /grub/e2fs_stage1_5 (hd1)"...  15 sectors are embedded

.

succeeded

 Running "install /grub/stage1 (hd1) (hd1)1+15 p (hd1,0)/grub/stage2 /

grub/grub.conf"... succeeded

Done.

mount /dev/sdb1 /mnt/boot   安装完成后,再把/dev/sdb1挂载上去

 

# cd /mnt/boot

cp /boot/vmlinuz-2.6.18-164.el5   

grub/       lost+found/ 

cp /boot/vmlinuz-2.6.18-164.el5 ./vmlinuz

ls

grub  lost+found  vmlinuz

 

# mkdir /tmp/linux

cd /tmp/linux

# cp /boot/initrd-2.6.18-164.el5.img /tmp/linux/

ls

initrd-2.6.18-164.el5.img                       此文件是用cpio命令压缩的文件

# cpio -ivcdu < initrd-2.6.18-164.el5         解压缩此文件

vim init         进入文件init

init文件中的“mkrootdev -t ext3 -o defaults,ro /dev/vol0/root”改为“mkrootdev -t ext3 -o defaults,ro /dev/sda2

 

ls /mnt/sysroot/

lost+found

# cd /mnt/sysroot/

# mkdir sbin

# ls

lost+found  sbin

cp /sbin/init sbin/

mkdir etc

# vim etc/inittab

id:2:initdefault:              默认的run level设置为2

si::sysinit:/etc/rc.d/rc.sysinit    准备系统软件执行的环境的脚本执行文件

编辑完成,按“:wq”保存退出                                                             

mkdir etc/rc.d

vim etc/rc.d/rc.sysinit

#!/bin/bash

#

echo -e "\tWelcome to Linux"

/bin/bash                                                                      

编辑完成,保存退出                                                             

mkdir bin

# cp /bin/bash bin/

# ls bin/

bash

# chmod +x etc/rc.d/rc.sysinit           给初始化脚本一个执行权限                    

 

 

chroot /mnt/sysroot         切换到另一块硬盘工作,可以作为临时测试

chroot: cannot run command `/bin/bash': No such file or directory

 

# ldd /bin/bash              用来查看可执行程序运行时依赖什么库文件

linux-gate.so.1 =>  (0x00345000)

libtermcap.so.2 => /lib/libtermcap.so.2 (0x00713000)

libdl.so.2 => /lib/libdl.so.2 (0x006e4000)

libc.so.6 => /lib/libc.so.6 (0x0059c000)

/lib/ld-linux.so.2 (0x00579000)

# cd /mnt/sysroot/

# mkdir lib

# cp /lib/libtermcap.so.2 lib/            将所依赖的无文件复制过来

cp /lib/libdl.so.2 lib/

# cp /lib/libc.so.6 lib/

cp /lib/ld-linux.so.2 lib/

# tree lib/

lib/

|-- ld-linux.so.2

|-- libc.so.6

|-- libdl.so.2

`-- libtermcap.so.2

 

# ldd /sbin/init                查查/sbin/init是否有所依赖的库文件

linux-gate.so.1 =>  (0x00efe000)

libsepol.so.1 => /lib/libsepol.so.1 (0x002e9000)

libselinux.so.1 => /lib/libselinux.so.1 (0x002cf000)

libc.so.6 => /lib/libc.so.6 (0x0059c000)

libdl.so.2 => /lib/libdl.so.2 (0x006e4000)

/lib/ld-linux.so.2 (0x00579000)

cp /lib/libsepol.so.1 lib/    将所依赖的库文件复制到/mnt的目录中

cp /lib/libselinux.so.1 lib/

cd

# chroot /mnt/sysroot/                          切换到另一块硬盘工作   

bash-3.2#                            成功

bash-3.2# exit                        退出            

exit

# cd /mnt/sysroot/

mkdir var home proc sys dev srv mnt media tmp usr opt misc 创建一些linux系统所需要的目录

# ls      

bin  etc   lib         media  mnt  proc  srv  tmp  var

dev  home  lost+found  misc   opt  sbin  sys  usr

 

cd /tmp/linux/        

ls

bin  etc   initrd-2.6.18-164.el5  proc  sys

dev  init  lib                    sbin  sysroot

rm initrd-2.6.18-164.el5 

rm: remove regular file `initrd-2.6.18-164.el5'?     

ls

bin  dev  etc  init  lib  proc  sbin  sys  sysroot

# find . | cpio -o -H newc --quiet | gzip -9 > /mnt/boot/initrd.gz  重新封装

# ls /mnt/boot/

grub  initrd.gz  lost+found  vmlinuz

cd /mnt/sysroot/

tree                                  查看小的Linux的目录

.

|-- bin

|   `-- bash                  不可缺少

|-- dev

|-- etc

|   |-- inittab                 不可缺少

|   `-- rc.d

|       `-- rc.sysinit           不可缺少

|-- home

|-- lib                       不可缺少

|   |-- ld-linux.so.2

|   |-- libc.so.6

|   |-- libdl.so.2

|   |-- libselinux.so.1

|   |-- libsepol.so.1

|   `-- libtermcap.so.2

|-- lost+found

|-- media

|-- misc

|-- mnt

|-- opt

|-- proc

|-- sbin

|   `-- init                  不可缺少

|-- srv

|-- sys

|-- tmp

|-- usr

`-- var

 

# cd /mnt/boot/grub/

vim grub.conf        编辑grub配置文件,linux系统启动时必不可少

default=0          默认选项为0,即第一个title

timeout=5         等待时间为5秒,超过5秒,系统默认选项启动 

title Linux         grub中的选项,可以有多个

    root(hd0,0)

    kernel /vmlinuz ro root=/dev/sda2

initrd /initrd.gz

编辑完成,保存退出

sync       同步到磁盘

    将此虚拟机挂起或关闭,新建一个虚拟机,磁盘使用上个虚拟机添加的/dev/sdb磁盘。启动新建虚拟机,虚拟机进入下图中的界面,一个小的Linux操作系统创建完成


    这个Linux系统仅仅是一个可以启动的Linux,很简陋,很多命令和功能都无法实现,有待添加。