«Устройство или ресурс занят», когда я пытаюсь переместить /etc/resolv.conf в Ubuntu: 18.04. Как это исправить? - PullRequest
1 голос
/ 05 марта 2020

У меня есть VPN-клиент в моем Docker контейнере (ubuntu:18.04).

Клиент должен сделать следующее:

mv /etc/resolv.conf /etc/resolv.conf.orig

Затем клиент должен создать новый /etc/resolv.conf с их DNS-серверами. Однако перемещение завершается с ошибкой:

mv: cannot move '/etc/resolv.conf' to '/etc/resolv.conf.orig': Device or resource busy

Можно ли это исправить? Заранее спасибо.

PS: Я не могу изменить код клиента VPN.

1 Ответ

0 голосов
/ 07 марта 2020

В контейнере Docker файл /etc/resolv.conf не является обычным обычным файлом. Docker управляет этим особым образом: механизм контейнера записывает спецификацию контейнера c, заданную контейнером, в файл вне контейнера и bind-mounts это в /etc/resolv.conf внутри контейнера.

Когда ваш VPN-клиент запускает mv /etc/resolv.conf /etc/resolv.conf.orig, все сводится к системному вызову rename(2) (или аналогичному вызову из этого семейства), и, согласно man-странице для этого системного вызова, ошибка EBUSY (Device or resource busy) может возвращаться по нескольким причинам, включая ситуацию, когда исходный файл является точкой монтирования:

EBUSY

Переименование завершается неудачно, поскольку oldpath или newpath - это каталог, который используется каким-либо процессом (возможно, как текущий рабочий каталог, или как каталог root, или потому что он был открыт для чтения), или используется системой (, например, как точка монтирования ), в то время как система считает это ошибкой , (Обратите внимание, что в таких случаях нет необходимости возвращать EBUSY - в любом случае нет ничего плохого в том, чтобы переименовывать, - но разрешено возвращать EBUSY, если система не может иначе обработать такие ситуации.)

Хотя есть замечание, что ошибка не гарантируется , которая будет возникать в таких обстоятельствах, похоже, что она всегда срабатывает для целей привязки (я думаю, что, вероятно, это происходит здесь ) :

$ touch sourcefile destfile
$ sudo mount --bind sourcefile destfile
$ mv destfile anotherfile
mv: cannot move 'destfile' to 'anotherfile': Device or resource busy

Таким образом, аналогично, вы не можете перемещаться /etc/resolv.conf внутри контейнера, так как это крепление для привязки, и нет прямого решения.

Учитывая, что связывание mount /etc/resolv.conf - монтирование для чтения и записи, а не только для чтения, этот файл все еще можно перезаписать:

$ mount | grep resolv.conf
/dev/sda1 on /etc/resolv.conf type ext4 (rw,relatime)

Таким образом, возможное исправление может заключаться в попытке copying этот файл в резервную копию .orig, а затем перезапись исходного вместо переименование исходного файла и последующее его повторное создание.

К сожалению, это не соответствует ваши ограничения (I can 't change the VPN client code.), так что держу пари, что вам здесь не повезло.

...