Linux中NFS服务器的配置(/etc/export)

本文转载于NFS /etc/exports参数解释,有修改。

问题引入

之前利用NFS从ubuntu中下载根文件系统到开发板(见博客以NFS方式挂载rootfs的设置方法),但只是遵照教程安装的,对里面的设置含义不是很清楚。后来在开发板上上进行文件的创建与修改,数据居然同步到 ubuntu 中的文件夹里。NFS不是只把根文件系统下载到开发板吗?下载之后,开发板上的根文件系统就和ubuntu中的NFS服务器没有关系,为何这里还挂载了?带着疑问,我重新查看了NFS的配置过程,对里面的步骤含义进行了了解。

NFS服务器的功能

NFS 服务器,可以看作是一个文件服务器。NFS 客户端通过网络,将远端NFS服务器共享出来的目录挂载到自己的系统中。在 NFS 客户端看来,NFS服务器的远端文件就像客户端的本地文件一样。

NFS 本身没有提供信息传输的协议和功能,但它借用了一些其他的传输协议,这些传输协议要用到RPC功能,因此不论是NFS服务器还是NFS客户端,只要用到 NFS 的地方都要启动RPC 服务,这样服务器和客户端才能通过RPC来传输数据。

NFS服务器的配置

假设ubutun系统的局域网IP:192.168.1.141

1、安装NFS服务器

sudo apt install nfs-kernel-server
sudo apt install nfs-common

2、编辑配置文件/etc/exports

(1)通过vim /etc/exports 来编辑配置文件

# 编辑格式
# NFS服务器里你想分享的目录的具体路径 可接入NFS服务器的主机名字或者IP(参数1,2,…)# 举例(注意*表示所有主机)
/root/share/ 192.168.1.2(rw,insecure,sync,all_squash) 
/home/xjh/iot/embedded_basic/rootfs/roofs_xjh *(rw,insecure,sync,all_squash) 

(2)参数含义说明

参数含义
Ro该主机对该共享目录有只读权限
Rw该主机对该共享目录有读写权限
Root_squash客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
No_root_squash客户机用root访问该共享文件夹时,不映射root用户
All_squash客户机上的任何用户访问该共享目录时都映射成匿名用户
Anonuid将客户机上的用户映射成指定的本地用户ID的用户
Anongid将客户机上的用户映射成属于指定的本地用户组ID
Sync资料同步写入到内存与硬盘中
Async资料会先暂存于内存中,而非直接写入硬盘
 Insecure允许从这台机器过来的非授权访问
subtree_check如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check和上面相对,不检查父目录权限
wdelay如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide在NFS共享目录中不共享其子目录
no_hide共享NFS目录的子目录
secureNFS通过1024以下的安全TCP/IP端口发送
insecureNFS通过1024以上的端口发送

(3)举例说明

/ user01(rw) user02(rw,no_root_squash)

表示共享服务器上的根目录(/)只有user01和user02两台主机可以访问,且有读写权限。

user01主机用root用户身份访问时,将客户机的root用户映射成服务器上的匿名用户(root_squash,该参数为缺省参数),相当于在服务器使用nobody用户访问目录。

user02主机用root用户身份访问该共享目录时,不映射root用户(no_root_squash),即相当于在服务器上用root身份访问该目录。

/root/share/ 192.168.1.2(rw,insecure,sync,all_squash)

表示共享服务器上的/root/share/目录只有192.168.1.2主机可以访问,且有读写权限。

此主机用任何身份访问时,将客户机的用户都映射成服务器上的匿名用户(all_squash),相当于在服务器上用nobody用户访问该目录(若客户机要在该共享目录上执行写操作,则服务器上的nobody用户对该目录必须有写的权限)。

/home/ylw/ .test.com (rw,insecure,sync,all_squash)

表示共享/home/ylw/目录,.test.com域中所有的主机都可以访问该目录,且有读写权限。

/home/share/ .test.com (ro,sync,all_squash,anonuid=zh3,anongid=wa4)

