chrootコマンドはルートディレクトリを変更して、その変更したルートディレクトリでコマンドを実行するコマンドです。chrootは、多くのシステムで管理者権限が必要なコマンドになります。
また、コマンドを実行する際に、新しいルートディレクトリ中にその実行するコマンド、共有ライブラリ、前提とするディレクトリ構造等が必要になる場合があります。
目次
chrootコマンドの構文
chrootコマンドの基本的な構文
1 |
chroot newroot [command [args]...] |
newroot:新しいルートディレクトリにするディレクトリ
command [args]:新しいルートディレクトリに変更した後に実行するコマンド、省略した場合は、環境変数SHELLを実行、また、環境変数SHELLが設定されていない場合は/bin/shを実行
chrootコマンドの利用例
ルートディレクトリを変更しbashを動作
chrootコマンドで、カレントディレクトリをルートディレクトリに変更したいと思います。
chrootコマンドの実行前準備
まず、空のカレントディレクトリに対して、bashの実行ファイル、共有ライブラリを用意していきます。bashの実行ファイルとその実行ファイルに使われる共有ライブラリを空のカレントディレクトリにコピーしていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ls -l 合計 0 $cp --parents $(which bash) . $ldd $(which bash) linux-vdso.so.1 => (0x00007fff84bc1000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fa944c83000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa944a7f000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa9446b4000) /lib64/ld-linux-x86-64.so.2 (0x000055e93aa6e000) $cp --parents /lib/x86_64-linux-gnu/libtinfo.so.5 . $cp --parents /lib/x86_64-linux-gnu/libdl.so.2 . $cp --parents /lib/x86_64-linux-gnu/libc.so.6 . $cp --parents /lib64/ld-linux-x86-64.so.2 . |
また、cpコマンドの--parentsオプションは、ファイルをコピーするときにそのファイルの親ディレクトリを作成してファイルをコピーするオプションになります。
ファイルのコピーが終わった後の最終的なカレントディレクトリの構造は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$tree . ├── bin │ └── bash ├── lib │ └── x86_64-linux-gnu │ ├── libc.so.6 │ ├── libdl.so.2 │ └── libtinfo.so.5 └── lib64 └── ld-linux-x86-64.so.2 4 directories, 5 files |
chrootコマンドの実行例
chrootコマンドでルートディレクトリを変更して、bashを動作させる準備ができた状態でchrootコマンドを実行します。実行させるコマンドは新しいルートディレクトリを基準としたコマンドが実行されます。
実行するコマンドのプログラムやそのプログラムに使用される共有ライブラリが存在しない場合は、chrootコマンドの起動に失敗します。
コマンド例と実行結果
1 2 |
$sudo chroot . /bin/bash bash-4.3# |
また、このbashの環境から抜けるには、exitコマンドを使用します。exitコマンドを使用するとchrootコマンドを実行する前の環境に戻ることができます。
1 2 3 |
bash-4.3# exit exit $ |
別のユーザとグループに変更
(--userspecオプション)
--userspecオプションで別のユーザとグループとして、ルートディレクトリを変更してコマンドを実行することができます。--userspecオプションの引数はuserまたはuser:groupになります。
コマンド例と実行結果
1 2 3 4 5 6 |
$sudo chroot . id uid=0 gid=0 groups=0 $sudo chroot --userspec=ubuntu . id uid=1000 gid=1000 groups=1000,4,24,27,30,46,113,128,999 $sudo chroot --userspec=root:ubuntu . id uid=0 gid=1000 groups=1000 |
このコマンド例では、新しいルートディレクトリに対して、事前にidコマンドのプログラムと必要な共有ライブラリをコピーしています。
idコマンドをコピーするコマンド例
1 2 3 4 5 6 |
$cp --parents $(which id) . $ldd $(which id) linux-vdso.so.1 => (0x00007ffebb186000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fba6d363000) /lib64/ld-linux-x86-64.so.2 (0x00005636e2902000) $cp --parents /lib/x86_64-linux-gnu/libc.so.6 /lib64/ld-linux-x86-64.so.2 . |
また、lddコマンドは依存する共有ライブラリを確認するコマンドになります。
補助グループの追加
(--groupsオプション)
--groupsオプションで補助グループを追加することができます。
コマンド例と実行結果
1 2 3 4 |
$sudo chroot . id uid=0 gid=0 groups=0 $sudo chroot --groups=ubuntu,group . id uid=0 gid=0 groups=0,1000,1001 |
作業ディレクトリを変更しない
(--skip-chdirオプション)
--skip-chdirオプションは変更するルートディレクトリが変更前のルートディレクトリと同じ場合に実行できます。chrootコマンドを実行したときに作業ディレクトリはルートディレクトリに移動しますが、--skip-chdirオプションをつけると作業ディレクトリがそのままの状態になります。
コマンド例と実行結果
1 2 3 4 5 6 |
$pwd /home/ubuntu/test_chroot $sudo chroot / pwd / $sudo chroot --skip-chdir / pwd /home/ubuntu/test_chroot |