Installera ny Kernel

Här ställer ni allmäna frågor kring Slackware Linux

Moderatorer: Nille, nomicon, Minime

Kawazu
Hacker
Inlägg: 37
Blev medlem: 26 sep 2018 10:10

Installera ny Kernel

Inlägg av Kawazu »

Då var det dags igen med en ny fråga.

Har läst runt på diverse forum men tycker inte jag blir något klokare på hur jag ska gå tillväga.
Sitter i dag på kernel 5.4.8
Då jag fått tipset att ha allt som har med kernel att göra i blacklist för att det inte ska uppdateras till en kernel som mot förmodan inte skulle fungera och inte ha någon backup.

Det jag nu vill göra är att installera en kernel parallelt med den som jag har som fungerar.
Hur går jag tillväga för att göra det via slackpkg eller finns det något annat sätt att göra det?
Jag vill verkligen lära mig så finns det ett sätt som inte är automatiserat så vill jag gärna ha tips på hur man gör det så jag vet hur man gör det på "riktigt" utan hjälpmedel så att säga :)
Användarens profilbild
MDKDIO
Kodnisse
Inlägg: 2144
Blev medlem: 21 apr 2005 08:24
ORT: Bollnäs

Re: Installera ny Kernel

Inlägg av MDKDIO »

Tjena
visst funkar det att installera fler kärnor via slackpkg. Men som du redan har noterat, låt blacklist deaktivera automatisk uppdatering.

Det du gör i stället, är att manuellt ladda ner paketet för aktuell kärna.
Kör du current, så är den senaste versionen 5.4.17.
Sedan kör du installpkg som med vilket paket som helst.

Naturligtvis måste du göra samma sak med andra relaterade paket (dependencies).

Redigera sedan lilo.conf och lägg till den nya kärnan enligt anvisning (se exempel i lilo.conf)

OBS! Vänta med detta tills någon mer kan bekräfta att jag fått med alla steg 👍

Redigerat: slackpkg install? Nja, installpkg kör vi väl när vi installerar paket :)
Senast redigerad av MDKDIO den 02 feb 2020 22:21, redigerad totalt 1 gånger.
Anledning: Se redigerat:
Slackware 64-bit 15.0 (Desktop x2)
Slackware 64-bit Current (Laptop)
Slackware 64-bit 15.0 (Laptop x2)
Slackware 64-bit 15.0 (XFCE) (Netbook)
Användarens profilbild
Nille
Guru
Inlägg: 1475
Blev medlem: 17 jun 2004 02:41

Re: Installera ny Kernel

Inlägg av Nille »

Kompilera en kernel själv som när den är installerad inte påverkas av kernelpaketen.
Jag har alltid en egen kompilerad kernel som jag kan starta med om något skulle gå fel.
Hur går man då till väga?
Börja med att tanka hem en kernel jag väljer linux-5.5.1 i detta exempel
https://www.kernel.org/

Kod: Markera allt

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.5.1.tar.xz
Kernelns källkod vill vi helst ha under /usr/src/ så det vi kompilerar mot kerneln kan hitta källkoden osv.
Så vi packar upp källkoden i /usr/src och då måste vi vara root för att ha skrivrättigheter i /usr/src men då vi ska kompilera en ny kernel så ska vi vara root ändå för resterande av instruktionerna.

Kod: Markera allt

tar xvf linux-5.5.1.tar.xz -C /usr/src/
Byt dir till den uppackade kerneln.

Kod: Markera allt

cd /usr/src/linux-5.5.1/
Nu är det rekommenderad att köra mrproper, om detta steg behövs eller inte råder det delade åsikter om och det skadar inte att köra mrproper.
mrproper - Remove all generated files + config + various backup files
För de som är lite yngre så var mrproper ett vanligt rengöringsmedel förr och den europeiska översättningen av Mr. Clean

Kod: Markera allt

make mrproper
Nu behöver vi skapa en config fil för kerneln vilket kan göras från grunden men det gör jag aldrig nu för tiden men det går med t.ex "make menuconfig".
Ett alternativ är att utgå från en befintlig kernel config och då kan man välja om man vill kompilera en generic eller en huge kernel.
En generic kernel kräver ofta en initrd.gz medan en huge kernel ofta fungera direkt, däremot brukar en generic kernel använda mindre minne.
Jag brukar använda en generic kernel.
http://ftp.osuosl.org/pub/slackware/sla ... l-configs/
Då jag redan har currents generic kernel i 5.4 serien så tänker jag istället utgå från min befintliga kernel config.
Befintlig kernel config finns under /proc/config.gz och den ska sparas som .config i /usr/src/linux-5.5.1/ där vi redan befinner oss.
OBS .config är en dold fil så den syns endast med "ls -a"

Kod: Markera allt

