User:Jchdel: Difference between revisions
(How to transfrom a diskless USB key in a PXE boot server) |
No edit summary |
||
Line 168: | Line 168: | ||
grep nginx /etc/apk/world && HTTP_SERVER="" || HTTP_SERVER=darkhttpd | grep nginx /etc/apk/world && HTTP_SERVER="" || HTTP_SERVER=darkhttpd | ||
apk add | apk add darkhttpd nfs-utils dnsmasq syslinux | ||
export SUDO="" | export SUDO="" | ||
Line 175: | Line 174: | ||
ALPINE=alpine-netboot-3.17.3-x86_64.tar.gz | ALPINE=alpine-netboot-3.17.3-x86_64.tar.gz | ||
[ -f $ALPINE ] || \ | [ -f $ALPINE ] || \ | ||
while true;do | while true;do | ||
Line 192: | Line 179: | ||
&& break | && break | ||
done | done | ||
mkdir -p /media/usb/tftpboot/pxelinux/pxelinux.cfg | mkdir -p /media/usb/tftpboot/pxelinux/pxelinux.cfg | ||
Line 204: | Line 189: | ||
# populate HTTP server | # populate HTTP server | ||
#cd /media/usb | #cd /media/usb | ||
# | # add default apkovl.tar.gz here | ||
# configure darkhttpd (nginx should already be done by bootstrap-manager) | # configure darkhttpd (nginx should already be done by bootstrap-manager) |
Revision as of 13:41, 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 darkhttpd nfs-utils dnsmasq syslinux export SUDO="" abuild-keygen -n -i -a ALPINE=alpine-netboot-3.17.3-x86_64.tar.gz [ -f $ALPINE ] || \ while true;do wget -c https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/$ALPINE \ && break done 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 # add default apkovl.tar.gz here # 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