Nfs、tftp 联合运行调试内核及文件系统

本文介绍如何利用TFTP服务器和NFS服务挂载根文件系统,简化Linux开发板的启动过程,避免频繁烧录。包括NFS服务器配置、开发板启动参数设置、内核和TFTP服务器配置,以及解决挂载问题的方法。

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


参考:[http://dev.firnow.com/course/6_system/linux/Linuxjs/2008831/139066.html]

在烧写了 u-boot 之后,为了减少烧写根文件系统、调试程序之痛苦,本文档介绍如何通过 tftp 下载内核,nfs 服务挂接根文件系统启动系统,不用每次都烧到开发板上。

一、NFS 服务挂载根文件系统

1、Linux 服务器端 NFS 服务器的配置

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

#sudo apt-get install nfs-kernel-server

#vi /etc/exports

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

/home/lisongqing/ARM/rootfs 192.168.0.*(rw,sync,no_root_squash)

然后保存退出(添加的内容意思是:允许 ip 地址范围在192.168.0.*的计算机以读写的权限来访问/home/lisongqing/ARM/rootfs 目录,/home/lisongqing/ARM/rootfs 也称为服务器输出共享目录)。

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

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

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

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

如果用户想修改/etc/exports 以修改后或添加其它共享目录 ,可执行命令1)#sudo exportfs -rv 使/etc/exports 文件生效

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

#/etc/init.d/portmap start(或:#sudo service portmap start)

3)最后启动 NFS 服务,此时 NFS 会激活守护进程,然后就开始监听 Client 端的请求:

#/etc/init.d/nfs-kernel-server restart ( 或 : #sudo service nfs-kernel-server restart)

Linux 服务器端 NFS 服务器的配置到此就已经配置好了。


二、开发板启动参数设置

        当在第一步启动 Linux 主机 NFS 服务后,现在就可以在超级终端 u-boot 控制界面修改命令行参数通过 NFS 启动根文件系统了。假设 Linux 主机 IP 为192.168.0.100,NFS 目录为/home/lisongqing/ARM/rootfs,就可以如下设置命令行参数后启动内核。

方式一:

# set bootargs noinitrd root=/dev/nfs console=ttySAC0,115200 nfsroot=192.168.0.100:/home/lisongqing/ARM/rootfs ip=192.168.0.150:192.168.0.100:192.168.0.1:255.255.255.0::eth0:off

方式二:

# set bootargs root=/dev/nfs nfsroot=192.168.0.100:/home/lisongqing/ARM/rootfs ip=192.168.0.150:192.168.0.100:192.168.0.1:255.255.255.0 console=ttySAC0,115200 mem=64M

方式三:

# set bootargs root=/dev/nfs nfsroot=192.168.0.100:/home/lisongqing/ARM/rootfs, rsize=1500,wsize=1500 ip=192.168.0.150:192.168.0.100:192.168.0.1:255.255.255.0 console=ttySAC0,115200 mem=64M

增加 rsize 和 wsize 参数,增加块大小(默认为1024),我猜想可以减小丢包概率;

# saveenv

命令参数行解释:

Targetboard IP addr:192.168.0.150

Host PC IP addr:192.168.0.100

Gateway:192.168.0.1

Nfs dir:192.168.0.100:/home/lisongqing/ARM/rootfs


各命令行格式:

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

2、nfsroot

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

nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

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

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

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

port= as given by server portmap daemon

rsize= 1024

wsize= 1024

timeo=7

retrans=3

acregmin=3

acregmax= 60

acdirmin= 30

acdirmax= 60

flags= hard, nointr, noposix, cto, ac


3、nfsaddrs

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

nfsaddrs=<my-ip>:<serv-ip>:<gw-ip>:<netmask>:<name>:<dev>:<auto>

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

2)

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

3)<auto>--用以作为自动配置的方法。如果是`rarp' 或是`bootp' 则使用所指示的协议;如果此值为`both'或空白,若配置核心时有打开这两种协议则都使用;`none'表示不使用自动配置,这种情况下你必须指定前述栏位中所有必要的值。此<auto>参数可以作为 nfsaddrs 的参数单独使用(前面没有任何`:`字符),这种情况下会使用自动配置。然而,此种情况不能使用`none'作为值。


三、内核配置要求

添加内核对 NFS 的支持:

1)选中 networking support->networking options->IP:kernel level auloconfiguralion 项

2)选中 file systems->network file systems->下的 root file system on nfs 和 nfs file system support


四、TFTP 服务器配置

tftpd-hpa 是一个功能增强的 TFTP 服务器。它提供了很多 TFTP 的增强功能,它已经被移植到大多数的现代 UNIX 系统。

1.sudo apt-get install tftp-hpa tftpd-hpa

2.mkdir ~/tftproot chmod 777 tftproot

3.sudo vim /etc/default/tftpd-hpa

原内容为:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"

TFTP_DIRECTORY="/var/lib/tftpboot"

TFTP_ADDRESS="0.0.0.0:69"

TFTP_OPTIONS="--secure"

