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. (HM) Kör:
    $ 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.
  6. (VM)$ cd linux-4.4.43
    Om provisioneringsskriptet har lyckats kommer det att finnas en linux-4.4.43 katalog som du kan gå in i.
  7. (VM)$ make menuconfig
    Nu ska du konfigurera Linux kerneln, det är inte många saker som behövs. Använda 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", "Kernel support for ELF binaries" och "Kernel support for scripts starting with #!".
  8. (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)
  9. (VM) Bygg en initramdisk!
    För att ditt system skall kunna starta och göra någonting närapå intressant behöves ett filsystem. Detta är root filsystemet som bootloadern kommer att läsa in åt kerneln. Initramdisken kommmer att innehålla allt som behövs. Vi gör detta manuellt så att du får se hur enkelt det faktiskt är att göra en Linux distribution [sic!].
    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
  10. Kopiera initramdisken till /boot
    (VM) $ sudo cp ../rootfs.cpio.gz /boot/initramfs-asd
  11. Updatera bootloadern
    (VM) $ sudo update-extlinux -v
  12. Starta om den virtuella maskinen och byt till VirtualBox fönstret.
    (VM) $ sudo reboot
  13. 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.