您的位置:首页 > 运维架构 > Linux

打造小型Linux系統

2012-08-29 17:16 281 查看
12-1 Linux 系統的啟動過程
建構一個Linux系統時,了解Linux系統的開機流程是一件很重要的工作。從開機流程中,可以知道哪些軟體元件是必要的,這些檔案或程式需要設定與建立。
Linux系統在啟動過程會有3個主要軟體元件參與其中:開機載入程式bootloader,Linux核心程式、init程序。
開機載入程式bootloader
以PC個人電腦為例,若電腦的BIOS設定啟動順序為光碟機、軟碟、硬碟。在開啟電源後,BIOS會尋找光碟機或軟碟看是否有開機片。若有系統開機片則從開機片中的第0磁區sector、第0磁柱cylinder載入開機程式bootloader。若無系統開機片,會找尋硬碟的MBR(Master Boot Record),執行記錄在MBR上的開機載入程式bootloader。
開機載入程式bootloader是系統啟動時,第一個執行的軟體,以x86 Linux系統為例,常見的bootloader為LILO和GRUB。bootloader中含有開機的資訊,幫忙載入Linux系統核心程式。
Linux核心程式
Linux核心啟動後,會進入保護模式,所有硬體交由Linux核心控制,不再由BIOS控制。當Linux核心載入完成,會開始'初始化系統所有硬體設備,並嘗試掛載根檔案系統,然後啟動init程序。
init程序
init程序的路徑為/sbin/init,在init程序啟動後,會檢查/etc/inittab檔案,找出檔案中標明rcS檔案的路徑,Ubuntu Linux的路徑為/etc/init.d/rcS。init程序會到該路徑執行rcS檔案中的script,該script包含很多的系統變數設定,也包括一些動作,以便執行其他啟動工作。/etc/init.d/rcS的內容如下:
#! /bin/sh

#

# rcS

#

# Call all S??* scripts in /etc/rcS.d/ in numerical/alphabetical order

#

exec /etc/init.d/rc S
當rcS執行完畢,控制權會立即回到init手中,接著init進入預設的run level,
run level 指的是系統中的執行等級。Ubuntu系統的run level如下:
run level說明
0halt,關機
1single user mode,單人模式
2multiuser, no NFS,多使用者,但不提供網路檔案系統
3full multiuser mode, 完整的多使用者模式
4unused, 未用
5X11,直接進入X window(預設值)
6reboot,重新啟動系統
系統啟動時的run level,是由/etc/inittab檔案所決定,直接查看此檔案可得知目前預設的run level。以Ubuntu Linux為例,檔案中有一列為id:5:initdefault:表示系統啟動時預設的run level為5,即直接進入X window。
執行run level對應的script後,控制權又回到init。此時init執行/etc/init.d/rc.local中的script。rc.local是開機流程最後執行的檔案,可以將一些開機後立刻要執行的程式放在這裡。

12-2 根檔案系統
Linux核心的啟動程式碼在執行時會初始化一些核心的機能,掛載根檔案系統,啟動init程序。根檔案系統是所有Linux系統不可或缺的元件。Linux系統要正常啟動,根檔案系統必須要包含這些基本目錄。
除了基本的目錄,在根檔案系統的dev目錄下,還需要一些基本的裝置檔。
檔名說明類型主編號次編號權限
/dev/tty一般操控台設備字元50666
/dev/console系統操控台設備字元51666
/dev/tty0VGA display虛擬操控台字元40666
/dev/ram0RAM disk 設備區塊10600
/dev/fd0floppy設備區塊20600
/dev/nullnull 設備字元13600
在根檔案系統的/etc目錄下,還需要一些配置檔
/etc/inittab
/etc/init.d/rcS
/etc/fstab
在根檔案系統的/bin目錄下,還需要一些工具軟體sh、ls、cd、cat,以提供基本的shell操作功能。這些常用工具會占據很多空間,使用Ubuntu Linux中的工具命令製作成靜態編譯,大概佔用2MB-3MB的空間,不適合在小型系統中使用。
本章不使用Ubuntu Linux中的工具程式,改為採用busyBox程式作為建構嵌入式Linux系統的工具程式,來建構所需的shell工具。

