现在的位置: 首页 > 综合 > 正文

打造小型Linux系統

2013年07月15日 ⁄ 综合 ⁄ 共 13647字 ⁄ 字号 评论关闭

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 說明
0 halt,關機
1 single user mode,單人模式
2 multiuser, no NFS,多使用者,但不提供網路檔案系統
3 full multiuser mode, 完整的多使用者模式
4 unused, 未用
5 X11,直接進入X window(預設值)
6 reboot,重新啟動系統

系統啟動時的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 一般操控台設備 字元 5 0 666
/dev/console 系統操控台設備 字元 5 1 666
/dev/tty0 VGA display虛擬操控台 字元 4 0 666
/dev/ram0 RAM disk 設備 區塊 1 0 600
/dev/fd0 floppy設備 區塊 2 0 600
/dev/null null 設備 字元 1 3 600

在根檔案系統的/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.按[N]鍵表示該項目不要包含在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

抱歉!评论已关闭.