zcat /proc/config.gz > .config
Kernel konfigurationen skiljer mellan tidigare kernel och den nya och "make oldconfig" kan användas och sedan kan man välja bland nyheterna vad man vill ha.
Jag orkar inte hålla på med sånt utan brukar köra "make listnewconfig" och snabbt kolla in nyheterna och om det är något jag bryr mig om.
Vill man läsa mer om de olika alternativ som finns så står det i kconfig.txt
/usr/src/linux-5.1/Documentation/kbuild/kconfig.txt
Fast då jag inte gillar att läsa dokumentation så använder jag "make help" i kernel source mappen som är bättre än den länkade dokumentationen.
Det vi lata istället vill använda när det inte är någon speciell nyhet är "make olddefconfig"
olddefconfig - Same as oldconfig but sets new symbols to their default value without prompting.

Kod: Markera allt

make olddefconfig
Nu är vi redo att kompilera en ny kernel :D
När vi kompilerar en kernel så använder vi flaggan -j eller --jobs med en siffra som motsvara antalet trådar i vår CPU för att snabba på kompileringen.
Jag har 4 kärnor och 8 trådar i m in laptop så jag använder -j8

Kod: Markera allt

make -j 8
Nu måste vi installera alla moduler.

Kod: Markera allt

make modules_install
Nu är det dags att kopiera kernel image, System.map, config till /boot då jag byggt en generic kernel så döper jag den som följande, döp hur du vill men använd samma till resterande för tydlighetens skull.
Om System.map och config behövs eller inte har jag diskuterat i en annan tråd men jag använder alltid System.map och config då de inte tar någon plats.

Kod: Markera allt

cp -v arch/x86/boot/bzImage /boot/vmlinuz-generic-5.5.1
cp System.map /boot/System.map-generic-5.5.1
cp .config /boot/config-generic-5.5.1
Nu är det dags att skapa en initrd då min generic kernel använder det.
När man kompilerar en egen kernel så kan man även ändra i konfigurationen om man vill så ingen initrd behövs.
Jag skapar en initrd-5.5.1 anledningen till att jag döper den så är för att den då fungerar automagiskt med grub.
Om man är osäker på initrd kommandot så finns det ett hjälpskript i slackware.
/usr/share/mkinitrd/mkinitrd_command_generator.sh
Själv har jag skapat egna skript som jag använder när jag uppdaterar min kernel.

Det enda som återstår nu är att ordna lilo.conf eller grub beroende på vad du använder.
Då jag använder grub så kör jag. "grub-mkconfig -o /boot/grub/grub.cfg" -o använder jag för att spara utdatan från grub.
Använder du lilo så får du redigera lilo.conf och lägga till din kernel.
Det går även att lägga till kerneln i /etc/grub.d/40_custom om man vill ha den högre i menyn i grub.

Nu har jag kompilerat en ny kernel under tiden jag skrivit inlägget.
The more linux you go the slacker you get.
Användarens profilbild
MDKDIO
Kodnisse
Inlägg: 2144
Blev medlem: 21 apr 2005 08:24
ORT: Bollnäs

Re: Installera ny Kernel

Inlägg av MDKDIO »

Tack Nille (igen)!

Det var lite annorlunda steg mot vad jag brukade göra då jag lagt till flera kärnor.
Ska def testa detta också, vid tillfälle :)
Slackware 64-bit 15.0 (Desktop x2)
Slackware 64-bit Current (Laptop)
Slackware 64-bit 15.0 (Laptop x2)
Slackware 64-bit 15.0 (XFCE) (Netbook)
Användarens profilbild
Nille
Guru
Inlägg: 1475
Blev medlem: 17 jun 2004 02:41

Re: Installera ny Kernel

Inlägg av Nille »

Det behövs inga särskilda tillfällen det är bara klistra in kommandona och kompilera med än gång.
Det var dags att uppdatera min fallback kernel så då kunde jag likväl skriva hur jag gör. :D
Jag blir nyfiken på hur ni andra gör om mitt skiljer.
The more linux you go the slacker you get.
Kawazu
Hacker
Inlägg: 37
Blev medlem: 26 sep 2018 10:10

Re: Installera ny Kernel

Inlägg av Kawazu »

Tack så hemskt mycket, har dock en del följdfrågor 🤣
Hur vet jag om jag kör generic eller huge kernel?
Kompilerade ihop kernel i går men blev så sent så stannade där så ska hem och skapa moduler och så.

Men vore ju bra om jag viste om ja kör generic eller huge så jag kan döpa den till ett passande namn 😋
Kawazu
Hacker
Inlägg: 37
Blev medlem: 26 sep 2018 10:10

Re: Installera ny Kernel

Inlägg av Kawazu »

Har nu försökt att boota från min kernel och allt gick bra tills jag skulle starta X via "startx"
Får då ett felmeddelande att den inte hittade någon skärm eller något sådant.

