NFS服务器搭建

实验搭建了NFS服务器

Samba 服务器可以用于 Linux 和 Windows 之间的文件共享,而 NFS 可以用于 Linux 之间的文件共享
以后肯定会用到的知识,做个笔记吧

搭建 NFS 服务器

注意: 为了客户端能够连接上服务器,记得防火墙方行或者关闭防火墙

软件安装

Arch Linux 只需要安装 nfs-utils

1
pacman -S nfs-utils

RHEL 需要 rpcbind, nfs-utils 两个软件

1
yum install rpcbind nfs-utils

创建共享目录

出于安全考虑,建议定义一个单独的目录为NFS根,这可以将用户限制在该挂载点中,绑定的挂载点(bind mounts)将文件系统上别处的目录与被分享的挂载点连接起来
此时就需要用到 mount 命令的 bind参数了

1
2
3
4
5
6
7
8
mkdir /music #共享目录
mkdir /movie #共享目录

mkdir /srv/nfs/music #NFS根目录
mkdir /srv/nfs/movie #NFS根目录

mount --bind /music /srv/nfs/music
mount --bind /movie /srv/nfs/movie

自动挂载共享目录,编辑 /etc/fstab

1
2
/music /srv/nfs/music  none   bind   0   0
/movie /srv/nfs/movie none bind 0 0

mount bind 命令

这也是我第一次知道这个参数的,在看了这个参数的描述后,发现这个方式来可以实现目录的”硬连接”,之所以硬链接打了引号,是因为目录不能做硬链接

众所周知,软连接可以对目录进行操作,但是软连接可以理解为 Windows 中的快捷方式,所以并不能实现从一个位置访问另外一个位置的文件的功能

但是,硬链接可以做到,然而硬链接只能对文件进行操作,不能对目录进行操作,当然,我们可以通过如下命令对一个目录下的所有的文件做硬链接

1
cp -l -r /foo /bar
  • cp 复制
  • -l 硬链接复制

虽然这样可以做到把一堆文件做到从 /foo 硬链接到 /bar 下,但是如果我对其中一个目录下的文件进行删除,或者创建新的文件,另外一个目录可以做到同步吗,答案是否定的,这时候 mount bind 就派上用场了

1
mount --bind /foo /bar

通过 --bind 参数,将 /bar 目录作为 /foo 目录的一个镜像目录
这就很容易理解了,名字描述的很清楚了,就是作为一个镜像,一个改变了,另外一个就跟着改变

这还不是 bind 的最好使用方法,在创建某一个目录的镜像后,它的挂载点中的文件就会被屏蔽掉,注意不是消失,而是被屏蔽了,消挂载后又会出现

通过这种方式,可以用来做测试操作,假如要对 /etc 下某文件进行修改测试,但是又怕改错了导致服务崩溃,这时就可以用 mount bind 了

1
2
cp -a /etc /tmp/etc
mount --bind /tmp/etc /etc
  • -a 保留链接、文件属性,并复制目录下的所有内容

此时对 /etc 下的任何修改都不会影响的原来的配置,因为原来的配置都被屏蔽了,现在的操作都是对 /tmp/etc 的文件进行操作
测试结束后,取消挂载,原 /etc 下的文件又会重新出现,没有做任何修改

1
umount /etc

通过 mount bind 来挂载共享目录可以将 NFS 的所有共享目录都在一个根 NFS 目录下
这样可以让程序运行起来更加安全,而且资源也更容易管理

编辑配置文件

NFS 的配置文件为 /etc/exports
配置的格式如下

1
/共享目录 [主机或域(权限)]

权限选项:

  • rw:读写
  • ro:只读
  • sync:同步模式,内存数据实时写入磁盘
  • async:非同步模式,它会每隔一段时间才会将数据刷新到磁盘
  • no_root_squash:客户端挂载NFS共享目录后,root用户不受约束,权限很大
  • root_squash:客户端上的root用户受到约束,被限定成某个普通用户
  • all_squash客户端上所有用户(包括root用户)在使用NFS共享目录时都被限定为一个普通用户
  • anonuid:定义被限定用户的uid
  • anongid:定义被限定用户的gid

example1:

1
/srv/nfs/music  192.168.1.0/24(rw,sync)

对于 /srv/nfs/music 目录,192.168.1.0/24 这个网段下的主机拥有读写权限,且内存数据实时写入磁盘

example2:

1
/srv/nfs/movie 192.168.2.0/24(ro,all_squash) nero(rw,sync,all_squash,anonuid=65534,anongid=65534)

对于 /srv/nfs/movie 目录,192.168.2.0/24 这个网段的主机拥有只读权限,且所有用户(包括root用户)在使用NFS共享目录时都被限定为一个普通用户
而 nero 这台主机拥有读写权限,所有用户(包括root用户)在使用NFS共享目录时都被限定为一个普通用户,并指定该普通用户的uid为65534,gid为65534

启用并运行服务

Arch Linux 运行如下命令

1
systemctl start nfs-server.service

RHEL 运行如下命令

1
2
3
systemctl start rpcbind  
systemctl start nfs-server
systemctl start nfs

客户端挂载 NFS 共享目录

安装客户端
Arch Linux 需要安装 nfs-utils

1
pacman -S nfs-utils

RHEL 也只需要安装 nfs-utils

1
yum install nfs-utils

挂载共享目录,假设服务器地址为 192.168.10.10/24

1
2
3
mkdir /music /movie
mount -t nfs 192.168.10.10:/srv/nfs/music /music
mount -t nfs 192.168.10.10:/srv/nfs/movie /movie

这样共享目录就被挂载到了客户端


两个文件共享系统都学了一些,这样以后的文件共享的方法又有了新的方式
对于一个仓鼠来讲,存储容量是一大要务,文件存储后的共享更是一大要务 ٩(ˊᗜˋ*)و