12-3 BusyBox程式
BusyBox是Bruce Perens於1996年發起的計畫,目的在協助Debian發行套件建立安裝磁碟。BusyBox能夠以很小的應用程式,提供Linux系統的整個shell指令集。
BusyBox可以在下列網站下載:
http://www.busybox.net

將下載的busybox-1.16.2.tar.bz2.tar,存在Linux根目錄底下。然後將BusyBox解壓縮
#tar xvfj busybox-1.16.2.tar.bz2.tar
解壓縮後,建立子目錄busybox-1.16.2。為了操作方便,可以建立類似捷徑的符號連結:
#ln -s bbusybox-1.16.2 busybox
執行ls -l可以看到一個捷徑busybox連結到busybox-1.16.2

12-3.1 規劃BusyBox
BusyBox解壓後,必須進行規劃如下:
#cd busybox
#make menuconfig
執行menuconfig指令後,
在Build Options選單下選擇
Build BusyBox as a static library (no shared libs)
在Installation Options選單下選擇編譯後的安裝路徑,其預設路徑為_install
在Coreutils選單下,選擇要編譯的常用Linux指令,例如cat,cp,...等。
在Init Utilities選單下選擇BusyBox的init程式,作為建構小型Linux系統的開機執行程式、關機、重新開機。
[] init

[] support reading an inittab file

[] poweroff

[] reboot
在shells選單下選擇要建構小型Linux系統的shell環境。在此採用ash作為預設的shell。
choose your default shell (ash)
規劃好BusyBox後,選<Exit>離開BusyBox。離開前先儲存規畫檔案。

12-3.2 BusyBox 的init程序
BusyBox除了支援Linux2的shell指令外,還提供init程序,處理系統的啟動工作。但是BusyBox的init程序的啟動步驟與Fedora Linux的init程序稍有不同。說明如下:
1. 為init程序設置信號處理程式,並初始化終端機程式。
2. 剖析/etc/inittab檔案,若inittab檔案中有wait動作類型的指令,則會暫停init程序。若inittab檔案中有once動作類型的指令,表示只會執行一次該指令。
3. 執行系統初始化的sript,預設的script為/etc/init.d/rcS。
當上述工作完成後,init常式會以無窮迴圈的方式執行以下工作:
1. 若init檔案中有respawn動作類型的指令,則會在該指令中止執行時,重新啟動該指令 。
2.若inittab檔案中有askfirst動作類型的指令,則會在乾指令中止執行時,重新啟動該指令,但啟動前會先詢問使用者。

12-3.3 修改BusyBox的初始化script
由於busybox啟動後執行的init,其預設初始化位於/etc/init.d/rcS,如果要Linux系統架構與Fedora相同,可以修改busybox中的init/init.c檔案,將預設的初始化改為位於/etc/rc.d/rc.sysinit,修改內容如下:
#ifndef INIT_SCRIPT

#define INIT_SCRIPT "/etc/rc.d/rc.sysinit"

#endif

12-3.4 編譯BusyBox
當我們完成busybox的規劃,修改完busybox的初始化script位置後,接著進行busybox的編譯,來產生所需要的shell工具。編譯busybox的指令如下:
#make

#make dep (設定相依檔案)

#make install (建立安裝檔案)
編譯好的執行檔案放在_install目錄下 ,這些檔案可以複製到要建構的跟檔案系統的/bin目錄下。

12-4 編輯配置檔
建立小型Linux系統需要設定3個配置檔案:inittab、rc.sysinit、fstab。此3個配置檔案的設定方法如下:
編輯/etc/inittab檔案
inittab檔案是init程序在啟動時,第一個檢查的script。inittab檔案中的每一列格式如下:
其中:
1. id欄位在busybox的init中具有不同的意義,他指的是啟動程序的控制tty。
2. run level 欄位在此可以留留白,因為busybox會完全忽略此欄位。
3.action欄位代表動作類型,busybox的動作類型可以為sysinit、wait、once、respawn、askfirst等。
4.process欄位則用來指定所要執行的程式路徑。
例如:編輯inittab檔案內容如下:
::sysinit:/etc/rc.d/rc.sysinit

