W tym artykule chciałbym przybliżyć czytelnikom czym jest Windows subsystem for linux ( WSL ). W jakich wersjach występuje, czym te wersje się od siebie różnią i dlaczego warto zainteresować się tym rozwiązaniem.
WSL? Ale o co chodzi ?
Windows Subsystem For Linux stara się być odpowiedzią Microsoftu na bolączki ludzi, którzy z jednej strony chcieli by mieć możliwość korzystania ze wspaniałych narzędzi konsolowych oraz możliwości, które dostarcza nam system Linux. Z drugiej zaś strony osoby te z różnych powodów nie mogą lub nie chcą przerzucić się na inny system operacyjny niż Windows np. ze względu na łatwość i wygodę korzystania oraz bardzo dużą dostępności sterowników, gier i programów na tę platformę.
Czasami zmiana systemu jest wręcz niemożliwa, ponieważ firma z rożnych względów narzuca wykorzystywanie produktu Microsoftu np. z uwagi na dostępności szerokiej gamy wyspecjalizowanych narzędzi do wprowadzania polityk bezpieczeństwa oraz monitorowania komputerów w firmie.
Do tej pory dla osób, które chciały korzystać zarówno z aplikacji Windowsowych jak i Tych ze świata linuxa dostępnych było kilka opcji:
- Dual boot
- Linux na wirtualnej maszynie
- Cygwin
- Wine
- Porty aplikacji na inny system
Jednak żadna z powyższych nie należy do zbyt wygodnych Swego czasu korzystałem z dual boot oraz wine i przyznam szczerze, że było to marne rozwiązanie. W wine nie wszystkie aplikacje dało się uruchomić, a przełączanie systemów tylko po to aby skorzystać z konkretnej aplikacji nie było wygodne. Od dawna czekałem na jakiś ruch ze strony Microsoftu w tej sprawie, w 2016 roku ucieszyła mnie wieść o powstaniu projektu WSL. Wreszcie zaczęło się coś ruszać w tym temacie, a efekty prac można było łatwo i bezpiecznie przetestować na własnej skórze za pomocą kilku kliknięć myszką 🙂 Od tamtej pory projekt WSL zgromadził wokół siebie Bardzo dużą społeczność ludzi, którzy pomagają w jego rozwoju.
WSL1
Prace nad pierwszą wersją Windows subsystem for linux zostały ogłoszone przez Microsoft w kwietniu 2016 roku. WSL pozwala użytkownikom zainstalować bezpośrednio z Microsoft® Store zmodyfikowane środowisko GNU/Linux w systemie Windows 10. Umożliwia to uruchamianie narzędzi i aplikacji dostępnych w systemie Linux.
Architektura
- Linux userspace – Dystrybucja linuxa dostarczona przez partnerów, instalowana z poziomu sklepu Microsoftu
- WSL – warstwa translacji zaimplementowana jako sterownik implementujący wywołania systemowe , system plików i wszystko to czego dystrybucja linuxa potrzebuje do uruchomienia
- Windows NT Kernel – karnel Windowsa na, którym zostają wywołane polecenia przetłumaczone za pomocą warstwy translacji
Dzięki zastosowaniu powyższej architektury, mamy możliwość uruchamiania niezmodyfikowanych linuxowych binarek ELF64 obsługując interfejs jądra Linuxa, na jądrze systemu Windows. Mówiąc prościej, warstwa WSL tłumaczy wywołania systemowe Linuxa, na wywołania systemowe Windows, po czym wykonuje je tak jak byśmy zlecili wykonanie tej operacji bezpośrednio z poziomu systemu Microsoftu.
Flow
Punktem wejścia do sub systemu jest program bash.exe wykorzystuje on LX Session manager service oraz LXCore/LXSS do stworzenia instancji Linuxa. W danym momencie istnieje tylko jedna instancja Linuxa dla konkretnego użytkownika, a ponowne wywołanie wrappera bash.exe podpina go do aktualnie uruchomionej dystrybucji.
Po podniesieniu Linuxa, LX Session manager powołuje proces init, który uruchamia /bin/bash. Teraz jesteśmy w stanie korzystać z Linuxowych narzędzi i aplikacji ( bez GUI ) a warstwa translacji zawarta w sterowniku LXCore/LXSS przetłumaczy wywołania systemowe Linuxa na wywołania systemowe w Windows NT. Aby było to możliwe po stronie Linuxa powstają specjalnie wyizolowane procesy nazywane “pico processes” podłączone w trybie jądra, do dedykowanych procedur obsługi wywołań systemowych zwanych “pico providers”.
Jak można się domyśleć podejście wykorzystujące translację wywołań systemowych nie jest szalenie szybkie, szczególnie dla operacji wymagających I/O jak chociaż by git clone lub npm install. Dodatkowo istnieją** fundamentalne różnice** pomiędzy światem Windowsa a światem Linuxa dlatego niektóre translacje są bardzo wolne, a jeszcze inne wręcz niemożliwe ponieważ NT nie pozwala wykonać niektórych operacji, które można wykonać na Linuxie . Przykładem takiej operacji jest np. zmiana nazwy folderu gdy wewnątrz znajdujący się plik otwarty przez inny program.
Dostęp do plików
Linux wykorzystuje warstwę VFS ( Virtual file system ) jako abstrakcje na różne systemy plików, takie jak EXT4, OFS itp. Warstwa ta ma za zadanie umożliwić korzystanie z niego w taki sam sposób niezależnie od tego, jaki system plików rzeczywiście leży pod spodem. Microsoft wykorzystał tą abstrakcję i wytworzył implementację dla Windows NT, która pozwala na dostęp z poziomu Linuxa do plików przechowywanych na dysku Windowsa. Pliki dostępne są w punktach montowania /mnt/c , /mnt/d i tak dalej.
Dzięki dostępowi do plików w systemie Microsoftu jesteśmy w stanie również uruchamiać programy zainstalowane na Windowsie z poziomu bash np. polecenie notepad.exe “nazwa pliku” otworzy podany plik w programie notepad. Co więcej możemy na nich używać przekierowań i Pipe line.
Dostęp do plików innych użytkowników:
- Linux – Każdy użytkownik komputera posiada swoje własne odizolowane pliki linuxowe znajdujące się w katalogu AppData\Local\lxss oznacza to, że inny użytkownik komputera po uruchomieniu wrappera bash.exe nie ma dostępu do plików pozostałych osób.
- Winodows – Jeśli z poziomu Windows nie mamy odpowiednich uprawnień na wykonanie określonej operacji to z poziomu Bash.exe też jej nie wykonamy. Przykładowo nie dostaniemy się do plików innego użytkownika przechowywanych w jego katalogu domowym, nawet jeśli po stronie Linuxa posiadamy uprawnienia root. Jednak gdy uruchomimy bash.exe jako administrator z poziomu Windowsa, wtedy już możemy sobie na to pozwolić.
Instalacja
Przed rozpoczęciem instalacji upewnijcie się czy wasz Windows 10 to wersja 64-bit Professional i czy wersja systemu jest równa lub wyższa wersji 1607, można to zrobić wpisując w start lub cmd polecenie winver
Sama instalacja WSL jest bardzo prosta, instrukcje jak to zrobić krok po kroku znajdziecie na oficjalnej stronie Microsoftu tutaj(click)
Zalety i Wady
Zalety:
- Dostęp do ulubionych narzędzi Linuxa z poziomu Windowsa
- Swoboda wyboru czy chcemy w danej chwili użyć Windowsa czy Linuxa
- Integracja z Windowsem, możliwość dostępu do plików przechowywanych w systemie Windows
- Uruchamianie exec WIndows bezpośrednio z poziomu bash
- Pipe line działają z programami wykonywalnymi Windowsa
- IP sub systemu jest takie samo jak IP Windowsa
- Łatwa instalacja
- Możliwość przełączania się pomiędzy różnymi dystrybucjami Linux
- Uruchamiasz kiedy potrzebujesz
Wady:
- Wolniejsze działanie operacji I/O w porównaniu do natywnego Linuxa
- Nie wszystkie “System call” są wspierane np. PTRACE_SEIZE używany przez rr ( narzędzie do debbugowania C++/C ) nie jest wspierany
- Nowe funkcje karnelu linuxa nie działają z automatu, WSL team musi zaimplementować dla nich translację co powoduje dodatkową pracę i opóźnienia w dostarczaniu nowych rzeczy
WSL v2 ( Insider program )
Tak jak pisałem wcześniej rozwiązanie wykorzystujące warstwę translacyjną wybrane w implementacji WSL w wersji 1 ma kilka wad. Gdybym miał wybrać dwie najistotniejsze bez wahania padło by na szybkość i kompatybilność w porównaniu z natywnym Linuxem.
W tym momencie Wchodzi WSL2 w połowie na biało i postanawia zmierzyć się z problemami poprzednika, poprawić ogólną szybkość systemu oraz być w pełni kompatybilny z wywołaniami systemowymi Linuxa. Jak to zamierza zrobić? Czy podoła wyzwaniu i rozwiąże wszystkie problemy, a może wprowadzi nowe ? To wszystko postaram się przedstawić w dalszej części artykułu.
Co to jest Windows Insider
Na chwilę obecną ( luty 2020 ) WSL w wersji 2 jest dostępny Tylko w programie publicznych testów Microsoftu. Aby korzystać z aplikacji w fazie testów trzeba wykonać instrukcje dostępne pod adresem https://insider.windows.com/en-us/getting-started/
Program Insider dzieli się na 3 fazy:
- Fast Ring– Pierwsza faza testów publicznych, aktualizacje i nowe funkcje systemu, które przeszły w wewnętrzną fazę testów trafiają do tej grupy raz lub dwa razy w tygodniu. Instalacja aktualizacji wymaga ponowne uruchomienie systemu
- Slow Ring ( Zalecane ) – Aktualizacje trafiają tutaj po pomyślnym przejściu pierwszej fazy Fast. W tej fazie według Microsoftu istnieje minimalne ryzyko błędów wpływających na sprzęt i działanie systemu. Aktualizacje dostarczane są raz lub dwa razy w miesiącu i też wymagają ponownego uruchomienia komputera.
- Relese Preview Ring – Charakteryzuje się najmniejszym ryzykiem błędów. Trafiają tutaj aktualizacje, które uprzednio przeszły wszystkie fazy testów. Wersja ta nie różni się znacząco od oficjalnej aktualizacji jednak przez to, że jest to faza testów szybciej dostaje poprawki dla problemów, które użytkownicy mogą napotkać po oficjalnej aktualizacji
Windows Subsystem for Linux 2 aktualnie dostępny jest w fazie Slow Ring więc jest w miarę stabilnym rozwiązaniem i warto się nim zainteresować, o ile nie chcę się go używać na produkcji 🙂 . Bardzo prawdopodobne, że już w Maju 2020 roku WSL2 zostanie wypuszczony oficjalnie.
Architektura
W drugiej wersji WSL Microsoft całkowicie zmienił architekturę systemu. Aby zapewnić wzrost wydajności i kompatybilności w stosunku do wersji pierwszej. WSL team postanowił uruchomić kompletny karnel linuxa wewnątrz Windows 10. Do tego celu wykorzystali ich korową technologie wirtualizacji Hyper-V. Karnel linuxa został specjalnie przystosowany i zoptymalizowany pod wykorzystanie go w windows 10. Jako że zarządzany jest bezpośrednio przez Microsoft oznacza to, iż wszelkie aktualizacje np. bezpieczeństwa odbywają się bezpośrednio z poziomu usługi Windows Update Service.
Chwileczka, ale jak to? Linux na Wirtualce? Przecież to już było. Okazuje się, że nie jest to zwykła tradycyjna maszyna wirtualna, a specjalnie przygotowana maszyna na potrzeby WSL zintegrowana z Windowsem pozwalająca współdzielić te same zasoby bez dominacji jednego systemu nad drugim. Lightweight utility VM Originalnie rozwijana była na potrzeby serwerowe cechowała się małym narzutem i pozwalała na uruchamianie wielu kontenerów na pojedynczym hoście. WSL w wersji 2 uruchamia się niezwykle szybko cały system “wstaje” około 1 sekundy. Maszyna podnosi się sama wtedy kiedy tego potrzebujemy i zajmuje niedużo pamięci.
Według dokumentacji karnel linuxa i karnel Windowsa uruchomione są na za pomocą Hypervisor bezpośrednio obok siebie, co wskazuje na to iż jest to Hipernadzorca typu 1 czyli Linux działa bezpośrednio na poziomie sprzętu. Rozwiązanie to powinno mieć dużo mniejszy narzut na CPU w porównaniu do Hipernadzorcy typu 2 np. VBox, który działa na poziomie systemu operacyjnego.
Flow
Wszystko zaczyna się od wsl.exe, który uruchamia subsystem a także jest głównym punktem wejścia dla interakcji z nim. Uruchamia on też Lxss manager service, serwis ten śledzi aktualnie zainstalowane i uruchomione dystrybucje, dzięki czemu można np. zatrzymać lub listować zainstalowane Linuxy. Następnym krokiem jest wywołanie Host compute service, który uruchamia specjalnie przygotowaną Lightweight VM z karnelem Linuxa. Dane o aktualnie działającej dystrybucji mapowane są do Lxss manager service i uruchamiany jest /bin/bash. Po uruchomieniu następnie zestawione zostaje połączenie wykorzystujące socket czytający ze standardowego wejścia po stronie Windowsa i wysyłający te informacje do Linuxa. Po stronie distro informacje te są odczytywane i traktowane jako standardowe wejście do bash,
W tym momencie Wsl jest gotowy do pracy, cała operacja na świeżo zainstalowanym systemie bez dodatków od użytkownika trwa krócej niż 1 sekundę.
Dostęp do plików Windows bezpośrednio z poziomu Linuxa
Dostęp do plików w WSL1 był bardzo prosty ponieważ leżały one na tej samej maszynie, oczywiście musiało istnieć sporo kodu, który zapewniał integrację specyficznych cech systemu plików Linux w NTFS i explorerze Windows, ale nadal to była ta sama maszyna. W WSL2 mamy dwie osobne maszyny uruchomione jednocześnie obok siebie, jedna z Windowsem, druga z Linuxem. Dlatego integracja systemu plików nie jest już tak prosta jak ta wykorzystywana w WSLw wersji 1.
Aby była możliwość korzystania z plików innego systemu zdecydowano się wykorzystać protokół 9P jako łącznik pomiędzy oboma maszynami. Pozwoliło to na zamontowanie dysku Windowsa wewnątrz uruchomionego distro, stało się ono klientem serwera 9P uruchomionego po stronie Windowsa. Podejście to niestety również ma wpływ na wydajność, ponieważ spada ona gdy wykorzystujemy pliki znajdujące się w drugim systemie. W tej wersji WSL tak samo jak i w poprzedniej również możemy korzystać z programów zainstalowanych w systemie Windowsie.
Dostęp do plików Linuxa z poziomu Windowsa
Tutaj również wykorzystany został server 9P jendak w tym przypadku uruchomiony jest on po stronie Linuxa a jego klientem jest Windows.
Pozwala to na dostęp do plików Linuxa z poziomu Windowsa. Przykładowo możemy uruchomić “explorer.exe .” po stronie linuxa co spowoduje otwarcie menażera plików w folderze, w którym aktualnie się znajdujemy.
Instalacja
WSL2 dostępny jest w Windows 10 od wersji 18917 która dostępna jest w Programie Windows Insider. Dołączyć do niego można wykonując instrukcje dostępne pod adresem https://insider.windows.com/en-us/getting-started/
Kolejnym krokiem jest Instalacja WSL. Instrukcje jak to zrobić krok po kroku znajdziecie w video, które znajduje się na oficjalnej stronie Microsoftu tutaj(click)
Zalety i Wady
Oprócz wszystkich zalet wymienionych wyżej dla WSL w wersji 1 otrzymujemy dodatkowo:
- Bardzo dobra wydajność w ramach jednego systemu plików
- Kompletny karnel Linuxa
- Kontenery Dockera działają bezpośrednio w WSL ( Docker w wersji testowej EDGE )
- Duża integracja z systemem
- Szybkie uruchomienie, Lightweight VM wstaje koło 1 sekundy
- Karnel aktualizowany bezpośrednio z usługi Windows Update
Wady:
- Wydajność spada gdy wykorzystujemy pliki drugiego systemu ( np. IDE uruchomione na Windowsie , a pliki projektu na Linuxie )
- WSL jest nadal w fazie testów, choć niedługo ( Maj ) ma wejść już do oficjalnej aktualizacji Windows 10
Porównanie wsl1 vs wsl2
Na chwilę obecną zarówno WSL1 jak i WSL2 są nadal rozwijane i w każdej chwili można przełączyć się z jednego rozwiązania na drugie. Przy zmianie zainstalowane dystrybucje Linuxa zostają nie naruszone, zmienia się natomiast sposób w jaki są używane za pomocą WSL.
Według oficjalnych źródeł MS, WSL w wersji 2 jest sporo szybszy od poprzednika np:
rozpakowywanie zip 20x
git clone 2.5x
npm install 4,7x
cmake 3.1x
Obecność pełnego karnela Linuxa sprawia, że nowe funkcje Linuxa nie potrzebują implementowania dodatkowych rzeczy w warstwie translacji, tak jak to miało miejsce w pierwszej wersji, wszystko działa out of the box.
Podsumowanie
Myślę, że dla Developerów i ludzi, którzy chętnie korzystają z możliwości Linuxa, projekt WSL jest świetnym rozwiązaniem. Jeszcze nigdy korzystanie z narzędzi i aplikacji Linuxa na Windowsie nie było tak łatwe, mniej obejść i oficjalne wsparcie to dodatkowy atut. Bardzo mnie cieszy, że Microsoft postanowił zrobić krok w tę stronę i trzymam kciuki za dalszy rozwój w tym kierunku. Mam też nadzieje, że w niedalekiej przyszłości projekt WSL dostanie również wsparcie dla GPU.
Dodatkowe materiały jak i grafiki architektury użyte w tym poście można znaleźć pod adresem https://devblogs.microsoft.com/commandline/learn-about-windows-console-and-windows-subsystem-for-linux-wsl/#documentation
W przyszłości przedstawię jak wykorzystać moc drzemiącą w WSL2, uruchomimy na nim Linuxową wersję Intellij idea ( aby nie tracić na wydajności ), zintegrujemy WSL z dokerem orz wypróbujemy nowy Windows Terminal.