L
public

 

Hur man bygger ett Linux OS från början

Skribent: Wictor Lund

Du kommer att starta upp en virtuell maskin med Linux distributionen Alpine Linux, i vilken du kommer att kompilera en minimal Linux kernel och skapa en minimal initramdisk som du startar upp.

På Windows maskiner finns ofta inget ssh kommando installerat. Detta gör att det inte går att köra som det står i anvisningarna. Detta kan lösas genom att installera Git for Windows som innehåller en unix-shell miljö, git och ett ssh kommando. Ett annat sätt att kringgå vagrant ssh är att logga in i VirtualBox konsolen. En obekvämlighet med detta tillvägagångssätt är att man inte copy-pastea i VirtualBox konsolen.

Obs! följ stegen så bra som du kan. Om saker inte går som de borde så är instruktionerna bristfälliga eller så har något annat misstag gjorts. Fråga om det finns oklarheter, vi är här för att lära oss.

Du kommer att använda två olika maskiner i den här överningen, värdmaskinen (vi kallar den HM) och den virtuella maskinen (vi kallar den VM). Så håll reda på vilken maskin du kör program i.

Demo direktiv

Direktiven är gjorda för att göras på en Linux dator med Vagrant installerat. Demot går också att genomföras på en Windows eller Mac OS X dator, även om direktiven inte finns.

  1. (HM) Klona detta repository till nån katalog.
  2. (HM) Gå in i katalogen (använd cd kommandot)
  3. Kör:
    (HM) $ vagrant up --provider virtualbox // (du måste ha Vagrant och VirtualBox fungerande för att utföra detta steg.)
  4. Virtualbox fönster hoppar upp Du kommer i virtualbox fönstret att först att se ett bootloader fönster där det endast finns ett alternativ. Det till denna virtuella maskin du senare kommer installera ditt nya OS. Det går inte att logga in i virtualbox fönstret eftersom det inte finns något lösenord. Starta en ny terminal, gå till vagrant-repo katalogen och kör ..
  5. (HM) $ vagrant ssh
    Om detta steg lyckas kommer du att vara inne i den virtuella maskinen.
    Om vagrant ssh inte fungerar: Det har visat sig att vagrant ssh inte fungerar i vissa Windows omgivingar. I dessa fall går det också att logga in via virtualbox fönstret med login: vagrant, lösenord: vagrant.
  6. Vi har i ett tidigare steg laddat ner filen linux-4.4.43.tar.xz. Vi ska nu kontrollera denna fils integritet mha en hashsumma, pga det har visat sig att nedladdningen inte alltid lyckas.
    (VM) $ sha256sum -c sha256sums
    Alla filer i sha256sums finns inte med, men det är inget problem. Om nedladdningen lyckades borde det finnas en rad linux-4.4.43.tar.xz: OK med i outputen.
  7. Nu när vi har kontrollerat integriteten för filen ska vi packa upp den.
    (VM) $ xzcat linux-4.4.43.tar.xz | tar -xv
    Detta kommando skriver ut filnamn som packas upp.
  8. (VM)$ cd linux-4.4.43
    Om allting gick rätt till kan vi nu gå in i katalogen som packades upp.
  9. (VM)$ make menuconfig
    Nu ska du konfigurera Linux kerneln, det är inte många saker som behövs. Använd sunt förnuft när du konfigurerar. Det värsta som händer är att kerneln inte kompilerar eller att kernel inte bootar. Tips 1: Ta bort allt som är onödigt, detta förkortar kompileringstiden. Det mesta är onödigt för den här uppgiften. Tips 2: Ta med "Initial RAM filesystem and RAM disk (initramfs/initrd) support", "Support initial ramdisks compressed using gzip", "Kernel support for ELF binaries" och "Kernel support for scripts starting with #!". "64-bit kernel" behövs också, pga busybox är 64-bit. Tips 3: Tangentbord är bra att ha. Observation 1: Detta steg är tyvärr magiskt om man inte känner till vad konfigurationsalternativen gör. Observation 2: Få mänskor vet vad alla konfigurationsalternativ gör.
  10. (VM)$ make -j 2
    Kompilera kerneln. -j 2 betyder att make ska använda 2 parallela processer när den kompilerar, lägg en nummer som passar för det antal processorer som du har konfiguerat. Om kompileringen lyckades borde den säga nånting i stil med Kernel: arch/x86/boot/bzImage is ready (#1)
    Om kompileringen lyckades kopiera kerneln till boot katalogen med sudo cp arch/x86/boot/bzImage /boot/vmlinuz-asd (asd är mitt favorit namn på saker)
  11. (VM) Bygg en initramdisk!
    För att ditt system skall kunna starta och göra någonting intressant behövs ett filsystem. Bootloadern kommer att läsa in en initramdisk vilken kommer senare att användas som root filsystem. Vi skapar initramdisken manuellt för att se vilka steg det krävs som att starta upp en minimalt Linux system.
    1. Gå till din hemkatalog
      $ cd
    2. Skapa en katalog som du ska bygga rootfilsystemet i
      $ mkdir rootfs
    3. Gå in i katalogen (kolla efteråt att du faktiskt vet var du är)
      $ cd rootfs
    4. Skapa några kataloger som behövs.
      $ mkdir proc sys tmp bin dev
    5. Kopiera in busybox
      cp /bin/busybox.static ./bin/busybox Busybox kommer att fungera som alla UNIX-kommandon du kommer att använda i din nya Linux distribution. Det är viktigt att du kopierar /bin/busybox.static och inte /bin/busybox eftersom den /bin/busybox.static är statiskt länkad vilket betyder att den inte har några beroenden av dynamisktladdbara bibliotek. Tips Man kan kontrollera om en binär är statiskt länkad med ldd kommandot.
    6. Skapa ett init skript. Detta skript kommer att startas som den första processes av Linux kerneln när den är färdig att starta användarapplikationer. cat > init << EOF #!/bin/busybox sh /bin/busybox --install /bin /bin/mount -t proc none /proc /bin/mount -t sysfs none /sys /bin/mdev -s /bin/sh EOF
    7. Gör init skriptet exekverbart
      $ chmod 755 init
    8. Ändra användarrättigheter
      $ sudo chown -Rv root:root .
    9. Skapar initramdisken
      find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
  12. Kopiera initramdisken till /boot
    (VM) $ sudo cp ../rootfs.cpio.gz /boot/initramfs-asd
  13. Updatera bootloadern
    (VM) $ sudo update-extlinux -v
  14. Starta om den virtuella maskinen och byt till VirtualBox fönstret.
    (VM) $ sudo reboot
  15. Tryck på någon tangent vid rätt tillfälle för att komma till boot menyn.
    Välj linux-asd i menyn.

Uppgift 2

  1. Skriv ett statiskt länkat "Hello World!" program.
    1. Installera en editor $ sudo apk add nano
    2. Editera din c-fil $ nano hello.c
    3. Kompilera programmet statiskt
      $ gcc -static hello.c -o hello
  2. Verifiera att programmet är statiskt länkat med ldd.
    $ ldd hello
  3. Lägg binären in i rootfilsystemet
  4. Lägg programmet in i init filen
  5. Bygg om rootfilsystemet och lägg den in i /boot
  6. Starta om

Efter demonstrationen

Efter demonstrationen måste vi städa upp lite.

  1. Gå till katalogen där Vagrantfile finns
  2. Förstör din virtuella maskin $ vagrant destroy
  3. Ta bort boxen. Kör först $ vagrant box list Titta vad som finns, och kör $ vagrant box remove <boxens namn>

Lite om Vagrantfile

Vagrantfile är en konfigurationsfil i ruby syntax för vagrant. För att kompilera kernels snabbare vill du ha tillgång till så många processorer som möjligt från den virtuella maskinen. Detta kan du göra genom att editera Vagrantfile. I Vagrantfile:en finns många utkommenterade rader som man använda. Det verkar som att alpine linux:s kernel crashar ibland när den ska boota med vissa inställningar, jag vet inte varför.

Vagrant luntlapp

När du kör vagrant kommer vagrant att läsa filen Vagrantfile i samma katalog som befinner dig i (pwd). Om det inte finns nån Vagrantfile i katalogen kommer vagrant inte att förstå vad den ska göra.

  • $ vagrant up Starta upp en en vagrant box med standard providern. Obs! det kanske inte fungerar om du inte redan har startat upp en vagrant box i den nuvarande katalogen eftersom standard providern kan vara fel
  • $ vagrant up --provider virtualbox Starta upp en vagrant box med virtualbox providern.
  • $ vagrant ssh ssh:a in till den körande vagrant boxen.
  • $ vagrant halt Stoppa den körande vagrant boxen
  • $ vagrant halt -f Se $ vagrant halt, -f betyder force
  • $ vagrant destroy Förstör vagrant boxen, d.v.s. frigör diskutrymmet som upptas av den virtuella maskinen. Bör göras efter sittningen och om du råkar på något opassligt sätt förstöra din virtuella maskin installation.