歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 迷你linux系統的啟動流程

迷你linux系統的啟動流程

日期:2017/3/3 16:13:05   编辑:關於Linux

為了更清晰的了解,嘗試簡單做一個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 =&gt; (0x00b0e000)

libtermcap.so.2 =&gt; /lib/libtermcap.so.2 (0x00c07000)

libdl.so.2 =&gt; /lib/libdl.so.2 (0x00bd5000)

libc.so.6 =&gt; /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 =&gt; (0x0068c000)

libsepol.so.1 =&gt; /lib/libsepol.so.1 (0x007e6000)

libselinux.so.1 =&gt; /lib/libselinux.so.1 (0x007cc000)

libc.so.6 =&gt; /lib/libc.so.6 (0x00a79000)

libdl.so.2 =&gt; /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&gt;/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挺多,像路徑如果太深,會報錯,內置命令會報錯..但是一般的命令是沒問題的,湊合著用吧...

筆者還得預習功課,到此為止了.....

Copyright © Linux教程網 All Rights Reserved