Fun with the Windows Subsystem for Linux

på Build 2016 introducerade Microsoft världen Windows Subsystem for Linux (Beta), vilket gör det möjligt för utvecklare att köra inbyggda Ubuntu användarläge konsolbinarier genom Bash-skalet i Windows 10. Om du är i Windows Insider-programmet har du haft möjlighet att prova den här funktionen med de senaste Windows Anniversary Update Insider-byggnaderna.

webbutvecklare är vana vid att göra svåra val på vilka verktyg och bibliotek de kan använda baserat på operativsystemet de arbetar aktivt med. WSL designades och byggdes av Windows Kernel-teamet och levererades i samarbete med Canonical, för att hjälpa Windows 10-utvecklare att använda det rika Linux-utvecklarekosystemet och verktygen tillsammans med de fantastiska verktygen de redan använder i Windows, utan att behöva starta in i ett annat operativsystem eller VM. Detta är definitivt en” av utvecklare, för utvecklare ” Windows 10-funktion, speciellt utformad för att ta bort lite friktion från utvecklarens dagliga arbetsflöde.

i det här inlägget ska jag visa dig några av funktionerna i WSL som jag personligen tycker är mycket intressanta, samt peka på några resurser för att hjälpa dig att lära dig mer. Först ska jag visa integrationen av stapelkommandon som ssh för att arbeta med Linux-servrar och enheter. För det andra ska jag visa förmågan att använda Bash-skript för att automatisera uppgifter på ett mycket naturligt sätt. För det tredje har jag lite kul med de stora kommandoradskompilatorerna, andra verktyg och *nix-kompatibiliteten som erbjuds och spelar lite NetHack. Slutligen visar jag dig möjligheten att använda befintliga Python och andra skript som finns tillgängliga på webben.

Windows är mitt primära operativsystem och utvecklingsmiljö, och har varit sedan Windows 3.0 på min första 286. Ändå har jag alltid haft Linux-servrar eller enheter som sparkar runt min plats. Från IoT-enheter som Raspberry Pi och dedikerade router/gateway-enheter till Minecraft-servrar tenderar de att samla på hyllorna och hörnen på mitt kontor. En sak jag alltid behöver göra är att hantera och konfigurera dessa Linux-datorer enkelt från min huvudsakliga arbetsstation.

hantera servrar och enheter

Jag kör för närvarande en huvudlös Ubuntu Minecraft-server från mitt hus. Det var min julklapp till min 10-åriga son det senaste året, men det har visat sig vara min leksak lika mycket som hans (ok, mer min leksak). Jag brukade använda några klientappar för att hantera det från min primära Windows 10-dator, men nu använder jag bara kommandoraden ssh inifrån Bash på Windows 10. Att använda appar som PuTTY och Tera Term är naturligtvis bra, liksom att använda de fantastiska verktygen som följer med Cygwin, men jag ville ha en verkligt infödd och naturlig upplevelse som bara flödade bra. Cygwin kände mig alltid lite som att beställa stek på en pizzaplats. Det var bra, men utförandet kändes bara inte rätt för miljön.

Jag har de offentliga/privata nyckelparen inställda med ssh-keygen och ssh-copy-id från WSL, så till ssh skriver jag helt enkelt:

$ ssh <användarnamn><server>

Jag skapade ett alias som gör det snabbare. Detta är en standard Linux/Bash funktion:

$ alias mc=’ssh <användare><server>’

nu, för att komma till Minecraft-servern skriver jag helt enkelt ”mc” vid bash-prompten i Windows 10.

samma tillvägagångssätt fungerar naturligtvis med alla Linux-baserade webb-eller databasservrar eller till och med Raspberry Pi och liknande IoT-enheter som du kanske använder som en del av din lösning.

att kunna rent säkra skal från en konsolprompt är bara en bekvämlighet och en preferens. Men när du väl är van vid att arbeta direkt i skalet, i en full miljö som inkluderar häftklamrar som apt, node, Ruby, Python och andra, öppnar du alla möjliga möjligheter för automatisering.

Fjärrskript

låt oss säga att du har en hel massa Linux-enheter eller servrar, och du vill utföra ett fjärrkommando på dem. Förutsatt att du redan har ställt in dina offentliga/privata nyckelpar kan du helt enkelt utföra fjärr SSH-kommandon från Bash.

till exempel, för att se när den senaste omstartstiden var på en fjärrserver, skulle du skriva detta:

$ ssh<användare><server> ’last-x/grep omstart’

att säkra skal till server och kör kommandot Last-x och söker efter raderna som innehåller ordet ”Starta om.”När jag kör den mot min Ubuntu Minecraft-server får jag det här resultatet:

