制作一个可以启动的linux小系统
在一个已安装好的虚拟机上添加一块硬盘,不用太大:
# fdisk /dev/sdb 将硬盘分区
Command (m for help): n 新建一个分区
Command action
e extended
p primary partition (1-4)
p 创建主分区
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 查看是否复制成功
开始安装grub,grub的安装方法有两种:
法一:使用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'? y
# 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,很简陋,很多命令和功能都无法实现,有待添加。