在RHEL7中挂载cifs共享失败,出现以下错误:“mount:未能分析挂载选项:数字结果超出范围”
# LIBMOUNT_DEBUG=0xffff mount //fileserver/db-mysql /mnt/mysqlBackups -t cifs -o credentials=/etc/samba/fileserver.password,forceuid,uid=mysql,forcegid,gid=mysql,file_mode=0664,dir_mode=0775 -v 5561: libmount: INIT: library debug mask: 0xffff 5561: libmount: INIT: library version: 2.23.0 5561: libmount: INIT: feature: selinux 5561: libmount: INIT: feature: debug 5561: libmount: INIT: feature: assert 5561: libmount: CXT: [0x7ff506842050]: ----> allocate 5561: libmount: UTILS: mtab: /etc/mtab 5561: libmount: UTILS: /etc/mtab: irregular/non-writable 5561: libmount: UTILS: utab: /run/mount/utab 5561: libmount: CXT: [0x7ff506842050]: enabling flag 0010 5561: libmount: CXT: [0x7ff506842050]: mount: preparing 5561: libmount: CXT: [0x7ff506842050]: use default optmode 5561: libmount: CXT: [0x7ff506842050]: OPTSMODE: ignore=0, append=0, prepend=1, replace=0, force=0, fstab=1, mtab=1 5561: libmount: CXT: [0x7ff506842050]: fstab not required -- skip 5561: libmount: CXT: [0x7ff506842050]: merging mount flags 5561: libmount: CXT: [0x7ff506842050]: final flags: VFS=00000000 user=00000000 5561: libmount: CXT: [0x7ff506842050]: mount: evaluating permissions 5561: libmount: CXT: [0x7ff506842050]: mount: fixing optstr 5561: libmount: CXT: [0x7ff506842050]: mount: fixing vfs optstr 5561: libmount: CXT: applying 0x00000000 flags to '(null)' 5561: libmount: CXT: new optstr 'rw' 5561: libmount: CXT: [0x7ff506842050]: mount: fixing user optstr 5561: libmount: CXT: applying 0x00000000 flags to '(null)' 5561: libmount: CXT: new optstr '(null)' 5561: libmount: CXT: fixing uid 5561: libmount: CXT: fixing gid 5561: libmount: UTILS: cannot convert 'mysql' groupname to GID 5561: libmount: CXT: [0x7ff506842050]: fixed options [rc=-34]: vfs: 'rw' fs: 'credentials=/etc/samba/fileserver.password,forceuid,uid=27,forcegid,gid=mysql,file_mode=0664,dir_mode=0775' user: '(null)', optstr: 'credentials=/etc/samba/fileserver.password,forceuid,uid=mysql,forcegid,gid=mysql,file_mode=0664,dir_mode=0775' 5561: libmount: CXT: [0x7ff506842050]: mount: preparing failed mount: failed to parse mount options: Numerical result out of range 5561: libmount: CXT: [0x7ff506842050]: <---- reset [status=0] ----> 5561: libmount: CXT: [0x7ff506842050]: tabfiler disabled 5561: libmount: CXT: [0x7ff506842050]: <---- free
mysql组存在:
# getent group mysql mysql:x:27: # grep mysql /etc/group mysql:x:27: # id mysql uid=27(mysql) gid=27(mysql) groups=27(mysql) # ls -lZ /etc/group /etc/passwd -rw-r--r--. root root system_u:object_r:passwd_file_t:s0 /etc/group -rw-r--r--. root root system_u:object_r:passwd_file_t:s0 /etc/passwd
如果发现有趣的是,使用直接mount.cifs它正在工作:
# mount.cifs //fileserver/db-mysql /mnt/mysqlBackups --verbose -o credentials=/etc/samba/fileserver.password,forceuid,uid=mysql,forcegid,gid=mysql,file_mode=0664,dir_mode=0775 Credential formatted incorrectly: (null) domain=fileserver mount.cifs kernel mount options: ip=10.1.2.20,unc=\\fileserver\db-mysql,forceuid,forcegid,file_mode=0664,dir_mode=0775,uid=27,gid=27,user=svc_linux,,domain=fileserver,pass=******** # grep /mnt/mysqlBackups /proc/mounts //fileserver/db-mysql /mnt/mysqlBackups cifs rw,relatime,vers=1.0,cache=strict,username=svc_linux,domain=fileserver,uid=27,forceuid,gid=27,forcegid,addr=10.1.2.20,file_mode=0664,dir_mode=0775,nounix,serverino,rsize=61440,wsize=65536,actimeo=1 0 0
它发生在:
# uname -rvpio 3.10.0-327.36.1.el7.x86_64 #1 SMP Sun Sep 18 13:04:29 UTC 2016 x86_64 x86_64 GNU/Linux
同样的问题在:
# uname -rvpio 3.10.0-327.36.3.el7.x86_64 #1 SMP Mon Oct 24 16:09:20 UTC 2016 x86_64 x86_64 GNU/Linux
mount和mount.cifs是RHEL7的最新版本:
# rpm -q util-linux cifs-utils util-linux-2.23.2-26.el7_2.3.x86_64 cifs-utils-6.2-7.el7.x86_64
看来getgrnam_r(3)调用失败。
编辑1:
我想使用用户和组名称,而不是UID GID。 我知道使用数字ID我可以解决这个问题。 我知道,删除gid=mysql它将工作。 为什么用户mount能够findUID,但是对于grup,它找不到GID?
编辑2:错误似乎是由此代码引发: https : //github.com/karelzak/util-linux/blob/master/libmount/src/utils.c#L703
所以我试图重现与下面的代码,但通话是成功的。 这对我来说很奇怪。 对不起草的C代码,我不是程序员。
#include <stdio.h> #include <errno.h> #include <stdlib.h> #include <sys/types.h> #include <grp.h> #define UL_GETPW_BUFSIZ (16 * 1024) int main(void) { int rc = -1; struct group grp; struct group *gr; char *buf; int _gid=10; gid_t *gid = (gid_t *)& _gid; char *groupname = "mysql"; if (!groupname || !gid) return -EINVAL; buf = malloc(UL_GETPW_BUFSIZ); if (!buf) return -ENOMEM; if (!getgrnam_r(groupname, &grp, buf, UL_GETPW_BUFSIZ, &gr) && gr) { *gid= gr->gr_gid; printf("gid=%i\n",*gid); rc = 0; } else { printf("cannot convert '%s' groupname to GID\n", groupname); rc = errno ? -errno : -EINVAL; } free(buf); return rc; } // vim:ts=4:sts=4:sw=4:et:
没有错误报告:
# gcc -Wall -W test.c # ./a.out gid=27 #
编辑3:如果我尝试使用gid=dbus它正在工作:
# egrep 'mysql|dbus' /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/passwd:dbus:x:81:81:System message bus:/:/sbin/nologin /etc/passwd:mysql:x:27:27:Percona Server:/var/lib/mysql:/bin/false /etc/shadow:dbus:!!:17086:::::: /etc/shadow:mysql:!!:17104:::::: /etc/group:dbus:x:81: /etc/group:mysql:x:27: /etc/gshadow:dbus:!:: /etc/gshadow:mysql:!:: # LIBMOUNT_DEBUG=0xffff mount //fileserver/db-mysql /mnt/mysqlBackups -t cifs -o credentials=/etc/samba/fileserver.password,forceuid,uid=mysql,forcegid,file_mode=0664,dir_mode=0775,gid=dbsu 10777: libmount: INIT: library debug mask: 0xffff 10777: libmount: INIT: library version: 2.23.0 10777: libmount: INIT: feature: selinux 10777: libmount: INIT: feature: debug 10777: libmount: INIT: feature: assert 10777: libmount: CXT: [0x7f687bf74050]: ----> allocate 10777: libmount: UTILS: mtab: /etc/mtab 10777: libmount: UTILS: /etc/mtab: irregular/non-writable 10777: libmount: UTILS: utab: /run/mount/utab 10777: libmount: CXT: [0x7f687bf74050]: mount: preparing 10777: libmount: CXT: [0x7f687bf74050]: use default optmode 10777: libmount: CXT: [0x7f687bf74050]: OPTSMODE: ignore=0, append=0, prepend=1, replace=0, force=0, fstab=1, mtab=1 10777: libmount: CXT: [0x7f687bf74050]: fstab not required -- skip 10777: libmount: CXT: [0x7f687bf74050]: merging mount flags 10777: libmount: CXT: [0x7f687bf74050]: final flags: VFS=00000000 user=00000000 10777: libmount: CXT: [0x7f687bf74050]: mount: evaluating permissions 10777: libmount: CXT: [0x7f687bf74050]: mount: fixing optstr 10777: libmount: CXT: [0x7f687bf74050]: mount: fixing vfs optstr 10777: libmount: CXT: applying 0x00000000 flags to '(null)' 10777: libmount: CXT: new optstr 'rw' 10777: libmount: CXT: [0x7f687bf74050]: mount: fixing user optstr 10777: libmount: CXT: applying 0x00000000 flags to '(null)' 10777: libmount: CXT: new optstr '(null)' 10777: libmount: CXT: fixing uid 10777: libmount: CXT: fixing gid 10777: libmount: UTILS: cannot convert 'dbsu' groupname to GID 10777: libmount: CXT: [0x7f687bf74050]: fixed options [rc=-34]: vfs: 'rw' fs: 'credentials=/etc/samba/fileserver.password,forceuid,uid=27,forcegid,file_mode=0664,dir_mode=0775,gid=dbsu' user: '(null)', optstr: 'credentials=/etc/samba/fileserver.password,forceuid,uid=mysql,forcegid,file_mode=0664,dir_mode=0775,gid=dbsu' 10777: libmount: CXT: [0x7f687bf74050]: mount: preparing failed mount: failed to parse mount options: Numerical result out of range 10777: libmount: CXT: [0x7f687bf74050]: <---- reset [status=0] ----> 10777: libmount: CXT: [0x7f687bf74050]: tabfiler disabled 10777: libmount: CXT: [0x7f687bf74050]: <---- free
您启用CIFS的系统不能将组名mysql映射到GID 27 ,而是尝试将mysqlparsing为数字GID值。 这显然会超出范围,因为它是一个string而不是int。 到目前为止还不清楚这是主机还是客户端的故障。
如果化妆品组和用户名mysql和随附的ID不在两个服务器上,则通过groupmod命令或通过编辑/etc/group文件来修复。 如果所需的GID和UID在两台主机上都是相同的,或者是一个固定的默认值(如mysql , 27是),那么通过编号指定GUID和UID,而不是按名称。 这是一个混乱,但它可能会工作。
进一步的调查,为什么它没有映射名称编号为ID是保证。 自mount.cifs 1.10以来,我们已经可以使用美化的用户名和组名。 然后,如果你没有在这个卷的通常的挂载过程中调用mount.cifs助手,那么你可能永远无法使用化妆品名称,除非它被明确地实现在你使用的任何帮助器中。