如何在chroot环境中解析主机名?

我尝试使用chroot修复一个损坏的Ubuntu 14.04。我的做法是从USB启动Ubuntu,挂载需要修复的原始系统,并通过chroot切换到该系统。
sudo mount /dev/sdXY /mnt 
sudo mount -o bind /dev /mnt/dev 
sudo mount -o bind /sys /mnt/sys 
sudo mount -t proc /proc /mnt/proc 
sudo cp /proc/mounts /mnt/etc/mtab 
sudo chroot /mnt /bin/bash 

那个方法很好用,但在chroot环境中我无法访问互联网,所以apt无法解析主机名。 我应该怎么办?
ping www.askubuntu.com

不起作用。

我认为我的命令应该是 for d in dev sys run proc; do sudo mount -o bind /$d /mnt/$d ; done - Avinash Raj
请尽快回复我 :-) - Avinash Raj
似乎可以运行,但我不太确定,因为可能还有其他原因使其工作。无论如何,还是谢谢! - user5950
1个回答

在较新的Ubuntu系统中,名称解析由resolvconf服务处理,而/etc/resolv.conf是指向/run/resolvconf/resolv.conf的符号链接。您可以在执行chroot命令之前,将绑定挂载到/run文件系统以及其他绑定挂载中添加。
sudo mount -o bind /run /mnt/run

为了让chroot系统使用主机系统的DNS设置,或者在进入chroot系统后,临时创建一个静态的/etc/resolv.conf文件,并选择您喜欢的名称服务器(如)。
echo 'nameserver 8.8.4.4' | sudo tee -a /etc/resolv.conf

2"新的Ubuntu系统"是指从哪个版本开始通过resolvconf处理名称解析? - Pro Backup
@ProBackup 至少从12.04版本开始,我想是这样的,尽管可能已经进行了后移 - 请参阅Ubuntu 12.04中的DNS - steeldriver
2对我来说,执行sudo mount --bind /run /mnt/run在chroot进入一个失败的17.10升级中起到了作用。感谢您的答案! - labyrinth
有没有永久的解决方案? - birgersp
2如果您将整个/run目录与许多套接字绑定在一起,那么可能会有点违背chroot的目的,因此只绑定所需的套接字可能是一个更好的主意(例如resolvconf、可能还有nscd和syslog)。 - eckes
在18.04版本中,显然只需将/etc/resolv.conf复制到jail/etc/resolv.conf即可(为了增加安全性,我确保它的所有者是root,并且chmod设置为0444,但不确定这是否重要)。 - hanshenrik
@eckes 这取决于“目的”是什么,我个人认为 - 在这种情况下,chroot 被用于系统恢复,而不是作为一个监狱。 - steeldriver
是的,同意 @steeldriver - eckes
如果主机使用systemd,这将无法工作。至少在2020年左右的ClearLinux上是不起作用的。 - Richard
在Ubuntu 20.04作为主机和Finnix 122作为SquashFS chrooted的环境下运行良好。 - momo2047