При монтировании общего ресурса cifs в RHEL7 возникает следующая ошибка: «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. Я знаю, что используя числовые идентификаторы, я могу решить проблему. Я знаю, что удаление gid=mysql
это сработает. Почему для пользователя mount может найти UID, а для 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
, и вместо этого пытается разобрать mysql
как числовое значение GID. Очевидно, это будет вне диапазона, потому что это строка, а не int. Мне пока неясно, является ли это ошибкой на стороне хоста или на стороне клиента.
Если косметическая группа и имя пользователя mysql
и сопутствующий идентификатор отсутствует на обоих серверах, исправьте это с помощью groupmod
или через редактирование /etc/group
файл. Если желаемые GID и UID одинаковые на обоих хостах или фиксированные значения по умолчанию (например, mysql
, 27
is), затем укажите GUID и UID по номеру, а не по имени. Это немного непонятно, но, вероятно, это сработает.
Требуется дальнейшее расследование относительно того, почему не удается сопоставить имя с номером для идентификаторов. Мы можем использовать косметические имена пользователей и групп, начиная с mount.cifs 1.10. Опять же, если вы не вызываете помощник mount.cifs в своем обычном процессе монтирования для этого тома, вы, вероятно, никогда не сможете использовать косметические имена, если он явно не реализован в любом помощнике, который вы используете вместо этого.