openSUSE Tumbleweed 是 openSUSE 社区推出的一个滚动更新的 Linux 发行版本。在其某个快照更新的 system-user-root
中出现了一个失误。该问题造成使用包含此版本 system-user-root
的快照安装的系统中丢失了 trusted
用户组。这使得普通用户无法使用 at
,crontab
和 fusermount
三个指令。
这个问题对本来有 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 系统中的普通用户是可以使用上面提到的 at
,crontab
和 fusermount
三个指令而不需要 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
用户组¶
通过系统指令增加一个系统用户组 trusted
,id
为 42
(需要 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
本文发表于水景一页。永久链接:<https://cnzhx.net/blog/manually-fix-trusted-group-in-opensuse-tumbleweed/>。转载请保留此信息及相应链接。