foxlin 寫:目前我想要在我手邊的一套S3C2410進行與HOST PC作NFS(NETWORK FILESYSTEM)應用,可是有下列問題,不知是否有人遭遇過?!
系統描述:
1. 開發版 S3C2410 已裝載Bootload 、Linux Kernel 2.4.18 與 一套內建Filesystem
2.在個人電腦端Host PC : 使用WinXP並安裝VMWare5.0並已經可以利用Samba在兩作業平台傳遞資料
( 就是Linux編譯完的核心程式可以透過Samba Server傳遞到Winxp進行Kernel燒錄動作)
3.最終目的:當目標版S3C2410完成開機後,我在HOST PC端利用 NFS Mount將 Host PC內資料Mount
到目標版上
針對上述目標,我嘗試下列操作步驟:
1.在Host PC內VMWare的LINUX環境下,我修改了 /etc/exports內容為 /mnt/nfs *(rw,sync,no_root,squash)。並執行了 service portmap start(開啟Host PC的RPC)與執行 service nfs restart(並且開啟NFS Server)
2.在Host PC端我修改所在IP位址為 192.168.71.150 === 同時也修改我目標版 IP為192.168.71.100
3.在Host PC端Ping 目標版有獲得回應,且在目標版Ping Host PC也有回應
4.在Host PC端我執行 mount 192.168.71.100:/ /mnt/nfs (想要將目標版的root mount到Host PC下的/mnt/nfs目錄下)
5.結果等待一段時間後,Host PC端顯示 RPC呼叫路徑錯誤......
請問我哪裡做錯嗎?還是有哪一觀念錯誤呢?
試了幾天總算有點成果,分享請您們參考一下!關於如何mount NFS,我想只要會編輯busybox文件,其他應該沒有太大問題
掛入自製的文件檔案系統(File System)
Editor by Fox Lin
一、實驗目的:
利用Busybox建構出一個自訂的Root File System(rootfs)
二、系統環境描述:
A. IBM PC / 60GB DISK / 1G RAM / Etherner card *3 / cross RJ45 cable
B. DMA-2410學習套件 --- 以下簡稱Target Board
B. 在 WinXP下安裝 VMware 5.0 + RedHat 9.0,並建立Samba Service,利用其來作檔案交換。
(RedHat9.0環境負責核心與軟體編譯、WinXP下負責與Target Board燒錄與監視)
三、軟體版本:
A. Linux Kernel 2.4.20.8
B. Arm-linux-toolchain gcc 3.3.2
C. Busybox – 1.2.1
四、操作步驟與設定
A. 前置作業:
請先至
http://www.busybox.net/downloads/ 下載適合自己系統的busybox版本
所謂適合是指 (a)Busybox內有提供自己想要的文件系統 (b)配合自己編譯環境的版本
如cross-2.95.3就不能與 Busybox-1.00-pre10來交叉編譯(至少我試出來是這樣的結果)
B. 安裝 cross-3.3.2 => /usr/local/arm/3.3.2 並在 /etc/bashrc內加入
export PATH=/usr/local/arm/3.3.2/bin:$PATH 已便讓系統在每次開機都會指向我們想要的預設 cross-compiler
安裝Busybox 1.2.1 => /usr/src/busybox-1.2.1
C.開始建立基本文件系統
(a)在製作文件系統時,有一項請注意。因為FHS對Linux的目錄具有一些規範設定,建議需參
考之
(b)在 root下建立一個 bootcd目錄
root@localhost /> mkdir bootcd
(c) 在bootcd下建立 ramdisk
root@localhost bootcd> mkdir ramdisk (Target board根目錄)
(d)在ramdisk內建立Target Board內的根目錄文件系統 (root filesystem)
root@localhost ramdisk > mkdir bin/ dev/ etc/ mnt/ proc/ sbin/ usr/ lib/
另外還有二個必要的目錄:/var 與 /tmp,由於這二個目錄都需要具備寫入權限,所以在這裡我們是以 ramdisk 的做法來 mount 這二個目錄。
root@localhost ramdisk > cd dev //進入dev目錄
root@localhost ramdisk > mknod console c 5 1
root@localhost ramdisk > mknod fb0 c 29 0
root@localhost ramdisk > mknod null c 1 3
root@localhost ramdisk > mknod ram0 b 1 0
root@localhost ramdisk > mknod tty c 5 0
root@localhost ramdisk > mknod tty0 c 4 0
(e)製作根文件開機設定
(i) 請先到 busybox 1.2.1目錄下 編輯 init/init.c
Busybox1.2.1 > vi init/init.c
#define INITTAB “/etc/inittab”
#ifndef INIT_SCRIPT
#define INIT_SCRIPT “/etc/init.d/rcS” =>改為“/etc/rc.d/rc.init”
(設定當Kernel mount root filesystem時,首先執行的script)
#endif
(ii) 設定開機檔 /etc/fstab 、 /etc/inittab
etc/fstab內容如下:
/dev/ram0 / ext2 defaults 1 1
none /proc proc defaults 0 0
/dev/ram1 /tmp ramfs defaults 0 0
/dev/ram2 /var ramfs defaults 0 0
fstab 第一行設定,目的在將 /dev/ram0 重新附掛成 ‘/’(root),此動作用意在於重新指定 ‘/’ 的檔案系統為 ext2。最後二行的目的是為了以 ramfs 來 mount 重要的二個目錄:/var 與 /tmp;如此一來,就算開機沒做 remount root(詳見後文說明),也能對 /tmp 與 /var 目錄做寫入的動作
etc/inittab內容如下:
:0:sysinit:/etc/rc.d/rc.init
:0:respawn:/bin/ash
根據這個 inittab 設定,當系統開機後便會進入 run level 0,在 run level 0 模式下,init process會執行2個動作:(1) 執行 /etc/rc.d/rc.init,此即「init script」;(2) 執行 /bin/sh,即進入 shell 模式。 在此我們並沒有參照 LSB 的標準來設定 run level,而且也沒有使用 getty 來讓使用者登入(多使用者模式)。
根據 inittab 的設定,我們 root filesystem 的 init script 位於 /etc/rc.d/rc.init。以下提供一個供 Embedded Linux 使用的 init script 範本:
#!/bin/ash <<<<<<<<<<<<<<<<<<<<<<<<<<配合busybox所選的shell環境設定
# automount (/etc/fstab)
mount -a
# remount root
mount -o remount rw /
#
mkdir /var/lock
mkdir /var/lock/subsys
mkdir /var/run
# start other applications (Running application automatically during
# booting up.
# eg. /bin/thttpd –p 80 –d /var/www
當我們執行「mount –a」後,mount 便會去讀取前一步驟所設定的 fstab,並根據此表格的內容來做 mount 的動作。另外,這裡有一個 remount 的動作:
# mount -o remount rw /
此動作的目的是將 root(’/’)重新 mount 成可讀寫,此動作是選擇性的,若省略不做,請務必保持 /var 與 /tmp 目錄是能寫入的(建議以 ramdisk 方式實作為佳)。
若 root filesystem 未包含 inittab 設定檔,則 Busybox 會使用以下的內建設定:
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
不過,還是建議編寫自己的 inittab 設定檔。
(iii) 製作busybox文件
在Build Options裏面
Build busybox as a staic binary (no shared libs) =>select
Build shared libbusybox =>select
Do you want to build BusyBox with a Cross Compiler =>select
填寫/usr/local/arm/3.3.2/bin/arm-linux-
Shells >
Choose your default shell (ash) >
(X) ash 選中ash,這樣生成的時候才會生成bin/ash檔
註一:請注意,init 與 shell 是必選的項目,請檢查是否有勾選這二個功能。
註二:此外我們最終目的是要 root filesystem能夠支援NFS,以便讓我們能自由在Host端
添加Driver或是filesystem,所以 在 Networking Utilities中的 ipconfig、ping文件與 Linux
System Utilities中的mount / umount 針對NFS選項也請勾選
選定後開始編譯busybox
make TARGET_ARCH=arm all
make instll (將在_INSTLL生成 bin,sbin兩個檔夾和一個linuxrc檔)
將上述_install內的 /bin /sbin linuxrc三個檔案複製到 bootcd/ramdisk/
(iv) copy cross-3.3.2/lib到 root filesystem/lib下
• libc.so.6:C library標準程式庫。
• ld-linux.so.2:Native dynamic loader。
cp –a /usr/local/arm/3.3.2/lib/libc.so* /bootcd/ramdisk/lib
cp –a /usr/local/arm/3.3.2/lib/ ld-linux.so* /bootcd/ramdisk/lib
P.S.請注意檔案連結,是否有何檔案沒有一起拷貝至 ramdisk/lib
(v) 將 ramdisk製作成 cramfs
mkcramfs ramdisk xxxx.cramfs