Ответ 1
Поскольку у меня была такая же проблема, я также изучил это. Вот мои выводы:
grantpt(3)
пытается убедиться, что подчиненный псевдотерминал имеет свою группу в специальной группе tty
(или любой другой TTY_GROUP
при компиляции glibc):
static int tty_gid = -1;
if (__glibc_unlikely (tty_gid == -1))
{
char *grtmpbuf;
struct group grbuf;
size_t grbuflen = __sysconf (_SC_GETGR_R_SIZE_MAX);
struct group *p;
/* Get the group ID of the special `tty' group. */
if (grbuflen == (size_t) -1L)
/* `sysconf' does not support _SC_GETGR_R_SIZE_MAX.
Try a moderate value. */
grbuflen = 1024;
grtmpbuf = (char *) __alloca (grbuflen);
__getgrnam_r (TTY_GROUP, &grbuf, grtmpbuf, grbuflen, &p);
if (p != NULL)
tty_gid = p->gr_gid;
}
gid_t gid = tty_gid == -1 ? __getgid () : tty_gid;
/* Make sure the group of the device is that special group. */
if (st.st_gid != gid)
{
if (__chown (buf, uid, gid) < 0)
goto helper;
}
В моей системе группа tty
равна 5. Однако эта группа не отображается в ваше пространство имен пользователей, а chown(2)
терпит неудачу, потому что GID 5 не существует. glibc затем возвращается к выполнению pt_chown
помощника, который также терпит неудачу. Я не заглядывал в детали того, почему он терпит неудачу, но я предполагаю это, потому что он setuid никто, если вы не сопоставили пользователя root с вашим пространством имен пользователей. Здесь показан вывод strace, который показывает неудачную операцию:
[pid 30] chown("/dev/pts/36", 1000, 5) = -1 EINVAL (Invalid argument)
Это дает вам несколько методов для решения этой проблемы:
- Сопоставьте необходимые группы (т.е.
tty
), которые могут быть недоступны безCAP_SYS_ADMIN
в двоичном формате, который открывает пространство имен пользователя - Используйте подпузы и субгиды вместе с
newuidmap(1)
иnewgidmap(1)
, чтобы сделать эти группы доступными (это может сработать, но я его не тестировал). - Внесите изменения, которые предотвращают сбой вызова
chown(2)
, например. используя пространство имен mount и изменив GID группыtty
в/etc/groups
на ваш GID пользователя. - Избегайте вызова
chown(2)
, например. сделавst.st_gid != gid
check false; это должно быть возможным, удалив группуtty
из пространства имен целевого монтирования/etc/groups
. Конечно, это может вызвать другие проблемы.