<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on SpellFab</title>
    <link>https://mortzu.de/posts/</link>
    <description>Recent content in Posts on SpellFab</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>de-DE</language>
    <lastBuildDate>Sat, 24 Jan 2026 13:23:00 +0200</lastBuildDate><atom:link href="https://mortzu.de/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Using GitHub from IPv6-only hosts</title>
      <link>https://mortzu.de/posts/2026-01-24-github-ipv6/</link>
      <pubDate>Sat, 24 Jan 2026 13:23:00 +0200</pubDate>
      
      <guid>https://mortzu.de/posts/2026-01-24-github-ipv6/</guid>
      <description>&lt;h2 id=&#34;or-living-in-the-present-trapped-in-the-past&#34;&gt;(or: living in the present, trapped in the past)&lt;/h2&gt;
&lt;p&gt;IPv6 has been around for roughly forever™, yet in the year 2026 GitHub still behaves like the internet ends at 0.0.0.0/0.&lt;br&gt;
If you are running an IPv6-only host (because you enjoy modern networking) you may have noticed that GitHub is unreachable.
&lt;code&gt;git clone&lt;/code&gt; fails and HTTPS goes nowhere.&lt;/p&gt;
&lt;h2 id=&#34;option-1-the-etchosts--proxy-hack&#34;&gt;Option 1: The /etc/hosts + proxy hack&lt;/h2&gt;
&lt;p&gt;One straightforward workaround is to route GitHub traffic through an IPv6-accessible proxy that speaks IPv4 on your behalf.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&#34;https://danwin1210.de/github-ipv6-proxy.php&#34; target=&#34;_blank&#34;&gt;public proxy&lt;/a&gt; is provided by &lt;a href=&#34;https://danwin1210.de/&#34; target=&#34;_blank&#34;&gt;Daniel Winzen&lt;/a&gt;, which exposes the GitHub services over IPv6.&lt;/p&gt;
&lt;p&gt;Because DNS is a suggestion and &lt;code&gt;/etc/hosts&lt;/code&gt; is the law, we simply override GitHub&amp;rsquo;s hostnames there:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2a01:4f8:c010:d56::2 github.com
2a01:4f8:c010:d56::3 api.github.com
2a01:4f8:c010:d56::4 codeload.github.com
2a01:4f8:c010:d56::6 ghcr.io
2a01:4f8:c010:d56::7 pkg.github.com npm.pkg.github.com maven.pkg.github.com nuget.pkg.github.com rubygems.pkg.github.com
2a01:4f8:c010:d56::8 uploads.github.com
2606:50c0:8000::133 objects.githubusercontent.com www.objects.githubusercontent.com release-assets.githubusercontent.com gist.githubusercontent.com repository-images.githubusercontent.com camo.githubusercontent.com private-user-images.githubusercontent.com avatars0.githubusercontent.com avatars1.githubusercontent.com avatars2.githubusercontent.com avatars3.githubusercontent.com cloud.githubusercontent.com desktop.githubusercontent.com support.github.com
2606:50c0:8000::154 support-assets.githubassets.com github.githubassets.com opengraph.githubassets.com github-registry-files.githubusercontent.com github-cloud.githubusercontent.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After that, you can use GitHub as usual.&lt;/p&gt;
&lt;p&gt;Without modifying &lt;code&gt;/etc/hosts&lt;/code&gt;, you can use the proxy as following.&lt;/p&gt;
&lt;p&gt;Via HTTPS&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://danwin1210.de:1443/DanWin/le-chat-php.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;or via SSH&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone git@github-ipv6-proxy.danwin1210.de:DanWin/le-chat-php.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But using this approach with HTTPS you are man-in-the-middle&amp;rsquo;ing yourself on purpose (SSL is broken in the middle. So do not transfer any sensitive information! You&amp;rsquo;ve been warned!).&lt;/p&gt;
&lt;h2 id=&#34;option-2-nat64--dns64&#34;&gt;Option 2: NAT64 / DNS64&lt;/h2&gt;
&lt;p&gt;In short: your IPv6-only machine asks for a AAAA record, the DNS64 server makes one up from the IPv4 address,
and NAT64 magically translates your IPv6 packets into IPv4 on the fly. It&amp;rsquo;s like sending a letter in Elvish
and having a goblin deliver it in Klingon. Somehow, the message still arrives, but only if the magical translator
(the NAT64) is awake and caffeinated. Not every network has this wizardry, but when it works, you can access
IPv4-only services without touching &lt;code&gt;/etc/hosts&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If your network does not support NAT64/DNS64 (and you don&amp;rsquo;t feel like doing it yourself), you can use a public NAT64 service instead.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take &lt;a href=&#34;https://nat64.net/&#34; target=&#34;_blank&#34;&gt;nat64.net&lt;/a&gt; as an example.&lt;/p&gt;
&lt;p&gt;The easy way is to enter the DNS servers listed under &lt;em&gt;Configure your system to use these nameservers:&lt;/em&gt; into your &lt;code&gt;/etc/resolv.conf&lt;/code&gt;.
However, this means that all DNS queries will then go through the DNS servers of nat64.net.&lt;/p&gt;
&lt;p&gt;If that is not an option, find the first DNS server from the website (at the time of this blog post its &lt;code&gt;2a01:4f8:c2c:123f::1&lt;/code&gt;)
and we&amp;rsquo;ll use the magic of &lt;code&gt;/etc/hosts&lt;/code&gt; again.&lt;br&gt;
To do this, we find the AAAA DNS entry of github.com via nat64.net&amp;rsquo;s DNS server and add to it:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dig +short github.com AAAA @2a01:4f8:c2c:123f::1 | sed -e &amp;#39;s/$/ github.com/g&amp;#39; &amp;gt;&amp;gt; /etc/hosts
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After that, github.com should be usable as normal for cloning repositories.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Eine VM auf Uberspace betreiben</title>
      <link>https://mortzu.de/posts/2025-10-07-uberspace-vm/</link>
      <pubDate>Tue, 07 Oct 2025 13:23:00 +0200</pubDate>
      
      <guid>https://mortzu.de/posts/2025-10-07-uberspace-vm/</guid>
      <description>&lt;p&gt;Zu Urzeiten, als es weder &lt;a href=&#34;https://de.wikipedia.org/wiki/Xen&#34; target=&#34;_blank&#34;&gt;Xen&lt;/a&gt; noch &lt;a href=&#34;https://de.wikipedia.org/wiki/Kernel-based_Virtual_Machine&#34; target=&#34;_blank&#34;&gt;KVM&lt;/a&gt; gab, hab ich,
