<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.alpinelinux.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jchdel</id>
	<title>Alpine Linux - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.alpinelinux.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jchdel"/>
	<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/wiki/Special:Contributions/Jchdel"/>
	<updated>2026-04-30T22:45:43Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Vosk&amp;diff=30271</id>
		<title>Vosk</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Vosk&amp;diff=30271"/>
		<updated>2025-06-24T07:55:24Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: installing vosk and dependencies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document describes how to configure an vosk in Alpine Linux. &lt;br /&gt;
&lt;br /&gt;
== Installing vosk ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apk add py3-vosk-api \&lt;br /&gt;
    py3-cffi \&lt;br /&gt;
    vosk-model-small-en-us \&lt;br /&gt;
    ffmpeg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using vosk == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vosk-transcriber -i hello-world.mp3 \&lt;br /&gt;
		-o hello-world.txt --log-level WARN \&lt;br /&gt;
		-m /usr/share/vosk-models/small-en-us&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=30169</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=30169"/>
		<updated>2025-06-02T08:38:30Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hey,&lt;br /&gt;
&lt;br /&gt;
I&#039;m starting a journey in the voice assistant world.&lt;br /&gt;
&lt;br /&gt;
I will try [[vosk]] and [[ovos]]. Both are lacking a page in this wiki. I hope to be able to contribute some insights...&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* `apk add vosk-api` is not enough&lt;br /&gt;
* `apk add py3-vosk-api` is missing `py3-cfii` dependency&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
My PREVIOUS home/lab setup was&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86_64 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop) also in 64 bits&lt;br /&gt;
* a tower (16 cores x86_64, 128GB RAM) running Alpine, [[openVSwitch]] and [[qemu]]-kvm&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
&lt;br /&gt;
I plan to run a Xorg desktop headless in some KVM and remotely connect to it from the R-Pi as X station...&lt;br /&gt;
And to drive other dev and build boxes as KVM.&lt;br /&gt;
&lt;br /&gt;
What about https://github.com/e1z0/Framebuffer-browser on Alpine? I plan to give a try and maybe package it...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
set -x&lt;br /&gt;
# This script is intended to transform an Alpine Linux USB key running in &lt;br /&gt;
# diskless mode into a PXE boot server.&lt;br /&gt;
# It will run with a fixed IP 10.33.0.1 on eth0 acting as primary DHCP&lt;br /&gt;
# server.&lt;br /&gt;
# Only packages present in the local boot media will be available for &lt;br /&gt;
# booted boxes.&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
mount -o remount,rw /media/usb&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s do all downloads first!&lt;br /&gt;
sed -i -e &#039;/community/s/^#//&#039; -e &#039;/edge/d&#039; /etc/apk/repositories&lt;br /&gt;
apk update&lt;br /&gt;
apk add darkhttpd nfs-utils dnsmasq syslinux &lt;br /&gt;
&lt;br /&gt;
ALPINE=alpine-netboot-3.17.3-x86_64.tar.gz&lt;br /&gt;
[ -f $ALPINE ] || \&lt;br /&gt;
while true;do &lt;br /&gt;
	wget -c https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/$ALPINE \&lt;br /&gt;
		&amp;amp;&amp;amp; break&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
