WSL için Özel Linux Dağıtımı Oluşturma

Bu kılavuzda, .wsl bir dosya olan WSL dağıtımı oluşturma ve dağıtma adımları izlenir.

WSL dağıtımlarının iki bölümü vardır:

  1. Kök dosya sistemi (tar dosyası olarak dağıtılmış)
  2. Bildirim girdisi (dağıtım meta verilerini içerir)

Bu kılavuz yalnızca WSL sürüm 2.4.4 ve üzeri için geçerlidir.

Not

Önceki appx tabanlı dağıtım paketleme yönergeleri için bu depoya bakın.

WSL kök dosya sistemi tar dosyaları nedir?

WSL dağıtımları, Windows'da .wsl dosya uzantısına sahip bir tar dosyası tarafından belirlenir.

TAR dosyası (Bant Arşivi kısaltması), daha kolay dağıtım veya yedekleme için birden çok dosyayı tek bir dosyada birlikte depolamak için kullanılan bir arşiv dosyası türüdür. TAR dosyası, Linux dağıtımının kök dosya sistemini (tüm dağıtım dosyaları) ve WSL yapılandırma dosyalarını içerir. WSL yapılandırma dosyaları, WIndows işletim sistemine dağıtımın nasıl yükleneceğini ve başlatıldığını söyler.

WSL dağıtımı yapmak istediğiniz bir Linux sisteminiz olduğunda, başlamak için aşağıdaki adımları izleyin.

WSL yapılandırma dosyaları oluşturma

Dağıtımın içermesi gereken iki yapılandırma dosyası vardır:

  1. /etc/wsl-distribution.conf: WSL ile ilk kez başlatıldığında Linux dağıtımının nasıl yapılandırılması gerektiğini denetlemekle sorumlu dağıtım bakımcısı tarafından oluşturulan bir dosya.
  2. /etc/wsl.conf: Kullanıcıya özgü genel sistem ayarlarını içeren ve dağıtımın nasıl başlatıldığını denetleyan bir dosya. WSL yapılandırma dosyaları hakkında daha fazla bilgi edinin..

WSL dağıtım yapılandırma dosyasını ekleme

/etc/wsl-distribution.confdağıtım yapılandırma dosyası, Linux dağıtımının kullanıcı tarafından ilk başlatıldığında nasıl yapılandırılması gerektiğini tanımlar. Bu dosya etkileşimli olarak bir kullanıcı hesabı oluşturmak, lisans sözleşmesi göstermek vb. için kullanılabilir.

Örnek bir /etc/wsl-distribution.conf dosyası aşağıda verilmiştir:

# /etc/wsl-distribution.conf

[oobe]
command = /etc/oobe.sh
defaultUid = 1000
defaultName = my-distro

[shortcut]
enabled = true
icon = /usr/lib/wsl/my-icon.ico

[windowsterminal]
enabled = true
ProfileTemplate = /usr/lib/wsl/terminal-profile.json

WSL dağıtım dosyası yapılandırma seçenekleri:

Anahtar Değer Varsayılan Notes
oobe.command String Hiç kimse OOBE, "kutudan çıkarma deneyimi" veya "ilk çalıştırma deneyimi" anlamına gelir. Bu komut, kullanıcı dağıtımdaki etkileşimli kabuğu ilk kez açtığında çalışır. Bu komut sıfır olmayan bir değer döndürürse başarısız kabul edilir ve kullanıcı bir kabuk açamaz.
oobe.defaultUid tam sayı Hiç kimse Dağıtımın başladığı varsayılan UID. bu, oobe.command betiği yeni bir kullanıcı oluşturduğunda kullanışlıdır.
oobe.defaultName String Hiç kimse Dağıtımın kayıtlı olduğu varsayılan ad. Bu varsayılan ad şu komutla değiştirilebilir: wsl.exe --install <distro> --name <name>
shortcut.icon String Varsayılan WSL simgesi Dağıtım için başlangıç menüsü kısayolundaki simge. .ico formatında olmalı ve en fazla 10MB boyutunda olmalıdır.
shortcut.enabled Boolean doğru Dağıtım yüklendiğinde başlangıç menüsü kısayolunun oluşturulup oluşturulmayacağı.
windowsterminal.profileTemplate String Hiç kimse Bu dağıtım için bir Windows Terminal profili oluşturmak için JSON şablonu.
windowsterminal.enabled Boolean doğru Dağıtım yüklendiğinde bir terminal profilinin oluşturulup oluşturulmayacağı. profileTemplate ayarlanmadıysa, varsayılan profil oluşturulur.
windowsterminal.profileTemplate String Terminal şablon dosyasına giden yol Bu dağıtım için bir Windows Terminal profili oluşturmak için JSON şablonu.

