前面我們介紹過基於busybox制作一個小linux,這篇文章則介紹的是從頭至尾,一步一步根據系統啟動流程制作的微型linux,並且逐漸將其功能完善。
系統啟動流程:
POST 加電自檢,載入一段程序完成基本及核心硬件的檢測
--> BIOS 根據BIOS中設定的引導次序,查找對應設備上的MBR
--> 讀取MBR的BootLoader,BootLoader中配置了要引導的操作系統的內核的位置
--> 讀取內核,內核進行初始化,需要initrd 將Kernel和真正的根文件系統連接起來
--> 執行init,配置文件/etc/inittab。
(RHEL6上的init是被稱為upstart的init程序,配置文件/etc/inittab,/etc/init/*.conf)
首先,先簡單制作一個微型linux系統,使之能啟動起來
一、准備工作
1、在/mnt下創建兩個目錄分別作為微系統的boot和真正的根文件系統:/mnt/boot、/mnt/sysroot
2、安裝一個新的硬盤,這裡以IDE硬盤為例,大小為30G,並將其進行分區,劃分兩個主文件系統為/dev/hda1,/dev/hda2。
3、將這兩個文件系統格式化為ext3文件系統
# mke2fs -j /dev/hda1
# mke2fs -j /dev/hda2
4、掛載磁盤至/mnt/boot,/mntsysroot。
二、提供boot
1、內核
不編譯內核,直接使用原有系統上的內核。
2、制作initrd
創建一個test目錄,在test目錄裡展開系統上原有的並修改
編輯init程序:
將mkrootdev改為hda2,並且將沒有意義的模塊注釋掉,這裡只注釋掉與dm有關的模塊
刪除test/lib/modules下的dm模塊,並將test目錄下的文件歸檔壓縮至/mnt/boot/initrd.gz
3、安裝grub
# grub-install --root-directory=/mnt /dev/hda
# ls /mnt/boot 查看是否生成grub文件
提供grub.conf主配置文件
default=0
timeout=3
title My Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz initrd /initrd.gz
三、提供真正的根文件系統
1、創建我們所需要的目錄
2、為init進程提供配置文件(在/mnt/sysroot下)
etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
提供系統初始化腳本文件
etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "Welcome to \033[34mMy\033[0m Linux"
/bin/bash
sysroot] # chmod +x etc/rc.d/rc.sysinit 加執行權限
3、移植命令
我們可以先寫一個腳本(bincp.sh),以方便命令移植
#!/bin/bash
#
read -t 30 -p "Target System Directory[/mnt/sysroot]: " DEST
DEST=${DEST:-/mnt/sysroot}
libcp() {
LIBPATH=${1%/*}
[ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH
[ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished."
}
bincp() {
CMDPATH=${1%/*}
[ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
[ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH
for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
libcp $LIB
done
}
read -p "Your command: " CMD
until [ $CMD == 'q' ]; do
! which $CMD && echo "Wrong command" && read -p "Input again:" CMD && continue
COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
bincp $COMMAND
echo "copy $COMMAND finished."
read -p "Continue: " CMD
done
執行腳本將所要移植的命令輸進去:
例:init,ls,bash
至此,微系統已經初步成型了,可另外創建一個虛擬機使用微系統所在硬盤進行測試。
記得微系統啟動時,主系統需掛起或者關閉
接下來就是微型linux系統裁剪了,會將這個小系統更加完善,功能更多。
在主系統上,再移植幾個命令./binco,sh:
Touch,mkdir,rm,mv,cp,cat,mount,umount,vi,vim,chmod,chown,ping,ifconfig,insmod,modprobe,rmmod,route,halt,reboot,shutdown,hostname,basename,mingetty
一、實現小系統重啟和關機的功能
1、創建一個腳本/mnt/sysroot/etc/rc.d/init.d/halt,內容如下:
#!/bin/bash
#
case $0 in
*reboot)
COMMAND='/sbin/reboot' ;;
*halt)
COMMAND='/sbin/halt -p' ;;
*)
echo "Only call this script by *reboot OR *halt;"
esac
# 記得加權限
2、創建一個兩個級別控制目錄(級別0:關機,級別6:重啟)
etc/rc.d/rc0.d etc/rc.d/rc6.d
將etc/rc.d/init.d/halt腳本創建兩個鏈接至rc0.d和rc6.d中
 
3、寫一個腳本,能執行對應級別下的腳本:
etc/rc.d/rc
#!/bin/bash
#
RUNLEVEL=$1
for I in /etc/rc.d/rc$RUNLEVEL.d/K*; do
$I stop
done
for I in /etc/rc.d/rc$RUNLEVEL.d/S*; do
$I start
done
記得加權限
4、在init程序腳本中添加對應級別0和級別6(etc/inittab)
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l6:6:wait:/etc/rc.d/rc 6
5、在級別3下啟動一個服務,或在級別0,1下關閉一個服務
寫入一個級別3:
(1)在etc/inittab中添加
l3:0:wait:/etc/rc.d/rc 3
(2)在etc/rc.d下創建rc.3目錄
(3)在etc/rc.d/init.d下寫一個測試腳本,或復制當前系統上的。
將其創建連接文件至etc/rc.d/rc3.d下,並命名為S開頭的
創建連接文件至etc/rc.d/rc0.d下,並命名為K開頭的
創建連接文件至etc/rc.d/rc6.d下,並命名為K開頭的
S*啟動服務,K*關閉服務
例:
tserver
# ln -sv etc/rc.d/init.d/tserver etc/rc.d/rc3.d/S66tserver
# ln -sv etc/rc.d/init.d/tserver etc/rc.d/rc0.d/K33tserver
# ln -sv etc/rc.d/init.d/tserver etc/rc.d/rc0.d/K33tserver
二、啟動兩個終端
在etc/inittab中添加
1:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty1
2:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty2
這裡定義了/bin/bash則 刪除etc/rc.d/rc.sysinit中定義的bash
為bin/bash創建一個鏈接為bin/sh
sysroot] # ln -sv bin/bash bin/sh
可以開啟小系統,驗證以上的配置。
【未完待續】
本文出自 “對著陽光微笑著” 博客,請務必保留此出處http://dongld.blog.51cto.com/4234800/1171763