转载地址:http://blog.csdn.net/yazhouren/article/details/52003572
origin: http://www.cnblogs.com/cjjnjust/articles/1754849.html
主机说明:
主机guest 为虚拟机redhat9: IP: 59.64.155.122 网关 59.64.155.1
redhat9上已经配置好NFS服务(参考http://blog.chinaunix.net/u2/80953/showart.php?id=1274973)
也已经配置好TFTP服务(参考http://blog.chinaunix.net/u2/80953/showart.php?id=1274976)
NFS服务, TFTP服务都已经启动
终端采用主机host XP的超级终端
实验板说明:
MPC8349itx开发板: IP: 59.64.155.244 网关 59.64.155.1
开发板eth0为vsc8201芯片,uboot支持驱动,另一芯片为交换交换芯片vsc7385,单独模块驱动。
U-Boot-1.1.3 ; Linux kernel-2.6.13
内核支持NFS分区(即编译时在File system中选中[*] Root file system on NFS), 以及支持内核IP_PNP(即编译时在Networking中选中[*] IP: kernel level autoconfiguration)
File systems --->
Network File Systems --->
<*> NFS file system support ## 必选
[*] Provide NFSv3 client support ## 可选
[*] Root file system on NFS ## 必选
Networking --->
[*] Networking support
Networking options --->
[*] IP: kernel level autoconfiguration ## 必选
***************************************************************************
A: NFS启动挂载根文件系统
主机上操作:
$ cd /usr/local/mpc8349/
$ ./ltib --preconfig config/platform/mpc8349itx/defconfig-min-fs -f
## 依次进入如下选项选择(X) NFS only, 根据情况决定是否选择[ ] read-only root filesystem
--- Target Image Generation
Options --->
--- Choose your root filesystem image type
Target image: (ext2.gz ramdisk) ---> ## 改ramdisk文件系统为NFS
(X) NFS only
[ ] read-only root filesystem
## 其他情况参考LTIB使用说明(http://blog.chinaunix.net/u2/80953/showart.php?id=1275002)
## 编译结束后生成的根文件系统是位于当前安装目录下的rootfs (/usr/local/mpc8349/small/rootfs)
$ ln -s /usr/local/mpc8349/small/rootfs /home/liuby/rootfsln ## 建立NFS服务目录软连接
$ su - root ## 切换到root用户,需要密码
# echo "/usr/local/mpc8349/small/rootfs 59.64.155.244(rw,sync,no_root_squash)" > /etc/exports ## NFS 服务配置
# service portmap restart
# service nfs restart
# exportfs -arv ## 修改的NFS配置生效(exportfs参数顺序不一样,显示有所不同,此顺序显示结果明了)
# exit
实验板上操作:
uboot启动后按键进入uboot命令行环境:
=> cp.b fef50000 40000 20000; go 40004 ## 驱动vsc7385芯片
=> set serverip 59.64.155.122 ## 主机地址
=> set ipaddr 59.64.155.244 ## 实验板地址
=> set netmask 255.255.255.0
=> set netdev eth0 ## eth0
=> ping 59.64.155.122 ## 测试连通
=> set hostname PowerQUICC
=> set kernaddr fe810000 ## flash中内核起始地址
=> set rootpath /usr/local/mpc8349/small/rootfs ## NFS服务根目录
=> setenv bootargs root=/dev/nfs rw nfsroot=$serverip:$rootpath ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off console=ttyS0,115200
=> bootm $kernaddr
## 如果一切正常,内核启动后会启动NFS文件系统作根文件系统。
## 测试: 在开发板上创建一个文件,在主机上会看到这个文件生成
同样可以简化操作(测试nfs服务软连接目录):
=> cp.b fef50000 40000 20000; go 40004 ## 驱动vsc7385芯片
=> setenv ipaddr 59.64.155.244
=> setenv bootargs root=/dev/nfs rw nfsroot=59.64.155.122:/home/liuby/rootfsln ip=59.64.155.244:59.64.155.122:255.255.255.0 console=ttyS0,115200
=> bootm fe810000 ## 内核镜像uImage在FLASH中的存储地址
************************
实验中遇到一个问题,就是bootm之后内核启动,NFS启动挂载文件系统快完成时出现下面这个错误提示
RPC: sendmsg returned error 101
nfs: RPC call returned error 101
后来才发现是文件系统中的启动脚本在启动过程中修改了eth0的ip地址,导致连接不上NFS server
后来再测试又发现试图挂载非NFS文件系统目录时也会出现此问题,并且在主机上执行# showmount 命令结果会显示有ip地址(实验板ip地址)挂载。即: 在ltib编译文件系统时选择ext2.gz ramdisk (非NFS only), 最后使用rootfs目录,出现同样的问题。
还有遇到过一个问题,根本无法挂载文件系统,在启动时出现下述提示
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
<0>Rebooting in 180 seconds..
后来发现是 /etc/exports 只有如下一句
/home/liuby/rootfs 59.64.155.244(rw,sync,no_root_squash)
而没有像下面这样指定根目录的访问权限:
/usr/local/mpc8349/small/rootfs 59.64.155.244(rw,sync,no_root_squash)
结论: 必须指定NFS文件系统所在目录或其对应的软连接做NFS服务根目录(见下分析)
在NFS文件系统中编译busybox时可以不选择编译mount命令(不建议如此)
nfs总结:
如上 /home/liuby/rootfsln是指向/usr/local/mpc8349/small/rootfs的软连接
# echo "/home/liuby/rootfsln 59.64.155.244(rw,sync,no_root_squash)" > /etc/exports
# exportfs -arv ## 会弹出下面的提示
exporting 59.64.155.244:/usr/local/mpc8349/small/rootfs
可见 /etc/exports 中语句 /home/liuby/rootfsln 59.64.155.244(rw,sync,no_root_squash) 和 /usr/local/mpc8349/small/rootfs 59.64.155.244(rw,sync,no_root_squash) 是等效的.
故: 如果想用不同的文件系统,可以改变这个软连接指向新的文件系统,这比复制文件系统或者修改u-boot环境变量方便多了,并且还不用重新配置/etc/exports。
# echo "/home/liuby/rootfsln 59.64.155.244(rw, sync, no_root_squash)" > /etc/exports
$ rm -f /home/liuby/rootfsln
$ ln -s nfs_rootfs_dir_path /home/liuby/rootfsln ## 只需要建立和修改这个软连接即可
# exportfs -arv ## 配置生效(必须)
在uboot环境变量中只需设置一次rootpath=/home/liuby/rootfsln, 每次只需在主机上修改此软连接的指向,即可
注意权限
***************************************************************************
B: TFTP下载内核和文件系统镜像到ram中启动
主机上操作:
在主机上TFTP根目录为/home/liuby/tftpboot/
$ mkdir /home/liuby/tftpboot/image_dir
$ cd /usr/local/mpc8349/small/
$ ./ltib --preconfig config/platform/mpc8349itx/defconfig-min-fs-modified -f --batch ## 编译内核和文件系统镜像
$ cp -f rootfs/boot/uImage rootfs.ext2.gz.uboot ~/tftpboot/image_dir/ ## 复制内核镜像和文件系统镜像到~/tftpboot/image_dir
$ cd ~/tftpboot/
$ ln -s image_dir/ bootln
实验板上操作:
=> set serverip 59.64.155.122 ## 主机地址
=> set ipaddr 59.64.155.244 ## 实验板地址
=> set netmask 255.255.255.0
=> set tftp_path bootln
=> ping $serverip ## 测试连通
=> cp.b fef50000 40000 20000; go 40004 ## 驱动vsc7385芯片
=> setenv loadkernaddr 1000000
=> setenv loadramdaddr 1200000
=> tftpboot $loadkernaddr image_dir/uImage ## 下载内核镜像到ram
=> tftp $loadramdaddr $tftp_path/rootfs.ext2.gz.uboot ## 下载文件系统镜像到ram
=> bootm $loadkernaddr $loadramdaddr ## 启动ram中内核和文件系统镜像
下载不畅时,用CTRL+C来终止回到提示符
tftp总结:
在TFTP服务根目录下建立目录存储镜像文件,然后创建软连接指向需要下载的镜像目录,这样可以通过修改连接文件即可,而不用每次修改uboot环境变量了
***************************************************************************
C: TFTP下载内核镜像到ram,NFS挂载根文件系统(target image: NFS only)
主机上利用上面操作的结果,不进行配置。
实验板上操作:
=> set serverip 59.64.155.122 ## 主机地址
=> set ipaddr 59.64.155.244 ## 实验板地址
=> set netmask 255.255.255.0
=> set bootargs root=/dev/nfs rw nfsroot=$serverip:/home/liuby/rootfsln ip=$ipaddr:$serverip:$netmask console=ttyS0,115200
=> tftp 1000000 bootln/uImage ## 下载内核镜像到ram 地址1000000
=> bootm 1000000
## 测试发现内核启动,NFS挂载成功
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
简便方法:
将下面附录的文件存储为.txt文件,例如取名mpc8349itx_uboot_env.txt
用linux命令unix2dos进行转换,然后打开windows XP 超级终端,启动实验板进入uboot命令行环境:
点击超级终端界面 "文件"->"属性",弹出属性对话框,点击"设置"->"ASCII码设置",设置行延迟20ms,字符延迟1ms;然后点击"发送"->"发送文本文件",选择"mpc8349itx_uboot_env.txt"发送。
此操作相当于在uboot命令行输入uboot环境设置参数
执行完操作后保存了这些设置,以后每次在uboot启动时不用再敲入一行行的设置参数.
在uboot命令行下执行
=> run flashnfsboot
相当于 A 操作
在uboot命令行执行
=> run tftpramboot
相当于执行 B 操作
在uboot命令行执行
=> run tftpnfsboot
相当于执行 C 操作
转栽地址:http://blog.chinaunix.net/u3/98913/showart_1978279.html