Windows Subsystem for Linux 2 (WSL 2) — En büyük aşklar kavgayla başlar

Deniz İrgin
Codefiction
Published in
12 min readApr 25, 2020
Satya Nadella — Microsoft Cloud Briefing — 20 Ekim 2014

(Biraz arka plan vermeye çalışırken amansızca Microsoft övmüşüm. İsteyenler doğrudan WSL — Windows Subsystem for Linux başlığına gidebilirler.)

Yazının başlığında kullandığım fotoğraf, bundan on yıllar sonra bile 21. yüzyılın en ikonik fotoğraflarından biri olarak sayılacaktır diye düşünüyorum. Microsoft dünyasında bir devrin kapandığını ve yenisinin başladığını simgeliyor.

Microsoft Connect(); 2016 konferansında .NET Core, Visual Studio for Mac gibi bir çok heyecan verici duyuruların yanısıra, belki de en önemli duyurulardan biri Microsoft’un Linux Foundation’a katılmasıydı. Oysaki Microsoft’un eski CEO’su Steve Ballmer’ Linux bir kanserdir dediğinde tarihler 2001 yılını gösteriyordu.

Microsoft’un Linux atılımının arkasındaki motivasyonla ilgili bir çok farklı görüş var. Bazıları Microsoft’un pes ettiğini, bazıları samimi olduğunu, bazıları ise art niyetli olduğunu düşünüyorlar. Bence hepsinde bir parça doğruluk payı var. Ama ortada tek bir gerçek var, Microsoft uzun zamandır bir değişimin içerisinde ve artık “Babanızın zamanındaki Microsoft değil”.

Bu babanızın zamanındaki Microsoft değil!

Steve Ballmer sahnede bunun CD-ROM’u yok diyerek MacBook sallarken.

Yaklaşık on dört senedir Microsoft teknolojileriyle geliştirme yapıyorum. Ben yazılıma ilk başladığımda ortada zaten değişmekte olan bir Microsoft vardı.

Microsoft özellikle 1990'larda yaptığı hamlelerle open-source ve Linux toplulukları tarafından evil corporation, bütün kötülüklerin anası, hep gizli ajandası olan bir şirket olarak görülüyordu. Şimdi de hala haklı olarak şüpheyle bakılan bir şirket ama evil corporation ünvanını Google ve Facebook’a kaptırmış durumda (bence).

Microsoft özellikle 2010 yılından sonra istikrarlı bir şekilde open-source konusuna yatırım yapmaya başladı ve zaman içerisinde Github’da en çok katkı yapan kuruluşlardan biri haline geldi.

Open-source yaptıkları projelerden birisi de Microsoft’un amiral gemisi .NET Core platformu. Ama Visual Studio Code, Typescript gibi Microsoft teknolojilerini kullanmayan geliştiricilerin de yoğun olarak kullandığı projeler de dikkat çekiyor.

Bence bütün bu açılımlar, Microsoft’un hayatta kalması için bir anlamda zorunluluktu. Rüzgara karşı üflemek bir yere kadar. Ama beni şaşırtan bilinçli veya bilinçsiz bu kadar community-driven bir şirket haline gelebilmeleri oldu. Bunda en büyük pay tabiki yeni Microsoft CEO’su Satya Nadella’nın.

Bu kadar amansızca Microsoft övmek yeter sanırım, konumuza gelecek olursak …

WSL — Windows Subsystem for Linux

Sanırım artık en azılı Microsoft fanatikleri bile kabul edeceklerdir ki, Linux Server’lar uygulamalarımızı host etmek için çok daha iyi işletim sistemleri.

.NET Core’un da çıkmasıyla beraber Linux benim gibi Microsoft teknolojileriyle gelişirme yapan bir çok developer’ın hayatının bir parçası haline geldi (iyi ki geldi).

Bu noktada yaşadığımız en büyük problemlerden biri hem psikolojik anlamda hem de teknoloji anlamında yılların getirdiği Windows bağımlılıklarımızın devam etmesiydi. Bunların yanı sıra sanırım bir gerçeği kabul etmek lazım ki Windows, desktop işletim sistemleri konusunda Linux distro’larının bir kaç çağ ilerisinde (Alternatif olarak macOS sevenler de var tabi.). Sonuç olarak gündelik hayatında Windows kullanan bir çok developer, bir çok sebepten dolayı bu alışkanlıklarından vaz geçmek istemiyor.