表示共享目录/home/share/,*.test.com域中的所有主机都可以访问,但只有只读的权限,所有用户都映射成服务器上的uid为zh3、gid为wa4的用户。

3、重启NFS服务

sudo service nfs-kernel-server restart

附录:常用的命令

(1)修改后将配置文件中的目录全部重新export(和重启效果一样)

sudo exportfs -rv

 (2)查看有NFS服务器设置了哪些共享目录

sudo showmount -e localhost
//或者sudo showmount -e 127.0.0.1
//或者sudo showmount -e 192.168.1.141

(3)将NFS服务器某共享目录挂载在NFS客户端的某目录

sudo mount -t nfs 192.168.1.141:/home/xjh/iot/embedded_basic/rootfs/tmp /mnt

(4)umount 命令取消挂载(使用格式待求证)

sudo umount 192.168.1.141:/home/xjh/iot/embedded_basic/rootfs/tmp
或者
sudo umount 192.168.1.88:/mnt
或者
sudo umount 192.168.1.141:/home/xjh/iot/embedded_basic/rootfs/tmp 192.168.1.88:/mnt

(4)查看NFS的运行状态

sudo nfsstat

(5)查看rpc执行信息,可以用于检测rpc运行情况

sudo rpcinfo

(6)查看网络端口(NFS默认是使用111端口)

sudo netstat -tu -4

NFS客户端的配置

注意以下操作是在NFS客户端进行操作。

1、安装nfs-common软件包

sudo apt install nfs-common

2、查看NFS服务器上的共享目录

NFS服务器和NFS客户端能够ping通时,可以在NFS客户端输入下面命令查看NFS服务器(192.168.1.141)设置了哪些共享目录。

sudo showmount -e 192.168.1.141

如果不能ping通,那只能在NFS服务器输入下面的命令查看NFS服务器设置了哪些共享目录。

sudo showmount -e 192.168.1.141 
//或者 sudo showmount -e localhost
//或者 sudo showmount -e 127.0.0。1

127.0.01表示本主机,另外localhost这个符号也表示本主机,在/etc/hosts中如此定义:

127.0.0.1   localhost

而之前我在/etc/network/interfaces中将如此设置,则192.168.1.141也表示本机:

# interfaces(6) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopbackauto eth0
iface eth0 inet static
#iface eth0 inet dhcp
address 192.168.1.141
netmask 255.255.255.0
gateway 192.168.1.1

所以localhost、127.0.0.1、192.168.1.141所指的都是NFS客户端,因此:

root@ubuntu:/# sudo showmount -e 127.0.0.1         //方式1
Export list for 127.0.0.1:
/home/xjh/iot/embedded_basic/rootfs/tmp        *
/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh *
/home/xjh/iot/hisi_development/hisi_rootfs     *
root@ubuntu:/# sudo showmount -e 192.168.1.141     //方式2
Export list for 192.168.1.141:
/home/xjh/iot/embedded_basic/rootfs/tmp        *
/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh *
/home/xjh/iot/hisi_development/hisi_rootfs     *
root@ubuntu:/# sudo showmount -e localhost         //方式3
Export list for localhost:
/home/xjh/iot/embedded_basic/rootfs/tmp        *
/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh *
/home/xjh/iot/hisi_development/hisi_rootfs     *
root@ubuntu:/#

3、将NFS服务器上的某个共享目录挂载在NFS客户端目录

比如将NFS服务器上的共享目录/home/xjh/iot/embedded_basic/rootfs/tmp,挂载到NFS客户端的/mnt目录:

sudo mount -t nfs 192.168.1.141:/home/xjh/iot/embedded_basic/rootfs/tmp /mnt

4、查看挂载状态

在NFS客户端命令行输入以下指令查看挂载状态。

mount | grep nfs 

5、测试

通过NFS客户端的/mnt目录,可以查看NFS服务器上的共享目录/home/xjh/iot/embedded_basic/rootfs/tmp中的内容。

问题解决

