2009/11/2

DOM 的製作 FOR LINUX

 
http://www.kimo.club.tw/rewrite.php/read-81.html

作為嵌入式系統,使用環境通常都比較惡劣,而應用又比較簡單。為系統的穩定通常都需要使用DOM、CF卡一類的存儲設備來代替硬碟。因此需要製作一個小於32M的linux運行系統。
使用到的軟體包括:syslinux, busybox, linux kernel 2.4.18, redhat 9
 作為嵌入式系統,使用環境通常都比較惡劣,而應用又比較簡單。為系統的穩定通常都需要使用DOM、CF卡一類的存儲設備來代替硬碟。因此需要製作一個小於32M的linux運行系統。
一、準備軟體環境
1.一套linux的運行環境,選用redhat 9的基本安裝,需要能夠編譯內核方便以後重新編譯內核;
2.bootloader軟體,選用syslinux中的extlinux;
http://syslinux.zytor.com
3.主要系統應用程式,選用busybox;
busybox能夠以一個小型的應用程式提供整個命令集的功能。
http://www.busybox.net


二、製作可以啟動的盤

fdisk /dev/hdc1
本實驗使用cf盤 cf to ide轉換卡,用fdisk對盤進行分區,但這一步驟需要確認哪一個設備是cf卡。這個可以同dmesg來看。

mke2fs /dev/hdc1
格式化cf盤為ext2格式

mkdir /mnt/cf
mount /dev/hdc1 /mnt/cf
extlinux /mnt/cf
安裝bootloader到cf卡上。

完成以後cf卡基本可以引導,現在進行一次重啟動測試一下。
實驗結果,只需要看到Extlinux 的資訊即說明安裝成功。

三、安裝內核和配置引導
由於目前只是實驗先不進行內核裁減,直接使用redhat 9的內核檔。
mount /dev/hdc1 /mnt/cf
cp /boot/vmlinuz-version /mnt/cf/
cp /boot/initrd-version.img /mnt/cf/

vi /mnt/cf/extlinux.conf
寫入一下內容:
default emblinux
display logo.txt
label emblinux
kernel vmlinuz
append root=/dev/hdc1 initrd=initrd.img splash=silent ide=nodma

首先要注意的檔案名為extlinux.conf,因為在syslinux和isolinux中都是使用.cfg的尾碼,這樣可能會給人一個錯覺認為也是用.cfg。結果,我在這個地方花了不少的時間,終於找到一個帖子提到使用extlinux.conf。
另外增加ide=nodma只適用在使用cf卡的情況,這個可以避免啟動時因為讀盤超時而無法繼續的錯誤(0x58)。

完成這些步驟,內核就能引導。
這一步完成,重啟能看到內核引導資訊即為成功。
四、安裝主要應用程式和運行環境
mount /dev/hdc1 /mnt/cf

創建需要的目錄
cd /mnt/cf
mkdir etc bin sbin var usr lib tmp proc initrd dev

根據busybox的說明編譯,然後安裝。
make PREFIX=/mnt/cf install

