linux内核挂载nfs,使用NFS挂载根文件系统和Linux内核

本文详细介绍了在开发阶段使用NFS挂载根文件系统和Linux内核的优势,以及解决在U-Boot中遇到的NFS挂载错误。通过调整u-boot源码中的超时设置,解决了NFS传输文件时的挂载失败问题。随后在Linux内核中移植DM9000网卡驱动,确保NFS挂载根文件系统的顺利进行。最后展示了成功挂载后的Linux启动信息,实现了开发过程中的便捷调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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 duplex 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 duplex 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 duplex 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=/linu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值