我的目的是,让开发板通过NFS下载根文件系统之后,就断开与ubuntu中的根文件系统的关联,这样在开发板上目录上修改数据,不会同步到ubuntu中的根文件系统的文件夹里。

我没有在开发板系统上安装NFS客户端,只是在内核配置阶段配置了NFS相关的内容(见本文开始部分的链接博客),不知道这个配置与安装NFS客户端有什么关联?

通过在ubuntu的etc/exports文件中输入以下内容后,可以顺利下载根文件系统到开发板。这体现了可以利用NFS进行文件下载。

但是下载之后,/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh居然挂载在了开发板的根目录上(体现在开发板的数据与此目录下的数据同步)。NFS也提供挂载吗?还是说哪里使用了mount指令?如果某个地方使用了挂载mount指令,那么按理我可以取消这个挂载的。

我在根文件系统里的etc/profile里,取消将/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh挂载到开发板。但不知道是因为命令格式不对,还是这个挂载的特殊性,提示没有/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh这个文件或者目录。

于是我在开发板的命令行中输入umount /,成功后想看下在开发板创建文件是否还会影响ubuntu中的文件夹形式的根文件系统。但是此时提示:

[root@xjh ]# umount /
[root@xjh ]# ls
bin      etc      lib      mnt      root     sys      usr
dev      home     linuxrc  proc     sbin     tmp      var
[root@xjh ]# mkdir test
mkdir: can't create directory 'test': Read-only file system

于是我想把开发板的根目录挂载到/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh,但提示如下。

[root@xjh mnt]# mount / 192.168.1.141:/home/xjh/iot/embedded_basic/rootfs/rootfs
_xjh
mount: mounting / on 192.168.1.141:/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh failed: No such file or directory

折腾比较闹心,因为对mount命令的使用格式不熟悉,以及对根文件根目录是否有特殊性不了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cocos2d 很水很水的看法

这几天接了个扯淡的项目 cocos2d的 。 本来以为是Cpp的, 结果不是2dx ,而是OC的2d。看了几天的官方的dome ,大概知道是什么样子的。我就简单的纪录一下好了: cocos2d的整个框架呢, 分为3层 — 类似舞台剧 演戏嘛 肯定有个boss的 …

详解EBS接口开发之采购申请导入

更多内容可以参考我的博客 详解EBS接口开发之采购订单导入 http://blog.csdn.net/cai_xingyun/article/details/17114697 /*--将数据写入至采购申请接口表*/PROCEDURE insert_procure_main(errbuf OUT NOCOPY VARCHAR2,retcode OUT NOCOPY VARCHAR2)…

sys文件系统

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 前言 Linux2.6版本的内核引入了sys文件系统。 在 proc文件系统介绍和使用 中,介绍了sys文件系统与proc文件系统的差异。它们都是虚拟文件系统,都是内核中的数据结构的可视化接口。它…

spring mvc 配置解析之xml

2019独角兽企业重金招聘Python工程师标准>>> ##mvc.xml中可配置的元素## 既然是xml,当然是要遵循schema的规定. 那么schema文件在哪呢? 定位方法就是解开这个jar文件,找到META-INF/spring.schema文件,这是个文本文件,里面包含了namespace以及其对应的xsd文件的位置…

IOS-UITextField类

文字属性 text placeholder   //默认使用70%灰色 font textColor textAlignment 文字大小 adjustsFontSizeToFitWidth minimumFontSize 编辑行为 editing     //是否正在编辑(read-only) clearsOnBeginEditing 展现形态 borderStyle     //默认UITextBord…

tree命令:以树的形式列出目录中的文件

在linux命令行中,输入“man 1 tree”可以得知tree命令的用法。 这里讲解几个常用的选项。 tree -L level_num :Max display depth of the directory tree. 比如“tree -L 1”,表示深度为1层。 rootubuntu:/sys# ls block bus class de…

JDBC学习笔记——事务、存储过程以及批量处理

