The GNU /run directory — Do 26 Dezember 2024

你好,世界!

作为系统管理员,我经常收到包含以下内容的邮件:

Info:   DISC CRITICAL - /run/user/2000/doc is not accessible: Permission denied

看起来好象是文件目录 /run/user/2000/doc 无法访问。为什么系统管理员还有无法访问的文件目录呢? 让我们来看一下这究竟是怎么回事?

作为一个管理员用户 ttom,我打开一个终端模拟器,并进行以下操作。

ls -al /run/user/2000/doc

输出结果是

total 0
dr-x------  2 ttom ttom   0 Jan  1  1970 .
drwx------ 13 ttom ttom 300 Dec 26 14:00 ..
dr-x------  2 ttom ttom   0 Jan  1  1970 by-app

似乎没有访问的问题。然后,我使用管理员命令执行同样的操作。

sudo ls -al /run/user/2000/doc

这次输出的结果是

[sudo] password for ttom:
ls: cannot access '/run/user/2000/doc': Permission denied

果然有访问的问题。我干脆切换到管理员用户 root,执行同样的命令。结果也是

ls: cannot access '/run/user/2000/doc': Permission denied

于是,我用 root 进行了如下操作。

ls -al /run/user/2000

结果是

...
d????????? ? ?  ?       ?               ? doc
...

为什么会是这样?让我们从 GNU 系统的 /run 目录说起。

/run 目录是用来替代 /var/run 目录的新措施。它包含自系统启动始的系统信息数据,此目录中的文件作为临时文件系统创建在内存中,会在系统启动一开始就自动清除掉。因为这些数据是临时数据,所以它们不需要在每个系统启动之间保留。它可以包含用户相关的子目录 /run/user,为了安全用户子目录只有用户自己有访问权。啊哈,原来如此!

那么怎么知道哪个目录是哪个用户的呢?非常简单,/run/user 使用统一的命名规则:/run/user/$UID 就是用户标识为 $UID 用户的目录,其目录权限设置为 0700。我们可以看到用户目录的权限设置,比如作为 ttom,可以使用下面的命令。

stat -c "%a %n" /run/user/2000
700 /run/user/2000

sudo stat -c "%a %n" /run/user/2000
700 /run/user/2000

我们可以使用下面的命令来找到数字形式的 $UID 是哪个用户,比如上面的 2000

id -a 2000
uid=2000(ttom)...

原来目录 /run/user/2000 是 ttom 的用户目录,所以 ttom 有访问权限,而 root 没有。

了解了 /run 目录的意义,回到开始我们收到的系统邮件,我们也就不要为这个 DISC CRITICAL 而担心了。

如果你对搭建 GNU 系统还有兴趣,立伯乐 或许可以帮你。

让 GNU 带你进入自由软件的美好世界!