「Chroot」の版間の差分
(ページの作成:「Category:システムリカバリ en:Chroot es:Change Root fa:تغییر ریشه fr:Chroot ro:Chroot ru:Change Root zh-CN:Change Root W...」) |
(他言語へのリンクを修正) |
||
(4人の利用者による、間の34版が非表示) | |||
1行目: | 1行目: | ||
+ | {{Lowercase title}} |
||
[[Category:システムリカバリ]] |
[[Category:システムリカバリ]] |
||
+ | [[Category:サンドボックス]] |
||
+ | [[Category:コマンド]] |
||
+ | [[de:Chroot]] |
||
[[en:Chroot]] |
[[en:Chroot]] |
||
− | [[es: |
+ | [[es:Chroot]] |
− | [[fa:تغییر ریشه]] |
||
[[fr:Chroot]] |
[[fr:Chroot]] |
||
− | [[ |
+ | [[pt:Chroot]] |
− | [[ru: |
+ | [[ru:Chroot]] |
− | [[ |
+ | [[tr:Chroot]] |
+ | [[zh-hans:Chroot]] |
||
− | [[Wikipedia:ja:chroot|Chroot]] は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。そのため ''chroot監獄'' と呼ばれます。ルートディレクトリを変更することは通常システムのメンテナンスに使われます。例えばブートローダを再インストールしたりパスワードを再設定するときなどです。 |
||
+ | {{Related articles start}} |
||
+ | {{Related|PRoot}} |
||
+ | {{Related|Linux Containers}} |
||
+ | {{Related|systemd-nspawn}} |
||
+ | {{Related articles end}} |
||
+ | [[Wikipedia:ja:chroot|Chroot]] は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。この変更された環境は ''chroot監獄'' と呼ばれます。 |
||
− | == |
+ | == 理由 == |
+ | Chroot を行う主な理由は起動やログインができなくなった時のシステムメンテナンスです。例えば: |
||
− | * 他の Linux 環境からブートする必要があります(LiveCD や USB メディア、別にインストールされたディストリビューションなど)。 |
||
+ | |||
+ | * [[ブートローダー]]の再インストール。 |
||
+ | * [[mkinitcpio|initramfs]] イメージのリビルド。 |
||
+ | * パッケージのアップグレードもしくは[[ダウングレード]]。 |
||
+ | * [[パスワードリカバリ|パスワードの再設定]]。 |
||
+ | * chroot でパッケージをビルド[[DeveloperWiki:クリーンな chroot 内でビルドする]]を参照。 |
||
+ | |||
+ | [[Wikipedia:ja:Chroot#制限]] も参照。 |
||
+ | |||
+ | == 要件 == |
||
* chroot を行うには root 権限が必要です。 |
* chroot を行うには root 権限が必要です。 |
||
+ | * 他の Linux 環境からブートする必要があります (LiveCD や USB メディア、別にインストールされたディストリビューションなど)。 |
||
+ | * ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください (つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます: {{ic|# uname -m}}。 |
||
+ | * chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。 |
||
+ | * 必要であれば[[スワップ]]を有効にしてください: {{bc|# swapon /dev/sd''xY''}} |
||
+ | * 必要であればインターネットに接続してください。 |
||
+ | == 新しいルートの場所を準備する == |
||
− | * ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください。(つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます: |
||
+ | chroot ターゲットは、ファイルシステム階層を含むディレクトリである必要があります。 |
||
− | : {{bc|# uname -m}} |
||
+ | [[インストールガイド]] では、このディレクトリは {{ic|/mnt}} になります。既存のインストールの場合は、既存のパーティションを自分で {{ic|/mnt}} にマウントする必要があります。 |
||
− | * chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。スワップを有効にしたり ({{ic|swapon /dev/sdxY}})、インターネットに接続すると役立つかもしれません。 |
||
+ | {{ic|lsblk}} を実行し、インストールのパーティションレイアウトをメモします。通常は、{{ic|/dev/sd''XY''}} のようなものになります。NVMe ドライブの場合は {{ic|/dev/nvme0n''X''p''Y''}} になります。 |
||
− | == パーティションをマウント == |
||
+ | ファイルシステムをマウントします。 |
||
− | chroot しようとしているルートパーティションをマウントする必要があります。割り当てられたデバイス名を見つけて下さい: |
||
− | # |
+ | # mount /dev/sd''XY'' /mnt |
+ | [[EFI システムパーティション]] があり、それに変更を加える必要がある場合 ([[vmlinuz]] または [[Arch ブートプロセス#initramfs|initramfs]] イメージの更新など): |
||
− | パーティションレイアウトを知るには、次のコマンドを使ってください. |
||
+ | # mount /dev/sd''XZ'' /mnt/''esp'' |
||
− | # fdisk -l |
||
+ | [[パーティショニング#パーティションを分割する|個別パーティション]] がある場合は、それらもマウントします。 |
||
− | そして好きな場所にディレクトリを作り、マウントします: |
||
+ | 次の例では、{{ic|''/path/to/new/root''}} は新しいルートが存在するディレクトリです (例: {{ic|/mnt}}) |
||
− | # mkdir /mnt/arch |
||
− | # mount /dev/sda3 /mnt/arch |
||
+ | == 使い方 == |
||
− | 次に、あなたシステムのパーティションが分割されている場合 ({{ic|/boot}}, {{ic|/home}}, {{ic|/var}}, etc) それらもマウントする必要があります: |
||
+ | {{Note| |
||
− | # mount /dev/sda1 /mnt/arch/boot/ |
||
+ | * ''hostnamectl''、''localectl'' や ''timedatectl'' などの [[systemd]] のツールは [[D-Bus]] の接続が必要なため chroot の中では動作しません [https://github.com/systemd/systemd/issues/798#issuecomment-126568596]。 |
||
− | # mount /dev/sdb5 /mnt/arch/home/ |
||
+ | * chroot の新しいルート ({{ic|/}}) となるファイルシステムは、アクセス可能でなければなりません(復号化、マウント済み)}} |
||
− | # mount ... |
||
+ | chroot を使用するには、以下の 2 つの主要なオプションがあります。 |
||
− | chroot した後もファイルシステムをマウントすることはできますが、事前に行ったほうが便利です。なぜなら chroot を解除したあとアンマウントする必要があるためです。またシャットダウンの安全性を高める利点もあります。外部の Linux はすべてのマウントされたパーティションを把握していて、シャットダウン中に安全にアンマウントしてくれるはずです。 |
||
− | == |
+ | === arch-chroot を使う === |
+ | Bash スクリプト {{ic|arch-chroot}} は {{Pkg|arch-install-scripts}} パッケージに含まれています。{{ic|/usr/bin/chroot}} を実行する前にこのスクリプトは {{ic|/proc}} などの api ファイルシステムをマウントして、chroot から使える {{ic|/etc/resolv.conf}} を作成します。 |
||
− | 一時ファイルシステムを root でマウントします: |
||
+ | ==== chroot に入る ==== |
||
− | {{Note|2012年の新しい Arch Linux インストール CD から、{{ic|arch-chroot /mnt/arch}} コマンドを使うことができます。}} |
||
+ | 最初の引数として新しいルートディレクトリを指定して ''arch-chroot'' を実行します: |
||
− | cd /mnt/arch |
||
− | mount -t proc proc proc/ |
||
− | mount --rbind /sys sys/ |
||
− | mount --rbind /dev dev/ |
||
+ | # arch-chroot ''/path/to/new/root'' |
||
− | インターネット接続を chroot 環境で使いたいときは、DNS サーバーの設定をコピーする必要があるかもしれません: |
||
+ | これで、既存のインストールで利用できるほとんどの操作を実行できるようになります。[[D-Bus]] を必要とする一部のタスクは、[[chroot#使い方|使い方]] に記載されているように機能しません。 |
||
− | cp /etc/resolv.conf etc/resolv.conf |
||
− | + | ==== chroot を終了する ==== |
|
+ | chroot を終了するには、次を使用します: |
||
− | chroot /mnt/arch /bin/bash |
||
+ | # exit |
||
− | {{Note|{{ic|chroot: cannot run command '/usr/bin/bash': Exec format error}} というエラーがでた場合、おそらくインストールメディアと新しい root のプログラムのアーキテクチャが一致していません。}} |
||
− | {{Note|{{ic|chroot: '/usr/bin/bash': permission denied}} というエラーが出る場合、exec パーミッションを使ってマウントしなおして下さい: {{ic|mount -o remount,exec /mnt/arch}}.}} |
||
+ | ==== 1つのコマンドを実行して終了する ==== |
||
− | Bash の設定 ({{ic|~/.bashrc}} もしくは {{ic|/etc/bash.bashrc}}) を source コマンドで反映させることもできます: |
||
+ | chroot からコマンドを実行して終了するには、次のように、末尾にコマンドを追加します: |
||
− | source ~/.bashrc |
||
− | source /etc/profile |
||
+ | # arch-chroot ''/path/to/new/root'' ''mycommand'' |
||
− | 必要なら bash のプロンプトに chroot を使っているとわかるようにできます: |
||
+ | たとえば、{{ic|/mnt/arch}} にある chroot に対して {{ic|mkinitcpio -p linux}} を実行するには、次のようにします: |
||
− | # export PS1="(chroot) $PS1" |
||
+ | # arch-chroot /mnt/arch mkinitcpio -p linux |
||
− | == グラフィカルアプリケーションを動かす == |
||
+ | === Btrfs での実行 === |
||
− | システムで [[Xorg|X]] を動かしているならば、GUI アプリケーションを chroot 環境から起動できます。 |
||
+ | サブボリュームのある [[Btrfs]] ルートファイルシステムでは、chroot に入る前に、すべてのサブボリュームが [[fstab]] で指定されたとおりに正しくマウントされていることを確認する必要があります。 |
||
− | chroot 環境を X サーバーに接続するには、X サーバーの中で (つまりログインしているデスクトップから) 端末を開き、[[xhost]] コマンドを実行してください: |
||
+ | [[archinstall]] の Btrfs デフォルト設定の例: |
||
− | $ xhost + |
||
+ | {{bc|1= |
||
− | 次に、アプリケーションに X サーバーを指定するために、chroot の中で DISPLAY 環境変数を X サーバーを動かしているユーザーの DISPLAY 変数と一致するように指定してください。X サーバーを実行しているユーザーで以下を実行することで |
||
+ | # mount -o subvol=@ /dev/sd''XY'' /mnt |
||
+ | # mount -o subvol=@home /dev/sd''XY'' /mnt/home |
||
+ | # mount -o subvol=@pkg /dev/sd''XY'' /mnt/var/cache/pacman/pkg |
||
+ | # mount -o subvol=@log /dev/sd''XY'' /mnt/var/log |
||
+ | # mount -o subvol=@snapshots /dev/sd''XY'' /mnt/.snapshots |
||
+ | # mount /dev/sd''XZ'' /mnt/boot |
||
+ | # arch-chroot /mnt |
||
+ | }} |
||
+ | {{Tip|[[Btrfs#Compression|compression]] など、他のマウント オプションを指定することもできます。}} |
||
− | $ echo $DISPLAY |
||
+ | === chroot を使う === |
||
− | DISPLAY の値を見ることができます。値が (例えば) ":0" の場合、chroot 環境で DISPLAY 環境変数を ":0" に設定するには: |
||
+ | chroot を直接実行する場合は、実際の chroot の前に以下の手順が必要です。 |
||
− | $ export DISPLAY=:0 |
||
+ | まず、一時 API ファイルシステムをマウントします。 |
||
− | これで chroot のコマンドラインから GUI アプリを起動できるようになりました。 ;) |
||
+ | # cd ''/path/to/new/root'' |
||
− | == システムメンテナンスを行う == |
||
+ | # mount -t proc /proc proc/ |
||
+ | # mount -t sysfs /sys sys/ |
||
+ | # mount --rbind /dev dev/ |
||
+ | {{Warning|{{ic|--rbind}} を使用すると {{ic|dev/}} と {{ic|sys/}} の一部のサブディレクトリがアンマウントできなくなります。その状態で {{ic|umount -l}} でアンマウントを行おうとするとセッションが破壊され、再起動が必要になります。可能であれば {{ic|-o bind}} を使ってください。}} |
||
− | この時点で chroot 環境で必要なシステムメンテナンスを行えます。例えば: |
||
+ | また、任意で次のコマンドを実行: |
||
− | * ブートローダの再インストール |
||
− | * [[mkinitcpio|initramfs]] イメージのリビルド |
||
− | * パッケージのアップグレードもしくは[[Downgrading_Packages|ダウングレード]] |
||
− | * [[Password_Recovery|パスワードの再設定]] |
||
+ | # mount --rbind /run run/ |
||
− | == chroot を終了する == |
||
+ | UEFI システムを実行している場合は、EFI 変数にもアクセスする必要があります。それ以外の場合、GRUBをインストールすると、次のようなメッセージが表示されます: {{ic|UEFI variables not supported on this machine}}: |
||
− | システムメンテナンスが終わったら、chroot を終了します: |
||
+ | |||
+ | # mount --rbind /sys/firmware/efi/efivars sys/firmware/efi/efivars/ |
||
+ | |||
+ | 次に、chroot 環境でインターネット接続を使用するには、DNS の詳細をコピーします: |
||
+ | |||
+ | # cp /etc/resolv.conf etc/resolv.conf |
||
+ | |||
+ | 最後に、{{ic|''/location/of/new/root''}} に chroot し、Bash シェルを使用するように変更するには: |
||
+ | |||
+ | # chroot /location/of/new/root /bin/bash |
||
+ | |||
+ | {{Note| |
||
+ | * {{ic|chroot: cannot run command '/usr/bin/bash': Exec format error}} というエラーが表示される場合、ホスト環境と chroot 環境のアーキテクチャが一致していません。 |
||
+ | * {{ic|chroot: '/usr/bin/bash': permission denied}} というエラーが表示される場合、exec パーミッションを使ってマウントしなおして下さい: {{ic|mount -o remount,exec ''/location/of/new/root''}}。 |
||
+ | ** もしこれをチェックしても解決しない場合は、新しい環境のベースコンポーネントが無傷であることを [https://www.tldp.org/LDP/LG/issue52/okopnik.html 確認してください] (Arch root の場合は {{Pkg|pacutils}} から {{ic|1=paccheck --root=''/location/of/new/root'' --files --file-properties --md5sum glibc filesystem}} を試してみてください。) |
||
+ | }} |
||
+ | |||
+ | chroot した後は bash のローカル設定をロードします: |
||
+ | |||
+ | # source /etc/profile |
||
+ | # source ~/.bashrc |
||
+ | |||
+ | {{Tip|必要なら bash のプロンプトに chroot を使っていることをわかるようにできます: {{ic|1=# export PS1="(chroot) $PS1"}}。}} |
||
+ | |||
+ | chroot の使用が終了したら、次の方法で終了できます。 |
||
# exit |
# exit |
||
− | + | 次に、一時ファイルシステムをアンマウントします。 |
|
+ | # cd / |
||
− | # umount {proc,sys,dev/pts,dev,boot,[...],} |
||
+ | # umount --recursive ''/location/of/new/root'' |
||
+ | {{Note|{{ic|umount: /path: device is busy}} のようなエラーが表示される場合、次の可能性があります: chroot 内でまだプログラム (例: シェル) が動いている、またはサブマウントが存在している。プログラムを終了して {{ic|findmnt -R ''/location/of/new/root''}} でサブマウントを探して {{ic|umount}} してください。{{ic|umount}} が上手く通らない場合は {{ic|umount --force}} でアンマウントできることがあります。それでも駄目の場合は {{ic|umount --lazy}} を使って下さい。解決できない場合はすぐに {{ic|reboot}} してください。}} |
||
− | 最後にルートパーティションをアンマウントして完了です: |
||
+ | == グラフィカルアプリケーションを動かす == |
||
− | # cd .. |
||
− | # umount arch/ |
||
+ | システムで [[Xorg|X]] を動かしているならば、GUI アプリケーションを chroot 環境から起動できます。 |
||
− | {{Note|{{ic|/mnt}} (やその他のパーティション)が busy であるというエラーが出た場合、次の可能性があります: |
||
+ | chroot 環境を X サーバーに接続するには、X サーバーの中で (つまりログインしているデスクトップから) 端末を開き、[[xhost]] コマンドを実行してください、ユーザーの X サーバーに接続する許可を与えます ([[Xhost]] を参照): |
||
− | * chroot 内でまだプログラムが動いている |
||
+ | $ xhost +local: |
||
− | * サブマウントが存在している。(例えば {{ic|/mnt/arch}} の中に {{ic|/mnt/arch/boot}} がある)。こちらのほうが可能性が高いです、{{ic|lsblk}} を使いマウントポイントを確認してください: |
||
+ | 次に、アプリケーションに X サーバーを指定するために、chroot の中で DISPLAY 環境変数を X サーバーを動かしているユーザーの DISPLAY 変数と一致するように指定してください。例えば X サーバーを実行しているユーザーで以下を実行することで DISPLAY の値を見ることができます: |
||
− | : {{bc|lsblk /dev/sda}} |
||
+ | $ echo $DISPLAY |
||
− | : それでもパーティションがアンマウントできない時は {{ic|--force}} オプションを使って下さい: |
||
+ | 値が (例えば) ":0" の場合、chroot 環境で DISPLAY 環境変数を ":0" に設定するには: |
||
− | : {{bc|# umount -f /mnt}}}} |
||
+ | # export DISPLAY=:0 |
||
− | これで、安全に再起動することができます。 |
||
+ | == root 権限を使わない == |
||
− | == サンプル == |
||
+ | |||
− | 以下のようにすることでブラウズ中にインターネット上の攻撃からシステムを保護することができます: |
||
+ | Chroot は root 権限を必要しますが、場合によっては root 権限が使えないということもありえます。そのようなときは、他の実装によって chroot をシミュレートする方法があります。 |
||
− | {{bc|1= |
||
+ | |||
− | # # as root: |
||
+ | === PRoot === |
||
− | # cd /home/''user'' |
||
+ | |||
− | # mkdir myroot |
||
+ | [[PRoot]] を使うことで見せかけの root ディレクトリを変更して root 権限を使わずに {{ic|mount --bind}} を使用できます。アプリケーションをディレクトリに閉じ込めたり、別の CPU アーキテクチャでビルドされたプログラムを実行したいときに有用です。ただし、全てのファイルはホスト環境のユーザーによって所有されるため制限が存在します。Proot には {{ic|--root-id}} 引数があり、''fakeroot'' と同じような方法で制限を回避することができます。 |
||
− | # pacman -S arch-install-scripts |
||
+ | |||
− | # # pacstrap must see myroot as mounted: |
||
+ | === Fakechroot === |
||
− | # mount --bind myroot myroot |
||
+ | |||
− | # pacstrap -i myroot base base-devel |
||
+ | {{Pkg|fakechroot}} は chroot コールを傍受して結果を偽装するライブラリです。通常ユーザーで chroot をシミュレートすることができます。 |
||
− | # mount -t proc proc myroot/proc/ |
||
+ | |||
− | # mount -t sysfs sys myroot/sys/ |
||
+ | # fakechroot fakeroot chroot ~/my-chroot bash |
||
− | # mount -o bind /dev myroot/dev/ |
||
+ | |||
− | # mount -o gid=5 -t devpts pts myroot/dev/pts/ |
||
+ | === Unshare === |
||
− | # cp -i /etc/resolv.conf myroot/etc/ |
||
− | # chroot myroot |
||
− | # # inside chroot: |
||
− | # passwd # set a password |
||
− | # useradd -m -s /bin/bash ''user'' |
||
− | # passwd ''user'' # set a password |
||
− | # # in a shell outside the chroot: |
||
− | # pacman -S xorg-server-xnest |
||
− | # # in a shell outside the chroot you can run this as ''user'': |
||
− | $ Xnest -ac -geometry 1024x716+0+0 :1 |
||
− | # # continue inside the chroot: |
||
− | # pacman -S xterm |
||
− | # DISPLAY=:1 |
||
− | # xterm |
||
− | # # xterm is now running in Xnest |
||
− | # pacman -S xorg-server xorg-xinit xorg-server-utils |
||
− | # pacman -S openbox |
||
− | # # for java we need icedtea-web which requires some fonts: |
||
− | # nano /etc/locale.gen |
||
− | # # uncomment en_US.UTF-8 UTF-8, save and exit |
||
− | # locale-gen |
||
− | # echo LANG=en_US.UTF-8 > /etc/locale.conf |
||
− | # export LANG=en_US.UTF-8 |
||
− | # pacman -S ttf-dejavu |
||
− | # pacman -S icedtea-web |
||
− | # pacman -S firefox |
||
− | # firefox |
||
− | # # firefox is now running in Xnest |
||
− | # exit |
||
− | # # outside chroot: |
||
− | # chroot --userspec=''user'' myroot |
||
− | # # inside chroot as ''user'': |
||
− | $ DISPLAY=:1 |
||
− | $ openbox & |
||
− | $ HOME="/home/''user''" |
||
− | $ firefox |
||
− | }} |
||
− | 参照: [https://help.ubuntu.com/community/BasicChroot Basic Chroot] |
||
+ | {{Pkg|util-linux}} の一部である Unshare を使用して、新しいカーネル名前空間を作成できます。これは通常の chroot コマンドで機能します。 例えば: |
||
− | == chroot の代わりに systemd-nspawn を使う == |
||
− | また、同じことをするのに systemd-nspawn を使うことも可能です、これにはいくつかのメリットがあります ("systemd-nspawn" の man ページを見て下さい)。 |
||
+ | $ unshare --map-root-user chroot ~/namespace /bin/sh |
||
− | 手順はほとんど同じです: |
||
+ | == ヒントとテクニック == |
||
− | まず root パーティションをマウントしてください。 |
||
+ | === chroot 検出 === |
||
− | # mkdir /mnt/arch |
||
− | # mount /dev/sdx3 /mnt/arch |
||
+ | {{ic|systemd-detect-virt --chroot}} chroot 環境で呼び出されたかどうかを検出します。他の仮想化環境の検出については、{{man|1|systemd-detect-virt}} を参照してください。より広範な議論と従来のツールの使用法については、[https://unix.stackexchange.com/questions/14345/how-do-i-tell-im-running-in-a-chroot how-do-i-tell-im-running-in-a-chroot] を参照してください。 |
||
− | さらに boot と home パーティションを root パーティションの中にマウントしてください。 |
||
+ | == トラブルシューティング == |
||
− | # mount /dev/sdx1 /mnt/arch/boot |
||
− | # mount /dev/sdx4 /mnt/arch/home |
||
+ | === arch-chroot: /location/of/new/root is not a mountpoint. This may have undesirable side effects. === |
||
− | そして root パーティションにディレクトリを移動してから systemd-nspawn を実行してください。 |
||
+ | {{ic|arch-chroot ''/location/of/new/root''}} を実行すると、警告が発行されます。 |
||
− | # cd /mnt/arch |
||
− | # systemd-nspawn |
||
+ | ==> WARNING: ''/location/of/new/root'' is not a mountpoint. This may have undesirable side effects. |
||
− | 上述の通り proc, sys, dev, dev/pts などをマウントする必要はありません。systemd-nspawn はコンテナ環境で新しい init プロセスを起動してそれら全ての面倒を見ます。同じマシンで別の Linux OS を起動するのと似ていますが、仮想マシンではありません。 |
||
+ | バインドマウントを使用して chroot ディレクトリをマウントポイントにする説明と例については、{{man|8|arch-chroot}} を参照してください。 |
||
− | 終了するには、ログアウトするか poweroff コマンドを実行してください。それで上の説明と同じようにパーティションをアンマウントすることができます (proc, sys などは気にする必要がありません)。 |
||
+ | == 参照 == |
||
− | {{Expansion|Describe the steps to run an X server inside the systemd-nspawn container.}} |
||
+ | * [https://help.ubuntu.com/community/BasicChroot Chroot の基本] |
||
− | 関連項目: [[Arch systemd コンテナ]] を見て下さい。 |
2024年3月21日 (木) 01:02時点における最新版
Chroot は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。この変更された環境は chroot監獄 と呼ばれます。
目次
理由
Chroot を行う主な理由は起動やログインができなくなった時のシステムメンテナンスです。例えば:
- ブートローダーの再インストール。
- initramfs イメージのリビルド。
- パッケージのアップグレードもしくはダウングレード。
- パスワードの再設定。
- chroot でパッケージをビルドDeveloperWiki:クリーンな chroot 内でビルドするを参照。
要件
- chroot を行うには root 権限が必要です。
- 他の Linux 環境からブートする必要があります (LiveCD や USB メディア、別にインストールされたディストリビューションなど)。
- ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください (つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます:
# uname -m
。 - chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。
- 必要であればスワップを有効にしてください:
# swapon /dev/sdxY
- 必要であればインターネットに接続してください。
新しいルートの場所を準備する
chroot ターゲットは、ファイルシステム階層を含むディレクトリである必要があります。
インストールガイド では、このディレクトリは /mnt
になります。既存のインストールの場合は、既存のパーティションを自分で /mnt
にマウントする必要があります。
lsblk
を実行し、インストールのパーティションレイアウトをメモします。通常は、/dev/sdXY
のようなものになります。NVMe ドライブの場合は /dev/nvme0nXpY
になります。
ファイルシステムをマウントします。
# mount /dev/sdXY /mnt
EFI システムパーティション があり、それに変更を加える必要がある場合 (vmlinuz または initramfs イメージの更新など):
# mount /dev/sdXZ /mnt/esp
個別パーティション がある場合は、それらもマウントします。
次の例では、/path/to/new/root
は新しいルートが存在するディレクトリです (例: /mnt
)
使い方
chroot を使用するには、以下の 2 つの主要なオプションがあります。
arch-chroot を使う
Bash スクリプト arch-chroot
は arch-install-scripts パッケージに含まれています。/usr/bin/chroot
を実行する前にこのスクリプトは /proc
などの api ファイルシステムをマウントして、chroot から使える /etc/resolv.conf
を作成します。
chroot に入る
最初の引数として新しいルートディレクトリを指定して arch-chroot を実行します:
# arch-chroot /path/to/new/root
これで、既存のインストールで利用できるほとんどの操作を実行できるようになります。D-Bus を必要とする一部のタスクは、使い方 に記載されているように機能しません。
chroot を終了する
chroot を終了するには、次を使用します:
# exit
1つのコマンドを実行して終了する
chroot からコマンドを実行して終了するには、次のように、末尾にコマンドを追加します:
# arch-chroot /path/to/new/root mycommand
たとえば、/mnt/arch
にある chroot に対して mkinitcpio -p linux
を実行するには、次のようにします:
# arch-chroot /mnt/arch mkinitcpio -p linux
Btrfs での実行
サブボリュームのある Btrfs ルートファイルシステムでは、chroot に入る前に、すべてのサブボリュームが fstab で指定されたとおりに正しくマウントされていることを確認する必要があります。
archinstall の Btrfs デフォルト設定の例:
# mount -o subvol=@ /dev/sdXY /mnt # mount -o subvol=@home /dev/sdXY /mnt/home # mount -o subvol=@pkg /dev/sdXY /mnt/var/cache/pacman/pkg # mount -o subvol=@log /dev/sdXY /mnt/var/log # mount -o subvol=@snapshots /dev/sdXY /mnt/.snapshots # mount /dev/sdXZ /mnt/boot # arch-chroot /mnt
chroot を使う
chroot を直接実行する場合は、実際の chroot の前に以下の手順が必要です。
まず、一時 API ファイルシステムをマウントします。
# cd /path/to/new/root # mount -t proc /proc proc/ # mount -t sysfs /sys sys/ # mount --rbind /dev dev/
また、任意で次のコマンドを実行:
# mount --rbind /run run/
UEFI システムを実行している場合は、EFI 変数にもアクセスする必要があります。それ以外の場合、GRUBをインストールすると、次のようなメッセージが表示されます: UEFI variables not supported on this machine
:
# mount --rbind /sys/firmware/efi/efivars sys/firmware/efi/efivars/
次に、chroot 環境でインターネット接続を使用するには、DNS の詳細をコピーします:
# cp /etc/resolv.conf etc/resolv.conf
最後に、/location/of/new/root
に chroot し、Bash シェルを使用するように変更するには:
# chroot /location/of/new/root /bin/bash
chroot した後は bash のローカル設定をロードします:
# source /etc/profile # source ~/.bashrc
chroot の使用が終了したら、次の方法で終了できます。
# exit
次に、一時ファイルシステムをアンマウントします。
# cd / # umount --recursive /location/of/new/root
グラフィカルアプリケーションを動かす
システムで X を動かしているならば、GUI アプリケーションを chroot 環境から起動できます。
chroot 環境を X サーバーに接続するには、X サーバーの中で (つまりログインしているデスクトップから) 端末を開き、xhost コマンドを実行してください、ユーザーの X サーバーに接続する許可を与えます (Xhost を参照):
$ xhost +local:
次に、アプリケーションに X サーバーを指定するために、chroot の中で DISPLAY 環境変数を X サーバーを動かしているユーザーの DISPLAY 変数と一致するように指定してください。例えば X サーバーを実行しているユーザーで以下を実行することで DISPLAY の値を見ることができます:
$ echo $DISPLAY
値が (例えば) ":0" の場合、chroot 環境で DISPLAY 環境変数を ":0" に設定するには:
# export DISPLAY=:0
root 権限を使わない
Chroot は root 権限を必要しますが、場合によっては root 権限が使えないということもありえます。そのようなときは、他の実装によって chroot をシミュレートする方法があります。
PRoot
PRoot を使うことで見せかけの root ディレクトリを変更して root 権限を使わずに mount --bind
を使用できます。アプリケーションをディレクトリに閉じ込めたり、別の CPU アーキテクチャでビルドされたプログラムを実行したいときに有用です。ただし、全てのファイルはホスト環境のユーザーによって所有されるため制限が存在します。Proot には --root-id
引数があり、fakeroot と同じような方法で制限を回避することができます。
Fakechroot
fakechroot は chroot コールを傍受して結果を偽装するライブラリです。通常ユーザーで chroot をシミュレートすることができます。
# fakechroot fakeroot chroot ~/my-chroot bash
util-linux の一部である Unshare を使用して、新しいカーネル名前空間を作成できます。これは通常の chroot コマンドで機能します。 例えば:
$ unshare --map-root-user chroot ~/namespace /bin/sh
ヒントとテクニック
chroot 検出
systemd-detect-virt --chroot
chroot 環境で呼び出されたかどうかを検出します。他の仮想化環境の検出については、systemd-detect-virt(1) を参照してください。より広範な議論と従来のツールの使用法については、how-do-i-tell-im-running-in-a-chroot を参照してください。
トラブルシューティング
arch-chroot: /location/of/new/root is not a mountpoint. This may have undesirable side effects.
arch-chroot /location/of/new/root
を実行すると、警告が発行されます。
==> WARNING: /location/of/new/root is not a mountpoint. This may have undesirable side effects.
バインドマウントを使用して chroot ディレクトリをマウントポイントにする説明と例については、arch-chroot(8) を参照してください。