chrootとスタンドアロンシステムの両方として使用できるはずのUNIXインストールがあります。 chrootとして実行している場合、サービス(cron、inetdなど)はホストシステムと競合したり冗長になったりするため、実行したくありません。
chrootで実行されているかどうかによって動作が異なるシェルスクリプトを作成するにはどうすればよいですか?私が当面必要としているのは、/proc
を備えた最新のLinuxシステムです。 chrootにマウントされ、スクリプトはrootとして実行されますが、より移植性の高い回答も歓迎します。 (/proc
のないLinuxの場合、/ procがマウントされていない場合にchrootで実行していることを確認するにはどうすればよいですか?を参照してください。 。)
より一般的には、他の封じ込め方法で機能する提案は興味深いでしょう。実際の問題は、このシステムが何らかのサービスを実行していると想定されているかどうかです。 (答えはchrootでは「いいえ」であり、本格的な仮想マシンでは「はい」です。刑務所やコンテナなどの中間的なケースについてはわかりません。)
承認された回答:
ここで行ったことは、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アクセスがある場合、セキュリティには役に立ちません。ルート以外のプロセスは/proc/1/root
を読み取ることができません 、ただし、/proc/1234/root
に従うことができます 同じユーザーとして実行されているPID1234のプロセスが実行されている場合。)
ルート権限がない場合は、/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ソリューションです。十分に類似した/proc
を持つ他のUnixバリアントに一般化できる可能性があります (Solarisにも同様の/proc/1/root
があります 、私は思いますが、mountinfo
ではありません 。