Linux操作文档系列之07
Linux配置NFS服务器及嵌入式开发挂载rootfs
目的:开机后Linux嵌入式开发板Kernel从NFS服务器读取rootfs文件系统,不用每次烧写Flash,方便开发
1.开发环境连接方式
image
硬件连接方式:
- 开发板和电脑,以及linux服务器连接在同一个路由器组成局域网内
- 用USB串口将板子串口和电脑连接,安装好驱动
Linux服务器可以在PC电脑安装虚拟机,并用桥接的方式配置网络,使==三者处于同一网络==
2.安装Linux服务器端NFS服务
2.1.安装nfs服务
sudo apt-get install nfs-kernel-server
2.2.配置导出rootfs文件系统
sudo echo "/home/wang/work/sync/nfs1 *(rw,no_root_squash,async,no_subtree_check)" >> /etc/exports
/home/wang/work/rootfs:共享的目录 (修改成你自己的路径)
\* :指定哪些用户可以访问
\* 所有可以ping同该主机的用户
192.168.3.* 指定网段,在该网段中的用户可以挂载
192.168.3.48 只有该用户能挂载
(rw,no_root_squash,async):权限
ro : 只读
rw : 读写
async : 同步
no_root_squash: 不降低root用户的权限
2.3.更新NFS导出文件系统列表
sudo exportfs -af
2.4.设置目录权限
sudo chmod 777 -R /home/wang/work/sync/nfs
复制rootfs下所有文件到此目录下
2.5.重启服务:
sudo /etc/init.d/rpcbind restart
sudo /etc/init.d/nfs-kernel-server restart
sudo showmount -e
2.5.测试:
在本机测试把共享目录挂到了/mnt/nfs目录
mkdir -p /mnt/nfs
sudo mount -t nfs 192.168.3.171:/home/wang/work/sync/nfs /mnt/nfs
其中192.168.3.171为nfs服务器ip
取消挂载用:
sudo umount /mnt/nfs
在开发板执行下面命令:
cat /proc/filesystems
若有一行为 nodev nfs,则开发板Linux内核支持NFS
如果用开发板上挂载,要加上参数-o nolock
mkdir -p /mnt/nfs
mount -t nfs -o nolock 192.168.3.171:/home/wang/work/sync/nfs /mnt/nfs
整理成自动执行脚本如下:
#!/bin/bash
sudo apt-get install nfs-kernel-server
sudo mv /etc/exports /etc/exports_old
sudo cp -fv ./exports /etc/exports
sudo exportfs -af
sudo chmod 777 -R /home/wang/work/sync/nfs
sudo /etc/init.d/nfs-kernel-server restart
sleep 1s
sudo showmount -e
export文件如下如下:
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/home/wang/work/sync/nfs *(rw,no_root_squash,async,no_subtree_check)
/home/wang/work/sync/nfs1 *(rw,no_root_squash,async,no_subtree_check)
3.配置Linux服务器为静态IP
不希望ip变化,所以可以设置为静态IP模式。
3.1 修改网卡接口配置文件
sudo gedit /etc/network/interfaces
打开网络配置文件做如下修改:
auto lo
iface lo inet loopback
#动态获取的配置:
# auto eth0
# iface eth0 inet dhcp
#静态分配的配置:
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1
配置为静态IP。
3.2 重启 Linux服务器
cat /etc/resolv.conf
如果不能上网,可以查看dns设置是都正确。
4.修改Linux内核配置,开启开发板Linux内核支持NFS
很多开发板linux内核都是默认关闭了nfs,必须打开重新编译
kernel\linux-4.4.y\arch\arm\configs\defconfig
linux kernel编译配置选项:
- 关闭initrd功能
# CONFIG_BLK_DEV_INITRD=y
# CONFIG_INITRAMFS_SOURCE=""
# CONFIG_RD_GZIP=y
# CONFIG_RD_BZIP2=y
# CONFIG_RD_LZMA=y
# CONFIG_RD_XZ=y
# CONFIG_RD_LZO=y
# CONFIG_RD_LZ4=y
- 打开IP_PNP配置网络支持
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
CONFIG_DNS_RESOLVER=y
- 打开NFS相关配置
CONFIG_NFS_V4=y
CONFIG_NFS_SWAP=y
CONFIG_NFS_V4_1=y
CONFIG_NFS_V4_2=y
CONFIG_PNFS_FILE_LAYOUT=y
CONFIG_PNFS_FLEXFILE_LAYOUT=m
CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
CONFIG_NFS_V4_1_MIGRATION=y
CONFIG_ROOT_NFS=y
CONFIG_NFS_USE_KERNEL_DNS=y
CONFIG_SUNRPC_GSS=y
CONFIG_SUNRPC_BACKCHANNEL=y
CONFIG_SUNRPC_SWAP=y
CONFIG_KEYS=y
CONFIG_ASSOCIATIVE_ARRAY=y
CONFIG_OID_REGISTRY=y
参考:https://www.cnblogs.com/AP0904225/p/7020527.html
重新编译Linux kernel.
5.修改uboot bootargs
配置目标板的MAC地址:
setenv ethaddr 08:67:4E:BD:25:31
配置目标板的IP地址 :
setenv ipaddr 192.168.3.48
配置目标板的子网掩码:
setenv netmask 255.255.255.0
配置目标板的网关:
setenv gatewayip 192.168.3.1
配置完成后使用ping 命令测试目标板的网络环境是否正确。
bootargs 参数增加红色部分,IP配置修改为自己平台IP值:
baudrate=115200
ipaddr=192.168.1.165
netmask=255.255.255.0
gatewayip=192.168.3.1
serverip=192.168.1.147
bootcmd=nand read 0x1FFFFC0 0x1000000 0x800000;bootm 0x1FFFFC0
bootargs_128M=mem=128M mmz=ddr,0,0,78M
bootdelay=0
stdin=serial
stdout=serial
stderr=serial
ethact=up
bootargs_1G=mem=1G mmz=ddr,0,0,380M
bootargs=console=ttyAMA0,115200 root=/dev/nfs rw nfsroot=192.168.3.58:/home/wang/work/sync/nfs ethmac=08:67:4E:BD:25:31 ip=192.168.3.25:192.168.3.58:192.168.3.1:255.255.255.0::eth0:off init=/linuxrc noinitrd blkdevparts=mmcblk0:2M(boot),1M(bootargs),1M(baseparam),1M(pqparam),1M(logo),1M(cfg),1M(cfgbak),8M(kernel),30M(rootfs),25M(loader),-(others)