1、安装nfs服务器:
sudo apt-get install nfs-kernel-server
2、编辑/etc/exports文件,在该文件中增加NFS目录信息:
/xx/xxx/ *(rw,sync,no_root_squash)
说明:
/xx/xxx/是NFS的根目录
*可以是ip地址,表示允许挂载的客户机IP
3、需要注意的一个地方,debian9发布后马上升级了debian9系统,升级后发现以前在debian8中运行得好好的NFS突然不能挂载了,开发板启动到挂载根文件系统的时候由于挂载不上文件系统而panic了,此时ping开发板是可以ping通的,但是就是挂载不了。不知什么原因,信息如下:
random: fast init done
dm9000 dm9000 eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1
IP-Config: Guessing netmask 255.0.0.0
IP-Config: Complete:
device=eth0, hwaddr=08:00:3e:26:0a:5b, ipaddr=10.0.0.3, mask=255.0.0.0, gw=255.255.255.255
host=10.0.0.3, domain=, nis-domain=(none)
bootserver=255.255.255.255, rootserver=10.0.0.2, rootpath=
ALSA device list:
No soundcards found.
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
0100 65536 ram0
(driver?)
0101 65536 ram1
(driver?)
0102 65536 ram2
(driver?)
0103 65536 ram3
(driver?)
0104 65536 ram4
(driver?)
0105 65536 ram5
(driver?)
0106 65536 ram6
(driver?)
0107 65536 ram7
(driver?)
0108 65536 ram8
(driver?)
0109 65536 ram9
(driver?)
010a 65536 ram10
(driver?)
010b 65536 ram11
(driver?)
010c 65536 ram12
(driver?)
010d 65536 ram13
(driver?)
010e 65536 ram14
(driver?)
010f 65536 ram15
(driver?)
1f00 256 mtdblock0
(driver?)
1f01 128 mtdblock1
(driver?)
1f02 5120 mtdblock2
(driver?)
1f03 256640 mtdblock3
(driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
CPU: 0 PID: 1 Comm: swapper Not tainted 4.10.15 #4
Hardware name: MINI2440
[<c000f740>] (unwind_backtrace) from [<c000d2bc>] (show_stack+0x10/0x14)
[<c000d2bc>] (show_stack) from [<c006915c>] (panic+0xb0/0x248)
[<c006915c>] (panic) from [<c05751d0>] (mount_block_root+0x198/0x280)
[<c05751d0>] (mount_block_root) from [<c05754a4>] (mount_root+0xf0/0x11c)
[<c05754a4>] (mount_root) from [<c057562c>] (prepare_namespace+0x15c/0x1b0)
[<c057562c>] (prepare_namespace) from [<c0574dd4>] (kernel_init_freeable+0x17c/0x1c8)
[<c0574dd4>] (kernel_init_freeable) from [<c0456040>] (kernel_init+0x8/0xf4)
[<c0456040>] (kernel_init) from [<c000a470>] (ret_from_fork+0x14/0x24)
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
通过主机的日志发现有如下日志信息,说明系统已经检测到了开发板的挂载行为,但是不知什么原因就是挂载不上,也没有更多的其它日志信息,很无奈
Aug 11 20:23:21 debian rpc.mountd[599]: authenticated mount request from 10.0.0.3:1011 for /data/nfs/rootfs (/data/nfs/rootfs)
Aug 11 20:23:26 debian rpc.mountd[599]: authenticated mount request from 10.0.0.3:767 for /data/nfs/rootfs (/data/nfs/rootfs)
Aug 11 20:23:36 debian rpc.mountd[599]: authenticated mount request from 10.0.0.3:937 for /data/nfs/rootfs (/data/nfs/rootfs)
Aug 11 20:23:56 debian rpc.mountd[599]: authenticated mount request from 10.0.0.3:961 for /data/nfs/rootfs (/data/nfs/rootfs)
后面经过多天的摸索,发现只要在开发板的内核配置中去掉NFS client support for NFS version 2选项后系统就不会再检测到开发板的挂载行为了,无论选择的是NFS client support for NFS version 3还是NFS client support for NFS version 4 都无济于事,宿主机没有任何反应了,同时开发板也没有任何能挂载上的迹象,经过多天折腾无效。
既然发现了与NFS2客户端有关那还是得继续努力一下,通过sudo nfsstat命令查看宿主机的NFS信息:
[jiangxianxu@debian:linux-4.10.15]$sudo nfsstat
Server rpc stats:
calls badcalls badfmt badauth badclnt
8196 11 11 0 0
Server nfs v3:
null getattr setattr lookup access
1 0% 24 3% 0 0% 52 7% 30 4%
readlink read write create mkdir
8 1% 623 84% 0 0% 0 0% 0 0%
symlink mknod remove rmdir rename
0 0% 0 0% 0 0% 0 0% 0 0%
link readdir readdirplus fsstat fsinfo
0 0% 0 0% 0 0% 0 0% 2 0%
pathconf commit
1 0% 0 0%
Server nfs v4:
null compound
12 0% 7443 99%
Server nfs v4 operations:
op0-unused op1-unused op2-future access close
0 0% 0 0% 0 0% 365 2% 126 0%
commit create delegpurge delegreturn getattr
0 0% 0 0% 0 0% 45 0% 1070 6%
getfh link lock lockt locku
455 2% 0 0% 16 0% 0 0% 16 0%
lookup lookup_root nverify open openattr
418 2% 0 0% 0 0% 254 1% 0 0%
open_conf open_dgrd putfh putpubfh putrootfh
10 0% 0 0% 7316 45% 0 0% 11 0%
read readdir readlink remove rename
5851 36% 10 0% 88 0% 0 0% 0 0%
renew restorefh savefh secinfo setattr
55 0% 0 0% 0 0% 0 0% 0 0%
setcltid setcltidconf verify write rellockowner
22 0% 21 0% 0 0% 7 0% 16 0%
bc_ctl bind_conn exchange_id create_ses destroy_ses
0 0% 0 0% 0 0% 0 0% 0 0%
free_stateid getdirdeleg getdevinfo getdevlist layoutcommit
0 0% 0 0% 0 0% 0 0% 0 0%
layoutget layoutreturn secinfononam sequence set_ssv
0 0% 0 0% 0 0% 0 0% 0 0%
test_stateid want_deleg destroy_clid reclaim_comp allocate
0 0% 0 0% 0 0% 0 0% 0 0%
copy copy_notify deallocate ioadvise layouterror
0 0% 0 0% 0 0% 0 0% 0 0%
layoutstats offloadcancel offloadstatus readplus seek
0 0% 0 0% 0 0% 0 0% 0 0%
write_same
0 0%
[jiangxianxu@debian:linux-4.10.15]$
通过信息发现宿主机安装的是NFSV3和NFSV4服务器,好像没有NFSV2!!!!!!,难道与这个有关?开发板用NFSV2挂载的时候宿主机的mount有反应,而V3和V4都没有反应,是不是哪里没有搞对,导致开发板没有正确的使用NFSV3和V4与宿主机通信,导致挂载不上。后面开始向这个方向努力,在网上搜索很久无果,还是无法解决。
终于有一天与朋友交谈中得知可以通过开发板的bootargs指定启动时使用什么版本的NFS客户端,我去,这简直是雪中送炭啊,难道被困扰多时的问题可以就这么解决了吗?回来果断试了一把,在bootargs中加入指定NFS版本的信息:
setenv bootargs root=/dev/nfs rw nfsroot=10.0.0.2:/data/nfs/rootfs,nolock,proto=tcp,nfsvers=4 ip=10.0.0.3 console=ttySAC0,115200 ctp=1 console=ttySAC0,115200
其中nfsvers=4即为指定系统使用NFSV4客户端挂载,开机测试,果然启动成功,顿时喜悦之情无法言语......
U-Boot 2009.08 (Aug 11 2016 - 23:10:26)
modified by jiangxianxv (jiangxianxv@163.com)
DRAM: 64 MB
Flash: 512 kB
NAND: 256 MiB
In: serial
Out: serial
Err: serial
Net: dm9000
[uboot@mini2440]# print
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
netmask=255.255.255.0
ethact=dm9000
ipaddr=10.0.0.3
serverip=10.0.0.2
gatewayip=10.0.0.3
bootargs=root=/dev/nfs rw nfsroot=10.0.0.2:/data/nfs/rootfs,nolock,proto=tcp,nfsvers=4 ip=10.0.0.3 console=ttySAC0,115200 ctp=1 console=ttySAC0,115200
stdin=serial
stdout=serial
stderr=serial
Environment size: 335/131068 bytes
[uboot@mini2440]# tftp 0x30008000 uImage
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
TFTP from server 10.0.0.2; our IP address is 10.0.0.3
Filename 'uImage'.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
################
done
Bytes transferred = 3074400 (2ee960 hex)
[uboot@mini2440]# bootm 0x30008000
MACH_TYPE = 1999
bootargs = root=/dev/nfs rw nfsroot=10.0.0.2:/data/nfs/rootfs,nolock,proto=tcp,nfsvers=4 ip=10.0.0.3 console=ttySAC0,115200 ctp=1 console=ttySAC0,115200
## Booting kernel from Legacy Image at 30008000 ...
Image Name: linux-4.10.15
Created: 2017-08-11 13:57:27 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3074336 Bytes = 2.9 MB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum ... OK
XIP Kernel Image ... OK
OK
Starting kernel ...
Booting Linux on physical CPU 0x0
Linux version 4.10.15 (jiangxianxu@debian) (gcc version 6.3.0 20170516 (Debian 6.3.0-18) ) #4 Fri Aug 11 21:51:48 CST 2017
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=0000717f
CPU: VIVT data cache, VIVT instruction cache
Machine: MINI2440
Memory policy: Data cache writeback
CPU S3C2440A (id 0x32440001)
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
Kernel command line: root=/dev/nfs rw nfsroot=10.0.0.2:/data/nfs/rootfs,nolock,proto=tcp,nfsvers=4 ip=10.0.0.3 console=ttySAC0,115200 ctp=1 console=ttySAC0,115200
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 58728K/65536K available (4423K kernel code, 185K rwdata, 992K rodata, 176K init, 258K bss, 6808K reserved, 0K cma-reserved)
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xc4800000 - 0xff800000 ( 944 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.text : 0xc0008000 - 0xc045a100 (4425 kB)
.init : 0xc0574000 - 0xc05a0000 ( 176 kB)
.data : 0xc05a0000 - 0xc05ce4e0 ( 186 kB)
.bss : 0xc05ce4e0 - 0xc060eef8 ( 259 kB)
SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
NR_IRQS:103
S3C2440: IRQ Support
irq: clearing pending status 00000003
irq: clearing pending status 00000002
sched_clock: 16 bits at 1012kHz, resolution 987ns, wraps every 32362962ns
clocksource: samsung_clocksource_timer: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 28803037 ns
Console: colour dummy device 80x30
Calibrating delay loop... 50.38 BogoMIPS (lpj=251904)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
CPU: Testing write buffer coherency: ok
Setting up static identity map for 0x300081e0 - 0x30008238
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex hash table entries: 256 (order: -1, 3072 bytes)
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
cpuidle: using governor ladder
MINI2440: Option string mini2440=0tb
MINI2440: 't' ignored, touchscreen not compiled in
MINI2440: LCD
[0:240x320]
1:800x480
2:1024x768
3:320x240
S3C2440: Initialising architecture
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
s3c-i2c s3c2440-i2c.0: slave address 0x10
s3c-i2c s3c2440-i2c.0: bus frequency set to 98 KHz
s3c-i2c s3c2440-i2c.0: i2c-0: S3C I2C adapter
Advanced Linux Sound Architecture Driver Initialized.
clocksource: Switched to clocksource samsung_clocksource_timer
NET: Registered protocol family 2
TCP established hash table entries: 1024 (order: 0, 4096 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
workingset: timestamp_bits=30 max_order=14 bucket_order=0
NFS: Registering the id_resolver key type
Key type id_resolver registered
Key type id_legacy registered
nfs4filelayout_init: NFSv4 File Layout Driver Registering...
jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
romfs: ROMFS MTD (C) 2007 Red Hat, Inc.
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
Console: switching to colour frame buffer device 60x53
s3c2410-lcd s3c2410-lcd: fb0: s3c2410fb frame buffer device
s3c2440-uart.0: ttySAC0 at MMIO 0x50000000 (irq = 74, base_baud = 0) is a S3C2440
console [ttySAC0] enabled
s3c2440-uart.1: ttySAC1 at MMIO 0x50004000 (irq = 77, base_baud = 0) is a S3C2440
s3c2440-uart.2: ttySAC2 at MMIO 0x50008000 (irq = 80, base_baud = 0) is a S3C2440
brd: module loaded
at24 0-0050: 1024 byte 24c08 EEPROM, writable, 16 bytes/write
nand: device found, Manufacturer ID: 0xec, Chip ID: 0xda
nand: Samsung NAND 256MiB 3,3V 8-bit
nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64
s3c24xx-nand s3c2440-nand: soft ECC
Creating 4 MTD partitions on "nand":
0x000000000000-0x000000040000 : "u-boot"
__nand_correct_data: uncorrectable ECC error
0x000000040000-0x000000060000 : "u-boot-env"
ftl_cs: FTL header not found.
0x000000060000-0x000000560000 : "kernel"
ftl_cs: FTL header not found.
0x000000560000-0x000010000000 : "root"
ftl_cs: FTL header not found.
s3c24xx-nand s3c2440-nand: Tacls=1, 9ns Twrph0=3 29ns, Twrph1=2 19ns
eth0: dm9000e at c4a5b300,c4a5d304 IRQ 55 MAC: 08:00:3e:26:0a:5b (chip)
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
ohci-s3c2410: OHCI S3C2410 driver
s3c2410-ohci s3c2410-ohci: OHCI Host Controller
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
mousedev: PS/2 mouse device common for all mice
i2c /dev entries driver
s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq disabled
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
hidraw: raw HID events driver (C) Jiri Kosina
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
NET: Registered protocol family 17
Key type dns_resolver registered
input: gpio-keys as /devices/platform/gpio-keys/input/input0
hctosys: unable to open rtc device (rtc0)
lingd2440_dm9000_init
dm9000 dm9000 eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1
random: fast init done
IP-Config: Guessing netmask 255.0.0.0
IP-Config: Complete:
device=eth0, hwaddr=08:00:3e:26:0a:5b, ipaddr=10.0.0.3, mask=255.0.0.0, gw=255.255.255.255
host=10.0.0.3, domain=, nis-domain=(none)
bootserver=255.255.255.255, rootserver=10.0.0.2, rootpath=
ALSA device list:
No soundcards found.
VFS: Mounted root (nfs4 filesystem) on device 0:13.
Freeing unused kernel memory: 176K
This architecture does not have kernel memory protection.
----------munt all----------------
****************Studying ARM*********************
Kernel version:linux-4.10.15
Auth:jiangxianxu
Date:2017-08-11
***********************************************
mini2440_leds: loading out-of-tree module taints kernel.
leds initialized
Please press Enter to activate this console.
[root@JIANG-/]#
[root@JIANG-/]#
[root@JIANG-/]#ls
bin home proc try_var.sh
boot lib root unixbench-5.1.2
dev linuxrc sbin usr
etc mnt sys var
ethtool modules tmp
[root@JIANG-/]#
至此,困扰多天的问题终于得到解决,可以安心的使用新系统了,