メインコンテンツへスキップ
  1. ノート/
  2. システム底层/

chroot

·1323 文字·3 分· loading · loading · · ·
ICE345
著者
ICE345
CS Student | System | Linux | OCaml
この記事は中国語版の内容をもとに、技術用語と文章表現を日本語向けに整理したものです。chroot は便利な復旧手段ですが、完全な仮想マシンやセキュリティサンドボックスではありません。

1. chroot とは
#

chroot(change root)は、プロセスから見えるルートディレクトリ / を、指定したディレクトリへ一時的に変更する仕組みです。主に次の用途で使われます。

  • 起動できなくなった Linux の復旧。
  • 別のルートファイルシステムからの設定変更。
  • パッケージやブートローダーの修復。
  • テスト用の限定的なファイルシステム環境。

ただし、chroot はカーネルやプロセスを分離しません。ホスト側の root 権限を持つプロセスから安全に隔離する仕組みではないため、コンテナや仮想マシンの代わりにはなりません。

2. 典型的な準備
#

以下は /dev/sdXX を修復対象のルートパーティション、/dev/sdaXX/home パーティションとする例です。実際のデバイス名は必ず lsblk で確認してください。

sudo mount /dev/sdXX /mnt
sudo mount /dev/sdaXX /mnt/home       # /home が別パーティションの場合

sudo mount --rbind /dev /mnt/dev
sudo mount --make-rslave /mnt/dev
sudo mount --rbind /proc /mnt/proc
sudo mount --make-rslave /mnt/proc
sudo mount --rbind /sys /mnt/sys
sudo mount --make-rslave /mnt/sys
sudo mount --rbind /run /mnt/run
sudo mount --make-rslave /mnt/run

# ネットワークを使う場合。シンボリックリンク構成によって方法が異なる
sudo cp -L /etc/resolv.conf /mnt/etc/resolv.conf

sudo chroot /mnt /bin/bash

--rbind--make-rslave は、/dev/pts などの下位マウントもまとめて扱うための一般的な方法です。環境によっては個別の --bind でも動作します。

3. 何をマウントするのか
#

/proc
#

プロセス、CPU、メモリ、カーネルパラメータなどを公開する仮想ファイルシステムです。pstop などのコマンドがシステムの状態を確認するために利用します。

sudo mount --rbind /proc /mnt/proc
sudo mount --make-rslave /mnt/proc

/sys
#

デバイス、バス、ドライバ、電源管理などの情報を公開する sysfs です。udevadm やハードウェア関連のツールが利用します。

sudo mount --rbind /sys /mnt/sys
sudo mount --make-rslave /mnt/sys

/dev/dev/pts
#

/dev にはディスク、端末、USB などのデバイスノードがあります。/dev/pts は SSH やシェルが使う擬似端末を提供します。

sudo mount --rbind /dev /mnt/dev
sudo mount --make-rslave /mnt/dev

/dev を再帰的にバインドすれば、通常は /dev/pts も含まれます。

/run
#

現在実行中のシステムが作成する PID ファイル、ソケット、サービス状態などを保持します。復旧作業で systemd やサービスの情報が必要な場合に利用します。

sudo mount --rbind /run /mnt/run
sudo mount --make-rslave /mnt/run

/etc/resolv.conf
#

DNS サーバーの設定です。chroot 内でパッケージを更新する場合など、名前解決に必要になることがあります。

sudo cp -L /etc/resolv.conf /mnt/etc/resolv.conf

システムによっては /etc/resolv.confsystemd-resolved のソケットや別ファイルへのシンボリックリンクになっています。その場合は、コピー後のリンク構成を確認してください。

/tmp
#

一時ファイルを必要とするプログラムを動かす場合は、/tmp も用意できます。ただし、すべての復旧作業に必須ではありません。

sudo mount --bind /tmp /mnt/tmp

4. chroot に入った後の例
#

sudo chroot /mnt /bin/bash
export HOME=/root
export LC_ALL=C

# 例:GRUB を再インストールし、設定を生成する
grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

UEFI システムを修復する場合は、ESP を正しい場所へマウントし、grub-install の対象と EFI 変数の利用可否を確認してください。

5. 終了とアンマウント
#

exit

sudo umount -R /mnt/dev
sudo umount -R /mnt/proc
sudo umount -R /mnt/sys
sudo umount -R /mnt/run
sudo umount /mnt/home       # 別パーティションをマウントした場合
sudo umount /mnt

アンマウントに失敗した場合は、chroot 内のシェルや作業ディレクトリが /mnt 配下に残っていないか確認してください。

関連記事


评论