Linux连接(NFS)群晖NAS遇到的问题(最终选SetGID+umask)

 

前言公司在寻找存储服务器,分布式太贵,后来找来厂家提供服务器(群晖机架存储服务器)试用一段时间,效果可以的话再买更高型号的来用,此文章记录整个过程,可能比较杂,等以后有时间再来整理吧。

需求想要在服务器之间共同访问并操作这里的存储,并且还要再Windows上查看(Windows上要想也执行增删改,得在win上连NFS,因为不方便管理这里pass掉)。

实际情况分析:客户端类型:CentOS、Ubuntu、Windows(注:每台服务器上都有多个账号,这点很重要也是遇到的最主要的问题之一),根据需求只要Linux间实现权限统一并赋予对应账号的读写权限就好了,Windows端(SMB协议连接)只读就好。

 操作:

1.1、设置并挂载存储

拿到服务器后,第一时间在群晖中配置 NFS作为服务器间的共享,并进行测速。

(NFS(Network File System,网络文件系统)是Unix系统族中的一个分布式文件系统协议,广泛用于Linux和Unix操作系统之间共享文件和目录。)

① NFS挂载:

Linux挂载NFS也很简单mount -t nfs <NAS的IP>:<群晖上对应的路径>  <Linux上的挂载路径>

示例:mount -t nfs 192.168.123.22:/volume1/test /data/testnfs