修改为:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"

#TFTP_DIRECTORY="/var/lib/tftpboot"

TFTP_DIRECTORY="~/tftproot"

TFTP_ADDRESS="0.0.0.0:69"

#TFTP_OPTIONS="--secure"

TFTP_OPTIONS="-l -c -s"

4.sudo restart tftpd-hpa 或者 sudo service tftpd-hpa restart

5.检测 tftp

1)> echo hello world > ~/a.txt

2)> echo tftp test > ~/tftproot/b.txt

3)> cd ~

4)> tftp localhost 或者 tftp 127.0.0.1

5)> tftp> put a.txt

6)> tftp> get b.txt

7)> tftp> q


五、设置启动命令

bootcmd=tftp 0x32000000 uImage;bootm 0x32000000


六、启动开发板

1)拷贝内核景象到~/tftproot

2)拷贝文件系统到 nfs 目录

3)开发板上电


七、挂载问题及解决

1、挂载根文件系统启动内核时出现错误

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Error: unrecognized/unsupported machine ID (r1 = 0x000003f0).

Available machine support:

ID (hex)

NAME

0000016a

SMDK2440

Please check your kernel config and/or bootloader.

修改方法:

修改 bootloader 和内核配置一致

内核定义文件:arch/arm/tools/mach-types

smdk2440

MACH_SMDK2440

SMDK2440 1008

s3c2440

MACH_S3C2440

S3C2440

362

内核配置开发板:arch/arm/mach-s3c2440/mach-smdk2440.c

MACHINE_START(S3C2440,"smdk2440")

Uboot 定义文件:include/asm/mach-types.h

#define MACH_TYPE_S3C2440 182

#define MACH_TYPE_SMDK2440 1008

Uboot 配置开发板:board/samsung/my2440/my2440.c 中的 board_init()

gd->bd->bi_arch_number=MACH_TYPE_SMDK2440;

方法一:

MACHINE_START(S3C2440,"smdk2440")修改为

MACHINE_START(SMDK2440,"smdk2440")

方法二:

gd->bd->bi_arch_number=MACH_TYPE_SMDK2440;修改为

gd->bd->bi_arch_number=MACH_TYPE_S3C2440;

2、nfs: server 192.168.0.100 not responding, still trying

挂载文件系统时出现

dm9000 dm9000.0: WARNING: no IRQ resource flags set.

eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1

IP-Config: Complete:

device=eth0, addr=192.168.0.150, mask=255.255.255.0, gw=192.168.0.1,

host=192.168.0.150, domain=, nis-domain=(none),

bootserver=192.168.0.100, rootserver=192.168.0.100, rootpath=

Looking up port of RPC 100003/2 on 192.168.0.100

Looking up port of RPC 100005/1 on 192.168.0.100

VFS: Mounted root (nfs filesystem) on device 0:12.

Freeing init memory: 144K

----------munt all----------------

network interface

解决方法:

修改启动参数:

setenv

bootargs

noinitrd

root=/dev/nfs

nfsroot=192.168.0.100:/home/lisongqing/ARM/rootfs,tcp,nolock

ip=192.168.0.150:192.168.0.100:192.168.0.1:255.255.255.0::eth0:off console=ttySAC0,115200

尝试后还是不能挂载

然后检查,原来“dm9000 dm9000.0: WARNING: no IRQ resource flags set”

,原来是网卡

没启动好。

修改 arch/arm/plat-s3c24xx/devs.c

static struct resource s3c_dm9000_resource[] = {

[0] = {

.start = S3C24XX_PA_DM9000,

.end = S3C24XX_PA_DM9000+ 0x3,

.flags = IORESOURCE_MEM

},

[1]={

.start = S3C24XX_PA_DM9000 + 0x4, //CMD pin is A2

.end = S3C24XX_PA_DM9000 + 0x4 + 0x7c,

.flags = IORESOURCE_MEM

},

[2] = {

.start = IRQ_EINT7,

.end = IRQ_EINT7,

.flags = IORESOURCE_IRQ

},

};

修改为

static struct resource s3c_dm9000_resource[] = {

[0] = {

.start = S3C24XX_PA_DM9000,

.end = S3C24XX_PA_DM9000+ 0x3,

.flags = IORESOURCE_MEM

},

[1]={

.start = S3C24XX_PA_DM9000 + 0x4, //CMD pin is A2

.end = S3C24XX_PA_DM9000 + 0x4 + 0x7c,

.flags = IORESOURCE_MEM

},

[2] = {

.start = IRQ_EINT7,

.end = IRQ_EINT7,

.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING

},

};

成功。修改 uboot 参数,以后可以此种方法启动:

setenv

bootargs

noinitrd

root=/dev/nfs

nfsroot=192.168.0.100:/home/lisongqing/ARM/rootfs,tcp,nolock

ip=192.168.0.150:192.168.0.100:192.168.0.1:255.255.255.0::eth0:off console=ttySAC0,115200

setenv bootcmd tftp 0x32000000 uImage\; bootm 0x32000000\;

saveenv


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值