歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 微型linux系統的裁剪過程

微型linux系統的裁剪過程

日期:2017/3/3 16:14:44   编辑:關於Linux

前面我們介紹過基於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

Copyright © Linux教程網 All Rights Reserved