开机时通过/etc/fstab挂载CIFS共享失败:权限被拒绝
看起来你手动挂载没问题但开机/mount -a时报权限拒绝,这种情况我碰到过好几次,大概率是这几个原因,一个个排查试试:
1. 先检查fstab里的密码引号问题
你手动命令里用了password='PASSWORD',但在fstab里,选项里的单引号可能会被解析成密码的一部分!试试把密码的单引号去掉,改成:
//172.16.2.131/TEST/ /media/bcadmin/2cd14d9c-260e-4aa5-ace3-5f2c4befb970/Sync/shared_folder cifs username=bcadmin,password=PASSWORD,uid=bcadmin,gid=1001 0 0
然后再跑sudo mount -a测试,很多时候就是引号搞的鬼。
2. 网络就绪时机问题
开机的时候,系统可能还没完全建立网络连接就尝试挂载CIFS了,这时候连不上共享服务器,就会报错权限拒绝(其实是连接失败的误报)。解决方法是给fstab加_netdev选项,告诉系统这个挂载依赖网络,等网络就绪再挂载:
//172.16.2.131/TEST/ /media/bcadmin/2cd14d9c-260e-4aa5-ace3-5f2c4befb970/Sync/shared_folder cifs username=bcadmin,password=PASSWORD,uid=bcadmin,gid=1001,_netdev 0 0
如果是systemd的系统,还可以配合x-systemd.automount和x-systemd.idle-timeout=30,实现自动挂载和超时卸载,更可靠:
//172.16.2.131/TEST/ /media/bcadmin/2cd14d9c-260e-4aa5-ace3-5f2c4befb970/Sync/shared_folder cifs username=bcadmin,password=PASSWORD,uid=bcadmin,gid=1001,_netdev,x-systemd.automount,x-systemd.idle-timeout=30 0 0
3. 目标挂载点的分区挂载顺序
你的挂载点在/media/bcadmin/...下面,这个目录所在的分区(比如是你的用户数据分区)可能在CIFS挂载之后才被挂载,导致系统找不到挂载点,或者权限不对。可以检查一下/etc/fstab里那个数据分区的挂载顺序,确保它的fsck优先级(倒数第二个数字)比CIFS的0小,或者给CIFS加nofail选项,允许挂载失败不影响开机,然后后续自动重试:
//172.16.2.131/TEST/ /media/bcadmin/2cd14d9c-260e-4aa5-ace3-5f2c4befb970/Sync/shared_folder cifs username=bcadmin,password=PASSWORD,uid=bcadmin,gid=1001,_netdev,nofail 0 0
4. 改用凭据文件更安全也更可靠
把用户名密码写到一个单独的文件,比如/etc/cifs_credentials,内容是:
username=bcadmin password=PASSWORD
然后设置这个文件的权限为600,只有root能读:
sudo chmod 600 /etc/cifs_credentials sudo chown root:root /etc/cifs_credentials
然后fstab里改成:
//172.16.2.131/TEST/ /media/bcadmin/2cd14d9c-260e-4aa5-ace3-5f2c4befb970/Sync/shared_folder cifs credentials=/etc/cifs_credentials,uid=bcadmin,gid=1001,_netdev 0 0
这种方式不仅避免了fstab里明文密码的安全问题,还能解决引号、特殊字符解析的问题,成功率更高。
5. 检查SELinux/AppArmor限制
如果你的系统开了SELinux,可能会阻止开机时挂载CIFS。可以临时关闭SELinux测试:
sudo setenforce 0
然后跑sudo mount -a,如果成功了,就需要给挂载点添加SELinux上下文:
sudo semanage fcontext -a -t cifs_t "/media/bcadmin/2cd14d9c-260e-4aa5-ace3-5f2c4befb970/Sync/shared_folder(/.*)?" sudo restorecon -Rv /media/bcadmin/2cd14d9c-260e-4aa5-ace3-5f2c4befb970/Sync/shared_folder
AppArmor的话可以检查日志/var/log/syslog里有没有相关的拒绝记录,再调整规则。
先从第1、2、4点开始排查,这三个是最常见的原因,应该能解决你的问题。
备注:内容来源于stack exchange,提问作者Abdulhamid




