如何使用/测试pivot_root?

如何使用/测试pivot_root?

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

但我总是收到以下错误:

pivot_root: failed to change root from .' toold-root/': Invalid argument

我使用 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

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

对此有什么想法吗?

更新 #1

我也尝试在 Docker 中进行测试pivot_root。我将这个 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

答案1

您真的确定它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 #(包含根文件系统内容)
寻找 。 -深度-xdev -打印| cpio -pd --安静 /ramroot
cd /ramroot
mkdir 旧根目录
枢轴根。老根
执行 chroot 。箱/箱

答案2

来自手册页,我相信这是你的问题:

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.

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

参考

答案3

问题的作者提供了这个解决方案:

解决方案

我已经发现解决方案:

运行docker--privileged=true

所以我们可以在docker容器中测试pivot_root。

相关内容