Özellikle OOBE olarak adlandırılan, dağıtım için kutudan çıkar çıkmaz bir ilk kullanım deneyimi oluşturmanız gerekir. Aşağıda kullanabileceğiniz örnek bir bash betiği verilmiştir. Bu betik, oobe.defaultUid1000olarak ayarlandığını varsayar:

#!/bin/bash

set -ue

DEFAULT_GROUPS='adm,cdrom,sudo,dip,plugdev'
DEFAULT_UID='1000'

echo 'Please create a default UNIX user account. The username does not need to match your Windows username.'
echo 'For more information visit: https://aka.ms/wslusers'

if getent passwd "$DEFAULT_UID" > /dev/null ; then
  echo 'User account already exists, skipping creation'
  exit 0
fi

while true; do

  # Prompt from the username
  read -p 'Enter new UNIX username: ' username

  # Create the user
  if /usr/sbin/adduser --uid "$DEFAULT_UID" --quiet --gecos ''  "$username"; then

    if /usr/sbin/usermod "$username" -aG "$DEFAULT_GROUPS"; then
      break
    else
      /usr/sbin/deluser "$username"
    fi
  fi
done

Windows Terminal profili oluşturma

WSL, bir dağıtım yüklendiğinde otomatik olarak bir Windows Terminal profili oluşturur. Dağıtım bakımcıları WSL yapılandırma dosyasında windowsterminal.profileTemplate ayarlayarak oluşturulan profili özelleştirebilir /etc/wsl-distribution.conf.

Json dosyası, terminal profili json biçiminiizler. Örnek bir profil aşağıda verilmişti:

{
  "profiles": [
    {
      "antialiasingMode": "aliased",
      "fontWeight": "bold",
      "colorScheme": "Postmodern Tango Light"
    }
  ],
  "schemes": [
    {
      "name": "Postmodern Tango Light",
      "black": "#0C0C0C",
      "red": "#C50F1F",
      "green": "#13A10E",
      "yellow": "#C19C00",
      "blue": "#0037DA",
      "purple": "#881798",
      "cyan": "#3A96DD",
      "white": "#CCCCCC",
      "brightBlack": "#767676",
      "brightRed": "#E74856",
      "brightGreen": "#16C60C",
      "brightYellow": "#F9F1A5",
      "brightBlue": "#3B78FF",
      "brightPurple": "#B4009E",
      "brightCyan": "#61D6D6",
      "brightWhite": "#F2F2F2"
    }
  ]
}

Bu dosyanın nameveya commandLineprofilini belirtmesi gerekmez. Bunlar, terminal profili oluşturulurken WSL tarafından otomatik olarak eklenir.

Dağıtım başına yerel ayarlar için WSL yapılandırması ekleme

Dağıtım kök dosya sistemi bağlamında, systemd'nin, varsayılan olarak başlatılıp başlatılmayacağı da dahil olmak üzere, ayarlarını dağıtıma özgü /etc/wsl.conf yerel ayarlarda yapılandırmanızı öneririz. Aşağıdaki örniğe bakın.

# /etc/wsl.conf

[boot]
systemd=true|false

Dağıtım yazarı, boot.systemd değerini true (etkin) veya false (etkin değil) olarak ayarlayarak systemd'in varsayılan olarak etkinleştirilip etkinleştirilmediğini belirler.

Systemd'i varsayılan olarak etkinleştirmeyi seçtiyseniz Systemd önerilerine bakın.

'de desteklenen tüm ayarlar için WSL /etc/wsl.conf gelişmiş ayarlar yapılandırmasına bakın.

Tar dosyasını oluşturma

Dağıtım ve yapılandırma dosyaları yerleştirildikten sonra kök dosya sistemi tar dosyasında yakalanabilir.

Tar dosyasını oluşturmanın önerilen yolu:

cd /path/to/rootfs
tar --numeric-owner --absolute-names -c  * | gzip --best > ../install.tar.gz

Tar'ın kökü, dosya sisteminin kökü olmalıdır (kök dosya sistemini içeren bir dizin değil).

Önerilen sıkıştırma biçimi gzip'dir. Diğer sıkıştırma biçimleri, eski WSL sürümleriyle uyumsuzluk riski oluşturur.

Yapılandırmaya dahil edilmesi gereken ve olmaması gereken dosyaların listesi için Yapılandırma dosyası önerilerine bakın.

Mevcut bir Linux dağıtımının tar dosyasını elde etmek için, WSLile kullanmak üzere herhangi bir Linux dağıtımını içeri aktarma içinde docker kapsayıcısını dışarı aktarma yönergelerini bulun.