Antog då att jag var tvungen att köra in Nvidia drivisarna igen men det gick inte ens att installera nu och gav mig då diverse felmeddelande...

Edit: Löste det, Nvidia har ju självklart släppt en ny driver i dag som löste det :D
Användarens profilbild
Nille
Guru
Inlägg: 1475
Blev medlem: 17 jun 2004 02:41

Re: Installera ny Kernel

Inlägg av Nille »

Om du kompilerat är modulerna redan skapade det enda "make modules_install" är att installera dom under /lib/modules/
Ja hur vet man vilken kernel man använder det korta svaret är den man installerat och valt att starta.
Däremot kan man ha både generic och huge installerade.
När ett slackware kernel-paket installeras så skapar den vissa symlänkar för standard kerneln för System.map, config, vmlinuz som används av t.ex lilo.
Det senast installerade kernel paketet har de symlänkarna och då H kommer efter G i alfabetet blir det vanligtvis huge kerneln vid en uppdatering om båda är installerade.
När ett kernel paket installeras så skapas även en egen symlänk för generic och huge så man kan välja vilken man vill använda, symlänkarna som skapas är vmlinuz-generic och vmlinuz-huge.
Om man bootar vmlinuz så blir det den som är symlänkad till den vilket vi lätt kan se med "ls -l /boot/vmlinuz" men du kan använda "ls -l /boot" så ser du hur System.map, config, vmlinuz pekar mot antingen generic eller huge.
Däremot är det fritt att kalla kerneln vad som helst den kan likväl kallas nille, banan, egen eller fallback, den enda orsaken att jag använder generic eller huge är av vana.
Egentligen behöver den inget sådant överhuvudtaget utan bara ett namn så du vet vad du bootar.
När jag kör bisect på en kernel så döper jag de ofta till vmlinuz-bisect.

För att veta vad datorn startat med använder jag "cat /proc/cmdline" som visar uppstartsparametrar så jag vet vilken kernel image samt vilka andra parametrar som använts.
Det är samma utdata som andra raden i utdata från dmesg som även kan användas men dmesg har så mycket annan onödig information som dränker den informationen vi var ute efter.
The more linux you go the slacker you get.
Kawazu
Hacker
Inlägg: 37
Blev medlem: 26 sep 2018 10:10

Re: Installera ny Kernel

Inlägg av Kawazu »

Tackar för ett utomordentligt svar än en gång :)

Kod: Markera allt

bash-5.0$ ls -l /boot/vmlinuz
lrwxrwxrwx 1 root root 18 Jan  5 19:09 /boot/vmlinuz -> vmlinuz-huge-5.4.8

Kod: Markera allt

bash-5.0$ cat /proc/cmdline
BOOT_IMAGE=Linux-5.5.1 ro root=803
Kawazu
Hacker
Inlägg: 37
Blev medlem: 26 sep 2018 10:10

Re: Installera ny Kernel

Inlägg av Kawazu »

Såg just att jag hoppade över steget med att skapa en

Kod: Markera allt

initrd
Verkar ju fungera ändå :)
Efter att ha läst det du skrev ang ämnet så förstår jag inte riktigt hur man skapar den och vad den har för syfte?

Edit: Om jag fattat det rätt så ska initrd även läggas till i lilo.conf så jag kollade där vad det stod tidigare men kan inte hitta något sådant så jag kanske aldrig nyttjat någon?
Användarens profilbild
Nille
Guru
Inlägg: 1475
Blev medlem: 17 jun 2004 02:41

Re: Installera ny Kernel

Inlägg av Nille »

Initrd används för ladda in moduler under initieringen som inte är kompilerade in i kerneln men som krävs för att datorn ska kunna boota.
Ofta är det stöd för filsystem eller någon scsi.
initrd står för initialized RAM disk
Då allt är onödigt att kompilera in i en kernel samt att vissa moduler kan orsaka problem med viss hårdvara så utelämnas många moduler från att kompileras in i kerneln men finns ofta som en modul som kerneln kan läsa in vid behov.
Väldigt tidigt under uppstarten kan kerneln inte läsa in moduler om de krävs då eventuella hårdiskar inte är monterade och då används initrdrd av kerneln för att läsa in de moduler som krävs så kerneln har det stöd som krävs för att starta upp datorn.
Om man är nyfiken på en initrd fil så kan man kolla vad filen innehåller med "zless".
Det finns två alternativ för att lägga till stöd i kerneln det ena är att bygga in stödet direkt i kerneln vilket ökar storleken av kerneln men även minnesanvändningen då allt som är inbyggt är laddat.
Det andra alternativet är att bygga stödet som en modul som sedan kan användas när de behövs.
Om du tittar i din kernel konfigurationsfil eller /proc/config.gz (med zcat eller zless) så ser du att alternativen har =y som betyder kompilerat inne i kerneln och =m för att skapa en modul som kan läsas in vid behov.
The more linux you go the slacker you get.