Chrootとスタンドアロンシステムの両方として使用できるはずのUNIXインストールがあります。 chrootとして実行している場合は、サービス(cron、inetdなど)を実行したくありません。ホストシステムと競合するか、冗長になるためです。
Chrootで実行されているかどうかによって動作が異なるシェルスクリプトを作成するにはどうすればよいですか?私の緊急の必要性は、/proc
がchrootにマウントされた最新のLinuxシステムであり、スクリプトはrootとして実行されていますが、より移植性の高い回答も歓迎します。 (/ / procがマウントされていない場合、chrootで実行していることをどのように確認するのですか?/proc
のないLinuxの場合を参照してください。)
より一般的には、他の封じ込め方法で機能する提案は興味深いでしょう。実用的な問題は、このシステムはサービスを実行しているはずですか? (答えはchrootにはありません、そして本格的な仮想マシンにはあります。jailやコンテナーなどの中間的なケースについては知りません。)
ここでは、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されたプロセスにrootアクセスがある場合、chroot
がセキュリティに役に立たない理由のもう1つの例です。非rootプロセスは/proc/1/root
を読み取ることはできませんが、/proc/1234/root
PID 1234の実行中のプロセスが同じユーザーとして実行されている場合。)
Root権限がない場合は、/proc/1/mountinfo
および/proc/$$/mountinfo
を確認できます(Linuxカーネルのドキュメントの filesystems/proc.txt
に簡単に記載されています )。このファイルは誰でも読み取り可能で、ファイルシステムのプロセスのビューにある各マウントポイントに関する多くの情報が含まれています。そのファイルのパスは、もしあれば、リーダープロセスに影響を与える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
はそうではありません)。
inode番号を見つけるためのポータブルな方法 および 内部からchroot jailを検出する で述べたように、/
のiノード番号が2
であるかどうかを確認できます:
$ ls -di /
2 /
2以外のiノード番号は、見かけのルートがファイルシステムの実際のルートではないことを示します。これは、マウントポイントまたは ランダムなルートiノード番号を持つオペレーティングシステム をルートとするchrootを検出しません。
ここにリストした他の多くのオプションほど明らかに移植性はありませんが、Debianベースのシステムを使用している場合は、ischroot
を試してください。
参照: https://manpages.debian.org/jessie/debianutils/ischroot.1.en.html
Ischrootを使用してコンソールでステータスを直接取得するには:
ischroot;echo $?
終了コード:
0 if currently running in a chroot
1 if currently not running in a chroot
2 if the detection is not possible (On GNU/Linux this happens if the script is not run as root).