Tar dosyası arşivi hazır olduktan sonra, yerel olarak denemek için bkz. Dağıtımı yerel olarak deneme.

.wsl dosya uzantısı oluşturma

Özel Linux dağıtımınızı temsil eden bir tar dosyası oluşturduktan sonra son adım, .tar dosya uzantısını yeniden adlandırarak .wsl bir dosya uzantısıyla değiştirmektir. Bu dosya uzantısının yeniden adlandırılması, bunu bir WSL dağıtımı olarak işaretler. Tar, .tar.wslolarak yeniden adlandırıldıktan sonra, Dosya Gezgini'nde açıldığında (çift tıklandığında) dosya Windows'a doğru şekilde yüklenir. Bu çift tıklama deneyiminin düzgün çalışması için oobe.defaultName dosyasında bir /etc/wsl-distribution.conf girdisi gerekir.

WSL dağıtımınızı dağıtma

WSL kullanıcıları, wsl --list --online çalıştırarak kullanılabilir dağıtımları görüntüleyebilir ve bunları doğrudan wsl --install <distroName> (<distroName> Linux dağıtımının gerçek adıyla değiştirerek) yükleyebilir. Bu işlem bir dağıtım bildirim dosyası tarafından denetlenır. Bu bildirim dosyasını, wsl --install komut seçeneklerine eklenmesi için müşteri Linux dağıtımınıza ekleyebilirsiniz.

Oluşturduğunuz ve .wsl dosya uzantısıyla yeniden adlandırdığınız özel Linux dağıtım tar'ı, istediğiniz şekilde dağıtılabilir. İndirdikten sonra, kullanıcı dosyanın gerçek konumunu wsl --install --from-file <fileLocation> ile değiştirerek, <fileLocation> komutunu kullanarak komut satırından doğrudan yükleme yapabilir. Alternatif olarak, özel WSL dağıtımınız için .wsl dosyası çift tıklanarak açılabilir.

Dağıtım bildirimi ayrıntıları

dağıtım bildirimi, wsl --install <distribution>aracılığıyla yüklenebilen dağıtımlarla ilgili meta veriler içerir.

Katran tabanlı Linux dağıtımları, aşağıdaki biçimde ModernDistributionaltında listelenir:

{
    "ModernDistributions": {
        "<flavor>": [
            {
                "Name": "<version name>",
                "FriendlyName": "<friendly name>",
                "Default": true | false,
                "Amd64Url": {
                    "Url": "<tar url>",
                    "Sha256": "<tar sha256 hash>"
                },
                "Arm64Url": {
                    "Url": "<tar url>",
                    "Sha256": "<tar sha256 hash>"
                }
            },
            {
                ...
            }
        ],
        "<flavor>": [
            ...
        ]
    }
}

Her flavor girdisi yüklenebilir dağıtımların listesini içerir. Dağıtımlar, tür adı (bu durumda varsayılan seçenek yüklenir) veya sürüm adı kullanılarak yüklenebilir.

Aşağıdaki bildirimle wsl --install komutlarının nasıl çalıştığını görün:

{
    "ModernDistributions": {
        "my-distro": [
            {
                "Name": "my-distro-v3",
                "Default": true,
                "FriendlyName": "My distribution version 3 (latest)"
                [...]
            },
            {
                "Name": "my-distro-v2",
                "Default": false,
                "FriendlyName": "My distribution version 2"
                [...]
            }
        ]
    }
}

Örnek yükleme komutları:

wsl --install my-distro # Installs 'my-distro-v3' since it's the default for 'my-distro' flavor
wsl --install my-distro-v3 # Installs 'my-distro-v3' explicitly
wsl --install my-distro-v2 # Installs 'my-distro-v2' explicitly

Dağıtımınızı tüm WSL kullanıcıları için wsl --install'a ekleme

Dağıtımınızın şu komutun wsl --list --onlinelistesine eklenmesi için, dağıtımın dağıtım posta listesinde belirtilen Üyelik ölçütlerini karşılaması gerekir. Bu, listelenen tüm dağıtımların gerekli güvenlik standartlarına uymasını sağlar.