mkdir -p /media/usb/tftpboot/pxelinux/pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
# populate TFTP server&lt;br /&gt;
rm -fr /tmp/boot&lt;br /&gt;
tar xf alpine-netboot-3.17.3-x86_64.tar.gz -C /tmp&lt;br /&gt;
cp -r /tmp/boot/* /media/usb/tftpboot/pxelinux/&lt;br /&gt;
&lt;br /&gt;
# populate HTTP server&lt;br /&gt;
#cd /media/usb&lt;br /&gt;
# add default apkovl.tar.gz here&lt;br /&gt;
&lt;br /&gt;
# configure darkhttpd&lt;br /&gt;
sed -i -e &#039;s+/var/www/localhost/htdocs+/media/usb+&#039; /etc/init.d/darkhttpd&lt;br /&gt;
lbu add /etc/init.d/darkhttpd&lt;br /&gt;
&lt;br /&gt;
# populate NFS server&lt;br /&gt;
## implicit as we publish /media/usb&lt;br /&gt;
&lt;br /&gt;
# configure NFS for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/exports&lt;br /&gt;
# /etc/exports&lt;br /&gt;
#&lt;br /&gt;
# See exports(5) for a description.&lt;br /&gt;
&lt;br /&gt;
# use exportfs -arv to reread&lt;br /&gt;
/media/usb	*(ro,no_root_squash,no_subtree_check)&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# configure dnsmasq for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/dnsmasq.d/stamp.conf&lt;br /&gt;
# DNS related options&lt;br /&gt;
interface=eth0&lt;br /&gt;
listen-address=10.33.0.1&lt;br /&gt;
listen-address=127.0.0.1&lt;br /&gt;
## uplink resolver&lt;br /&gt;
server=1.1.1.1&lt;br /&gt;
# DHCP related options&lt;br /&gt;
dhcp-range=10.33.0.1,10.33.1.254,12h&lt;br /&gt;
## push router&lt;br /&gt;
dhcp-option=option:router,10.33.0.1&lt;br /&gt;
## push resolver&lt;br /&gt;
dhcp-option=6,10.33.0.1&lt;br /&gt;
# PXE (TFTP) related options&lt;br /&gt;
enable-tftp&lt;br /&gt;
dhcp-boot=pxelinux/pxelinux.0&lt;br /&gt;
tftp-root=/media/usb/tftpboot&lt;br /&gt;
EOF&lt;br /&gt;
cp /usr/share/syslinux/pxelinux.0 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cp /usr/share/syslinux/ldlinux.c32 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /media/usb/tftpboot/pxelinux/pxelinux.cfg/default&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 3&lt;br /&gt;
default alpine&lt;br /&gt;
LABEL alpine&lt;br /&gt;
LINUX vmlinuz-lts&lt;br /&gt;
INITRD pxerd&lt;br /&gt;
APPEND ip=dhcp alpine_dev=nfs:10.33.0.1:/media/usb/boot modloop=http://10.33.0.1/boot/modloop-lts nomodeset apkovl=http://10.33.0.1/stamp/default.apkovl.tar.gz alpine_repo=http://10.33.0.1/apks&lt;br /&gt;
EOF&lt;br /&gt;
# generate initramfs for PXE&lt;br /&gt;
if [ ! -f /media/usb/tftpboot/pxelinux/pxerd ];then&lt;br /&gt;
  cd /etc/mkinitfs/features.d/&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/virtio_net.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/ethernet/e1000/*.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;/usr/share/udhcpc/default.script&amp;quot; &amp;gt; dhcp.files&lt;br /&gt;
  echo &amp;quot;kernel/net/packet/af_packet.ko&amp;quot; &amp;gt; dhcp.modules&lt;br /&gt;
  echo &amp;quot;kernel/fs/nfs/*&amp;quot; &amp;gt; nfs.modules&lt;br /&gt;
  cd /etc/mkinitfs/&lt;br /&gt;
  echo &#039;features=&amp;quot;ata base bootchart cdrom cramfs ext2 ext3 ext4 xfs floppy keymap kms raid scsi usb virtio squashfs network dhcp nfs&amp;quot;&#039; &amp;gt; mkinitfs.conf&lt;br /&gt;
  mkinitfs -o /media/usb/tftpboot/pxelinux/pxerd&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# console welcome message&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/motd&lt;br /&gt;
&lt;br /&gt;
This a PXE server intended to deploy a fleet of diskless Alpine Linux.&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/network/interfaces&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 10.33.0.1&lt;br /&gt;
	netmask 255.255.0.0&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# force install from cache at reboot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/local.d/fix.start&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
apk add darkhttpd&lt;br /&gt;
service darkhttpd start&lt;br /&gt;
EOF&lt;br /&gt;
chmod +x /etc/local.d/fix.start&lt;br /&gt;
&lt;br /&gt;
# enable services at reboot&lt;br /&gt;
rc-update add local&lt;br /&gt;
rc-update add darkhttpd&lt;br /&gt;
rc-update add nfs&lt;br /&gt;
rc-update add dnsmasq&lt;br /&gt;
&lt;br /&gt;
# persist changes&lt;br /&gt;
sync&lt;br /&gt;
apk cache -v sync&lt;br /&gt;
mount -o remount,ro /media/usb&lt;br /&gt;
lbu ci&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Press &#039;Enter&#039; to reboot and act as PXE boot server&amp;quot;&lt;br /&gt;
echo &amp;quot;or &#039;ctrl-c&#039; to go back to the terminal...&amp;quot;&lt;br /&gt;
read&lt;br /&gt;
&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=30168</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=30168"/>
		<updated>2025-06-02T07:55:03Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hey,&lt;br /&gt;
&lt;br /&gt;
I&#039;m starting a journey in the voice assistant world.&lt;br /&gt;
&lt;br /&gt;
I will try [[vosk]] and [[ovos]]. Both are lacking a page in this wiki. I hope to be able to contribute some insights...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
My PREVIOUS home/lab setup was&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86_64 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop) also in 64 bits&lt;br /&gt;
* a tower (16 cores x86_64, 128GB RAM) running Alpine, [[openVSwitch]] and [[qemu]]-kvm&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
&lt;br /&gt;
I plan to run a Xorg desktop headless in some KVM and remotely connect to it from the R-Pi as X station...&lt;br /&gt;
And to drive other dev and build boxes as KVM.&lt;br /&gt;
&lt;br /&gt;
What about https://github.com/e1z0/Framebuffer-browser on Alpine? I plan to give a try and maybe package it...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
set -x&lt;br /&gt;
# This script is intended to transform an Alpine Linux USB key running in &lt;br /&gt;
# diskless mode into a PXE boot server.&lt;br /&gt;
# It will run with a fixed IP 10.33.0.1 on eth0 acting as primary DHCP&lt;br /&gt;
# server.&lt;br /&gt;
# Only packages present in the local boot media will be available for &lt;br /&gt;
# booted boxes.&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
mount -o remount,rw /media/usb&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s do all downloads first!&lt;br /&gt;
sed -i -e &#039;/community/s/^#//&#039; -e &#039;/edge/d&#039; /etc/apk/repositories&lt;br /&gt;
apk update&lt;br /&gt;
apk add darkhttpd nfs-utils dnsmasq syslinux &lt;br /&gt;
&lt;br /&gt;
ALPINE=alpine-netboot-3.17.3-x86_64.tar.gz&lt;br /&gt;
[ -f $ALPINE ] || \&lt;br /&gt;
while true;do &lt;br /&gt;
	wget -c https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/$ALPINE \&lt;br /&gt;
		&amp;amp;&amp;amp; break&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
mkdir -p /media/usb/tftpboot/pxelinux/pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
# populate TFTP server&lt;br /&gt;
rm -fr /tmp/boot&lt;br /&gt;
tar xf alpine-netboot-3.17.3-x86_64.tar.gz -C /tmp&lt;br /&gt;
cp -r /tmp/boot/* /media/usb/tftpboot/pxelinux/&lt;br /&gt;
&lt;br /&gt;
# populate HTTP server&lt;br /&gt;
#cd /media/usb&lt;br /&gt;
# add default apkovl.tar.gz here&lt;br /&gt;
&lt;br /&gt;
# configure darkhttpd&lt;br /&gt;
sed -i -e &#039;s+/var/www/localhost/htdocs+/media/usb+&#039; /etc/init.d/darkhttpd&lt;br /&gt;
lbu add /etc/init.d/darkhttpd&lt;br /&gt;
&lt;br /&gt;
# populate NFS server&lt;br /&gt;
## implicit as we publish /media/usb&lt;br /&gt;
&lt;br /&gt;
# configure NFS for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/exports&lt;br /&gt;
# /etc/exports&lt;br /&gt;
#&lt;br /&gt;
# See exports(5) for a description.&lt;br /&gt;
&lt;br /&gt;
# use exportfs -arv to reread&lt;br /&gt;
/media/usb	*(ro,no_root_squash,no_subtree_check)&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# configure dnsmasq for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/dnsmasq.d/stamp.conf&lt;br /&gt;
# DNS related options&lt;br /&gt;
interface=eth0&lt;br /&gt;
listen-address=10.33.0.1&lt;br /&gt;
listen-address=127.0.0.1&lt;br /&gt;
## uplink resolver&lt;br /&gt;
server=1.1.1.1&lt;br /&gt;
# DHCP related options&lt;br /&gt;
dhcp-range=10.33.0.1,10.33.1.254,12h&lt;br /&gt;
## push router&lt;br /&gt;
dhcp-option=option:router,10.33.0.1&lt;br /&gt;
## push resolver&lt;br /&gt;
dhcp-option=6,10.33.0.1&lt;br /&gt;
# PXE (TFTP) related options&lt;br /&gt;
enable-tftp&lt;br /&gt;
dhcp-boot=pxelinux/pxelinux.0&lt;br /&gt;
tftp-root=/media/usb/tftpboot&lt;br /&gt;
EOF&lt;br /&gt;
cp /usr/share/syslinux/pxelinux.0 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cp /usr/share/syslinux/ldlinux.c32 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /media/usb/tftpboot/pxelinux/pxelinux.cfg/default&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 3&lt;br /&gt;
default alpine&lt;br /&gt;
LABEL alpine&lt;br /&gt;
LINUX vmlinuz-lts&lt;br /&gt;
INITRD pxerd&lt;br /&gt;
APPEND ip=dhcp alpine_dev=nfs:10.33.0.1:/media/usb/boot modloop=http://10.33.0.1/boot/modloop-lts nomodeset apkovl=http://10.33.0.1/stamp/default.apkovl.tar.gz alpine_repo=http://10.33.0.1/apks&lt;br /&gt;
EOF&lt;br /&gt;
# generate initramfs for PXE&lt;br /&gt;
if [ ! -f /media/usb/tftpboot/pxelinux/pxerd ];then&lt;br /&gt;
  cd /etc/mkinitfs/features.d/&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/virtio_net.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/ethernet/e1000/*.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;/usr/share/udhcpc/default.script&amp;quot; &amp;gt; dhcp.files&lt;br /&gt;
  echo &amp;quot;kernel/net/packet/af_packet.ko&amp;quot; &amp;gt; dhcp.modules&lt;br /&gt;
  echo &amp;quot;kernel/fs/nfs/*&amp;quot; &amp;gt; nfs.modules&lt;br /&gt;
  cd /etc/mkinitfs/&lt;br /&gt;
  echo &#039;features=&amp;quot;ata base bootchart cdrom cramfs ext2 ext3 ext4 xfs floppy keymap kms raid scsi usb virtio squashfs network dhcp nfs&amp;quot;&#039; &amp;gt; mkinitfs.conf&lt;br /&gt;
  mkinitfs -o /media/usb/tftpboot/pxelinux/pxerd&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# console welcome message&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/motd&lt;br /&gt;
&lt;br /&gt;
This a PXE server intended to deploy a fleet of diskless Alpine Linux.&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/network/interfaces&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 10.33.0.1&lt;br /&gt;
	netmask 255.255.0.0&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# force install from cache at reboot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/local.d/fix.start&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
apk add darkhttpd&lt;br /&gt;
service darkhttpd start&lt;br /&gt;
EOF&lt;br /&gt;
chmod +x /etc/local.d/fix.start&lt;br /&gt;
&lt;br /&gt;
# enable services at reboot&lt;br /&gt;
rc-update add local&lt;br /&gt;
rc-update add darkhttpd&lt;br /&gt;
rc-update add nfs&lt;br /&gt;
rc-update add dnsmasq&lt;br /&gt;
&lt;br /&gt;
# persist changes&lt;br /&gt;
sync&lt;br /&gt;
apk cache -v sync&lt;br /&gt;
mount -o remount,ro /media/usb&lt;br /&gt;
lbu ci&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Press &#039;Enter&#039; to reboot and act as PXE boot server&amp;quot;&lt;br /&gt;
echo &amp;quot;or &#039;ctrl-c&#039; to go back to the terminal...&amp;quot;&lt;br /&gt;
read&lt;br /&gt;
&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Configure_OpenLDAP&amp;diff=29688</id>
		<title>Configure OpenLDAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Configure_OpenLDAP&amp;diff=29688"/>
		<updated>2025-04-17T06:16:17Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: not needed anymore (at least in v3.21)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lightweight Directory Access Protocol (LDAP) is often employed as an authentication mechanism, providing a common username and password across many different applications. This tutorial shows how to install and configure the OpenLDAP package on Alpine Linux.&lt;br /&gt;
&lt;br /&gt;
== Installing Packages ==&lt;br /&gt;
&lt;br /&gt;
There is an Alpine package for OpenLDAP. However, simply adding the openldap apk is not enough to get you up and running. You&#039;ll also need to install a backend database and some LDAP command-line tools.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s how:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# apk add openldap openldap-back-mdb openldap-clients}}&lt;br /&gt;
&lt;br /&gt;
But, before you start up the slapd service and go, there&#039;s a bit of configuration to do.&lt;br /&gt;
&lt;br /&gt;
== Customizing Configuration for OpenLDAP 2.3+ ==&lt;br /&gt;
&lt;br /&gt;
The Alpine OpenLDAP package can use either a configuration directory (slapd.d) or a configuration file (slapd.conf). Since OpenLDAP version 2.3, the preferred method is to use the slapd.d configuration directory. Any official OpenLDAP documentation, including their [https://www.openldap.org/doc/admin26/quickstart.html quickstart guide], will use this configuration method.&lt;br /&gt;
&lt;br /&gt;
First, create the slapd.d directory with the proper ownership and permissions.&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# install -m 755 -o ldap -g ldap -d /etc/openldap/slapd.d}}&lt;br /&gt;
&lt;br /&gt;
Next, edit the slapd startup configuration to use the directory instead of the file.&lt;br /&gt;
&lt;br /&gt;
# Open up &amp;lt;code&amp;gt;/etc/conf.d/slapd&amp;lt;/code&amp;gt; in your favorite editor&lt;br /&gt;
# Comment out &amp;lt;code&amp;gt;cfgfile=&amp;quot;/etc/openldap/slapd.conf&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Uncomment &amp;lt;code&amp;gt;cfgdir=&amp;quot;/etc/openldap/slapd.d&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, get rid of the included slapd.conf file.&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# rm /etc/openldap/slapd.conf}}&lt;br /&gt;
&lt;br /&gt;
== Updating Shared Libraries File Names ==&lt;br /&gt;
&lt;br /&gt;
Open up &amp;lt;code&amp;gt;/etc/openldap/slapd.ldif&amp;lt;/code&amp;gt; in your favorite editor. Search for the file names ending with &amp;lt;code&amp;gt;.la&amp;lt;/code&amp;gt; and change the extension to &amp;lt;code&amp;gt;.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Customizing Configuration for Your Domain ==&lt;br /&gt;
&lt;br /&gt;
Your LDAP domain can be the same as your DNS domain or it can be completely different. Whatever you choose, be sure to use the LDAP naming convention of &amp;lt;code&amp;gt;dc=domain,dc=tld&amp;lt;/code&amp;gt; rather than the dot separated DNS style of &amp;lt;code&amp;gt;domain.tld&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Edit slapd.ldif again.&lt;br /&gt;
# Find the &amp;lt;code&amp;gt;olcSuffix:&amp;lt;/code&amp;gt; keyword.&lt;br /&gt;
# Change the value to match your domain&lt;br /&gt;
# Find &amp;lt;code&amp;gt;olcRootDN:&amp;lt;/code&amp;gt;&lt;br /&gt;
# Change the value to match your domain&lt;br /&gt;
&lt;br /&gt;
Later, this document will assume the domain is &amp;lt;code&amp;gt;dc=home&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dc=contoso,dc=com&amp;lt;/code&amp;gt;, reflecting a domain of &amp;lt;code&amp;gt;home&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;contoso.com&amp;lt;/code&amp;gt; respectively.&lt;br /&gt;
&lt;br /&gt;
== Importing the Configuration ==&lt;br /&gt;
&lt;br /&gt;
Verify slapd.ldif one last time and use the &amp;lt;code&amp;gt;slapadd&amp;lt;/code&amp;gt; command to import it into the backend database.&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# slapadd -n 0 -F /etc/openldap/slapd.d -l /etc/openldap/slapd.ldif}}&lt;br /&gt;
&lt;br /&gt;
There should be no errors, only a &amp;quot;Closing DB...&amp;quot; message.&lt;br /&gt;
&lt;br /&gt;
Next, change ownership on the resulting files in &amp;lt;code&amp;gt;/etc/openldap/slapd.d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you skip this step, the slapd service will refuse to start.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# chown -R ldap:ldap /etc/openldap/slapd.d/*}}&lt;br /&gt;
&lt;br /&gt;
== Configuring the slapd Service ==&lt;br /&gt;
&lt;br /&gt;
The pid directory is missing. We&#039;ll need to create it or the service won&#039;t start, so this needs to be done first.&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# install -m 755 -o ldap -g ldap -d /var/lib/openldap/run}}&lt;br /&gt;
&lt;br /&gt;
Next, you can start the service and enable it at boot.&lt;br /&gt;
&lt;br /&gt;
{{Cmd|# rc-service slapd start&lt;br /&gt;
&amp;amp;#35; rc-update add slapd}}&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
The OpenLDAP quickstart guide uses the &amp;lt;code&amp;gt;ldapsearch&amp;lt;/code&amp;gt; utility to test the configuration.&lt;br /&gt;
&lt;br /&gt;
{{Cmd|$ ldapsearch -x -b &amp;quot;&amp;quot; -s base &#039;(objectclass{{=}}*)&#039; namingContexts}}&lt;br /&gt;
&lt;br /&gt;
You should see your domain.&lt;br /&gt;
&lt;br /&gt;
You can also test with &amp;lt;code&amp;gt;slapcat&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|$ slapcat -n 0}}&lt;br /&gt;
&lt;br /&gt;
This will dump the entire config database in LDIF format. You can also pipe to grep and specify your domain name to verify everything looks correct. When using grep, remember LDAP uses the format dc=domain,dc=com and not the more familiar domain.com.&lt;br /&gt;
&lt;br /&gt;
Later, when you begin populating your LDAP database, you can use &amp;lt;code&amp;gt;slapcat -n 1&amp;lt;/code&amp;gt; to see your information. (Zero is the config database. Numbers above zero are user-defined databases.)&lt;br /&gt;
&lt;br /&gt;
Finally, you can run &amp;lt;code&amp;gt;netstat -tln&amp;lt;/code&amp;gt; and look for LDAP port 389 in the output.&lt;br /&gt;
&lt;br /&gt;
== Scripted Installation ==&lt;br /&gt;
&lt;br /&gt;
If you want to automate the steps above, use the following script. Be sure to adjust the DOMAIN value to fit your needs.&lt;br /&gt;
&lt;br /&gt;
  export DOMAIN=&amp;quot;dc=home&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  echo &amp;quot;Installing packages...&amp;quot;&lt;br /&gt;
  apk add openldap openldap-back-mdb openldap-clients&lt;br /&gt;
  &lt;br /&gt;
  echo &amp;quot;Configuring for v2.3+ style slapd.d config directory...&amp;quot;&lt;br /&gt;
  install -m 755 -o ldap -g ldap -d /etc/openldap/slapd.d&lt;br /&gt;
  sed -i~ \&lt;br /&gt;
    -e &#039;s/^cfgfile=/#cfgfile=/&#039; \&lt;br /&gt;
    -e &#039;s/^#cfgdir=.*/cfgdir=\&amp;quot;\/etc\/openldap\/slapd.d\&amp;quot;/&#039; \&lt;br /&gt;
    /etc/conf.d/slapd&lt;br /&gt;
  rm /etc/openldap/slapd.conf&lt;br /&gt;
  &lt;br /&gt;
  echo &amp;quot;Customizing for domain: ${DOMAIN}...&amp;quot;&lt;br /&gt;
  sed -i~ \&lt;br /&gt;
    -e &#039;s/\.la$/.so/&#039; \&lt;br /&gt;
    -e &amp;quot;s/dc=my-domain,dc=com/${DOMAIN}/&amp;quot; /etc/openldap/slapd.ldif&lt;br /&gt;
  &lt;br /&gt;
  echo &amp;quot;Importing configuration...&amp;quot;&lt;br /&gt;
  slapadd -n 0 -F /etc/openldap/slapd.d -l /etc/openldap/slapd.ldif&lt;br /&gt;
  chown -R ldap:ldap /etc/openldap/slapd.d/*&lt;br /&gt;
  &lt;br /&gt;
  echo &amp;quot;Configuring slapd service...&amp;quot;&lt;br /&gt;
  install -m 755 -o ldap -g ldap -d /var/lib/openldap/run&lt;br /&gt;
  service slapd start&lt;br /&gt;
  rc-update add slapd&lt;br /&gt;
&lt;br /&gt;
== Creating an Organizational Structure ==&lt;br /&gt;
&lt;br /&gt;
Now that the installation is done, you can start using your LDAP database. At a minimum, you&#039;ll need to create an organization within your LDAP directory. This is covered as step 11 in the OpenLDAP [https://openldap.org/doc/admin26/quickstart.html quickstart] document.&lt;br /&gt;
&lt;br /&gt;
Here is an example using the contoso.com domain as the organization and &amp;lt;code&amp;gt;home&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;dc=home&amp;lt;/code&amp;gt; as the base DN (update the baseDN if yours differs):&lt;br /&gt;
&lt;br /&gt;
  cat &amp;lt;&amp;lt;EOF &amp;gt;org.ldif&lt;br /&gt;
  dn: dc=contoso,dc=com&lt;br /&gt;
  objectclass: dcObject&lt;br /&gt;
  objectclass: organization&lt;br /&gt;
  o: Fictional Company&lt;br /&gt;
  dc: contoso&lt;br /&gt;
  &lt;br /&gt;
  dn: cn=Manager,dc=contoso,dc=com&lt;br /&gt;
  objectclass: organizationalRole&lt;br /&gt;
  cn: Manager&lt;br /&gt;
  EOF&lt;br /&gt;
  &lt;br /&gt;
  ldapadd -x -D &amp;quot;cn=Manager,dc=home&amp;quot; -w secret -f org.ldif&lt;br /&gt;
&lt;br /&gt;
You may also want to create organizational units (OUs) to help keep your directory tidy.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s an LDIF to create &#039;&#039;People&#039;&#039; and &#039;&#039;Groups&#039;&#039; as OUs:&lt;br /&gt;
&lt;br /&gt;
  # Organizational unit for users&lt;br /&gt;
  dn: ou=People,dc=home&lt;br /&gt;
  changetype: add&lt;br /&gt;
  objectClass: organizationalUnit&lt;br /&gt;
  ou: People&lt;br /&gt;
  &lt;br /&gt;
  # Organizational unit for groups.&lt;br /&gt;
  dn: ou=Groups,dc=home&lt;br /&gt;
  changetype: add&lt;br /&gt;
  objectClass: organizationalUnit&lt;br /&gt;
  ou: Groups&lt;br /&gt;
&lt;br /&gt;
Import the OUs with an ldapadd command similar to the one used to create the organization.&lt;br /&gt;
&lt;br /&gt;
Now that this is done, you&#039;re ready to connect to the LDAP server with the administration tool of your choice and begin populating users, groups, etc. [http://ldapadmin.org/ LDAPAdmin]{{insecure url|TLS cert invalid}}  is an oldie, but a goodie for Windows users.&lt;br /&gt;
&lt;br /&gt;
== Next Steps ==&lt;br /&gt;
&lt;br /&gt;
The configuration presented here does not include provisions for TLS (encrypted) communication. It should not be used on an untrusted network. Refer to the official OpenLDAP docs  for instructions on setting up encrypted LDAP connections.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* [https://openldap.org/doc/admin26/quickstart.html OpenLDAP Software 2.6 Administrator&#039;s Guide: A Quick-Start Guide]&lt;br /&gt;
* [https://stackoverflow.com/questions/72132704/did-i-import-inetorgperson-schema-correctly-for-openldap-on-alpine-linux/ ldap - Did I import inetOrgPerson schema correctly for OpenLDAP on Alpine Linux? - Stack Overflow]&lt;br /&gt;
&lt;br /&gt;
[[Category:Networking]]&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23619</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23619"/>
		<updated>2023-05-30T12:39:40Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86_64 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop) also in 64 bits&lt;br /&gt;
* a tower (16 cores x86_64, 128GB RAM) running Alpine, [[openVSwitch]] and [[qemu]]-kvm&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
&lt;br /&gt;
I plan to run a Xorg desktop headless in some KVM and remotely connect to it from the R-Pi as X station...&lt;br /&gt;
And to drive other dev and build boxes as KVM.&lt;br /&gt;
&lt;br /&gt;
What about https://github.com/e1z0/Framebuffer-browser on Alpine? I plan to give a try and maybe package it...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
set -x&lt;br /&gt;
# This script is intended to transform an Alpine Linux USB key running in &lt;br /&gt;
# diskless mode into a PXE boot server.&lt;br /&gt;
# It will run with a fixed IP 10.33.0.1 on eth0 acting as primary DHCP&lt;br /&gt;
# server.&lt;br /&gt;
# Only packages present in the local boot media will be available for &lt;br /&gt;
# booted boxes.&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
mount -o remount,rw /media/usb&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s do all downloads first!&lt;br /&gt;
sed -i -e &#039;/community/s/^#//&#039; -e &#039;/edge/d&#039; /etc/apk/repositories&lt;br /&gt;
apk update&lt;br /&gt;
apk add darkhttpd nfs-utils dnsmasq syslinux &lt;br /&gt;
&lt;br /&gt;
ALPINE=alpine-netboot-3.17.3-x86_64.tar.gz&lt;br /&gt;
[ -f $ALPINE ] || \&lt;br /&gt;
while true;do &lt;br /&gt;
	wget -c https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/$ALPINE \&lt;br /&gt;
		&amp;amp;&amp;amp; break&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
mkdir -p /media/usb/tftpboot/pxelinux/pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
# populate TFTP server&lt;br /&gt;
rm -fr /tmp/boot&lt;br /&gt;
tar xf alpine-netboot-3.17.3-x86_64.tar.gz -C /tmp&lt;br /&gt;
cp -r /tmp/boot/* /media/usb/tftpboot/pxelinux/&lt;br /&gt;
&lt;br /&gt;
# populate HTTP server&lt;br /&gt;
#cd /media/usb&lt;br /&gt;
# add default apkovl.tar.gz here&lt;br /&gt;
&lt;br /&gt;
# configure darkhttpd&lt;br /&gt;
sed -i -e &#039;s+/var/www/localhost/htdocs+/media/usb+&#039; /etc/init.d/darkhttpd&lt;br /&gt;
lbu add /etc/init.d/darkhttpd&lt;br /&gt;
&lt;br /&gt;
# populate NFS server&lt;br /&gt;
## implicit as we publish /media/usb&lt;br /&gt;
&lt;br /&gt;
# configure NFS for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/exports&lt;br /&gt;
# /etc/exports&lt;br /&gt;
#&lt;br /&gt;
# See exports(5) for a description.&lt;br /&gt;
&lt;br /&gt;
# use exportfs -arv to reread&lt;br /&gt;
/media/usb	*(ro,no_root_squash,no_subtree_check)&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# configure dnsmasq for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/dnsmasq.d/stamp.conf&lt;br /&gt;
# DNS related options&lt;br /&gt;
interface=eth0&lt;br /&gt;
listen-address=10.33.0.1&lt;br /&gt;
listen-address=127.0.0.1&lt;br /&gt;
## uplink resolver&lt;br /&gt;
server=1.1.1.1&lt;br /&gt;
# DHCP related options&lt;br /&gt;
dhcp-range=10.33.0.1,10.33.1.254,12h&lt;br /&gt;
## push router&lt;br /&gt;
dhcp-option=option:router,10.33.0.1&lt;br /&gt;
## push resolver&lt;br /&gt;
dhcp-option=6,10.33.0.1&lt;br /&gt;
# PXE (TFTP) related options&lt;br /&gt;
enable-tftp&lt;br /&gt;
dhcp-boot=pxelinux/pxelinux.0&lt;br /&gt;
tftp-root=/media/usb/tftpboot&lt;br /&gt;
EOF&lt;br /&gt;
cp /usr/share/syslinux/pxelinux.0 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cp /usr/share/syslinux/ldlinux.c32 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /media/usb/tftpboot/pxelinux/pxelinux.cfg/default&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 3&lt;br /&gt;
default alpine&lt;br /&gt;
LABEL alpine&lt;br /&gt;
LINUX vmlinuz-lts&lt;br /&gt;
INITRD pxerd&lt;br /&gt;
APPEND ip=dhcp alpine_dev=nfs:10.33.0.1:/media/usb/boot modloop=http://10.33.0.1/boot/modloop-lts nomodeset apkovl=http://10.33.0.1/stamp/default.apkovl.tar.gz alpine_repo=http://10.33.0.1/apks&lt;br /&gt;
EOF&lt;br /&gt;
# generate initramfs for PXE&lt;br /&gt;
if [ ! -f /media/usb/tftpboot/pxelinux/pxerd ];then&lt;br /&gt;
  cd /etc/mkinitfs/features.d/&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/virtio_net.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/ethernet/e1000/*.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;/usr/share/udhcpc/default.script&amp;quot; &amp;gt; dhcp.files&lt;br /&gt;
  echo &amp;quot;kernel/net/packet/af_packet.ko&amp;quot; &amp;gt; dhcp.modules&lt;br /&gt;
  echo &amp;quot;kernel/fs/nfs/*&amp;quot; &amp;gt; nfs.modules&lt;br /&gt;
  cd /etc/mkinitfs/&lt;br /&gt;
  echo &#039;features=&amp;quot;ata base bootchart cdrom cramfs ext2 ext3 ext4 xfs floppy keymap kms raid scsi usb virtio squashfs network dhcp nfs&amp;quot;&#039; &amp;gt; mkinitfs.conf&lt;br /&gt;
  mkinitfs -o /media/usb/tftpboot/pxelinux/pxerd&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# console welcome message&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/motd&lt;br /&gt;
&lt;br /&gt;
This a PXE server intended to deploy a fleet of diskless Alpine Linux.&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/network/interfaces&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 10.33.0.1&lt;br /&gt;
	netmask 255.255.0.0&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# force install from cache at reboot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/local.d/fix.start&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
apk add darkhttpd&lt;br /&gt;
service darkhttpd start&lt;br /&gt;
EOF&lt;br /&gt;
chmod +x /etc/local.d/fix.start&lt;br /&gt;
&lt;br /&gt;
# enable services at reboot&lt;br /&gt;
rc-update add local&lt;br /&gt;
rc-update add darkhttpd&lt;br /&gt;
rc-update add nfs&lt;br /&gt;
rc-update add dnsmasq&lt;br /&gt;
&lt;br /&gt;
# persist changes&lt;br /&gt;
sync&lt;br /&gt;
apk cache -v sync&lt;br /&gt;
mount -o remount,ro /media/usb&lt;br /&gt;
lbu ci&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Press &#039;Enter&#039; to reboot and act as PXE boot server&amp;quot;&lt;br /&gt;
echo &amp;quot;or &#039;ctrl-c&#039; to go back to the terminal...&amp;quot;&lt;br /&gt;
read&lt;br /&gt;
&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23540</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23540"/>
		<updated>2023-05-29T14:18:42Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86_64 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop) also in 64 bits&lt;br /&gt;
* a tower (16 cores x86_64, 128GB RAM) running Alpine, [[openVSwitch]] and [[qemu]]-kvm&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
&lt;br /&gt;
I plan to run a Xorg desktop headless in some KVM and remotely connect to it from the R-Pi as X station...&lt;br /&gt;
And to drive other dev and build boxes as KVM.&lt;br /&gt;
&lt;br /&gt;
What about https://github.com/e1z0/Framebuffer-browser on Alpine? I plan to give a try and maybe package it...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
set -x&lt;br /&gt;
# This script is intended to transform an Alpine Linux USB key running in &lt;br /&gt;
# diskless mode into a PXE boot server.&lt;br /&gt;
# It will run with a fixed IP 10.33.0.1 on eth0 acting as primary DHCP&lt;br /&gt;
# server.&lt;br /&gt;
# Only packages present in the local boot media will be available for &lt;br /&gt;
# booted boxes.&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
mount -o remount,rw /media/usb&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s do all downloads first!&lt;br /&gt;
sed -i -e &#039;/community/s/^#//&#039; -e &#039;/edge/d&#039; /etc/apk/repositories&lt;br /&gt;
apk update&lt;br /&gt;
apk add abuild&lt;br /&gt;
&lt;br /&gt;
cd /media/usb/apks/x86_64&lt;br /&gt;
LIST_OF_PACKAGES=&amp;quot;aardvark-dns&lt;br /&gt;
abuild&lt;br /&gt;
acct&lt;br /&gt;
acct-openrc&lt;br /&gt;
alpine-base&lt;br /&gt;
alpine-baselayout&lt;br /&gt;
alpine-baselayout-data&lt;br /&gt;
alpine-conf&lt;br /&gt;
alpine-keys&lt;br /&gt;
alpine-release&lt;br /&gt;
apk-tools&lt;br /&gt;
argon2-libs&lt;br /&gt;
attr&lt;br /&gt;
bash&lt;br /&gt;
blkid&lt;br /&gt;
brotli-libs&lt;br /&gt;
busybox&lt;br /&gt;
busybox-binsh&lt;br /&gt;
busybox-mdev-openrc&lt;br /&gt;
busybox-openrc&lt;br /&gt;
busybox-suid&lt;br /&gt;
ca-certificates&lt;br /&gt;
ca-certificates-bundle&lt;br /&gt;
catatonit&lt;br /&gt;
conmon&lt;br /&gt;
containers-common&lt;br /&gt;
crun&lt;br /&gt;
cryptsetup-libs&lt;br /&gt;
curl&lt;br /&gt;
darkhttpd&lt;br /&gt;
device-mapper-libs&lt;br /&gt;
e2fsprogs&lt;br /&gt;
e2fsprogs-libs&lt;br /&gt;
fakeroot&lt;br /&gt;
fuse-common&lt;br /&gt;
fuse-openrc&lt;br /&gt;
fuse-overlayfs&lt;br /&gt;
fuse3&lt;br /&gt;
fuse3-libs&lt;br /&gt;
glib&lt;br /&gt;
gnupg-gpgconf&lt;br /&gt;
gpg&lt;br /&gt;
gpg-agent&lt;br /&gt;
gpgme&lt;br /&gt;
gpgsm&lt;br /&gt;
ifupdown-ng&lt;br /&gt;
ip6tables&lt;br /&gt;
ip6tables-openrc&lt;br /&gt;
iptables&lt;br /&gt;
iptables-openrc&lt;br /&gt;
json-c&lt;br /&gt;
kmod&lt;br /&gt;
kmod-libs&lt;br /&gt;
kmod-openrc&lt;br /&gt;
lddtree&lt;br /&gt;
libacl&lt;br /&gt;
libassuan&lt;br /&gt;
libblkid&lt;br /&gt;
libbz2&lt;br /&gt;
libc-utils&lt;br /&gt;
libcap2&lt;br /&gt;
libcom_err&lt;br /&gt;
libcrypto3&lt;br /&gt;
libcurl&lt;br /&gt;
libedit&lt;br /&gt;
libevent&lt;br /&gt;
libffi&lt;br /&gt;
libgcc&lt;br /&gt;
libgcrypt&lt;br /&gt;
libgpg-error&lt;br /&gt;
libintl&lt;br /&gt;
libksba&lt;br /&gt;
libmnl&lt;br /&gt;
libmount&lt;br /&gt;
libnftnl&lt;br /&gt;
libseccomp&lt;br /&gt;
libslirp&lt;br /&gt;
libssl3&lt;br /&gt;
libuuid&lt;br /&gt;
linux-firmware-none&lt;br /&gt;
linux-lts&lt;br /&gt;
linux-pam&lt;br /&gt;
lzip&lt;br /&gt;
lz4-libs&lt;br /&gt;
mdev-conf&lt;br /&gt;
mkinitfs&lt;br /&gt;
mtools&lt;br /&gt;
musl&lt;br /&gt;
musl-utils&lt;br /&gt;
ncurses-libs&lt;br /&gt;
ncurses-terminfo-base&lt;br /&gt;
netavark&lt;br /&gt;
nghttp2-libs&lt;br /&gt;
npth&lt;br /&gt;
openrc&lt;br /&gt;
openssh&lt;br /&gt;
openssh-client-common&lt;br /&gt;
openssh-client-default&lt;br /&gt;
openssh-keygen&lt;br /&gt;
openssh-server&lt;br /&gt;
openssh-server-common&lt;br /&gt;
openssh-sftp-server&lt;br /&gt;
openssl&lt;br /&gt;
patch&lt;br /&gt;
pcre2&lt;br /&gt;
pkgconf&lt;br /&gt;
pinentry&lt;br /&gt;
podman&lt;br /&gt;
podman-openrc&lt;br /&gt;
popt&lt;br /&gt;
readline&lt;br /&gt;
rsync&lt;br /&gt;
rsync-openrc&lt;br /&gt;
scanelf&lt;br /&gt;
shadow-libs&lt;br /&gt;
shadow-subids&lt;br /&gt;
slirp4netns&lt;br /&gt;
sqlite-libs&lt;br /&gt;
ssl_client&lt;br /&gt;
syslinux&lt;br /&gt;
tar&lt;br /&gt;
tmux&lt;br /&gt;
vim&lt;br /&gt;
xxd&lt;br /&gt;
xz-libs&lt;br /&gt;
yajl&lt;br /&gt;
zlib&lt;br /&gt;
zstd-libs&amp;quot;&lt;br /&gt;
for p in $LIST_OF_PACKAGES ; do apk fetch $p ; done&lt;br /&gt;
apk index -o APKINDEX.tar.gz *.apk&lt;br /&gt;
export SUDO=&amp;quot;&amp;quot;&lt;br /&gt;
abuild-keygen -n -i -a&lt;br /&gt;
lbu add ~/.abuild&lt;br /&gt;
abuild-sign APKINDEX.tar.gz&lt;br /&gt;
&lt;br /&gt;
apk add darkhttpd nfs-utils dnsmasq syslinux &lt;br /&gt;
&lt;br /&gt;
export SUDO=&amp;quot;&amp;quot;&lt;br /&gt;
abuild-keygen -n -i -a&lt;br /&gt;
&lt;br /&gt;
ALPINE=alpine-netboot-3.17.3-x86_64.tar.gz&lt;br /&gt;
[ -f $ALPINE ] || \&lt;br /&gt;
while true;do &lt;br /&gt;
	wget -c https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/$ALPINE \&lt;br /&gt;
		&amp;amp;&amp;amp; break&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
mkdir -p /media/usb/tftpboot/pxelinux/pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
# populate TFTP server&lt;br /&gt;
rm -fr /tmp/boot&lt;br /&gt;
tar xf alpine-netboot-3.17.3-x86_64.tar.gz -C /tmp&lt;br /&gt;
cp -r /tmp/boot/* /media/usb/tftpboot/pxelinux/&lt;br /&gt;
&lt;br /&gt;
# populate HTTP server&lt;br /&gt;
#cd /media/usb&lt;br /&gt;
# add default apkovl.tar.gz here&lt;br /&gt;
&lt;br /&gt;
# configure darkhttpd&lt;br /&gt;
sed -i -e &#039;s+/var/www/localhost/htdocs+/media/usb+&#039; /etc/init.d/darkhttpd&lt;br /&gt;
lbu add /etc/init.d/darkhttpd&lt;br /&gt;
&lt;br /&gt;
# populate NFS server&lt;br /&gt;
## implicit as we publish /media/usb&lt;br /&gt;
&lt;br /&gt;
# configure NFS for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/exports&lt;br /&gt;
# /etc/exports&lt;br /&gt;
#&lt;br /&gt;
# See exports(5) for a description.&lt;br /&gt;
&lt;br /&gt;
# use exportfs -arv to reread&lt;br /&gt;
/media/usb	*(ro,no_root_squash,no_subtree_check)&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# configure dnsmasq for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/dnsmasq.d/stamp.conf&lt;br /&gt;
# DNS related options&lt;br /&gt;
interface=eth0&lt;br /&gt;
listen-address=10.33.0.1&lt;br /&gt;
listen-address=127.0.0.1&lt;br /&gt;
## uplink resolver&lt;br /&gt;
server=1.1.1.1&lt;br /&gt;
# DHCP related options&lt;br /&gt;
dhcp-range=10.33.0.1,10.33.1.254,12h&lt;br /&gt;
## push router&lt;br /&gt;
dhcp-option=option:router,10.33.0.1&lt;br /&gt;
## push resolver&lt;br /&gt;
dhcp-option=6,10.33.0.1&lt;br /&gt;
# PXE (TFTP) related options&lt;br /&gt;
enable-tftp&lt;br /&gt;
dhcp-boot=pxelinux/pxelinux.0&lt;br /&gt;
tftp-root=/media/usb/tftpboot&lt;br /&gt;
EOF&lt;br /&gt;
cp /usr/share/syslinux/pxelinux.0 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cp /usr/share/syslinux/ldlinux.c32 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /media/usb/tftpboot/pxelinux/pxelinux.cfg/default&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 3&lt;br /&gt;
default alpine&lt;br /&gt;
LABEL alpine&lt;br /&gt;
LINUX vmlinuz-lts&lt;br /&gt;
INITRD pxerd&lt;br /&gt;
APPEND ip=dhcp alpine_dev=nfs:10.33.0.1:/media/usb/boot modloop=http://10.33.0.1/boot/modloop-lts nomodeset apkovl=http://10.33.0.1/stamp/default.apkovl.tar.gz alpine_repo=http://10.33.0.1/apks&lt;br /&gt;
EOF&lt;br /&gt;
# generate initramfs for PXE&lt;br /&gt;
if [ ! -f /media/usb/tftpboot/pxelinux/pxerd ];then&lt;br /&gt;
  cd /etc/mkinitfs/features.d/&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/virtio_net.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/ethernet/e1000/*.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;/usr/share/udhcpc/default.script&amp;quot; &amp;gt; dhcp.files&lt;br /&gt;
  echo &amp;quot;kernel/net/packet/af_packet.ko&amp;quot; &amp;gt; dhcp.modules&lt;br /&gt;
  echo &amp;quot;kernel/fs/nfs/*&amp;quot; &amp;gt; nfs.modules&lt;br /&gt;
  cd /etc/mkinitfs/&lt;br /&gt;
  echo &#039;features=&amp;quot;ata base bootchart cdrom cramfs ext2 ext3 ext4 xfs floppy keymap kms raid scsi usb virtio squashfs network dhcp nfs&amp;quot;&#039; &amp;gt; mkinitfs.conf&lt;br /&gt;
  mkinitfs -o /media/usb/tftpboot/pxelinux/pxerd&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# console welcome message&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/motd&lt;br /&gt;
&lt;br /&gt;
This a PXE server intended to deploy a fleet of diskless Alpine Linux.&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/network/interfaces&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 10.33.0.1&lt;br /&gt;
	netmask 255.255.0.0&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# force install from cache at reboot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/local.d/fix.start&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
apk add darkhttpd&lt;br /&gt;
service darkhttpd start&lt;br /&gt;
EOF&lt;br /&gt;
chmod +x /etc/local.d/fix.start&lt;br /&gt;
&lt;br /&gt;
# enable services at reboot&lt;br /&gt;
rc-update add local&lt;br /&gt;
rc-update add darkhttpd&lt;br /&gt;
rc-update add nfs&lt;br /&gt;
rc-update add dnsmasq&lt;br /&gt;
&lt;br /&gt;
# persist changes&lt;br /&gt;
sync&lt;br /&gt;
apk cache -v sync&lt;br /&gt;
mount -o remount,ro /media/usb&lt;br /&gt;
lbu ci&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Press &#039;Enter&#039; to reboot and act as PXE boot server&amp;quot;&lt;br /&gt;
echo &amp;quot;or &#039;ctrl-c&#039; to go back to the terminal...&amp;quot;&lt;br /&gt;
read&lt;br /&gt;
&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23539</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23539"/>
		<updated>2023-05-29T14:16:50Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86_64 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop) also in 64 bits&lt;br /&gt;
* a tower (16 cores x86_64, 128GB RAM) running Alpine, [[openVSwitch]] and [[qemu]]-kvm&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
&lt;br /&gt;
I plan to run a Xorg desktop headless in some KVM and remotely connect to it from the R-Pi as X station...&lt;br /&gt;
And to drive other dev and build boxes as KVM.&lt;br /&gt;
&lt;br /&gt;
What about https://github.com/e1z0/Framebuffer-browser on Alpine? I plan to give a try and maybe package it...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
set -x&lt;br /&gt;
# This script is intended to transform an Alpine Linux USB key running in &lt;br /&gt;
# diskless mode into a PXE boot server.&lt;br /&gt;
# It will run with a fixed IP 10.33.0.1 on eth0 acting as primary DHCP&lt;br /&gt;
# server.&lt;br /&gt;
# Only packages present in the local boot media will be available for &lt;br /&gt;
# booted boxes.&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
mount -o remount,rw /media/usb&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s do all downloads first!&lt;br /&gt;
sed -i -e &#039;/community/s/^#//&#039; -e &#039;/edge/d&#039; /etc/apk/repositories&lt;br /&gt;
apk update&lt;br /&gt;
apk add abuild&lt;br /&gt;
&lt;br /&gt;
cd /media/usb/apks/x86_64&lt;br /&gt;
LIST_OF_PACKAGES=&amp;quot;aardvark-dns&lt;br /&gt;
abuild&lt;br /&gt;
acct&lt;br /&gt;
acct-openrc&lt;br /&gt;
alpine-base&lt;br /&gt;
alpine-baselayout&lt;br /&gt;
alpine-baselayout-data&lt;br /&gt;
alpine-conf&lt;br /&gt;
alpine-keys&lt;br /&gt;
alpine-release&lt;br /&gt;
apk-tools&lt;br /&gt;
argon2-libs&lt;br /&gt;
attr&lt;br /&gt;
bash&lt;br /&gt;
blkid&lt;br /&gt;
brotli-libs&lt;br /&gt;
busybox&lt;br /&gt;
busybox-binsh&lt;br /&gt;
busybox-mdev-openrc&lt;br /&gt;
busybox-openrc&lt;br /&gt;
busybox-suid&lt;br /&gt;
ca-certificates&lt;br /&gt;
ca-certificates-bundle&lt;br /&gt;
catatonit&lt;br /&gt;
conmon&lt;br /&gt;
containers-common&lt;br /&gt;
crun&lt;br /&gt;
cryptsetup-libs&lt;br /&gt;
curl&lt;br /&gt;
darkhttpd&lt;br /&gt;
device-mapper-libs&lt;br /&gt;
e2fsprogs&lt;br /&gt;
e2fsprogs-libs&lt;br /&gt;
fakeroot&lt;br /&gt;
fuse-common&lt;br /&gt;
fuse-openrc&lt;br /&gt;
fuse-overlayfs&lt;br /&gt;
fuse3&lt;br /&gt;
fuse3-libs&lt;br /&gt;
glib&lt;br /&gt;
gnupg-gpgconf&lt;br /&gt;
gpg&lt;br /&gt;
gpg-agent&lt;br /&gt;
gpgme&lt;br /&gt;
gpgsm&lt;br /&gt;
ifupdown-ng&lt;br /&gt;
ip6tables&lt;br /&gt;
ip6tables-openrc&lt;br /&gt;
iptables&lt;br /&gt;
iptables-openrc&lt;br /&gt;
json-c&lt;br /&gt;
kmod&lt;br /&gt;
kmod-libs&lt;br /&gt;
kmod-openrc&lt;br /&gt;
lddtree&lt;br /&gt;
libacl&lt;br /&gt;
libassuan&lt;br /&gt;
libblkid&lt;br /&gt;
libbz2&lt;br /&gt;
libc-utils&lt;br /&gt;
libcap2&lt;br /&gt;
libcom_err&lt;br /&gt;
libcrypto3&lt;br /&gt;
libcurl&lt;br /&gt;
libedit&lt;br /&gt;
libevent&lt;br /&gt;
libffi&lt;br /&gt;
libgcc&lt;br /&gt;
libgcrypt&lt;br /&gt;
libgpg-error&lt;br /&gt;
libintl&lt;br /&gt;
libksba&lt;br /&gt;
libmnl&lt;br /&gt;
libmount&lt;br /&gt;
libnftnl&lt;br /&gt;
libseccomp&lt;br /&gt;
libslirp&lt;br /&gt;
libssl3&lt;br /&gt;
libuuid&lt;br /&gt;
linux-firmware-none&lt;br /&gt;
linux-lts&lt;br /&gt;
linux-pam&lt;br /&gt;
lzip&lt;br /&gt;
lz4-libs&lt;br /&gt;
mdev-conf&lt;br /&gt;
mkinitfs&lt;br /&gt;
mtools&lt;br /&gt;
musl&lt;br /&gt;
musl-utils&lt;br /&gt;
ncurses-libs&lt;br /&gt;
ncurses-terminfo-base&lt;br /&gt;
netavark&lt;br /&gt;
nghttp2-libs&lt;br /&gt;
npth&lt;br /&gt;
openrc&lt;br /&gt;
openssh&lt;br /&gt;
openssh-client-common&lt;br /&gt;
openssh-client-default&lt;br /&gt;
openssh-keygen&lt;br /&gt;
openssh-server&lt;br /&gt;
openssh-server-common&lt;br /&gt;
openssh-sftp-server&lt;br /&gt;
openssl&lt;br /&gt;
patch&lt;br /&gt;
pcre2&lt;br /&gt;
pkgconf&lt;br /&gt;
pinentry&lt;br /&gt;
podman&lt;br /&gt;
podman-openrc&lt;br /&gt;
popt&lt;br /&gt;
readline&lt;br /&gt;
rsync&lt;br /&gt;
rsync-openrc&lt;br /&gt;
scanelf&lt;br /&gt;
shadow-libs&lt;br /&gt;
shadow-subids&lt;br /&gt;
slirp4netns&lt;br /&gt;
sqlite-libs&lt;br /&gt;
ssl_client&lt;br /&gt;
syslinux&lt;br /&gt;
tar&lt;br /&gt;
tmux&lt;br /&gt;
vim&lt;br /&gt;
xxd&lt;br /&gt;
xz-libs&lt;br /&gt;
yajl&lt;br /&gt;
zlib&lt;br /&gt;
zstd-libs&amp;quot;&lt;br /&gt;
for p in $LIST_OF_PACKAGES ; do apk fetch $p ; done&lt;br /&gt;
apk index -o APKINDEX.tar.gz *.apk&lt;br /&gt;
export SUDO=&amp;quot;&amp;quot;&lt;br /&gt;
abuild-keygen -n -i -a&lt;br /&gt;
lbu add ~/.abuild&lt;br /&gt;
abuild-sign APKINDEX.tar.gz&lt;br /&gt;
&lt;br /&gt;
apk add darkhttpd nfs-utils dnsmasq syslinux &lt;br /&gt;
&lt;br /&gt;
export SUDO=&amp;quot;&amp;quot;&lt;br /&gt;
abuild-keygen -n -i -a&lt;br /&gt;
&lt;br /&gt;
ALPINE=alpine-netboot-3.17.3-x86_64.tar.gz&lt;br /&gt;
[ -f $ALPINE ] || \&lt;br /&gt;
while true;do &lt;br /&gt;
	wget -c https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/$ALPINE \&lt;br /&gt;
		&amp;amp;&amp;amp; break&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
mkdir -p /media/usb/tftpboot/pxelinux/pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
# populate TFTP server&lt;br /&gt;
rm -fr /tmp/boot&lt;br /&gt;
tar xf alpine-netboot-3.17.3-x86_64.tar.gz -C /tmp&lt;br /&gt;
cp -r /tmp/boot/* /media/usb/tftpboot/pxelinux/&lt;br /&gt;
&lt;br /&gt;
# populate HTTP server&lt;br /&gt;
#cd /media/usb&lt;br /&gt;
# add default apkovl.tar.gz here&lt;br /&gt;
&lt;br /&gt;
# configure darkhttpd (nginx should already be done by bootstrap-manager)&lt;br /&gt;
sed -i -e &#039;s+/var/www/localhost/htdocs+/media/usb+&#039; /etc/init.d/darkhttpd&lt;br /&gt;
lbu add /etc/init.d/darkhttpd&lt;br /&gt;
&lt;br /&gt;
# populate NFS server&lt;br /&gt;
## implicit as we publish /media/usb&lt;br /&gt;
&lt;br /&gt;
# configure NFS for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/exports&lt;br /&gt;
# /etc/exports&lt;br /&gt;
#&lt;br /&gt;
# See exports(5) for a description.&lt;br /&gt;
&lt;br /&gt;
# use exportfs -arv to reread&lt;br /&gt;
/media/usb	*(ro,no_root_squash,no_subtree_check)&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# configure dnsmasq for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/dnsmasq.d/stamp.conf&lt;br /&gt;
# DNS related options&lt;br /&gt;
interface=eth0&lt;br /&gt;
listen-address=10.33.0.1&lt;br /&gt;
listen-address=127.0.0.1&lt;br /&gt;
## uplink resolver&lt;br /&gt;
server=1.1.1.1&lt;br /&gt;
# DHCP related options&lt;br /&gt;
dhcp-range=10.33.0.1,10.33.1.254,12h&lt;br /&gt;
## push router&lt;br /&gt;
dhcp-option=option:router,10.33.0.1&lt;br /&gt;
## push resolver&lt;br /&gt;
dhcp-option=6,10.33.0.1&lt;br /&gt;
# PXE (TFTP) related options&lt;br /&gt;
enable-tftp&lt;br /&gt;
dhcp-boot=pxelinux/pxelinux.0&lt;br /&gt;
tftp-root=/media/usb/tftpboot&lt;br /&gt;
EOF&lt;br /&gt;
cp /usr/share/syslinux/pxelinux.0 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cp /usr/share/syslinux/ldlinux.c32 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /media/usb/tftpboot/pxelinux/pxelinux.cfg/default&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 3&lt;br /&gt;
default alpine&lt;br /&gt;
LABEL alpine&lt;br /&gt;
LINUX vmlinuz-lts&lt;br /&gt;
INITRD pxerd&lt;br /&gt;
APPEND ip=dhcp alpine_dev=nfs:10.33.0.1:/media/usb/boot modloop=http://10.33.0.1/boot/modloop-lts nomodeset apkovl=http://10.33.0.1/stamp/stamp.apkovl.tar.gz alpine_repo=http://10.33.0.1/apks&lt;br /&gt;
EOF&lt;br /&gt;
# generate initramfs for PXE&lt;br /&gt;
if [ ! -f /media/usb/tftpboot/pxelinux/pxerd ];then&lt;br /&gt;
  cd /etc/mkinitfs/features.d/&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/virtio_net.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/ethernet/e1000/*.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;/usr/share/udhcpc/default.script&amp;quot; &amp;gt; dhcp.files&lt;br /&gt;
  echo &amp;quot;kernel/net/packet/af_packet.ko&amp;quot; &amp;gt; dhcp.modules&lt;br /&gt;
  echo &amp;quot;kernel/fs/nfs/*&amp;quot; &amp;gt; nfs.modules&lt;br /&gt;
  cd /etc/mkinitfs/&lt;br /&gt;
  echo &#039;features=&amp;quot;ata base bootchart cdrom cramfs ext2 ext3 ext4 xfs floppy keymap kms raid scsi usb virtio squashfs network dhcp nfs&amp;quot;&#039; &amp;gt; mkinitfs.conf&lt;br /&gt;
  mkinitfs -o /media/usb/tftpboot/pxelinux/pxerd&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# console welcome message&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/motd&lt;br /&gt;
&lt;br /&gt;
This a PXE server intended to deploy a fleet of diskless Alpine Linux.&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/network/interfaces&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 10.33.0.1&lt;br /&gt;
	netmask 255.255.0.0&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# force install from cache at reboot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/local.d/fix.start&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
apk add darkhttpd&lt;br /&gt;
service darkhttpd start&lt;br /&gt;
EOF&lt;br /&gt;
chmod +x /etc/local.d/fix.start&lt;br /&gt;
&lt;br /&gt;
# enable services at reboot&lt;br /&gt;
rc-update add local&lt;br /&gt;
rc-update add darkhttpd&lt;br /&gt;
rc-update add nfs&lt;br /&gt;
rc-update add dnsmasq&lt;br /&gt;
&lt;br /&gt;
# persist changes&lt;br /&gt;
sync&lt;br /&gt;
apk cache -v sync&lt;br /&gt;
mount -o remount,ro /media/usb&lt;br /&gt;
lbu ci&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Press &#039;Enter&#039; to reboot and act as PXE boot server&amp;quot;&lt;br /&gt;
echo &amp;quot;or &#039;ctrl-c&#039; to go back to the terminal...&amp;quot;&lt;br /&gt;
read&lt;br /&gt;
&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23538</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23538"/>
		<updated>2023-05-29T13:41:37Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86_64 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop) also in 64 bits&lt;br /&gt;
* a tower (16 cores x86_64, 128GB RAM) running Alpine, [[openVSwitch]] and [[qemu]]-kvm&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
&lt;br /&gt;
I plan to run a Xorg desktop headless in some KVM and remotely connect to it from the R-Pi as X station...&lt;br /&gt;
And to drive other dev and build boxes as KVM.&lt;br /&gt;
&lt;br /&gt;
What about https://github.com/e1z0/Framebuffer-browser on Alpine? I plan to give a try and maybe package it...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
set -x&lt;br /&gt;
# This script is intended to transform an Alpine Linux USB key running in &lt;br /&gt;
# diskless mode into a PXE boot server.&lt;br /&gt;
# It will run with a fixed IP 10.33.0.1 on eth0 acting as primary DHCP&lt;br /&gt;
# server.&lt;br /&gt;
# Only packages present in the local boot media will be available for &lt;br /&gt;
# booted boxes.&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
mount -o remount,rw /media/usb&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s do all downloads first!&lt;br /&gt;
sed -i -e &#039;/community/s/^#//&#039; -e &#039;/edge/d&#039; /etc/apk/repositories&lt;br /&gt;
apk update&lt;br /&gt;
apk add abuild&lt;br /&gt;
&lt;br /&gt;
cd /media/usb/apks/x86_64&lt;br /&gt;
LIST_OF_PACKAGES=&amp;quot;aardvark-dns&lt;br /&gt;
abuild&lt;br /&gt;
acct&lt;br /&gt;
acct-openrc&lt;br /&gt;
alpine-base&lt;br /&gt;
alpine-baselayout&lt;br /&gt;
alpine-baselayout-data&lt;br /&gt;
alpine-conf&lt;br /&gt;
alpine-keys&lt;br /&gt;
alpine-release&lt;br /&gt;
apk-tools&lt;br /&gt;
argon2-libs&lt;br /&gt;
attr&lt;br /&gt;
bash&lt;br /&gt;
blkid&lt;br /&gt;
brotli-libs&lt;br /&gt;
busybox&lt;br /&gt;
busybox-binsh&lt;br /&gt;
busybox-mdev-openrc&lt;br /&gt;
busybox-openrc&lt;br /&gt;
busybox-suid&lt;br /&gt;
ca-certificates&lt;br /&gt;
ca-certificates-bundle&lt;br /&gt;
catatonit&lt;br /&gt;
conmon&lt;br /&gt;
containers-common&lt;br /&gt;
crun&lt;br /&gt;
cryptsetup-libs&lt;br /&gt;
curl&lt;br /&gt;
darkhttpd&lt;br /&gt;
device-mapper-libs&lt;br /&gt;
e2fsprogs&lt;br /&gt;
e2fsprogs-libs&lt;br /&gt;
fakeroot&lt;br /&gt;
fuse-common&lt;br /&gt;
fuse-openrc&lt;br /&gt;
fuse-overlayfs&lt;br /&gt;
fuse3&lt;br /&gt;
fuse3-libs&lt;br /&gt;
glib&lt;br /&gt;
gnupg-gpgconf&lt;br /&gt;
gpg&lt;br /&gt;
gpg-agent&lt;br /&gt;
gpgme&lt;br /&gt;
gpgsm&lt;br /&gt;
ifupdown-ng&lt;br /&gt;
ip6tables&lt;br /&gt;
ip6tables-openrc&lt;br /&gt;
iptables&lt;br /&gt;
iptables-openrc&lt;br /&gt;
json-c&lt;br /&gt;
kmod&lt;br /&gt;
kmod-libs&lt;br /&gt;
kmod-openrc&lt;br /&gt;
lddtree&lt;br /&gt;
libacl&lt;br /&gt;
libassuan&lt;br /&gt;
libblkid&lt;br /&gt;
libbz2&lt;br /&gt;
libc-utils&lt;br /&gt;
libcap2&lt;br /&gt;
libcom_err&lt;br /&gt;
libcrypto3&lt;br /&gt;
libcurl&lt;br /&gt;
libedit&lt;br /&gt;
libevent&lt;br /&gt;
libffi&lt;br /&gt;
libgcc&lt;br /&gt;
libgcrypt&lt;br /&gt;
libgpg-error&lt;br /&gt;
libintl&lt;br /&gt;
libksba&lt;br /&gt;
libmnl&lt;br /&gt;
libmount&lt;br /&gt;
libnftnl&lt;br /&gt;
libseccomp&lt;br /&gt;
libslirp&lt;br /&gt;
libssl3&lt;br /&gt;
libuuid&lt;br /&gt;
linux-firmware-none&lt;br /&gt;
linux-lts&lt;br /&gt;
linux-pam&lt;br /&gt;
lzip&lt;br /&gt;
lz4-libs&lt;br /&gt;
mdev-conf&lt;br /&gt;
mkinitfs&lt;br /&gt;
mtools&lt;br /&gt;
musl&lt;br /&gt;
musl-utils&lt;br /&gt;
ncurses-libs&lt;br /&gt;
ncurses-terminfo-base&lt;br /&gt;
netavark&lt;br /&gt;
nghttp2-libs&lt;br /&gt;
npth&lt;br /&gt;
openrc&lt;br /&gt;
openssh&lt;br /&gt;
openssh-client-common&lt;br /&gt;
openssh-client-default&lt;br /&gt;
openssh-keygen&lt;br /&gt;
openssh-server&lt;br /&gt;
openssh-server-common&lt;br /&gt;
openssh-sftp-server&lt;br /&gt;
openssl&lt;br /&gt;
patch&lt;br /&gt;
pcre2&lt;br /&gt;
pkgconf&lt;br /&gt;
pinentry&lt;br /&gt;
podman&lt;br /&gt;
podman-openrc&lt;br /&gt;
popt&lt;br /&gt;
readline&lt;br /&gt;
rsync&lt;br /&gt;
rsync-openrc&lt;br /&gt;
scanelf&lt;br /&gt;
shadow-libs&lt;br /&gt;
shadow-subids&lt;br /&gt;
slirp4netns&lt;br /&gt;
sqlite-libs&lt;br /&gt;
ssl_client&lt;br /&gt;
syslinux&lt;br /&gt;
tar&lt;br /&gt;
tmux&lt;br /&gt;
vim&lt;br /&gt;
xxd&lt;br /&gt;
xz-libs&lt;br /&gt;
yajl&lt;br /&gt;
zlib&lt;br /&gt;
zstd-libs&amp;quot;&lt;br /&gt;
for p in $LIST_OF_PACKAGES ; do apk fetch $p ; done&lt;br /&gt;
apk index -o APKINDEX.tar.gz *.apk&lt;br /&gt;
export SUDO=&amp;quot;&amp;quot;&lt;br /&gt;
abuild-keygen -n -i -a&lt;br /&gt;
lbu add ~/.abuild&lt;br /&gt;
abuild-sign APKINDEX.tar.gz&lt;br /&gt;
&lt;br /&gt;
grep nginx /etc/apk/world &amp;amp;&amp;amp; HTTP_SERVER=&amp;quot;&amp;quot; || HTTP_SERVER=darkhttpd&lt;br /&gt;
apk add darkhttpd nfs-utils dnsmasq syslinux &lt;br /&gt;
&lt;br /&gt;
export SUDO=&amp;quot;&amp;quot;&lt;br /&gt;
abuild-keygen -n -i -a&lt;br /&gt;
&lt;br /&gt;
ALPINE=alpine-netboot-3.17.3-x86_64.tar.gz&lt;br /&gt;
[ -f $ALPINE ] || \&lt;br /&gt;
while true;do &lt;br /&gt;
	wget -c https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/$ALPINE \&lt;br /&gt;
		&amp;amp;&amp;amp; break&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
mkdir -p /media/usb/tftpboot/pxelinux/pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
# populate TFTP server&lt;br /&gt;
rm -fr /tmp/boot&lt;br /&gt;
tar xf alpine-netboot-3.17.3-x86_64.tar.gz -C /tmp&lt;br /&gt;
cp -r /tmp/boot/* /media/usb/tftpboot/pxelinux/&lt;br /&gt;
&lt;br /&gt;
# populate HTTP server&lt;br /&gt;
#cd /media/usb&lt;br /&gt;
# add default apkovl.tar.gz here&lt;br /&gt;
&lt;br /&gt;
# configure darkhttpd (nginx should already be done by bootstrap-manager)&lt;br /&gt;
if [ &amp;quot;$HTTP_SERVER&amp;quot; == &amp;quot;darkhttpd&amp;quot; ]; then&lt;br /&gt;
  sed -i -e &#039;s+/var/www/localhost/htdocs+/media/usb+&#039; /etc/init.d/darkhttpd&lt;br /&gt;
  lbu add /etc/init.d/darkhttpd&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# populate NFS server&lt;br /&gt;
## implicit as we publish /media/usb&lt;br /&gt;
&lt;br /&gt;
# configure NFS for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/exports&lt;br /&gt;
# /etc/exports&lt;br /&gt;
#&lt;br /&gt;
# See exports(5) for a description.&lt;br /&gt;
&lt;br /&gt;
# use exportfs -arv to reread&lt;br /&gt;
/media/usb	*(ro,no_root_squash,no_subtree_check)&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# configure dnsmasq for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/dnsmasq.d/stamp.conf&lt;br /&gt;
# DNS related options&lt;br /&gt;
interface=eth0&lt;br /&gt;
listen-address=10.33.0.1&lt;br /&gt;
listen-address=127.0.0.1&lt;br /&gt;
## uplink resolver&lt;br /&gt;
server=1.1.1.1&lt;br /&gt;
# DHCP related options&lt;br /&gt;
dhcp-range=10.33.0.1,10.33.1.254,12h&lt;br /&gt;
## push router&lt;br /&gt;
dhcp-option=option:router,10.33.0.1&lt;br /&gt;
## push resolver&lt;br /&gt;
dhcp-option=6,10.33.0.1&lt;br /&gt;
# PXE (TFTP) related options&lt;br /&gt;
enable-tftp&lt;br /&gt;
dhcp-boot=pxelinux/pxelinux.0&lt;br /&gt;
tftp-root=/media/usb/tftpboot&lt;br /&gt;
EOF&lt;br /&gt;
cp /usr/share/syslinux/pxelinux.0 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cp /usr/share/syslinux/ldlinux.c32 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /media/usb/tftpboot/pxelinux/pxelinux.cfg/default&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 3&lt;br /&gt;
default alpine&lt;br /&gt;
LABEL alpine&lt;br /&gt;
LINUX vmlinuz-lts&lt;br /&gt;
INITRD pxerd&lt;br /&gt;
APPEND ip=dhcp alpine_dev=nfs:10.33.0.1:/media/usb/boot modloop=http://10.33.0.1/boot/modloop-lts nomodeset apkovl=http://10.33.0.1/stamp/stamp.apkovl.tar.gz alpine_repo=http://10.33.0.1/apks&lt;br /&gt;
EOF&lt;br /&gt;
# generate initramfs for PXE&lt;br /&gt;
if [ ! -f /media/usb/tftpboot/pxelinux/pxerd ];then&lt;br /&gt;
  cd /etc/mkinitfs/features.d/&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/virtio_net.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/ethernet/e1000/*.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;/usr/share/udhcpc/default.script&amp;quot; &amp;gt; dhcp.files&lt;br /&gt;
  echo &amp;quot;kernel/net/packet/af_packet.ko&amp;quot; &amp;gt; dhcp.modules&lt;br /&gt;
  echo &amp;quot;kernel/fs/nfs/*&amp;quot; &amp;gt; nfs.modules&lt;br /&gt;
  cd /etc/mkinitfs/&lt;br /&gt;
  echo &#039;features=&amp;quot;ata base bootchart cdrom cramfs ext2 ext3 ext4 xfs floppy keymap kms raid scsi usb virtio squashfs network dhcp nfs&amp;quot;&#039; &amp;gt; mkinitfs.conf&lt;br /&gt;
  mkinitfs -o /media/usb/tftpboot/pxelinux/pxerd&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# console welcome message&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/motd&lt;br /&gt;
&lt;br /&gt;
This a PXE server intended to deploy a fleet of STAMPs.&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/network/interfaces&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 10.33.0.1&lt;br /&gt;
	netmask 255.255.0.0&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$HTTP_SERVER&amp;quot; == &amp;quot;darkhttpd&amp;quot; ]; then&lt;br /&gt;
  # force install from cache at reboot&lt;br /&gt;
  cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/local.d/fix.start&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
apk add darkhttpd&lt;br /&gt;
service darkhttpd start&lt;br /&gt;
EOF&lt;br /&gt;
  chmod +x /etc/local.d/fix.start&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# enable services at reboot&lt;br /&gt;
[ &amp;quot;$HTTP_SERVER&amp;quot; == &amp;quot;darkhttpd&amp;quot; ] &amp;amp;&amp;amp; rc-update add local&lt;br /&gt;
[ &amp;quot;$HTTP_SERVER&amp;quot; == &amp;quot;darkhttpd&amp;quot; ] &amp;amp;&amp;amp; rc-update add darkhttpd&lt;br /&gt;
rc-update add nfs&lt;br /&gt;
rc-update add dnsmasq&lt;br /&gt;
&lt;br /&gt;
# persist changes&lt;br /&gt;
sync&lt;br /&gt;
apk cache -v sync&lt;br /&gt;
mount -o remount,ro /media/usb&lt;br /&gt;
lbu ci&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Press &#039;Enter&#039; to reboot and act as PXE boot server&amp;quot;&lt;br /&gt;
echo &amp;quot;or &#039;ctrl-c&#039; to go back to the terminal...&amp;quot;&lt;br /&gt;
read&lt;br /&gt;
&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23537</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23537"/>
		<updated>2023-05-29T13:38:18Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: How to transfrom a diskless USB key in a PXE boot server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86_64 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop) also in 64 bits&lt;br /&gt;
* a tower (16 cores x86_64, 128GB RAM) running Alpine, [[openVSwitch]] and [[qemu]]-kvm&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
&lt;br /&gt;
I plan to run a Xorg desktop headless in some KVM and remotely connect to it from the R-Pi as X station...&lt;br /&gt;
And to drive other dev and build boxes as KVM.&lt;br /&gt;
&lt;br /&gt;
What about https://github.com/e1z0/Framebuffer-browser on Alpine? I plan to give a try and maybe package it...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
set -x&lt;br /&gt;
# This script is intended to transform an Alpine Linux USB key running in &lt;br /&gt;
# diskless mode into a PXE boot server.&lt;br /&gt;
# It will run with a fixed IP 10.33.0.1 on eth0 acting as primary DHCP&lt;br /&gt;
# server.&lt;br /&gt;
# Only packages present in the local boot media will be available for &lt;br /&gt;
# booted boxes.&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
mount -o remount,rw /media/usb&lt;br /&gt;
&lt;br /&gt;
# Let&#039;s do all downloads first!&lt;br /&gt;
sed -i -e &#039;/community/s/^#//&#039; -e &#039;/edge/d&#039; /etc/apk/repositories&lt;br /&gt;
apk update&lt;br /&gt;
apk add abuild&lt;br /&gt;
&lt;br /&gt;
cd /media/usb/apks/x86_64&lt;br /&gt;
LIST_OF_PACKAGES=&amp;quot;aardvark-dns&lt;br /&gt;
abuild&lt;br /&gt;
acct&lt;br /&gt;
acct-openrc&lt;br /&gt;
alpine-base&lt;br /&gt;
alpine-baselayout&lt;br /&gt;
alpine-baselayout-data&lt;br /&gt;
alpine-conf&lt;br /&gt;
alpine-keys&lt;br /&gt;
alpine-release&lt;br /&gt;
apk-tools&lt;br /&gt;
argon2-libs&lt;br /&gt;
attr&lt;br /&gt;
bash&lt;br /&gt;
blkid&lt;br /&gt;
brotli-libs&lt;br /&gt;
busybox&lt;br /&gt;
busybox-binsh&lt;br /&gt;
busybox-mdev-openrc&lt;br /&gt;
busybox-openrc&lt;br /&gt;
busybox-suid&lt;br /&gt;
ca-certificates&lt;br /&gt;
ca-certificates-bundle&lt;br /&gt;
catatonit&lt;br /&gt;
conmon&lt;br /&gt;
containers-common&lt;br /&gt;
crun&lt;br /&gt;
cryptsetup-libs&lt;br /&gt;
curl&lt;br /&gt;
darkhttpd&lt;br /&gt;
device-mapper-libs&lt;br /&gt;
e2fsprogs&lt;br /&gt;
e2fsprogs-libs&lt;br /&gt;
fakeroot&lt;br /&gt;
fuse-common&lt;br /&gt;
fuse-openrc&lt;br /&gt;
fuse-overlayfs&lt;br /&gt;
fuse3&lt;br /&gt;
fuse3-libs&lt;br /&gt;
glib&lt;br /&gt;
gnupg-gpgconf&lt;br /&gt;
gpg&lt;br /&gt;
gpg-agent&lt;br /&gt;
gpgme&lt;br /&gt;
gpgsm&lt;br /&gt;
ifupdown-ng&lt;br /&gt;
ip6tables&lt;br /&gt;
ip6tables-openrc&lt;br /&gt;
iptables&lt;br /&gt;
iptables-openrc&lt;br /&gt;
json-c&lt;br /&gt;
kmod&lt;br /&gt;
kmod-libs&lt;br /&gt;
kmod-openrc&lt;br /&gt;
lddtree&lt;br /&gt;
libacl&lt;br /&gt;
libassuan&lt;br /&gt;
libblkid&lt;br /&gt;
libbz2&lt;br /&gt;
libc-utils&lt;br /&gt;
libcap2&lt;br /&gt;
libcom_err&lt;br /&gt;
libcrypto3&lt;br /&gt;
libcurl&lt;br /&gt;
libedit&lt;br /&gt;
libevent&lt;br /&gt;
libffi&lt;br /&gt;
libgcc&lt;br /&gt;
libgcrypt&lt;br /&gt;
libgpg-error&lt;br /&gt;
libintl&lt;br /&gt;
libksba&lt;br /&gt;
libmnl&lt;br /&gt;
libmount&lt;br /&gt;
libnftnl&lt;br /&gt;
libseccomp&lt;br /&gt;
libslirp&lt;br /&gt;
libssl3&lt;br /&gt;
libuuid&lt;br /&gt;
linux-firmware-none&lt;br /&gt;
linux-lts&lt;br /&gt;
linux-pam&lt;br /&gt;
lzip&lt;br /&gt;
lz4-libs&lt;br /&gt;
mdev-conf&lt;br /&gt;
mkinitfs&lt;br /&gt;
mtools&lt;br /&gt;
musl&lt;br /&gt;
musl-utils&lt;br /&gt;
ncurses-libs&lt;br /&gt;
ncurses-terminfo-base&lt;br /&gt;
netavark&lt;br /&gt;
nghttp2-libs&lt;br /&gt;
npth&lt;br /&gt;
openrc&lt;br /&gt;
openssh&lt;br /&gt;
openssh-client-common&lt;br /&gt;
openssh-client-default&lt;br /&gt;
openssh-keygen&lt;br /&gt;
openssh-server&lt;br /&gt;
openssh-server-common&lt;br /&gt;
openssh-sftp-server&lt;br /&gt;
openssl&lt;br /&gt;
patch&lt;br /&gt;
pcre2&lt;br /&gt;
pkgconf&lt;br /&gt;
pinentry&lt;br /&gt;
podman&lt;br /&gt;
podman-openrc&lt;br /&gt;
popt&lt;br /&gt;
readline&lt;br /&gt;
rsync&lt;br /&gt;
rsync-openrc&lt;br /&gt;
scanelf&lt;br /&gt;
shadow-libs&lt;br /&gt;
shadow-subids&lt;br /&gt;
slirp4netns&lt;br /&gt;
sqlite-libs&lt;br /&gt;
ssl_client&lt;br /&gt;
syslinux&lt;br /&gt;
tar&lt;br /&gt;
tmux&lt;br /&gt;
vim&lt;br /&gt;
xxd&lt;br /&gt;
xz-libs&lt;br /&gt;
yajl&lt;br /&gt;
zlib&lt;br /&gt;
zstd-libs&amp;quot;&lt;br /&gt;
for p in $LIST_OF_PACKAGES ; do apk fetch $p ; done&lt;br /&gt;
apk index -o APKINDEX.tar.gz *.apk&lt;br /&gt;
export SUDO=&amp;quot;&amp;quot;&lt;br /&gt;
abuild-keygen -n -i -a&lt;br /&gt;
lbu add ~/.abuild&lt;br /&gt;
abuild-sign APKINDEX.tar.gz&lt;br /&gt;
&lt;br /&gt;
grep nginx /etc/apk/world &amp;amp;&amp;amp; HTTP_SERVER=&amp;quot;&amp;quot; || HTTP_SERVER=darkhttpd&lt;br /&gt;
apk add \&lt;br /&gt;
	$HTTP_SERVER nfs-utils dnsmasq syslinux &lt;br /&gt;
&lt;br /&gt;
export SUDO=&amp;quot;&amp;quot;&lt;br /&gt;
abuild-keygen -n -i -a&lt;br /&gt;
&lt;br /&gt;
ALPINE=alpine-netboot-3.17.3-x86_64.tar.gz&lt;br /&gt;
if [ -f $ALPINE.sha256 ]&lt;br /&gt;
then&lt;br /&gt;
	mv $ALPINE.sha256 $ALPINE.sha256-previous&lt;br /&gt;
else&lt;br /&gt;
	touch $ALPINE.sha256-previous&lt;br /&gt;
fi&lt;br /&gt;
while true;do &lt;br /&gt;
	wget -c https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/$ALPINE.sha256 \&lt;br /&gt;
		&amp;amp;&amp;amp; break&lt;br /&gt;
done&lt;br /&gt;
#if [ diff $ALPINE.sha256 $ALPINE.sha256-previous ]&lt;br /&gt;
#then&lt;br /&gt;
[ -f $ALPINE ] || \&lt;br /&gt;
while true;do &lt;br /&gt;
	wget -c https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/$ALPINE \&lt;br /&gt;
		&amp;amp;&amp;amp; break&lt;br /&gt;
done&lt;br /&gt;
#else&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
mkdir -p /media/usb/tftpboot/pxelinux/pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
# populate TFTP server&lt;br /&gt;
rm -fr /tmp/boot&lt;br /&gt;
tar xf alpine-netboot-3.17.3-x86_64.tar.gz -C /tmp&lt;br /&gt;
cp -r /tmp/boot/* /media/usb/tftpboot/pxelinux/&lt;br /&gt;
&lt;br /&gt;
# populate HTTP server&lt;br /&gt;
#cd /media/usb&lt;br /&gt;
#wget -q https://stamp:evensoft@stamp.evensoft.dev/pixie/pxe-default.apkovl.tar.gz&lt;br /&gt;
&lt;br /&gt;
# configure darkhttpd (nginx should already be done by bootstrap-manager)&lt;br /&gt;
if [ &amp;quot;$HTTP_SERVER&amp;quot; == &amp;quot;darkhttpd&amp;quot; ]; then&lt;br /&gt;
  sed -i -e &#039;s+/var/www/localhost/htdocs+/media/usb+&#039; /etc/init.d/darkhttpd&lt;br /&gt;
  lbu add /etc/init.d/darkhttpd&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# populate NFS server&lt;br /&gt;
## implicit as we publish /media/usb&lt;br /&gt;
&lt;br /&gt;
# configure NFS for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/exports&lt;br /&gt;
# /etc/exports&lt;br /&gt;
#&lt;br /&gt;
# See exports(5) for a description.&lt;br /&gt;
&lt;br /&gt;
# use exportfs -arv to reread&lt;br /&gt;
/media/usb	*(ro,no_root_squash,no_subtree_check)&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# configure dnsmasq for PXE boot&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/dnsmasq.d/stamp.conf&lt;br /&gt;
# DNS related options&lt;br /&gt;
interface=eth0&lt;br /&gt;
listen-address=10.33.0.1&lt;br /&gt;
listen-address=127.0.0.1&lt;br /&gt;
## uplink resolver&lt;br /&gt;
server=1.1.1.1&lt;br /&gt;
# DHCP related options&lt;br /&gt;
dhcp-range=10.33.0.1,10.33.1.254,12h&lt;br /&gt;
## push router&lt;br /&gt;
dhcp-option=option:router,10.33.0.1&lt;br /&gt;
## push resolver&lt;br /&gt;
dhcp-option=6,10.33.0.1&lt;br /&gt;
# PXE (TFTP) related options&lt;br /&gt;
enable-tftp&lt;br /&gt;
dhcp-boot=pxelinux/pxelinux.0&lt;br /&gt;
tftp-root=/media/usb/tftpboot&lt;br /&gt;
EOF&lt;br /&gt;
cp /usr/share/syslinux/pxelinux.0 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cp /usr/share/syslinux/ldlinux.c32 /media/usb/tftpboot/pxelinux/&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /media/usb/tftpboot/pxelinux/pxelinux.cfg/default&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 3&lt;br /&gt;
default alpine&lt;br /&gt;
LABEL alpine&lt;br /&gt;
LINUX vmlinuz-lts&lt;br /&gt;
INITRD pxerd&lt;br /&gt;
APPEND ip=dhcp alpine_dev=nfs:10.33.0.1:/media/usb/boot modloop=http://10.33.0.1/boot/modloop-lts nomodeset apkovl=http://10.33.0.1/stamp/stamp.apkovl.tar.gz alpine_repo=http://10.33.0.1/apks&lt;br /&gt;
EOF&lt;br /&gt;
# generate initramfs for PXE&lt;br /&gt;
if [ ! -f /media/usb/tftpboot/pxelinux/pxerd ];then&lt;br /&gt;
  cd /etc/mkinitfs/features.d/&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/virtio_net.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;kernel/drivers/net/ethernet/e1000/*.ko&amp;quot; &amp;gt;&amp;gt; network.modules&lt;br /&gt;
  echo &amp;quot;/usr/share/udhcpc/default.script&amp;quot; &amp;gt; dhcp.files&lt;br /&gt;
  echo &amp;quot;kernel/net/packet/af_packet.ko&amp;quot; &amp;gt; dhcp.modules&lt;br /&gt;
  echo &amp;quot;kernel/fs/nfs/*&amp;quot; &amp;gt; nfs.modules&lt;br /&gt;
  cd /etc/mkinitfs/&lt;br /&gt;
  echo &#039;features=&amp;quot;ata base bootchart cdrom cramfs ext2 ext3 ext4 xfs floppy keymap kms raid scsi usb virtio squashfs network dhcp nfs&amp;quot;&#039; &amp;gt; mkinitfs.conf&lt;br /&gt;
  mkinitfs -o /media/usb/tftpboot/pxelinux/pxerd&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# console welcome message&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/motd&lt;br /&gt;
&lt;br /&gt;
This a PXE server intended to deploy a fleet of STAMPs.&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/network/interfaces&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 10.33.0.1&lt;br /&gt;
	netmask 255.255.0.0&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$HTTP_SERVER&amp;quot; == &amp;quot;darkhttpd&amp;quot; ]; then&lt;br /&gt;
  # force install from cache at reboot&lt;br /&gt;
  cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/local.d/fix.start&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
apk add darkhttpd&lt;br /&gt;
service darkhttpd start&lt;br /&gt;
EOF&lt;br /&gt;
  chmod +x /etc/local.d/fix.start&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# enable services at reboot&lt;br /&gt;
[ &amp;quot;$HTTP_SERVER&amp;quot; == &amp;quot;darkhttpd&amp;quot; ] &amp;amp;&amp;amp; rc-update add local&lt;br /&gt;
[ &amp;quot;$HTTP_SERVER&amp;quot; == &amp;quot;darkhttpd&amp;quot; ] &amp;amp;&amp;amp; rc-update add darkhttpd&lt;br /&gt;
rc-update add nfs&lt;br /&gt;
rc-update add dnsmasq&lt;br /&gt;
&lt;br /&gt;
# persist changes&lt;br /&gt;
sync&lt;br /&gt;
apk cache -v sync&lt;br /&gt;
mount -o remount,ro /media/usb&lt;br /&gt;
lbu ci&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Press &#039;Enter&#039; to reboot and act as PXE boot server&amp;quot;&lt;br /&gt;
echo &amp;quot;or &#039;ctrl-c&#039; to go back to the terminal...&amp;quot;&lt;br /&gt;
read&lt;br /&gt;
&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23492</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=23492"/>
		<updated>2023-05-22T17:28:21Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: Framebuffer-browser?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86_64 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop) also in 64 bits&lt;br /&gt;
* a tower (16 cores x86_64, 128GB RAM) running Alpine, [[openVSwitch]] and [[qemu]]-kvm&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
&lt;br /&gt;
I plan to run a Xorg desktop headless in some KVM and remotely connect to it from the R-Pi as X station...&lt;br /&gt;
And to drive other dev and build boxes as KVM.&lt;br /&gt;
&lt;br /&gt;
What about https://github.com/e1z0/Framebuffer-browser on Alpine? I plan to give a try and maybe package it...&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=21634</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=21634"/>
		<updated>2022-03-13T04:31:52Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: update lab setup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86_64 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop) also in 64 bits&lt;br /&gt;
* a tower (16 cores x86_64, 128GB RAM) running Alpine, [[openVSwitch]] and [[qemu]]-kvm&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
&lt;br /&gt;
I plan to run a Xorg desktop headless in some KVM and remotely connect to it from the R-Pi as X station...&lt;br /&gt;
And to drive other dev and build boxes as KVM.&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20323</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20323"/>
		<updated>2021-11-12T17:21:03Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop)&lt;br /&gt;
* a desktop (16 cores, 128GB RAM) (used as build box or simulator)&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
* a couple of x86-64 boxes lying aroung running Alpine&lt;br /&gt;
* 28&amp;quot; HD&lt;br /&gt;
* [&#039;&#039;project&#039;&#039;] home server &#039;&#039;(Alpine or Debian based?)&#039;&#039; &#039;&#039;(R-Pi 3 or x86-64?)&#039;&#039;&lt;br /&gt;
** local time server  with {{Pkg|chrony}}&lt;br /&gt;
** local resolver cache  with {{Pkg|unbound}}&lt;br /&gt;
** Kodi (or other MMC)  with {{Pkg|???}}&lt;br /&gt;
** SMTP relay  with {{Pkg|postfix}}&lt;br /&gt;
** HTTP proxy with {{Pkg|squid}}&lt;br /&gt;
** privoxy  with {{Pkg|privoxy}}&lt;br /&gt;
** file server  with {{Pkg|rsync}}&lt;br /&gt;
** HTTP reverse proxy (  with {{Pkg|nginx}}&lt;br /&gt;
** local package repository  with {{Pkg|cron}}&lt;br /&gt;
** gitlab  with {{Pkg|docker-ce}}&lt;br /&gt;
** jenkins master (or other CI toolchain)  with {{Pkg|docker-ce}}&lt;br /&gt;
* [&#039;&#039;project&#039;&#039;] jenkins satellite build box(es)&lt;br /&gt;
* a CPL plug (to switch)&lt;br /&gt;
* a laptop (4 cores, 16GB RAM)&lt;br /&gt;
* a CPL plug (to emonPi)&lt;br /&gt;
* an emonPi, see http://openenergymonitor.org/, running MQTT&lt;br /&gt;
** a Davis Meteo station (data collected with weenx)&lt;br /&gt;
** a WKS Solar inverter (data collected with mpp-solar)&lt;br /&gt;
** several emonTh, see http://openenergymonitor.org/&lt;br /&gt;
** [&#039;&#039;project&#039;&#039;] https://www.zigbee2mqtt.io/&lt;br /&gt;
** [&#039;&#039;project&#039;&#039;] two Toons (by Quby) as home displays, see https://github.com/ToonSoftwareCollective&lt;br /&gt;
&lt;br /&gt;
On top of the emonPI used as data logger for several IoT scattered among the house, I would like to deploy a multimedia center. And to add caching and filtering features to the router (squid, privoxy, tor, ...) and maybe basic internet services for internal consumption... Or I will dedicate a R-Pi 3 or a x86-64 as LAN server... dunno yet...&lt;br /&gt;
&lt;br /&gt;
I still have a full rack of servers and switches lying around but not the electricity power nor the internet uplink to make use of it :(&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20257</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20257"/>
		<updated>2021-11-11T07:31:55Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop)&lt;br /&gt;
* a desktop (16 cores, 128GB RAM) (used as build box or simulator)&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
* a couple of x86-64 boxes lying aroung running Alpine&lt;br /&gt;
* 28&amp;quot; HD&lt;br /&gt;
* [&#039;&#039;project&#039;&#039;] home server &#039;&#039;(Alpine or Debian based?)&#039;&#039; &#039;&#039;(R-Pi 3 or x86-64?)&#039;&#039;&lt;br /&gt;
** local time server&lt;br /&gt;
** local resolver cache&lt;br /&gt;
** Home Assistant (or Domoticz or... )&lt;br /&gt;
** Kodi (or other MMC)&lt;br /&gt;
** SMTP relay&lt;br /&gt;
** HTTP proxy (squid)&lt;br /&gt;
** privoxy&lt;br /&gt;
** file server&lt;br /&gt;
** HTTP reverse proxy (nginx)&lt;br /&gt;
** local package repository&lt;br /&gt;
** gitlab&lt;br /&gt;
** jenkins master (or other CI toolchain)&lt;br /&gt;
* [&#039;&#039;project&#039;&#039;] jenkins satellite build box(es)&lt;br /&gt;
* a CPL plug (to switch)&lt;br /&gt;
* a laptop (4 cores, 16GB RAM)&lt;br /&gt;
* a CPL plug (to emonPi)&lt;br /&gt;
* an emonPi, see http://openenergymonitor.org/, running MQTT&lt;br /&gt;
** a Davis Meteo station (data collected with weenx)&lt;br /&gt;
** a WKS Solar inverter (data collected with mpp-solar)&lt;br /&gt;
** several emonTh, see http://openenergymonitor.org/&lt;br /&gt;
** [&#039;&#039;project&#039;&#039;] https://www.zigbee2mqtt.io/&lt;br /&gt;
** [&#039;&#039;project&#039;&#039;] two Toons (by Quby) as home displays, see https://github.com/ToonSoftwareCollective&lt;br /&gt;
&lt;br /&gt;
On top of the emonPI used as data logger for several IoT scattered among the house, I would like to deploy a multimedia center. And to add caching and filtering features to the router (squid, privoxy, tor, ...) and maybe basic internet services for internal consumption... Or I will dedicate a R-Pi 3 or a x86-64 as LAN server... dunno yet...&lt;br /&gt;
&lt;br /&gt;
I still have a full rack of servers and switches lying around but not the electricity power nor the internet uplink to make use of it :(&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20256</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20256"/>
		<updated>2021-11-11T07:29:15Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop)&lt;br /&gt;
* a desktop (16 cores, 128GB RAM) (used as build box or simulator)&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
* a couple of x86-64 boxes lying aroung running Alpine&lt;br /&gt;
* 28&amp;quot; HD&lt;br /&gt;
* [&#039;&#039;project&#039;&#039;] home server &#039;&#039;(Alpine or Debian based?)&#039;&#039;&lt;br /&gt;
** local time server&lt;br /&gt;
** local resolver cache&lt;br /&gt;
** Home Assistant (or Domoticz or... )&lt;br /&gt;
** Kodi (or other MMC)&lt;br /&gt;
** SMTP relay&lt;br /&gt;
** HTTP proxy (squid)&lt;br /&gt;
** privoxy&lt;br /&gt;
** file server&lt;br /&gt;
** HTTP reverse proxy (nginx)&lt;br /&gt;
** local package repository&lt;br /&gt;
** gitlab&lt;br /&gt;
** jenkins master (or other CI toolchain)&lt;br /&gt;
* [&#039;&#039;project&#039;&#039;] jenkins satellite build box(es)&lt;br /&gt;
* a CPL plug (to switch)&lt;br /&gt;
* a laptop (4 cores, 16GB RAM)&lt;br /&gt;
* a CPL plug (to emonPi)&lt;br /&gt;
* an emonPi, see http://openenergymonitor.org/, running MQTT&lt;br /&gt;
** a Davis Meteo station (data collected with weenx)&lt;br /&gt;
** a WKS Solar inverter (data collected with mpp-solar)&lt;br /&gt;
** several emonTh, see http://openenergymonitor.org/&lt;br /&gt;
** [&#039;&#039;project&#039;&#039;] https://www.zigbee2mqtt.io/&lt;br /&gt;
** [&#039;&#039;project&#039;&#039;] two Toons (by Quby) as home displays, see https://github.com/ToonSoftwareCollective&lt;br /&gt;
&lt;br /&gt;
On top of the emonPI used as data logger for several IoT scattered among the house, I would like to deploy a multimedia center. And to add caching and filtering features to the router (squid, privoxy, tor, ...) and maybe basic internet services for internal consumption... Or I will dedicate a R-Pi 3 or a x86-64 as LAN server... dunno yet...&lt;br /&gt;
&lt;br /&gt;
I still have a full rack of servers and switches lying around but not the electricity power nor the internet uplink to make use of it :(&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20245</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20245"/>
		<updated>2021-11-10T20:47:07Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: update resume&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current home/lab setup is&lt;br /&gt;
&lt;br /&gt;
* An Alpine router x86 running https://github.com/jchdel/select-fastest-gateway connected to two or three different uplinks&lt;br /&gt;
* a switch&lt;br /&gt;
* a R-Pi 4 (used as usual desktop)&lt;br /&gt;
* a desktop (16 cores, 128GB RAM) (used as build box or simulator)&lt;br /&gt;
* dual 43&amp;quot; 4K (DP to desktop, HDMI to R-Pi 4)&lt;br /&gt;
* a couple of x86-64 boxes lying aroung running Alpine&lt;br /&gt;
* 28&amp;quot; HD&lt;br /&gt;
* a CPL plug (to switch)&lt;br /&gt;
* a laptop (4 cores, 16GB RAM)&lt;br /&gt;
* a CPL plug (to emonPi)&lt;br /&gt;
* an emonPi, see http://openenergymonitor.org/, running MQTT&lt;br /&gt;
** a Davis Meteo station (data collected with weenx)&lt;br /&gt;
** a WKS Solar inverter (data collected with mpp-solar)&lt;br /&gt;
** several emonTh, see http://openenergymonitor.org/&lt;br /&gt;
&lt;br /&gt;
On top of the emonPI used as data logger for several IoT scattered among the house, I would like to deploy a multimedia center. And to add caching and filtering features to the router (squid, privoxy, tor, ...) and maybe basic internet services for internal consumption... Or I will dedicate a R-Pi 3 or a x86-64 as LAN server... dunno yet...&lt;br /&gt;
&lt;br /&gt;
I still have a full rack of servers and switches lying around but not the electricity power nor the internet uplink to make use of it :(&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20202</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20202"/>
		<updated>2021-10-20T15:02:52Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: Replaced content with &amp;quot;I run it on alpine 3.13: https://github.com/jchdel/select-fastest-gateway&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I run it on alpine 3.13: https://github.com/jchdel/select-fastest-gateway&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20201</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20201"/>
		<updated>2021-10-20T06:20:26Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: how to select fastest uplink on a router (optimization)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;to be run periodically (I do it every minutes for a 3 ISP setup)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# This script configure the router to use fastest available gateway&lt;br /&gt;
# as default one. It uses some bashism...&lt;br /&gt;
[ -f /tmp/router.order ] &amp;amp;&amp;amp; logger &amp;quot;Already running&amp;quot; &amp;amp;&amp;amp; exit 1 &lt;br /&gt;
NICS=($(ip -br link|awk &#039;{print $1}&#039;)) # index 0 is loopback (lo)&lt;br /&gt;
NNICS=$((${#NICS[@]}-1))&lt;br /&gt;
GWS=()&lt;br /&gt;
IPS=()&lt;br /&gt;
iptables -t mangle -F&lt;br /&gt;
iptables -t nat -F&lt;br /&gt;
# Did we lost all of our gateways?&lt;br /&gt;
ip route | grep -q default || \&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do &lt;br /&gt;
	ifdown ${NICS[$i]}&lt;br /&gt;
	ifup ${NICS[$i]} &amp;amp;&amp;amp; \&lt;br /&gt;
	logger &amp;quot;${NICS[$i]} restarted.&amp;quot; || \&lt;br /&gt;
	logger &amp;quot;Unable to restart ${NICS[$i]}.&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
# Prepare routing tables for each gateway&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do&lt;br /&gt;
	IPS[$i]=&amp;quot;$(ip a s ${NICS[$i]}|awk &#039;/inet/{print $2}&#039;|cut -d/ -f1)&amp;quot;&lt;br /&gt;
	[ -z &amp;quot;${IPS[$i]}&amp;quot; ] &amp;amp;&amp;amp; GWS[$i]=&amp;quot;&amp;quot; &amp;amp;&amp;amp; continue&lt;br /&gt;
	# disable kernel filtering of &amp;quot;unwanted&amp;quot; packets&lt;br /&gt;
	echo 0 &amp;gt; /proc/sys/net/ipv4/conf/${NICS[$i]}/rp_filter&lt;br /&gt;
	GWS[$i]=&amp;quot;$(ip r | grep default | grep -v dead | grep ${NICS[$i]} | cut -d\  -f3)&amp;quot;&lt;br /&gt;
	[ -z &amp;quot;${GWS[$i]}&amp;quot; ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	# duplicate main routing table for each live default gateway&lt;br /&gt;
	ip route flush table $i&lt;br /&gt;
	ip route show table main | grep -Ev ^default | while read ROUTE ; do&lt;br /&gt;
		ip route add table $i $ROUTE&lt;br /&gt;
	done&lt;br /&gt;
	# add default gateway&lt;br /&gt;
	ip route add table $i default via ${GWS[$i]} dev ${NICS[$i]}&lt;br /&gt;
	# mark packets from localhost&lt;br /&gt;
	iptables -t mangle -A OUTPUT -s ${IPS[$i]} -j MARK --set-mark $i&lt;br /&gt;
	# activate alternate routing&lt;br /&gt;
	while $(ip rule del fwmark $i table $i);do .;done 2&amp;gt;/dev/null&lt;br /&gt;
	ip rule add fwmark $i table $i prio ${i}0&lt;br /&gt;
	# MASQUERADE or SNAT ?&lt;br /&gt;
	iptables -t nat -I POSTROUTING -o ${NICS[$i]} -j MASQUERADE #SNAT --to-source ${IPS[$i]}&lt;br /&gt;
done&lt;br /&gt;
# activate changes in policy routing&lt;br /&gt;
ip route flush cache&lt;br /&gt;
# ping same target via each gateway&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do&lt;br /&gt;
	[ -z &amp;quot;${GWS[$i]}&amp;quot; ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	( ping -n -c 5 -q -I ${IPS[$i]} 1.1 &amp;gt;/dev/null \&lt;br /&gt;
		&amp;amp;&amp;amp; logger &amp;quot;1.1 responded for ${IPS[$i]} dev ${NICS[$i]}&amp;quot; \&lt;br /&gt;
		|| logger &amp;quot;No response from 1.1 for ${IPS[$i]} dev ${NICS[$i]}&amp;quot; ; \&lt;br /&gt;
		echo $i &amp;gt;&amp;gt; /tmp/router.order ) &amp;amp;&lt;br /&gt;
done&lt;br /&gt;
wait -n # first gateway to complete&lt;br /&gt;
# meanwhile, main routing table is still active&lt;br /&gt;
INDEX=$(head -1 /tmp/router.order)&lt;br /&gt;
METRIC=1&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do&lt;br /&gt;
	[ -z &amp;quot;${GWS[$i]}&amp;quot; ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	ip route del default via ${GWS[$i]} dev ${NICS[$i]}&lt;br /&gt;
done&lt;br /&gt;
ip route add default via ${GWS[$INDEX]} dev ${NICS[$INDEX]} metric $METRIC&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
logger &amp;quot;Default route set via ${GWS[$INDEX]} dev ${NICS[$INDEX]}.&amp;quot;&lt;br /&gt;
wait # other gateways&lt;br /&gt;
cat /tmp/router.order | while read i&lt;br /&gt;
do&lt;br /&gt;
	[ $i -eq $INDEX ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	METRIC=$(($METRIC+1))&lt;br /&gt;
	ip r a default via ${GWS[$i]} dev ${NICS[$i]} metric $METRIC&lt;br /&gt;
done&lt;br /&gt;
rm -f /tmp/router.order&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20197</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20197"/>
		<updated>2021-10-16T11:38:05Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: how to select fastest uplink on a router (alternative)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;to be run periodically (I do it every minutes for a 3 ISP setup)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# This script configure the router to use fastest available gateway&lt;br /&gt;
# as default one. It uses some bashism...&lt;br /&gt;
[ -f /tmp/router.order ] &amp;amp;&amp;amp; logger &amp;quot;Already running&amp;quot; &amp;amp;&amp;amp; exit 1 &lt;br /&gt;
NICS=($(ip -br link|awk &#039;{print $1}&#039;)) # index 0 is loopback (lo)&lt;br /&gt;
NNICS=$((${#NICS[@]}-1))&lt;br /&gt;
GWS=()&lt;br /&gt;
IPS=()&lt;br /&gt;
iptables -t mangle -F&lt;br /&gt;
iptables -t nat -F&lt;br /&gt;
# Did we lost all of our gateways?&lt;br /&gt;
ip route | grep -q default || \&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do &lt;br /&gt;
	ifdown ${NICS[$i]}&lt;br /&gt;
	ifup ${NICS[$i]} &amp;amp;&amp;amp; \&lt;br /&gt;
	logger &amp;quot;${NICS[$i]} restarted.&amp;quot; || \&lt;br /&gt;
	logger &amp;quot;Unable to restart ${NICS[$i]}.&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
# Prepare routing tables for each gateway&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do&lt;br /&gt;
	IPS[$i]=&amp;quot;$(ip a s ${NICS[$i]}|awk &#039;/inet/{print $2}&#039;|cut -d/ -f1)&amp;quot;&lt;br /&gt;
	[ -z &amp;quot;${IPS[$i]}&amp;quot; ] &amp;amp;&amp;amp; GWS[$i]=&amp;quot;&amp;quot; &amp;amp;&amp;amp; continue&lt;br /&gt;
	GWS[$i]=&amp;quot;$(ip r | grep default | grep -v dead | grep ${NICS[$i]} | cut -d\  -f3)&amp;quot;&lt;br /&gt;
	[ -z &amp;quot;${GWS[$i]}&amp;quot; ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	# duplicate main routing table for each live default gateway&lt;br /&gt;
	ip route flush table $i&lt;br /&gt;
	ip route show table main | grep -Ev ^default | while read ROUTE ; do&lt;br /&gt;
		ip route add table $i $ROUTE&lt;br /&gt;
	done&lt;br /&gt;
	# add default gateway&lt;br /&gt;
	ip route add table $i default via ${GWS[$i]} dev ${NICS[$i]}&lt;br /&gt;
	# mark packets from localhost&lt;br /&gt;
	iptables -t mangle -A OUTPUT -s ${IPS[$i]} -j MARK --set-mark $i&lt;br /&gt;
	# activate alternate routing&lt;br /&gt;
	while $(ip rule del fwmark $i table $i);do .;done 2&amp;gt;/dev/null&lt;br /&gt;
	ip rule add fwmark $i table $i prio ${i}0&lt;br /&gt;
	# disable kernel filtering of &amp;quot;unwanted&amp;quot; packets&lt;br /&gt;
	echo 0 &amp;gt; /proc/sys/net/ipv4/conf/${NICS[$i]}/rp_filter&lt;br /&gt;
done&lt;br /&gt;
# activate changes in policy routing&lt;br /&gt;
ip route flush cache&lt;br /&gt;
# ping same target via each gateway&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do&lt;br /&gt;
	[ -z &amp;quot;${GWS[$i]}&amp;quot; ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	( ping -n -c 5 -q -I ${IPS[$i]} 1.1 &amp;gt;/dev/null \&lt;br /&gt;
		&amp;amp;&amp;amp; logger &amp;quot;1.1 responded for ${IPS[$i]} dev ${NICS[$i]}&amp;quot; \&lt;br /&gt;
		|| logger &amp;quot;No response from 1.1 for ${IPS[$i]} dev ${NICS[$i]}&amp;quot; ; \&lt;br /&gt;
		echo $i &amp;gt;&amp;gt; /tmp/router.order ) &amp;amp;&lt;br /&gt;
done&lt;br /&gt;
wait -n # first gateway to complete&lt;br /&gt;
INDEX=$(head -1 /tmp/router.order)&lt;br /&gt;
# set default router for FORWARDED packets&lt;br /&gt;
iptables -t mangle -A FORWARD -j MARK --set-mark $INDEX&lt;br /&gt;
# MASQUERADE or SNAT ?&lt;br /&gt;
iptables -t nat -I POSTROUTING -o ${NICS[$INDEX]} -j MASQUERADE #SNAT --to-source ${IPS[$INDEX]}&lt;br /&gt;
ip route flush cache # not sure this one is needed?&lt;br /&gt;
logger &amp;quot;Default route set via ${GWS[$INDEX]} dev ${NICS[$INDEX]}.&amp;quot;&lt;br /&gt;
wait # other gateways to complete&lt;br /&gt;
rm -f /tmp/router.order&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wait -n&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do&lt;br /&gt;
	[ -z &amp;quot;${GWS[$i]}&amp;quot; ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	ip r del default via ${GWS[$i]} dev ${NICS[$i]}&lt;br /&gt;
done&lt;br /&gt;
INDEX=$(head -1 /tmp/router.order)&lt;br /&gt;
METRIC=1&lt;br /&gt;
[ -z &amp;quot;${GWS[$INDEX]}&amp;quot; ] || \&lt;br /&gt;
ip r a default via ${GWS[$INDEX]} dev ${NICS[$INDEX]} metric $METRIC&lt;br /&gt;
# MASQUERADE or SNAT ?&lt;br /&gt;
iptables -t nat -I POSTROUTING -o ${NICS[$INDEX]} -j MASQUERADE #SNAT --to-source ${IPS[$INDEX]}&lt;br /&gt;
logger &amp;quot;Default route set via ${GWS[$INDEX]} dev ${NICS[$INDEX]}.&amp;quot;&lt;br /&gt;
wait&lt;br /&gt;
cat /tmp/router.order | while read i&lt;br /&gt;
do&lt;br /&gt;
	[ $i -eq $INDEX ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	[ -z &amp;quot;${GWS[$i]}&amp;quot; ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	METRIC=$(($METRIC+1))&lt;br /&gt;
	ip r a default via ${GWS[$i]} dev ${NICS[$i]} metric $METRIC&lt;br /&gt;
done&lt;br /&gt;
rm -f /tmp/router.order&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20196</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=20196"/>
		<updated>2021-10-16T10:31:11Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: how to select fastest uplink on a router&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;to be run periodically (I do it every minutes for a 3 ISP setup)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# This script configure the router to use fastest available gateway&lt;br /&gt;
# as default one. It uses some bashism...&lt;br /&gt;
[ -f /tmp/router.order ] &amp;amp;&amp;amp; logger &amp;quot;Already running&amp;quot; &amp;amp;&amp;amp; exit 1 &lt;br /&gt;
NICS=($(ip -br link|awk &#039;{print $1}&#039;)) # index 0 is loopback (lo)&lt;br /&gt;
NNICS=$((${#NICS[@]}-1))&lt;br /&gt;
GWS=()&lt;br /&gt;
IPS=()&lt;br /&gt;
iptables -t mangle -F&lt;br /&gt;
iptables -t nat -F&lt;br /&gt;
iptables -F INPUT&lt;br /&gt;
iptables -F OUTPUT&lt;br /&gt;
# Did we lost all of our gateways?&lt;br /&gt;
ip route | grep -q default || \&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do &lt;br /&gt;
	ifdown ${NICS[$i]}&lt;br /&gt;
	ifup ${NICS[$i]} &amp;amp;&amp;amp; \&lt;br /&gt;
	logger &amp;quot;${NICS[$i]} restarted.&amp;quot; || \&lt;br /&gt;
	logger &amp;quot;Unable to restart ${NICS[$i]}.&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
# Prepare routing tables for each gateway&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do&lt;br /&gt;
	IPS[$i]=&amp;quot;$(ip a s ${NICS[$i]}|awk &#039;/inet/{print $2}&#039;|cut -d/ -f1)&amp;quot;&lt;br /&gt;
	[ -z &amp;quot;${IPS[$i]}&amp;quot; ] &amp;amp;&amp;amp; GWS[$i]=&amp;quot;&amp;quot; &amp;amp;&amp;amp; continue&lt;br /&gt;
	GWS[$i]=&amp;quot;$(ip r | grep default | grep -v dead | grep ${NICS[$i]} | cut -d\  -f3)&amp;quot;&lt;br /&gt;
	[ -z &amp;quot;${GWS[$i]}&amp;quot; ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	# duplicate main routing table for each live default gateway&lt;br /&gt;
	ip route flush table $i&lt;br /&gt;
	ip route show table main | grep -Ev ^default | while read ROUTE ; do&lt;br /&gt;
		ip route add table $i $ROUTE&lt;br /&gt;
	done&lt;br /&gt;
	# add default gateway&lt;br /&gt;
	ip route add table $i default via ${GWS[$i]} dev ${NICS[$i]}&lt;br /&gt;
	# mark packets from localhost&lt;br /&gt;
	iptables -t mangle -A OUTPUT -s ${IPS[$i]} -j MARK --set-mark $i&lt;br /&gt;
	# activate alternate routing&lt;br /&gt;
	while $(ip rule del fwmark $i table $i);do .;done 2&amp;gt;/dev/null&lt;br /&gt;
	ip rule add fwmark $i table $i prio ${i}0&lt;br /&gt;
	# disable kernel filtering of &amp;quot;unwanted&amp;quot; packets&lt;br /&gt;
	echo 0 &amp;gt; /proc/sys/net/ipv4/conf/${NICS[$i]}/rp_filter&lt;br /&gt;
done&lt;br /&gt;
# activate changes in policy routing&lt;br /&gt;
ip route flush cache&lt;br /&gt;
# ping same target via each gateway&lt;br /&gt;
for ((i=1; i&amp;lt;=$NNICS; i++))&lt;br /&gt;
do&lt;br /&gt;
	[ -z &amp;quot;${GWS[$i]}&amp;quot; ] &amp;amp;&amp;amp; continue&lt;br /&gt;
	( ping -n -c 5 -q -I ${IPS[$i]} 1.1 &amp;gt;/dev/null \&lt;br /&gt;
		&amp;amp;&amp;amp; logger &amp;quot;1.1 responded for ${IPS[$i]} dev ${NICS[$i]}&amp;quot; \&lt;br /&gt;
		|| logger &amp;quot;No response from 1.1 for ${IPS[$i]} dev ${NICS[$i]}&amp;quot; ; \&lt;br /&gt;
		echo $i &amp;gt;&amp;gt; /tmp/router.order ) &amp;amp;&lt;br /&gt;
done&lt;br /&gt;
wait -n # first gateway to complete&lt;br /&gt;
INDEX=$(head -1 /tmp/router.order)&lt;br /&gt;
# set default router for FORWARDED packets&lt;br /&gt;
iptables -t mangle -A FORWARD -j MARK --set-mark $INDEX&lt;br /&gt;
# MASQUERADE or SNAT ?&lt;br /&gt;
iptables -t nat -I POSTROUTING -o ${NICS[$INDEX]} -j MASQUERADE #SNAT --to-source ${IPS[$INDEX]}&lt;br /&gt;
ip route flush cache # not sure this one is needed?&lt;br /&gt;
logger &amp;quot;Default route set via ${GWS[$INDEX]} dev ${NICS[$INDEX]}.&amp;quot;&lt;br /&gt;
wait # other gateways to complete&lt;br /&gt;
rm -f /tmp/router.order&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Talk:Alpine_on_ARM&amp;diff=16989</id>
		<title>Talk:Alpine on ARM</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Talk:Alpine_on_ARM&amp;diff=16989"/>
		<updated>2020-03-04T09:53:41Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: Created page with &amp;quot;Successful install on board:  * orange-pi-pc - 2020-02-15 * sunvell R69 - 2020-03-01 (same SD as the opipc)&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Successful install on board:&lt;br /&gt;
&lt;br /&gt;
* orange-pi-pc - 2020-02-15&lt;br /&gt;
* sunvell R69 - 2020-03-01 (same SD as the opipc)&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=16920</id>
		<title>User:Jchdel</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=User:Jchdel&amp;diff=16920"/>
		<updated>2020-02-18T05:42:11Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: Created page with &amp;quot;After live migrating a fleet of (~150) embedded devices from Debian 8 to Alpine 3.6, it is now time to refactor the disk layout (i.e. reinstalling remotely and live) and migra...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;After live migrating a fleet of (~150) embedded devices from Debian 8 to Alpine 3.6, it is now time to refactor the disk layout (i.e. reinstalling remotely and live) and migrate (fleet is now ~250 devices) to latest Alpine for one.&lt;br /&gt;
&lt;br /&gt;
On the other hand I now need to have same setup on x86_64 and on armv7 and they want to reduce costs deploying new units. I just installed latest Alpine on a orange-pi-pc and it runs like a charm.&lt;br /&gt;
&lt;br /&gt;
Meanwhile, I discovered projects like balena.io, foundries.io or mender.io, both solving the OTA problem. I wonder if I could adapt mender.io to distribute an Alpine system running in mode RUN-FROM-RAM  with custom partitioning of the internal storage... I will give it a try and report results here...&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Talk:DIY_Fully_working_Alpine_Linux_for_Allwinner_and_Other_ARM_SOCs&amp;diff=16919</id>
		<title>Talk:DIY Fully working Alpine Linux for Allwinner and Other ARM SOCs</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Talk:DIY_Fully_working_Alpine_Linux_for_Allwinner_and_Other_ARM_SOCs&amp;diff=16919"/>
		<updated>2020-02-18T05:23:53Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: add stepped procedure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi,&amp;lt;br&amp;gt;&lt;br /&gt;
I&#039;m currently trying the procedure to install AL on orange-pi-pc.&amp;lt;br&amp;gt;&lt;br /&gt;
I&#039;m cross compiling from a debian box.&amp;lt;br&amp;gt;&lt;br /&gt;
Compilation of kernel (linux-sunxi) fails with &lt;br /&gt;
&lt;br /&gt;
 $ make zImage&lt;br /&gt;
   CHK     include/linux/version.h&lt;br /&gt;
   CHK     include/generated/utsrelease.h&lt;br /&gt;
 make[1]: &#039;include/generated/mach-types.h&#039; is up to date.&lt;br /&gt;
   CALL    scripts/checksyscalls.sh&lt;br /&gt;
   CHK     include/generated/compile.h&lt;br /&gt;
   GEN     .version&lt;br /&gt;
   CHK     include/generated/compile.h&lt;br /&gt;
   UPD     include/generated/compile.h&lt;br /&gt;
   CC      init/version.o&lt;br /&gt;
   LD      init/built-in.o&lt;br /&gt;
   LD      .tmp_vmlinux1&lt;br /&gt;
 arm-linux-gnueabihf-ld: no machine record defined&lt;br /&gt;
 arch/arm/kernel/built-in.o: In function `kretprobe_trampoline&#039;:&lt;br /&gt;
 /srv/r_and_d/linux-sunxi/arch/arm/kernel/kprobes.c:379: undefined reference to `trampoline_handler&#039;&lt;br /&gt;
 Makefile:875: recipe for target &#039;.tmp_vmlinux1&#039; failed&lt;br /&gt;
 make: *** [.tmp_vmlinux1] Error 1&lt;br /&gt;
&lt;br /&gt;
I&#039;m trying to search any clue on the net to fix this but nothing so far :(&amp;lt;br&amp;gt;&lt;br /&gt;
any idea?&lt;br /&gt;
&lt;br /&gt;
--[[User:Jchdel|Jchdel]] ([[User talk:Jchdel|talk]]) 07:03, 15 February 2020 (UTC)&lt;br /&gt;
&lt;br /&gt;
I went the alternate way and build the kernel with armbian toolbox.&amp;lt;br&amp;gt;&lt;br /&gt;
I&#039;m now a happy Alpine Linux user on orange-pi-pc. It took be about 7 hours to complete &amp;quot;setup-alpine&amp;quot; starting from scratch.&amp;lt;br&amp;gt;&lt;br /&gt;
A point of attention is the size of initramfs!&amp;lt;br&amp;gt;&lt;br /&gt;
I learned a lot about arm ecosystem. Thanks a lot for this great introduction!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
started to prepare an Alpine Linux SD card for the orange-pi-pc&lt;br /&gt;
# compile kernel from source (kernel-sunxi)&lt;br /&gt;
# compile kernel modules from source&lt;br /&gt;
# compile u-boot from source&lt;br /&gt;
# download rootfs from alpinelinux.org&lt;br /&gt;
# extract initramfs&lt;br /&gt;
# extract modloop&lt;br /&gt;
# extract SPL&lt;br /&gt;
# extract dtb&lt;br /&gt;
# extract kernel&lt;br /&gt;
# extract modules&lt;br /&gt;
# extract firmware&lt;br /&gt;
# adapt and generate initramfs&lt;br /&gt;
# adapt and generate modloop&lt;br /&gt;
# prepare u-boot macro (boot.cmd)&lt;br /&gt;
# generate u-boot macro (boot.scr)&lt;br /&gt;
# flash spl&lt;br /&gt;
# flash u-boot&lt;br /&gt;
# partition SD&lt;br /&gt;
# format new partition&lt;br /&gt;
# mount new partition&lt;br /&gt;
# copy kernel, initramfs, modloop, dtp, and u-boot macro&lt;br /&gt;
# umount&lt;br /&gt;
# put SD in orange-pi-pc&lt;br /&gt;
# power on&lt;br /&gt;
# enjoy!&lt;br /&gt;
&lt;br /&gt;
--[[User:Jchdel|Jchdel]] ([[User talk:Jchdel|talk]]) 08:30, 16 February 2020 (UTC)&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Talk:DIY_Fully_working_Alpine_Linux_for_Allwinner_and_Other_ARM_SOCs&amp;diff=16903</id>
		<title>Talk:DIY Fully working Alpine Linux for Allwinner and Other ARM SOCs</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Talk:DIY_Fully_working_Alpine_Linux_for_Allwinner_and_Other_ARM_SOCs&amp;diff=16903"/>
		<updated>2020-02-16T08:30:21Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi,&amp;lt;br&amp;gt;&lt;br /&gt;
I&#039;m currently trying the procedure to install AL on orange-pi-pc.&amp;lt;br&amp;gt;&lt;br /&gt;
I&#039;m cross compiling from a debian box.&amp;lt;br&amp;gt;&lt;br /&gt;
Compilation of kernel (linux-sunxi) fails with &lt;br /&gt;
&lt;br /&gt;
 $ make zImage&lt;br /&gt;
   CHK     include/linux/version.h&lt;br /&gt;
   CHK     include/generated/utsrelease.h&lt;br /&gt;
 make[1]: &#039;include/generated/mach-types.h&#039; is up to date.&lt;br /&gt;
   CALL    scripts/checksyscalls.sh&lt;br /&gt;
   CHK     include/generated/compile.h&lt;br /&gt;
   GEN     .version&lt;br /&gt;
   CHK     include/generated/compile.h&lt;br /&gt;
   UPD     include/generated/compile.h&lt;br /&gt;
   CC      init/version.o&lt;br /&gt;
   LD      init/built-in.o&lt;br /&gt;
   LD      .tmp_vmlinux1&lt;br /&gt;
 arm-linux-gnueabihf-ld: no machine record defined&lt;br /&gt;
 arch/arm/kernel/built-in.o: In function `kretprobe_trampoline&#039;:&lt;br /&gt;
 /srv/r_and_d/linux-sunxi/arch/arm/kernel/kprobes.c:379: undefined reference to `trampoline_handler&#039;&lt;br /&gt;
 Makefile:875: recipe for target &#039;.tmp_vmlinux1&#039; failed&lt;br /&gt;
 make: *** [.tmp_vmlinux1] Error 1&lt;br /&gt;
&lt;br /&gt;
I&#039;m trying to search any clue on the net to fix this but nothing so far :(&amp;lt;br&amp;gt;&lt;br /&gt;
any idea?&lt;br /&gt;
&lt;br /&gt;
--[[User:Jchdel|Jchdel]] ([[User talk:Jchdel|talk]]) 07:03, 15 February 2020 (UTC)&lt;br /&gt;
&lt;br /&gt;
I went the alternate way and build the kernel with armbian toolbox.&amp;lt;br&amp;gt;&lt;br /&gt;
I&#039;m now a happy Alpine Linux user on orange-pi-pc. It took be about 7 hours to complete &amp;quot;setup-alpine&amp;quot; starting from scratch.&amp;lt;br&amp;gt;&lt;br /&gt;
A point of attention is the size of initramfs!&amp;lt;br&amp;gt;&lt;br /&gt;
I learned a lot about arm ecosystem. Thanks a lot for this great introduction!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Jchdel|Jchdel]] ([[User talk:Jchdel|talk]]) 08:30, 16 February 2020 (UTC)&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Talk:DIY_Fully_working_Alpine_Linux_for_Allwinner_and_Other_ARM_SOCs&amp;diff=16901</id>
		<title>Talk:DIY Fully working Alpine Linux for Allwinner and Other ARM SOCs</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Talk:DIY_Fully_working_Alpine_Linux_for_Allwinner_and_Other_ARM_SOCs&amp;diff=16901"/>
		<updated>2020-02-15T07:03:19Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi,&lt;br /&gt;
I&#039;m currently trying the procedure to install AL on orange-pi-pc.&lt;br /&gt;
I&#039;m cross compiling from a debian box.&lt;br /&gt;
Compilation of kernel (linux-sunxi) fails with &lt;br /&gt;
&lt;br /&gt;
 $ make zImage&lt;br /&gt;
   CHK     include/linux/version.h&lt;br /&gt;
   CHK     include/generated/utsrelease.h&lt;br /&gt;
 make[1]: &#039;include/generated/mach-types.h&#039; is up to date.&lt;br /&gt;
   CALL    scripts/checksyscalls.sh&lt;br /&gt;
   CHK     include/generated/compile.h&lt;br /&gt;
   GEN     .version&lt;br /&gt;
   CHK     include/generated/compile.h&lt;br /&gt;
   UPD     include/generated/compile.h&lt;br /&gt;
   CC      init/version.o&lt;br /&gt;
   LD      init/built-in.o&lt;br /&gt;
   LD      .tmp_vmlinux1&lt;br /&gt;
 arm-linux-gnueabihf-ld: no machine record defined&lt;br /&gt;
 arch/arm/kernel/built-in.o: In function `kretprobe_trampoline&#039;:&lt;br /&gt;
 /srv/r_and_d/linux-sunxi/arch/arm/kernel/kprobes.c:379: undefined reference to `trampoline_handler&#039;&lt;br /&gt;
 Makefile:875: recipe for target &#039;.tmp_vmlinux1&#039; failed&lt;br /&gt;
 make: *** [.tmp_vmlinux1] Error 1&lt;br /&gt;
&lt;br /&gt;
I&#039;m trying to search any clue on the net to fix this but nothing so far :(&lt;br /&gt;
any idea?&lt;br /&gt;
--[[User:Jchdel|Jchdel]] ([[User talk:Jchdel|talk]]) 07:03, 15 February 2020 (UTC)&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Talk:DIY_Fully_working_Alpine_Linux_for_Allwinner_and_Other_ARM_SOCs&amp;diff=16900</id>
		<title>Talk:DIY Fully working Alpine Linux for Allwinner and Other ARM SOCs</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Talk:DIY_Fully_working_Alpine_Linux_for_Allwinner_and_Other_ARM_SOCs&amp;diff=16900"/>
		<updated>2020-02-15T06:59:36Z</updated>

		<summary type="html">&lt;p&gt;Jchdel: trying to implement the how to...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi,&lt;br /&gt;
I&#039;m currently trying the procedure to install AL on orange-pi-pc.&lt;br /&gt;
I&#039;m cross compiling from a debian box.&lt;br /&gt;
Compilation of kernel (linux-sunxi) fails with &lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$ make zImage&lt;br /&gt;
  CHK     include/linux/version.h&lt;br /&gt;
  CHK     include/generated/utsrelease.h&lt;br /&gt;
make[1]: &#039;include/generated/mach-types.h&#039; is up to date.&lt;br /&gt;
  CALL    scripts/checksyscalls.sh&lt;br /&gt;
  CHK     include/generated/compile.h&lt;br /&gt;
  GEN     .version&lt;br /&gt;
  CHK     include/generated/compile.h&lt;br /&gt;
  UPD     include/generated/compile.h&lt;br /&gt;
  CC      init/version.o&lt;br /&gt;
  LD      init/built-in.o&lt;br /&gt;
  LD      .tmp_vmlinux1&lt;br /&gt;
arm-linux-gnueabihf-ld: no machine record defined&lt;br /&gt;
arch/arm/kernel/built-in.o: In function `kretprobe_trampoline&#039;:&lt;br /&gt;
/srv/r_and_d/linux-sunxi/arch/arm/kernel/kprobes.c:379: undefined reference to `trampoline_handler&#039;&lt;br /&gt;
Makefile:875: recipe for target &#039;.tmp_vmlinux1&#039; failed&lt;br /&gt;
make: *** [.tmp_vmlinux1] Error 1&lt;br /&gt;
&amp;lt;/nowiki&amp;gt; I&#039;m trying to search any clue on the net to fix this but nothing so far :(&lt;br /&gt;
any idea?&lt;/div&gt;</summary>
		<author><name>Jchdel</name></author>
	</entry>
</feed>