我想测试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。