複製基本的dev文件
cp -arf /dev/* /mnt/cf/dev/
需要進行一些裁減,否則會超過限制大小。

複製busybox下的examples/bootfloppy/etc目錄下檔
cp -arf examples/bootfloopy/etc/* /mnt/cf/etc

編輯init.d/rcS文件
vi /mnt/cf/etc/init.d/rcS
增加
/bin/sh

複製lib
先用ldd busybox看需要哪些so
把相應的so複製到lib目錄下,這一步比較關鍵。
複製/lib/modules和/lib/security目錄到/mnt/cf/lib目錄下,並進行一些裁減。
完成這最後一步,整個啟動盤已經可以正常啟動,並進入shell下。
 from http://www.linuxjiaocheng.com/




******************************************************************************************************


DOM製作流程
專案基本結束,這個是其中系統裁減的一個總結文檔,不知道有沒有人感興趣:)

=============================================

前言:
為了完成用戶的需求,需製作一個完整的環境供AP運行,且存在一些約束條件。

關鍵字:
DOM Kernel Busybox X-Window Window-Manager Interbase nvidia cutdown

目標說明:
在一個64M的DOM(Disk on module)上建立可以運行完整的AP的環境

約束條件:
1、可利用的總空間為64M,由DOM提供,但實際可用空間只有53-59M,原因可能與設備檔和DOM本身有關,未確定
2、顯卡為nvidia系列
3、kernel選用2.4.20,沒有使用redhat自帶的版本。採集卡的Driver目前還只能在2.4.20的kernel下編譯,由於其移植性較差,已經開始考慮重新整理成可適合kernelversion大於2.4.25的所有kernel,參考bttv的最新實現
4、資料庫選用interbase系列,目前使用的為firebird-1.5(firebird為interbase的開源實現,介面和interbase基本相同)。
5、其他附屬的功能要求,在後面的文檔中會有說明

製作流程:
某些部分的原理和實現沒有辦法寫的很全面,但基本上會提供一些url的連接,供相關人員參考。基本上按照製作流程來寫,前後相互牽連的部分不做特別說明。

一、Kernel的選擇和編譯:
由於driver的緣故,只能使用2.4.20的kernel。2.4.20和2.4.25都有對Driver做過嘗試,其他版本的kernel沒有試過,應該是可以的,尚未確認。在2.6的kernel上無法編譯,目前確定的原因是makefile有問題,估計做一些相應的修改還是可以的,可參考bttv的makefile(http://linux.bytesex.org/v4l2/bttv.html)。
回到kernel上來,基本上的編譯原則是儘量減去不需要的部分,以及除了一些需要臨時載入的Driver儘量不要出現module。由於上面所說的理由,DOM中使用的kernel為原始的2.4.20,可以從http://www.kernel.org下載,本文檔的附加檔裏也可以找到。
另外,由於需求的定義,系統啟動時需要顯示splash畫面,所以kernel還需要加入bootsplash功能,這個功能是第三方提供的,作為補丁加入kernel。作法如下:

1、打內核補丁並編譯內核
假設內核原始檔案安裝在/usr/src/linux/。下載bootsplash 3.07(地址:ftp://ftp.suse.com),然後:

yourbox:~ # cd /usr/src/linux
yourbox:/usr/src/linux # patch -p1 < /path/to/bootsplash-3.0.7-2.4.20-vanilla.diff
yourbox:/usr/src/linux #

配置內核,如make menuconfig或make xconfig,在"Console drivers" -> "Frame-Buffer support" 選擇 "VESA VGA graphics console" 或其他與你的顯卡相應的驅動。打開 "Use splash screen instead of boot logo". 在 "Block Devices"中打開"Initial Ramdisk support",保存配置並編譯內核,將生成的內核拷到/boot 下,並修改lilo或grub的配置檔以使用新的內核來啟動。

2、加入圖片
下載並安裝splash工具:ftp://ftp.suse.com/pub/people/

# cd ~/splash
# tar xvjf splashutils.tar.bz2
splashutils/
splashutils/Makefile
splashutils/splash.c
[..]
splashutils/ChangeLog
splashutils/COPYING
# cd splashutils
# make splash
gcc -Os -Wall -c -o splash.o splash.c gcc -Os -Wall -o splash splash.o
strip splash
# cp splash /sbin/
# cd ..

將圖片及相關的資訊加入到initrd中去:
/sbin/splash -s -f /etc/bootsplash/themes/yourtheme/config/bootsplash-1024x768.cfg >> /boot/initrd.splash

圖片在附件檔中

3、運行lilo更新配置檔(grub就不用更新了),重新啟動,如果一切正常,就可以看到啟動畫面了。同時會有這樣一些資訊:

vesafb: framebuffer at 0xf0000000, mapped to 0xdc816000, size 65472k vesafb: mode is 1024x768x16, linelength=2048, pages=41 vesafb: protected mode interface info at c000:5137 vesafb: scrolling: redraw
vesafb: directcolor: size=0:5:6:5, shift=0:11:5:0 Looking for splash picture.... silenjpeg size 11165 bytes, found (1024x768, 4912 bytes, v3) Got silent jpeg.

kernel的config檔比較大,在附件中有,這裏就不列舉了。

編譯過程:
1、獲取2.4.20的原始kernel壓縮包(linux-2.4.20.tar.bz2)
2、tar xvjpf linux-2.4.20.tar.bz2
3、cp config-2.4.20 (kernelsource)/.config #拷貝config-2.4.20到kernel source所在目錄中並以.config為新的檔案名
4、cd (kernelsource)
5、make menuconfig #不需要做任何改動,直接退出
6、make dep && make bzImage && make modules && make modules_install && make install
7、如果沒有問題,繼續下一步,如果有問題,請檢查編譯環境是否正確,並重複step 6
8、此時kernel已經編譯完畢,需要做兩件事情,一是保存將來放入DOM的文件,二是將當前的發行版的kernel換成2.4.20,以便後面的nvidia顯卡dirver的正確編譯。
9、創建一個保存目錄,比如~/kernelbackup
10、cp (kernelsource)/arch/i386/boot/bzImage ~/kernelbackup # 保存kernel
11、cp /lib/modules/2.4.20 ~/kernelbackup/ -arf # 保存編譯出的所有modules
12、如果當前的發行版使用的是grub,則修改/boot/grub/grub.conf(如果沒有這個檔可以修改/boot/grub/menu.lst,都是一樣的),如果是lilo,修改/etc/lilo.conf。下面是grub的修改說明,lilo的修改辦法可以參考相關文檔:

# add below to your grub.conf
title new kernel(2.4.20) # title just, u can modify it anywhere
root (hd0,0) # root setup
kernel (hd0,0)/boot/bzImage-2.4.20 ro root=/dev/hda1 vga=791 splash=silent # just.....
initrd (hd0,0)/boot/initrd.splash # splash that show when booting of OS

13、reboot
14、選擇新的啟動選項,檢查是否正確

二、Shell的選擇和編譯:
到目前為止,kernel的裁減基本上結束,下面是shell的選擇和編譯。 對於linux而言,kernel只是提供系統調用介面,本身無法直接使用,需要外部shell的支援。一般shell有幾種選擇,如bash、ash、busybox等,由於busybox相對尺寸最小,而且提供了基本完整的功能,所以選擇busybox做為系統的shell。詳細資訊參閱www.busybox.net,附件中有目前使用的busybox版本。busybox的流程主要是編譯和安裝,從而聯合kernel組成一個基本系統。 busybox的配置檔在附件中有,這裏就不列舉了。

編譯過程:
和kernel基本相似
1、解壓busybox
2、複製config到busybox源碼目錄下
3、make menuconfig #不做改動即可退出
4、make dep && make

三、基本系統的安裝:
到此時,busybox和kernel都已經準備完畢,接下來需要一個分區來安裝他們。 不管是使用一個單獨的分區還是完整的DOM都可以,但總歸需要一個完整的目標分區供使用。假設目標分區為/dev/hdc1,下面的說明會以此為基準。 需要說明的一點是,一開始儘量不要用DOM直接調試,因為其速度和容量都十分的不好,會造成調試的困難,直到調試後期再使用是個比較不錯的主意。

現在進入基本系統的組裝:
# fdisk /dev/hdc1 and format it with ext2 or ext3. My suggest is ext3.
Mount /dev/hdc1 /mnt/dom # mount目標分區
mkdir /mnt/dom/boot
mkdir /mnt/dom/boot/grub
cp (kernelbackup)/bzImage /mnt/dom/boot # copy kernel to dom
cp (kernelbackup)/initrd.splash /mnt/dom/boot # copy initrd splash to dom
mkdir /mnt/dom/lib
mkdir /mnt/dom/lib/modules
cp (kernelbackup)/2.4.20 /mnt/dom/lib/modules -arf # copy all modules to dom cd (busyboxpath)
make PREFIX=/mnt/dom install # install busybox to dom
現在,一個基本系統基本安裝完畢,接下來是配置問題:
mkdir /mnt/dom/etc # all config here
mkdir /mnt/dom/dev # device file
mkdir /mnt/dom/mnt
mkdir /mnt/dom/proc
mkdir /mnt/dom/tmp
mkdir /mnt/dom/var
mkdir /mnt/dom/lib
mkdir /mnt/dom/root # home of root
mkdir /mnt/dom/usr # X window-manager lib, etc
cp (busyboxpath)/examples/bootfloppy/etc/* /mnt/dom/etc -arf # base config
cp /dev/* /mnt/dom/dev -arf # device file. Will cutdown part of all

下面是加入必需的連接庫:
1、ldd busybox
2、查看busybox使用了哪些連接庫,拷貝至目標分區中同樣的路徑下,一般為/lib
3、再用ldd查看連接庫是否還有需要的庫檔,如果有同樣拷貝到目標分區中
4、重複第三步
5、cp /dev/* /mnt/dom/dev/ -arf # 後期還會做一些裁減
Grub配置:
# add below to your grub.conf
title new kernel(2.4.20) # title just, u can modify it anywhere
root (hd0,0) # root setup
kernel (hd0,0)/boot/bzImage-2.4.20 ro root=/dev/hda1 vga=791 splash=silent # just.....
initrd (hd0,0)/boot/initrd.splash # splash that show when booting of OS

現在可以做一些測試,看看基本系統是否工作正常。執行下麵的命令
cd /mnt
mkdir dom
mount /dev/hdc1 dom # mount it
chroot /mnt/dom /bin/sh
如果你看到登陸成功的資訊就表示基本系統沒有什麼問題了。

重新啟動機器,並選擇新的啟動選項,看看基本系統是否正常,如果有問題,重新檢查前面的步驟是否做的有問題。如果啟動正常,那麼,基本系統就基本完備,可以繼續後面的步驟了。

四、Xfree86的裁減和安裝:
基本系統已經正常工作,接下來就是xfree86的裁減和安裝,首先切換到目標分區並確定系統處於正常工作狀態。
在這裏需要說明一下Linux的目錄分佈和作用情況。首先通過"ls /"列舉一下根分區,大致會有以下目錄:
bin boot dev etc home lib mnt opt proc root sbin tmp usr var
下面逐一說明:
bin: shell的工作目錄,比如sh、bash、mount等命令
boot: kernel、ramdisk檔以及grub(lilo)的存放目錄,有的發行版會為此目錄單獨創建一個分區,以防止系統崩潰的影響。在DOM中是不考慮的。
dev: 所有的設備檔都存放在這裏,比如/dev/video0、/dev/hda等。全部設備檔大概要佔用400K左右的空間,但似乎全部拷貝過來的話,DOM總是會報空間不足,但實際還是有空間的,原因不明。目前的做法是對設備檔做了一些調整,去除了不需要的部分,參考後面的檔列表。
etc: Ap配置以及系統配置存放目錄
home:普通用戶的工作目錄根
lib:基本庫存放目錄
mnt:mount
opt:看情形,目前是用做存放firebird
proc:系統工作所需的目錄
root:一般為root的工作目錄,可以調換
sbin:常規命令存放目錄
tmp:一般為臨時目錄
usr:所有擴展命令和xfree86,以及window-manager所在目錄,是系統最大的一個目錄,包含內容最多。對於DOM來說,主要是存放連接庫、xfree86、字體、window-manager等。
Var:臨時目錄,一般在發行版中為存放website檔、安裝檔以及一些log資訊等,在DOM中只作為臨時目錄使用

大致的分佈情況說明完畢,接下來就是具體的裁減工作了。 實際上,xfree86有一些替代實現,比如freedesktop、fb等,甚至framebuffer也是一個可以考慮的方向,但是由於AP使用了nvidia顯卡提供的opengl 1.3介面,導致目前的唯一選擇就是xfree86。也許有其他更小的實現,希望能在以後改進。 進入正題,xfree86的主程序實際上就是一個XFree86,位於/usr/X11R6/bin,有的發行版下X是一個指向XFree86的連接,有的卻是一個完整的程式,但不管怎麼樣,Xfree86就是最主要的程式。現在,在目標分區上mount發行版,以便可以拷貝我們所需要的:
cd /mnt
mkdir dist # create mount path of distribute
mount /dev/hda1 dist # /dev/hda1 is root partition of your distribute. Check it.
現在/mnt/dist就是發行版所在的位置。

mkdir /usr/X11R6
mkdir /usr/X11R6/bin
mkdir /usr/lib
mkdir /usr/X11R6/lib
創建一些需要的目錄。

cp /mnt/dist/usr/X11R6/bin/XFree86 /usr/X11R6/bin -arf 拷貝xfree86的主程序。
cp /mnt/dist/usr/bin/ldd /sbin # copy ldd that is used to cutdown
ldd是用來在DOM的環境中做裁減工作的,直接輸入ldd看看是否可以運行,如果執行有問題,一般是相關的連接庫不全,按照之前的方法複製過來就可以了。

現在,要查看XFree86需要哪些連接庫和配置檔,以保證其可以運行起來。
cd /usr/X11R6/bin
ldd Xfree86
此時會看到很多的連接庫,那麼就需要把這些庫全部從發行版上複製過來,可以直接複製到相對應的目錄下,比如/usr/lib/或者/usr/X11R6/lib/下,需要注意的一點是,有些庫本身還會需要其他的庫,可以一層層的ldd出來,網路中有人做過自動工作的工具,但還是手動裁減比較可靠。全部的庫導入完畢後,嘗試運行/usr/X11R6/bin/XFree86,會看到一些出錯資訊,提示/etc/X11/XF86Config不存在,那麼就將發行版中的/etc/X11目錄全部複製到目標分區中:
cp /mnt/dist/etc/X11 /etc -arf
實際上這個目錄中不是全部都需要的,某些部分是可以刪除的,但我沒有具體實驗,而且尺寸並不是很大,就全部使用了。
現在再執行/usr/X11R6/bin/XFree86,會提示一些庫沒有找到,但實際上之前已經全部複製過來了,原因是從shell執行一條命令的時候,命令所需要的庫是從以下的途徑得到的:
1、搜索/lib
2、搜索/etc/ld.so.cache
之前所複製的庫檔大半是放在/usr/lib和/usr/X11R6/lib下的,而且現在的/etc下還沒有ld.so.cache檔,要生成這個檔就需要ldconfig這個命令:
cp /mnt/dist/sbin/ldconfig /sbin -arf
現在ldconfig是有了,但還需要與之有關的配置檔/etc/ld.so.conf,所以:
vi /etc/ld.so.conf
/usr/lib
/usr/X11R6/lib
現在執行ldconfig,就會在/etc/下出現一個ld.so.cache。以後如果有新加入的庫檔,而且不是存放在/lib/下的,都按照這個步驟來導入。現在,執行/usr/X11R6/bin/XFree86,出現的錯誤提示為無法打開/var/kdb和/var/log。
這裏需要說明配置上的一個修改,cat /etc/fstab,會看到現在的fstab只有一句話:
none /proc proc defaults 0 0
現在要加入一些新的配置,新的fstab如下:
proc /proc proc defaults 0 0
none /var tmpfs defaults 0 0
none /tmp tmpfs defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /data tmpfs defaults 0 0
現在/var、/tmp和/data都是在記憶體中了,其中/data是將來mount磁片的地方,需要手動mkdir出來:
mkdir /data
現在修改/etc/init.d/rcS:
#! /bin/sh

/bin/mount -a

mkdir /var/log
mkdir /var/lib
mkdir /var/lib/xkb

重啟DOM,現在應該存在/var/log、/var/lib、/var/xkb目錄了,當然這些目錄只是存放在記憶體中,所以需要每次啟動時臨時創建。
再運行XFree86,應該會看到一個錯誤的提示,說明還需要opengl的一些連接庫,從發行版中複製出來就可以了。
嘗試在目標分區中執行/usr/X11R6/bin/XFree86,如果沒有進入X介面,需要檢查之前的步驟是否有沒有做對的地方。

五、Window-Manager的選擇安裝:
到目前為止,X已經完全移植到DOM中了,但一個包含基本系統和X的系統還不能滿足AP的要求,接下來是Window-manager的選擇和安裝。
kde和gnome是無法安裝到DOM中的,尺寸太大,可能的選擇包括twm、fluxbox、windowmaker、icewm等,但需要滿足以下幾個條件:
1、有caption,而且Modal dialog不能被切到後臺,以符合用戶的操作習慣
2、X上不能有任何多餘的部分,即除了AP,不存在任何UI,如taskbar之類
3、尺寸要小
4、最好不要有system menu和system buttons

經過挑選,最終選擇了fluxbox作為DOM的window-manager,尺寸相對其他window manager要大一些(10M),但是較好的滿足了以上條件。

安裝過程:
1、下載fluxbox
2、./configure
3、make
4、make install
5、複製相關檔到DOM的相同目錄中
6、測試,如果有問題,重複第一步
等window manager安裝完畢後,一個包含基本系統和window的環境就創建成功了。接下來就是一些附屬部件的裁減和安裝了。

六、其他部件的裁減和安裝:
先切換到發行版。最後定義的資料庫引擎為Firebird 1.5,所以先下載firebird 1.5(http://prdownloads.sourceforge.net/...0-0.i686.tar.gz),然後在發行版上先安裝。firebird會安裝在/opt目錄下,將/opt/firebird複製到目標分區中:
cp /opt/firebird /mnt/dom/opt -arf

然後修改配置檔:
vi /mnt/dom/etc/init.d/rcS
#! /bin/sh

/bin/mount -a

mkdir /var/log
mkdir /var/lib
mkdir /var/lib/xkb

/opt/firebird/bin/fb_lock_mgr &
/opt/firebird/bin/fb_inet_server &

現在切換到目標分區中,會看到進程列表中有一個fb_lock_mgr,這說明firebird已經安裝成功。

由於實際的裁減過程中會遇到各種各樣的問題,有些方面牽涉太廣,以至沒有辦法單獨說明,所以接下來是一些可能會遇到的問題說明:
1、nvidia的驅動需要先在發行版上解開,再執行make && make install > install,然後修改install中的目標路徑以將相關檔安裝到DOM上,比如cp libGL.so /usr/lib改為cp libGL.so /mnt/dom/usr/lib。具體操作就不列舉了。
2、busybox的mount有問題,不能mount -o loop,所以cramfs的檔需要用發行版的mount,所以在dom的/mnt/cramfs目錄下有一個mount,而/bin也有一個mount
3、為了便於調試,在dom中加入了telnet server和ftp client,分別使用的是utelnetd和cmdftp,出處可以通過google搜索
4、grub的安裝使用grub-install即可
5、由於firebird等模組至=

3 則留言:

  1. I congratulate, this remarkable idea is necessary just by the way

    回覆刪除
  2. I know, how it is necessary to act...

    回覆刪除
  3. 版大您好:
    我現有DOM複製的問題,不知是否可向您請教?jacky0609blog@gmail.com,0985205588,謝謝!
    Jacky

    回覆刪除

最新文章