為了更清晰的了解,嘗試簡單做一個grub+kernel啟動的迷你linux系統
實驗環境:vmware9 rhel5.8
第一步:添加所需磁盤
關閉虛擬機rhel5.8,然後setting-->add....(親,這些實在不想寫...)
添加一個虛擬磁盤(SCSI.vmdk);注意,此磁盤推薦使用scsi
(創建IDE的磁盤,再最後迷你系統引導時內核恐慌...可能是vmware的小bug吧,具體也不清楚)
第二步:創建分區
使用已有的系統rhel5.8為磁盤分倆區(因為系統已有兩個磁盤sda,sdb,因此這個為sda,您的您自己看哈)
sdc1 存放grub、內核等文件--->此分區僅50M大小即可,足夠使用了
sdc2 根分區,大小自定,筆者在此僅給了1G
第三步:給sdb1創建grub且復制或創建啟動所需文件(親,介個很重要哦...)
1. mke2fs -j /dev/sdc1;mke2fs -j /dev/sdc2 格式化倆分區
2. mount /dev/sdc1 /media/boot/;mount /dev/sdc2 /media/sysroot/ 掛載到本地目錄(目錄自己創建)
3. grub-install --root-directory=/media /dev/sdc
使用此命令為sdc創建引導扇區及grub所需文件(個人理解)
注意--root-directory=/media是在掛載點/media/boot的父目錄,理解方式可以參照系統/boot目錄也是位於/根目錄,
而/boot裡面的內容取決於您是否掛載boot分區...(呃,親,這個的確有點繞,不用死磕,慢慢來就好了),/dev/sdc則是目標磁盤,切記是磁盤不是分區.
4. vim /media/boot/grub.conf
default=0 默認啟動哪個系統:0為第一個,1為第二個一次
timeout=30 超時時間
splashimage=(hd0,0)/grub/splash.xpm.gz
啟動時加載的圖片:這個grub-install不會創建的,可以復制系統原來的(筆者就是)
也可以自己做(640x480像素,14位色,gimp編輯保存為xpm格式,gzip -9壓縮,復制到grub目錄,在此指定名字即可)
hiddenmenu 是否隱藏顯示下面的可選項...不想隱藏,這行就可以刪除了...
title Hello MOS! 標題
root (hd0,0) 如果系統只有一個磁盤,就是(hd0,0),若不確定,可以使用find (hd0,0)/查找您所需要的磁盤
kernel /vmlinuz-2.6.18-308.el5 指定啟動內核,此文件需要復制,此處的根,指boot分區.(咋又繞到這了..呃,對系統來說,/boot的父目錄是根/,對boot分區來說,終極根就是boot分區)
initrd /initrd.gz 此文件也需要復制,麻煩的是,還需要先解壓修改再打包復制過來...原文件名字一般initrd-2.6.18-308.el5.img 版本號要跟內核版本號一致
此文件(grub.conf)保存並退出
第四步:復制或修改並復制新硬盤引導所需文件
1. cp /boot/grub/splash.xpm.gz /media/boot/grub/;cp /boot/vmlinuz-2.6.18-308.el5 /media/boot/ 復制這倆,開機圖片+內核
2. mkdir -pv /opt/initrd 建個目錄,專門折騰initrd-2.6.18-308.el5.img
2.1 修改並使用:initrd-2.6.18-308.el5.img 先介紹一下:
此文件存儲方式為:cpio歸檔,gzip壓縮。這個是個比kernel更大,驅動更全的內核,以只讀的方式運行
完全可以理解成其本身就是一個迷你系統,負責使系統過度到真正的內核(vmlinuz-2.6.18-308.el5)等工作(個人理解)
2.2 cp /boot/initrd-2.6.18-308.el5.img /opt/initrd.gz 復制並改名,因為要使用gzip解壓,以免出現不必要的麻煩
2.3 gzip -d /opt/initrd.gz
2.4 cd /opt/initrd
2.5 cpio -id < ../initrd 將文件解包
2.6 vim /opt/initrd/init
找到mkrootdev -t ext3 -o defaults,ro /dev/sda2 此行
修改其內容匹配你的新磁盤的第二個分區,修改使其和你的sdc2一致(本機我的是第三個盤sdc2,但是放到新系統裡面,仍然是sda2)
2.6 find /opt/initrd/|cpio -o --quiet -H newc|gzip -9 > /media/boot/initrd.gz 修改完成後,歸檔,壓縮,扔到新磁盤第一個分區下
第五步:我們還需要點文件(騷等,親..)
1. cd /media/sysroot/;mkdir -pv mkdir -pv etc/rc.d dev proc sys bin sbin lib root media mnt opt home var usr/{bin,sbin,lib} tmp
把根目錄下該有的目錄,都創建一個吧..
2. vim /media/sysroot/etc/inittab (完整內容參見/etc/inittab)
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
這兩行足夠了,第一個三默認進入第三級運行模式,第二個是其執行rc.sysinit腳本
3. vim /media/sysroot/etc/rc.d/rc.sysinit 此腳本內定義了系統各種初始化任務,不再一一細說,(非常好的shell編程范例/etc/rc.d/rc.sysinit)
echo "Hello MOS" 輸出Hello MOS
/bin/bash 並啟動bash
4. 既然要啟動bash,那麼bash是個命令,位於/bin目錄下,我們需要它,So..
cp /bin/bash /media/sysroot/bin/
4.1 單單有/bin/bash還是不行的,為什麼呢??庫文件,Yes!
[root@station69 etc]# ldd `which bash`
linux-gate.so.1 => (0x00b0e000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0x00c07000)
libdl.so.2 => /lib/libdl.so.2 (0x00bd5000)
libc.so.6 => /lib/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00a5a000)
4.2 看到上面的庫文件了麼,親?動手復制吧...
cp /lib/libtermcap.so.2 /media/sysroot/lib/
cp /lib/libdl.so.2 /media/sysroot/lib/
cp .........
4.3 僅僅有bash還不行,為什麼??對了,還有/sbin/init...所以...你懂的...
[root@station69 sysroot]# ldd /sbin/init
linux-gate.so.1 => (0x0068c000)
libsepol.so.1 => /lib/libsepol.so.1 (0x007e6000)
libselinux.so.1 => /lib/libselinux.so.1 (0x007cc000)
libc.so.6 => /lib/libc.so.6 (0x00a79000)
libdl.so.2 => /lib/libdl.so.2 (0x00bd5000)
/lib/ld-linux.so.2 (0x00a5a000)
cp ....;cp ....(親,沒瘋吧???沒事,筆者當時僅復制了兩個,後來的一些命令,寫了一個簡單的腳本,湊合著用吧,文檔末尾列出。)
到此,系統制作已經簡單完成了...看..So easy(聲明一下,這話不是我說的...)...
第六步:創建新虛擬機,磁盤指向剛剛做的磁盤即可,切記,關閉或掛起之前的系統!
下面來些圖片:
 
添加命令及其庫文件腳本,代碼如下:
#!/bin/bash
#Author: MOS
#Script name: AddCommLib.sh
#Date & Time: 2012-10-06/17:19:09
#Version: 1.0.1
#Description:
#
Command=${1:-passwd}
Comm=`which $Command|tail -1`
Res=(`ldd $Comm 2>/dev/null|grep -o "/.*"|cut -d" " -f1`)
Path='/media/sysroot'
[ ! -f $Path$Comm ] && cp $Comm $Path$Comm
for i in ${Res[*]}; do
[ -f $Path${i} ] && continue
cp $i ${Path}${i}
done
腳本寫的倉促,bug挺多,像路徑如果太深,會報錯,內置命令會報錯..但是一般的命令是沒問題的,湊合著用吧...
筆者還得預習功課,到此為止了.....