摘要: Thursday, 22. December 2005, 08:17 在kernel source的Document中就有一篇nfsroot.txt。照着里面作就可以。 因为nfsroot是要mount nfs上的path作为root,所以在此之前,他的roo...
Thursday, 22. December 2005, 08:17 在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 argument