Monday, November 19, 2007

KB9202B - 使用遠端 Linux 核心及根檔案系統

最近猛 K "建構嵌入式 Linux 系統" 這本書,慢慢對整個嵌入式 Linux 的架構有了更深一層的了解。這本書是我大約在2~3年前就買的,當時就想學習嵌入式系統,但是一直苦無機會。這本書出版的時候,Linux 的核心還是 2.4 版,但是書中的資訊一直到現在仍是相當的有用。

我在前一文中有提到,在 KB9202B 的相關文件中只教怎麼編 Kernel ,沒教怎麼安裝。而事實上,在嵌入式系統的開發階段,為了節省檔案傳輸的麻煩,是可以不需要將核心甚至是根檔案系統安裝到目標板上,而是將目標板設定成 - "直接使用遠端主機上的 Linux 核心及根檔案系統"。要做這樣子的設定,主要是要修改2個地方,一個是目標板上 U-Boot 的設定,一個是主機上,要讓目標板遠端掛載的根檔案系統。

note: 下面的操作前,必須先編譯好核心,並在主機端建立根檔案系統。同時並假設核心的放置目錄為 /tftpboot,檔名為 uImage,根檔案系統的目錄為 /usr/local/arm/target_fs 。目標板的 ip 是 192.168.11.3 ,主機的 ip 是 192.168.11.2 ,gateway ip 是 192.168.11.1 。

1. 主機端的網路配置

a. tftp 伺服器的安裝及設定

我是使用 Ubuntu/Linux 為主機,因此直接使用 apt 安裝 tftp 及 tftpd 兩個套件。
sudo apt-get install tftp tftpd openbsd-inetd
接著開啟 /etc/inetd.conf 檔,並加入以下這行︰
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot
其中 /tftpboot 就是放置編好的核心的地方,這個路徑是可以改的。

b. NFS 伺服器的安裝及設定

使用 apt 安裝 nfs-kernel-server 這個套件︰
sudo apt-get install nfs-kernel-server
開啟 /etc/exports 這個檔案,並加入以下這行︰
/usr/local/arm/target_fs 192.168.11.11/32(rw,no_root_squash)
其中 192.168.11.11 是我的目標板使用的 ip ,這行是指定,從 192.168.11.11 連線過來的 NFS 存取,具有讀寫的權限,同時 no_root_squash 這個引數讓目標板可以用其 root 權限來存取目錄。這個引數如果沒有設定,則在目標板掛載了之後,所有的寫入操作都無效。

2. 根檔案系統的修改
buildroot 預設建立在的根檔案系統,似乎無法直接使用 nfs 掛載,必須要在幾個地方做修改︰

a. 將 /usr/local/arm/target_fs/etc/init.d/目錄下的 S40network 改成 s40network ,即開機時不執行此 script 。

b. 修改 /usr/local/arm/target_fs/etc/network/interfaces ,加入如下關於 eth0 的描述,以開啟網路服務︰
auto eth0
iface eth0 inet static
address 192.168.11.3
netmask 255.255.255.0
gateway 192.168.11.1
c. 修改 /usr/local/arm/target_fs/etc/inittab ,將以下這行前面的 # 刪掉,這樣才可以在開機後,仍然可以經由 Serial port 來接收資訊︰
#ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100
d. buildroot 並沒有正確建立 dev 下的節點,必須手動以 root 身份使用 mknod 建立。有哪些節點需要建立,可參考 buildroot 的 target/generic/device_table.txt 。建立單一節點的方式如下(必須使用super user)︰
mknod -m 0666 console c 5 1
我寫了一個 script ,在 dev 目錄下以 root 執行,可直接建立 device_table.txt 指定的所有節點,執行此檔案前必須先清空 dev 目錄。建立後可再使用 chown 修改擁有者。

e. 修改根檔案系統的 /etc/fstab 檔設定
修改 /usr/local/arm/target_fs/etc/fstab 這個檔案。將原本存在 fstab 中的下面這行前面加個 # 號。
#/dev/root / ext2 rw,noauto 0 1
這使的核心載入後,可以直接使用遠端的根檔案系統。

4. 修改 U-Boot 的設定

a. 在目標板開機倒數時,按下任意鍵進入 U-Boot 的設定程式。
b. 設定 target 及 host 的網路設定(依不同網路而異)︰
U-Boot> setenv ip 192.168.11.3
U-Boot> setenv serverip 192.168.11.2
U-Boot> setenv netmask 255.255.255.0
U-Boot> setenv gatewayip 192.168.11.1
c. 設定 bootp 要從 tftp 抓取的 kernel 影像檔名稱
U-Boot> setenv bootfile uImage
d. 指定核心下載的位置及根檔案系統位於 host 上的路徑
U-Boot> setenv kernel_addr 2000d000
U-Boot> setenv rootpath /usr/local/arm/target_fs
e. 設定開機命令稿
U-Boot> setenv bootpnfs bootp \$(kernel_addr)\; setenv bootargs console=ttyS0,115200n8 root=/dev/nfs rw nfsroot=\$(serverip):\$(rootpath) ip=\$(ipaddr):\$(serverip):\$(gatewayip):\$(netmask):::off panic=1\; bootm \$(kernel_addr)
f. 儲存及開機
U-Boot>saveenv
U-Boot>run bootpnfs

9 comments:

oldhan said...

你是女生嗎? 玩嵌入式 Linux 這麼精, 會不會有點超過.. 哈哈!

Chinson said...

當然不是,我看起來像女生嗎=.=

鞋姐 said...

我是女生 這會很超過嗎
網路沙豬.....

原來肉鬆你算娘的男生
哈哈哈~~~
我看人家是看上你們家阿娃了

Chinson said...

呵呵,我想也是。我在flickr上放阿哇的相片,也有人誤會...

oldhan said...

抱歉誤會了, 因為對 嵌入式 Linux 有興趣, 想拜道行高的人為師, 找女生會比較有趣一點.
是, 我是豬, 但不是沙豬. (把小男人當沙豬是一種侮辱. 哈 !)

Chinson said...

Hi,
我個人並沒有刻意要責怪你的意思,
但是 "你是女生嗎? 玩嵌入式 Linux 這麼精, 會不會有點超過" 這麼一句話,
對從事這個領域的女性工作者而言,就算是一種侮辱了。
網路上因為大家都是匿名的,有人會覺得開開玩笑無傷大雅,
但是卻因為看不到對方,不謹慎的言論是很容易引起誤會的。
再者,像這樣的一句玩笑話,如果用不同的方式來講,或許真的能讓人會心一笑,所以在開玩笑的同時,還是應該要思考一下。

鞋姐 said...

謝謝chinson對這個領域女性工作者的仗義直言
這裏是你的blog 我其實不應該再多說什麼
只是 我還是想建議這位朋友
如果你真的想找這個領域的女性專家討論
那這種口氣只會讓人反感
是絕對不可能達到"有趣"的效果的
也許 完全排除性別的考量來互相討論
才可能得到最完整的知識

我的發言到此為止 chinson覺得不適合可以刪掉
^___^

oldhan said...

兩位工程師 take easy, 我無惡意.
bye..

Chante said...

This is gorgeous!