WSL 和 Ubuntu,如何移動 init 文件

WSL 和 Ubuntu,如何移動 init 文件

我在 wsl 上部署了一個開發環境,對此我感到非常興奮。我唯一的問題是init系統根路徑中存在一個檔案。

根子目錄

對於我的一位客戶,我需要一個/init目錄,這是一個無法改變的約束。

不用說,這使得我令人興奮的新發現的 wsl 開發環境無法用於該專案。

有沒有辦法更改 wslinit檔案的路徑?

答案1

遲到回答;最初提到的項目幾乎肯定已經結束;而且沒有人可能再有這種需求。但是哦,好吧,這裡是......

創建一個 chroot 監獄。以 root 身分執行以下操作:

  • 為 chroot 建立一個位置: sudo mkdir /newroot; cd /newroot
  • 重新建立/綁定安裝其中的所有必要目錄newroot
    • mkdir usr; mount --bind /usr usr
    • mkdir etc; mount --bind /etc etc
    • mkdir root
    • mkdir -p /home/user; mount --bind /home/user home/user(替換 WSl 實例的預設使用者名稱)。
    • mkdir var; mount --bind /var var
    • mkdir dev; mount --bind /dev dev
    • 對於任何其他所需的目錄,依此類推。
  • 請注意您的發行版中的根目錄符號連結。例如,至少 Ubuntu 還需要:
    • ln -s usr/lib lib
    • ln -s usr/lib32 lib32
    • 等等 ...
  • mount -t proc none proc
  • mkdir init(客戶要求初始化目錄而不是「真正的」root init文件

現在,要啟動 wsl 會話,請設定wsl -u root -e sh -c "cd /newroot; exec /usr/sbin/chroot /newroot/" su - username.username當然替換預設值。

這會將使用者啟動到僅包含您選擇的目錄結構的 chroot 監獄,其中顯然不包括該init文件,而是您的init目錄。

答案2

tl;dr: 該/init檔案無法從跑步WSL 分佈。因為子系統正在使用該文件,並且正在運行的 WSL 發行版中的所有進程都是從該文件派生出來的。

  • 那麼,我們能做什麼呢?該文件是鎖定在運行該發行版時由子系統執行。解決方法是等待或終止正在運行的發行版。使用wsl.exe --terminate Distro命令,其中Distro是要終止的正在執行的 WSL 發行版的名稱。前往安裝發行版的資料夾,然後執行或者。刪除init檔案。

  • 或者,如果您想製作整個 WSL 發行版的 tarball,則無需終止正在運行的發行版。創建 tarball 並排除 init:

cd /
tar -cpf backup.tar --exclude=/backup.tar --exclude=/init --xattrs --one-file-system /

在運行此命令之前檢查所有命令列選項。保留檔案權限是必須的。

  • 初始化檔案從哪裡來? init 檔案是由 Microsoft WSL 開發人員建立的不相似使用 systemd、sysVinit 或其他傳統的 GNU/Linux init 系統。實際的文件是System32\lxss\tools\init.當發行版啟動時,Linux 子系統管理員服務 (LXSS) 會將檔案複製到 rootfs 資料夾中(使用CopyFileW()Win32 API)。為了WSL2 首先\tools使用 9p 協定安裝該資料夾,然後按上述方式使用。

相關內容