我在这里所做的是测试init
进程的根(PID 1)是否与当前进程的根相同。尽管/proc/1/root
它始终是一个链接/
(除非init
本身是chroot,但我不在乎这种情况),但它始终指向“主”根目录。Debian中的一些维护脚本中都使用了此技术,例如,在chroot中安装后跳过启动udev。
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(顺便说一下,这是另一个示例,说明chroot
如果chroot进程具有root访问权限,为什么对安全性无用。非root进程无法读取/proc/1/root
,但是/proc/1234/root
如果有正在运行且PID 1234相同的正在运行的进程,它们也可以执行用户。)
如果您没有root权限,则可以查看/proc/1/mountinfo
和/proc/$$/mountinfo
(简要记录在filesystems/proc.txt
Linux内核文档中)。该文件是世界可读的文件,并且在文件系统的进程视图中包含许多有关每个安装点的信息。该文件中的路径受chroot限制,该chroot影响读取器进程(如果有)。如果将进程读取/proc/1/mountinfo
更改为与全局根不同的文件系统(假设pid 1的根是全局根),则不会在其中/
显示任何条目/proc/1/mountinfo
。如果将进程读取/proc/1/mountinfo
更改为全局根文件系统上的目录,则的条目将/
出现在中/proc/1/mountinfo
,但具有不同的装载ID。顺便说一下,根字段($4
)表示chroot在其主文件系统中的位置。
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
这是一个纯Linux解决方案。它可以推广到具有足够相似性的其他Unix变体/proc
(/proc/1/root
我认为Solaris具有相似性,但不是mountinfo
)。