ここで行ったことは、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されたプロセスにルートアクセスがある場合、セキュリティに役に立たない理由のさらに別の例です。非ルートプロセスは読み取ることができません/proc/1/root
が/proc/1234/root
、同じように実行されるPID 1234のユーザー。)
ルート権限がない場合は、/proc/1/mountinfo
およびを見ることができます/proc/$$/mountinfo
(filesystems/proc.txt
Linuxカーネルのドキュメントで簡単に説明されています)。このファイルは誰でも読み取り可能で、プロセスのファイルシステムのビュー内の各マウントポイントに関する多くの情報が含まれています。そのファイル内のパスは、リーダープロセス(ある場合)に影響するchrootによって制限されます。プロセスの読み取り値/proc/1/mountinfo
がグローバルルートとは異なるファイルシステムにchrootされた場合(pid 1のルートがグローバルルートであると仮定)、のエントリは/
表示されません/proc/1/mountinfo
。プロセスの読み取り値/proc/1/mountinfo
がグローバルルートファイルシステム上のディレクトリにchrootされた場合、のエントリが/
表示されますが/proc/1/mountinfo
、マウントIDは異なります。ちなみに、ルートフィールド($4
)は、chrootがマスターファイルシステムのどこにあるかを示します。
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
これは純粋なLinuxソリューションです。これは、十分に類似した他のUnixバリアントに一般化できる可能性があります/proc
(Solarisには類似していると/proc/1/root
思いますが、そうではありませんmountinfo
)。