Chinaunix首页 | 论坛 | 博客
  • 博客访问: 317377
  • 博文数量: 51
  • 博客积分: 1975
  • 博客等级: 上尉
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-17 19:07
文章分类

全部博文(51)

文章存档

2011年(8)

2010年(43)

分类: LINUX

2010-03-26 16:51:27

setenv bootargs noinitrd init=/linuxrc root=/dev/nfs nfsroot=192.168.167.162:/home/leibian/qtopia_arm/nfs ip=192.168.167.15:192.168.167.162:192.168.167.254:255.255.255.0:jk2410:eth0:off console=ttySAC0,115200 mem=64M
 
 
 
nfsroot=<NFS-server-IP-number>:/path/on/server/to/nfs_root ip=<client-IP-number>::<gateway-IP-number>:<netmask>:<client-hostname>:eth0:off
 
 

在一般的嵌入式系统开发中经常需要烧写内核文件和文件系统映像,为了保护和节省片子的烧写次数,为了方便我们开发的过程节省浪费在烧写上的时间,更多的是方便我们的开发不至于把系统上的文件搞的乱七八糟… 其实,其实当我们的内核变大,板子Flash无法容纳内核和文件系统的时候,NFSROOT是个好的解决方案。

因此想试试使用NFS ROOT:

一、内核配置:

添加内核对NFS的支持:

  1. n        Networking Options
  2. (*)TCP/IP networking
  3. (*)IP: kernel level autoconfiguration
  4. (*)IP: DHCP support
  5. (*)IP: Bootp support
  6. (*)IP: Rarp support 
  7. n        File systems
  8. l      Network File Systems
  9. (*)NFS file system support
  10. (*)Root file system on NFS

二、TFTP服务器的配置

以root用户登录,运行setup命令

#setup

选择Systme services,选择tftp;

打开tftp配置文件/etc/xinetd.d/tftp;

将server_args设定为内核映像文件所在目录,默认为/tftpboot

我的内核映像在/home/zht/sources/kernel/linux-2.4.27目录中,设定如下:

  1. service tftp
  2. {
  3.         disable                = no
  4.         socket_type        = dgram
  5.         protocol                    = udp
  6.         wait                           = yes
  7.         user                           = root
  8.         server                 = /usr/sbin/in.tftpd
  9.         server_args         = -s /home/zht/sources/kernel/linux-2.4.27
  10.         per_source         = 11
  11.         cps                            = 100 2
  12.         flags                   = IPv4
  13. }

重新启动PC linux操作系统或者运行service xinetd restart命令启动tftp服务器。

运行netstat -a | grep tftp 可以查看tftp服务器是否配置成功。

三、NFS服务器的配置

以root身份登陆Linux服务器,编辑/etc目录下的共享目录配置文件exports,指定共享目录及权限等。

执行如下命令编辑文件/etc/exports:

# vi /etc/exports

在该文件里添加如下内容:

/home/zht/rfsys 192.168.0.*(rw,sync,no_root_squash)

编辑完过后保存退出,然后运行命令exports –rav检查输入是否正确。

添加的内容表示:允许ip地址范围在192.168.0.*的计算机以读写的权限来访问/home/zht/rfsys目录。/home/work也称为服务器输出共享目录。

括号内的参数意义描述如下:

rw:读/写权限,只读权限的参数为ro;

sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘。

no_root_squash:NFS服务器共享目录用户的属性,如果用户是 root,那么对于这个共享目录来说就具有 root 的权限。

接着执行如下命令,启动端口映射:

# /etc/rc.d/init.d/portmap start

最后执行如下命令启动NFS服务,此时NFS会激活守护进程,然后就开始监听 Client 端的请求:

# /etc/rc.d/init.d/nfs start

在NFS服务器启动后,还需要检查Linux服务器的防火墙等设置(一般需要关闭防火墙服务,执行iptables -F),确保没有屏蔽掉NFS使用的端口和允许通信的主机,主要是检查Linux服务器iptables,ipchains等选项的设置,以及/etc/hosts.deny,/etc/hosts.allow文件。

我们首先在Linux服务器上进行NFS服务器的回环测试,验证共享目录是否能够被访问。在Linux服务器上运行如下命令:

# mount –t nfs 192.168.0.20: /home/zht/rfsys /mnt

# ls /mnt

命令将Linux服务器的NFS输出共享目录挂载到/mnt目录下,因此,如果NFS正常工作,应该能够在/mnt目录看到/home/work共享目录中的内容。

四、Boot Loader环境变量及内核参数设置

