手动修复 openSUSE Tumbleweed 中 trusted 用户组缺失的问题

openSUSE TumbleweedopenSUSE 社区推出的一个滚动更新的 Linux 发行版本。在其某个快照更新的 system-user-root 中出现了一个失误。该问题造成使用包含此版本 system-user-root 的快照安装的系统中丢失了 trusted 用户组。这使得普通用户无法使用 atcrontabfusermount 三个指令。

这个问题对本来有 trusted 用户组的已安装系统的升级没有影响,只影响新安装系统。因为 system-user-root 脚本只是在系统安装之初运行并起作用。这个可以通过查看该脚本的内容来确认。可使用下面的指令查看该脚本内容,

$ rpm -q --scripts system-user-root
... ... ...
if not posix.access("/etc/group", "f") then
 file = io.open("/etc/group", "a+")
 file:write("root:x:0:\nshadow:x:15:\ntrusted:x:42:\nusers:x:100:\n")
 file:close()
 posix.chmod("/etc/group", 0644)
end
... ... ...

如果系统没有 /etc/group 文件,则该脚本会自动创建一个,并设定几个默认的用户组。其中就有 trusted 用户组。

我已经报告了 bug,但是还没有得到解决,所以干脆自己手动解决吧。解决问题的方法来源于 bug report 的评论。与此应该属于同一问题根源的还有另一个 bug

问题的表现

Linux 系统中的普通用户是可以使用上面提到的 atcrontabfusermount 三个指令而不需要 root 权限的。出现此问题后,运行 crontab -e 会出现错误,

$ crontab -e
bash: /usr/bin/crontab: Permission denied

提示权限受限。

/usr/bin/crontab 的文件信息如下,

$ stat /usr/bin/crontab
 File: /usr/bin/crontab
 Size: 55944 Blocks: 112 IO Block: 4096 regular file
Device: 29h/41d Inode: 106301 Links: 1
Access: (4750/-rwsr-x---) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-05-05 09:12:02.334125600 +0100
Modify: 2017-04-07 13:02:40.000000000 +0100
Change: 2017-05-02 23:19:09.047968872 +0100
 Birth: -

其它两个软件包的情况也类似。但是也可能表现在其它依赖这几个软件包的软件包中,比如无法使用 FUSE 或者 EncFS 等。还有一个表现就是,使用 kde-connect 连接 Android 手机后浏览手机文件系统的时候会提示类似于这样的错误,「The file or folder /home/USERNAME/.config/kdeconnect/{phone_id}/kdeconnect_sftp/{phone_id}/storage/emulated/0 does not exist.」。这个问题也在修复 fusermount 的访问权限之后解决了 :-D

使用 chkstat 检查系统权限信息,

# chkstat --system
Checking permissions and ownerships - using the permissions files
 /etc/permissions
 /etc/permissions.easy
 /etc/permissions.d/postfix
 /etc/permissions.local
setting /var/cache/man/ to man:root 0755. (wrong owner/group man:man)
setting /var/log/btmp to root:root 0600. (wrong owner/group root:utmp)
/usr/bin/at: unknown group trusted
/usr/bin/crontab: unknown group trusted
/usr/bin/fusermount: unknown group trusted
/sbin/pccardctl: unknown group trusted

应用自动修复,

# chkstat --system --set
/usr/bin/at: unknown group trusted
/usr/bin/crontab: unknown group trusted
/usr/bin/fusermount: unknown group trusted
/sbin/pccardctl: unknown group trusted

可以看到它自动修复了一些问题,但是无法针对这一问题提供有效修复,因为系统中没有 trusted 用户组。而且似乎有此问题的还有另一个位于 /sbin 目录的文件。

问题修复

修复的方法其实很简单:给系统增加一个 trusted 用户组,然后对照正常系统中的文件属性修改这四个文件的访问权限。参考这里了解更多 Linux 里的用户和用户组的信息。

手动增加 trusted 用户组

通过系统指令增加一个系统用户组 trustedid42(需要 root 权限),

# groupadd --system --gid 42 trusted

/etc/group 中新多出的内容为,

trusted:x:42:

这个内容与前面查看的 system-user-root 中给出的一致(id 为 42 的组名 trusted)。

重新强制安装软件包

先尝试自动修复,

# chkstat --system

然后查询受影响的文件(下面所列)所对应的软件包(实际上我们已经知道了),

/usr/bin/at
/usr/bin/crontab
/usr/bin/fusermount
/sbin/pccardctl
/lib/aaa_base (这是个文件夹)

查询,

# for i in /usr/bin/at /usr/bin/crontab /usr/bin/fusermount /sbin/pccardctl /lib/aaa_base ; do rpm -qf $i ; done
at-3.1.20-1.1.x86_64
cronie-1.5.1-66.3.x86_64
fuse-2.9.5-2.1.x86_64
pcmciautils-018-1.8.x86_64
aaa_base-13.2+git20170731.c10ca77-1.2.x86_64

强制重新安装这几个软件包(不需要带版本号),

# zypper install --force aaa_base at cronie fuse pcmciautils

安装完成后重新检查文件的权限,比如 crontab,如果不对,再接着按照下面的操作,如果可以,那就完成了。

修复文件访问权限

先修复 /usr/bin 中的那三个文件。正常的文件权限为(见 forum post),

$ ls -l /usr/bin | grep trusted
-rwsr-xr-x 1 root trusted 52264 Aug 6 10:46 at
-rwsr-xr-x 1 root trusted 55872 Jul 17 12:33 crontab
-rwsr-xr-x 1 root trusted 31480 Aug 8 12:06 fusermount

仿照这个修改即可。下面的操作需要 root 权限。

首先是给 other/nobody 用户增加「读」(r)和「执行」(x)权限,

# chmod o+rx /usr/bin/at /usr/bin/crontab /usr/bin/fusermount

然后修改其用户组为 trusted

# chown root:trusted /usr/bin/at /usr/bin/crontab /usr/bin/fusermount

然后查看权限发现这样修改之后原先那个 sticky 标记 s 不见了(-rws 变成了 rwx)。这样还是不行。需要再给加上 s 标记,

# chmod u+s /usr/bin/at /usr/bin/crontab /usr/bin/fusermount

然后再查看权限信息,

$ ls -l /usr/bin | grep trusted 
-rwsr-xr-x 1 root trusted 52264 Aug 6 10:46 at
-rwsr-xr-x 1 root trusted 55872 Jul 17 12:33 crontab
-rwsr-xr-x 1 root trusted 31480 Aug 8 12:06 fusermount

那个 /sbin/pccardctl 也可以顺便修理一下,

# chown root:trusted /sbin/pccardctl
# chmod u+s,o+rx /sbin/pccardctl

其实我也就是急着用 crontab 来设置用户的定时任务,不然还真不用麻烦,因为反正也没什么问题出现。

这个问题多半出现在三到五月份之间的某个更新快照中。我因为更换硬盘而重装系统用的是 20170429 快照。但是我三月份新机到手安装系统的时候用的 20170308 快照是没问题的。

UPDATE 2017-08-26

根据 Bug 报告上新的评论修改部分内容。©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/manually-fix-trusted-group-in-opensuse-tumbleweed/>。转载请保留此信息及相应链接。

雁过留声,人过留名

电子邮件地址不会被公开。 必填项已用*标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南