::askfirst:/bin/sh
其中sysinit動作類型指明了init程序第一個執行的script的路徑,在此設定為etc/rc.d/rc.sysinit,而askfirst動作類型,表示若shell程序啟動時,會在終端機上顯示please press enter to active this console,讓使用者在按enter鍵後,才會進入shell畫面。
編輯完inittab檔案後,別忘了將這個檔案的權限的權限設為644。
#chmod 644 inittab
編輯etc/rc.d/rc.sysinit檔案
/etc/rc.d/rc.sysinit檔案為init第一個要執行的script,要在script中加入要init執行的shell指令。例如將rc.sysinit檔案編輯如下:
#!/bin/sh

mount -a
其中mount -a的意思為將/etc/fstab中定義的所有裝置掛載。編輯rc.sysinit檔案後,必須將這個檔案權限設定為可執行。
#chmod 755 rc.sysinit
編輯etc/fstab
在rc.sysinit檔案中指明要掛載/etc/fstab中定義的所有裝置,自然還要編輯fstab檔案。fstab檔案中的每一列格式如下:
裝置 掛載點 檔案系統 檔案系統參數 選項1 選項2
fstab範例如下:
proc /proc proc defaults 0 0
其中掛載點設定為/proc,proc目錄可用來記錄在記憶體中的程序。上述指令的選項1設為0,表示不要作dump備份;選項2設為0表示不要以fsck檢驗磁區。反之,將選項1設為1表示要做dump備份,將選項2設為1表示要以fsck檢驗磁區。
編輯完fstab檔案後,必須將檔案權限設定為644。
#chmod 644 fstab

12-5 選擇根檔案系統的類型
以上工作是準備根檔案系統,底下將進行選擇根檔案系統的類型,並將之壓縮以縮小跟檔案系統的大小。底下介紹CRAMFS、ROMFS、RAM Disk三種跟根檔案類型。
CRAMFS
CRAMFS是只有具備基本特性的檔案系統,他是一種經過壓縮且唯讀的檔案系統,主要應用於嵌入式系統中。CRAMFS的每個檔案最大不可超過16MB,且根檔案系統上的群組數不能超過255。
假設為小型Linux系統建立的根檔案系統位於Linux PC中的/root/emlinux目錄下,則要為小型Linux系統建立CRAMFS類型的根檔案系統,指令如下:
#cd /root

#mkcramfs emlinux/ initrd.img (建立cramfs類型檔案系統)

#gzip -9 initrd.img (壓縮檔案系統)
上述指令執行後,首先將位於/root/emlinux目錄下的根檔案系統,建立一個名為initrd.img的CRAMFS類型的映像檔。接著呼叫gzip程式,將initrd.img作進一步的壓縮。選項-9表示使用最高階的壓縮運算法,壓縮完成的檔案為initrd.gz,位於Linux PC中的/root目錄下。
ROMFS
若嵌入式Linux系統使用romfs類型的跟根檔案系統,他是一種唯讀的檔案系統,建立指令如下:
#cd /root

#genromfs -d emlinux/ -f initrd.img (建立romdfs類型檔案系統)

#gzip -ginitrd.img (壓縮檔案系統)
RAM Disk
RAM Disk 類型的根檔案系統是一種存在於RAM記憶體中,且功能有如區塊裝置的檔案系統。即是將RAM記憶體拿來當磁碟使用。由於檔案系統存在於記憶體,具備讀取與寫入的功能,但是寫入的資料會在重新開機時消失。
一般在嵌入式Linux系統的設計中,會建立以ext2為基礎的RAM disk映像檔,作為嵌入式Linux的根檔案系統。RAM Disk的設備檔為/dev/ram0,若使用RAM disk必須要在嵌入式Linux系統的根檔案系統加入/dev/ram0設備檔。

12-5.1 製作ext2為基礎的RAM Disk
底下介紹如何建構小型Linux系統,其根檔案系統採用以ext2為基礎的RAM disk。在一般嵌入式Linux系統的設計,也會採用RAM disk 類型的跟檔案系統,其建立步驟如下:
步驟1:
為跟檔案系統建立一個空的檔案系統映像,指令如下:
#dd if=/dev/zero of=/root/initrd bs=1k count=4096
其中dd指令建立一個4096KB的空檔案系統映像(/dev/zero),並將其轉換為/root/initrd。
步驟2:
建立ext2檔案系統,並且掛載,指令如下:
#loseup /dev/loop0 /root/initrd (設定迴圈設備)

