如何修复/proc中文件的GID?

如何修复/proc中文件的GID?

我不确定这是怎么发生的,但是我的/proc目录中所有文件(包括非进程相关文件,例如 /proc/uptime)的组 ID 都设置为 1001 而不是 root。这是现已删除的备用用户帐户的 ID,因此命令现在将 GID 1001 列为 UNKNOWN stat

我无法使用chownchgrp(在 下sudo)将它们更改为 root。即使重新启动后,GID 仍设置为 1001。

答案1

/proc不是一个实时文件系统,而是一个伪文件系统,它公开了 Linux 内核中的数据结构,您可以在其中操作它们或使用处理文件系统时感觉更熟悉的 CLI 工具读取它们。例如。catecho, ETC。

由于您已更改此用户的 UID/GID,因此在您进行此更改之前,这些进程可能正在以该用户身份运行。我只需重新启动系统,这些就会消失,因为它们实际上只是/proc系统上活动的运行进程。

例子

让我们从一个用户开始:

$ getent passwd user1
user1:x:1001:1001::/home/user1:/bin/bash

现在运行我们的示例流程:

$ su -c "sleep 1000" user1 &
[1] 1677

注意流程:

$ ps auxf | grep [s]leep
root      1676  0.0  0.2 195956  2424 pts/1    S    22:59   0:00                      \_ su -c sleep 1000 user1
user1     1677  0.0  0.0 107948   348 ?        Ss   22:59   0:00                      |   \_ sleep 1000

现在,如果我们注释掉文件user1中的条目,/etc/passwd我们会得到相同的场景:

$ find /proc/1677 -ls | head
258536    0 dr-xr-xr-x   9 1001     user1           0 Jul 16 22:59 /proc/1677
272483    0 dr-xr-xr-x   3 1001     user1           0 Jul 16 23:01 /proc/1677/task
272527    0 dr-xr-xr-x   6 1001     user1           0 Jul 16 23:01 /proc/1677/task/1677
272528    0 dr-x------   2 1001     user1           0 Jul 16 23:01 /proc/1677/task/1677/fd
272570    0 lrwx------   1 1001     user1          64 Jul 16 23:01 /proc/1677/task/1677/fd/0 -> /dev/pts/1
272571    0 lrwx------   1 1001     user1          64 Jul 16 23:01 /proc/1677/task/1677/fd/1 -> /dev/pts/1
272572    0 lrwx------   1 1001     user1          64 Jul 16 23:01 /proc/1677/task/1677/fd/2 -> /dev/pts/1
272529    0 dr-x------   2 1001     user1           0 Jul 16 23:01 /proc/1677/task/1677/fdinfo
272573    0 -r--------   1 1001     user1           0 Jul 16 23:01 /proc/1677/task/1677/fdinfo/0
272574    0 -r--------   1 1001     user1           0 Jul 16 23:01 /proc/1677/task/1677/fdinfo/1

我们无法更改这些文件,因为它们不是实际的文件,而是 Linux 内核的内部文件。

$ sudo chown user2 /proc/1677/task/1677/fdinfo/1

注意,没有效果:

$ ll /proc/1677/task/1677/fdinfo/1
-r-------- 1 1001 user1 0 Jul 16 23:01 /proc/1677/task/1677/fdinfo/1

笔记:同样的问题也适用于/etc/passwd/etc/group文件。我只是使用用户和 UID 场景来强调上面的内容,组和 GID 也是如此。

顺便说一句,如果我取消注释,user1事情/etc/passwd就会恢复正常:

$ ll /proc/1677/task/1677/fdinfo/1
-r-------- 1 user1 user1 0 Jul 16 23:01 /proc/1677/task/1677/fdinfo/1

相关内容