你好,世界!
作为系统管理员,我经常收到包含以下内容的邮件:
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 带你进入自由软件的美好世界!