nach einem kurzen Intermezzo zu &lt;a href=&#34;https://de.wikipedia.org/wiki/Linux-VServer&#34; target=&#34;_blank&#34;&gt;Linux-VServer&lt;/a&gt;, &lt;a href=&#34;https://de.wikipedia.org/wiki/User_Mode_Linux&#34; target=&#34;_blank&#34;&gt;User Mode Linux&lt;/a&gt; genutzt,
um virtuelle Server zu betreiben.&lt;/p&gt;
&lt;p&gt;Hierbei wird der Kernel als normaler (Userspace-)Prozess gestartet.&lt;/p&gt;
&lt;p&gt;Ich habe mir die Frage gestellt, ob ich eine VM mithilfe von User Mode Linux auf &lt;a href=&#34;https://uberspace.de/&#34; target=&#34;_blank&#34;&gt;Uberspace&lt;/a&gt; betreiben kann.&lt;/p&gt;
&lt;p&gt;Die Kernelkonfigurationsdatei (.config) habe ich aus dem &lt;a href=&#34;http://deb.debian.org/debian/pool/main/u/user-mode-linux/user-mode-linux_6.12um1.tar.xz&#34; target=&#34;_blank&#34;&gt;debian-Paket&lt;/a&gt; (config.amd64) genommen.&lt;/p&gt;
&lt;p&gt;Der Versuch den Kernel auf meinem Uberspace zu kompilieren ist aufgrund der Betagtheit des CentOS mit irgendwelchen obskuren Fehlern abgebrochen - nach
der dritten Datei, die ich manuell angepasst habe, hatte ich keine Lust mehr und habe geschaut, wie ich den Kernel auf meinem Rechner als statisches Programm kompilieren kann.&lt;/p&gt;
&lt;p&gt;Nur &lt;code&gt;CONFIG_STATIC_LINK=y&lt;/code&gt; zu setzen, hat bei mir nicht geklappt - ich musste in der &lt;code&gt;arch/um/Kconfig&lt;/code&gt; zwei Zeilen unter &lt;code&gt;config STATIC_LINK&lt;/code&gt; noch eine Zeile auskommentieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#    depends on CC_CAN_LINK_STATIC_NO_RUNTIME_DEPS || !MAY_HAVE_RUNTIME_DEPS
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Danach ein beherztes &lt;code&gt;make ARCH=um&lt;/code&gt; und nach einiger Zeit hatte ich ein statisches &lt;code&gt;linux&lt;/code&gt;-Binary.&lt;/p&gt;
&lt;p&gt;Das Dateisystem des User Mode Linux ist ein Imagedatei und da ich bei Uberspace kein root habe, musste ich das Image auf meinem Rechner vorbereiten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dd if=/dev/zero of=debian.img bs=1M count=$((1024*5))
mkfs.ext4 debian.img
mount -o loop debian.img /mnt
debootstrap trixie /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die erste Zeile erstellt eine Imagedatei, die 5 GB groß ist, die zweite erstellt ein ext4-System darin, die dritte mountet dieses nach &lt;code&gt;/mnt&lt;/code&gt; und die letzte Zeile
installiert ein Debian trixie.&lt;/p&gt;
&lt;p&gt;Danach bin ich per &lt;code&gt;chroot /mnt /bin/bash&lt;/code&gt; in das neue System gewechselt.
Es müssen alle Standard-Terminals deaktiviert (und maskiert) werden und stattdessen eins auf &lt;code&gt;tty0&lt;/code&gt; gestartet werden:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rm /etc/systemd/system/getty.target.wants/getty@*
for i in $(seq 2 6); do ln -sf /dev/null /etc/systemd/system/getty@tty$i.service; done
ln -sf /dev/null /etc/systemd/system/getty-static.service
ln -s /usr/lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty0.service
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Außerdem habe ich per &lt;code&gt;passwd&lt;/code&gt; ein root-Passwort gesetzt.&lt;/p&gt;
&lt;p&gt;Auch die Netzwerkkonfiguration kann man schon gut vorbereiten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cat &amp;gt;&amp;gt; /etc/network/interfaces &amp;lt;&amp;lt;EOF

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 10.0.2.15/24
    post-up ip route add default dev \$IFACE
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Abschließend die Chroot-Umgebung per &lt;code&gt;exit&lt;/code&gt; verlassen und die Imagedatei mit &lt;code&gt;umount /mnt&lt;/code&gt; unmounten.&lt;/p&gt;
&lt;p&gt;Das Image habe ich danach einfach per SCP auf meinen Uberspace kopiert.&lt;/p&gt;
&lt;p&gt;Soweit so gut. Als ich User Mode Linux früher als Virtualisierungslösung benutzt habe, habe ich die Netzwerkanbindung mit &lt;a href=&#34;https://de.wikipedia.org/wiki/TUN/TAP&#34; target=&#34;_blank&#34;&gt;TAP&lt;/a&gt;-Devices
realisiert, was jedoch root erfordert, was ich, wie oben erwähnt, bei Uberspace nicht habe.&lt;/p&gt;
&lt;p&gt;In der &lt;a href=&#34;https://user-mode-linux.sourceforge.net/old/networking.html&#34; target=&#34;_blank&#34;&gt;Netzwerkdokumentation&lt;/a&gt; vom User Mode Linux bin ich jedoch über den Satz
&amp;ldquo;slirp - if you don&amp;rsquo;t have root access on the host to setup networking, or if you don&amp;rsquo;t want to allocate an IP to your UML&amp;rdquo; gestolpert. Das klang genau nach dem was ich brauchte.&lt;/p&gt;
&lt;p&gt;Also flugs die Quellen runtergeladen (vom Debian-Mirror, weil zum kompilieren sowieso die Patches aus dem Debian-Paket notwendig sind):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir ~/slirp
cd ~/slirp
wget http://deb.debian.org/debian/pool/main/s/slirp/slirp_1.0.17.orig.tar.gz
wget http://deb.debian.org/debian/pool/main/s/slirp/slirp_1.0.17-11.debian.tar.xz
tar xf slirp_1.0.17.orig.tar.gz
tar xf slirp_1.0.17-11.debian.tar.xz
cd slirp-1.0.17/
for i in ../debian/patches/*.patch; do patch -p1 -i &amp;#34;$i&amp;#34;; done
cd src/
./configure
make CFLAGS=&amp;#34;-I. -DUSE_PPP -DUSE_MS_DNS -fno-strict-aliasing -Wno-unused -std=gnu89 -DFULL_BOLT&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Da ich das User Mode Linux hinterher per SSH erreichen wollte, musste ich einen Port in der Uberspace Firewall öffnen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;uberspace port add
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Damit das Portforwarding für SSH funktioniert, brauchte es zum Starten von Slirp ein Wrapperscript:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#! /usr/bin/env bash

exec /home/USERNAME/slirp/slirp-1.0.17/src/slirp &amp;#34;redir PORT 22&amp;#34; &amp;#34;host address 10.0.2.2&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;USERNAME ist hierbei durch den eigenen Uberspace Benutzernamen und PORT durch den eben geöffneten Port ersetzt werden.&lt;/p&gt;
&lt;p&gt;Jetzt konnte ich das erste mal das UML starten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/home/USERNAME/linux ubd0=/home/USERNAME/debian.img root=/dev/ubda rw mem=256M eth0=slirp,,/home/USERNAME/slirp.sh reboot=force
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Das &lt;code&gt;mem=256M&lt;/code&gt; sagt hierbei, dass das User Mode Linux maximal 256MB RAM nutzen darf, was okay sein sollte, da auf &lt;a href=&#34;https://manual.uberspace.de/basics-resources/#ram&#34; target=&#34;_blank&#34;&gt;https://manual.uberspace.de/basics-resources/#ram&lt;/a&gt;
steht, dass ein Asteroid maximal 1.5 GB nutzen darf.&lt;/p&gt;
&lt;p&gt;Nachdem das User Mode Linux gestartet war, konnte ich mich einloggen (mit root und dem Passwort von oben) und per &lt;code&gt;apt-get --no-install-recommends install openssh-server&lt;/code&gt;
einen SSH-Server installieren. Danach habe ich noch meinen SSH Public Key nach &lt;code&gt;/root/.ssh/authorized_keys&lt;/code&gt; gelegt und konnte mich per SSH einloggen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh -pPORT USERSPACE-HOST
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Fazit: Man kann das machen, es ist aber nicht besonders schnell. Ich sehe das ganze nur als &lt;a href=&#34;https://de.wikipedia.org/wiki/Proof_of_Concept&#34; target=&#34;_blank&#34;&gt;PoC&lt;/a&gt; und werde das
nicht produktiv betreiben.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wo kommt denn der zweite gpg-agent her?</title>
      <link>https://mortzu.de/posts/2025-08-25-gpg-agent-yubikey/</link>
      <pubDate>Mon, 25 Aug 2025 13:23:00 +0200</pubDate>
      
      <guid>https://mortzu.de/posts/2025-08-25-gpg-agent-yubikey/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://mortzu.de/assets/images/gpg-agent-yubikey.png#floatleft&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ich hab vor einiger Zeit von &lt;a href=&#34;https://archlinux.org/&#34; target=&#34;_blank&#34;&gt;ArchLinux&lt;/a&gt; auf &lt;a href=&#34;https://www.debian.org/&#34; target=&#34;_blank&#34;&gt;debian&lt;/a&gt; gewechselt. Danach fiel mir auf, dass wenn ich &lt;a href=&#34;https://www.passwordstore.org/&#34; target=&#34;_blank&#34;&gt;pass&lt;/a&gt; nutze und danach
&lt;a href=&#34;https://www.openssh.com/&#34; target=&#34;_blank&#34;&gt;SSH&lt;/a&gt;, ich zweimal die PIN für den Yubikey eingeben muss.
Außerdem hat manchmal pass nicht funktioniert, wenn ich es nach SSH aufgerufen hab (da wurde dann die &amp;ldquo;GPG-Smartcard&amp;rdquo; (der Yubikey) gar nicht gefunden). Da war dann die Lösung den Yubikey einmal
neu zu stecken und danach pass vor SSH aufzurufen.&lt;/p&gt;
&lt;p&gt;Auffällig war, dass nach dem pass-Aufruf immer ein zweiter gpg-agent lief. Ich hab mir eine zeitlang damit beholfen in die &lt;code&gt;~/.gnupg/scdaemon.conf&lt;/code&gt; &lt;code&gt;pcsc-shared&lt;/code&gt; zu schreiben -
damit ist der Yubikey nicht exklusiv von einem der beiden gpg-agents blockiert, aber nach dem Update auf trixie ist noch irgendwas anderes schief (dazu in einem anderen Blogpost mehr),
so dass ich bei jedem Zugriff auf den Yubikey die PIN eingeben muss. Also musste ich mal das eigentliche Problem lösen.&lt;/p&gt;
&lt;p&gt;Also mal Yubikey angesteckt, eine SSH-Verbindung aufgebaut und danach pass aufgerufen. Es wird ein zweiter gpg-agent gestartet und der pass-Aufruf funktioniert nicht. Soweit kennen wir das ja schon.
Das googlen nach den Parametern, mit denen der gpg-agent gestartet wird (&lt;code&gt;--use-standard-socket --daemon&lt;/code&gt;) hat mich dann zumindest drauf gebracht, dass er wohl mittels &lt;code&gt;gpgconf --launch gpg-agent&lt;/code&gt; gestartet wird,
hat sonst aber wenig Erkenntnisse gebracht.&lt;/p&gt;
&lt;p&gt;Dann also mal strace auf den pass-Aufruf geschmissen und das große Wundern geht los: Wieso wird der gpg-agent-socket in &lt;code&gt;/run/user/1000/gnupg/d.4wrkznjfxmhuw5861gsoydhj/S.gpg-agent&lt;/code&gt; gesucht, wenn doch
die systemd-User-Unit &lt;code&gt;%t/gnupg/S.gpg-agent&lt;/code&gt; als Pfad vorgibt (was &lt;code&gt;/run/user/1000/gnupg/S.gpg-agent&lt;/code&gt; ist).&lt;/p&gt;
&lt;p&gt;Nach einigem Googlen nach der Frage wie man den Ort des Sockets anpassen kann, bin ich auf &lt;a href=&#34;https://gnupg-users.gnupg.narkive.com/1JY1lXWm/change-agent-socket-path&#34; target=&#34;_blank&#34;&gt;https://gnupg-users.gnupg.narkive.com/1JY1lXWm/change-agent-socket-path&lt;/a&gt;
gestoßen wo ich folgenden Absatz fand:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you use a GNUPGHOME different from ~/.gnupg gpg will not connect&lt;br&gt;
to /run/user/1000/gnupg but to /run/user/1000/gnupg/SOMEDIR/. That dir&lt;br&gt;
is not created on the fly but requires that the user creates it in&lt;br&gt;
advance. SOMEDIR is the hash of GNUPGHOME and gpgconf has a command to&lt;br&gt;
compute that hash and create the directory.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Ich hatte mir irgendwann im Rahmen von &lt;a href=&#34;https://www.youtube.com/watch?v=1QNR5T-nsQE&#34; target=&#34;_blank&#34;&gt;mein Homedir soll schöner werden&lt;/a&gt; überlegt, dass ich &lt;code&gt;~/.gnupg&lt;/code&gt; lieber in &lt;code&gt;~/.config/gnupg&lt;/code&gt;
haben will und hab in meiner &lt;code&gt;.xinitrc&lt;/code&gt;, &lt;code&gt;.xprofile&lt;/code&gt; und &lt;code&gt;.zshrc&lt;/code&gt; &lt;code&gt;export GNUPGHOME=&amp;quot;${XDG_CONFIG_HOME}/gnupg&amp;quot;&lt;/code&gt; gesetzt.
Ich hatte außerdem einen Symlink gesetzt (von &lt;code&gt;~/.gnupg&lt;/code&gt; nach &lt;code&gt;~/.config/gnupg&lt;/code&gt;). D.h. eigentlich wäre die Umgebungsvariable auch gar nicht nötig gewesen&amp;hellip;&lt;/p&gt;
&lt;p&gt;Was ist also passiert: Der von systemd gestartete gpg-agent war für SSH zuständig (das hat auch funktioniert, da der SSH-agent über die Umgebungsvariable &lt;code&gt;SSH_AUTH_SOCK&lt;/code&gt; bekannt gemacht wird
(und nicht über komische Regeln)). Wenn ich aber gpg genutzt habe, hat es festgestellt, dass kein gpg-agent an dem angenommenen Unix-Socket lauscht und hat kurzerhand einen neuen gestartet
(weil es für Smartcards (Yubikey) nötig ist, dass einer läuft).&lt;/p&gt;
&lt;p&gt;Die Lösung: Ausgiebig ge-face-palmt, die &lt;code&gt;GNUGPGHOME&lt;/code&gt;-Einträge aus den Dateien entfernt und ein reboot später war alles tuffi und
funktioniert so wie es soll.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GPodder Sync</title>
      <link>https://mortzu.de/posts/2025-07-31-gpoddersync/</link>
      <pubDate>Thu, 31 Jul 2025 13:23:00 +0200</pubDate>
      
      <guid>https://mortzu.de/posts/2025-07-31-gpoddersync/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.never-afk.de/&#34; target=&#34;_blank&#34;&gt;bitstacker&lt;/a&gt; hatte mich auf &lt;a href=&#34;https://www.audiobookshelf.org/&#34; target=&#34;_blank&#34;&gt;audiobookshelf&lt;/a&gt; aufmerksam gemacht,
womit man die aktuelle Position in Podcasts über mehrere Geräte (z.B. Smartphone und Notebook) synchron halten kann.&lt;/p&gt;
&lt;p&gt;Da ich aus Gründen, die ich in einem extra Blogpost noch erläutern werde, aktuell Abstand davon nehme, Kram selber zu hosten,
ich die Funktionalität aber haben wollte, habe ich mich nach einer &lt;a href=&#34;https://nextcloud.com/&#34; target=&#34;_blank&#34;&gt;Nextcloud&lt;/a&gt;-App umgeschaut.&lt;/p&gt;
&lt;p&gt;Aufgrund meiner überragenden Google-Skills (&amp;ldquo;antennapod sync&amp;rdquo;) bin ich auf
&lt;a href=&#34;https://antennapod.org/de/documentation/general/synchronization&#34; target=&#34;_blank&#34;&gt;https://antennapod.org/de/documentation/general/synchronization&lt;/a&gt; gestoßen, wo
die Nextcloud-App &lt;a href=&#34;https://apps.nextcloud.com/apps/gpoddersync&#34; target=&#34;_blank&#34;&gt;GPodder Sync&lt;/a&gt; als mögliches Syncziel für AntennaPod vorgestellt wird.&lt;/p&gt;
&lt;p&gt;Die App in der Nextcloud installiert, flugs im AntennaPod eingerichtet (man muss vorher kein Anwendungspasswort anlegen - das passiert alles
während der Einrichtung) und fertig ists.&lt;/p&gt;
&lt;p&gt;Auf der &lt;a href=&#34;https://github.com/thrillfall/nextcloud-gpodder&#34; target=&#34;_blank&#34;&gt;GitHub-Seite&lt;/a&gt; von &lt;em&gt;GPodder Sync&lt;/em&gt; findet eine &lt;a href=&#34;https://github.com/thrillfall/nextcloud-gpodder?tab=readme-ov-file#clients-supporting-sync&#34; target=&#34;_blank&#34;&gt;Liste&lt;/a&gt;
kompatibler Clients. Meine Wahl ist auf &lt;a href=&#34;https://cardo-podcast.github.io/&#34; target=&#34;_blank&#34;&gt;Cardo&lt;/a&gt; gefallen. Die Einrichtung ist ähnlich einfach, wie bei AntennaPod:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cardo starten&lt;/li&gt;
&lt;li&gt;Aufs Zahnrad klicken&lt;/li&gt;
&lt;li&gt;Bei &lt;em&gt;SYNCHRONIZATION&lt;/em&gt; die Nextcloud URL eintragen und auf &lt;em&gt;CONNECT&lt;/em&gt; klicken&lt;/li&gt;
&lt;li&gt;Im aufploppenen Browserfenster in der Nextcloud einloggen und der App den Zugriff erlauben&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dauert einen Moment bis der dann anfängt zu syncen.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Auffe Ohren</title>
      <link>https://mortzu.de/posts/2025-07-04-podcasts/</link>
      <pubDate>Fri, 04 Jul 2025 13:23:00 +0200</pubDate>
      
      <guid>https://mortzu.de/posts/2025-07-04-podcasts/</guid>
      <description>&lt;p&gt;Der gute &lt;a href=&#34;https://blog.never-afk.de/&#34; target=&#34;_blank&#34;&gt;bitstacker&lt;/a&gt; hat in seinem Blog geschrieben welche &lt;a href=&#34;https://blog.never-afk.de/articles/2025/2025-04-14-13-37.html&#34; target=&#34;_blank&#34;&gt;Podcasts er so hört&lt;/a&gt; und ich wollte da auch mal meinen Senf zu geben:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://focusonlinux.podigee.io/&#34; target=&#34;_blank&#34;&gt;FOCUS ON: Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.fritz.de/programm/podcasts/okf-ortskontrollfahrt.html&#34; target=&#34;_blank&#34;&gt;OKF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://alternativlos.org/&#34; target=&#34;_blank&#34;&gt;Alternativlos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://faxinformatiker.de/&#34; target=&#34;_blank&#34;&gt;Faxinformatiker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pengutronix.de/en/tags/kernel-panic-podcast.html&#34; target=&#34;_blank&#34;&gt;Kernel Panic - Board on Fire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://compendion.net/minutenweisematrix/&#34; target=&#34;_blank&#34;&gt;Minutenweise Matrix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://techniktechnik.de/&#34; target=&#34;_blank&#34;&gt;TechnikTechnik&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ardaudiothek.de/sendung/telekaddi-coldmirrors-kinderserien/urn:ard:show:c75413481c85bce9/&#34; target=&#34;_blank&#34;&gt;TELEKADDI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://user.space/&#34; target=&#34;_blank&#34;&gt;Urlaub im Userspace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wartungsfenster.podigee.io/&#34; target=&#34;_blank&#34;&gt;Wartungsfenster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Erdbeeren! Überall Erdbeeren!</title>
      <link>https://mortzu.de/posts/2025-07-03-erdbeeren/</link>
      <pubDate>Thu, 03 Jul 2025 13:23:00 +0200</pubDate>
      
      <guid>https://mortzu.de/posts/2025-07-03-erdbeeren/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://mortzu.de/assets/images/erdbeeren-in-waschbecken.jpg#floatleft&#34; alt=&#34;Zu sehen ist ein Waschbecken voller Erdbeeren.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Letztens haben wir das wunderbare Wetter genutzt und einen kleinen Familienausflug zum &lt;a href=&#34;https://erdbeerhof-delmenhorst.de/&#34; target=&#34;_blank&#34;&gt;Erdbeerhof Delmenhorst&lt;/a&gt; gemacht, wo man Erdbeeren selbst pflücken kann.&lt;/p&gt;
&lt;p&gt;Ich hatte mir vorher Sorgen gemacht, dass unsere 1 ½ Jahre alte Tochter eher keine Lust darauf hat nicht durch die Pflanzen zu toben, aber sie saß ganz entspannt zwischen den Erdbeerreihen,
hat mit unserer Hilfe hier und da selbst ein paar Beeren gepfückt und futterte zwischendurch genüsslich angereichte Erdbeeren.&lt;/p&gt;
&lt;p&gt;Am Ende hatten wir trotz ihrer kleinen Naschpausen mehrere Kilo zusammen - aus denen wir, als wir wieder zu Hause waren, selbstgemachte Erdbeermarmelade gemacht haben.&lt;/p&gt;
&lt;p&gt;Hierzu braucht man 500g 3-zu-1-Gelierzucker und 1500g frische Erdbeeren.&lt;/p&gt;
&lt;p&gt;Zuerst muss man die Erdbeeren gründlich waschen, entstielen und klein schneiden.
Die Erdbeeren in einem ausreichend großen Topf zusammen mit dem Gelierzucker unter ständigem Rühren zum Kochen bringen (hierbei Überkochen vermeiden!).
Dann mindestens 4 Minuten sprudelnd weiterkochen und dabei umrühren.&lt;/p&gt;
&lt;p&gt;Anschließend eine Gelierprobe machen (etwas Marmelade auf einen kalten Teller geben - wird sie fest, ist sie fertig).
Die heiße Marmelade sofort randvoll in vorbereitete Gläser füllen, gut verschließen und auf den Deckel stellen.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Debian auf einer Compute Instanz in der Oracle Cloud</title>
      <link>https://mortzu.de/posts/2025-06-19-oracle-cloud/</link>
      <pubDate>Thu, 19 Jun 2025 20:31:37 +0200</pubDate>
      
      <guid>https://mortzu.de/posts/2025-06-19-oracle-cloud/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://mortzu.de/assets/images/oracle-cloud.png#floatleft&#34; alt=&#34;Zu sehen sind zwei sich gegenüberstehende Reihen Serverschränke. Die Farbstimmung ist rot.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Letztes Wochenende hab ich mir endlich mal die &lt;a href=&#34;https://www.oracle.com/cloud/free/&#34; target=&#34;_blank&#34;&gt;Free Tier&lt;/a&gt; Instanz (AMD based Compute VMs with 1/8 OCPU and 1 GB memory each) in der &lt;a href=&#34;https://www.oracle.com/de/cloud/&#34; target=&#34;_blank&#34;&gt;Oracle Cloud&lt;/a&gt; geklickt.
Das hab ich schon ewig vor mir her geschoben und jetzt hab ich mal ein bisschen Zeit gefunden.
Leider konnte ich nicht direkt &lt;a href=&#34;https://www.debian.org/&#34; target=&#34;_blank&#34;&gt;Debian&lt;/a&gt; als Betriebssystem auswählen, aber als Community-Image gab es &lt;a href=&#34;https://ubuntu.com/&#34; target=&#34;_blank&#34;&gt;Ubuntu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nachdem ich ein bisschen damit rumgespielt habe, wollte ich aber doch lieber Debian haben (ich hab überall Debian installiert) - also hab ich angefangen zu suchen, ob das schon jemand gelöst hat.&lt;/p&gt;
&lt;p&gt;Im &lt;a href=&#34;https://pieterhollander.nl/post/oracle-free-tier-debian-install-amd64/&#34; target=&#34;_blank&#34;&gt;Blog von Pieter Hollander&lt;/a&gt; wurde ich fündig.&lt;/p&gt;
&lt;p&gt;Ich hab auf Verschlüsselung und Swapfile verzichtet, weil ich auf der Box nicht mehr als 1GB RAM brauche und ich Dateisystemverschlüsselung in VMs für Blödsinn halte.&lt;/p&gt;
&lt;p&gt;Der Ablauf ist wie folgt:&lt;/p&gt;
&lt;p&gt;Eine SSH-Verbindung in das Ubuntu aufbauen, root werden und das Ubuntu mit &lt;a href=&#34;https://www.alpinelinux.org/&#34; target=&#34;_blank&#34;&gt;Alpine Linux&lt;/a&gt; ersetzen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh -o &amp;#34;StrictHostKeyChecking=no&amp;#34; -o &amp;#34;UserKnownHostsFile=/dev/null&amp;#34; ubuntu@REPLACE_WITH_YOUR_INSTANCES_PUBLIC_IP_ADDRESS
sudo -i
cd /
wget https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/x86_64/alpine-virt-3.21.3-x86_64.iso
dd if=alpine-virt-3.21.3-x86_64.iso of=/dev/sda
sync
reboot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Damit rebootet die Instanz in das Alpine Linux, wodurch der SSH-Zugriff verloren geht, da Alpine Linux standardmäßig keinen laufenden SSH-Server hat.&lt;/p&gt;
&lt;p&gt;Über die Oracle Cloud Console muss eine Konsolenverbindung erstellt werden.&lt;/p&gt;
&lt;p&gt;Dafür auf &lt;code&gt;Compute&lt;/code&gt;, &lt;code&gt;Instances&lt;/code&gt; und &lt;code&gt;Instance details&lt;/code&gt; klicken.&lt;/p&gt;
&lt;p&gt;Dann die Instanz auswählen, herunterscrollen und bei &lt;code&gt;Console connection&lt;/code&gt; auf &lt;code&gt;Launch Cloud Shell connection&lt;/code&gt; klicken.&lt;/p&gt;
&lt;p&gt;Wenn die Verbindung zu dem Cloudserver aufgebaut ist, steht im Fenster &lt;code&gt;Instance Console Connection reached state: ACTIVE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;An dem erscheinenden Loginprompt mit dem Benutzernamen &lt;code&gt;root&lt;/code&gt; und ohne Passwort einloggen.&lt;/p&gt;
&lt;p&gt;Als erstes muss die Netzwerkkonfiguation gefixt werden:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;vi /etc/network/interfaces
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;i&lt;/code&gt; drücken, um dein Einfügemodus zu aktivieren.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;auto eth0
iface eth0 inet dhcp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mit &lt;code&gt;:wq&lt;/code&gt; den vi verlassen und speichern. Danach das Netzwerk neustarten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/etc/init.d/networking restart
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Um nicht alles in der - doch etwas anstrengenden - Konsole zu machen, richten wir uns den SSH-Server ein:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;setup-sshd
Which ssh server? (&amp;#39;openssh&amp;#39;, &amp;#39;dropbear&amp;#39; or &amp;#39;none&amp;#39;) [openssh]
Allow root ssh login? (&amp;#39;?&amp;#39; for help) [prohibit-password]
Enter ssh key or URL for root (or &amp;#39;none&amp;#39;) [none]
 * service sshd added to runlevel default
 * Caching service dependencies ...
 [ ok ]
ssh-keygen: generating new host keys: RSA ECDSA ED25519
 * Starting sshd ...
 [ ok ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Den öffentlichen SSH-Schlüssel ablegen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir /root/.ssh
vi /root/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Danach per SSH weitermachen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh -o &amp;#34;StrictHostKeyChecking=no&amp;#34; -o &amp;#34;UserKnownHostsFile=/dev/null&amp;#34; root@REPLACE_WITH_YOUR_INSTANCES_PUBLIC_IP_ADDRESS
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Das Alpine Linux auf eine Ramdisk bewegen und von da weiterarbeiten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir /media/setup
cp -a /media/sda/* /media/setup
mkdir /lib/setup
cp -a /.modloop/* /lib/setup
/etc/init.d/modloop stop
umount /dev/sda
mv /media/setup/* /media/sda/
mv /lib/setup/* /.modloop/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Paket-Repositories konfigurieren und benötige Pakete installieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;setup-apkrepos
apk update
apk add dosfstools e2fsprogs debootstrap cryptsetup nano gptfdisk partx btrfs-progs
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Festplatte partitionieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;gdisk /dev/sda
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3 drücken, damit gdisk eine neue GPT-Partitionstabelle erstellt.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Command (? for help): n
Partition number (1-128, default 1):
First sector (34-104857566, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-104857566, default = 104855551) or {+-}size{KMGTP}: +1024M
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to &amp;#39;Linux filesystem&amp;#39;
Press n to create the EFI partition. Make it 512MB and set it to EFI.

Command (? for help): n
Partition number (2-128, default 2):
First sector (34-104857566, default = 2099200) or {+-}size{KMGTP}:
Last sector (2099200-104857566, default = 104855551) or {+-}size{KMGTP}: +512M
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to &amp;#39;EFI system partition&amp;#39;
Press n to create the root file system partition. Make it use all available remaining disk space.

Command (? for help): n
Partition number (3-128, default 3):
First sector (34-104857566, default = 3147776) or {+-}size{KMGTP}:
Last sector (3147776-104857566, default = 104855551) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to &amp;#39;Linux filesystem&amp;#39;
Press p to display the partition table. It should give the following result:

Command (? for help): p
Disk /dev/sda: 104857600 sectors, 50.0 GiB
Model: BlockVolume
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 57C983BB-7A42-4B74-BD69-F9A0AEFD5199
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 104857566
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  8300  Linux filesystem
   2         2099200         3147775   512.0 MiB   EF00  EFI system partition
   3         3147776       104855551   48.5 GiB    8300  Linux filesystem
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mit &lt;code&gt;w&lt;/code&gt; speichern und beenden.&lt;/p&gt;
&lt;p&gt;Anschließend muss eine MBR-Partitionstabelle auf die Festplatte geschrieben.&lt;/p&gt;
&lt;p&gt;Dazu zunächst die alte MBR-Partitionstabelle löschen&amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;partx -v -d /dev/sda
partition: none, disk: /dev/sda, lower: 0, upper: 0
/dev/sda: partition #1 removed
/dev/sda: partition #2 removed
/dev/sda: partition #3 removed
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;hellip;und die neue schreiben:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;partx -v -a /dev/sda
partition: none, disk: /dev/sda, lower: 0, upper: 0
/dev/sda: partition table type &amp;#39;gpt&amp;#39; detected
range recount: max partno=3, lower=0, upper=0
/dev/sda: partition #1 added
/dev/sda: partition #2 added
/dev/sda: partition #3 added
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Alle Partitionen formatieren&amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkfs.ext4 /dev/sda1
mkfs.vfat /dev/sda2
mkfs.ext4 /dev/sda3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;hellip;und mounten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mount -t ext4 /dev/sda3 /mnt
mkdir /mnt/boot
mount -t ext4 /dev/sda1 /mnt/boot
mkdir /mnt/boot/efi
mount -t vfat /dev/sda2 /mnt/boot/efi
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Debian herunterladen und installieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir -p /mnt/var/tmp
chmod 1777 /mnt/var/tmp
debootstrap bookworm /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hostnamen konfigurieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo YOUR_PREFERRED_HOSTNAME &amp;gt; /mnt/etc/hostname

cat &amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; /mnt/etc/hosts
127.0.1.1 YOUR_PREFERRED_HOSTNAME.YOUR_DOMAIN YOUR_PREFERRED_HOSTNAME
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Netzwerk konfigurieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rm -rf /mnt/etc/network

cat &amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; /mnt/etc/systemd/network/ens3.network

[Match]
Name=ens3

[Network]
DHCP=yes
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Paketquellen konfigurieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cat  &amp;lt;&amp;lt;EOF &amp;gt; /mnt/etc/apt/sources.list
deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
#deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/ bookworm-security main contrib non-free non-free-firmware
#deb-src http://security.debian.org/ bookworm-security main contrib non-free non-free-firmware

# bookworm-updates, previously known as &amp;#39;volatile&amp;#39;
deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware
#deb-src http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware

# bookworm-backports, previously on backports.debian.org
deb http://deb.debian.org/debian/ bookworm-backports main contrib non-free non-free-firmware
#deb-src http://deb.debian.org/debian/ bookworm-backports main contrib non-free non-free-firmware
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In den root-Mountpoint chrooten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mount --rbind /dev /mnt/dev
mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
LANG=C chroot /mnt /bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Paketquellen und System updaten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt update
apt dist-upgrade -y
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Systemsprache konfigurieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt install locales -y
dpkg-reconfigure locales
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Zeitzone konfigurieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dpkg-reconfigure tzdata
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Und das Netzwerk konfigurieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt purge ifupdown

systemctl enable systemd-networkd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;/etc/fstab&lt;/code&gt; erstellen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/fstab
# /etc/fstab: static file system information.
#
# Use &amp;#39;blkid&amp;#39; to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# &amp;lt;file system&amp;gt; &amp;lt;mount point&amp;gt;   &amp;lt;type&amp;gt;  &amp;lt;options&amp;gt;       &amp;lt;dump&amp;gt;  &amp;lt;pass&amp;gt;
# / partition
EOF

echo UUID=$(blkid -s UUID -o value \
      /dev/mapper/luks1) \
      / ext4 defaults 0 2 &amp;gt;&amp;gt; /etc/fstab

cat &amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; /etc/fstab

# /boot partition
EOF

echo UUID=$(blkid -s UUID -o value \
      /dev/sda1) \
      /boot ext4 defaults 0 2 &amp;gt;&amp;gt; /etc/fstab

cat &amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; /etc/fstab

# UEFI /boot/efi partition (fat32)
EOF
echo PARTUUID=$(blkid -s PARTUUID -o value \
      /dev/sda2) \
      /boot/efi vfat defaults 0 1 &amp;gt;&amp;gt; /etc/fstab
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bootloader installieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt install -y grub-efi
grub-install --target=x86_64-efi --efi-directory=/boot/efi --recheck --no-floppy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die serielle Konsole im GRUB aktivieren, damit der Zugriff auf den Server über das Webportal noch geht:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; /etc/default/grub
GRUB_TERMINAL_INPUT=&amp;#34;console serial&amp;#34;
GRUB_TERMINAL_OUTPUT=&amp;#34;gfxterm serial&amp;#34;
GRUB_SERIAL_COMMAND=&amp;#34;serial --unit=0 --speed=115200&amp;#34;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;\${GRUB_CMDLINE_LINUX_DEFAULT} console=tty0 console=ttyS0,115200&amp;#34;
EOF
update-grub2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Den Kernel und benötigte Pakete installieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt install -y linux-image-amd64 ssh systemd-timesyncd haveged wget curl net-tools git gpg build-essential dosfstools qemu-guest-agent
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Und wieder den öffentlichen SSH-Schlüssel ablegen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir ~/.ssh
vi ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Und am Ende aufräumen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt --purge autoremove
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Danach in das Debian rebooten und genießen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;exit
reboot
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
    <item>
      <title>Hallo Welt!</title>
      <link>https://mortzu.de/posts/2025-06-18-hallo-welt/</link>
      <pubDate>Wed, 18 Jun 2025 13:23:00 +0200</pubDate>
      
      <guid>https://mortzu.de/posts/2025-06-18-hallo-welt/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://mortzu.de/assets/images/hello-world.png#floatleft&#34; alt=&#34;Zu sehen ist ein Computerbildschirm in einem dunklen Raum. Auf dem Computerbildschirm ist der Quellcode für ein Hello-World-Programm in Basic zu sehen.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Moin. Das ist der erste Post in diesem Blog.&lt;/p&gt;
&lt;p&gt;Ich bin mortzu oder &lt;a href=&#34;https://de.wikipedia.org/wiki/Momo_%28Roman%29&#34; target=&#34;_blank&#34;&gt;Momo&lt;/a&gt; (Das kleine Mädchen in mir hatte schon immer was gegen die grauen Herren, die ihr die Zeit stehlen wollten).
Ich arbeite an der &lt;a href=&#34;https://www.uni-bremen.de/&#34; target=&#34;_blank&#34;&gt;Uni-Bremen&lt;/a&gt; als Netzwerkadministrator.&lt;/p&gt;
&lt;p&gt;2012 hab ich den &lt;a href=&#34;https://www.hackerspace-bremen.de/&#34; target=&#34;_blank&#34;&gt;Hackerspace Bremen&lt;/a&gt; und 2013 das &lt;a href=&#34;https://bremen.freifunk.net/&#34; target=&#34;_blank&#34;&gt;„Freifunk Bremen“-Projekt&lt;/a&gt; mitgegründet.&lt;/p&gt;
&lt;p&gt;In diesem Blog erwartet euch ein bisschen Technik (Linux, Netzwerk, &amp;hellip;), ein bisschen Familienalltag und sehr wahrscheinlich auch Heimwerkerkrams.&lt;/p&gt;
&lt;p&gt;Zum technischen Aufbau: Das Blog ist ein &lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34;&gt;Hugoblog&lt;/a&gt;, was in einem Git auf &lt;a href=&#34;https://codeberg.org/&#34; target=&#34;_blank&#34;&gt;codeberg&lt;/a&gt; liegt.
Ich habe zuerst überlegt, ob ich das Blog mit einem CI baue. Aber irgendwie erschien mir das Overkill.
Also hab ich &lt;a href=&#34;https://codeberg.org/mortzu/hugo-webhook&#34; target=&#34;_blank&#34;&gt;hugo-webhook&lt;/a&gt; gebaut, was darauf wartet, dass der bei Codeberg hinterlegte Webhook angesprochen wird. Dann holt es sich das Git-Repository, baut das Blog
und rsynct das in den entsprechenden Ordner.&lt;/p&gt;
&lt;p&gt;Ich freu mich über Kontakte auf &lt;a href=&#34;https://codeberg.org/mortzu&#34; target=&#34;_blank&#34;&gt;codeberg&lt;/a&gt; oder &lt;a href=&#34;https://norden.social/@mortzu&#34; target=&#34;_blank&#34;&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