Windows ile beraber Linux çalıştırmanın birden fazla yolu var. En az ideal olandan en ideal olana doğru sıralarsak:

  • Dual-Boot, boot ederken Windows veya Linux arasında bir seçim yapmak
  • VMWare, Hyper-V gibi virtualization teknolojilerinden birini kullanmak.
  • Docker Desktop on Windows

Docker kullanmak bir developer için günümüzde bir tercihten daha çok bir zorunluluk. Her ne kadar Docker kullarak herhangi bir Linux distro’sunu local’imizde kaldırıp, harddisk’lerimizi mount edip, sonrasında docker exec gibi komutlarla terminal içerisinden Linux kullanabiliyor olsak da (yazarken bile yoruldum), Docker aslında tam olarak bu amaç için geliştirilmiş bir teknoloji değil ve aynı konforu vermiyor. Zaten Docker’ın Windows içerisinde bir virtual machine olarak çalıştığını da düşünürsek aynı performansı da alamıyoruz.

İşte Microsoft’da bütün bu sıkıntıları düşünmüş olacak 2016 Ağustosunda ilk WSL (Windows Subsystem for Linux) sürümünü yayınladı. Makalemizin konusu olan WSL 2'ye geçmeden önce biraz WSL’den bahsetmek konuyu anlamak açısından daha iyi olacaktır.

WSL, Windows 10 ve Windows Server 2019'da, Linux binary’lerini çalıştırabilmemize (ELF formatında) imkan veren bir compatibility layer (uyumluluk katmanı). Böylelikle Windows içerisinde bir GNU/Linux ortamı çalıştırarak, Linux’a özel çoğu command-line tool’u (komut satırı araçları), programları bir sanal makina ayağa kaldırmadan çalıştırabiliyoruz. awk, grep, sed aklıma ilk gelenler.

Fakat benim gibi çoğu developer zaten Git Bash kullanarak bu command-line tool’larını kullanabiliyordu. Farkı ne peki?

En büyük fark burada gerçek bir Linux distro’sunun olması. Diyelim ki Ubuntu yüklediniz, bütün package manager emrinize amade. WSL size Windows içerisinde Linux uygulamalarını çalıştırma imkanı da veriyor. Aynı şekilde Linux içerisinden Windows uygulamalarınızı çağırabiliyorsunuz.

Peki WSL 1 nasıl çalışıyor?

WSL 1, Linux sistem çağrılarının emülasyonu için LXSS Manager servisini kullanıyor, yani aslında ortada bir virtual machine veya container yok. LXSS Manager, Windows kernel sistem çağrılarıyla (calls), Linux kernel sistem çağrılarının birbirine map edilmesine sağlayan bir ara katman. Böylece Linux binary’leri Windows içerisinde çalışabiliyor. LXSS Manager ayrıca filesystem, networking gibi windows servislerini de map ettiği için, bunların Linux tarafından da erişebilmesini sağlıyor. Ortada bir virtual machine veya container yok derken kast ettiğim buydu. WSL, Windows kernel’ının üstünde bir Linux kernel interface’ini (arayüzünü) sanallaştırıyor.

WSL 1'i şuan bile herhangi bir Windows 10 makinada hızlıca kurup kullanmaya başlayabilirsiniz. Tek yapmanız gereken Windows’un WSL özelliğini aktive etmeniz. Bunu yapmak için aşağıdaki komutu Powershell’de çalıştırmanız yeterli.

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Bilgisayarınızı yeniden başlattıktan sonra Windows Store içerisinden istediğiniz Linux distro’sunu kurup, çalıştırmaya başlayabilirsiniz.

WSL 2

WSL 1 her ne kadar çok iyi bir teknoloji olsa da belli sınırlamaları var.

WSL 1 aslında içerisinde “gerçek” bir linux kernel’ı barındırmıyor. 32-bit uygulamaları çalıştıramıyor. Bazı spesifik Linux kernel servisleri ve modülleri de implemente edilmediği için, bunlara ihtiyaç duyan uygulamaları da çalıştıramıyor. Buna verilebilecek en güzel örnek sanırım Docker. Maalesef bu tip kısıtlamalardan dolayı WSL 1'de native olarak Docker çalıştırmak imkansız.

Yapılan testlerde WSL 1'in performansı genellikle, Ubuntu, Debian gibi distro’lara yakın çıkıyor ama bazı I/O işlemlerinde oldukça yavaş olduğu da tespit edilmiş.

