Docker &引用;“设备或资源忙”;当我在ubuntu:18.04中尝试move/etc/resolv.conf时。如何修复它?
我的Docker容器中有一个VPN客户端(Docker &引用;“设备或资源忙”;当我在ubuntu:18.04中尝试move/etc/resolv.conf时。如何修复它?,docker,ubuntu,resolv,Docker,Ubuntu,Resolv,我的Docker容器中有一个VPN客户端(ubuntu:18.04) 客户必须执行以下操作: mv /etc/resolv.conf /etc/resolv.conf.orig 然后,客户端应使用其DNS服务器创建新的/etc/resolv.conf。但是,移动失败并出现错误: mv: cannot move '/etc/resolv.conf' to '/etc/resolv.conf.orig': Device or resource busy 这个问题能解决吗?提前谢谢你 注意:我无法
ubuntu:18.04
)
客户必须执行以下操作:
mv /etc/resolv.conf /etc/resolv.conf.orig
然后,客户端应使用其DNS服务器创建新的/etc/resolv.conf
。但是,移动失败并出现错误:
mv: cannot move '/etc/resolv.conf' to '/etc/resolv.conf.orig': Device or resource busy
这个问题能解决吗?提前谢谢你
注意:我无法更改VPN客户端代码。在Docker容器中,
/etc/resolv.conf
文件不是普通的常规文件。Docker以一种特殊的方式管理它:容器引擎将特定于容器的配置写入容器外部的文件,并将其绑定到容器内部的/etc/resolv.conf
当您的VPN客户端运行mv/etc/resolv.conf/etc/resolv.conf.orig
时,可以归结为rename(2)
syscall(或来自此系列的类似调用),并且根据此syscall的手册页,EBUSY
(设备或资源繁忙
)错误可能会由于一些原因而返回,包括原始文件为装入点时的情况:
埃布西
重命名失败,因为oldpath或newpath是某个进程正在使用的目录(可能是当前工作目录、根目录或根目录)
因为它已打开以供读取)或系统正在使用(例如,作为装入点),而系统认为这是一个错误。(请注意,没有
在这种情况下,要求返回EBUSY-无论如何,重命名没有错-但是如果系统无法以其他方式处理此类情况,则允许返回EBUSY。)
尽管有一条评论指出,在这种情况下不一定会产生错误,但它似乎总是针对绑定装载目标触发(我猜可能会发生这种情况):
因此,类似地,您不能在容器内移动/etc/resolv.conf
,因为它是绑定挂载,没有直接的解决方案
考虑到/etc/resolv.conf
的绑定装载是读写装载,而不是只读装载,仍然可以覆盖此文件:
$mount | grep resolv.conf
/dev/sda1 on/etc/resolv.conf类型ext4(rw,relatime)
因此,可能的修复方法是尝试将此文件复制到.orig
备份,然后重写原始文件,而不是重命名原始文件,然后重新创建它
不幸的是,这不符合您的限制(
我无法更改VPN客户端代码。
),因此我打赌您在这里运气不好。这个答案对我很有帮助,因为我忘了删除用于调试的绑定挂载。非常感谢。
$ touch sourcefile destfile
$ sudo mount --bind sourcefile destfile
$ mv destfile anotherfile
mv: cannot move 'destfile' to 'anotherfile': Device or resource busy