WSL 的檔案權限

此頁面將詳細說明如何在 Windows 子系統 Linux 版上轉譯 Linux 檔案權限,特別是當您在 NT 檔案系統上存取 Windows 內的資源時。 本文件假設您對 Linux 檔案系統權限結構umask 命令有基本了解。

從 WSL 存取 Windows 檔案時,檔案權限會從 Windows 權限中計算,或從已由 WSL 新增至檔案的中繼資料中讀取。 此中繼資料不會預設為啟用。

Windows 檔案上的 WSL 中繼資料

在 WSL 中啟用中繼資料作為掛接選項時,即可新增並解譯 Windows NT 檔案上的擴充屬性,進而提供 Linux 檔案系統權限。

WSL 可以新增四個 NTFS 擴充屬性:

屬性名稱 說明
$LXUID 使用者的擁有者識別碼
$LXGID 群組的擁有者識別碼
$LXMOD 檔案模式 (檔案系統權限八進位表示法和類型,例如:0777)
$LXDEV 裝置 (如果是裝置檔案)

此外,不是一般檔案或目錄的任何檔案 (例如:符號連結、FIFO、封鎖裝置、unix 通訊端和字元裝置) 也會有 NTFS 重新分析點。 這可讓您更快速地判斷指定目錄中的檔案類型,而不需要查詢其擴充屬性。

檔案存取案例

以下說明使用 Windows 子系統 Linux 版時,如何決定各種檔案存取方式的權限。

從 Linux 存取 Windows 磁碟機檔案系統 (DrvFS) 中的檔案

當您從 WSL 存取 Windows 檔案時,很可能會發生這些情況 (通常是透過 /mnt/c)。

從現有的 Windows 檔案讀取檔案權限

此結果取決於檔案是否已有現有的中繼資料。

DrvFS 檔案沒有中繼資料 (預設值)

如果檔案沒有相關聯的中繼資料,我們會將 Windows 使用者的有效權限轉譯為讀取/寫入/執行位元,並將其設定為與「使用者」、「群組」和「其他」相同的值。 例如,如果您的 Windows 使用者帳戶具有讀取和執行存取權,但不具有檔案的寫入存取權,則這會在「使用者」、「群組」和「其他」中顯示為 r-x。 如果檔案在 Windows 中設定了「唯讀」屬性,則我們不會在 Linux 中授與寫入存取權。

檔案具有中繼資料

如果檔案有中繼資料,我們會直接使用這些中繼資料值,而不會轉譯 Windows 使用者的有效權限。

使用 chmod 變更現有 Windows 檔案的權限

此結果取決於檔案是否已有現有的中繼資料。

Chmod 檔案沒有中繼資料 (預設值)

Chmod 只會有一個效果,如果您移除檔案的所有寫入屬性,則 Windows 檔案上將會設定「唯讀」屬性,因為此行為與 Linux 中屬於 SMB (伺服器訊息區) 用戶端的 CIFS (一般網際網路檔案系統) 相同。

Chmod 檔案具有中繼資料

Chmod 會根據檔案的現有中繼資料來變更或新增中繼資料。

請記住,您提供給自己的存取權不能比您在 Windows 上擁有的存取權多,即使中繼資料顯示您有權限也一樣。 例如,您可以使用 chmod 777,將中繼資料設定為顯示您有檔案的寫入權限,但如果您嘗試存取該檔案,您仍然無法寫入該檔案。 這是因為互通性,因為任何 Windows 檔案的讀取或寫入命令都會透過您的 Windows 使用者權限來路由傳送。

在 DriveFS 中建立檔案

此結果取決於是否已啟用中繼資料。

未啟用中繼資料 (預設值)

新建檔案的 Windows 權限會與您在 Windows 中建立檔案時一樣 (如果沒有特定的安全描述項),並且會繼承父系的權限。

中繼資料已啟用

檔案的權限位元會設定為遵循 Linux umask,而且檔案會與中繼資料一起儲存。

哪些 Linux 使用者和 Linux 群組擁有該檔案?

此結果取決於檔案是否已有現有的中繼資料。

使用者檔案沒有中繼資料 (預設值)

在預設案例中,自動掛接 Windows 磁碟機時,我們會指定將任何檔案的使用者識別碼 (UID) 設定為 WSL 使用者的使用者識別碼,而群組識別碼 (GID) 會設定為 WSL 使用者的主要群組識別碼。

使用者檔案具有中繼資料

中繼資料中指定的 UID 和 GID 會套用為檔案的使用者擁有者和群組擁有者。

使用 \\wsl$ 從 Windows 存取 Linux 檔案

透過 \\wsl$ 存取 Linux 檔案將會使用 WSL 發行版本的預設使用者。 因此,存取 Linux 檔案的任何 Windows 應用程式都會擁有與預設使用者相同的權限。

建立新檔案

從 Windows 的 WSL 發行版本內建立新檔案時,會套用預設的 umask。 預設的 umask 為 022,換句話說,其會允許除了「群組」和「其他」寫入權限以外的所有權限。

從 Linux 存取 Linux 根檔案系統中的檔案

在 Linux 根檔案系統中建立、修改或存取的任何檔案,都會遵循標準的 Linux 慣例,例如將 umask 套用至新建立的檔案。

設定檔案權限

您可以使用 wsl.conf 中的掛接選項,在 Windows 磁碟機內設定您的檔案權限。 掛接選項可讓您設定 umaskdmaskfmask 權限遮罩。 umask 會套用至所有檔案、dmask 只會套用至目錄,而 fmask 只會套用至檔案。 然後,這些權限遮罩會在套用至檔案時完成邏輯 OR 作業,例如:如果您的 umask 值為 023,而 fmask 值為 022,則產生的檔案權限遮罩為 023

深入瞭解:每個散發設定選項與 wsl。