• Rust-baserade uutils närmar sig full kompatibilitet med GNU Coreutils

    Rust-projektet uutils tar ännu ett stort steg mot att kunna ersätta GNU Coreutils. Med version 0.10 klarar projektet nu 93,48 procent av GNU testsvit och levererar samtidigt förbättringar inom säkerhet, prestanda, filhantering och stöd för fler plattformar.

    Coreutils är en samling grundläggande kommandoradsverktyg som finns i nästan alla Linuxsystem. Kommandon som ls, cp, mv, rm, cat, date och chmod används dagligen av både vanliga användare, systemadministratörer och automatiserade skript.

    Traditionellt kommer dessa program från GNU Coreutils och är huvudsakligen skrivna i programmeringsspråket C. Projektet uutils försöker återskapa samma verktyg i Rust – ett modernare programmeringsspråk med ett starkt fokus på minnessäkerhet och robust programvara.

    Med version 0.10 har projektet tagit ett stort steg närmare målet att fungera som en direkt ersättare för GNU Coreutils.

    Klarar 645 av 690 tester

    Enligt projektets senaste testresultat klarar uutils Coreutils nu 645 av de 690 testerna i GNU:s officiella testsvit. Det motsvarar en kompatibilitet på 93,48 procent.

    I version 0.9 låg resultatet på 90,58 procent. Antalet underkända tester har samtidigt minskat från 56 till 29.

    Att klara testerna är viktigt eftersom även små skillnader mellan två kommandon kan orsaka problem. Ett skript kan exempelvis förvänta sig en viss felkod, ett exakt formaterat felmeddelande eller att ett kommando reagerar på ett särskilt sätt när en fil saknas.

    Ju fler GNU-tester uutils klarar, desto större är möjligheten att befintliga Linuxprogram och skript fungerar utan ändringar.

    Många välkända kommandon har förbättrats

    Version 0.10 innehåller kompatibilitetsförbättringar för ett stort antal vanliga verktyg, däribland:

    date, du, head, tail, install, ls, nproc, numfmt, od, pr, stat, sum och truncate.

    Även felmeddelandena har blivit tydligare. När ett kommando misslyckas anges nu oftare både namnet på den berörda filen och det ursprungliga felet från operativsystemet.

    Det gör det lättare att förstå om problemet exempelvis beror på bristande behörighet, en saknad fil eller ett skrivskyddat filsystem.

    Ökad säkerhet vid filhantering

    En viktig del av utvecklingsarbetet handlar om att förhindra så kallade TOCTOU-problem, en förkortning av time-of-check to time-of-use.

    Problemet kan uppstå när ett program först kontrollerar en fil och därefter utför en åtgärd på den. Under den korta tiden mellan kontrollen och åtgärden kan filen eller sökvägen hinna ändras.

    En angripare skulle exempelvis kunna ersätta en vanlig fil med en symbolisk länk och därmed försöka få programmet att skriva till eller ändra fel fil.

    I version 0.10 har skyddet mot sådana situationer förbättrats i bland annat:

    touch, mkfifo, head, split och chcon.

    De rekursiva funktionerna i chmod och chown har också gjorts mer motståndskraftiga mot cirkulära symboliska länkar och försök att kringgå säkerhetsfunktionen --preserve-root.

    Den funktionen ska bland annat skydda användaren från katastrofala kommandon som av misstag försöker ändra eller radera hela rotfilsystemet.

    Säkrare kopiering och flyttning

    Kommandot cp följer inte längre en symbolisk länk om länken pekar på en underkatalog i kopieringens målområde. Detta minskar risken för att programmet kopierar filer till en oväntad plats.

    Även mv har fått ytterligare skydd när filer flyttas mellan olika filsystem eller när säkerhetskopior skapas.

    Kommandona mkdir, mkfifo och mknod kan dessutom tilldela SELinux-etiketter redan när ett objekt skapas. Tidigare kunde etiketten läggas till i ett separat steg, vilket skapade ett kort tidsfönster där objektet hade fel säkerhetsmärkning.

    Bättre hantering av ovanliga fel

    Utvecklarna har korrigerat flera problem som framför allt uppstår i extrema eller ovanliga situationer.

    Det gäller bland annat:

    • skrivfel vid utmatning till enheter som /dev/full
    • heltalsöverskridningar vid mycket stora argument
    • ogiltiga teckengränser i text med multibyte-kodning
    • onödigt stora minnesallokeringar
    • stacköverskridningar i kommandot expr

    Enheten /dev/full fungerar ungefär som en hårddisk som alltid är full. Den används ofta för att testa hur ett program reagerar när det inte längre går att skriva data.

    Parsern i expr har skrivits om för att arbeta iterativt i stället för rekursivt. Det minskar risken för att mycket djupt nästlade uttryck fyller programmets stack och orsakar en krasch.

    Nya funktioner i mv, install och rm

    Version 0.10 introducerar även flera nya funktioner.

    Kommandot:

    mv --exchange
    

    kan användas för att atomiskt byta plats på två sökvägar. Atomiskt innebär att bytet sker som en enda sammanhängande operation. Andra program ska därför inte kunna se ett tillstånd där bara halva bytet har genomförts.

    Installationsverktyget install har fått stöd för alternativet:

    --reflink
    

    På kompatibla filsystem kan detta skapa en så kallad copy-on-write-kopia. I stället för att omedelbart duplicera alla data kan originalet och kopian tillfälligt dela samma datablock. Nya block skapas först när någon av filerna ändras.

    Det kan göra kopieringen både snabbare och mer utrymmeseffektiv.

    Alternativet install -C kan nu också kombineras med --preserve-timestamps.

    Kommandot rm har fått alternativet:

    --one-file-system
    

    Det förhindrar en rekursiv radering från att fortsätta in i andra monterade filsystem. Funktionen kan vara användbar när exempelvis externa diskar, nätverkslagring eller särskilda systemkataloger är monterade under den katalog som ska tas bort.

    Kommandot cut har dessutom fått -O som en kortare variant av --output-delimiter.

    Snabbare cat, cp och tee

    Flera prestandaförbättringar ingår också i versionen.

    tee har fått möjlighet att använda en snabb kopieringsmetod med så kallad zero-copy. Det innebär att data i vissa situationer kan flyttas mellan olika delar av systemet utan att först kopieras fram och tillbaka genom programmets eget minne.

    Även cat har optimerats för högre datahastighet.

    Kopieringar med cp som inte använder reflink ska också gå snabbare. Förbättringarna gäller bland annat kopiering mellan olika lagringsenheter.

    Kontrollsummeverktygen kan dessutom använda OpenSSL som beräkningsmotor, vilket kan ge bättre prestanda på system där OpenSSL innehåller väloptimerade implementationer för processorn.

    Förbättrat stöd för Windows och WebAssembly

    uutils utvecklas inte enbart för traditionella Linuxsystem.

    Version 0.10 har fått stöd för målplattformen wasm32-wasip2, vilket gör det möjligt att kompilera verktygen för WebAssembly och köra dem i miljöer som stöder WASI.

    På Windows fungerar nu kommandot timeout, och tail -f samt tail -F kan följa filer som uppdateras löpande.

    Det kan exempelvis användas för att övervaka en loggfil medan ett program fortfarande skriver till den.

    Windowsversionen har även fått stöd för glesa kopior i cp. Glesa filer innehåller områden som logiskt består av nollor men som inte behöver ta upp motsvarande fysiskt lagringsutrymme.

    En korrigering har dessutom gjorts för kontrollsummor i samband med konvertering av Windows radslut, så kallade CRLF-radslut.

    Rust som alternativ till klassiska Unixverktyg

    Målet med uutils är inte att skapa helt nya kommandon, utan att återskapa beteendet hos välkända Unixverktyg med en modern kodbas.

    Rust kan förhindra flera vanliga programmeringsfel redan under kompileringen. Det gäller bland annat felaktig minneshantering, användning av frigjort minne och vissa typer av samtidighetsproblem.

    Det betyder däremot inte automatiskt att alla program skrivna i Rust är felfria. Logiska fel, kompatibilitetsproblem och säkerhetsbrister kan fortfarande förekomma.

    Det höga resultatet i GNU:s testsvit visar ändå att uutils börjar närma sig en nivå där projektet kan bli ett realistiskt alternativ i fler operativsystem och Linuxdistributioner.

    Med 93,48 procents godkända tester är full kompatibilitet ännu inte uppnådd. Men version 0.10 visar att avståndet till GNU Coreutils fortsätter att minska.

    https://uutils.org/coreutils

    > TEKNISK FAKTA: uutils Coreutils 0.10
    Projekt: uutils Coreutils
    Version: 0.10
    Programmeringsspråk: Rust
    Mål: Kompatibel ersättare för GNU Coreutils
    GNU-testsvit: 645 av 690 tester godkända
    Kompatibilitet: 93,48 %
    Föregående version: 90,58 %
    Underkända tester: 29
    Plattformar: Linux, Unix-liknande system, Windows och WebAssembly
    Nytt mål: wasm32-wasip2

    Några förbättrade verktyg:
    date, du, head, tail, install, ls, nproc, numfmt, od, pr, stat, sum och truncate

    Nya funktioner:
    mv –exchange
    install –reflink
    rm –one-file-system
    cut -O

    Fokus i version 0.10:
    Kompatibilitet, TOCTOU-säkerhet, symlink-skydd, förbättrad felhantering, högre prestanda och utökat plattformsstöd.
  • Ubuntu bytte tillbaka till klassiska cp efter kompatibilitetsproblem

    Ubuntu har tillfälligt återgått till den klassiska GNU-versionen av kommandot cp efter att Rust-alternativet orsakat problem vid byggandet av systemets liveavbilder. Händelsen visar hur svårt det är att ersätta Linux mest grundläggande verktyg utan att stöta på små men avgörande kompatibilitetsskillnader.

    Ubuntu testar sedan en tid tillbaka att ersätta flera av Linux mest grundläggande kommandon med nya versioner skrivna i programmeringsspråket Rust. Men arbetet har nu stött på ännu ett kompatibilitetsproblem.

    Den här gången gäller det kommandot cp, som används för att kopiera filer och kataloger.

    Efter att Rust-versionen av cp orsakat problem vid byggandet av Ubuntus installations- och liveavbilder valde utvecklarna att tillfälligt gå tillbaka till den klassiska versionen från GNU Coreutils.

    Det betyder inte att Ubuntu har övergett satsningen på Rust. Händelsen visar snarare hur svårt det är att ersätta program som har utvecklats och använts i flera årtionden.

    Ett litet kommando med en viktig uppgift

    Kommandot cp verkar vid första anblicken mycket enkelt. Det kopierar en fil från en plats till en annan:

    Men bakom det enkla kommandot finns en stor mängd funktioner och specialfall. cp kan bland annat:

    • kopiera hela katalogstrukturer
    • bevara filrättigheter och tidsstämplar
    • hantera symboliska länkar
    • skriva över befintliga filer
    • skapa exakta kopior av katalogträd
    • hantera särskilda filtyper

    Under flera årtionden har administratörer, utvecklare och Linuxdistributioner skrivit skript som förutsätter att cp beter sig exakt på samma sätt i varje situation.

    Även en mycket liten skillnad kan därför få stora konsekvenser.

    Problem vid byggandet av Ubuntu

    Problemet upptäcktes när Ubuntu åter aktiverade Rust-versionen av cp i paketet coreutils-from.

    Det paketet används för att bestämma om ett visst kommando ska komma från traditionella GNU Coreutils eller från det Rustbaserade projektet uutils.

    När Rust-versionen av cp aktiverades började paketet livecd-rootfs misslyckas. Det är ett viktigt verktyg som används när Ubuntu bygger sina startbara live- och installationsavbilder.

    Eftersom felet stoppade byggandet av Ubuntuavbilder klassades det som kritiskt.

    Den omedelbara lösningen blev därför att återställa GNU-versionen av cp.

    Problemet uppstod med flera flaggor samtidigt

    Felet handlade om hur Rust-versionen tolkade vissa kombinationer av kommandoradsflaggor.

    Ett exempel är:

    Flaggan -a betyder arkivläge. Den används när man vill kopiera en katalog så fullständigt som möjligt och samtidigt bevara exempelvis filrättigheter, ägare, tidsstämplar och länkar.

    I GNU-versionen motsvarar -a ungefär följande:

    Det viktiga här är bokstaven R, som betyder att kataloger ska kopieras rekursivt.

    Flaggan -L säger samtidigt att symboliska länkar ska följas. I stället för att bara kopiera själva länken kopieras alltså det som länken pekar på.

    Rust-versionen hanterade vissa sådana flaggkombinationer för aggressivt. När -a och -L användes tillsammans kunde den rekursiva funktionen som ingår i -a försvinna.

    Resultatet blev felmeddelanden som:

    Programmet hävdade alltså att rekursiv kopiering inte hade begärts, trots att den egentligen ingick i arkivläget.

    Varför är det så svårt att ersätta gamla Unixverktyg?

    GNU Coreutils innehåller flera av de mest grundläggande kommandona i Linux, bland annat:

    Kommandona har funnits länge och används överallt: i installationsprogram, säkerhetskopior, servermiljöer, byggsystem och vanliga skalskript.

    Dokumentationen beskriver hur kommandona ska fungera, men i praktiken finns det även en mängd historiska beteenden och specialfall som program och skript har börjat förlita sig på.

    En ny implementation måste därför inte bara göra ungefär samma sak. Den måste ofta efterlikna originalet nästan exakt.

    Det gäller bland annat:

    • vilka flaggor som får kombineras
    • vilken flagga som har företräde
    • i vilken ordning argument behandlas
    • vilka felmeddelanden som visas
    • vilka returvärden programmet ger
    • hur länkar, kataloger och filrättigheter hanteras

    Det är ofta först när den nya versionen används i en stor Linuxdistribution som de ovanliga skillnaderna upptäcks.

    Rust är inte problemet i sig

    Det inträffade ska inte tolkas som att Rust Coreutils är ett misslyckat projekt eller att programmeringsspråket Rust inte lämpar sig för systemverktyg.

    Tvärtom är det just genom omfattande tester som sådana problem kan upptäckas och rättas innan verktygen når en stabil Ubuntuutgåva.

    Rust har blivit populärt inom systemutveckling eftersom språket är konstruerat för att förhindra flera vanliga typer av programmeringsfel.

    Program skrivna i C eller C++ kan exempelvis drabbas av:

    • buffertöverskridningar
    • användning av redan frigjort minne
    • ogiltiga minnespekare
    • datakapplöpningar mellan trådar

    Rusts typsystem och regler för minneshantering gör många av dessa fel svårare eller omöjliga att skapa i säker Rustkod.

    För program som finns på miljontals datorer kan det innebära betydande säkerhetsfördelar.

    Ubuntu vill införa Rust stegvis

    Canonical har tidigare meddelat att målet är att börja använda vissa moderna Rustbaserade systemverktyg som standard.

    Planen har varit att introducera fler sådana verktyg i Ubuntu 25.10 och därefter eventuellt använda dem i Ubuntu 26.04 LTS, förutsatt att kompatibiliteten är tillräckligt bra.

    Ett viktigt projekt i satsningen är uutils Coreutils, som försöker återskapa GNU Coreutils i Rust.

    Det handlar alltså inte om att skapa helt nya kommandon. Målet är att användare och skript ska kunna fortsätta skriva exempelvis:

    Skillnaden är att programmen bakom kommandona är skrivna i Rust i stället för huvudsakligen C.

    Ett verktyg för att växla mellan gammalt och nytt

    För att göra övergången säkrare har Ubuntu utvecklat ett verktyg för experimentell aktivering av Rustbaserade systemkomponenter.

    Tanken är att användaren eller utvecklaren enkelt ska kunna växla mellan olika implementationer.

    Ett experiment kan exempelvis aktivera:

    • Rust Coreutils
    • sudo-rs
    • andra framtida Rustbaserade systemverktyg

    Om ett kompatibilitetsproblem uppstår ska experimentet kunna stängas av, så att systemet återgår till de traditionella programmen.

    Detta gör det möjligt att testa ny teknik utan att omedelbart göra den permanent för alla användare.

    Ingen fara för vanliga Ubuntu-användare

    För vanliga användare finns det ingen anledning till oro.

    Ubuntu har inte levererat ett trasigt cp i en färdig stabil utgåva. Problemet upptäcktes under utveckling och verktyget byttes tillbaka innan det hann bli ett större problem.

    Att återgå till GNU-versionen är ett försiktigt och rimligt beslut. Grundläggande filkommandon måste fungera stabilt, eftersom ett fel kan påverka allt från installationer och säkerhetskopior till systemuppdateringar.

    Samtidigt har utvecklarna skickat en korrigering uppströms, så att problemet kan lösas i själva uutils-projektet.

    En påminnelse om hur mycket vi tar för givet

    De flesta tänker sällan på kommandon som cp, ls eller mv. De finns bara där och förväntas alltid fungera.

    Men just därför är de svåra att ersätta.

    Ett modernt program kan vara bättre konstruerat, säkrare och lättare att underhålla, men det måste samtidigt vara kompatibelt med flera årtionden av skript och användarbeteenden.

    Händelsen med Ubuntu och cp visar att övergången till Rust inte kommer att ske genom ett enda stort byte. Den kommer snarare att ske steg för steg, med tester, bakslag, rättningar och tillfälliga återgångar.

    Det är inte ett tecken på att utvecklingen har misslyckats.

    Det är så försiktig systemutveckling bör fungera.

    https://bugs.launchpad.net/ubuntu/+source/coreutils-from/+bug/2158691

    $ FAKTA: UBUNTU, CP OCH RUST COREUTILS

    > Berört kommando:
    cp – används för att kopiera filer och kataloger.

    > Traditionell version:
    GNU Coreutils, huvudsakligen skrivet i programmeringsspråket C.

    > Ny version:
    uutils Coreutils, en nyimplementation av de klassiska Unix-verktygen i Rust.

    > Vad hände?
    Rust-versionen av cp hanterade vissa kombinationer av flaggorna -a och -L annorlunda än GNU-versionen.

    > Konsekvens:
    Paketet livecd-rootfs kunde inte bygga Ubuntus live- och installationsavbilder korrekt.

    > Ubuntus lösning:
    Ubuntu återgick tillfälligt till GNU-versionen av cp medan felet rättas i uutils.

    > Berörda Ubuntu-versioner:
    Utvecklingen inför Ubuntu 26.04 LTS samt den pågående övergången till Rust-baserade systemverktyg.

    > För vanliga användare:
    Ingen akut åtgärd krävs. Problemet upptäcktes under utvecklingen och nådde inte en färdig stabil Ubuntu-utgåva.

Etikett: cp

  • Rust-baserade uutils närmar sig full kompatibilitet med GNU Coreutils

    Rust-projektet uutils tar ännu ett stort steg mot att kunna ersätta GNU Coreutils. Med version 0.10 klarar projektet nu 93,48 procent av GNU testsvit och levererar samtidigt förbättringar inom säkerhet, prestanda, filhantering och stöd för fler plattformar. Coreutils är en samling grundläggande kommandoradsverktyg som finns i nästan alla Linuxsystem. Kommandon som ls, cp, mv, rm,…

  • Ubuntu bytte tillbaka till klassiska cp efter kompatibilitetsproblem

    Ubuntu har tillfälligt återgått till den klassiska GNU-versionen av kommandot cp efter att Rust-alternativet orsakat problem vid byggandet av systemets liveavbilder. Händelsen visar hur svårt det är att ersätta Linux mest grundläggande verktyg utan att stöta på små men avgörande kompatibilitetsskillnader. Ubuntu testar sedan en tid tillbaka att ersätta flera av Linux mest grundläggande kommandon…