星期四, 12月 22, 2005

NFS ROOT : Linux , 使用NFS 作為rootfs

在kernel source的Document中就有一篇nfsroot.txt。照著裡面作就可以。

因為nfsroot是要mount nfs 上的path作為root,所以在此之前,他的root filesystem是不存在的。
所以nfs file system support 要build in在kernel中,不可以用 Module (.0)的方式(因為,.o 要放在那?)。
當然,網路 driver 也要內建(例如,你用rtl8192too,就要選 '*',不可以選'M')。

kernel 有mount nfs的能力後,接著就要"通知"kenel 是要用nfs 作為rootfs,並且要到那裡去mount nfs。這要靠kernel command line來完成:
告訴kernel 使用nfs作為rootfs,server path = /nfsroot:
root=/dev/nfs
設定nfs server address和path:
nfsroot=10.3.5.166:/nfsroot
設定client的 ip=10.3.5.123
nfs server=10.3.5.166
gw=10.3.4.254
netmask=255.255.252.0
hostname=""
使用eth0
不使用autoconfig來取的ip
 ip=10.3.5.123:10.3.5.166:10.3.4.254:255.255.252.0::eth0:off
這樣kernel 的動作就算ok了。
rebuild kernel, config bootloader,用這個kernel boot。

以 這個embedd system來說,他的bootloader內建romfs filesystem,會在flash中找romfs signature,並且找到romfs中的linux.bin.gz來開機,所以就要把build好的kernel.bin壓縮後,再用 genromfs 產生一個裡面只有linux.bin.gz這個檔案的romfs image,燒在flash中。讓bootloader能用這個linux image來開機。


接著就是server端,要準備好rootfs(可以使用genext2fs)。
修改nfs server的exports file
10.3.5.123   /nfsroot(rw)
重新啟動nfs server:
#/etc/init.d/nfs-kernel-server resart
OK,現在可以叫client 開機。
就可以看到client以NFS 作為 rootfs 開機成功了。
所以重點只有...
設定好kernel參數,裝備好需要的driver。
讓kernel開機。
一切就OK了。

NFS export出去的folder也可以用symbolic link
# ln -s /nfsroot  /home/develop/release1
或是
# ln -s /nfsroot /home/develop/test
這樣就可以輕易的讓linux使用不同的rootfs。
但 是要注意每次變更link後要重新啟動nfs-kernel-server才行。
我以前總覺得疑惑,mount root的動作有點雞生蛋,蛋生雞的感覺。因為/dev 是在 root 下,但是 root都還沒起來,kernel又怎麼去找 root 的 /dev 來mount 呢?
看 了init 的source code 才知道,init 的do_mounts( )裡面已經建好了 device name 對 device major/minor number的table,不需要由/dev去找。所以在/dev還沒建立好以前,kernel已經可以知道device的major/minor number是甚麼了。
知道major/minor number後,就可以到driver table中找到正確的device driver 了。
一個問題:
exports:
/nfsroot 10.3.5.123(rw)
/home/charles/sgm 10.3.5.123(rw)
但是
nfsroot--> /home/charles/sgm/root
也就是說 nfsroot實際是另一個export path的sub folder。
這樣使用nfsroot開機的機器(10.3.5.123)要mount /home/charles/sgm時會出現error :
mount: nfs warning: mount version newer than kernel
NFS: mount program didn't pass remote address!
failed, reason given by server: Permission denied
mount: nfsmount failed: Bad file descriptor
mount: Mounting 10.3.5.166:/home/charles/sigma on /tmp/sigma failed: Invalid arg
ument
...雖然從fail message中看不出原因是這個...




另一個

從configure和Makefie看來,使用nfs 作為roorfs,只有kernel boot command 有關。
(當然,kernel要build nfs file system和network driver)

沒有留言:

網誌存檔