#mke2fs -m 0 /dev/loop0 (建立ext2檔案系統)

#mount -t ext2 /dev/loop0 /mnt (掛載迴圈設備)
其中loseup指令用來設定迴圈設備。迴圈設備(/dev/loop0)可把initrd檔案虛擬成為區塊設備,藉以模擬整個檔案系統。使用者可以將其視為硬碟,並掛載當作目錄來使用。而mk2fs指令可用來建立ext2檔案系統,其中的選項0表示不必為管理員保留區塊。
步驟3:
掛載迴圈設備後,接著將跟檔案系統複製到迴圈設備中,複製到迴圈設備等於複製到initrd檔案中。複製後,再卸載掛載點和迴圈設備。指令如下:
#cp -a /root/emlinux/* /mnt (複製根檔案系統)

#umount /mnt (卸載/mnt)

#loseup -d /dev/loop0 (卸載迴圈設備)
步驟4:
initrd檔案含有複製的根檔案系統,此檔案需要再壓縮變小。
#dd if=/root/initrd | gzip -9 . /root/initrd.gz (壓縮檔案系統)

#rm -f /root/initrd (刪除未壓縮檔案系統)

#sync (將記憶體緩衝區中的資料寫入磁碟)
12-6 編譯Linux核心
Linux核心是所有Linux系統的中心軟體元件,整個系統的能力受限於核心本身的能力。Linux的核心檔案位於/boot目錄下,名稱為vmlinuz-x.x.x,其中x.x.x為該核心的版號,編號格式如下:
主版本:次版本:修訂版本-附版本
次版本用來分別表示核心為正式版或測試版。次版本偶數者為正式版,奇數為測試版。
執行uname指令可查看目前使用的Linux系統核心的版本。
#uname -r
2.6.12-1.1369_FC4
其中2.6.12-1.1369_FC4為目前使用的Fedora Linux的核心版本。
下載Linux核心
製作小型Linux系統時可以打造想要的核心版本。下載核心版本可到下列網站:
http://www.kernel.org
將系統核心版本Linux-2.6.14.6.tar,gz下載到根目錄下,並解壓縮
#tar zxvf linux-2.6.14.6.tar.gz
解壓縮後會產生一個目錄linux-2.4.14.6,包含核心檔案。為方便使用可以建立如同捷徑的符號連結:
#ln -s linux-2.6.14.6 linux

12-6.1 設定Linux核心的組態
進入linux-2.4.14.6目錄,執行menuconfig指令,設定linux核心組態。指令如下:
#cd linux

#make mrproper (刪除殘留的目的檔和相依檔)

#make menuconfig

設定Linux核心組態時,基本操作說明如下:
1.在有[--->]標誌的地方按[Enter]鍵,可以前進到下一層選單。
2.按2次[Esc]鍵或選擇[Exit]選項回到上一層選單。
3.按[h]鍵或是選擇[Help]選項可以看到輔助說明。
4.按[Tab]鍵可以在項目間移動
5.按[Y]鍵表示該項目要包含在Linux核心中。
6.按
鍵表示該項目不要包含在Linux核心中。
7.按[M]鍵表示該項目為模組。
若是要製作一個小型的Linux系統,盡量去掉不必要的選項,減小核心檔案的大小。例如設定核心組態時,盡量不將選項設定為模組,就是不要用M選項。
讓核心支援romfs類型檔案系統
若要製作romfs類型的檔案系統,必須將Linux kernel中的file system選單下的功能選項ROM file system support包含在核心。
讓核心支援rRAM Disk類型檔案系統
若要製作RAM Disk類型的檔案系統,必須將Linux kernel[device driver/block devices]選單下的2個功能選項[RAM 呢]和[Initial RAM disk (initrd) support]=包含在核心。

讓核心支援VGA顯示卡
若Linux核心需要支援VGA顯示卡,要將Linux kernel的device driver/graphics support選單下的2個功能選項:[support for frame buffer devices]和[VESA VGA graphics support]加入核心。

