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