Docker &引用;“设备或资源忙”;当我在ubuntu:18.04中尝试move/etc/resolv.conf时。如何修复它?

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 这个问题能解决吗?提前谢谢你 注意:我无法

我的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
这个问题能解决吗?提前谢谢你


注意:我无法更改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