12-6.2 編譯Linux核心
設定好Linux核心組態後,將組態檔儲存。然後進行核心的編譯:
#make all
make all指令為make vmlinux、make modules、make bzImage等3個指令的縮寫。完成Linux核心的編譯後,會產生2個Linux核心:
1. 一個為未經過壓縮的核心,至於[linux]目錄下
2. 一個為壓縮過的核心:bzImage,至於[arch/i386/boot]目錄下,bzImage檔案就是想要的Linux核心檔案。
在編譯系統核心時,要編譯核心的次版本要與現行核心的次版本相同。例如目前Linux PC的核心為2.4.x版,將不要編譯2.6.x版的新核心版本,否則在編譯時會發生錯誤。

12-7 設置Bootloader
在Linux PC中,Bootloader(開機載入程式)中含有開機的資訊,他的主要工作是幫忙載入核心。
對x86而言,有2個主要的bootloader可用:LILO和GRUB。GRand Unified Booloader (GRUB)是GNU 計畫的主要Bootloader,在此也是採用GRUB作為小型Linux系統的Bootloader。
GRUB設定檔
Linux PC的GRUB啟動時,預設會去讀取[/boot/grub/menu.lst]的設定檔。修改此設定檔,來更改GRUB開機的相關功能。
若電腦同時安裝Linux和Windows作業系統,GRUB也可以用來啟動windows作業系統。例如menu.lst設定檔的內容如下
default=1

timeout=20

splashimage=(hd0,5)/boot/grub/splash.xpm.gz

hiddenmenu

titile Fedora Core (2.6.12-1.1369_FC4)

root(hd0,5)

kernel /boot/vmlinuz-2.6.12-1.1369_FC4 ro root=LABEL=/ rhgb quiet

initrd /boot/initrd-2.6.12-1.1369_FC4.img

titile winxp

rootnoverify (hd0,0)

chainloader +1
其中
1. default選項表示預設開機的作業系統,default=1表示預設的系統為winxp作業系統。
2. timeout=20表示選單表示的時間預設為20秒,若超過此時間沒有作出選擇,便會啟動預設的開機作業系統。
3. splashimage選項用來設定開機選單的背景圖片。
4. hiddenmenu用來設定是否要隱藏選單,預設值為否。
5. title選項用來設定選單上顯示的名稱。
6. root(hd0,5)選項表示Linux安裝的硬碟分割區為第一顆硬碟,第6個分割區。GRUB關於硬碟和分割區的計算都是從0開始。
7. kernel選項用來指定要載入的核心和掛載檔案系統的根目錄。
8. initrd選項用來指定開機時要載入的模組。在嵌入式Linux系統的設計,利用initrd來載入跟檔案系統的映像檔。

12-8 實作小型Linux系統
底下將在ubuntu系統建構一個小型Linux系統。也就是說Linux PC中會有2套Linux作業系統,一套為標準的ubuntu作業系統,另一套為自行建構的小型Linux系統。

12-8.1 建立根檔案系統
首先在Linux PC中,建立一個工作目錄[/root/emlinux]用來儲存小型Linux系統的根檔案系統。
#cd /root

#mkdir emlinux

#cd emlinux
接著進入emlinux目錄,建立小型Linux系統的根檔案系統。
cd emlinux

#mkdir bin dev etc etc/rc.d mnt proc sbin usr

#chmod 755 bin dev etc etc/rc.d mnt sbin usr

#chmod 555 proc
在[/dev]目錄下建立一些裝置檔案。
#cd dev

#mknod tty c 5 0

#mknod console c 5 1

#mknod tty0 c 4 0

#mknod ram0 b 1 0

#mknod fd0 b 2 0

#mknod null c 1 3

#mknod 666 tty console tty0 null

#mknod 600 ram0 fd0
12-8.2 建立配置表
在[/etc]目錄下建立一些配置檔案,提供init程序的執行。首先建立[/etc/inittab]檔案,內容如下:
::sysinit:/etc/rc.d/rc.sysinit

::askfirst:/bin/sh
建立[/etc/rc.d/rc.sysinit]檔案,內容如下:
#!/bin/sh

mount -a
建立[/etc/fstab]檔案,內容如下:
proc /proc proc defaults 0 0
該改inittab、rc.sysinit、fstab三個檔案的檔案權限,指令如下:
#chmod 644 inittab

#chmod 755 rc.sysinit