Microsoft WSL 2 ile beraber bazı mimari değişiklikler yaptı. WSL 2 ile beraber Windows içerisine gerçek bir Linux kernel’ı geliyor. Bu yeni kernel, tamamen bu iş için optimize edilmiş, oldukça hafif bir Hyper-V subsystem (altkümesi) tarafından çalıştırılıyor. Bu noktada akıllara “WSL 1'in çıkış amacı zaten virtualization’ın getirdiği yüklerden kurtulmak için değil miydi?” sorusu gelebilir. Microsoft’un buradaki iddiası genel performans anlamında WSL 1'e oldukça yakın olduğu yönünde. Yine Microsoft WSL 2'nin bazı operasyonlarda WSL 1'e göre 20 kat daha fazla performans gösterdiğini iddia ediyor.

Burada aslında dikkat edilmesi gereken nokta performans farklılıklarından ziyade WSL 2'nin gerçek bir Linux kernel’ı ile geliyor olması. Hemen akıllara Docker’ın çalışıp çalışmadığı sorusu gelebilir. Evet arkadaşlar WSL 2 içerisinde Docker Engine çalıştırabiliyoruz. Daha iyisi ise Docker Desktop on Windows’a WSL 2 backend desteğinin gelmiş olması. Yani Docker artık Windows içerisinde çalışmak için Hyper-V’de bir linux virtual machine olmasına ihtiyaç duymuyor. Böylelikle Docker’ın boot süresi oldukça azalıyor. Bu konuyla ilgili detaylı bilgileri makalenin ilerleyen bölümlerinde vereceğim.

WSL 2, WSL 1 ile tamamen geriye uyumluluk gösteriyor, yani mevcut WSL 1 Linux distro’larınızı sorunsuz bir şekilde WSL 2 modunda çalıştırabiliyorsunuz.

WSL 2 Kurulumu (Preview)

WSL 2 şuan için preview durumunda ve kullanmak için Windows Insider programına katılmanız ve Windows 10'un sürüm 18917 ve üstünü kullanmanız gerekiyor. Windows Insider programına katıldığınız zaman Windows’un preview sürümlerine erişebiliyorsunuz.

Bu noktada WSL 2'yi kurmadan önce stabil olmama ihtimali olan bir Windows kullanacağınızın bilincinde olmanızda yarar var. Ben yaklaşık iki haftadır kullanıyorum ve ne development yaparken ne de oyun oynarken herhangi bir sorunla karşılaşmadım ama bir risk olduğu aklınızda bulunsun.

WSL 2'yi kurmadan önce, WSL 1 kurulumu için de gerekli olan Windows’un WSL özelliğini aktive etmeniz lazım. Nasıl yapılacağını WSL 1 başlığında anlatmıştık.

Sonrasında Windows Insider programına dahil olmanız gerekiyor. Windows’da kullandığınız Microsoft hesabınızla programa dahil olabiliyorsunuz. Programa dahil olduktan sonra eğer aynı Microsoft hesabını Windows’unuzuda da kullanıyorsanız, Settings > Update & Security altında Windows Insider Program sekmesini görüyor olmanız lazım. Bu sekmenin çıkması için bazen biraz beklemeniz ve bilgisayarı yeniden başlatmanız gerekebilir.

Bu ekranda iki tane sürüm seçeneğiniz var Fast ve Slow. Benim tavsiyem Slow’u seçmeniz yönünde. Böylece alacağınız güncellemeler daha seyrek ve nispeten daha stabil olacaktır. Macerayı seviyor ve en son Windows özelliklerini denemek istiyorsanız Fast’i de seçebilirsiniz.

Seçeneği seçtikten sonra Windows Update sekmesinden yeni güncellemeleri almanız lazım. Ben “check for update” butonuna bastıktan sonra güncellemeler hemen inmeye başlamıştı ama bazı kullanıcılarda preview güncellemelerinin gelmesi 1–2 saat sürebiliyormuş.

Artık preview sürümüne geçtik peki şimdi ne yapacağız?

WSL 2'yi çalıştırabilmemiz için Windows Subsystem for Linux ve Virtual Machine Platform özelliklerini aktive etmemiz gerekiyor. Bunun için aşağıdaki Powershell komutlarını çalıştırabilirsiniz.

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

Bu komutlar çalıştıktan sonra bilgisayarınızı yeniden başlatmanız gerekiyor.

Artık WSL 2'yi çalıştırmaya hazırız.

