嵌入式Linux實習(一) - - USB Linux



好久沒上來跟各位閒聊,也好久沒有為嵌入式Linux發表文章,實在過意不去。據我了解,在大馬玩Linux的高手們仍然以系統管理者居多,但也逐漸有些Linux使用者對嵌入式系統感興趣。因此我常想,要如何寫一篇同時能滿足系統管理者及對嵌入式系統有興趣的朋友們的文章呢?

基本上,系統管理者最常碰的就是伺服器(Server)。而伺服器和嵌入式系統最有關係的,應數BMCServer組成的IPMI系統。由於Linux kernel 2.6.x已支持IPMI,加上Linux有一套好用的SMS (system management software) --IPMItool,因此在IPMI系統上執行Linux作業系統是很適合的。

但我要講的主題畢竟是嵌入式系統,而不是如何在Linux上使用 IPMI。近來行動式系統正夯,LiveCD又不夠環保,所以,沒錯,今天的主題就是來製作LiveUSB。相信許多玩Linux的朋友都有親手做過 Linux LiveUSB的經驗,加上現在製作Linux LiveUSB已經是非常簡單的事,基本上就是利用syslinux工具製作Linux開機,然後把KnoppixISO裡的東西複製到USB,最後修改syslinux.cfg的內容。講完了

沒啦,講這些怎能滿足對嵌入式系統有興趣的有為青年初學者呢? 所以我今天要介紹的是如何依自已的需求,打造一個微型的Linux LiveUSB。最主要的目的是讓想一窺嵌入式作業系統究竟的朋友了解作業系統的組成。

基本上,今天的實習作業只算是最最陽替的系統+工具,但對於初步了解嵌入式作業系統已經足夠。

  • 準備工具:
1. Bootloader (使用syslinux製作)
2. Linux kernel 2.6.x

3. Root file system (Ext2)
4. Busybox
最新版

l

  • Why syslinux
