ここで行ったことは、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
(ちなみに、これはchrootchrootされたプロセスにルートアクセスがある場合、セキュリティに役に立たない理由のさらに別の例です。非ルートプロセスは読み取ることができません/proc/1/rootが/proc/1234/root、同じように実行されるPID 1234のユーザー。)
ルート権限がない場合は、/proc/1/mountinfoおよびを見ることができます/proc/$$/mountinfo(filesystems/proc.txtLinuxカーネルのドキュメントで簡単に説明されています)。このファイルは誰でも読み取り可能で、プロセスのファイルシステムのビュー内の各マウントポイントに関する多くの情報が含まれています。そのファイル内のパスは、リーダープロセス(ある場合)に影響する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)。