reboot system boot 4.4.0-28-generic Thu Jul 7 08:14 kör fortfarande

det är en enda server. Om du har en lista över servrar kan du också automatisera den delen. Jag har skapat en fil med namnet servrar.txt i min hemkatalog på WSL. Den innehåller en massa Linux-server / enhetsnamn-en per rad. Jag läste sedan den filen från ett skript som jag skapade i min hemkatalog på WSL.

Efter år med att arbeta med enheter som Raspberry Pi, är jag en nano typ av kille (på VMS var jag en lsedit-person), så det här är vad skriptet ser ut i min favoritkonsolredigerare:

Du kan naturligtvis använda vim eller emacs eller någon annan redaktör som fungerar i en Ubuntu-konsolsession.

språket som används är Bash script (även kallat Bash shell script). För att utföra skriptet skriver jag helt enkelt:

$. / foreachserver.sh ’last-x / grep reboot’

och det kommer att iterera över varje server / enhet i filen och köra det kommandot på distans över ssh. Det här är naturligtvis ett mycket enkelt exempel, men du kan utöka för att omdirigera i lokala skript eller andra användbara kommandon. Bash-skriptspråket är tillräckligt rikt så att du kan utföra de flesta fjärradministrationsuppgifter med det. Du kan också utöka den med andra program som du laddar ner till WSL eller fjärrdatorerna.

vad händer om du vill använda lokala Windows-filer och resurser med ditt arbetsflöde med andra Linux-datorer? Eller, vad händer om du inte använder Linux alls? Kan Bash arbeta med lokala Windows-filer och resurser, eller är det en helt isolerad miljö?

arbeta med Windows-filer

WSL har tillgång till datorns filsystem via /mnt/<enhetsbokstav>/ kataloger (eller monteringspunkter). Till exempel skulle dina C: och D: rotkataloger i Windows vara tillgängliga via /mnt/c/ respektive /mnt/d/ i WSL. Detta kan vara användbart när du vill integrera dina Windows-projektfiler, nedladdningar eller andra filer i ett Linux/Bash-baserat arbetsflöde.

dessa kartor till SSD och mekanisk enhet jag har på datorn:

dessa är logiska fästen, så de visas för närvarande inte när du använder kommandon som mount i skalet. Men de fungerar som du förväntar dig att de ska. Till exempel, från Windows, placerade jag en textfil med namnet test.txt i roten på min C-enhet. Jag kan komma åt det från WSL så här:

under Byggturen ville vi se till att demos alla fungerade utan internetåtkomst (du vet aldrig vilken plats nätverk kommer att se ut). Så för att se till att Bash / WSL-demo skulle fungera för Git-delen och för att visa åtkomst till Windows-filer på den lokala datorn, satte jag upp en lokal repo på C:gitNetHack på Windows PC. För att klona det inom WSL utförde jag följande:

$ git –clone file:///mnt/c/git/NetHack

den kommandoraden berättade för git att använda filen:/ / – protokollet och att klona repo som finns i/mnt/c/git / NetHack. Du kan komma åt alla dina Windows-filer på ett liknande sätt.

Varning: som med alla konsoler kan du Ändra/Ta bort filer i ditt Windows-filsystem från Bash om du inte är försiktig. Till exempel kan du göra något som nedan och sluta torka ut en bra bit av din Windows-installation, förutsatt att Windows-kontot du kör under har rätt att göra det:

$ rm-rf /mnt/c/ <strong></strong>

jag tar upp detta eftersom Linux kommandon är nya för många av oss, medan Windows-konsolkommandon inte är det.

magin som får denna filsystemintegration att hända kallas DrvFs. Om du vill lära dig mer om filsystemet och hur det fungerar i WSL, satte WSL-teamet ett bra blogginlägg med alla detaljer.

naturligtvis är filsystemåtkomst bara en del av historien. Många utvecklingsuppgifter innebär åtkomst till fjärrresurser via HTTP eller andra nätverksprotokoll.

göra HTTP-förfrågningar

det är ofta bra att ringa ett REST-eller annat HTTP – (eller FTP) samtal från ett skript eller kommandorad snarare än från ett kompilerat program eller webbsida. Precis som de flesta Linux distros innehåller WSL standardverktyg som curl och wget för att göra HTTP och andra nätverkssamtal. Till exempel, här är resten samtal till GitHub för att få min profilinformation, använda curl:

Du kan kombinera detta med Bash-skript för att skapa snabbtestklienter för REST-API: er eller verktyg för att pinga webbsidor på servrar och rapportera tillbaka status. Det är också bra att bara ladda ner en fil från webben; Du kan helt enkelt omdirigera utmatningen till en fil istället för att visa den på skärmen:

$ curl-i https://api.github.com/users/Psychlist1972> pete.json

Jag är också en PowerShell-användare och har till och med skapat några intressanta tillägg för att använda Windows 10 MIDI i PowerShell och även för att fixa en del filkorruption som hände med användare av viss ljudinspelningshårdvara. Som en långvarig. NET-utvecklare och fan kommer jag att fortsätta använda och utöka PowerShell eftersom det är vettigt för mina projekt. Men PowerShell är inte rätt miljö för att köra alla dessa Bash och Linux-fokuserade open source-verktyg och exempel på webben idag. Jag vill använda det enklaste och mest friktionsfria sättet att utföra någon uppgift, och ibland betyder det att göra det i Bash.

Jag har knappt repat ytan här på Bash, Bash scripting och de uppgifter du kan utföra från skalet. Hittills har jag pratat om verktygsarbete som är användbart men tillhörande utveckling. Vad sägs om att göra faktisk utveckling och sammanställning inifrån WSL? Jag visade det som en del av Build Tour.

Bash på Build Tour-NetHack

tidigare i sommar gick högtalare från Microsoft runt om i världen och demonstrerade några av de coola nya utvecklarfunktionerna i Windows och Microsoft Cloud. Som en del av det ville vi visa WSL på ett roligt sätt, men också på ett sätt som utvecklare skulle relatera till.

Jag ville personligen visa med git och några traditionella konsolutvecklingsverktyg. När jag skrev Bash-demoen inkluderade jag grunderna (”Hello World” i Python och Ruby), men ville visa något lite mer utanför misshandlad väg.

Jag tänkte tillbaka på min tid på college, när vi studsade fram och tillbaka mellan Unix (DEC Ultrix och SunOS) och VAX/VMS. Vid den tiden var Unix nästan uteslutande en första kommandoradsmiljö. På min skola öppnade de flesta X-användare på en handfull grafiska arbetsstationer bara flera terminalsessioner i olika fönster, men med superkyld Månfas tapeter i bakgrunden. Majoriteten av eleverna använde VT-220-terminaler för sina sessioner (skolan var inte långt från Boston, så vi hade mycket DEC-utrustning).

Vid den tiden fanns det två stora spel som alla datavetenskapliga majors spelade: MUDs (lpMUD och den helt nya vid den tiden DikuMUD, främst) och NetHack. NetHack och andra Roguelikes har ansetts vara några av de mest inflytelserika spelen i historien, som är föregångarna till de många dungeon crawl och rollspel som vi tycker om idag.

NetHack har en lång historia och innehåller idag mer än hundra tusen rader av årtionden år gammal *nix-kod, liksom moderna tillägg. Spelet själv använder förbannelser (eller dess ersättare) för terminalinteraktion, kräver lex och yacc (eller flex och bison) och cc (eller gcc) och en massa andra utvecklarverktyg att bygga.

det är skrivet i C och innehåller ett antal kraftigt skriptade konfigurationsverktyg skrivna för Bourne-skalet. Jag tänkte att det skulle vara ett bra och roligt test för att utöva utvecklarfunktionerna i WSL och Bash på Windows 10. På grund av användningen av förbannelser (libncurses på Linux och WSL) skulle det också bidra till att visa kapaciteten hos terminalemuleringen inbyggd i Windows 10-konsolfönstret.

tillbaka på dagen tog det evigt att bygga NetHack från källan på vår tidsskivade Ultrix-server. Nu tar det en minut på min dator och allt är klart. Jag älskar framsteg. Det finns enkla sätt och svåra sätt att konfigurera och kompilera NetHack på Linux eller WSL. För att spara lite tid går jag igenom det enkla tillvägagångssättet.

förutsättningar

uppdatera först din WSL-miljö för att se till att du pekar på den senaste programkatalogen och även har basinstallationen uppdaterad. Det är i allmänhet bra att göra detta innan du installerar nya paket.

$ sudo apt update
$ sudo apt upgrade

Installera sedan de väsentliga utvecklarverktygen. Det enklaste sättet att göra detta är att använda build-essential-paketet. Detta inkluderar nästan alla konsolprogram som en Linux-utvecklare skulle behöva bygga appar i C/C++.

$ sudo apt install build-essential

detta tar några minuter. Om du vill vara mer kirurgisk kan du separat installera gcc, gdb, make, flex, bison och de andra verktygen som krävs i NetHack docs. Men om du är utvecklare vill du förmodligen ha de andra verktygen någon gång. Build-essential-paketet tar gissningen ur verktygsinstallationen.

Installera sedan git. Som du kan föreställa dig är det lika enkelt som:

$ sudo apt install git

precis som med Linux kan du lägga till en git PPA för att få en nyare version, men den här kommer att göra för vad vi gör här.

och slutligen vill vi ha förbannelser (ncurses, faktiskt) installerade för konsolskärmens interaktion:

$ sudo apt install libncurses-dev

När du har slutfört dessa steg är du redo att bygga NetHack.

bygga NetHack

den officiella NetHack repo är på GitHub. Först tar vi det och lägger det i en undermapp från vår hemkatalog.

$ cd ~
$ git klon http://github.com/NetHack/NetHack

eftersom NetHack stöder så många olika operativsystem, måste du göra några grundläggande konfiguration för att berätta att vi använder Linux på kommandoraden och ersätta gratis och öppen källkod verktyg för Unix klassiker som GCC för cc.

som jag nämnde finns det ett antal sätt att göra detta. Någon var tankeväckande nog att kapsla in mycket av konfigurationen i en tipsfil. Lita på mig här, med hjälp av tipsfilen sparar du timmar med huvudvärk i konfigurationen jämfört med stegen som beskrivs på GitHub repo. Det är inte omedelbart uppenbart hur man använder tipsen om man tittar på README-filerna eller annan dokumentation, så här går du:

$ cd NetHack/sys/unix
$ ./setup.sh tips / linux

som kommer att ställa in makefile att använda rätt verktyg, bibliotek och sökvägar för Linux. Installationsskripten är icke-triviala skalskript som gör mycket konfiguration; jag är glad att rapportera att de fungerar perfekt i WSL. Om du är nyfiken på shell scripting, se till att knäcka dem öppna i din favoritredigerare.

sedan, den slutliga build:

$ cd ~/NetHack
$ gör alla

Efter build, du vill skapa installationen. Det här handlar egentligen bara om att kopiera den körbara filen till en känd plats:

$ make install

som sedan lämnar dig med en mapp som heter ~/nh. Nethack finns i katalogen ~/nh/install/games och kallas helt enkelt nethack. För att köra den, navigera till den katalogen (eller skriv hela sökvägen) och skriv:

$ cd ~/nh/install/games
$ nethack

När du gör det kommer skärmen att rensas och du blir ombedd att börja spela NetHack. Observera att allt som görs här är precis som det skulle göras på en vanilj Ubuntu Linux-installation; inget Windows-specifikt behövdes.

spela NetHack

Med tanke på begränsningarna i ett konsolspel och Nethacks komplexitet kan det ta lite att komma in i det. Att säga att det är lite kryptiskt först skulle vara en underdrift, men jag har aldrig träffat en utvecklare som skakade bort från en bra utmaning.

navigeringstangenterna är desamma som de som används i VI(M), så HJKL för Vänster, Ner, Upp och höger respektive. För att avsluta, kan du hitta trappan upp på översta nivån och använda dem, eller slå Control-C för att tvinga avsluta spelet.

i NetHack är du @ – symbolen. Varje nivå består av rum, korridorer, dörrar och både trappor upp och ner. Monster, skatter och föremål representeras som olika ASCII-tecken som du kommer att bli bekant med när du spelar. Som är normen med Roguelikes, det finns ingen besparing och du får bara ett liv. Om du dör och spelar igen genereras fängelsehålan slumpmässigt och objekten blir förvrängda.poängen med NetHack är att överleva fängelsehålorna, samla guld och föremål och döda så många monster som möjligt. Det finns mål långt utöver det, men du måste spela ett tag (eller läsa upp) för att upptäcka dem. Regler följer löst Dungeons & Dragons regler för vapen, färdigheter etc.

Här är en skärmbild av NetHack med tre rum och två korridorer synliga. Trappan upp är i det övre vänstra rummet, och jag är för närvarande i det övre högra rummet, tillsammans med några skatter och andra föremål.

om du inte har färg i din version skapar du en fil med namnet ~/.nethackrc och lägg följande i det:

alternativ=färg: true, dark_room: true, menucolors: true

åt sidan: Om ASCII-karaktärsgrafik inte är din sak, men du gillar konceptet, Sök efter ”roguelike” i Microsoft Store och njut av de mer visuella spelen i den här populära genren.

visst, NetHack är en gammal kodbas, mest kära för oss i en viss ålder. Att bygga det utövar dock ett betydande antal viktiga utvecklarverktyg och funktioner i *nix-operativsystem, och även terminalemuleringen. Det är fantastiskt att se att allt, från gcc, gdb, make, bison och flex till modernare git, fungerar på WSL idag.

Om du vill se ovanstående demo som gjort på Build Tour, titta på denna grundton från Build Tour Canada. WSL-demo börjar runt 6: 20 in. (Och ja, det är Windows Subsystem för Linux, trots vad jag sa i den videon.)

https://channel9.msdn.com/Events/Build/Build-Tour-2016-Toronto/Keynote

Jag hoppas att du njuter av din utflykt till Nethacks fängelsehålor!

C och C++ är bra, liksom alla dessa klassiska utvecklarverktyg. Du kan till och med göra mycket med vanlig Bash-skript. Men många utvecklaruppgifter involverar skriptspråk som Python.

Python

Du kan hitta exempel Python skript över hela webben, vilket innebär att Python är både populär och användbar för många utvecklare. De flesta av dessa exempel antar naturligtvis att du kör Linux. Tidigare innebar detta att köra dem i en Linux-installation antingen på en annan maskin, ett VM-eller startalternativ eller göra nödvändiga ändringar som krävs för att köra dem med Windows-distributionerna av Python.

dessa är inte oöverstigliga problem av någon sträcka, men i det dagliga livet för en utvecklare lägger små bitar av friktion som detta upp. Med WSL har du alltid ett kompatibelt Python-kompatibelt delsystem och skal tillgängligt för dig utan att behöva gå ut ur din zon.

för att installera den senaste utvecklingsversionen av Python och python-paketinstallatören ”pip”, utför följande vid Bash shell prompt:

$ sudo apt install python-pip python-dev
$ sudo pip install –upgrade pip

Nu när Python är installerat ville jag visa hur du kan ta ett typiskt Linux Python-exempel från en webbplats och arbeta med det direkt. Jag gick över till Activestate Python recept webbplats och plockade toppen Python exempel. Okej, jag ljög. Den översta är för att skriva ut namn på heltal, och det lät inte super spännande, så jag valde den andra: Tetris. Jag tänkte att ni alla ser tillräckligt med praktisk Python varje dag, så jag ska gå till ett annat spel.

jag öppnade nano, kopierade de 275 raderna av Python-kod direkt från sidan i min webbläsare på Windows, klistrade in dem i nano i mitt WSL-konsolfönster, sparade som tetris.py och sedan enkelt utförd:

$ python tetris.py

som omedelbart rensade skärmen och tog upp en grundläggande Tetris-applikation. Som det var fallet med NetHack använder du samma vi-standard rörelseknappar. (Tillbaka i dagarna före musen och WASD-tangenterna för rörelse var höger hand på tangentbordet HJKL-tangenterna.)

som jag nämnde kan du naturligtvis köra Python på Windows utan WSL. Men för snabba verktyg och prover är det en stor produktivitetsökning för utvecklare att kunna köra ett Linux Python-exempel utan ändringar helt enkelt genom att klistra in någon kod från en känd källa.

det är verkligen poängen. Det handlar inte om att ersätta andra Windows-inbyggda verktyg som Python, PowerShell, C# och mer. Det handlar om att ta bort friktion när du bara behöver få saker gjorda snabbt och effektivt i ett modernt utvecklingsarbetsflöde.

Mellan Bash, Python och alla inbyggda kommandoradsutvecklingsverktyg för Linux har WSL mina Linux-arbetsflödesbehov täckta. Det är inte en Linux-server eller ens en fullständig Linux-klient. Istället är det precis vad jag behöver för att minska lite daglig friktion och göra utvecklingen på Windows ännu mer produktiv och trevlig.

Återställ din Wsl-miljö

Känn dig fri att experimentera. Om du skadar din WSL-installation är det enkelt att installera om. Var noga med att behålla kopior av allt viktigt.

C:> lxrun.exe / uninstall / full
C:> lxrun.exe/install

Hur använder du Bash och WSL?

Vi hoppas att ha WSL och Bash i synnerhet på Windows 10 hjälper dig att vara lite effektivare och tar bort lite friktion från dina dagliga utvecklingsuppgifter.

hur använder du WSL på Windows 10? Hur skulle du vilja använda den?

teamet gör mycket arbete för att säkerställa att WSL är ett bra konsolverktyg för utvecklare. Om du har feedback eller stöter på problem rekommenderar vi att du kontrollerar GitHub-problemsidan samt användarfeedback-och röstningssidan. Vi skulle verkligen vilja höra från dig.

ytterligare referenser och vidare läsning

Linux shell scripting är ett stort ämne och det finns massor av bra handledning på webben. Om du inte redan är bekant med det och vill lära dig mer, kommer de flesta Bash-handledning att fungera för dig. Här är en till att börja med.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *