製作一個可以啓動的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,很簡陋,很多命令和功能都無法實現,有待添加。