我的开发板的boot loader采用的是U-boot,其环境变量设置如下:

  1. Uboot> printenv
  2. bootdelay=3
  3. baudrate=115200
  4. ethaddr=00:12:34:56:78:9a
  5. ipaddr=192.168.0.9                         ①
  6. serverip=192.168.0.1                ②
  7. netmask=255.255.255.0
  8. rootpath=/home/zht/rfsys            ③
  9. stdin=serial
  10. stdout=serial
  11. stderr=serial
  12. bootcmd=tftp 21000000 uImage;bootm 21000000     ④
  13. bootargs=root=/dev/nfs rw nfsroot=192.168.0.1:/home/zht/rfsys nfsaddrs=192.168.0.48: 192.168.0.1:192.168.0.1:255.255.255.0 console=ttyS0,115200 mem=32M   ⑤

① 设置目标板IP地址

② 设置服务器IP地址

③ 设置根文件系统在服务器上的路径,注意该路径一定要设定为服务器上的nfs目录。

④ bootcmd是u-boot启动后执行的命令,命令之间用分号分隔。

tftp 21000000 uImage 表示通过tftp 将内核映像下载到RAM中地址为0×21000000;

bootm 21000000 启动linux操作系统

⑤ 定义u-boot传送给linux内核的命令行参数,该命令行指定以网络文件系统作为根文件系统。

其中root=/dev/nfs,并非真的设备,而是一个告诉内核经由网络取得根文件系统的旗标。

参数nfsroot这个参数告诉内核以那一台机器,那个目录以及那个网络文件系统选项作为根文件系统使用。参数的格式如下:

nfsroot=[:][,]

如果指令列上没有给定 nfsroot 参数,则将使用‘/tftpboot/%s’预设值。其它选项如下:

–指定网络文件系统服务端的互联网地址(IP address)。如果没有给定此栏位,则使用由 nfsaddrs 变量(见下面)所决定的值。此参数的用途之一是允许使用不同机器作为反向地址解析协议(RARP) 及网络文件系统服务端。通常你可以不管它(设为空白)。

– 服务端上要作为根挂入的目录名称。如果字串中有个‘%s’ 符记(token),此符记将代换为客户端互联网地址之 ASCII 表示法。

– 标准的网络文件系统选项。所有选项都以逗号分开。如果没有给定此选项栏位则使用下列的预设值:

  1. port            = as given by server portmap daemon
  2.         rsize           = 1024
  3.         wsize           = 1024
  4.         timeo           = 7
  5.         retrans         = 3
  6.         acregmin        = 3
  7.         acregmax        = 60
  8.         acdirmin        = 30
  9.         acdirmax        = 60
  10.         flags           = hard, nointr, noposix, cto, ac

参数nfsaddrs设定网络通讯所需的各种网络接口地址。如果没有给定这个参数,则内核核会试著使用反向地址解析协议以及/或是启动协议(BOOTP)以找出这些参数。其格式如下:

nfsaddrs=::::::

– 客户端的互联网地址。如果没设,此地址将由反向地址解析协议或启动协议来决定。使用何种协议端视配置核心时打开的选项以及 参数而定。如果设定此参数,就不会使用反向地址解析协议或启动协议。

— 网络文件系统服务端之互联网地址。如果使用反向地址解析协议来决定客户端地址并且设定此参数,则只接受从指定之服务端传来的回应。要使用不同的机器作为反向地址解析与网络文件系统服务端的话,在此指定你的反向地址解析协议服务端(保持空白)并在 nfsroot 参数(见上述)中指定你的网络文件系统服务端。如果此项目空白则使用回答反向地址解析协议或启动协议之服务端的地址。

— 网关(gateway)之互联网地址,若服务端位於不同的子网络上时。如果此项目空白则不使用任何网关并假设服务端在本地的(local)网络上,除非由启动协议接收到值。

— 本地网络界面的网络掩码。如果为空白,则网络掩码由客户端的互联网地址导出,除非由启动协议接收到值。

— 客户端的名称。如果空白,则使用客户端互联网地址之 ASCII-标记法,或由启动协议接收的值。

— 要使用的网络设备名称。如果为空白,所有设备都会用来发出反向地址解析请求,启动协议请求由最先找到的设备发出。网络文件系统使用接收到反向地址解析协议或启动协议回应的设备。如果你只有一个设备那你可以不管它。

— 用以作为自动配置的方法。如果是 `rarp’ 或是 `bootp’ 则使用所指示的协议。如果此值为 `both’ 或空白,若配置核心时有打开这两种协议则都使用。 `none’ 表示不使用自动配置。这种情况下你必须指定前述栏位中所有必要的值。

此 参数可以作为 nfsaddrs 的参数单独使用(前面没有任何 `:` 字符),这种情况下会使用自动配置。然而,此种情况不能使用 `none’作为值。

五、将内核映像文件uImage拷贝到/tftpboot目录,建立的根文件系统拷贝到/home/zht/rfsys目录中。然后重新启动目标板。

 

原文地址:

http://lizeliang.org/blog/%E5%B5%8C%E5%85%A5%E5%BC%8F/nfs-root-%E5%90%AF%E5%8A%A8%E5%86%85%E6%A0%B8%E7%9A%84%E9%85%8D%E7%BD%AEuboot/

阅读(1928) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~