nfs服务器的搭建和使用
更新记录
version | status | description | date | author |
---|---|---|---|---|
V1.0 | C | Create Document | 2019.1.11 | John Wan |
status:
C―― Create,
A—— Add,
M—— Modify,
D—— Delete。
注:内核版本 3.0.15,系统版本 Ubuntu 12.04.2 LTS
1、nfs介绍
1.1 nfs概念
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的不同的机器、不同的操作系统共享彼此的文件,共享资源。在NFS的应用中,可将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,这样本地NFS的客户端应用可以透明地读写位于远端NFS服务器上共享的文件,就像访问本地文件一样。
-
好处:
以下是NFS最显而易见的好处:
- 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。
- 用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。
- 一些存储设备如软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。
-
组成:
NFS体系至少有两个主要部分:一台NFS服务器和若干台客户机。
客户机通过网络远程访问存放在NFS服务器上的数据。
在NFS服务器正式启用前,需要根据实际环境和需求,配置一些NFS参数。
1.2 nfs工作原理
NFS服务器的挂载结构图:
如上图示:
在NFS服务器设置好一个共享目录/home/public,其他有权访问NFS服务器的NFS客户端就可将该目录挂载到自己文件系统的某个挂载点,这个挂载点可以自己定义,如上图客户端A与客户端B挂载的目录就不相同。挂载好后客户端可在本地的挂载点看到服务端/home/public的所有数据,读、写、执行操作具体看服务器分配的权限。
可通过查看磁盘信息命令:“df –h”,查看挂载情况。
1.3 nfs通讯过程
图2:nfs通讯过程
NFS是通过网络来进行服务器端和客户端之间的数据传输,最初是由UDP协议实现的,主要用于局域网(LAN),丢包重传的概率很小。但是随着发展,NFS已经不只使用在局域网中,更广泛地使用在广域网(WAN)中,这种情况下,主要使用的协议为TCP,TCP可以使得文件的操作更快。
注:在迅为iTop4412的教程中,使用的NFS与参考资料中不相同,目前只是记录学迅为的过程。
2、搭建和测试 NFS 服务器
2.1 搭建NFS服务器
2.1.1 下载并安装NFS服务器
在确保联网的情况下,下载并安装 nfs-kernel-server
。
apt-get install nfs-kernel-server
2.1.2 修改NFS参数
在 /etc/exports
文件最后一行添加 /home/work/ *(rw,sync,no_root_squash)
,各参数含义:
/home/work | 要共享的目录 |
---|---|
* | 代表允许所有的网络段访问 |
rw | 可读写权限 |
sync | 资料同步写入内存和硬盘 |
no_root_squash: | 是Ubuntu nfs 客户端分享目录使用者的权限,如果客户端使用的是root 用户,那么对于该共享目录而言,该客户端就具有root 权限; |
其它参数:
ro:只读访问
async :nfs 在写入数据前可以相应请求
secure: nfs 通过以下的安全TCP/IP 端口发送
insecure: nfs 通过1024 以上的端口发送
wdelay:如果多个用户要写入NFS 目录,则归组(默认)
no_wdelay:如果多个用户要写入NFS 目录,则立即写入,当使用async 时,无需此设置
hide:在nfs 共享目录中不共享妻子目录
no_hide:共享nfs 目录的子目录
subtree_check:如果共享/usr/bin 之类的子目录时,强制nfs 检查父目录的权限(默认)
no_subtree_check:和上面相对,不检查父目录权限
all_squash:共享文件的UID 和GID 映射匿名用户anonymous,适合公用目录
no_all_squash:保留共享文件的UID 和GID(默认)
root_squash root:用户的所有请求映射成如anonymous 用户一样的权限(默认)
no_root_squash root:用户具有根目录的完全管理访问权限
anonuid=xxx:指定nfs 服务器/etc/passwd 文件中匿名用户多的UID
anongid=xxx:指定nfs 服务器/etc/passwd 文件中匿名用户的GID
2.1.3 重启portmap服务
$service portmap restart 或者 $/etc/init.d/portmap restart
2.1.4 重启 nfs 服务
$service nfs-kernel-server restart 或者 $/etc/init.d/nfs-kernel-server restart
2.1.5 portmap与nfs服务启动、停止、查看
启动NFS服务器,需要启动portmap和nfs两个服务,并且portmap一定要先于nfs启动;
停止NFS服务器,先停止NFS服务,再停止portmap服务(系统中无其他服务需要使用portmap时)。
启动:
$service portmap start 或者 $/etc/init.d/portmap start
$service nfs-kernel-server start 或者 $/etc/init.d/nfs-kernel-server start
查看:
$service portmap status
$service nfs-kernel-server status
停止:
$service portmap stop
$service nfs-kernel-server stop
2.1.6 portmap与nfs服务自动启动
为了下次在重新启动系统时,NFS服务能够自动运行,可以使用checkconfig命令来进行设置。
首先检查NFS和portmap服务启动时的运行等级,执行命令:
$chkconfig --list portmap
结果:portmap 0:关闭 1:关闭 2:关闭 3:启动 4:启动 5:启动 6:关闭
$chkconfig --list nfs
结果:nfs 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
即:portmap启动的运行等级为3,4,5,而nfs在任何运行等级中都不会执行。为了让nfs在系统运行级别为3,4,5时也能自动运行,可使用下面的命令进行设置:
$chkconfig --level 345 nfs on
2.2 测试NFS服务器
前面nfs服务已经配置完成,设置了 /home/minilinux
为共享目录。
挂载命令:"mount -t nfs localhost:/home/minilinux /mnt"
,localhost
指明本机。
卸载命令:"umount /home/minilinux /mnt"
。
查看:"df" 或 "df -h"
。
文件目录结构:
root@ubuntu:/# ls /home
minilinux topeet
root@ubuntu:/# ls /mnt
hgfs
root@ubuntu:/# ls /home/minilinux/
busybox-1.22.1 system system.img
root@ubuntu:/# ls /home/minilinux/system
bin dev etc lib linuxrc mnt proc sbin sys tmp usr var
2.2.1 将 /home/minilinux
挂载到 /mnt
目录下
root@ubuntu:/# mount -t nfs localhost:/home/minilinux/ /mnt
root@ubuntu:/# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 60894268 10281032 47519988 18% /
udev 1876528 4 1876524 1% /dev
tmpfs 754320 812 753508 1% /run
none 5120 0 5120 0% /run/lock
none 1885796 200 1885596 1% /run/shm
localhost:/home/minilinux/ 60894720 10281472 47520256 18% /mnt
root@ubuntu:/# ls /mnt
busybox-1.22.1 system system.img
root@ubuntu:/# cd /mnt
root@ubuntu:/mnt# ls
busybox-1.22.1 system system.img
root@ubuntu:/mnt# mkdir helloword
root@ubuntu:/mnt# ls
busybox-1.22.1 helloword system system.img
root@ubuntu:/mnt# ls /home/minilinux/
busybox-1.22.1 helloword system system.img
从上面可看到挂载成功之后,在 /mnt
可查看和操作 /home/minilinux
中的文件。
2.2.2 将 /home
挂载到 /mnt
目录下
root@ubuntu:/# mount -t nfs localhost:/home /mnt
root@ubuntu:/# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 60894268 10281036 47519984 18% /
udev 1876528 4 1876524 1% /dev
tmpfs 754320 812 753508 1% /run
none 5120 0 5120 0% /run/lock
none 1885796 200 1885596 1% /run/shm
localhost:/home 60894720 10281472 47520256 18% /mnt
root@ubuntu:/# ls /mnt
minilinux
从上面可看到挂载成功之后,如果挂载的文件目录层级比指定的共享目录层级高,那么只能操作指定的共享目录。
2.2.3 将 /home/minilinux/system
挂载到 /mnt
目录下
root@ubuntu:/# mount -t nfs localhost:/home/minilinux/system /mnt
root@ubuntu:/# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 60894268 10281036 47519984 18% /
udev 1876528 4 1876524 1% /dev
tmpfs 754320 812 753508 1% /run
none 5120 0 5120 0% /run/lock
none 1885796 200 1885596 1% /run/shm
localhost:/home/minilinux/system 60894720 10281472 47520256 18% /mnt
root@ubuntu:/# ls /mnt
bin dev etc lib linuxrc mnt proc sbin sys tmp usr var
从上面可看到挂载成功之后,如果挂载的文件目录层级比指定的共享目录层级低,那么只能操作挂载的文件目录。
3、在线调试:NFS共享目录
通过 NFS 服务,可以实现在线调试文件系统或应用程序,开发板可直接访问PC上的文件,而不用烧写到开发板的额MMC中再执行。极大的提高了调试效率。
前面已经了解了如何在搭建NFS服务器,那么接下来需要配置好一个开启了nfs服务并能通过网络访问NFS服务器的内核,并将其编译烧录到开发板中,这样就能够在开发板上通过NFS服务直接访问PC上的文件。
3.1 配置内核
3.1.1 设备内核参数
将迅为的内核源码(iTop4412_Kernel_3.0_20170719.tar.gz)拷贝到Ubuntu中,并解压。
解压命令:"tar -xzvf 文件名"
在解压的文件中执行:"cp config_for_linux_scp_elite .config"
,根据买的板子型号进行选择,我的是精英板SCP封装。
执行:"make menuconfig"
命令,进行配置。
-
Networking support -->
Networking options ---> "
[*] IP: kernel level autoconfiguration
IP: kernel level autoconfiguration:内核启动时自动配置IP地址、路由表等,需要从网络启动的无盘工作站需要这个,普通用户不需要。
- File systems --->
[*] Network File Systems --->
<*> NFS client support
[*] NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
[*] NFS client support for NFS version 4
[*] NFS client support for NFSv4.1 (EXPERIMENTAL)
[*] Root file system on NFS
开启内核中NFS相关服务。
- 编译内核:执行
"make zImage"
,生成的镜像文件在"./arch/arm/boot"
中。
3.1.2 烧写内核
参考烧写内核章节
3.2 挂载 nfs 目录
首先查看板子的IP,需保证板子的IP与PC处于同一网段。
IP查看:"ifconfig"
,IP改写:"vi /etc/eth0-setting"
。修改之后要重新确认是否已经改过来,如果未改,重启网卡或重启开发板。
挂载目录:"mount -t nfs -o nolock 192.168.1.103:/home/minilinux/system /mnt"
mount -t nfs -o nolock 192.168.1.103:/home/minilinux/system /mnt
1.将NFS服务器的共享文件(192.168.1.103:/home/minilinux/system)挂载到 /mnt 上。
2."-o nolock" 参数:
nfs mount 默认选项包括文件锁,依赖于portmap提供的动态端口分配功能。
解决方法:kill 文件锁(lockd)或者 mount -o nolock
[root@FORLINX6410]# mount -t nfs 192.168.0.1:/home/hellolinux/rootfs /mnt/nfs
svc: failed to register lockdv1 RPC service (errno 111).
mount: mounting 192.168.0.1:/home/hellolinux/rootfs on /mnt/nfs failed: Connection refused
查看挂载情况:"df"
。
至此,开发板可以直接访问PC的文件,那么之后在调试时,只要将编译好的文件放入共享的目录中,在开发板上就能够直接进行执行或加载,无需再执行下载到开发板上的操作了。
以上是手动挂载,如何实现自动挂载呢?
3.3 内核启动自动挂载nfs目录
通过修改 /etc/init.d/rcS
文件,使得内核启动时,自动运行我们的命令。
打开开发板的 /etc/init.d/rcS
文件,在文末添加
ifconfig eth0 192.168.1.230 up
mount -t nfs -o nolock 192.168.1.103:/home/minilinux/system /mnt
- 第一句是使开发板的IP固定,而不用每次都去ifconfig
- 第二句,也就是前面手动挂载的命令。放到该文件中,内核启动时,自动运行。
注意:可能出现在开发板上手动mount可以,但自动加载不行的情况,那么在添加mount命令之前添加了 "sleep 5" 这条命令,可能是系统启动时,有些网络服务还未稳定。
参考:
- TCP/IP协议学习之六(RPC原理以及NFS协议)
- NFS笔记(一)NFS服务器工作原理及详细配置
- 迅为iTop4412精英板—linux系统编程—视频10、11
- 迅为独立文档和程序源码汇总—关于nfs那几篇文档
- 关于在开发板中实现NFS自动挂载的问题