我用 chroot 进入我的测试系统
mount /dev/vg0/vm01.buster-test-disk /media/vm01.buster-test-disk/
mount -t proc none /media/vm01.buster-test-disk/proc
mount --bind /dev /media/vm01.buster-test-disk/dev
mount -t sysfs sysfs /media/vm01.buster-test-disk/sys
chroot /media/vm01.buster-test-disk/ /bin/bash
修改主机名并退出
hostname buster-test
echo buster-test > /etc/hostname
echo "127.0.0.1 buster-test" >> /etc/hosts
exit
卸载
umount /media/vm01.buster-test-disk/proc
umount /media/vm01.buster-test-disk/dev
umount /media/vm01.buster-test-disk/sys
umount -l /media/vm01.buster-test-disk
问题
现在主机的主机名设置为buster-test
即使我在另一个 shell 中登录
为什么主机名改变了?当在 chroot 内部执行操作时,是否还有其他事情可能会在 chroot 外部发生变化?
答案1
运行hostname buster-test
更改了正在运行的内核中的主机名(在 Linux 上,在当前悉尼科技大学命名空间)。chroot
其本身根本无法控制这一点,因此主机名更改在外部也是可见的。
当您使用 时chroot
,您仅限制对文件系统的一部分的访问;任何不在文件系统中管理的内容都不会受到chroot
.这包括网络设置、日期和时间、用户权限等。要限制此类更改,您需要使用命名空间(或非 Linux 系统上的类似技术);在 Linux 上,您可以通过运行以下命令来隔离进程unshare
。
答案2
主机名是系统调用nodename
的一部分uname(2)
,相关数据驻留在内核中。
除非您有一个能够处理具有自己的内核数据结构的区域之类的内核,否则简单的方法chroot
没有帮助。
答案3
systemd-nspawn
可以用来代替chroot
获取容器化的 chroot。与容器相比,容器在主机和来宾系统之间具有更好的隔离性chroot
。
systemd-nspawn
可用于在轻量级命名空间容器中运行命令或操作系统。在许多方面它与 类似chroot(1)
,但更强大,因为它完全虚拟化文件系统层次结构、进程树、各种 IPC 子系统以及主机和域名。