如何使用/测试pivot_root?

vvi*_*ilp 13 linux chroot docker

我想测试将pivot_root当前进程的根文件系统移动到目录put_old并创建new_root新的根文件系统的命令。

但我总是收到以下错误:

pivot_root: failed to change root from .' toold-root/': Invalid argument
Run Code Online (Sandbox Code Playgroud)

我使用 Fedora 作为基本根,我的主文件夹中有一个 Archlinux

[root@localhost arch-root]# ls
bin boot dev etc home lib lib64 mnt old-root 
opt proc root run sbin srv sys tmp usr var
[root@localhost arch-root]# pivot_root . old-root/
pivot_root: failed to change root from .' toold-root/': Invalid argument
Run Code Online (Sandbox Code Playgroud)

我也尝试调用 linux 函数pivot_root("/chroot_test", "/chroot_test/old-root");得到同样的错误。

关于这个的任何想法?

更新 #1

我也尝试pivot_root在 Docker 中进行测试。我将这个 arch-root 挂载到 Docker 容器中。但得到以下错误:Operation not permitted

root@00d871ce892b:/# cd test_root/
root@00d871ce892b:/test_root# ls
bin  boot  dev  etc  home  lib  lib64  mnt  old-root  opt  proc  root  run  sbin  srv     sys  test_pivot_root  test_pivot_root.c   tmp  usr  var
root@00d871ce892b:/test_root# pivot_root . tmp/
pivot_root: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

Mat*_*nco 6

您确定它arch-root位于可以挂载和卸载的单独文件系统上吗?

pivot_root以及最新的switch_root,通过处理内核中已挂载文件系统的信息来工作。

新的根文件系统必须是文件系统的“根”,不能通过“.”。作为新的根除非“。” 是挂载文件系统的根目录。

我相信,如果您想pivot_root从当前设置中尝试(假设 arch-root 是一个子目录而不是根目录),最简单的方法是创建一个tmpfs要切换到的文件系统,并在那里复制所需的内容。

沿着这些路线的东西可能会让你开始:(调整 500M 以适应du -sh arch-root

mkdir /ramroot
mount -n -t tmpfs -o size=500M 无 /ramroot
cd arch-root #(包含根文件系统内容)
找 。-depth -xdev -print | cpio -pd --quiet /ramroot
cd /ramroot
mkdir oldroot
枢轴根。老根
执行 chroot 。垃圾箱/sh


slm*_*slm 4

手册页来看,我相信这是您的问题:

The following restrictions apply to new_root and put_old:

- They must be directories.

- new_root and put_old must not be on the same file system as the current
root.

- put_old must be underneath new_root, that is, adding a nonzero number of
/.. to the string pointed to by put_old must yield the same directory as
new_root.

- No other file system may be mounted on put_old.
Run Code Online (Sandbox Code Playgroud)

根据上面的内容,文件系统都不put_old应该new_root与 驻留在同一文件系统上current_root

参考

  • 你的总结是错误的。`new_root` 和 `put_old` *可以*位于同一个 FS 上,只是两者都不应该驻留在 *与当前根*相同的 FS 上。 (2认同)