根据后边的改动会改成(增加acls的管控:mount -t nfs -o acl 192.168.123.22:/volume1/test /data/testnfs

注:如果没装nfs相关程序需要装下:

sudo apt-get update
sudo apt-get install nfs-common

 

② NFS测速:

(dd命令是一个用于在Linux或Unix系统中执行低级别I/O操作的工具。它允许用户以指定块大小从输入源复制数据,并将数据写入输出目标。其主要的作用就是转换和复制文件。)

 ① 开始测试:

   1.测/目录所在磁盘的纯写速度:

time dd if=/dev/zero bs=1024 count=1000000 of=/1Gb.file

  2.测/目录所在磁盘的纯读速度:

time dd if=/1Gb.file bs=64k |dd of=/dev/null

  3.测读写速度:

time dd if=/1Gb.file of=/data0/2.Gb.file bs=64k

  理论上复制量越大测试越准确。

② 命令解释:

time有计时作用,dd用于复制,从if读出,写到of
if=/dev/zero不产生IO,因此可以用来测试纯写速度。
同理of
=/dev/null不产生IO,可以用来测试纯读速度。
bs是每次读或写的大小,即一个块的大小,count是读写块的数量。

 

③ 参考:

  - Linux转换和复制(dd命令):https://juejin.cn/post/7337882838846242850

  - Linux使用dd命令测试磁盘读写速度和性能:

    https://blog.csdn.net/zsx0728/article/details/125994109

    https://www.cnblogs.com/parody/p/9938932.html

 

1.2、问题:

好的,不出意外的话,这时候出现了问题~~ 

由于是多终端并且多账号,NFS权限管理不到这么细(NFS实现多服务器共同增删改查同一个文件的话,需要每台服务器上账号的uid是一样的(/etc/passwd文件中有,修改方法我写在下边,注意这里先不用改!!!)。

这里没办法实现uid相同 因为每台服务器上都有多个账号,最多做到gid相同,那就试下通过gid来控制权限吧!

 

1.3、修改用户GID

① 知识点:

gid相关的基本概念:

  - GID: Group ID,标识用户所属组的唯一编号。
  - 主组: (也叫初始组)用户创建时自动分配的组,通常是与用户名相同的组。
  - 附加组: 用户可以是其他多个组的成员。

 

关于/etc/passwd文件(与此无关只是看到了像记录一下~):

   "x" 表示此用户设有密码,但不是真正的密码,Linux系统把真正的加密密码串保存在 /etc/shadow 文件中,此文件只有root用户可以浏览和操作

  需要注意的是,虽然 "x" 并不表示真正的密码,但也不能删除,如果删除了 "x",那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在使用无密码登录,远程是不可以的)。

 

② 正文:

Linux修改用户UID和GID的方法:

1、查看用户的相关信息:

  cat /etc/passwd

2、停止该用户下所有的进程、取消此账号的所有挂载(避免不必要的报错)

  (注:不清楚是否有其他人的程序 在使用缓存中的文件的,此操作一定要向相关人员询问清楚!!!

  sudo kill -9 进程ID

  sudo umount 挂载路径 (可通过df -h来查看)

3、修改此用户的UID和GID

  #修改test用户的UID,由1000修改成1001
  sudo usermod -u 1001 test
  #修改test用户的GID,由1000修改成1001

  (注:-g会退出原来的主群组非必要建议使用-ag,这样会导致用户再创建文件时候,群组权限还是原来的群组这个我后边会说-

使用①设置SETGID位(针对组)、②使用默认ACL(访问控制列表)③调整umask值)

  sudo usermod -g 1001 test

  (usermod参数说明:-a:将用户添加到新的组中,而不会从其他组中移除用户;-g:群组id;-G:群组名称)

4、重新给test用户目录赋权限

  sudo chown -R test:test /home/test

5、其他问题,再次启动test用户下的进程发现没有权限or启动失败

  #需要清理/tmp临时目录下残留的test用户的进程文件

  cd /tmp;ll

  查看test的进程文件然后sudo rm

 

(原文:https://www.jianshu.com/p/94fdfc601495

 

因为之前没有做群组控制,所以需要重新创建群组,并把对应的账号加入进来,并针对群组进行权限控制。

 

1.4、设置群组GID

Linux修改群组的GID并将用户添加进群组:

1、创建群组:

  sudo groupadd nfstest

2、这时候多个服务器间的新群组nfstest的GID可能不一样,在每个服务器上统一修改下就好(可在/etc/group中查看群组GID):

  sudo groupmod -g 1008 nfstest(将nfstest群组的GID改成1008。groupmod参数说明:-n参数用于更改群组名称;-g群组id;-G群组名称。)

  验证是否修改GID成功:/etc/group或者getent group nfstest

3、将test用户加入到nfstest群组

  sudo usermod -aG nfstest test

  验证test用户是否加入成功:groups test

 

4、更新与该GID关联的文件和目录权限(有需要的的话)

  sudo chown -R :1008 /data/testnfs/main

  注:这里选择了在挂载目录下创建一个main目录进行权限配置!!

 

上边做完一系列准备后,就可以开始方案选择(选取几个方案进行测试,最后根据其优缺点和实际需求来确定最终使用哪一个办法)

这里测试了:设置SETGID位(针对组)、②使用默认ACL(访问控制列表)③调整umask值 (注:②和③都需要用到①,也就是这里只测试了两个方案)

 

2.1、正式测试:对群组(GID)进行权限控制

修改完GID后,接下来重点是:将新添的文件全部继承父目录的权限

首先要做的是设置SERGID,②和③都需要用到①

 

2.1.1、给目录设置SetGID

(SetGID(Set Group ID on execution)位是一个特殊的权限位,当它被设置在一个目录上时,任何在这个目录中创建的文件或子目录都会继承这个目录的组所有权,而不是创建者的主组所有权。这有助于保持目录中文件的一致性,特别是在多用户环境中共享文件时非常有用。)

  -(在设置之前可先配置这个:chmod -R 770 /data/testnfs/main

  -设置SetGID:

    sudo chmod g+s /data/testnfs/main

    或者 sudo chmod 2775 /data/testnfs/main(2-代表设置SetGID位)

 

注:SetGID位对目录有效,可以使得新文件和子目录继承父目录的组归属,但不会改变文件和目录的权限

并且默认情况下,Linux不会让新文件完全继承父目录的所有权限(包括特殊权限如setuid, setgid)

 

2.2、方案一:使用ACL(访问控制列表)

1、ACL提供了更灵活的权限管理方式,可以为文件和目录设置更复杂的权限规则。例如,可以为目录设置默认的ACL,使得新文件和子目录自动继承这些权限:

  sudo setfacl -m d:u:test:rwx /date/testnfs/main
  sudo setfacl -m d:g:nfstest:rwx /date/testnfs/main

 

  [ d: 表示设置默认的ACL规则。]

  [ u: username:rwx表示为用户username设置读、写、执行权限.。]

  [ g: groupname:rwx表示为组groupname设置读、写、执行权限。]

  [ R: 递归操作子目录]

  [ m: 更改文件的访问控制列表。]

  [ 这样,在/data/testnfs/main目录下创建的新文件和子目录将自动继承这些ACL规则定义的权限。]

 

注:挂载时候需要加上 -o acl 参数mount -t nfs -o acl 192.168.123.22:/volume1/test /data/testnfs

 

可参考这些:

  ① setfacl命令:https://cloud.tencent.com/developer/article/2144597

  ②Ubuntu指定目录权限并后续自动继承:https://blog.csdn.net/m0_62197436/article/details/139712436

 

2、报错:(setfacl: NAS/: Operation not supported)

此报错可能原因:

  1. 文件系统不支持ACL。(解:改成NFS4.0应该可支持ACL,但听工程师说NFS4.0可能有时候跑不满速度)

  2. 没有足够的权限来修改ACL。(解:可使用sudo试试)

  3. 在mount时候没加 -o acl 参数(解:可以运行这个命令重新挂载一下:mount -o remount,acl /data/testnfs  )

  4. 系统内核或文件系统驱动限制了ACL的使用。(如果文件系统或内核版本过旧且不支持ACLs,考虑升级到支持ACLs的版本,请谨慎操作!!!) 

 

 

2.3、方案二:调整umask值

1、umask(User Mask)是一个用于定义创建文件和目录时默认权限的掩码。它决定了新文件和目录的初始权限

  [ umask值是一个八进制数,它指定了在创建文件或目录时应该从完全可访问权限中移除哪些权限。]

  [ 具体来说,umask 值会从新创建的文件或目录权限中去除相应位的权限。]

  ①查看umask值:

    umask

    查看创建的默认权限:umask -S

  ②设置umask值:

    umask 002

    [ 0表示所有者权限不受限。]

    [ 0表示组权限不受限制。]

    [ 2表示其他用户权限被限制为不写。]

    [ 新创建的文件默认权限将是664,新创建的目录默认权限将是775 ]

 

2、关于配置umask值:

  永久设置umask值,可以将其添加到用户的shell配置文件中(如.bashrc或/etc/profile

    echo 'umask 022' >> ~/.bashrc

   ①umask值的影响

    1.文件的默认权限:新创建的文件默认具有666的权限(即读写权限对所有用户开放),但实际的权限会受到umask值的影响。umask值中的每一位都会从666中减去相应的权限。

    2.目录的默认权限:新创建的目录默认具有777的权限(即读写执行权限对所有用户开放),同样地,实际的权限也会受到umask值的影响。umask值中的每一位都会从777中减去相应的权限。

   ②计算实际权限

    实际权限 = 默认权限 - umask值

    例如,如果umask值为022:

      -对于文件:666 - 022 = 644
        ·644表示所有者有读写权限,组和其他用户只有读权限。
      -对于目录:777 - 022 = 755
        ·755表示所有者有读写执行权限,组和其他用户只有读执行权限。

 

注:umask定义了新创建文件和目录的默认权限。虽然它不能直接使新文件继承父目录的权限,但可以通过配置适当的umask来限制或开放新文件的默认权限。

 

 注:特殊权限位‌:Linux还支持特殊权限位,如SUID(Set User ID)、SGID(Set Group ID)和Sticky Bit。这些权限位可以进一步影响文件和文件夹的权限继承和行为。

 

3.1、其他方案(没试过不知道效果)

利用PAM模块(Pluggable Authentication Modules)
  对于需要更加动态地管理权限的情况,某些Linux发行版提供了通过PAM模块在用户登录时自动应用特定权限的能力。然而,这种方法较为复杂,通常不用于简单的权限继承需求。

 

3.2、最终方案选择

最终使用了SetGID+umask的方案来操作(但经过测试还是会有一些目前不了解的一些权限问题),等以后有时间在来优化吧。

[有时候终端新建文件,其他终端编辑会报错:E212: Can't open file for writing]

(啊啊啊,,,改需求了,Windows也要增删改。。改回SMB共享了,不用NFS了,不过也学习到不少知识挺好~~)

 

4、写在最后:

# 如果不涉及多账号直接连看这个:https://blog.51cto.com/u_16213585/11515889

# 域控账号的还可以考虑这个:https://www.zhugh.com/synology-nas-nfs-kerberos-pei-zhi-yu-shi-yong/#toc_3

# 无映射方式挂载:https://www.zhugh.com/synology-nfs-wu-ying-she-gua-zai-pei-zhi/

 

 

 

 

-------------------------------------------------------------------------------------------------

2025.2.13 来补充

年前使用了SMB的方式使用了一段时间,今天也把过程记录下吧~

使用起来很简单,Linux连接SMB常用的有两种方式:①命令行(需要安装 smbclient 包) ②直接挂载到目录(需要安装 cifs-utils 包)

因为公司多使用win界面形式,这里只用挂载的方式(另一种方式也会提到)。

一、安装客户端

注:如果不需要,可以去掉smbclient!!!

① Debian/Ubuntu系:

sudo apt-get update 
sudo apt-get install smbclient cifs-utils

② Red Hat/CentOS系:

sudo yum install smbclient cifs-utils

 

二、开始连接SMB

1、smbclient

smbclient允许你从命令行访问SMB共享,并允许你进行文件传输、列出目录内容等操作。

smbclient //192.168.1.100/shared_folder -U username

然后,系统会提示你输入密码。成功连接后,你将看到一个类似FTP客户端的交互界面,你可以使用ls列出目录内容,使用get下载文件,使用put上传文件等。

 

2、mount命令

① 直接将账号密码写入(账号密码明文):
 
sudo mount -t cifs -o username=your_username,password=your_password //192.168.1.100/shared_folder /mnt/smb_share

 ② 将账号密码写入credentials文件中(安全+1~):

sudo mount -t cifs -o credentials=/path/to/credentials //192.168.1.100/share ~/smbshare

 

       注:credentials文件内容:
                     username=yourusername
                     password=yourpassword
 
③ 去掉密码的参数password=your_password(系统会提示输入密码)(安全++1~)
sudo mount -t cifs -o username=your_username//192.168.1.100/shared_folder /mnt/smb_share

 

 

三、开机自动挂载

编辑/etc/fstab文件:

//192.168.1.100/share /home/username/smbshare cifs credentials=/path/to/credentials 0 0

 

posted @   iSunXiaoXiao  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示