用base-fs做nfs的根文件系统怎么不行
发布网友
发布时间:2022-04-23 23:27
我来回答
共1个回答
热心网友
时间:2022-04-14 23:50
使用NFS挂载根文件系统,在开发阶段有很多的好处,对根文件系统进行修改后不用每次都下载到NandFlash中,可以把制作的根文件系统放到主机中的NFS输出目录中,在正式成为产品以后在烧写到开发板中,这样可以方便很多,也可以把编译生成的内核也放到NFS输出目录中这样也可以引导内核,很是方便,还等什么开始吧!
NFS服务器端的配置已经在上一篇文章中写到过了。U-boot中使用tftp协议也在另一篇文章中。按道理来说NFS命令也是可以是使用的,因为都是基于网卡的,只要网卡驱动移植的没有问题,NFS也就直接可以使用了,不过在我这里可是行不通,在使用NFS传输文件中,一直出现下面的错误类型,提示挂载不上:
U-Boot@mini2440]#nfs 0x30000000 10.27.10.48:/home/ubuntu/kernel/fs/u-boot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at 100M full plex mode
Using dm9000 device
File transfer via NFS from server 10.27.10.48; our IP address is 10.27.10.23
Filename '/home/ubuntu/kernel/fs/u-boot.bin'.
Load address: 0x30000000
Loading: *** ERROR: Cannot mount //仅仅提示挂载不上
可还有下面的错误:
[U-Boot@mini2440]#nfs 0x30000000 10.27.10.48:/home/ubuntu/kernel/fs/u-boot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at 100M full plex mode
Using dm9000 device
File transfer via NFS from server 10.27.10.48; our IP address is 10.27.10.23
Filename '/home/ubuntu/kernel/fs/u-boot.bin'.
Load address: 0x30000000
Loading: *** ERROR: Cannot mount
*** ERROR: Cannot umount //这里还提示了不能卸载
在网上查找资料,出现 Cannot umount错误的解决方法是修改u-boot-2009.08/net/nfs.c文件,在大约453行附近的位置:
static intnfs_umountall_reply (uchar *pkt, unsigned len)
{
struct rpc_t rpc_pkt;
debug("%s\n", __func__);
memcpy ((unsigned char *)&rpc_pkt, pkt, len);
//if (ntohl(rpc_pkt.u.reply.id) != rpc_id) //原来的这一行修改成下面的一行
if ((ntohl(rpc_pkt.u.reply.id)+1) != rpc_id)
return -1;
if (rpc_pkt.u.reply.rstatus ||
..................
}
可是在我这里修改完以后还是不可以使用,一样出现上面的错误。这是就想到了是不是和tftp时出现的错误是一样的,也是因为超时的原因,虽然这里面没有出现超时的提示,不管怎么样还是先改了再说;还是在/nfs.c文件中修改下面的超时的宏定义:
#define HASHES_PER_LINE 65 /* Number of "loading" hashes per line */
#define NFS_RETRY_COUNT 30
#define NFS_TIMEOUT (30*2000UL) //把原来的2000UL改成 30*2000UL,
修改完上面的宏定义以后,再使用NFS传输文件,一开始有几次还是不成功,不过后面再使用时大部分情况下都是成功的,不再像上面一次也没有成功过:
[U-Boot@mini2440]#nfs 0x30000000 10.27.10.48:/home/zfz/kernel/fs/u-boot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at 100M full plex mode
Using dm9000 device
File transfer via NFS from server 10.27.10.48; our IP address is 10.27.10.23
Filename '/home/zfz/kernel/fs/u-boot.bin'.
Load address: 0x30000000
Loading: ###############################
done
Bytes transferred = 155016 (25d88 hex)
既然NFS可以使用了,那就可以用NFS挂载根文件系统了。根文件系统的制作在另一篇文章中也已经写了,这里就还是使用上次的根文件系统,只是不再用工具制作成Yaffs2的镜像了,直接使用Busybox,制作成功的noot_nfs目录下的各个文件就可以了,如果要下载到NandFlash中,再使用Yaffs2格式的镜像文件。
可以先用NFS把Linux内核下载到内存中,然后设置传递给内核的参数,在u-boot-2009.08/include/configs/mini2440.h文件中,修改原来使用nand read 方式,修改成使用NFS方式的;
//#define CONFIG_BOOTCOMMAND "nand read 0x32000000 0x60000 0x560000;bootm 0x32000000"
//把上面的注释掉,修改成下面的方式
#define CONFIG_BOOTCOMMAND "nfs 0x30000800 10.27.10.48:/home/zfz/kernel/fs/uImage.img;bootm"
这样,在用U-boot引导时就可以把Linux的内核首先复制到内存中了,这样也不用把Linux 内核下载到开发板中了。然后在修改传递给内核的参数,修改为下面的:
//#define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mem=64M"
//把上面的修改成下面的这句
#define CONFIG_BOOTARGS "noinitrd root=/dev/nfs rw nfsroot=10.27.10.48:/home/ubuntu/kernel/fs/root_nfs ip=10.27.10.23:10.27.10.48::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M"