#chmod 644 fstab
12-8.3 加入BusyBox常用工具
編譯busybox為根檔案系統建立常用的工具程式。當編譯好busybox後在[_install]目錄下會有2個目錄:[bib]和[sbin],工具程式就是放在這2個目錄下。將[busybox/bin]和[busybox/sbin]目錄下的檔案複製到[emlinux/bin]和[emlinux/sbin]目錄,操作指令如下:
#cp -a /root/busybox/_install/* /root/emlinux
12-8.4 壓縮跟檔案系統
根檔案系統建立後,要選一個根檔案系統作為小型Linux系統的根檔案映像檔。將[/root/emlinux]目錄下的根檔案系統製作成CRAMFS類型的根檔案映像檔[/root/initrd.gz]。指令如下:
#cd /root

#mkcramfs emlinux/ initrd.img

#gzip -9 initrd.img
12-8.5 編譯Linux核心
編譯Linux核心時去掉一些不必要的選項,減小核心的大小。編譯完成的核心,路徑在[/root/linux/arch/i386/boot/bzImage]。

12-8.6 完成Linux系統
要在ubuntu Linux主機中加入小型的Linux系統,還需要執行底下的步驟:
步驟1:
將編譯好的小型Linux核心映像檔bzImage,根檔案系統映像檔initrd.gz,複製到Linux PC的boot目錄下。並將bzImage改名為vmlinuz-2..6.14.6。
#cd root

#cp initrd.gz /boot

#cp linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.14.6
步驟2:
編輯GRUB設定檔,檔案路徑為[/boot/grub/menu.lst]。注意ubuntu Linux在哪個硬碟,哪個分割區,例如第1個硬碟第6個分割區中,root的指令為root(hd0,5)。
default=2

timeout=20

splashimage=(hd0,5)/boot/grub/splash.xpm.gz

hiddenmenu

titile emlinux (2.6.14.6)

root(hd0,5)

kernel /boot/vmlinuz-2.6.14.6 ro root=/dev/ram0

initrd /boot/initrd.gz

titile Fedora Core (2.6.12-1.1369_FC4)

root(hd0,5)

kernel /boot/vmlinuz-2.6.12-1.1369_FC4 ro root=LABEL=/ rhgb quiet

initrd /boot/initrd-2.6.12-1.1369_FC4.img

titile winxp

rootnoverify (hd0,0)

chainloader +1
測試小型Linux系統
將Linux PC 重新開機,出現GRUB目錄時選[emlinux]項目即可進入剛建構的小型Linux系統。若一切正常會進入Linux的文字模式,可以執行一些基本的shell指令,例如:ls指令,查看目前的Linux目錄。由於建構的是CRAMFS類型的跟檔案系統,只能讀取而不能寫入檔案內容。

12-9 製作Floppy Linux
將建立可以用軟碟開機的小型Linux系統,底下說明GRUB開機載入程式如何移植到軟碟,建構一個RAM Disk類型的根目錄系統。

12-9.1 建立根檔案系統
首先在Linux PC中,建立一個工作目錄[/root/floppy]用來儲存小型floppy Linux系統的根檔案系統。
#cd /root

#mkdir floppy

#cd floppy
接著進入floppy目錄,建立小型Linux系統的根檔案系統。
cd floppy

#mkdir bin dev etc etc/rc.d mnt proc sbin usr

#chmod 755 bin dev etc etc/rc.d mnt sbin usr

#chmod 555 proc
在[/dev]目錄下建立一些裝置檔案。
#cd dev

#mknod tty c 5 0

#mknod console c 5 1

#mknod tty0 c 4 0

#mknod ram0 b 1 0

#mknod fd0 b 2 0

#mknod null c 1 3

#mknod 666 tty console tty0 null

#mknod 600 ram0 fd0
12-9.2 編輯配置檔
在[/etc/inittab]目錄下建立一些配置檔案,提供init程序的執行。首先建立[/etc/inittab]檔案,內容如下:
::sysinit:/etc/rc.d/rc.sysinit

::askfirst:/bin/sh
建立[/etc/rc.d/rc.sysinit]檔案,內容如下:
#!/bin/sh

mount -a

mount -o remount -rw /dev/ram0
其中mount -o remount -rw 表是要重新掛載,並且改變裝置的設定狀態,將ram0裝置從唯讀模式改為可讀寫模式。
建立[/etc/fstab]檔案,內容如下:
proc /proc proc defaults 0 0