2019独角兽企业重金招聘Python工程师标准>>> 1、事务 1.1、事务的基本概念和使用示例 数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完整…

验证码识别笔记(二)

这是验证码识别的第二篇,先看一下样图吧,就是下面那张。 看到这张图片,直观上就知道比第一篇中的要简单,这个“简单”用语言来描述,可以得到下面的几条结论: 1. 图片中的字符边界比较清晰,并且单…

dd命令:用于读取、转换并输出数据

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 命令作用 从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。 参数说明 if文件名:输入文件名,默认为标准输入。即指定源文…

centos6.5下搭建oracle 11g

为什么80%的码农都做不了架构师?>>> 安装依赖 yum install binutils compat-libstdc-33 compat-libstdc-33.i686 \ elfutils-libelf elfutils-libelf-devel gcc gcc-c glibc glibc.i686 \ glibc-common glibc-devel glibc-devel.i686 glibc-headers ksh…

Unix基本系统数据类型和stat结构体

Unix基本系统数据类型 历史上,某些UNIX变量已与某些C数据类型联系在一起,例如,历史上主、次设备号存放在一个1 6位的短整型中, 8位表示主设备号,另外8位表示次设备号。但是,很多较大的系统需要用多于256个值…

回环设备(/dev/loop*)与losetup命令

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 一、前言 之前曾利用losetup命令进行根文件系统镜像文件的制作,但不明白其命令含义。 二、回环设备 命名方式 回环设备一般以 /dev/loop* 方式命名。 回环设备的含义 回环设备是一种伪设备&#…

oracle中游标的使用

1)--- 使用带参数的游标;declareCURSOR stock_cur(symbol_in VARCHAR2) IS SELECT * FROM rate_combine_nr nr WHERE nr.combine_nosymbol_in;stock_info stock_cur%ROWTYPE; beginOPEN stock_cur(G600000001); --打开游标;loop FETCH stock_cur INTO stock_inf…

JS 学习笔记--11---内置对象(Global/Math)

练习中使用的浏览器是IE10,如果各位朋友有不同意见或者遇到浏览器不兼容问题,希望指正 1、内置对象的定义:有ECMAScript实现提供的、不依赖与宿主环境的对象,在ECMAScript运行之前就已经创建好的对象就叫做内置对象。就是说&…

SQL Server 视图设计器

SQL Server 中经常需要写一些查询,关联好多张表,显示无数个列。如果使用视图设计器,可以大大提高效率,同是减少差错。1. 启动视图设计器为数据库“新建视图”,将启用视图设计器。2. 添加表在起始界面,将出现…

Linux系统的目录树

更多详细内容,见Linux目录树详解(转)_peniel_shen的博客-CSDN博客 Linux系统的目录树: rootubuntu:/# tree -L 1 . ├── bin //保存系统自身启动和运行时可能会用到的核心二进制程序。 ├── boot //保存系统引导启动时要…

Android 4 学习(19):Services

参考《Professional Android 4 Development》 Services Service是invisible的,因此其优先级不高于visible的Activity,之所以说不高于,是因为我们可以设置Service为在前台运行。 创建Service Android提供了Service抽象类,继承它便可…

ACL权限设定

1.ACL(Access Control List)可以针对单一使用者、单一档案或目录来进行r、w、x的权限规范。ACL主要针对以下方面来控制权限:1)使用者:可以针对使用者。来设定权限2)群组:针对群组为对象来设定其…

misc类设备驱动1——板载蜂鸣器驱动测试

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、驱动部分 1、前言 九鼎移植的内核已经提供了蜂鸣器驱动源码(在SI中搜索关键字buzzer,发现出现有x210-buzzer.c文件;或者在make menuconfig界面搜索buzzer&am…

【微信开发】上传下载多媒体文件

最近一段时间,开始入手了微信开发。感觉挺有意思的,虽然目前还是遇到了许多解决不了的问题。上传下载多媒体文件,这个作为高级接口的一部分功能,可能使用的人并不多,所以现在网上关于这个接口的使用教程很少。于是我就…