Pivot_rootより前のchrootが忙しいエラーを引き起こす

Pivot_rootより前のchrootが忙しいエラーを引き起こす
# unshare -m
# mount --bind / /mnt
# cd /mnt
# chroot .
# pivot_root . mnt
pivot_root: failed to change root from `.' to `mnt': Device or resource busy

なぜ失敗したのですか?私は指示に従っていますman 2 pivot_mount

ivot_root() は、以前のルートディレクトリを使用しているプロセスや、スレッドの現在のルートディレクトリと現在の作業ディレクトリを変更したり変更したりすることはできません。 ivot_root()呼び出し元は、ルートディレクトリまたは現在の作業ディレクトリが、以前のルートディレクトリにあるプロセスが両方の場合に正しく実行されていることを確認する必要があります。これを保証する簡単な方法は、ivot_root()を呼び出す前にルートディレクトリと現在の作業ディレクトリをnew_rootに変更することです。

これが記録されたEBUSYエラーとどのように一致するかわかりません。

間違い

ivot_root() は stat(2) によって返されたすべてのエラーを (errno で) 返すことができます。また、次を返すことができます。

忙しい new_root または put_old が現在ルートファイルシステムにあるか、ファイルシステムが put_old にマウントされています。

ベストアンサー1

マンページのこの部分は誤解を招く可能性があります。で説明されているように、異なる順序が必要なことがよくありますman 8 pivot_root

cd new_root             # chdir(new_root);
pivot_root . put_old    # pivot_root(".", put_old);
exec chroot .           # chroot(".");

これはもう一つの微妙な詳細のようですpivot_rootpivot_rootマウントネームスペースの再配置に焦点を当てていますが、カーネルコード移動するルートファイルシステムは、設定された各プロセスのルートによって決定されることを意味するようですchroot

その結果、「new_rootまたはput_oldが現在ルートファイルシステムにあります」というエラーが発生しました。

pivot_root機能するには、この微妙な詳細が必要です。別の言葉最新のLinuxで。マウントネームスペースのルートマウントで機能するように定義されている場合は、rootfs使用している特別なファイルシステムを移動しようとします。一般的な状況では見えない。しかし、rootfsは常に名前空間のルートマウントである必要があるため、これは許可されません。


pivot_root次の例に進むと、これが機能していることを確認できます。

# unshare -m
# mount --bind / /mnt
# cd /mnt
# chroot /mnt
# pivot_root . mnt
pivot_root: failed to change root from `.' to `mnt': Device or resource busy

# exit  # leave chroot
# mount --bind . mnt
# cd mnt
# mount --bind /proc proc
# findmnt | grep mnt
└─/mnt                                /dev/mapper/alan_dell_2016-fedora ext4            rw,relatime,seclabel
  └─/mnt                              /dev/mapper/alan_dell_2016-fedora ext4            rw,relatime,seclabel
    └─/mnt/proc                       proc                              proc            rw,nosuid,nodev,noexec,relatime

# chroot /mnt  # re-enter chroot
# cd /mnt
# pivot_root . mnt  # this one works
# exit  # leave chroot
# findmnt | grep mnt
└─/mnt                                /dev/mapper/alan_dell_2016-fedora        ext4            rw,relatime,seclabel
  ├─/mnt/mnt                          /dev/mapper/alan_dell_2016-fedora        ext4            rw,relatime,seclabel
  └─/mnt/proc                         /dev/mapper/alan_dell_2016-fedora[/proc] ext4            rw,relatime,seclabel

2回目のpivot_root呼び出しが機能します。ただし、マウントされた名前空間のルートには影響しません。外部では と をchroot変更します。/mnt/mnt/mnt

おすすめ記事