pxeboot/create_pxeinitrd.sh

221 lines
5.2 KiB
Bash
Executable File

#!/bin/bash
set -Eeuxo pipefail
SIZE=10000
HOSTNAME=localhost
RELEASE=unstable
TMP_DIR=$PWD
MNT_DIR=$TMP_DIR/newroot
RESULT_DIR=${RESULT_DIR:=$TMP_DIR/files}
# Configs overwritable via environment variables
FLAVOUR=${FLAVOUR:=debian} # Either 'debian' or 'ubuntu'
INCLUDES=${INCLUDES:="openssh-server,init,curl,parted,xz-utils,vim,locales-all,less,ceph-common,dmidecode,iputils-ping,fping,tcpdump,rsync,ethtool,lldpd,iproute2,net-tools,sudo,gnupg,tcpdump,mtr-tiny,ifupdown,ipmitool,iptables,telnet,netcat,bridge-utils,vlan,ifstat,ncurses-term,wget,dhcpcd5"}
MIRROR=${MIRROR:="https://mirrors.wit.com/debian"}
ARCH=${ARCH:=amd64}
fail() {
echo ""
echo "FAILED: $1"
exit 1
}
cancel() {
fail "CTRL-C detected"
}
trap cancel INT
mkdir $MNT_DIR
if [ $FLAVOUR == "debian" ]; then
BOOT_PKG="linux-image-$ARCH"
elif [ $FLAVOUR == "ubuntu" ]; then
BOOT_PKG="linux-image-generic"
fi
###################
## build root fs ##
###################
echo "Installing Debian $RELEASE..."
debootstrap --variant=minbase --include=$INCLUDES,$BOOT_PKG $RELEASE $MNT_DIR $MIRROR || fail "cannot install $RELEASE"
echo $HOSTNAME > $MNT_DIR/etc/hostname
cat <<EOF > $MNT_DIR/etc/hosts
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF
rm -f $MNT_DIR/etc/apt/sources.list
echo 'deb https://mirrors.wit.com/debian sid main contrib non-free' > $MNT_DIR/etc/apt/sources.list
echo 'deb https://mirrors.wit.com/debcore sid main' >> $MNT_DIR/etc/apt/sources.list
curl https://mirrors.wit.com/debcore/public.key | LANG=C DEBIAN_FRONTEND=noninteractive chroot $MNT_DIR apt-key add -
LANG=C DEBIAN_FRONTEND=noninteractive chroot $MNT_DIR apt-get update
LANG=C DEBIAN_FRONTEND=noninteractive chroot $MNT_DIR apt-get clean
cat /dev/null > $MNT_DIR/etc/machine-id
sed -i '/PasswordAuthentication/d' $MNT_DIR/etc/ssh/sshd_config
echo "PasswordAuthentication no" >>$MNT_DIR/etc/ssh/sshd_config
mkdir -p $MNT_DIR/root/.ssh
echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDd7rLlS1NmTpBr5KP5ryuA/euGD8I6uc2RCg4sCIlvH0FhEPb123QuMVImHi23ftVP61cKZXm8MlTtAoLHduYtGMHCkJWAAkiIpPetAP2KPIpuadtgIS8xuD/TCYjl0xNXLh0M1C7i7HOnTd8yr+3QNjUppyDdKjLvMQbPWZZTU5rt7CYoGlrxHjieCkq9jj8kRjRARUaAJ4DHEgMFUDIcq3JYluzzkgPK/JFwoq/IokVQCr5qfQRwr3SCkD4sIuGTj+J67uzabIr/xDBqlrMW3T+7YfY12ciHpijob+l7xESkJ+6Gxh56z8llBkGiVyh3UqnmW4MvfuAA/D3Dzhwr afrank@adams-mbp.lan > $MNT_DIR/root/.ssh/authorized_keys
cat <<EOF > $MNT_DIR/etc/systemd/system/start-me-up.service
[Unit]
Description=WIT System Startup
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/start_me_up.sh
RemainAfterExit=true
ExecStop=/usr/local/bin/shut_me_down.sh
StandardOutput=journal
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF > $MNT_DIR/usr/local/bin/start_me_up.sh
#!/bin/bash
eval "kernel_args=( \$(cat /proc/cmdline) )"
for i in "\${kernel_args[@]}"
do
if [ \${i:0:4} = exec ]
then
export -- "\$i"
fi
done
echo \$execstartup
eval \$execstartup
EOF
cat <<EOF > $MNT_DIR/usr/local/bin/shut_me_down.sh
#!/bin/bash
eval "kernel_args=( \$(cat /proc/cmdline) )"
for i in "\${kernel_args[@]}"
do
if [ \${i:0:4} = exec ]
then
export -- "\$i"
fi
done
echo \$execshutdown
eval \$execshutdown
EOF
cat <<EOF >$MNT_DIR/etc/dhcpcd.conf
hostname
duid
slaac hwaddr
noipv4ll
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes, ntp_servers, interface_mtu
require dhcp_server_identifier
EOF
chmod +x $MNT_DIR/usr/local/bin/start_me_up.sh
chmod +x $MNT_DIR/usr/local/bin/shut_me_down.sh
chroot $MNT_DIR systemctl enable start-me-up || fail "failed to enable start-me-up"
#echo "Enter root password:"
#while ! chroot $MNT_DIR passwd root
#do
# echo "Try again"
#done
##################
## build initrd ##
##################
mkdir -p $TMP_DIR/initramfs/bin
wget -O $TMP_DIR/initramfs/bin/busybox https://www.busybox.net/downloads/binaries/1.26.1-defconfig-multiarch/busybox-x86_64
chmod +x $TMP_DIR/initramfs/bin/busybox
cat <<-"EOF" >$TMP_DIR/initramfs/init
#!/bin/busybox sh
# Dump to sh if something fails
error() {
echo "Jumping into the shell..."
setsid cttyhack sh
}
# Populate /bin with binaries from busybox
/bin/busybox --install /bin
mkdir -p /proc
mount -t proc proc /proc
mkdir -p /sys
mount -t sysfs sysfs /sys
mkdir -p /sys/dev
mkdir -p /var/run
mkdir -p /dev
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
# Populate /dev
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /newroot
mount -t tmpfs -o size=${SIZE}m tmpfs /newroot || error
echo "Extracting rootfs... "
xz -d -c -f rootfs.tar.xz | tar -x -f - -C /newroot || error
mount --move /sys /newroot/sys
mount --move /proc /newroot/proc
mount --move /dev /newroot/dev
exec switch_root /newroot /sbin/init || error
EOF
chmod +x $TMP_DIR/initramfs/init
tar -cJf $TMP_DIR/initramfs/rootfs.tar.xz -C $TMP_DIR/newroot .
cp $TMP_DIR/newroot/boot/vmlinuz-* $RESULT_DIR/vmlinuz
cd $TMP_DIR/initramfs
find . -print0 | cpio --null -ov --format=newc | gzip -9 > $RESULT_DIR/initramfs.gz
ls -la $RESULT_DIR/
exit 0