İki seçeneğiniz var. Önceden WSL 1 kullanıyorduysanız ve hali hazırda bir Linux distro’su yüklüyse aşağıdaki komutu çalıştırarak mevcut distro’nun WSL 2 modunda çalışmasını sağlayabilirsiniz. Yoksa WSL 1 başlığında anlatığım aynı yöntemle bir distro kurabilirsiniz.

wsl — set-version <Distro> 2

Örneğin bende Ubuntu-18.04 yüklüydü ve <Distro> yazan alana Ubuntu-18.04 yazmıştım. Hangi distro’ların halihazırda yüklü olduğunu görmek için aşağıdaki komutu çalıştırabilirsiniz.

wsl --list

Genel olarak bütün distro’ların default olarak WSL 2 modunda çalışmasını istiyorsanız aşağıdaki komutu çalıştırabilirsiniz.

wsl --set-default-version 2

Ben bu komutları çalıştırırken bir kaç problemle karşılaştım, sizin de karşılaşma ihtimalinize karşı buraya yazıyorum.

wsl — set-version <Distro> 2 veya wsl — set-default-version 2 komutlarını çalıştırırken aşağıdaki gibi bir hata almıştım.

Virtual hard disk files must be uncompressed and unencrypted and must not be sparse

Bunun anlamı diskte encryption ve compression özelliklerinin açık olduğu. Ben bu özellikleri açtığımı hatırlamıyordum ama bazı Windows Update’lerden sonra kendiliğinden de açılabiliyormuş. Alttaki komutları çalıştırıp, bilgisayarı yeniden başlattıktan sonra yukarıdaki hatayı almadım.

fsutil behavior set disableencryption 1
fsutil behavior set disablecompression 1

Restart’dan sonra denediğimde başka bir hata daha aldım.

Import failed with: The operation timed out because a response was not received from the virtual machine or container.

Görünen o ki, her ne kadar Microsoft biz WSL 1 ile WSL 2 arasında geriye uyumluluk sağladık dese de bazen eski yüklü distro’ların WSL 2 modunda çalışması sıkıntı olabiliyor. Bu hatayı alıyorsanız maalesef mevcut distro’yu silip yeniden yüklemekten başka çözüm yok.

Mevcut distro’yu silmek için Windows Apps & features ekranından ilgili distro’yu bulup, advanced options’a girmeniz lazım.

Advanced options’da Terminate, Reset, Uninstall gibi seçeneklerle karşılaşacaksınız.

Bu noktada bazı insanlar Uninstall etmeden Reset ederek de sorunun çözüldüğünü söylüyorlar ama aynı hesaba geldiği için ben uninstall edip, Windows Store’dan tekrar yükledim.

Yükleme işlemi tamamlandıktan sonra önce distro’nuzu çalıştırıp user ayarlarını yapmanız gerekiyor. Sonrasında yukarıdaki komutları tekrar çalıştırıp distro’unuzu WSL 2 modunda çalıştırabilirsiniz.

Docker Desktop WSL 2 backend

WSL 2 ile Docker çalıştırmanın bir çok avantajı var. En önemli avantajlarından birisi boot süresinin oldukça kısalıyor olması. Docker saniyeler içerisinde kullanıma hazır hale geliyor. Bunun yanı sıra Docker artık WSL 2 ile gelen dynamic memory allocation özelliğini de kullandığından, kaynak tüketimi de önemli ölçüde azalıyor. Docker artık sadece gerekli miktarda CPU ve RAM tüketiyor.

Docker ve WSL 2'nin beraber çalışabilmesi için Docker Desktop Edge 2.2.3.0 veya sonrası sürümleri yüklemeniz gerekiyor. Herşeyin preview olduğu bir ortamda, Edge sürümünü yüklemenizin bir sakıncası yok sanırım :)

Docker Desktop yüklenirken size WSL 2 aktive etmek isteyip istemediğinizi soruyor.

Bu noktada şunu belirtmem lazım, eğer hali hazırda bir sürü el emeği göz nuru Docker image’larınız varsa bu özelliği aktive ettiğinizde onları çalıştıramayacaksınız. Çünkü mevcut image’lar Hyper-V backend’inde kalmış oluyorlar ve maalesef mevcut image’ları WSL backend’e taşıyamıyoruz.

Sonradan tekrar Hyper-V backend’e dönmeniz mümkün

Benim açımdan temiz bir başlangıç yapmak problem teşkil etmediği için eski Docker datalarını da sildim.

Kurulum tamamlandıktan sonra Docker’ın hangi linux distro’larından ulaşılabilir olmasını istediğinizi de seçmeniz lazım.

