手动修复 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/>。转载请保留此信息及相应链接。

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)