/dev/ram0 / ext2 defaults 1 1
由於RAM disk的裝置檔為ram0,所以在fstab檔案中將ram0裝置掛載成系統的根目錄。而檔案系統類型為ext2。
該改inittab、rc.sysinit、fstab三個檔案的檔案權限,指令如下:
#chmod 644 inittab

#chmod 755 rc.sysinit

#chmod 644 fstab
12-9.3 加入常用工具
編譯busybox為根檔案系統建立常用的工具程式。當編譯好busybox後在[_install]目錄下會有2個目錄:[bib]和[sbin],工具程式就是放在這2個目錄下。將[busybox/_install/bin]和[busybox/_install/sbin]目錄下的檔案複製到[floppy/bin]和[floppy/sbin]目錄,操作指令如下:
#cp -a /root/busybox/_install/* /root/floppy
12-9.4 製作RAM disk映像檔
將位於[/root/floppy]目錄下的根檔案系統,製作成為ext2的RAM Disk映像檔,最後檔名為/root/initrd.gz]。此映像檔放置在軟碟磁片中,檔案大小不能超過1.44MB。
#dd if=/dev/zero of=/root/initrd bs=1k count=4096
#loseup /dev/loop0 /root/initrd (設定迴圈設備)

#mke2fs -m 0 /dev/loop0 (建立ext2檔案系統)

#mount -t ext2 /dev/loop0 /mnt (掛載迴圈設備)
#cp -a /root/floppy/* /mnt (複製根檔案系統)

#umount /mnt (卸載/mnt)

#loseup -d /dev/loop0 (卸載迴圈設備)
#dd if=/root/initrd | gzip -9 . /root/initrd.gz (壓縮檔案系統)

#rm -f /root/initrd (刪除未壓縮檔案系統)

#sync (將記憶體緩衝區中的資料寫入磁碟)
12-9.5 編譯Linux核心
編譯Linux核心時去掉一些不必要的選項,減小核心的大小。編譯完成的核心,路徑在[/root/linux/arch/i386/boot/bzImage]。
bzImage要放在軟碟中,檔案大小必須在1..44MB以下。

12-9.6 製作GRUB開機磁片
製作完成根目錄檔案系統initrd.gz和核心映像檔bzImage後,必須製作一張GRUB開機片,然後將2個檔案複製到磁片。
步驟1:
將空白磁片放到軟碟,輸入下列指令建構ext2檔案系統。
#mke2fs /dev/fd0
步驟2:
在磁片建立一些目錄:
#mount /dev/fd0 /mnt/floppy

#mkdir /mnt/floppy/boot

#mkdir /mnt/floppy/boot/grub
步驟3
將GRUB的一些必要檔案複製到磁片
#cp /boot/grub/stage1 /mnt/floppy/boot/grub

#cp /boot/grub/stage2 /mnt/floppy/boot/grub
步驟4

製作GRUB啟動磁片,在終端機輸入RUB指令,如下所示
#grub

grub > root(fd0) (roo告訴GRUB到哪裡搜尋檔案stage1和stage2)

grub > setup(fd0) (setup告訴GRUB將啟動程式安裝到磁片的啟動區)

grub > quit (退出GRUB)
12-9.7 完成Floppy Linux系統
最後的程序
步驟1
將Linux核心映像檔複製到磁片[/boot]目錄下
#cp /root/bzImage /mnt/floppy/boot
步驟2
將建構的根目錄系統initrd.gz,複製到磁片的[/boot]目錄下
#cp /root/initrd.gz /mnt/floppy/boot
步驟3
在軟碟[/boot/grub]目錄下建立grub.conf檔案,作為GRUB的設定檔,內容如下:
default=0

timeout=10

titile Boot Linux (2.6.14.6)

root(fd0)

kernel /boot/bzImage root=/dev/ram0

initrd /boot/initrd.gz
測試Floppy Linux
將Floppy Linux磁片放進軟碟,設定PC的BIOS,將第一個開機裝置設定為軟碟機。重新開機,PC會讀取軟碟中的GRUB開機載入程式,出現GRUB目錄,選Boot Linux (2.6.14.6)項目,即可進入Floppy Linux系統中。
====
http://www.vr.ncue.edu.tw/esa/EmbeddedSystemProgramming2010/ch12.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: