iSH Shell: Linux op iOS
De gratis app iSH Shell breidt de functionaliteit van de iPhones en iPads van Apple uit met een geëmuleerde Linux-omgeving. Dat is vooral nuttig voor ontwikkelaars en beheerders – als je de juiste functies geïnstalleerd hebt.
Het gebeurt in c’t niet zo vaak dat we een iOS-app wat meer aandacht geven in een wat uitgebreider artikel. Meestal leggen we alleen op de online-pagina snel uit wat zo’n app kan en hoe hij werkt. Maar de opensource-app iSH Shell, die sinds oktober beschikbaar is in de App Store, is dan ook geen gewone iOS-app. Hij opent de deur naar volledig nieuwe toepassingen op een iOS-apparaat. De ontwikkelaar Theodore Dubois is erin geslaagd om een x86-Linux-emulator in de App Store te krijgen. De app draait een Alpine-Linux zonder grafische gebruikersinterface. Veel Linuxapplicaties werken al, maar op sommige plekken is het nog behelpen.
Na een paar weken gebruik te maken van deze app wordt zeker met voldoende inspiratie eigenlijk pas goed duidelijk wat er mogelijk is met Linux op een iOS-apparaat. Als typische iOS-gebruiker moet je daarbij wel leren om op een andere manier te denken. We hopen dat je daar door dit artikel genoeg inspiratie voor krijgt.
EINDELIJK CODE UITVOEREN
Tot nu toe kon je als ontwikkelaar niet veel doen met een iPad. Er waren wel code-editors, maar je kon de geschreven programma’s niet uitproberen. Er was geen compiler, geen webserver-app en geen Node.js-app voor wat lokale experimenten. Velen probeerden het te doen met een externe server door de code dan in te typen op de iPad en die met een SSH-app op de server te zetten. Maar met het ICE-framework werkte dat goede idee al niet lekker door onderbrekingen in de internetverbinding en werd de iPad gediskwalificeerd als ontwikkelaarstool.
iSH Shell breidt het toepassingsgebied van het mobiele apparaat uit voor mobiel ontwikkelen. Om te beginnen heb je een iOS-apparaat nodig met minimaal iOS 11. De app heet in de store ‘iSH Shell’ en is gratis. Je hoeft je ook geen zorgen te maken over in-app aankopen. De app is gemaakt als een hobbyproject en is volledig opensource. Bij de link op de volgende pagina staat een interview met de maker voor meer informatie. De applicatie draait op een iPad en iPhone – maar is op die laatste niet zo leuk vanwege het kleinere scherm.
Er zit niet veel franje in de app. Na het starten ervan beland je onmiddellijk op de commandline. Linux hoeft niet eerst minutenlang op te starten. Net zoals Microsoft bij het Windows Subsystem for Linux (WSL) of de ontwikkelaars van Wine het voor elkaar hebben gekregen, start iSH geen virtuele machine op, maar maakt het geëmuleerde systeemaanroepen van Linux-toepassingen.
Volgens de ontwikkelaar heeft het feit dat een x86-Linux wordt geëmuleerd op de ARM-telefoon geen negatief effect op de prestaties. Hij moest sowieso ergens een emulatielaag inbouwen, want Apple staat geen toegang tot de virtualisatietechnologie toe. De emulator, die de ontwikkelaar zelf classificeert als JIT (‘just in time compiler’), is grotendeels direct in assembler geschreven. Een gedetailleerde technische uitleg in de documentatie is in bewerking.
De interface is snel uit te leggen: boven het virtuele toetsenbord zitten de belangrijke toetsen voor het gebruik van de commandline. De ^ staat voor de Ctrl-toets, rechts daarvan zit de Esctoets. Het pijlkruis kan het beste worden gebruikt met veeggebaren. Probeer niet de toets ingedrukt te houden en dan te vegen. Een veeggebaar naar boven laat daarbij dan het laatste commando uit de history zien.
Als je de app toevallig in de Store zou ontdekken en zou installeren, zou je op het eerste gezicht bijna denken dat hij nutteloos is. De informatie die het commando uptime laat zien, geeft echter al aan dat er meer mee kan. Je krijgt dan te zien hoe lang het iOS-apparaat al draait. Maar de eenvoudigste Linux-commando’s zoals curl worden niet gevonden en zelfs een SSH-client zit er niet in. Je kunt ook geen pakketten downloaden, want de Alpine-pakketmanager apk ontbreekt. Dat komt
door Apples restrictieve beleid voor de App Store. Men vindt het bij Apple blijkbaar niet leuk als apps code willen downloaden. De poort naar de wijde wereld kan echter geopend worden met een wgetcommando, dat je ook kunt vinden in de wiki van het project op GitHub (zie de link):
wget -qO- http://dl-cdn.alpinelinux.org/ alpine/v3.12/main/x86/apk-tools-static2.10.5-r1.apk | tar -xz sbin/apk.static && ./sbin/apk.static add apk-tools && rm sbin/apk.static
Daarna werkt het commando apk en kun je de meest noodzakelijke dingen binnenhalen, bijvoorbeeld:
apk add curl openssh nano
BESTANDSINTERFACE
Met apk add youtube-dl is onder meer de kleine tool youtube-dl beschikbaar, die video’s van verschillende videoplatforms kan downloaden. Als je bijvoorbeeld een bepaalde vlog wilt bekijken die dat ondersteunt, hoef je daarvan alleen maar de url te weten. Verder is het enige wat je nodig hebt een commando in iSH: youtube-dl https://youtu.be/
Na een paar minuten meldt het programma dat het klaar is en ls laat zien dat het mp4-bestand ook echt lokaal bestaat. Een commandline is echter niet echt de juiste plek om naar een video te kijken, maar de ontwikkelaars zijn erin geslaagd om het Linux-bestandssysteem van buitenaf toegankelijk te maken via de bestandsinterface van Apple. Dit breidt de toepassingsmogelijkheden van de app enorm uit.
Open de systeem-app Bestanden, die op elk iOS-apparaat is geïnstalleerd. Daar kunnen allerlei soorten apps hun bestanden aanbieden voor uitwisseling. In de app navigeer je naar het topniveau waar alle locaties staan vermeld. iSH Shell staat daar al genoemd onder ‘Meer locaties’, die hoef je alleen nog maar in te schakelen. Dan krijg je toegang tot het Linux-bestandssysteem. In de map /root staat de gedownloade video, die je vervolgens kunt bekijken. Met behulp van de Bestanden-app kun je de video ook naar andere locaties kopiëren, bijvoorbeeld naar een Nextcloud of een SMB-schijf. De iSH-wiki legt uit hoe je andere bestandsaanbieders direct in de Linux-shell kunt mounten.
De bestandsinterface is ook handig voor softwareontwikkelaars. Je hoeft geen code te schrijven op de commandline (hoewel vim en emacs net zo goed werken als nano), maar kunt een app gebruiken zoals de gratis Koder Code Editor uit de App Store. Dergelijke editors hebben meestal toegang tot de bestandsinterface van Apple en kunnen daardoor werken binnen het iSH-bestandssysteem.
Met die kennis kun je bijvoorbeeld een zelfgeschreven Go-programma op het iOS-apparaat compileren en uitvoeren. Om dat te doen, maak je het bestand example.go aan met touch example. go. Open dat bestand met een commandoregeleditor naar keuze (met bijvoorbeeld nano example.go) of via de Bestanden-app met een grafische editorinterface. Zet daar een klein voorbeeldprogramma in:
package main import("fmt") func main(){ fmt.Println("running on iOS!") }
Je voegt de interpreter toe met apk add php en start de ontwikkelserver met php -S localhost:8000
Schakel over naar de Safari-browser en ga naar het adres http://localhost:8000. Je website draait nu lokaal en niets staat het ontwikkelen in ICE in de weg. Op een iPad met een toetsenbord kun je dan redelijk ontspannen programmeren door het splitscreen te gebruiken en de tekstverwerker in de ene helft te openen en de browser in de andere helft.
NOG OP TE LOSSEN
Veel nuttige functies lopen al redelijk probleemloos. De performance is niet altijd geweldig, maar iSH is al veel meer dan alleen een proof-of-concept. De documentatie op de GitHub-wiki heeft nog veel meer leuke dingen te bieden en laat zien waar op dit moment nog aan gewerkt wordt. De Dockerdaemon loopt bijvoorbeeld nog niet in de shell en genereert verschillende fouten.
Als je er open voor staat je mobiele telefoon of tablet soms via de commandoregel te bedienen, zul je veel nuttige dingen ontdekken. Voorbeelden zoals youtube-dl laten zien dat niet alleen ontwikkelaars deze tool in het dagelijks leven kunnen gebruiken.
Bij de link op deze pagina staat een interview met Theodore Dubois, de ontwikkelaar van iSH Shell.