Kernel und World

Kernel

Updaten der Sources

Git Installation

Damit die Sources aktualisert werden können, benötigen wir git: (Hier eine detailierte Anleitung der FreeBSD Foundation)

pkg install git

Quellen herunterladen

Eine frische Version der Quellen kann man so herunterladen (sofern /usr/src noch nicht vorhanden ist)

git clone -b stable/14 --depth 1 https://git.freebsd.org/src.git  /usr/src

Achte darauf, die korrekte Versionsnummer zu übergeben.

ist das /usr/src/ Verzeichnis bereits vorhanden, kannst du bereits mit den nächsten Schritt weiterfahren (Quellen aktualisieren). Solltest du dort einen Fehler erhalten, kannst du das bestehende Verzeichnis backupen und neu erstellen:

mv /usr/src /usr/src.bak
mkdir /usr/src/; cd /usr/src
git clone -b stable/14 --depth 1 https://git.freebsd.org/src.git /usr/src

Quellen aktualisieren

Nun können wir die Sources aktualisieren. Die Sources sollen aktuell sein:

cd /usr/src/
git pull --ff-only

Jetzt werden die ganzen Sources bei Bedarf geupdated.

Sehr wichtig ist nun, unbedingt /usr/src/UPDATING kurz zu lesen. Eventuell hat es wichtige Änderungen gegeben. Dieses Wissen kann Dir später bei eventueller Fehlersuche sehr hilfreich sein.

more /usr/src/UPDATING

Erstellen/Bearbeiten der Kernel Konfiguration

Man sollte das GENERIC File jeweils nicht direkt ändern. Bei einem Updaste wird das GENERIC File immer wieder überschrieben und aktualisiert. Ausserdem speichere ich den eigenen Kernel ausserhalb von Source und verlinke nur darauf.

Das Beste ist, wenn man das Basis GENERIC File einfach in einer eigenen Datei included und dann die eigenen Optionen hinzufügt (options oder device) bzw. disabled (nooptions oder nodevice).

Als Kernel Bezeichnung verwende ich den Server Namen (VIOLET)

cd /usr/src/sys/amd64/conf/
# eigenen Kernel extern speichern
mkdir /root/kernels
cp GENERIC /root/kernels/VIOLET
ln -s /root/kernels/VIOLET .

Ps: VIM haben wir ja noch nicht installiert. Jetzt würde eine Fehlermeldung deswegen kommen. Einfach Alias nochmals kurz überschreiben, bis wir VIM installiert haben.

unalias vi

Jetzt das File bearbeiten bzw. erstellen. Ich gebe nutze hier den Server Namen (VIOLET) als Kernel Bezeichnung

vi VIOLET

Anfangen mit dem Include des GENERIC Kernels, bei ident den gewählten Kernelnamen (Filename) Angeben, danach was man aus dem GENERIC deaktivieren oder noch speziell aktivieren möchte:

#
# VIOLET-- kernel configuration file for FreeBSD/amd64
#

include GENERIC # <- das GENERIC File includen
ident VIOLET # <- am besten = Filename / Hostname

options IPFIREWALL #<- Aktiviere IPFW2 im Kernel
options IPFIREWALL_VERBOSE #<- Sonst gibts kein Logging
options IPFIREWALL_VERBOSE_LIMIT=512
options IPFIREWALL_DEFAULT_TO_ACCEPT #<- Wenn man keine Rule hat, sperrt man sich aus. EMPFOHLEN!

nooptions MSDOSFS # MSDOS Filesystem
[.....]

» Hier meine Konfig für den Cloud Server

Am Besten auch gleich eine zweite Shell öffnen damit Du mit

dmesg

arbeiten kannst. Du kannst Dann z.B. mit

dmesg | grep -is smp

schauen, ob diese (Device) Option benötigt wird oder nicht. Taucht sie auf, drin lassen – wenn nicht, kann man sie in der Regel deaktivieren. Vorsichtshalber jedoch immer erst im FreeBSD Handbuchnachschauen und, falls nicht ganz sicher, lieber drin lassen.

Basissystem kompilieren

MACH DAS PER VNC! UND NICHT SSH! Sollte die SSH Verbindung abbrechen, hast du umsonst gewartet.

Alle Tools neu kompilieren

-> Beim Basissystem muss man KERNCONF nicht übergeben, das hat hier keine Relevanz.

mit dem -j Flag können wir den Prozess beschleunigen indem wir die Anzahl Prozessoren übergeben. (Anzahl Kerne kannst du mit dmesg |grep -is smp auslesen)

make -j${NUMBER_OF_PROCESSORS} buildworld -DNO_CLEAN
# das wäre dann in meinem Fall, da ich 3 CPU's nutze:
# make -j3 buildworld -DNO_CLEAN

NO_CLEAN könnte man auch in /etc/src.conf generell speichern, falls man dies wünscht.

  • NO_CLEAN=true in /etc/src.conf (würde ich nicht empfehlen)
    NO_CLEAN verhindert, dass make das Verzeichnis vor dem Start des Builds bereinigt. Das heisst, wenn buildworld mit einem Fehler abgebrochen hat, kann man buildworld erneut mit -DNO_CLEAN starten und den build Prozess in FreeBSD dort fortsetzen, wo er aufgehört hat, anstatt von vorne zu beginnen. Dies bedeutet, dass Objektdateien, die bereits kompiliert wurden, nicht erneut kompiliert werden. Ich würde NO_CLEAN nur WENN UNBEDINGT NÖTIG in /etc/src.conf speichern. Besser, nur bei Bedarf direkt per -DNO_CLEAN aufrufen – wenn man sicher ist, dass alle Fehler behoben wurden.

speichern.

Ich hab 3 CPU’s, also verwende ich wie folgt (ich logge den output zur sicherheit noch mit):

cd /usr/src
make -j3 buildworld > /var/log/buildkernel.log 2>&1

Nun heisst es wieder warten…. Das kann locker 1-4 Stunden dauern, je nachdem…. Huiii.. diesmal hat’s bei mir über 6 Stunden gedauert!! 😮

-------------------------------------------------------------- 
>>> World build completed on Tue Feb 27 16:08:09 CET 2024
>>> World built in 24340 seconds, ncpu: 3, make -j3
--------------------------------------------------------------

Danach Server booten:

sync;sync;reboot

Kernel Kompilieren

Damit man nicht die ganze Zeit die KERNCONF tippen muss, kann man die auch einfach im /etc/make.conf eintragen:

  • KERNCONF=VIOLET in /etc/make.conf

 

cd /usr/src/
make -j3 buildkernel KERNCONF=VIOLET > /var/log/buildkernel.log 2>&1

und nun gaaaaaaaaaaaanz lang warten bis fertig. Kann je nach System locker zwischen 30 Minuten und mehreren Stunden dauern… Kompilierung war erfolgreich:

--------------------------------------------------------------
>>> Kernel build for VIOLET completed on Tue Feb 27 17:04:24 CET 2024
--------------------------------------------------------------
>>> Kernel(s) VIOLET built in 1426 seconds, ncpu: 3, make -j3
--------------------------------------------------------------

Kernel installieren

Wenn ist der Build erfolgreich durchgelaufen, kann man den Kernel nun installieren (geht ganz schnell):

cd /usr/src/ 
make -j3 installkernel KERNCONF=VIOLET
--------------------------------------------------------------
>>> Installing kernel VIOLET completed on Tue Feb 27 17:07:34 CET 2024
--------------------------------------------------------------

Und jetzt in den neuen Kernel booten

reboot

Wenn alles gut ging, wird jetzt der neue Kernel geladen:

teslina@violet-new(~)> uname -a
FreeBSD violet-new 14.0-STABLE FreeBSD 14.0-STABLE #0 stable/14-7a3d7b29f: Tue Feb 27 17:04:08 CET 2024 root@violet-new:/usr/obj/usr/src/amd64.amd64/sys/VIOLET amd64

World installieren

Auch hier geht es wieder um die World – hat nix mit dem Kernel zu tun, also KERNCONF muss nicht übergeben werden.

cd /usr/src/ 
make -j3 installworld

Wenn erfolgreich, die Konfigurationsdateien mit etcupdate (früher mergemaster) aktualisieren:

etcupdate

Jetzt neu starten:

reboot

Bei mir ist installworld jedoch leider nicht sauber durchgelaufen und hat sofort mit einem Error beendet.

  • Suche online nach Fehlermeldung.
  • Lade die aktuellen Sources
    cd /usr/src/
    git pull --ff-only
  • Lass das gesamte nochmals durchlaufen

    cd /usr/src/
    make cleanworld
    make -j3 buildworld > /var/log/buildkernel.log 2>&1
    reboot

    cd /usr/src/
    make -j3 buildkernel KERNCONF=VIOLET > /var/log/buildkernel.log 2>&1
    make -j3 installkernel KERNCONF=VIOLET
    reboot

    cd /usr/src/
    make -j3 installworld
    etcupdate
    reboot

 


 

 

Fehlermeldungen

Meldungen, die beim Kompilieren auftauchen können

error: miibus_if.h: No such file or directory

Wahrscheinlich sind beim Update neue Ethernet NICs dazu gekommen (siehe GENERIC File). Vergleiche GENERIC mit dem alten FREEBSD9 File. Und füge entsprechend noch weitere nodevice Einträge bei FREEBSD9 hinzu.

GENERIC

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device          miibus          # MII bus support
device          ae              # Attansic/Atheros L2 FastEthernet
device          age             # Attansic/Atheros L1 Gigabit Ethernet
[.. etc ..]

FREEBSD9

nodevice          miibus          # MII bus support
nodevice          ae              # Attansic/Atheros L2 FastEthernet
nodevice          age             # Attansic/Atheros L1 Gigabit Ethernet
[.. etc ..]
/usr/src/sys/amd64/acpica/acpi_switch.S:146: Error: no such instruction: `xsetbv‘

Wenn dieser Fehler auftaucht:

/usr/src/sys/amd64/acpica/acpi_switch.S: Assembler messages:
/usr/src/sys/amd64/acpica/acpi_switch.S:146: Error: no such instruction: `xsetbv'
/usr/src/sys/amd64/acpica/acpi_switch.S:147: Error: no such instruction: `xrstor (%rbx)'
*** Error code 1

Stop in /usr/obj/usr/src/sys/FREEBSD9.
*** Error code 1

Stop in /usr/src.
*** Error code 1

Stop in /usr/src.

liegt es wahrscheinlich daran, dass wir den Kernel kompilieren wollen, bevor buildworld ausgeführt wurde. Also zuerst Buildworld, danach neuen Kernel kompilieren.

Installation des neuen Kernels

Sobald der Kernel sauber kompiliert wurde (man erkennt es daran, dass die Kompilation nicht mit einem Fehler abgebrochen wurde), kann man den Kernel installieren:

make installkernel KERNCONF=FREEBSD9

Dieser Vorgang geht in der Regel recht schnell. Install fertig:

===> zlib (install) install -o root -g wheel -m 555 zlib.ko /boot/kernel install -o root -g wheel -m 555 zlib.ko.symbols /boot/kernel kldxref /boot/kernel root@FreeBSD9(/usr/src)>

Um den neuen Kernel aktiv werden zu lassen, heisst es: Rebooten!

sync;sync;reboot

Nun startet der Server mit dem neuen Kernel. Vorher:

$> uname -a FreeBSD FreeBSD9 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:46:30 UTC 2012 root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64

Nachher:

$> uname -a FreeBSD FreeBSD9 9.0-STABLE FreeBSD 9.0-STABLE #0: Wed Jan 25 16:38:36 CET 2012 myusername@FreeBSD9:/usr/obj/usr/src/sys/FREEBSD9 amd64

Fehler

Sollte der Server nicht booten finden sich im FreeBSD-Handbuchnützliche Hilfen dazu.

World

Neben dem Kernel sollte man auch darauf achten, dass die Userworld immer up to date ist. Das heisst, dass wir das komplette Basissystem schön aktuell halten. Nur so kriegt man die Sicherheitslöcher aus den ganzen Basis-Tools (wie z.B. su, etc.). Auch hier bietet das FreeBSD-Handbuchwieder eine gute Grundlage, wie man vorgehen muss.

Basissystem kompilieren

Alle Tools neu kompilieren

cd /usr/src
make buildworld

Nun heisst es wieder warten…. Auf meiner ersten Maschine dauerte es ca. 4 Stunden, auf dem Nachfolger ca. 3 Stunden, auf dem letzten (Dell) 1h 30 Minuten… Bei FreeBSD 9.0 und 4 Cores à 2.2Ghz dauerte es nun aber wieder sehr lange… 4h 30 Minuten um genau zu sein Yell Danach Server booten:

sync;sync;reboot

Basissystem installieren

Nachdem der Server wieder oben ist, und der neue Kernel aktiv seinen Job tut, führen wir folgende Anweisungen aus:

cd /usr/src
mergemaster -p

Als erstes wird das neue /etc/groupFile mit der bereits installierten Version per diff verglichen. In diesem Fall mach ich die Änderungen später von Hand (default).

How should I deal with this? [Leave it for later]

Als nächstes ist /etc/master.passwddran. Auch hier lassen wir es für später. So, nun machen wir die Änderungen kurz per Hand, falls nötig. Danach löschen wir den temproot Inhalt.

*** Comparison complete

*** Files that remain for you to merge by hand:
/var/tmp/temproot/etc/group
/var/tmp/temproot/etc/master.passwd

Do you wish to delete what is left of /var/tmp/temproot? [no]

In einem zweiten Shell mal kurz das Aufrufen:

 diff /etc/group /var/tmp/temproot/etc/group
 diff /etc/master.passwd /var/tmp/temproot/etc/master.passwd

Bei mir gibts keine Änderungen zu machen. Also löschen wir temproot…

Do you wish to delete what is left of /var/tmp/temproot? [no] yes

Nun wird das make.confverglichen. Auch hier schauenob man etwas anpassen muss. Wenn alles ok ist, gehts weiter. Basissystem installieren:

cd /usr/src
make installworld

Das geht wiederum eigentlich recht fix. In ein paar Minuten ist es durch. Aktualisieren der ganzen Dateien im /etc

mergemaster -iU

Ich verwende den Interaktiven Modus mit Auto Upgrade. Das verkürzt den Prozess massiv, im Gegensatz dazu, wenn man mergemasterohne diese Optionen ausführt.

-i          Automatically install any files that do not exist in the des- tination directory. -U       Attempt to auto upgrade files that have not been user modi- fied.  This option can be dangerous when there are critical changes in the new versions that affect your running system.

Hier kommen nun wieder ein paar Vergleiche der Dateien. Meistens ändert sich nur der Header. Einfach die gewünschte Option auswählen. Leave it for later ist meistens die richtige Option. Im File /etc/defaults/periodic.confgibt es Änderungen, die ich übernehmen möchte.

  *** Displaying differences between ./etc/defaults/periodic.conf and installed version: — /etc/defaults/periodic.conf 2012-01-03 08:57:39.000000000 +0100 +++ ./etc/defaults/periodic.conf        2012-01-26 11:50:57.000000000 +0100 @@ -13,7 +13,7 @@ # For a more detailed explanation of all the periodic.conf variables, please # refer to the periodic.conf(5) manual page. # -# $FreeBSD: release/9.0.0/etc/defaults/periodic.conf 220020 2011-03-26 03:01:48Z dougb $ +# $FreeBSD: src/etc/defaults/periodic.conf,v 1.54.2.2 2012/01/03 10:22:09 delphij Exp $ # # What files override these defaults ? @@ -147,6 +147,12 @@ daily_queuerun_enable=“YES“                            # Run mail queue daily_submit_queuerun=“YES“                            # Also submit queue +# 800.scrub-zfs +daily_scrub_zfs_enable=“NO“ +daily_scrub_zfs_pools=““                       # empty string selects all pools +daily_scrub_zfs_default_threshold=“35″         # days between scrubs +#daily_scrub_zfs_${poolname}_threshold=“35″    # pool specific threshold + # 999.local daily_local=“/etc/daily.local“                         # Local scripts Use ‚d‘ to delete the temporary ./etc/defaults/periodic.conf Use ‚i‘ to install the temporary ./etc/defaults/periodic.conf Use ‚m‘ to merge the temporary and installed versions Use ‚v‘ to view the diff results again Default is to leave the temporary file to deal with by hand How should I deal with this? [Leave it for later] i *** ./etc/defaults/periodic.conf installed successfully

So, am Ende wird man nun nochmals gefragt das temproot zu löschen. Wenn wir nichts mehr von Hand ändern möchten, kann man jetzt mit yesweitergehen – ansonsten einfach in einer zweiten Shell kurz die Änderungen durchführen und dann mit yes weiter machen.

Do you wish to delete what is left of /var/tmp/temproot? [no] yes
*** Reinstalling Europe/Zurich as /etc/localtime root@FreeBSD9(/usr/src)>

Am schluss booten wir wieder…

sync;sync;reboot

.. und wenn alles gut ging, läuft unser System jetzt mit dem neuen Kernel und dem neuen Basissystem 🙂

Weiter mit den Basis Programmen…

Das Grundsystem steht. Nun kommen noch die Programme und Konfigurationen dazu, die auf keinem meiner Server fehlen dürfen.

Upgrade Kernel & World

Damit das System aktuell bleibt, sollten Kernel und World regelmässig aktualisiert werden. Dabei ist es wichtig, die korrekte Reihenfolge einzuhalten:

Daher die einzelnen Prozesse sehr lange dauern können, macht es Sinn, die Befehle direkt über die Konsole bzw. VNC auszuführen.

1) Sources Updaten:

cd /usr/src/; make update

2) Änderungen checken:

more /usr/src/UPDATING

3) Basis System kompilieren

make buildworld

4) Kernel kompilieren

make buildkernel KERNCONF=FREEBSD9

5) Kernel installieren

make installkernel KERNCONF=FREEBSD9

6) Reboot (am Besten in den Singel User Mode booten (Boot Loader Menü: 6), um eventuelle Probleme mit laufender Software zu vermeiden – geht aber auch ohne 😉

sync;sync;reboot

7) Mergemaster

cd /usr/src; mergemaster -p

8) World installieren

make installworld

9) Die letzten Config Files updaten

mergemaster -iU

10) Reboot

sync;sync;reboot

Nun sollte das System wieder laufen.

Weitere Infos unter: http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html

  • *

    Du kannst diese HTML tags verwenden: <a> <abbr> <acronym> <b> <blockquote> <cite> <code> <del> <em> <i> <q> <s> <strike> <strong>

  • Kommentar-Feed für diesen Beitrag
nach oben