Orange Pi 3: Warum der Warmstart hängt – und wie ein Device-Tree-Umbau den PMIC zurückholt
by carsten on Oct.29, 2026, under Armbian, Debian, Hardware, Linux, SBC
TL;DR: Auf meinem Orange Pi 3 (Allwinner H6, Armbian) bootete das System nach einem reboot nicht mehr – nur Strom ziehen half. Ursache: Die Firmware (ATF/Crust) spricht den Power-Management-Chip AXP805 über den RSB-Bus an und schaltet ihn dabei in den RSB-Modus. Der überlebt einen Warmreset. Armbians Device Tree lässt Linux den PMIC aber über I2C ansprechen – nach dem Warmstart antwortet er dort nicht mehr, ohne PMIC gibt es keine Spannungsregler, ohne Regler keine SD-Karte, und der Kernel wartet ewig auf sein Root-Dateisystem. Lösung: ein DTB, in dem der PMIC unter rsb@7083000 hängt, plus ein apt-Hook, der diesen DTB nach Kernel-Updates neu erzeugt.
Ausgangslage
Der Orange Pi 3 läuft bei mir als kleiner Infrastruktur-Server im Keller (Pi-hole, DNS, VPN & Co.). Eines Tages kam er nach einem Ansible-Update-Lauf nicht mehr hoch. Das interne eMMC meldete sich als verschlissen (life_time 0x0B, „Card stuck being busy“), also: Backup auf eine SD-Karte, davon booten – läuft.
Bis auf ein Detail: Ein reboot endete jedes Mal im Nichts. Kein Ping, kein SSH. Nur ein Power-Cycle brachte das Board zurück. Naheliegender Verdacht: das kaputte eMMC stört den Boot.
Werkzeug: serielle Konsole aus der Ferne
Ohne Konsole rät man nur. Also kam ein USB-TTL-Adapter an den Debug-UART des OPi und an einen Raspberry Pi daneben (115200 8N1; Klassiker: TX/RX zuerst vertauscht). Auf dem Raspberry Pi läuft eine screen-Sitzung mit Logfile, dazu zwei kleine Skripte:
- Autoboot-Stopper: wartet im Log auf „U-Boot“ und sendet dann alle 100 ms ein Leerzeichen, bis der Prompt
=>erscheint. - Boot-Helfer: setzt am Prompt Variablen (
extraargs,fdtfile) perscreen -X stuffund prüft jeweils das Echo, dannboot.
Kleine Falle am Rande: screen schreibt sein Log erst bei Zeilenende. Der Prompt => taucht deshalb erst auf, nachdem man ein CR hinterhergeschickt hat.
Schritt 1: Ist es das eMMC?
Erster Versuch: das eMMC (mmc2) per Device-Tree-Overlay komplett abschalten.
/dts-v1/;
/plugin/;
/ {
compatible = "xunlong,orangepi-3", "allwinner,sun50i-h6";
fragment@0 {
target = <&mmc2>;
__overlay__ { status = "disabled"; };
};
};
Das funktioniert (u-boot meldet „Applying user provided DT overlay“, die eMMC-Fehler sind weg) – aber der Warmstart hängt weiterhin. Das eMMC war also nur ein zufällig gleichzeitiger Defekt.
Schritt 2: Warm gegen kalt vergleichen
Mit der seriellen Konsole lassen sich Warm- und Kaltstart Zeile für Zeile vergleichen. Ergebnis: SPL, ATF (BL31), Crust und u-boot laufen identisch durch, bis Starting kernel .... Danach: Stille.
Das liegt aber erst einmal nur daran, dass Armbian mit loglevel=1 startet und /dev/console auf tty1 (HDMI) liegt. Also am u-boot-Prompt, ohne Dateien zu ändern:
=> setenv extraargs "earlycon=uart8250,mmio32,0x05000000 ignore_loglevel keep_bootcon"
=> boot
Falle:
earlycon=uart8250,mmio32,0x05000000,115200n8sieht richtiger aus, liefert aber Zeichensalat. Mit Baudrate rechnet der Kernel mit einem angenommenen UART-Takt von 1,8432 MHz statt der tatsächlichen 24 MHz. Ohne Baudrate übernimmt er einfach die Einstellung von u-boot.
Schritt 3: Der Kernel spricht
Der erste Lauf mit Debug-Ausgabe hing bei clk: Disabling unused clocks. Mit clk_ignore_unused kam der Kernel weiter, hing dann aber beim Warten auf das Root-Dateisystem. Ein Blick weiter oben im Log zeigte den eigentlichen Fehler:
axp20x-i2c 0-0036: AXP20x variant AXP806 found
axp20x-i2c 0-0036: Failed to set masks in 0x40: -6
axp20x-i2c 0-0036: failed to add irq chip: -6
...
platform 4020000.mmc: deferred probe pending: platform: wait for supplier /soc/i2c@7081400/pmic@36/regulators/cldo1
platform 5020000.ethernet: deferred probe pending: platform: wait for supplier /soc/i2c@7081400/pmic@36/regulators/aldo2
Beim Kaltstart steht an derselben Stelle AXP20X driver loaded.
Die Kette ist damit klar: Ohne PMIC-Treiber gibt es keine Spannungsregler. Ohne Regler bleiben SD-Controller, Pin-Controller und Ethernet im „deferred probe“, und rootwait wartet für immer. Der Hänger bei den Clocks war nur eine Folge davon.
Falle Nr. 2: „AXP806 found“ klingt, als hätte der Kernel den Chip erfolgreich gelesen. Tatsächlich stammt die Meldung aus dem Abgleich mit dem Device Tree, ohne jeden Buszugriff. Der erste echte Zugriff ist das Schreiben der IRQ-Masken, und der scheitert mit
-6(ENXIO). Beim I2C-Treiber heißt das: NAK, unter Adresse 0x36 antwortet niemand.
Schritt 4: Warum antwortet der PMIC nicht mehr?
Ein Warmreset setzt nur den SoC zurück, nicht den PMIC. Der AXP805 behält also den Zustand, den die Software vor dem Reset hinterlassen hat. Die Frage war: Wer fasst den PMIC zwischen reboot und dem nächsten Linux an?
Die Bootkette des H6 sieht so aus:
BROM → u-boot SPL → TF-A (BL31) → Crust (SCP-Firmware auf dem AR100-Kern) → u-boot → Linux
Ein reboot läuft so ab: Linux ruft PSCI SYSTEM_RESET auf, TF-A leitet das per SCPI an Crust weiter, und erst die Firmware führt den Reset aus.
Die Strings im Armbian-Bootloader-Binary (u-boot-sunxi-with-spl.bin) sind aufschlussreich:
PMIC: Probing AXP805 on RSB
RSB: set device to RSB
RSB: set run-time address
PSCI: SCPI %s failed: %d
Die Firmware kann den PMIC also über RSB ansprechen, Allwinners „Reduced Serial Bus“. Der AXP805 startet nach dem Einschalten im I2C-Modus. Ein „set device to RSB“ schaltet ihn um, und zurück geht es erst mit einem Stromtrennen.
Der Device Tree von Armbian hängt den PMIC dagegen an den I2C-Bus:
i2c@7081400 { /* r_i2c */
status = "okay";
pmic@36 {
compatible = "x-powers,axp805", "x-powers,axp806";
reg = <0x36>;
...
};
};
rsb@7083000 {
status = "disabled";
};
Genau dieses Szenario wurde 2021 schon auf der Kernel-Mailingliste diskutiert. Samuel Holland stellte den H6-PMIC im Mainline-Kernel auf RSB um, getestet unter anderem auf dem Orange Pi 3 (Patch-Serie, DT-Patch). In der Review wies Chen-Yu Tsai auf das Risiko hin: Firmware wie Crust, die RSB benutzt, schaltet den Chip nicht zurück auf I2C, und dann erreicht Linux ihn nicht mehr.
Ehrlicherweise: Den Moment der Umschaltung habe ich nicht direkt beobachtet. TF-A meldet beim Boot kein eigenes PMIC-Setup, weil Crust vorhanden ist. Am wahrscheinlichsten passiert sie daher im Reboot-Pfad von Crust. Belegt ist aber das Wichtige: Nach dem Warmreset gibt der PMIC auf I2C ein NAK, über RSB ist er erreichbar. Das zeigt der nächste Schritt.
Warum lief das früher? Der Wechsel auf den aktuellen Kernel und die aktuelle Firmware kam mit einem Update Anfang September. Der erste Warmstart danach war ausgerechnet der Update-Reboot, nach dem das System „tot“ war. Das gleichzeitig sterbende eMMC hat die Spur zusätzlich verwischt.
Schritt 5: Der Beweis ohne Risiko
Statt gleich etwas fest einzutragen, habe ich einen alternativen DTB gebaut und ihn nur für einen einzigen Boot am u-boot-Prompt ausgewählt. Armbians armbianEnv.txt setzt kein fdtfile, die Variable aus dem Prompt bleibt also erhalten:
=> setenv fdtfile allwinner/sun50i-h6-orangepi-3-rsb.dtb
=> boot
Ergebnis, nach einem Warmstart in genau dem Zustand, der vorher fünfmal gescheitert war:
sunxi-rsb 7083000.rsb: RSB running at 4000000 Hz
axp20x-rsb sunxi-rsb-745: AXP20x variant AXP806 found
axp20x-rsb sunxi-rsb-745: AXP20X driver loaded
mmcblk0: mmc0:59b4 SN32G 29.7 GiB
Das System kam vollständig hoch. Wäre es schiefgegangen, hätte ein Power-Cycle gereicht, und das Board hätte wieder mit dem Original-DTB gestartet.
Warum funktioniert das beim Kalt- und beim Warmstart? Der Linux-RSB-Treiber schickt beim Start selbst „set device to RSB“. Für ihn spielt es keine Rolle, ob der PMIC noch im I2C-Modus ist oder schon umgeschaltet wurde.
Der Umbau des Device Trees
Ein Overlay reicht hier nicht. Overlays können Knoten nicht verschieben, und alle Verbraucher (SD-Controller, CPU, GPU, Ethernet …) verweisen per Phandle auf die Regulator-Knoten unter pmic@36. Also wird der komplette DTB umgebaut:
- Mit
dtc -I dtb -O dtsdekompilieren. - Den Knoten
pmic@36ausi2c@7081400herausschneiden. - Ihn als
pmic@745(die RSB-Laufzeitadresse) mitreg = <0x745>inrsb@7083000einsetzen. rsb@7083000aufokaystellen,i2c@7081400aufdisabled. Der PMIC war das einzige Gerät anr_i2c, und beide Busse teilen sich die Pins PL0/PL1.- Die Pfade in
__symbols__umschreiben (/soc/i2c@7081400/pmic@36→/soc/rsb@7083000/pmic@745), damit Overlays weiter auflösen, etwa das eMMC-Overlay. - Mit
dtc -@neu kompilieren.
Die Phandle-Werte wandern mit dem Knoten mit, deshalb stimmen alle Verweise weiterhin. Ob der Kernel die nötigen Treiber mitbringt, zeigt ein kurzer Blick in die Config: CONFIG_SUNXI_RSB=y, CONFIG_MFD_AXP20X_RSB=y.
Dauerhaft machen und gegen Updates absichern
In /boot/armbianEnv.txt:
fdtfile=allwinner/sun50i-h6-orangepi-3-rsb.dtb
Falle Nr. 3: Armbian legt die DTBs pro Kernelversion ab (
/boot/dtb-6.18.44-current-sunxi64/),/boot/dtbist nur ein Symlink. Nach dem nächsten Kernel-Update zeigt der Link auf ein neues Verzeichnis ohne den RSB-DTB. u-boot hätte dann gar keinen DTB, und das Board startet überhaupt nicht mehr.
Deshalb gibt es einen Hook. /usr/local/sbin/opi3-rsb-dtb läuft per DPkg::Post-Invoke nach jedem apt-Lauf, also auch bei Ansible und unattended-upgrades:
- Es erzeugt den RSB-DTB in jedem
/boot/dtb-*/neu, sobald sich die Prüfsumme des Original-DTB ändert. - Es prüft das Ergebnis mit
fdtget: RSB an, PMIC-Adresse 0x745, Symbole umgehängt. - Bringt der Upstream-DTB den PMIC irgendwann selbst unter RSB, übernimmt es ihn unverändert.
- Bei jedem Fehler entfernt es
fdtfileausarmbianEnv.txt. Dann bootet das Board sicher mit dem Original-DTB, nur der Warmstart hängt wieder. Den Fehler meldet es ins Syslog und legt eine Markierungsdatei an.
// /etc/apt/apt.conf.d/99-opi3-rsb-dtb
DPkg::Post-Invoke { "if [ -x /usr/local/sbin/opi3-rsb-dtb ]; then /usr/local/sbin/opi3-rsb-dtb >/dev/null || true; fi"; };
Dazu kommt ein NRPE-Check check_opi3_bootfix. Er schlägt Alarm, wenn fdtfile nicht mehr auf den RSB-DTB zeigt, die Datei fehlt, sie nicht zum aktuellen Original passt oder der Hook fehlgeschlagen ist.
Testmatrix
| Test | Szenario | Ergebnis |
|---|---|---|
| 1–5 | Warmstart, Original-DTB (PMIC an I2C), mit und ohne Debug-Optionen | hängt: PMIC gibt NAK |
| A | Warmstart, RSB-DTB nur am u-boot-Prompt gewählt | ✅ |
| B | normaler reboot, RSB-DTB fest eingetragen | ✅ |
| C | Kaltstart (Strom getrennt) | ✅ |
| D | normaler reboot nach weiterem Aufräumen, Stunden später | ✅ |
Bonus: Was das eMMC wirklich umgebracht hat
Bei der Gelegenheit habe ich nachgemessen, wer eigentlich so viel schreibt. Die neue SD-Karte hatte nach zwei Tagen schon über 300 GB auf dem Zähler (/sys/fs/ext4/mmcblk0p1/lifetime_write_kbytes). Hauptverursacher war Pi-hole v6 mit database.forceDisk = true. Damit liegt die Kurzzeit-Datenbank, die normalerweise im RAM gehalten wird, auf der Karte, und SQLite schreibt bei vielen kleinen Einfügungen etwa das Hundertfache dessen, was die Datenbank tatsächlich wächst. Ergebnis: 30 bis über 100 GiB pro Tag. Für ein 8-GB-eMMC aus 2018 ist das nach ein paar Monaten das Lebensende. Die Datenbank zieht deshalb auf eine USB-SSD um. Außerdem gibt es einen zweiten NRPE-Check, der Schreibmenge und Schreibrate der SD-Karte überwacht, weil die Karte selbst keine Gesundheitsdaten liefert (CMD56 liefert nur Nullen).
Was ich mitnehme
- Ohne serielle Konsole keine Diagnose. Ein 3-Euro-USB-TTL-Adapter und ein Raspberry Pi daneben machen aus „startet nicht“ einen nachvollziehbaren Ablauf.
- Warm- und Kaltstart sind auf ARM-Boards zwei verschiedene Welten. Alles, was den SoC-Reset überlebt (PMIC, RTC-Domäne, SCP-Firmware), kann Zustand mitschleppen.
- Fehlercodes ernst nehmen:
-6heißt bei I2C NAK und nicht etwa Timeout. Das hat direkt auf den Busmodus gezeigt. - Meldungen nicht trauen, die nach Erfolg klingen: „AXP806 found“ war nie ein Hardware-Zugriff.
- Erst flüchtig testen, dann festschreiben.
setenvam u-boot-Prompt ist der risikoärmste Weg, einen DTB auszuprobieren. - Workarounds absichern: Ein Fix, den das nächste Kernel-Update stillschweigend aushebelt (oder der das Board gar nicht mehr starten lässt), ist schlimmer als keiner. Daher Hook, Rückfall und Monitoring.
SLED 11 SP3 – aktuelles Skype Quick Howto
by carsten on Aug.07, 2014, under RPM Packageing, SLE, VoIP
Nachdem Microsoft/Skype anfang August 2014 diverse Skype User – vorallem im Linux Bereich – ausgesperrt hat (Zwang zu neuer Skype Version), hatte ich mich erstmal von Skype verabschiedet. Bei mir lief bis zuletzt Version 2.2.0.35 und ich war damit absolut zufrieden.
Alle neueren Versionen waren nicht mehr mit der SUSE Linux Enterprise 11 Serie zu vereinen, da ein neueres QT verlangt wird. Nachdem meine Skypekontakte kaum dazu zu überreden sind sich für Alternativen zu begeistern habe ich mir dann doch etwas Arbeit gemacht
und ein QT Paket in Version 4.7 erstellt, welches Parallel und ohne weitere Systemauswirkungen installiert
werden kann und es somit ermöglicht die aktuellste Skype Version auch unter SLE 11 zu nutzen.
Hier nun die nötigen Schritte
Repository für QT 4.7 hinzufügen
user@host:~> zypper ar -f http://download.obs.j0ke.net/home:/netmax:/playground/SLE_11_SP3/ home:netmax:playground
qt-4.7 Pakete installieren (wird unter /opt/qt-4.7 installiert)
user@host:~> zypper -n in opt-libqt4-47-32bit opt-libqt4-47-qt3support-32bit opt-libqt4-47-sql-32bit opt-libqt4-47-sql-sqlite-32bit opt-libqt4-47-x11-32bit
Pulseaudio Pakete installieren sofern nicht vorhanden
user@host:~> zypper -n in pulseaudio pulseaudio-module-x11 pulseaudio-module-zeroconf pulseaudio-utilspulseaudio-lang
Aktuelle Skype Version herunter laden und installieren
user@host:~> sudo wget http://www.skype.com/go/getskype-linux-beta-suse -O /root/skype-4.3.0.37-suse.i586.rpm
user@host:~> sudo rpm -ivh /root/skype-4.3.0.37-suse.i586.rpm
Skype Startscript anlegen
user@host:~> mkdir -p ~/bin
user@host:~> cat > ~/bin/skype << EOF
#!/bin/bash
LD_LIBRARY_PATH=/opt/qt-4.7/lib/ /usr/bin/skype
EOFuser@host:~> chmod +x ~/bin/skype
Gegebenenfalls die .desktop Dateien / Applikationslinks auf das neue Script in ~/bin/skype verweisen lassen damit auch Starts per Icon Klick funktionieren.
OpenBSD PF Monitoring mit Cacti
by carsten on Mar.18, 2014, under OpenBSD
Kürzlich war ich auf der Suche nach Monitoringvorlagen für Cacti um die Werte welche seitens der OPENBSD-PF-MIB bereitgestellt werden zu überwachen. Leider bin ich nicht fündig geworden und habe daher selbst entsprechende Data, Graph und Hosttemplates erstellt.
Daraus entstanden sind zwei Graphen:
State table Überwachung (Anzahl der States, Inserts, Removes & Searches)
State drop Causes (alle Möglichen Gründe welche zu einem State drop geführt haben können)
Erstellt wurden die Templates mit cacti in Version 0.8.8b in Verbindung mit OpenBSD 5.4 und snmpd.
cacti-templates_openbsd-pf.zip (21.1 KiB, 8,042 hits)
SLES 11 SP2 Kernel Update 3.0.80 DRBD crash
by carsten on Jun.21, 2013, under SLE, Virtualization, XEN
Während einiger Wartungsarbeiten und einem damit verbundenen Kernelupdate auf die derzeit
für SLES 11 SP2 aktuelle Kernel Version 3.0.80 bin ich auf einen Fehler in Verbindung mit DRBD gestoßen.
Das Update selbst liefert keine neuen drbd kmp Pakete mit, sondern verwendet weiterhin eine Vorgängerversion (8.4.2_3.0.51_0.7.9-0.6.6.4)
Der Fehler äußert sich direkt beim Laden des drbd Moduls mit folgender Meldung:
[ 154.173134] events: mcg drbd: 3
[ 154.174916] BUG: unable to handle kernel NULL pointer dereference at (null)
[ 154.174927] IP: [] cleanup_module+0xb0/0x150 [drbd]
[ 154.174949] PGD 7927f8067 PUD 7a0a83067 PMD 0
[ 154.174954] Oops: 0000 [#1] SMP
[ 154.174959] CPU 7
[ 154.174960] Modules linked in: drbd(+) crc32c libcrc32c ip6table_filter ip6_tables iptable_filter ip_tables x_tables nbd usbbk netbk blkbk blkback_pagemap blktap xenbus_be gntdev evtchn mpt2sas scsi_transport_sas raid_class mptctl mptbase ipmi_devintf ipmi_si ipmi_msghandler dell_rbu(X) bridge 8021q garp stp llc bonding microcode fuse loop dm_mod joydev bnx2 usbhid hid sg ses enclosure sr_mod 8250_pnp ipv6 ipv6_lib pcspkr tpm_tis tpm tpm_bios i2c_piix4 i2c_core dcdbas(X) k10temp domctl 8250 serial_core rtc_cmos serio_raw button acpi_power_meter ohci_hcd ehci_hcd usbcore usb_common sd_mod crc_t10dif scsi_dh_hp_sw scsi_dh_alua scsi_dh_rdac scsi_dh_emc scsi_dh xenblk cdrom xennet edd ext3 mbcache jbd fan processor ata_generic pata_atiixp ahci libahci libata megaraid_sas scsi_mod thermal thermal_sys hwmon
[ 154.175039] Supported: Yes, External
[ 154.175041]
[ 154.175044] Pid: 12110, comm: modprobe Tainted: G X 3.0.80-0.5-xen #1 Dell Inc. PowerEdge R515/03X0MN
[ 154.175050] RIP: e030:[] [ ] cleanup_module+0xb0/0x150 [drbd]
[ 154.175064] RSP: e02b:ffff88079e8efef8 EFLAGS: 00010203
[ 154.175066] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
[ 154.175069] RDX: fffffffffffffff8 RSI: ffff88079e8eff0c RDI: ffffffffa04fe600
[ 154.175072] RBP: ffff88079e8eff0c R08: 0000000000000000 R09: 0000000800040008
[ 154.175075] R10: 0000000100030008 R11: 0000001800010006 R12: ffffffffa0508000
[ 154.175078] R13: 0000000000000000 R14: 0000000000623230 R15: 0000000000000000
[ 154.175084] FS: 00007f92fdf3a700(0000) GS:ffff8807c14e0000(0000) knlGS:0000000000000000
[ 154.175088] CS: e033 DS: 0000 ES: 0000 CR0: 000000008005003b
[ 154.175090] CR2: 0000000000000000 CR3: 00000007a793c000 CR4: 0000000000000660
[ 154.175094] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 154.175097] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[ 154.175100] Process modprobe (pid: 12110, threadinfo ffff88079e8ee000, task ffff880792438580)
[ 154.175103] Stack:
[ 154.175105] 0000000000000000 ffffffffa04d8f05 0000000000000000 00000000fffffff4
[ 154.175110] 0000000000081dd8 ffffffffa0508085 ffffffffa04fe240 ffffffff8000403b
[ 154.175115] 0000000000000000 ffffffffa04fe240 0000000000081dd8 00007f92fdeb7000
[ 154.175121] Call Trace:
[ 154.175158] [] init_module+0x85/0x1000 [drbd]
[ 154.175177] [] do_one_initcall+0x3b/0x190
[ 154.175185] [] sys_init_module+0xcf/0x240
[ 154.175192] [] system_call_fastpath+0x16/0x1b
[ 154.175201] [<00007f92fda9635a>] 0x7f92fda96359
[ 154.175204] Code: 24 14 01 48 89 ee 48 c7 c7 00 e6 4f a0 e8 69 80 d3 df 48 85 c0 48 89 c3 75 b1 48 8b 05 ba 59 02 00 48 8d 50 f8 48 3d 20 e6 4f a0
[ 154.175228] 8b 4a 08 74 5b 48 8d 59 f8 eb 07 0f 1f 40 00 48 89 f3 48 8b
[ 154.175241] RIP [] cleanup_module+0xb0/0x150 [drbd]
[ 154.175253] RSP
[ 154.175255] CR2: 0000000000000000
[ 154.175258] —[ end trace ae9d139fe656969d ]—
[ 171.660668] IPMI System Interface driver.
[ 171.660720] ipmi_si: probing via SMBIOS
[ 171.660724] ipmi_si: SMBIOS: io 0xca8 regsize 1 spacing 4 irq 0
[ 171.660727] ipmi_si: Adding SMBIOS-specified kcs state machine
[ 171.660733] ipmi_si: Trying SMBIOS-specified kcs state machine at i/o address 0xca8, slave address 0x20, irq 0
[ 172.742032] ipmi_si ipmi_si.0: Found new BMC (man_id: 0x0002a2, prod_id: 0x0100, dev_id: 0x20)
[ 172.742111] ipmi_si ipmi_si.0: IPMI kcs interface initialized
Ich habe den Fehler dann direkt (19.06.2013) als Servicerequest bei Novell gemeldet, heute am 21.06.2013 wurde mir ein PTF bereit gestellt der das Problem behebt.
Zwischenzeitlich hatte ich ein Kerneldowngrade auf die Version 3.0.74-0.6.10.1 durchgeführt, damit meine Systeme wieder einwandfrei arbeiten.
Ursache des ganzen war folgendes:
It is because of a silent change in KABI for xen.
Which requires the drbd module to be re-compiled against the actual
kernel. Also we have found and fixed the NULL pointer dereference possibility
in drbd code.
Öffentlich soll der Fix im laufe der KW26 werden, sofern nichts größeres dazwischen kommt.
Update 25.06.2013:
Der Vorabfix wurde heute von SUSE zurück gezogen und ein komplettes Kernel Update angekündigt, da die KABI
Änderungen wohl umfangreicher ausfallen. Nach dem Update soll das alte drbd Kernel Modul wieder kompatibel sein.
Update 05.07.2013:
Ein neues Kernelupdate (SUSE-SU-2013:1151-1 / Version 3.0.80-0.7.1) wurde released, welches das Problem nun final löst.
RHEL6 / CentOS6 / Scientific 6 Bridging Firewall
by carsten on Jan.17, 2012, under RHEL
Ich wurde gerade auf eine interessante Änderung in Redhat Enterprise 6 und seinen Ablegern aufmerksam gemacht. Wer mit den genannten Distributionen eine transparente Firewall mittels Linux Bridge & iptables bauen möchte fragt sich unter Umständen warum sein Regelwerk in der FORWARD Chain nicht greift.
Ich musste auch etwas suchen und habe dann nach ca. 10 Minuten mal in die /etc/sysctl.conf geschaut und folgendes entdeckt:
# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
Hier wird für alle Netzwerkdevices die über das “bridge” Modul aktiviert werden, die iptables,ip6tables und arptables aufrufe im Kernel verhindert und der gesamte Datenverkehr kann ungefiltert passieren.
Um die bekannte Funktionsweise herzustellen reicht es die Werte einfach auf 1 zu setzen und zu aktivieren:
echo 1 >/proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 >/proc/sys/net/bridge/bridge-nf-call-arptables
echo 1 >/proc/sys/net/bridge/bridge-nf-call-ip6tables
Das nenn ich dann mal “Allow from all” im ganz großen Stil 🙂
openSUSE 12.1 mit Logitech MX5500
by carsten on Dec.26, 2011, under Hardware
Auf meinem Heim PC an dem eine Logitech MX5500 Tastatur/Maus (Bluetooth) Kombination hängt, habe ich mir nun openSUSE 12.1 installiert. Zuvor lief dort openSUSE 11.4. Die Installation war kein Update sondern eine Neuinstallation, da ich gleichzeitig meine Festplatte durch ein größeres Modell ersetzt habe.
Nach der Installation funktionierte allerdings weder Maus noch Tastatur. Mit einer PS/2 Tastatur und einer Kabelgebundenenn USB Maus konnte ich allerdings problemlos arbeiten. Nach einigem debuggen und suchen, war auf den ersten Blick kein Fehler erkennbar. Sowohl Maus als auch Tastatur wurden vom System erkannt, funktionierten aber trotzdem nicht.
Über Google bin ich dann im openSUSE Forum fündig geworden. Immerhin gibt es schon jemanden, der das gleiche Problem hat, also ist die chance recht hoch, das es auch eine Lösung dafür gibt. Leider aber nicht in diesem Forumthread.
Ich habe somit weiter gesucht und habe im Novell Bugtracker einen passenden Eintrag finden können der das Problem beschreibt, allerdings auch ohne eine Lösung. In dem Eintrag war allerdings eine Referenz auf einen anderen Bug, in dem das gleiche Problem ähnlich beschrieben ist, mit einem Lösungsweg der bei mir aber so nicht funktioniert hat.
Meine Lösung habe ich im Bug 731221 dokumentiert.
Ein kleines Stück Code in Richtung IPv6
by carsten on Jun.16, 2011, under QMail
Am letzten Wochenende bin ich dann doch endlich einmal dazu gekommen meinen Mailserver mit einer IPv6 Adresse und entsprechenden DNS Einträgen zu versehen.
Die Software war weitestgehend für IPv6 vorbereitet, dachte ich zumindest. Gestern stellte sich heraus das doch noch ein kleiner Teil nicht mit den “neuen” Adressen klar kommt.
Ich benutze auf meinem Qmail System helodnscheck2 als qmail-spp Plugin. Die letzte Version ist aus dem Jahr 2008, da wurde IPv6 leider immernoch sehr vernachlässigt.
Ich konnte diesen Zustand so natürlich nicht beibehalten und habe mit meinen C Grundkenntnissen einen kleinen Patch zusammen bekommen der nun auch mit IPv6 Adressen klar kommt. Die gepatchte Version und auch den Patch gibt es auf meiner OSS Seite.
Stresslinux 0.7.105 auf Basis von openSUSE 11.4
by carsten on Apr.17, 2011, under Hardware, RPM Packageing, Virtualization, VMware
Eine neue Version von stresslinux basierend auf openSUSE 11.4 steht zum download bereit. Neben den Neuerungen der Basisdistribution sind auch wieder einige
zusätzliche Pakete aktualisiert worden, dazu gehören:
- busybox 1.18.4
- iperf 2.0.5
- lm_sensors 3.3.0
- lshw B.02.15
- memtest86 4.0
- memtest86+ 4.20
- mprime 2.6.5
- smartmontools 5.40.3314
- x86info 1.29
- y-cruncher 0.5.5.9179
Wie immer gibt es ISO, USB und VMware Images zum download.
Viel Spaß beim Testen!
Natives IPv6 auf einem M-Net DSL Anschluss
by carsten on Mar.17, 2011, under SLE
Bei M-Net läuft bereits seit geraumer Zeit ein IPv6 Testbetrieb an
dem man freiwillig teilnehmen kann. Support gibt es dafür allerdings
bisher nicht. Hilfe findet man allerdings im Forum.
Ich selbst habe einen Linux Router mit SLES 11 SP1 an dem ein
Standard DSL Modem hängt. Die Einwahl erfolgt mittels pppd und
pppoe und wurde initial über yast konfiguriert. In dem Router
befinden sich mehrere Netzwerkschnittstellen (eth0 – eth5) wovon ich mittels
Bridge Konfiguration eth0 – eth4 zu einem Interface br0 zusammengefasst habe.
Das DSL Modem selbst hängt an eth5. Bei der Einwahl über ppp wird dsl0 erzeugt.
Für die Nutzung von IPv6 über den ppp0 Link sind einige Anpassungen
am System nötig.
- Loginname anpassen
- Installation von wide-dhcpv6 und radvd
Der erste Punkt ist sehr einfach umzusetzen, dazu wird
in der Datei /etc/sysconfig/network/provides/provider0
in der Zeile USERNAME der Teil nach dem ‘@’ Symbol mit
“v6.mnet-online.de” ersetzt und in der Datei /etc/ppp/peers/pppoe diese Zeileangehängt.
+ipv6 ipv6cp-use-ipaddr
Der zweite Teil ist auf SLES11 etwas problematischer gewesen,
da es kein wide-dhcpv6 Paket gab. Das Standard dhcpv6 Paket
funktioniert leider nicht, es ist zwar von der Konfiguration
her ähnlich hat aber nicht den Umfang den wide-dhcpv6 bereit
stellt.
Ich habe daher ein eigenes wide-dhcpv6 Paket erstellt, welche
nun zum Einsatz kommt. Das Paket befindet sich in server:network
Repository. Das Repository wie folgt hinzufügen:
zypper ar -f http://download.obs.j0ke.net/server:/network/SLE_11_SP1/ server:network
Die Pakete im Anschluss wie folgt installieren:
zypper in wide-dhcpv6 radvd
Sollte das Paket dhcpv6 bereits installiert sein, muss die Deinstallation dieses Pakets
bestätigt werden.
Nach der Installation werden für beide Dienste Konfigurationsdateien angelegt:
/etc/dhcp6c.conf
#
# See dhcp6c.conf(5) man page for details.
#
interface dsl0 {
send ia-pd 0;
send rapid-commit;
script "/usr/bin/dhcp6c-state";
request domain-name-servers;
};
id-assoc pd 0 {
prefix-interface lo {
sla-id 0;
sla-len 8;
};
prefix-interface br0 {
sla-id 1;
sla-len 8;
};
};
/etc/radvd.conf
interface br0
{
AdvSendAdvert on;
MinRtrAdvInterval 30;
MaxRtrAdvInterval 100;
prefix ::/64 {
AdvOnLink on;
AdvAutonomous on;
};
};
Zudem ein kleines Shellscript was vom dhcp6c ausgefürht wird:
/usr/bin/dhcp6c-state
#!/bin/bash sleep 10 /etc/init.d/radvd restart 2>&1 >/dev/null
Auf meinem Router habe ich zur Überwachung der DSL Verbindung
ein weiteres Shellscript mitlaufen, welches prüft ob dsl0 aktiv
ist und andernfalls die DSL Verbindung herstellt. Zeitgleich
werden darin auch der dhcp6c gestartet und die Defaultroute
für IPv6 gesetzt.
/usr/local/bin/keepalive.ppp
#!/bin/sh
# restart the ppp connection whenever it goes down
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
export LOG="logger -p daemon.notice -t `basename $0`[$$]"
$LOG "Monitoring PPP connection"
while [ 1 ]
do
if `ifconfig | grep -q ^dsl0`
then
$LOG "PPP connection ok"
else
$LOG "Starting pppoed"
# set dsl modem interface to up state
ifconfig eth5 up
# set dsl0 to off to be sure it's really off
ifdown dsl0
# start dsl0 connection
ifup dsl0
sleep 10
# run dhcp6 client on dsl0 interface
killall -9 dhcp6c 2>/dev/null
dhcp6c -c /etc/dhcp6c.conf -p /var/run/dhcp6c.pid dsl0
# set IPv6 default route to dsl0 interface
ip -6 ro add default dev dsl0
fi
sleep 30
done
Das hier gezeigte Script wird beim Booten des Systems von einem init-Script
aufgerufen. Diese script so aus:
/etc/init.d/keepalive.init
#!/bin/sh
# keepalive.ppp wrapper startup script
### BEGIN INIT INFO
# Provides: keepalive.init
# Required-Start: $network $remote_fs sshd
# Required-Stop: $network $remote_fs
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Description: Start the keepalive.ppp script
### END INIT INFO
. /etc/rc.status
# Shell functions sourced from /etc/rc.status:
# rc_check check and set local and overall rc status
# rc_status check and set local and overall rc status
# rc_status -v ditto but be verbose in local rc status
# rc_status -v -r ditto and clear the local rc status
# rc_failed set local and overall rc status to failed
# rc_reset clear local rc status (overall remains)
# rc_exit exit appropriate to overall rc status
# First reset status of this service
rc_reset
case "$1" in
start)
if [ -z "`find /proc -lname "/usr/local/bin/keepalive.ppp" 2>/dev/null |awk -F/ '{print $3}'`" ]; then
echo "starting keepalive.ppp..."
/usr/local/bin/keepalive.ppp &
else
echo "keepalive.ppp is already running"
rc_failed
fi
rc_status -v
;;
stop)
echo "stopping keepalive.ppp"
PID=`find /proc -lname "/usr/local/bin/keepalive.ppp" 2>/dev/null |awk -F/ '{print $3}'`
if [ -n "$PID" ]; then
kill -9 $PID
else
rc_failed
fi
rc_status -v
;;
status)
PID=`find /proc -lname "/usr/local/bin/keepalive.ppp" 2>/dev/null |awk -F/ '{print $3}'`
if [ -n "$PID" ]; then
echo "keepalive.ppp status: "
else
echo "keepalive.ppp status: "
rc_failed
fi
rc_status -v
;;
*)
echo "Usage: $0 < start | stop | status >"
;;
esac
rc_exit
Das init-Script kann mit folgendem Befehl für den Startvorgang dauerhaft aktiviert werden:
chkconfig keepalive.init on
Sobald die DSL Verbindunzg per ‘/etc/init.d/keepalive.init start’ gestartet wird sollten im Anschluss auf den lokalen Netzwerkschnittstellen lo0 (loopback) und br0 (interne LAN Bridge) IPv6 Adressen zu sehen sein. Bei M-Net beginnen diese mit “2001:a60:”. Damit der Linux Rechner IPv6 auch von und zum internen Netz weiter leitet muss IPv6 Forwarding aktiv sein.
Dazu wird “net.ipv6.conf.all.forwarding=1” in /etc/sysctl.conf eingetragen. Damit IPv6 forwarding sofort aktiv ist kann man es per Hand mit diesem Befehl aktivieren:
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
Abschließend kann ich nur empfehlen, das jeder der IPv6 einrichtet sich mit einer entsprechenden Firewall ausrüstet,.da jeder PC im Netzwerk mittels einer automatisch zugewiesenen IPv6 Adresse von überall im Internet direkt erreichbar und somit auch direkt angreifbar ist.
SLES11 SP1 Kernel 2.6.32.29-0.3.1 mISDN broken?
by carsten on Mar.12, 2011, under SLE, VoIP
Die letzten zwei abende habe ich damit verbracht einen merkwürdigen Fehler auf einem SLES11 System zu finden auf dem eine Asterisk Telefonanlage (1.6.2.x) mit chan_lcr läuft. Über eine HFC ISDN Karte und dazu gehörigem mISDN Treiber werden eingehende ISDN Anrufe auf SIP gebridged.
Seit dem neuesten Kernel Update kamen die Anrufe zwar noch durch, es läutet, man konnte abheben und die Verbindung war da, aber eine Sprachverbindung war nicht möglich (in beide Richtungen).
Nach langem Suchen inklusive Austausch von ISDN Kabel und HFC Karte blieb am Ende nur noch der Kernel übrig.
Im Changelog des Kernels bin ich über folgenden Eintrag gestolpert, der unter Umständen für dieses Verhalten verantwortlich ist.
* Mo Jan 17 2011 jeffm@suse.com
– patches.fixes/misdn-add-support-for-group-membership-check:
mISDN: Add support for group membership check (bnc#564423).
Dieser Eintrag brachte mich dann zu folgenden Commit
Mit diesem Patch wird ein neuer Modulparameter zu mISDN_core hinzugefügt welcher vermutlich in meiner Umgebung extra gesetzt werden muss:
parm: gid:Unix group for accessing misdn socket (default 0) (uint)
Ich habe vorerst ein Kerneldowngrade durchgeführt, damit die Produktivität des Systems nicht weiter leidet, werde den Parameter aber noch ausprobieren.
Update: 27.03.2011
Ich hatte nun Gelegenheit den gid Parameter von mISDN_core zu testen. Mein lcr bzw. asterisk selbst läuft als Benutzer asterisk mit gid 330. Ich habe also gid=330 an modprobe mISDN_core als Parameter übergeben. Danach lcr und asterisk wieder gestartet. Alles funktioniert nun auch mit dem neuen Kernel wieder.



