Ubuntu16.04搭建NFS 文件共享服务器的方法

发布时间:2025-05-17 点击:12
服务器
nfs 即 网络文件系统 (network file system),是一种 分布式 文件系统协议,该协议允许客户端主机可以像访问本地文件系统一样通过网络访问服务器端文件,即可以将远程服务器文件直接 mount ( 挂载 )到本地的文件目录结构中进行访问。
一、软件安装
服务器端需要安装 nfs-kernel-server 软件包:
$ sudo apt-get update $ sudo apt-get install nfs-kernel-server二、服务器配置
默认情况下,nfs 服务器上定义了某个共享目录,则该目录及其子目录下的所有文件都可被访问。
出于对安全的考虑,客户端任何需要 超级用户 (即 root 用户,uid=0 & gid=0)权限的文件操作都默认映射到 uid=65534 和 gid=65534 的用户,即 ubuntu 系统中的 nobody:nogroup。
例如客户端使用 root 权限在挂载的共享目录中创建文件时,该文件的 属主 和 属组 自动变为 nobody:nogroup ,而非 root:root 。
1. 在服务器端创建共享目录
sudo mkdir -p /var/nfs/gernel sudo mkdir -p /var/nfs/public sudo chown nobody:nogroup /var/nfs/gernel2. 修改 exports 文件
为了使 nfs 服务器定义的共享文件可被指定的客户端主机访问,需要在服务器端的 /etc/exports 文件中添加对应的记录。
该文件的格式如下:
directory host(options ...) host(options) #comment 关于 /etc/exports 文件的详细语法格式可参考 man exports 。
文件示例:
/var/nfs/gernel 192.168.56.0/24(rw,insecure,sync,no_subtree_check)/var/nfs/public *(ro,insecure,sync,no_subtree_check)/home/starky 192.168.56.1(rw,insecure,no_root_squash,sync,no_subtree_check)第一条纪录表示 192.168.56.0/24 子网 中的所有主机都可挂载 var/nfs/gernel 目录并拥有读写( rw )权限
第二条纪录表示 所有 主机都可挂载 /var/nfs/public 目录且拥有 只读 ( ro )权限
第三条纪录表示客户端 ip 地址为 192.168.56.1 的主机可以挂载 /home/starky 目录并拥有 读写 权限,而且任何 root 权限(uid=0 , gid=0)的文件操作都不默认映射给 nobody:nogroup,而保持属主(组)仍为 root( no_root_squash )
insecure选项:允许通过任意端口的远程访问
sync选项:强制 nfs 服务器在响应请求之前将文件的改动写入磁盘(强调客户端和服务端文件内容的一致性,但会降低文件操作的效率)。
no_subtree_check选项:禁用 subtree_check 。subtree_check 用来设置服务器在收到请求时,检查该文件是否在指定目录结构中依旧可用(该选项会在某些情况下发生错误:重命名某文件的同时,该文件在客户端打开)。
三、客户端挂载共享目录
列出 nfs 服务器上的共享目录
$ showmount -e 192.168.56.102exports list on 192.168.56.102:/home/starky 192.168.56.1/var/nfs/public */var/nfs/gernel 192.168.56.0/24创建挂载点
sudo mkdir -p /mnt/nfs/gernel sudo mkdir -p /mnt/nfs/public sudo mkdir -p /mnt/nfs/starky挂载远程目录
sudo mount 192.168.56.102:/var/nfs/gernel /mnt/nfs/gernel sudo mount 192.168.56.102:/var/nfs/public /mnt/nfs/public sudo mount 192.168.56.102:/home/starky /mnt/nfs/starky权限测试
如截图所示:
nfs 权限测试
nfs 的权限设定基于 linux 文件系统的权限管理,即客户端挂载远程共享目录后,会把它们当成本地磁盘目录一样对待,也是根据文件的属主(组)及其对应的权限设定来限制访问。
gernel 目录的属主(组)为 nobody:nogroup(65534:65534),所以虽然该目录为读写权限,非 root 用户无法执行新建操作。而 root 用户由于 nfs 默认的安全机制,会自动映射到 nobody:nogroup。
由于我在客户端和服务端都有一个名为 starky 的用户,且它们的 uid:gid 都为1000:1000,所以服务端的 /home/starky 目录可以直接被客户端的 starky 用户访问。且由于 no_root_squash 选项,通过 sudo 命令创建的文件其属主仍为 root(而不会再映射为 nobody)。
当然这会导致一些安全问题,比如多个客户端同时都有 uid(gid)为1000的用户(不管用户名是什么),则这些用户会共享服务端 /home/starky 目录里的文件权限。
四、系统启动时自动挂载共享目录
可编辑 /etc/fstab 文件令挂载共享目录的 mount 操作成为系统的固定配置(手动输入的 mount 命令属于临时挂载,重启会自动卸载),使得系统重启后可以自动挂载远程文件系统。 /etc/fstab 文件的示例内容如下:
# filesystem mountpoint fstype flags dump fsck192.168.56.102:/var/nfs/gernel /mnt/nfs/gernel nfs rw,bg,intr,hard,nodev,nosuid 0 0192.168.56.102:/var/nfs/public /mnt/nfs/public nfs4 ro,bg,intr,soft,nodev,nosuid 0 0192.168.56.102:/home/starky /mnt/nfs/starky nfs rw,bg,intr,hard,nodev,nosuid 0 0附录:附录:
1. /etc/exports 文件中的 host 格式
/etc/exports 文件的格式为: directory host(options ...) host(options) #comment
其中的 host 项用来指定可访问对应共享目录的主机,其格式可分为以下几种:
单个主机
host 项可以为一个或多个单独的 tcp/ip 主机名或 ip 地址
adminadmin.starky.net192.168.56.101ip 子网
10.0.0.0/255.0.0.0 172.16.0.0/255.255.0.0192.168.56.0/24tcp/ip 域
通过使用 通配符 ,可以指定某个特定域中的全部或部分主机
*.starky.net*craft.starky.net???.starky.netnis 组
可以指定某个 nis 组中所有主机的访问权限,使用 @group
2. /etc/exports 文件中的 options
选项描述 ro
只读权限
rw
读写权限(默认)
rw=list
通过list指定具有写权限的客户端主机,其他主机则为只读权限
root_squash
将 uid 0 和 gid 0 映射到 anonuid 和 anongid(即 ubuntu 系统中的 nobody 和 nogroup)
no_root_squash
允许需要 root 权限的文件操作,有安全风险
all_squash
将所有的 uid 和 gid 映射到它们的匿名形式,主要针对不信任的主机
anonuid=xxx
指定客户端 root 权限的操作需要映射到的 uid(默认是65534)
anongid=xxx
指定客户端 root 权限的操作需要映射到的 gid(默认是65534)
insecure
允许通过任意端口的远程访问
async

是不是所有的老域名都有价值?什么样的老域名才有价值?
一台云服务器主机多少钱
php什么时候使用闭包
正确的企业邮箱格式怎么写?
服务器买腾讯云还是阿里云便宜
云服务器ecs使用教程
全民阅读时代 京东图书超级品类日战报出炉
打开空白,帮看下-虚拟主机/数据库问题