Dağıtımınız ölçütleri karşılıyorsa ve bunu --install listeye eklemek istiyorsanız WSL GitHub deposunda (https://github.com/microsoft/WSL) DistributionInfo.json dosyasını dağıtımınızın ayrıntılarıyla güncelleştiren bir çekme isteği gönderin. Bu çekme isteği WSL ekibi tarafından gözden geçirilecektir.

İşletmenizin veya iş grubunuzun wsl --install'a dağıtım eklemesi

Ayrıca, seçilen Windows cihazlarında kayıt defteri anahtarlarını düzenleyerek dağıtımınızı yalnızca belirli bir grup için wsl --install kullanılabilir hale getirebilirsiniz.

WSL dağıtım bildirimi, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxssiçinde kayıt defteri değerleri oluşturularak geçersiz kılınabilir.

  • DistributionListUrl: Dağıtım bildirimi URL'sini geçersiz kılar
  • DistributionListUrlAppend: Bu bildirim URL'sinden yüklenebilir dağıtımlar listesine dağıtımlar ekleyin

Her iki kayıt defteri değeri de dizedir (REG_SZ) ve URL biçiminde olması beklenir.

WSL sürüm 2.4.4'den başlayarak, yerel testi kolaylaştırmak için file:// protokolü desteklenir. Beklenen biçim: file:///C:/path/to/file.

Dağıtımı yerel olarak test edin

Dağıtım katranı test etmek için aşağıdaki örnek powershell betiğini kullanarak dağıtım bildirimini yeni dağıtımla geçersiz kılabilirsiniz. Önce aşağıdaki betiği override-manifest.ps1olarak kaydedin:

#Requires -RunAsAdministrator

[cmdletbinding(PositionalBinding = $false)]
param (
    [Parameter(Mandatory = $true)][string]$TarPath,
    [string]$Flavor = "test-distro",
    [string]$Version = "test-distro-v1",
    [string]$FriendlyName = "Test distribution version 1")

Set-StrictMode -Version latest

$TarPath = Resolve-Path $TarPath
$hash = (Get-Filehash $TarPath -Algorithm SHA256).Hash


$manifest= @{
    ModernDistributions=@{
        "$Flavor" = @(
            @{
                "Name" = "$Version"
                Default = $true
                FriendlyName = "$FriendlyName"
                Amd64Url = @{
                    Url = "file://$TarPath"
                    Sha256 = "0x$hash"
                }
            })
        }
    }

$manifestFile = "$PSScriptRoot/manifest.json"
$manifest | ConvertTo-Json -Depth 5 | Out-File -encoding ascii $manifestFile


Set-ItemProperty -Path "HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss" -Name DistributionListUrl -Value "file://$manifestFile" -Type String -Force

Ardından, yükseltilmiş bir PowerShell'de aşağıdaki komutu çalıştırarak yerel bildirimi yapılandırın:

.\override-manifest.ps1 -TarPath /path/to/tar

Tamamlandıktan sonra, wsl.exe --list --onlineaşağıdaki çıkışı görmeniz gerekir:

$ wsl --list --online
The following is a list of valid distributions that can be installed.
Install using 'wsl.exe --install <Distro>'.

NAME              FRIENDLY NAME
test-distro-v1    Test distribution version 1

Daha sonra wsl.exe --install test-distro-v1 çalıştırarak yeni dağıtımın yüklenmesini deneyebilirsiniz.

İşiniz bittiğinde resmi bildirime geri dönmek için HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\DistributionListUrl silebilirsiniz.

WSL özel Linux dağıtım önerileri

Yapılandırma dosyası önerileri

  • Özel dağıtımınızın hem /etc/wsl.conf hem de /etc/wsl-distribution.conf yapılandırma dosyalarını içerdiğinden emin olun. Her iki dosya da root:root sahipli olmalı ve izinleri 0644olmalıdır.
  • oobe.command ayarı yeni kullanıcı oluşturmak için kullanılıyorsa, hem uid hem de oobe.defaultUid1000olarak ayarlanmalıdır.
  • Dağıtım yapılandırma dosyasında hem oobe.defaultName hem de shortcut.icon ayarladığınızdan emin olun: /etc/wsl-distribution.conf
  • Kök dosya sistemine dosya /etc/resolv.conf eklemeyin.
  • /etc/passwd'a bir kök kullanıcı ekleyin. Bu kök kullanıcının uid'sı 0olmalıdır.
  • /etc/shadowiçinde parola karmaları olmamalıdır.
  • Arşiv bir çekirdek veya initramfs içermemelidir.

Sistemli öneriler

Eğer systemd etkinleştirilmişse, WSL ile ilgili sorunlara neden olabilecek birimler devre dışı bırakılmalı ya da maskelenmelidir. Aşağıdaki birimlerin WSL dağıtımlarında sorunlara neden olduğu bilinmektedir (hem sistem hem de kullanıcı birimleri için geçerlidir):

  • systemd-resolved.service
  • systemd-networkd.service
  • NetworkManager.service
  • systemd-tmpfiles-setup.service
  • systemd-tmpfiles-clean.service (geçici dosyaları temizleme servisi)
  • systemd-tmpfiles-clean.timer
  • systemd-tmpfiles-setup-dev-early.service
  • systemd-tmpfiles-setup-dev.service
  • tmp.mount