查看: 4197|回复: 33
|
嵌入式Linux實習(一) - - USB Linux
[复制链接]
|
|
好久沒上來跟各位閒聊,也好久沒有為嵌入式Linux發表文章,實在過意不去。據我了解,在大馬玩Linux的高手們仍然以系統管理者居多,但也逐漸有些Linux使用者對嵌入式系統感興趣。因此我常想,要如何寫一篇同時能滿足系統管理者及對嵌入式系統有興趣的朋友們的文章呢?
基本上,系統管理者最常碰的就是伺服器(Server)。而伺服器和嵌入式系統最有關係的,應數BMC及Server組成的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開機,然後把Knoppix的ISO裡的東西複製到USB,最後修改syslinux.cfg的內容。講完了
沒啦,講這些怎能滿足對嵌入式系統有興趣的有為青年初學者呢? 所以我今天要介紹的是如何依自已的需求,打造一個微型的Linux LiveUSB。最主要的目的是讓想一窺嵌入式作業系統究竟的朋友了解作業系統的組成。
基本上,今天的實習作業只算是最最陽替的系統+工具,但對於初步了解嵌入式作業系統已經足夠。
1. Bootloader (使用syslinux製作)
2. Linux kernel 2.6.x版
3. Root file system (Ext2)
4. Busybox最新版
l
先來看看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,且提供數種作業系統的安裝方式。換言之我們可以在Windows或Linux電腦上安裝syslinux並製作LiveUSB可開機碟的開機部分。
- Why Kernel 2.6.x version?
因為Linux kernel 2.6.x已支援IPMI,為了製作包含IPMI的LinuxLiveUSB,為了減化製作LinuxLiveUSB的工作,建議使用2.6.x的版本。
關於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開發者很大的便利性,這是選用的原因。
1. 安裝syslinux
例如: sudo apt-get install mtoolssyslinux,視不同的套件有不同的作法。
2. 格式化:
#mkfs.vfat /dev/sda1
3. 使用syslinux工具將usb的MBR寫成可開機的狀態:
# 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 disk、Support USB…等。為了包含IPMI的功能,建議把IPMI通通都build在核心裡。因此在Device Driver-->Char Device-->IPMI選星號*,把子目錄的選擇都用*起來。
#make
編譯完成後,可在linux-2.6.xx/arch/i386/boot找到bzImage,為核心的Image file。
[ 本帖最后由 詩魂 于 27-3-2009 11:18 PM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 27-3-2009 11:02 PM
|
显示全部楼层
回复 1# 詩魂 的帖子
首先了解製作檔案的基本架構,如下:
/
|-- 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
可查到ipmidev的major number為253,因此創建的方式為:
#mknod ipmi0 c 253 0
先參考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等好用的工具,我們還需要把執行這些工具所需要的libraries都copy到lib/目錄之下,否則這些好用的工具無法執行。
# ldd busybox
將列出所需的lib檔,基本上,至少需要libc.so.6,ld-linux.so.2
然後一一從/lib複製到usbdisk/lib/底下。
還沒結束,最後還要製作/etc底下必要的init檔案才算完成。
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指令做出一個空白的檔案,大小為 4M(bytes):
在usbdisk目錄下執行:
# dd if=/dev/zero of=initrdbs=1k count=4096
其中initrd為檔案名稱,bs為block size,count為總共有幾個blocks。
- 接著再將 initrd 製作成 ext2 格式的檔案系統:
# mkfs.ext2 initrd
接著會出現:Proceed anyway?(y,n)的字眼,請選擇y
這時我們已經完成了一個檔案格式為 ext2 的空白映像檔,之後只要再將剛才做好的 root file system複製到 ext2fs
映像檔「裡面」即可。
# 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解至映像檔)
# cd ..
# umount mnt/
# gzip -9c initrd > initrd.gz
- 複製kernel 及file system到usb disk:
1.將編譯好的kernel(bzImage)複製到usb下,然後更名為vmlinuz
2.將initrd.gz複製到usb下
3.編輯syslinux.cfg:
DEFAULT vmlinuz
APPEND root=/dev/ram0 initrd=initrd.gz
大功告成!!
[ 本帖最后由 詩魂 于 28-3-2009 11:11 PM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 27-3-2009 11:10 PM
|
显示全部楼层
慘,我忘了IPMITOOL的部份。基本上就是到:
http://sourceforge.net/project/showfiles.php?group_id=95200&package_id=101411&release_id=664037
下載,解壓縮後安裝。然後記得把IPMITool copy到bin/,以及其相依的libraries要copy到lib/。 |
|
|
|
|
|
|
|
发表于 28-3-2009 12:58 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 28-3-2009 09:13 PM
|
显示全部楼层
回复 4# onlylonly 的帖子
謝謝only兄的支持,我寫這篇寫得有點急,
若有錯誤還望指正。寫這篇我也參考了很多資料,尤其是Linux howto
有關於floppy bootdisk的,雖然現在沒有人在用floppy,但製作的原理還是大同小異。這是Linux 可愛之處 |
|
|
|
|
|
|
|
发表于 28-3-2009 10:23 PM
|
显示全部楼层
顶一下~
有考虑出书吗? |
|
|
|
|
|
|
|
发表于 28-3-2009 10:43 PM
|
显示全部楼层
太感激 詩魂兄的热心教学。。。。。
和恭喜恭喜。。。 此贴已经生为 linux区 的 精华贴 |
|
|
|
|
|
|
|
楼主 |
发表于 28-3-2009 11:10 PM
|
显示全部楼层
謝謝各位的支持,大家都太客氣了。這討論區高手如雲,
我只是因為工作的領域正好是嵌入式系統產品,所以把我知道的跟各位分享一下。
有件事必須要特別說明的是,製作的方法其實有很多種,但為了讓嵌入式初學者在學習嵌入式系統之前先了解一個嵌入式作業系統的大概組成,所以我選擇介紹最麻煩,最土法練鋼的方法。做出來的USB Linux也不像Knoppix那樣有很炫的GUI,只有死板板的文字界面。但我相信以學習的角度來看,這樣的作法比較有學習的價值。若各位有興趣,甚至可以玩Linux From Scratch
http://www.linuxfromscratch.org/
|
|
|
|
|
|
|
|
发表于 29-3-2009 01:07 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 29-3-2009 02:52 PM
|
显示全部楼层
回复 9# atchek 的帖子
atchek兄您好,
不太了解您的意思? 您是想了解現在BIOS都佔用多少的大小嗎? |
|
|
|
|
|
|
|
发表于 29-3-2009 03:04 PM
|
显示全部楼层
回复 10# 詩魂 的帖子
只是想知道,可不可以把KERNEL 放在BIOS 里而已。 |
|
|
|
|
|
|
|
楼主 |
发表于 29-3-2009 03:09 PM
|
显示全部楼层
回复 11# atchek 的帖子
您是想把Kernel燒到放BIOS的ROM裡面嗎??
為什麼想這麼做呢?
這樣您以後更新kernel,都要燒到ROM裡面欸 |
|
|
|
|
|
|
|
发表于 29-3-2009 03:16 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 29-3-2009 03:23 PM
|
显示全部楼层
回复 13# atchek 的帖子
可以的。但用軟件更新的方式應該是對BIOS自我更新吧,
kernel要燒到BIOS一起應該還是要用特定的燒錄器了。
除非您要改寫BIOS CODE,這我不確定是否可行,因為我不是BIOS engineer
有機會我幫您問看看BIOS engineer |
|
|
|
|
|
|
|
发表于 29-3-2009 05:09 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 29-3-2009 06:07 PM
|
显示全部楼层
回复 15# lipsin 的帖子
以前看过有人把一下DOS的UTLITY 放在BIOS里, 和现有的BIOS 共存。
不懂LINUX 有没有这些东东。 |
|
|
|
|
|
|
|
发表于 30-3-2009 01:46 PM
|
显示全部楼层
原帖由 atchek 于 29-3-2009 06:07 PM 发表
以前看过有人把一下DOS的UTLITY 放在BIOS里, 和现有的BIOS 共存。
不懂LINUX 有没有这些东东。
hi atchek大大,我最近有看关于coreboot(LinuxBios)的资料,在youtube里看到video是有人把linux kernel和x server放进一个2MB的rom里,bootup speed还蛮快的,有兴趣想搞下coreboot,但是最好是bios是可以拆出来的(DIP package), 因为可以把bios rom放进pci lan card(有extra slot放ic的那一种),然后用uniflash来flash |
|
|
|
|
|
|
|
发表于 30-3-2009 07:22 PM
|
显示全部楼层
我看过很多 COREBOOT 和 LINUXBIOS
但这里有没有人玩过?
我的IDEA 是想看看把KERNEL 放在BIOS 里 然后直接BOOT 会不会比较快 |
|
|
|
|
|
|
|
发表于 3-4-2009 02:45 PM
|
显示全部楼层
刚刚想起来, 为何我会有要不KERNEL 放在BIOS 的原因
其实我是要用WIRELESS 进行NETWORK BOOT |
|
|
|
|
|
|
|
楼主 |
发表于 5-4-2009 10:02 AM
|
显示全部楼层
回复 18# atchek 的帖子
如果BIOSLINUX能做到,那就太好了,應該可以滿足您的想法。
如果沒有相關的工具幫忙,那會很麻煩。我們先來了解一下Linux是怎麼被開起來的。
以PC做說明,當系統供電以後,CPU會到特定的位址找到BIOS,這特定的位址為FFFF:0000 (ROM中),然後執行BIOS,借由BIOS的指令集來完成開機時所需要的程序,例如POST,對系統內的硬體設備進行監測和連接,把測試後的資料存放到BIOS資料區,以便作業系統在啟動時或啟動後使用,當然還有一個很重要的就是,BIOS要找到作業系統的Boot Loader,找到bootsector完成載入作業系統,並執行剩下的開機程序。
因此BIOS也要從使用者設定的開機媒介,例如硬碟,軟碟,USB,CDROM 等選擇要載入的作業系統。以硬碟為例,BIOS要在MBR (Master Boot Record) 找到該作業系統的bootsector (例如早期Linux的Bootsect.S,後來的LILO, Grub),把它載入到記憶體的特定位址後 (通常是0x00007c00),就把執行權交給bootsect.s。
bootsect.s通常會把自己載到另一個位置,這時bootsector會做很多事情(暫不贅述),其中最重要的就是載入Linux Kernel。之後再呼叫Setup.S,讓setup.s去完成其他的開機程序,包括一些硬體的初始化。當然還有幾支assembly code要執行,例如head.s,這裡就不一一贅述了。
假設您要把kernel放在rom裡,您要修改的是BIOS的code,讓BIOS找到bootsector或kernel。以便最終能把kernel載到記憶體。
您可以修改BIOS,把Linux負責的幾支assembly所做的事都做在BIOS裡,或者只讓BIOS找到放在ROM裡的bootsect.s (這時您應該不會想用Grub吧),然後修改bootsect.s。
這是很有趣的任務,希望您順利完成後,能把心得分享給大家 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|