HP N54L Custom-Kernel für kürzere Boot-Zeiten

Wenn da jemand Interesse dran hat, lade ich sie heute Abend mal hoch.
Ich hätte Interesse :-) Vielen Dank.


Da sich mir trotz mehrfachen Lesens der Beiträge die optimale Vorgehensweise nicht erschließt, möchte ich noch mal zusammen fassen, was ich tun kann, um den Boot-Vorgang zu verkürzen:

  • Kernel Minimalkonfiguration bringt was, aber nur wenig ==> Mache ich, ist kein Problem
  • Korrektes Alignment der Partitionen bringt mehr ==> Habe ich noch nicht richtig verstanden, ließ sich auch nicht so umsetzen, wie ich gedacht hab.

Meine Idee wäre jetzt also folgende (teste alles mal):

Fall 1: Alignment mit 4k und ashift=12
Ich passe mit sysctl vfs.zfs.min_auto_ashift=12 nur den min Wert für Ashift an, damit dieser für den pool greift
Ich lasse das Installer-Script so wie es ist (dort ist mit gpart 4k eingestellt)

Resultat: Ashift und Alignment passen zusammen, sind aber laut den Artikeln im Internet nicht optimal für die Performance eingestellt

Fall 2: Alignment mit 1m und ashift=20
Ich passe mit sysctl vfs.zfs.max_auto_ashift=20 und sysctl vfs.zfs.min_auto_ashift=20 beide Werte an (hoffentlich klappt das dann so)
Ich passe das Installer-Script so an, dass bei gpart -a 1m (statt vorher -a 4k) steht

Resultat: Platzverschwendung, aber laut Artikeln im Internet eine bessere Performance

Fall 3: Alignment mit 1m und ashift=12 (falls Fall 2 nicht klappt)
Ich passe mit sysctl vfs.zfs.min_auto_ashift=12 an
Ich passe das Installer-Script so an, dass bei gpart -a 1m (statt vorher -a 4k) steht

Resultat: Unbekannt, macht das so überhaupt Sinn?

Inwelchem der Fälle kann ich mit der besten Performance rechnen und in welchem mit der schlechtesten?

Ich meld mich wieder, wenn ichs getestet hab :-)
 
Ich würde nach dem aktuellen Stand der Erkenntnisse die 3 wählen. Ich wusste nicht dass ashift die Blockgröße ist, aber gpart -a 1m ist auf jeden Fall eine gute Idee.
 
Jup, Alternative 3 is the way to go ;)
Nur deine boot-partition darf nicht 1m sein... die wird dann zu groß und dein system bootet nicht mehr ;)
 
Ok, hier meine Ergebnisse:

Alter USB-Stick (lesen: 10MB/s), Default-Kernel, Alignment=4k, ashift=9
Code:
echo "start:"; date; ping -o nas &> /dev/null; echo "end: "; date
start:
Di  5 Apr 2016 18:59:48 CEST
end:
Di  5 Apr 2016 19:01:59 CEST
==> 131 Sekunden (2:11 Minuten)

Neuer USB-Stick (lesen: 245MB/s, limitiert durch USB 2.0), Mini-Kernel, Alignment=1m, ashift=12
Code:
echo "start:"; date; ping -o nas &> /dev/null; echo "end: "; date
start:
Di  5 Apr 2016 20:19:37 CEST
end:
Di  5 Apr 2016 20:21:12 CEST
==> 95 Sekunden (1:35 Minuten)

Ist jetzt nicht der Knaller, hätte mir mehr erhofft... Dazu kommt noch, dass jetzt Wake on LAN nicht mehr geht :-( Kann ja jeder für sich entscheiden, ob es sich lohnt. Mit USB 3.0 bzw. SSD wäre sicher mehr möglich...
 
Das hier ist so ziemlich die kleinste mögliche Kernelconfig für FreeBSD:

Code:
# Minimale Kernelkonfiguration fuer FreeBSD.
# Der gebaute Kernel enthaelt das absolute
# Minimum an Funktionalitaet, alles weitere
# muss per Modul geladen werden.

# ------------------------------------------ #

# 1. Allgemeine Dinge
# -------------------

# Der Kernelname. Taucht u.a. in der dmesg
# und in der Ausgabe von uname(1) auf.
ident       PINE

# Architektur.
machine     amd64

# CPU-Typ.
cpu         HAMMER

# Wir wollen einen SMP-Kernel bauen.
options     SMP

# Diese Konfiguration (ohne Kommentare)
# ins Kernel-Image einbinden.
options     INCLUDE_CONFIG_FILE

# ------------------------------------------ #

# 2. Fest in den Kernel gebaute Features
# --------------------------------------

# ULE als Scheduler.
options     SCHED_ULE

# Das System soll sich preemtiv verhalten.
options     PREEMPTION

# IPv4 Netzwerkstack.
options     INET

# IPv6 Netzwerkstack.
options     INET6

# SCTP Layer 4 Protokoll.
options     SCTP

# IPSEC Unterst?tzung.
options     IPSEC

# Unterst?tzung f?r IPSEC NAT Traversal.
options        IPSEC_NAT_T

# Stealth-Forwarding von IP-Paketen.
options        IPSTEALTH

# bpf(4) mit JIT-Compiler bauen. Kann
# alle darauf ausbauenden Anwendungen
# sehr beschleunigen.
options        BPF_JITTER

# TCP Offload Engine
options     TCP_OFFLOAD

# Das AUDIT-Framework, damit OpenBSM
# Audit-Events aus dem Kernel ziehen
# kann.
options     AUDIT

# Das MAC-Framework fuer Mandandory
# Access Controls.
options     MAC

# Resource Accounting. Notwendig fuer
# Resource Limits.
options     RACCT

# Unterstuetzung fuer Resource Limits.
options     RCTL

# kbd(4) soll fuer jedes Keyboard ein
# Device in /dev erstellen. Notwendig
# fuer X11.
options     KBD_INSTALL_CDEV

# Neuer PCI-Bus Code.
options     NEW_PCIB

# Erlaubt hwpmc(4) auch Kernelaufrufe
# zu tracen. De facto fuer sinnvolle
# Ergebnisse notwendig.
options     HWPMC_HOOKS 

# Alle Kernel-Ausgaben puffern, damit
# sie sich nicht untereinander mischen.
options     PRINTF_BUFR_SIZE=256

# Capsicum Capabilities Framework.
options     CAPABILITY_MODE
options     CAPABILITIES

# Process Descriptors (File Descriptoren
# fuer Prozesse, u.a. von Capsicum genutzt).
options     PROCDESC

# ------------------------------------------ #

# 3. Debug-Optionen
# -----------------

# Den Kernel mit Debug-Symbolen bauen. Die
# Symbole werden in einzelnen Dateien 
# gespeichert und koennen bei Bedarf einfach
# geloescht werden.
makeoptions DEBUG=-g

# CTF Data fuer DTrace
makeoptions WITH_CTF=1

# Kernel-Debugger Framework. Notwendig, um
# sinnvolle panic()-Ausgaben zu bekommen.
options     KDB

# Bei panic() einen Stack-Trace ausgeben.
options     KDB_TRACE 

# STACK erlaubt es, auf den Kernelstack 
# zuzugreifen. Notwendig fuer einige
# Debuging-Tools.
options     STACK

# Unterstuetzung fuer die ktrace(2) Syscalls.
options     KTRACE

# Kernel-DTrace Unterstuetzung.
options     KDTRACE_FRAME
options     KDTRACE_HOOKS

# Wenn Kernelmodule CTF enthalten, wird dies
# geladen. Andernfalls waere DTrace sinnlos.
options     DDB_CTF

# USB-Debugging ist notwendig, um Quirks 
# setzen zu koennen. In der Praxis kaum zu
# vermeiden.
options        USB_DEBUG

# ------------------------------------------ #

# 4. Spezielle Optionen fuer UFS
# ------------------------------

# Softupdates aktivieren.
options     SOFTUPDATES

# Unterstuetzung fuer ACL.
options     UFS_ACL

# Dirhash-Code, beschleunigt die Sache sehr.
options     UFS_DIRHASH

# gjournal(8) Unterstuetzung.
options     UFS_GJOURNAL

# Extended Attributs Unterstuetzung.
# U.a. fuer ACL genutzt.
options     UFS_EXTATTR
options     UFS_EXTATTR_AUTOSTART

# Disk Quotas
options     QUOTA

# ------------------------------------------ #

# 5. Rueckkompatiblitaet
# ----------------------

# Syscalls und In-Kernel Structs aelterer
# FreeBSD-Versionen. Nicht jede Version
# aenderte das Interface!
options     COMPAT_FREEBSD4
options     COMPAT_FREEBSD5
options     COMPAT_FREEBSD6
options     COMPAT_FREEBSD7

# Unterstuetzung fuer 4.3BSD Interfaces.
# Auch fuer FreeBSD 1 bis 3 Binaries
# notwendig.
options        COMPAT_43

# Unterstuetzung fuer das alte 4.3BSD
# TTY-Interface. Wird (leider) noch immer
# haeufig genutzt.
options     COMPAT_43TTY

# Unterstuetzung fuer 32-Bit Binaries auf
# 64 Bit Hosts.
options     COMPAT_FREEBSD32

# SysV Interfaces
options     SYSVSHM 
options     SYSVMSG
options     SYSVSEM

# POSIX Realtime Scheduling Interfaces.
options     _KPOSIX_PRIORITY_SCHEDULING

# ------------------------------------------ #

# 6. Devices
# ----------

# syscons(4) Systemkonsolenrenderer
device      sc
options     SC_PIXEL_MODE
options     SC_DISABLE_REBOOT

# vga(4), damit syscons(4) auf VGA-Karten
# rendern kann. Zwingend notwendig, sonst
# gibt es kein Bild.
device      vga

# Unterstuetzung von Splash-Screens.
device      splash

# newcons Systemkonsolenrenderer 
device        vt
device        vt_vga
device        vt_efifb

# Minimale Netzwerk-Unterstuetzung.
#  - ether(4): Ethernet Netzwerke
#  - loop(4):  Loopback-Devices
#  - bpf(4):   Berkeley Packet Filter
device      ether
device      loop
device      bpf

# Pseudo-TTYs
device      pty

# Klassisches AT und PS/2 Keyboard.
#  - atkbdc(4): Keyboard- und Mouse-Controller
#  - atkbd(4):  Keyboard-Treiber
#  - psm(4):    Mouse-Treiber
device      atkbdc
device      atkbd
device      psm

# System-Interfaces.
#  - isa(4):  ISA und LPC Unterstuetzung
#  - eisa(4): Extended ISA und LPC
#  - pci(4):  PCI und seine Abarten
#  - acpi(4): ACPI Unterstuetzung
device      isa
device      eisa
device      pci
device      acpi

# crypto(4) Framework, Abhaengigkeit zu IPSEC. 
#  - crypto(4): Das Framework
#  - enc(4):    IPSEC Pseudo Device
device      crypto
device        enc

# altq(4) Unterstuetzung.
options     ALTQ
options     ALTQ_CBQ
options     ALTQ_RED
options     ALTQ_RIO
options     ALTQ_HFSC
options     ALTQ_CDNR
options     ALTQ_PRIQ

# ------------------------------------------ #

Wenn man denn um das letzte Byte kämpft, kann man noch einige Dinge weglassen. Beispielsweise ALTQ oder auch psm(4). Aber das bringt kaum mehr Größenvorteile und geht schon sehr an die Funktionalität. Damit die Kernelconfig funktioniert, muss sys/amd64/conf/DEFAULTS leer sein. Und natürlich wird ein minimaler Kernel kein lauffähiges System booten, es sind ja u.a. keine Treiber für die Festplatten vorhanden. Man braucht daher eine entsprechende /boot/loader.conf, für meinen Desktop zum Beispiel:

Code:
# Loader
# ------

# Delay
autoboot_delay="3"

# System
# ------

# Kein Strom fuer Geraete ohne Treiber
hw.pci.do_power_nodriver="3"

# Kein p4tcc
hint.p4tcc.0.disabled=1

# Kein legacy Pamps
kern.cam.ada.legacy_aliases="0"

# Sound Equalizer
hint.pcm.0.eq="1"
hint.pcm.4.eq="1"

# Soundkarte
# !!! DIES IST FUER AC3 UND NICHT FUER WAVE !!!
#hint.hdac.1.cad0.nid21.config="as=1 seq=4 device=Line-Out color=Grey"
#hint.hdac.1.cad0.nid23.config="as=1 seq=2 device=Line-Out color=Black" 
#hint.hdac.1.cad0.nid27.config="as=1 seq=15 device=Headphones color=Green"

# ZFS
vfs.zfs.arc_max="4G"

# glabel ruhigstellen
kern.geom.label.disk_ident.enable="0"
kern.geom.label.gptid.enable="0"

# Treiber
# -------

# Partitionstypen
geom_part_bsd_load="YES"
geom_part_mbr_load="YES"
geom_part_gpt_load="YES"

# glabel
geom_label_load="YES"

# Random
random_load="YES"

# ATA
ahci_load="YES"

# X11 Kram
mem_load="YES"
io_load="YES"

# SCSI
cam_load="YES"

# Netzwerk
miibus_load="YES"
if_em_load="YES"

# SMBus
smbus_load="YES"
ichsmb_load="YES"

# CPUFreq
cpufreq_load="YES"

# Sound
sound_load="YES"
snd_hda_load="YES"
snd_envy24ht_load="YES"

# CPU-Device
cpuctl_load="YES"

# USB
usb_load="YES"
xhci_load="YES"
ums_load="YES"
umass_load="YES"
ukbd_load="YES"

# Linux
linux_load="YES"

# Keyboard
kbdmux_load="YES"

# Bruecke
if_bridge_load="YES"
bridge_stp_load="YES"

# Tap
if_tap_load="YES"

# Temperatursensoren
coretemp_load="YES"

# Tun
if_tun_load="YES"

# ProcFS
pseudofs_load="YES"
procfs_load="YES"
linprocfs_load="YES"

# UFS
ufs_load="YES"

# FAT
msdosfs_load="YES"

# AES-NI 
aesni_load="YES"
cryptodev_load="YES"

# CUSE
cuse4bsd_load="YES"

# FUSE
fuse_load="YES"

# Nvidia
nvidia_load="YES"

# ZFS
zfs_load="YES"

# Bhyve
vmm_load="YES"

# NMDM
nmdm_load="YES"

# COM-Port
uart_load="YES"

Man kann auch die loader.conf noch verschlanken und alles was nicht zwingend notwenig ist erst nach dem Boot in der rc.conf laden. Das bringt noch ein paar Sekunden bzw. Sekundenbruchteile. Mir war es aber ehrlich gesagt zu viel Aufwand, da der UEFI-Loader schon sehr schnell ist. In dieser Konfiguration braucht das System vom Ende des UEFI bis zum Login-Prompt ca. 13 Sekunden, davon gehen etwa 1 Sekunde auf das Konto des Loader, 3 Sekunden auf das Loader-Menü, 6 Sekunden auf den Kernel und dank einer M.2 SSD nur 3 Sekunden auf die rc-Scripte. Wesentlich schneller bekommt man es unter FreeBSD nicht mehr hin, da der Kernel und die rc-Scripte nicht parallelisiert starten können.
 
Den boot kann man noch deutlich beschleunigen in dem man alle Module, die nicht zum mount -a gebraucht werden, aus der rc.conf lädt. Nicht wichtige Partitionen kann man zum Beispiel in der /etc/fstab mit late markieren.

Hier ist meine Liste:
Code:
kld_list="i919kms autofs fuse linux linprocfs cuse4bsd coretemp uep"

In meiner /boot/loader.conf wird nur das geladen:
Code:
# Encrypted root file system
vfs.root.mountfrom="ufs:ufs/6root"
geom_eli_load="YES"                     # FS crypto
aesni_load="YES"                        # Hardware AES

# Allow nullfs mounting /boot
nullfs_load="YES"
tmpfs_load="YES"

Natürlich muss mit Yamagi's Minimalconfig noch mehr da rein.
 
Zurück
Oben