「Chroot」の版間の差分
ページの作成:「Category:システムリカバリ en:Chroot es:Change Root fa:تغییر ریشه fr:Chroot ro:Chroot ru:Change Root zh-CN:Change Root W...」 |
編集の要約なし |
||
| 1行目: | 1行目: | ||
[[Category:システムリカバリ]] |
[[Category:システムリカバリ]] |
||
[[en: |
[[en:Change root]] |
||
[[es:Change |
[[es:Change root]] |
||
[[fa:تغییر ریشه]] |
[[fa:تغییر ریشه]] |
||
[[fr:Chroot]] |
[[fr:Chroot]] |
||
[[ro:Chroot]] |
[[ro:Chroot]] |
||
[[ru:Change |
[[ru:Change root]] |
||
[[zh-CN:Change Root]] |
[[zh-CN:Change Root]] |
||
{{Related articles start}} |
|||
[[Wikipedia:ja:chroot|Chroot]] は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。そのため ''chroot監獄'' と呼ばれます。ルートディレクトリを変更することは通常システムのメンテナンスに使われます。例えばブートローダを再インストールしたりパスワードを再設定するときなどです。 |
|||
{{Related4|Install bundled 32-bit system in Arch64}} |
|||
{{Related4|proot}} |
|||
{{Related|systemd-nspawn}} |
|||
{{Related articles end}} |
|||
[[Wikipedia:ja:chroot|Chroot]] は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。そのため ''chroot監獄'' と呼ばれます。 |
|||
== |
== 理由 == |
||
Chroot を行う主な理由は起動やログインができなくなった時のシステムメンテナンスです。例えば: |
|||
* 他の Linux 環境からブートする必要があります(LiveCD や USB メディア、別にインストールされたディストリビューションなど)。 |
|||
* [[ブートローダー]]の再インストール。 |
|||
* chroot を行うには root 権限が必要です。 |
|||
* [[mkinitcpio|initramfs]] イメージのリビルド。 |
|||
* パッケージのアップグレードもしくは[[ダウングレード]]。 |
|||
* [[パスワードリカバリ|パスワードの再設定]]。 |
|||
[[Wikipedia:ja:Chroot#制限]] も参照。 |
|||
* ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください。(つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます: |
|||
== 要件 == |
|||
: {{bc|# uname -m}} |
|||
* chroot を行うには root 権限が必要です。 |
|||
* chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。スワップを有効にしたり ({{ic|swapon /dev/sdxY}})、インターネットに接続すると役立つかもしれません。 |
|||
* 他の Linux 環境からブートする必要があります (LiveCD や USB メディア、別にインストールされたディストリビューションなど)。 |
|||
* ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください (つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます: {{ic|# uname -m}}。 |
|||
* chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。 |
|||
* 必要であればスワップを有効にしてください: {{ic|swapon /dev/sdxY}}。 |
|||
* 必要であればインターネットに接続してください。 |
|||
== パーティションをマウント == |
== パーティションをマウント == |
||
chroot |
chroot する場合 Linux システムの root パーティションを最初にマウントする必要があります。カーネルによって割り当てられた名前を確認するには、次を実行: |
||
# lsblk |
# lsblk |
||
パーティション |
そして root パーティションをマウントするディレクトリを作成してマウントします: |
||
# fdisk -l |
|||
そして好きな場所にディレクトリを作り、マウントします: |
|||
# mkdir /mnt/arch |
# mkdir /mnt/arch |
||
# mount /dev/ |
# mount /dev/sdx1 /mnt/arch |
||
次に、 |
次に、他のシステムディレクトリ用のファイルシステム (例: {{ic|/boot}}, {{ic|/home}}...) が存在する場合は、それらもマウントします: |
||
# mount /dev/ |
# mount /dev/sdx2 /mnt/arch/boot/ |
||
# mount /dev/ |
# mount /dev/sdx3 /mnt/arch/home/ |
||
# mount ... |
|||
{{Note|[[ディスク暗号化|暗号化]]したファイルシステムにアクセスするときは、まずコンテナのロックを解除してください (例: [[ディスク暗号化#ブロックデバイスの暗号化|dm-crypt/LUKS]] による暗号化をしている場合 {{ic|# cryptsetup open /dev/sdX# ''name''}})。それから device-mapper によって与えられた名前を使ってファイルシステムをマウントしてください ({{ic|# mount /dev/mapper/''name'' /mnt/arch/...}})。詳細: [[Dm-crypt/デバイスの暗号化#デバイスマッパーで LUKS パーティションのロックを解除・マップ|デバイスマッパーで LUKS パーティションのロックを解除・マップ]]。}} |
|||
chroot した後もファイルシステムをマウントすることはできますが、事前に行ったほうが便利です。なぜなら chroot を解除したあとアンマウントする必要があるためです。またシャットダウンの安全性を高める利点もあります。外部の Linux はすべてのマウントされたパーティションを把握していて、シャットダウン中に安全にアンマウントしてくれるはずです。 |
|||
== Change root == |
== Change root == |
||
=== arch-chroot を使う === |
|||
一時ファイルシステムを root でマウントします: |
|||
Bash スクリプト {{ic|arch-chroot}} は[[公式リポジトリ]]の {{Pkg|arch-install-scripts}} パッケージに含まれています。{{ic|/usr/bin/chroot}} を実行する前にこのスクリプトは {{ic|/proc}} などの api ファイルシステムをマウントして chroot から使える {{ic|/etc/resolv.conf}} を作成します。 |
|||
{{Note|2012年の新しい Arch Linux インストール CD から、{{ic|arch-chroot /mnt/arch}} コマンドを使うことができます。}} |
|||
arch-chroot を実行するときは第一引数に新しい root ディレクトリを指定します: |
|||
cd /mnt/arch |
|||
mount -t proc proc proc/ |
|||
mount --rbind /sys sys/ |
|||
mount --rbind /dev dev/ |
|||
# arch-chroot /mnt/arch |
|||
インターネット接続を chroot 環境で使いたいときは、DNS サーバーの設定をコピーする必要があるかもしれません: |
|||
デフォルトの sh の代わりに bash シェルを起動するには: |
|||
cp /etc/resolv.conf etc/resolv.conf |
|||
# arch-chroot /mnt/arch /bin/bash |
|||
それでは chroot を使いましょう: |
|||
chroot から {{ic|mkinitcpio -p linux}} を実行して終了するには: |
|||
chroot /mnt/arch /bin/bash |
|||
# arch-chroot /mnt/arch /usr/bin/mkinitcpio -p linux |
|||
{{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}}.}} |
|||
=== chroot を使う === |
|||
Bash の設定 ({{ic|~/.bashrc}} もしくは {{ic|/etc/bash.bashrc}}) を source コマンドで反映させることもできます: |
|||
一時 api ファイルシステムをマウントします: |
|||
source ~/.bashrc |
|||
source /etc/profile |
|||
# cd /mnt/arch |
|||
必要なら bash のプロンプトに chroot を使っているとわかるようにできます: |
|||
# mount -t proc proc proc/ |
|||
# mount --rbind /sys sys/ |
|||
# mount --rbind /dev dev/ |
|||
また、任意で次のコマンドを実行: |
|||
# export PS1="(chroot) $PS1" |
|||
# mount --rbind /run run/ |
|||
== グラフィカルアプリケーションを動かす == |
|||
インターネット接続を chroot 環境で使いたい時は、DNS サーバーの設定をコピーします: |
|||
システムで [[Xorg|X]] を動かしているならば、GUI アプリケーションを chroot 環境から起動できます。 |
|||
# cp /etc/resolv.conf etc/resolv.conf |
|||
chroot 環境を X サーバーに接続するには、X サーバーの中で (つまりログインしているデスクトップから) 端末を開き、[[xhost]] コマンドを実行してください: |
|||
Bash シェルに chroot するには: |
|||
$ xhost + |
|||
# chroot /mnt/arch /bin/bash |
|||
次に、アプリケーションに X サーバーを指定するために、chroot の中で DISPLAY 環境変数を X サーバーを動かしているユーザーの DISPLAY 変数と一致するように指定してください。X サーバーを実行しているユーザーで以下を実行することで |
|||
{{Note| |
|||
$ echo $DISPLAY |
|||
* {{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 /mnt/arch}}。 |
|||
}} |
|||
chroot した後は bash のローカル設定をロードします: |
|||
DISPLAY の値を見ることができます。値が (例えば) ":0" の場合、chroot 環境で DISPLAY 環境変数を ":0" に設定するには: |
|||
# source /etc/profile |
|||
$ export DISPLAY=:0 |
|||
# source ~/.bashrc |
|||
{{Tip|必要なら bash のプロンプトに chroot を使っていることをわかるようにできます: {{ic|1=# export PS1="(chroot) $PS1"}}。}} |
|||
これで chroot のコマンドラインから GUI アプリを起動できるようになりました。 ;) |
|||
== |
=== systemd-nspawn を使う === |
||
systemd-nspawn を使うことで軽量な名前空間コンテナでコマンドや OS を実行することができます。大体は chroot と同じですが、ファイルシステムの階層だけでなく、プロセスツリーや様々な IPC サブシステム、ホスト・ドメイン名も完全に仮想化されるため強力です。 |
|||
この時点で chroot 環境で必要なシステムメンテナンスを行えます。例えば: |
|||
root パーティションのマウントポイントにディレクトリを移動して、systemd-nspawn を実行してください: |
|||
* ブートローダの再インストール |
|||
* [[mkinitcpio|initramfs]] イメージのリビルド |
|||
* パッケージのアップグレードもしくは[[Downgrading_Packages|ダウングレード]] |
|||
* [[Password_Recovery|パスワードの再設定]] |
|||
# cd /mnt/arch |
|||
== chroot を終了する == |
|||
# systemd-nspawn |
|||
{{ic|/proc}} などの api ファイルシステムを手動でマウントする必要はありません。systemd-nspawn はコンテナ環境で新しい init プロセスを起動してそれら全ての面倒を見ます。同じマシンで別の Linux OS を起動するのと似ていますが、仮想マシンではありません。 |
|||
システムメンテナンスが終わったら、chroot を終了します: |
|||
終了するには、ログアウトするか poweroff コマンドを実行してください。その後 [[#chroot を終了する]] で説明しているようにパーティションをアンマウントすることができます。 |
|||
# exit |
|||
== グラフィカルアプリケーションを動かす == |
|||
そして一時ファイルシステムやデバイスをアンマウントしてください: |
|||
システムで [[Xorg|X]] を動かしているならば、GUI アプリケーションを chroot 環境から起動できます。 |
|||
# umount {proc,sys,dev/pts,dev,boot,[...],} |
|||
chroot 環境を X サーバーに接続するには、X サーバーの中で (つまりログインしているデスクトップから) 端末を開き、[[xhost]] コマンドを実行してください、ユーザーの X サーバーに接続する許可を与えます: |
|||
最後にルートパーティションをアンマウントして完了です: |
|||
$ xhost +local: |
|||
# cd .. |
|||
# umount arch/ |
|||
次に、アプリケーションに X サーバーを指定するために、chroot の中で DISPLAY 環境変数を X サーバーを動かしているユーザーの DISPLAY 変数と一致するように指定してください。例えば X サーバーを実行しているユーザーで以下を実行することで DISPLAY の値を見ることができます: |
|||
{{Note|{{ic|/mnt}} (やその他のパーティション)が busy であるというエラーが出た場合、次の可能性があります: |
|||
$ echo $DISPLAY |
|||
* chroot 内でまだプログラムが動いている |
|||
値が (例えば) ":0" の場合、chroot 環境で DISPLAY 環境変数を ":0" に設定するには: |
|||
* サブマウントが存在している。(例えば {{ic|/mnt/arch}} の中に {{ic|/mnt/arch/boot}} がある)。こちらのほうが可能性が高いです、{{ic|lsblk}} を使いマウントポイントを確認してください: |
|||
# export DISPLAY=:0 |
|||
: {{bc|lsblk /dev/sda}} |
|||
== chroot を終了する == |
|||
: それでもパーティションがアンマウントできない時は {{ic|--force}} オプションを使って下さい: |
|||
システムメンテナンスが終わったら、chroot を終了します: |
|||
: {{bc|# umount -f /mnt}}}} |
|||
# exit |
|||
これで、安全に再起動することができます。 |
|||
そして一時ファイルシステムや root パーティションをアンマウントしてください: |
|||
== サンプル == |
|||
以下のようにすることでブラウズ中にインターネット上の攻撃からシステムを保護することができます: |
|||
{{bc|1= |
|||
# # as root: |
|||
# cd /home/''user'' |
|||
# mkdir myroot |
|||
# pacman -S arch-install-scripts |
|||
# # pacstrap must see myroot as mounted: |
|||
# mount --bind myroot myroot |
|||
# pacstrap -i myroot base base-devel |
|||
# mount -t proc proc myroot/proc/ |
|||
# mount -t sysfs sys myroot/sys/ |
|||
# mount -o bind /dev myroot/dev/ |
|||
# mount -o gid=5 -t devpts pts myroot/dev/pts/ |
|||
# 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] |
|||
# cd / |
|||
== chroot の代わりに systemd-nspawn を使う == |
|||
# umount --recursive /mnt/arch/ |
|||
また、同じことをするのに systemd-nspawn を使うことも可能です、これにはいくつかのメリットがあります ("systemd-nspawn" の man ページを見て下さい)。 |
|||
{{Note|{{ic|umount: /path: device is busy}} のようなエラーが表示される場合、次の可能性があります: chroot 内でまだプログラムが動いている、またはサブマウントが存在している。プログラムを終了して {{ic|mount | grep /mnt/arch}} でサブマウントを探して {{ic|umount}} してください。{{ic|umount}} が上手く通らない場合は {{ic|umount --force}} でアンマウントできることがあります。それでも駄目の場合は {{ic|umount --lazy}} を使って下さい。解決できない場合はすぐに {{ic|reboot}} してください。}} |
|||
手順はほとんど同じです: |
|||
== root 権限を使わない == |
|||
まず root パーティションをマウントしてください。 |
|||
Chroot は root 権限を必要しますが、場合によっては root 権限が使えないということもありえます。そのようなときは、他の実装によって chroot をシミュレートする方法があります。 |
|||
# mkdir /mnt/arch |
|||
# mount /dev/sdx3 /mnt/arch |
|||
=== Proot === |
|||
さらに boot と home パーティションを root パーティションの中にマウントしてください。 |
|||
[[en2:Proot|Proot]] を使うことで見せかけの root ディレクトリを変更して root 権限を使わずに {{ic|mount --bind}} を使用できます。アプリケーションをディレクトリに閉じ込めたり、別の CPU アーキテクチャでビルドされたプログラムを実行したいときに有用です。ただし、全てのファイルはホスト環境のユーザーによって所有されるため制限が存在します。Proot には {{ic|--root-id}} 引数があり、''fakeroot'' と同じような方法で制限を回避することができます。 |
|||
# mount /dev/sdx1 /mnt/arch/boot |
|||
# mount /dev/sdx4 /mnt/arch/home |
|||
=== Fakechroot === |
|||
そして root パーティションにディレクトリを移動してから systemd-nspawn を実行してください。 |
|||
# cd /mnt/arch |
|||
# systemd-nspawn |
|||
{{Pkg|fakechroot}} は chroot コールを傍受して結果を偽装するライブラリです。通常ユーザーで chroot をシミュレートすることができます。 |
|||
上述の通り proc, sys, dev, dev/pts などをマウントする必要はありません。systemd-nspawn はコンテナ環境で新しい init プロセスを起動してそれら全ての面倒を見ます。同じマシンで別の Linux OS を起動するのと似ていますが、仮想マシンではありません。 |
|||
# fakechroot fakeroot chroot ~/my-chroot bash |
|||
終了するには、ログアウトするか poweroff コマンドを実行してください。それで上の説明と同じようにパーティションをアンマウントすることができます (proc, sys などは気にする必要がありません)。 |
|||
== 参照 == |
|||
{{Expansion|Describe the steps to run an X server inside the systemd-nspawn container.}} |
|||
* [https://help.ubuntu.com/community/BasicChroot Basic Chroot] |
|||
関連項目: [[Arch systemd コンテナ]] を見て下さい。 |
|||
2015年8月29日 (土) 18:41時点における版
Chroot は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。そのため chroot監獄 と呼ばれます。
理由
Chroot を行う主な理由は起動やログインができなくなった時のシステムメンテナンスです。例えば:
要件
- chroot を行うには root 権限が必要です。
- 他の Linux 環境からブートする必要があります (LiveCD や USB メディア、別にインストールされたディストリビューションなど)。
- ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください (つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます:
# uname -m。 - chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。
- 必要であればスワップを有効にしてください:
swapon /dev/sdxY。 - 必要であればインターネットに接続してください。
パーティションをマウント
chroot する場合 Linux システムの root パーティションを最初にマウントする必要があります。カーネルによって割り当てられた名前を確認するには、次を実行:
# lsblk
そして root パーティションをマウントするディレクトリを作成してマウントします:
# mkdir /mnt/arch # mount /dev/sdx1 /mnt/arch
次に、他のシステムディレクトリ用のファイルシステム (例: /boot, /home...) が存在する場合は、それらもマウントします:
# mount /dev/sdx2 /mnt/arch/boot/ # mount /dev/sdx3 /mnt/arch/home/
# cryptsetup open /dev/sdX# name)。それから device-mapper によって与えられた名前を使ってファイルシステムをマウントしてください (# mount /dev/mapper/name /mnt/arch/...)。詳細: デバイスマッパーで LUKS パーティションのロックを解除・マップ。Change root
arch-chroot を使う
Bash スクリプト arch-chroot は公式リポジトリの arch-install-scripts パッケージに含まれています。/usr/bin/chroot を実行する前にこのスクリプトは /proc などの api ファイルシステムをマウントして chroot から使える /etc/resolv.conf を作成します。
arch-chroot を実行するときは第一引数に新しい root ディレクトリを指定します:
# arch-chroot /mnt/arch
デフォルトの sh の代わりに bash シェルを起動するには:
# arch-chroot /mnt/arch /bin/bash
chroot から mkinitcpio -p linux を実行して終了するには:
# arch-chroot /mnt/arch /usr/bin/mkinitcpio -p linux
chroot を使う
一時 api ファイルシステムをマウントします:
# cd /mnt/arch # mount -t proc proc proc/ # mount --rbind /sys sys/ # mount --rbind /dev dev/
また、任意で次のコマンドを実行:
# mount --rbind /run run/
インターネット接続を chroot 環境で使いたい時は、DNS サーバーの設定をコピーします:
# cp /etc/resolv.conf etc/resolv.conf
Bash シェルに chroot するには:
# chroot /mnt/arch /bin/bash
chroot: cannot run command '/usr/bin/bash': Exec format errorというエラーが表示される場合、ホスト環境と chroot 環境のアーキテクチャが一致していません。chroot: '/usr/bin/bash': permission deniedというエラーが表示される場合、exec パーミッションを使ってマウントしなおして下さい:mount -o remount,exec /mnt/arch。
chroot した後は bash のローカル設定をロードします:
# source /etc/profile # source ~/.bashrc
# export PS1="(chroot) $PS1"。systemd-nspawn を使う
systemd-nspawn を使うことで軽量な名前空間コンテナでコマンドや OS を実行することができます。大体は chroot と同じですが、ファイルシステムの階層だけでなく、プロセスツリーや様々な IPC サブシステム、ホスト・ドメイン名も完全に仮想化されるため強力です。
root パーティションのマウントポイントにディレクトリを移動して、systemd-nspawn を実行してください:
# cd /mnt/arch # systemd-nspawn
/proc などの api ファイルシステムを手動でマウントする必要はありません。systemd-nspawn はコンテナ環境で新しい init プロセスを起動してそれら全ての面倒を見ます。同じマシンで別の Linux OS を起動するのと似ていますが、仮想マシンではありません。
終了するには、ログアウトするか poweroff コマンドを実行してください。その後 #chroot を終了する で説明しているようにパーティションをアンマウントすることができます。
グラフィカルアプリケーションを動かす
システムで X を動かしているならば、GUI アプリケーションを chroot 環境から起動できます。
chroot 環境を X サーバーに接続するには、X サーバーの中で (つまりログインしているデスクトップから) 端末を開き、xhost コマンドを実行してください、ユーザーの X サーバーに接続する許可を与えます:
$ xhost +local:
次に、アプリケーションに X サーバーを指定するために、chroot の中で DISPLAY 環境変数を X サーバーを動かしているユーザーの DISPLAY 変数と一致するように指定してください。例えば X サーバーを実行しているユーザーで以下を実行することで DISPLAY の値を見ることができます:
$ echo $DISPLAY
値が (例えば) ":0" の場合、chroot 環境で DISPLAY 環境変数を ":0" に設定するには:
# export DISPLAY=:0
chroot を終了する
システムメンテナンスが終わったら、chroot を終了します:
# exit
そして一時ファイルシステムや root パーティションをアンマウントしてください:
# cd / # umount --recursive /mnt/arch/
umount: /path: device is busy のようなエラーが表示される場合、次の可能性があります: chroot 内でまだプログラムが動いている、またはサブマウントが存在している。プログラムを終了して mount でサブマウントを探して umount してください。umount が上手く通らない場合は umount --force でアンマウントできることがあります。それでも駄目の場合は umount --lazy を使って下さい。解決できない場合はすぐに reboot してください。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