# 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_root
。pivot_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