Artık makinanızda Docker’ın yüklediği iki linux distro’su daha var.

Bunlardan docker-desktop olanını Hyper-V’deki linux virtual machine’in yerine geçen distro olarak düşünebilirsiniz. Diğeri ise Docker datalarının tutulduğu VHD.

Peki performans avantajlarının yanında başka nasıl avantajlar elde ediyoruz?

Linux Workspaces ve VSCode

Hyper-V backend ile çalışan Docker Desktop kullanırken de zaten bütün Docker ve Kubernetes API’lerine Windows’dan erişebiliyorduk. Fakat artık WSL 2 Linux distro’larımızın içerisinden de aynı şeyleri yapabiliyoruz.

Bu özellik hem Linux ortamı için geliştirilmiş projeler üzerinde çalışan hem de build pipeline’ı Linux environment’ına göre ayarlanmış projelerde çalışan developer’lar için çok büyük bir avantaj. Artık hem Windows hem de Linux build script’leri oluşturmanıza gerek yok. Windows’da geliştirme yapan bir developer artık aynı Linux script’lerini çalıştırabilir.

VSCode halihazırda Remote — WSL extension’ı ile bu tarz bir çalışmaya imkan sağlıyor. Bu extension’ı kurduğunuz zaman WSL 2 Linux distro’nuzun içerisinden code komutunu çalıştırdığınız zaman VSCode’un Windows’da açıldığını ama aslında Linux üzerinden çalıştığını göreceksiniz.

VSCode terminal’inden istediğiniz docker komutunu çalıştırmanız, istediğiniz image’ı build etmeniz mümkün.

Docker Desktop for Windows için default backend, çok yakın zamanda WSL 2 olacak. Elbette Microsoft Hyper-V desteğini kesmediği sürece Hyper-V de desteklenmeye devam edecek. Ama geleceğin WSL backend’i olduğuna emin olabilirsiniz.

Bonus: Windows Terminal (Preview)

Açıkcası ilk duyurduklarından beri Windows Terminal çok ilgimi çeken bir proje olmadı. Çünkü uzun süredir Cmder ve Git Bash ikilisini kullanıyorum. Cmder Windows için çok güzel bir terminal emülatörü. Uzun zamandır da Powershell kullanmayı bırakıp, Git Bash kullanmaktayım. Böylece awk, grep, sed gibi command-line tool’larını kullanabiliyorum. Çoğu bash, sh scriptini çalıştırmakta da sıkıntı yaşamıyorum.

Ama WSL 2 ile beraber Windows Terminal’e bir şans vermeye karar verdim ve oldukça memnun kaldığımı söyleyebilirim.

Windows Terminal’i yine Windows Store üzerinden yüklemeniz mümkün.

Daha preview aşamasında olmasına rağmen oldukça akıcı ve özelleştirilebilir bir tool geliştirmişler.

Yine Cmder gibi birden fazla profil kullanmanızı imkan veriyor. Yani bir tab’da powershell, diğerinde cmd, diğerinde bash çalıştırabilirsiniz. Aynı şekilde doğrudan WSL distro’nuza bağlanma imkanı da veriyor.

Bunların yanı sıra çok güzel bir tema desteği geliştirmişler ve daha şimdiden onlarca tema var.

Windows Terminal benim beklentilerimi oldukça karşıladı. Denemenizi tavsiye ederim.

Son Sözler

WSL 2 benim son zamanlarda en çok yükseldiğim konulardan biri oldu. Yıllardır Microsoft teknolojileriyle geliştirme yapan biri olarak zaten Microsoft’a sempati duyduğumu fark etmişsinizdir. Fakat objektif bir şekilde bakmak gerekirse, son yıllarda Microsoft’un yaptığı hamleleri severek takip ediyorum.

Bence Microsoft’un hem open-source dünyaya hem de Linux tarafına yatırımı istikrarlı bir şekilde devam edecektir. Artık eski düşmanlıkların ve rekabetin olduğunu düşünmüyorum. Yine de benim kadar iyimser olmayanlar da var. Araştırma yaparken denk geldiğim makalelerden birinde, Microsoft’un WSL açılımının embrace, extend, extinguish stratejisinin bir parçası olduğundan bahsediliyordu.

Microsoft’un gerçek motivasyonunu zaman gösterecek. Ama bu iş birliğinin herkes için çok güzel olacağını düşünüyorum.

Bir sonraki yazımda görüşünceye dek iyilikler dilerim.

Kaynaklar

--

--