先來看看syslinux的說明 (摘自:
http://syslinux.zytor.com/wiki/index.php/SYSLINUX)

SYSLINUX is a boot loader for the Linuxoperating system which operates off an
MS-DOS/Windows FAT filesystem. It is intended tosimplify first-time installation of Linux, and for creation of rescue- andother special-purpose boot disks.
因此我們可以輕易地利用我們已有的USB Thumb Disk 來製作Linux LiveUSB,又可以保留隨身碟裡的資料(只要空間足夠)。安裝syslinux的開機檔案只須幾十KB,且提供數種作業系統的安裝方式。換言之我們可以在WindowsLinux電腦上安裝syslinux並製作LiveUSB可開機碟的開機部分。






  • Why Kernel 2.6.x version
因為Linux kernel 2.6.x已支援IPMI,為了製作包含IPMILinuxLiveUSB,為了減化製作LinuxLiveUSB的工作,建議使用2.6.x的版本。
  • Why BusyBox
關於BusyBox的說明如下:
BusyBox is designed to be asmall executable for use with Linux, which makes it ideal for special purposeLinux distributions and embedded devices. It has been called "The SwissArmy Knife of Embedded Linux".
可見這把瑞士刀提供embedded system開發者很大的便利性,這是選用的原因。

  • Linux系統下製作開機碟的方法:
1. 安裝syslinux
例如: sudo apt-get install mtoolssyslinux,視不同的套件有不同的作法。
2.
格式化:
#mkfs.vfat /dev/sda1
3.
使用syslinux工具將usbMBR寫成可開機的狀態:
# syslinux /dev/sda1
(我的usb是在/dev/sdb1

編譯核心:
#tar zxvf linux-2.6.xx.tar.gz
#cdlinux-2.6.xx
#make mrproper (
刪除以前留下來的.o)
#make menuconfig (
如果是在Linux終端使用,亦可下: #make xconfig使用視窗選單)
在這個階段,為了製作小而美的LiveUSB,可以把大部份功能都排除,例如Sound Driver等用不太到的功能,但必須留下Support initial ram diskSupport USB…等。為了包含IPMI的功能,建議把IPMI通通都build在核心裡。因此在Device Driver-->Char Device-->IPMI選星號*,把子目錄的選擇都用*起來。
#make

編譯完成後,可在linux-2.6.xx/arch/i386/boot找到bzImage,為核心的Image file




 (二) 



製作File system

首先了解製作檔案的基本架構,如下:
/
|-- bin
|-- dev
|-- etc
|-- lib
|-- mnt
|-- proc
|-- sbin
|-- tmp
|-- usr
`-- var

然後依序創建這些資料夾。先創建一個臨時的資料夾以存放待製作的檔案系統資料,例如:
#mkdir usbdisk
#cd usbdisk
然後建立資料夾:
#mkdir dev etc etc/rc.d lib bin proc mnt tmp var
#chmod 755 dev etc etc/rc.d lib bin mnt tmp var
#chmod 555 proc
#ln -s sbin bin

然後需要製作如下,dev下的裝置檔
#cd dev
#mknod tty c 5 0
#mknod console c 5 1
#chmod 666 tty console

#mknod tty0 c4 0
#chmod 666 tty0

#mknod ram0 b 1 0
#chmod 600 ram0

#mknod null c 1 3
#chmod 666 null
在執行IPMITOOL時,也需要IPMI device,因此需要創建一個IPMI裝置檔。

#cat /proc/devices | more
可查到ipmidevmajor number253,因此創建的方式為:


#mknod ipmi0 c 253 0

  • 使用BusyBox製作/bin的指令檔
先參考BusyBox的說明。BusyBox combines tiny versions of many commonUNIX utilities into a single small executable. It provides replacements formost of the utilities you usually find in GNU fileutils, shellutils, etc.
藉此,我們可用其製作/bin的指令檔。首先下載最新版的BusyBox
http://www.busybox.net/downloads/

由於Busybox 整合了許多我們在Linux上常用的指令與工具,可借由設定 Busybox,勾選我們需要的功能選項。解壓縮以後進入 Busybox 的設定選單:
# tar zxvf busybox-1.xx.x.tar.gz
# cd busybox-1.xx.x/
# make menuconfig

其中,init shell 是必選的項目,請記得勾選這二個功能。同時,也別忘了設定 Busybox 的安裝路徑,將安裝路徑指到我們 root filesystem 的目錄下。
接著直接進行編譯:
# make

編譯完成後,將 Busybox 安裝至我們的 root filesystem 目錄(例如前例中的usbdisk/bin):
# make install
完成安裝以後,我們的bin & sbin 下就有常用的linux指令了!然而這些指令,諸如 ls , cp, mv等等,都是以symboliclink的方式連結至busybox,不論再多的指令都只要一個busybox的大小,所以才會如此的輕量。
  • 加入動態程式庫
有了ls, cp, mv等好用的工具,我們還需要把執行這些工具所需要的librariescopylib/目錄之下,否則這些好用的工具無法執行。
# ldd busybox
將列出所需的lib檔,基本上,至少需要libc.so.6ld-linux.so.2
然後一一從/lib複製到usbdisk/lib/底下。


還沒結束,最後還要製作/etc底下必要的init檔案才算完成。

  • 製作/etc
1. 首先編輯/etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
::askfirst:/bin/sh

2.
修改 inittab 的權限
#chmod 644 inittab

3.
編輯/etc/rc.d/rc.sysinit
#!/bin/sh
mount -a

4.
變更rc.sysinit權限
#chmod 755 rc.sysinit

5.
編輯/etc/fstab
none /proc proc defaults 0 0
修改 fstab 權限:
#chmod 644 fstab

現在根檔案系統的架構就算完成了。上一下廁所,喝杯茶喘口氣,待會兒繼續完成最後一個步驟:製作 Root File system 映像檔(Image File

  • 利用dd指令做出一個空白的檔案,大小為 4Mbytes):
usbdisk目錄下執行:
# dd if=/dev/zero of=initrdbs=1k count=4096
其中initrd為檔案名稱,bsblock sizecount為總共有幾個blocks

  • 接著再將 initrd 製作成 ext2 格式的檔案系統:
# mkfs.ext2 initrd
接著會出現:Proceed anyway?yn)的字眼,請選擇y
這時我們已經完成了一個檔案格式為 ext2 的空白映像檔,之後只要再將剛才做好的 root file system複製到 ext2fs
映像檔「裡面」即可。

  • ext2fs掛載到mnt/
# mkdirmnt/
# mount -t ext2 -o loop initrd mnt/
(指定檔案系統為 ext2

  • 複製檔案系統
利用 tar將檔案系統做成tarball,同時也備份 root filesystem
# cd usbdisk
# tar cz * > ../usbdisk.tar.gz
# cd ..
# cd mnt/
解壓縮:
# tar zxvf../ usbdisk.tar.gz
(再將tarball解至映像檔)

  • 卸載映像檔,然後把映像檔壓成.gz
# cd ..
# umount mnt/
# gzip -9c initrd > initrd.gz

  • 複製kernel file systemusb disk
1.將編譯好的kernelbzImage)複製到usb下,然後更名為vmlinuz
2.
initrd.gz複製到usb
3.
編輯syslinux.cfg
DEFAULT vmlinuz
APPEND root=/dev/ram0 initrd=initrd.gz
大功告成!!







()


慘,我忘了IPMITOOL的部份。基本上就是到:
http://sourceforge.net/project/showfiles.php?group_id=95200&package_id=101411&release_id=664037
下載,解壓縮後安裝。然後記得把IPMITool copybin/,以及其相依的librariescopylib/


 本文連載於佳禮中文Linux版

0 意見:

張貼留言

 
Copyright 2009 Linux學習誌
BloggerTheme by BloggerThemes | Design by 9thsphere