簡體   English   中英

當我嘗試在 ubuntu:18.04 中移動 /etc/resolv.conf 時出現“設備或資源繁忙”。 怎么修?

[英]"Device or resource busy" when i try move /etc/resolv.conf in ubuntu:18.04. How fix it?

我的 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

這可以解決嗎? 謝謝你提前。

PS:我無法更改 VPN 客戶端代碼。

在 Docker 容器中,/etc/ /etc/resolv.conf文件不是普通的常規文件。 Docker 以一種特殊的方式對其進行管理:容器引擎將特定於容器的配置寫入容器外部的文件中,並將其綁定掛載到容器內部的/etc/resolv.conf中。

當您的 VPN 客戶端運行mv /etc/resolv.conf /etc/resolv.conf.orig時,事情歸結為rename(2)系統調用(或該系列的類似調用),並且根據此系統調用的手冊頁, EBUSYDevice or resource busy )錯誤可能由幾個原因返回,包括原始文件是掛載點的情況:

重命名失敗,因為 oldpath 或 newpath 是某個進程正在使用的目錄(可能作為當前工作目錄,或者作為根目錄,或者因為它已打開以供讀取)或正在被系統使用(例如作為掛載點),而系統認為這是一個錯誤。 (請注意,在這種情況下不需要返回 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 ,因為它是綁定安裝,並且沒有直接的解決方案。

鑒於/etc/resolv.conf的綁定掛載是讀寫掛載,而不是只讀掛載,仍然可以覆蓋此文件:

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

因此,可能的解決方法是嘗試將此文件復制.orig備份,然后重寫原始文件,而不是重命名原始文件然后重新創建它。

不幸的是,這不符合您的限制( I can 't change the VPN client code. ),所以我敢打賭,您在這里不走運。

任何需要將文件移動到/etc/resolv.conf的方法在 docker 容器中都會失敗。 解決方法是重寫原始文件,而不是在其上移動或重命名修改后的版本。

例如,在bash提示符下使用以下命令:

(rc=$(sed 's/^\(nameserver 192\.168\.\)/# \1/' /etc/resolv.conf)
     echo "$rc" > /etc/resolv.conf)

這可以通過重寫/etc/resolv.conf來實現,如下所示:

  • 通過流編輯器sed讀取和修改/etc/resov.conf的當前內容
  • 此示例中的 sed 腳本用於注釋掉以nameserver 192.168.
  • 將更新的內容保存在變量rc
  • "$rc"中的更新內容覆蓋原始文件/etc/resolv.conf

括號中的命令列表用於在子 shell 中操作,以避免使用變量名rc污染當前 shell 的名稱空間,以防萬一它正在使用中。

請注意,此命令不需要sudo ,因為它利用了容器內默認可用的超級用戶權限。

請注意, sed -i (就地編輯)涉及將更新的文件移動到原始文件上,並且不起作用。

但如果可視化編輯器vi在容器中可用,則使用vi編輯和保存/etc/resolv.conf是可行的,因為vi會直接修改原始文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM