1#!/usr/bin/env bash 2 3###################################################################### 4# 3) install dependencies for compiling and loading 5# 6# $1: OS name (like 'fedora41') 7# $2: (optional) Experimental Fedora kernel version, like "6.14" to 8# install instead of Fedora defaults. 9###################################################################### 10 11set -eu 12 13function archlinux() { 14 echo "##[group]Running pacman -Syu" 15 sudo btrfs filesystem resize max / 16 sudo pacman -Syu --noconfirm 17 echo "##[endgroup]" 18 19 echo "##[group]Install Development Tools" 20 sudo pacman -Sy --noconfirm base-devel bc cpio cryptsetup dhclient dkms \ 21 fakeroot fio gdb inetutils jq less linux linux-headers lsscsi nfs-utils \ 22 parted pax perf python-packaging python-setuptools qemu-guest-agent ksh \ 23 samba strace sysstat rng-tools rsync wget xxhash 24 echo "##[endgroup]" 25} 26 27function debian() { 28 export DEBIAN_FRONTEND="noninteractive" 29 30 echo "##[group]Running apt-get update+upgrade" 31 sudo sed -i '/[[:alpha:]]-backports/d' /etc/apt/sources.list 32 sudo apt-get update -y 33 sudo apt-get upgrade -y 34 echo "##[endgroup]" 35 36 echo "##[group]Install Development Tools" 37 sudo apt-get install -y \ 38 acl alien attr autoconf bc cpio cryptsetup curl dbench dh-python dkms \ 39 fakeroot fio gdb gdebi git ksh lcov isc-dhcp-client jq libacl1-dev \ 40 libaio-dev libattr1-dev libblkid-dev libcurl4-openssl-dev libdevmapper-dev \ 41 libelf-dev libffi-dev libmount-dev libpam0g-dev libselinux-dev libssl-dev \ 42 libtool libtool-bin libudev-dev libunwind-dev linux-headers-$(uname -r) \ 43 lsscsi nfs-kernel-server pamtester parted python3 python3-all-dev \ 44 python3-cffi python3-dev python3-distlib python3-packaging libtirpc-dev \ 45 python3-setuptools python3-sphinx qemu-guest-agent rng-tools rpm2cpio \ 46 rsync samba strace sysstat uuid-dev watchdog wget xfslibs-dev xxhash \ 47 zlib1g-dev 48 echo "##[endgroup]" 49} 50 51function freebsd() { 52 export ASSUME_ALWAYS_YES="YES" 53 54 echo "##[group]Install Development Tools" 55 sudo pkg install -y autoconf automake autotools base64 checkbashisms fio \ 56 gdb gettext gettext-runtime git gmake gsed jq ksh lcov libtool lscpu \ 57 pkgconf python python3 pamtester pamtester qemu-guest-agent rsync xxhash 58 sudo pkg install -xy \ 59 '^samba4[[:digit:]]+$' \ 60 '^py3[[:digit:]]+-cffi$' \ 61 '^py3[[:digit:]]+-sysctl$' \ 62 '^py3[[:digit:]]+-setuptools$' \ 63 '^py3[[:digit:]]+-packaging$' 64 echo "##[endgroup]" 65} 66 67# common packages for: almalinux, centos, redhat 68function rhel() { 69 echo "##[group]Running dnf update" 70 echo "max_parallel_downloads=10" | sudo -E tee -a /etc/dnf/dnf.conf 71 sudo dnf clean all 72 sudo dnf update -y --setopt=fastestmirror=1 --refresh 73 echo "##[endgroup]" 74 75 echo "##[group]Install Development Tools" 76 77 # Alma wants "Development Tools", Fedora 41 wants "development-tools" 78 if ! sudo dnf group install -y "Development Tools" ; then 79 echo "Trying 'development-tools' instead of 'Development Tools'" 80 sudo dnf group install -y development-tools 81 fi 82 83 sudo dnf install -y \ 84 acl attr bc bzip2 cryptsetup curl dbench dkms elfutils-libelf-devel fio \ 85 gdb git jq kernel-rpm-macros ksh libacl-devel libaio-devel \ 86 libargon2-devel libattr-devel libblkid-devel libcurl-devel libffi-devel \ 87 ncompress libselinux-devel libtirpc-devel libtool libudev-devel \ 88 libuuid-devel lsscsi mdadm nfs-utils openssl-devel pam-devel pamtester \ 89 parted perf python3 python3-cffi python3-devel python3-packaging \ 90 kernel-devel python3-setuptools qemu-guest-agent rng-tools rpcgen \ 91 rpm-build rsync samba strace sysstat systemd watchdog wget xfsprogs-devel \ 92 xxhash zlib-devel 93 echo "##[endgroup]" 94} 95 96function tumbleweed() { 97 echo "##[group]Running zypper is TODO!" 98 sleep 23456 99 echo "##[endgroup]" 100} 101 102# $1: Kernel version to install (like '6.14rc7') 103function install_fedora_experimental_kernel { 104 105 our_version="$1" 106 sudo dnf -y copr enable @kernel-vanilla/stable 107 sudo dnf -y copr enable @kernel-vanilla/mainline 108 all="$(sudo dnf list --showduplicates kernel-* python3-perf* perf* bpftool*)" 109 echo "Available versions:" 110 echo "$all" 111 112 # You can have a bunch of minor variants of the version we want '6.14'. 113 # Pick the newest variant (sorted by version number). 114 specific_version=$(echo "$all" | grep $our_version | awk '{print $2}' | sort -V | tail -n 1) 115 list="$(echo "$all" | grep $specific_version | grep -Ev 'kernel-rt|kernel-selftests|kernel-debuginfo' | sed 's/.x86_64//g' | awk '{print $1"-"$2}')" 116 sudo dnf install -y $list 117 sudo dnf -y copr disable @kernel-vanilla/stable 118 sudo dnf -y copr disable @kernel-vanilla/mainline 119} 120 121# Install dependencies 122case "$1" in 123 almalinux8) 124 echo "##[group]Enable epel and powertools repositories" 125 sudo dnf config-manager -y --set-enabled powertools 126 sudo dnf install -y epel-release 127 echo "##[endgroup]" 128 rhel 129 echo "##[group]Install kernel-abi-whitelists" 130 sudo dnf install -y kernel-abi-whitelists 131 echo "##[endgroup]" 132 ;; 133 almalinux9|almalinux10|centos-stream9|centos-stream10) 134 echo "##[group]Enable epel and crb repositories" 135 sudo dnf config-manager -y --set-enabled crb 136 sudo dnf install -y epel-release 137 echo "##[endgroup]" 138 rhel 139 echo "##[group]Install kernel-abi-stablelists" 140 sudo dnf install -y kernel-abi-stablelists 141 echo "##[endgroup]" 142 ;; 143 archlinux) 144 archlinux 145 ;; 146 debian*) 147 echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections 148 debian 149 echo "##[group]Install Debian specific" 150 sudo apt-get install -yq linux-perf dh-sequence-dkms 151 echo "##[endgroup]" 152 ;; 153 fedora*) 154 rhel 155 sudo dnf install -y libunwind-devel 156 157 # Fedora 42+ moves /usr/bin/script from 'util-linux' to 'util-linux-script' 158 sudo dnf install -y util-linux-script || true 159 160 # Optional: Install an experimental kernel ($2 = kernel version) 161 if [ -n "${2:-}" ] ; then 162 install_fedora_experimental_kernel "$2" 163 fi 164 ;; 165 freebsd*) 166 freebsd 167 ;; 168 tumbleweed) 169 tumbleweed 170 ;; 171 ubuntu*) 172 debian 173 echo "##[group]Install Ubuntu specific" 174 sudo apt-get install -yq linux-tools-common libtirpc-dev \ 175 linux-modules-extra-$(uname -r) 176 sudo apt-get install -yq dh-sequence-dkms 177 echo "##[endgroup]" 178 echo "##[group]Delete Ubuntu OpenZFS modules" 179 for i in $(find /lib/modules -name zfs -type d); do sudo rm -rvf $i; done 180 echo "##[endgroup]" 181 ;; 182esac 183 184# This script is used for checkstyle + zloop deps also. 185# Install only the needed packages and exit - when used this way. 186test -z "${ONLY_DEPS:-}" || exit 0 187 188# Start services 189echo "##[group]Enable services" 190case "$1" in 191 freebsd*) 192 # add virtio things 193 echo 'virtio_load="YES"' | sudo -E tee -a /boot/loader.conf 194 for i in balloon blk console random scsi; do 195 echo "virtio_${i}_load=\"YES\"" | sudo -E tee -a /boot/loader.conf 196 done 197 echo "fdescfs /dev/fd fdescfs rw 0 0" | sudo -E tee -a /etc/fstab 198 sudo -E mount /dev/fd 199 sudo -E touch /etc/zfs/exports 200 sudo -E sysrc mountd_flags="/etc/zfs/exports" 201 echo '[global]' | sudo -E tee /usr/local/etc/smb4.conf >/dev/null 202 sudo -E service nfsd enable 203 sudo -E service qemu-guest-agent enable 204 sudo -E service samba_server enable 205 ;; 206 debian*|ubuntu*) 207 sudo -E systemctl enable nfs-kernel-server 208 sudo -E systemctl enable qemu-guest-agent 209 sudo -E systemctl enable smbd 210 ;; 211 *) 212 # All other linux distros 213 sudo -E systemctl enable nfs-server 214 sudo -E systemctl enable qemu-guest-agent 215 sudo -E systemctl enable smb 216 ;; 217esac 218echo "##[endgroup]" 219 220# Setup Kernel cmdline 221CMDLINE="console=tty0 console=ttyS0,115200n8" 222CMDLINE="$CMDLINE selinux=0" 223CMDLINE="$CMDLINE random.trust_cpu=on" 224CMDLINE="$CMDLINE no_timer_check" 225case "$1" in 226 almalinux*|centos*|fedora*) 227 GRUB_CFG="/boot/grub2/grub.cfg" 228 GRUB_MKCONFIG="grub2-mkconfig" 229 CMDLINE="$CMDLINE biosdevname=0 net.ifnames=0" 230 echo 'GRUB_SERIAL_COMMAND="serial --speed=115200"' \ 231 | sudo tee -a /etc/default/grub >/dev/null 232 ;; 233 ubuntu24) 234 GRUB_CFG="/boot/grub/grub.cfg" 235 GRUB_MKCONFIG="grub-mkconfig" 236 echo 'GRUB_DISABLE_OS_PROBER="false"' \ 237 | sudo tee -a /etc/default/grub >/dev/null 238 ;; 239 *) 240 GRUB_CFG="/boot/grub/grub.cfg" 241 GRUB_MKCONFIG="grub-mkconfig" 242 ;; 243esac 244 245case "$1" in 246 archlinux|freebsd*) 247 true 248 ;; 249 *) 250 echo "##[group]Edit kernel cmdline" 251 sudo sed -i -e '/^GRUB_CMDLINE_LINUX/d' /etc/default/grub || true 252 echo "GRUB_CMDLINE_LINUX=\"$CMDLINE\"" \ 253 | sudo tee -a /etc/default/grub >/dev/null 254 sudo $GRUB_MKCONFIG -o $GRUB_CFG 255 echo "##[endgroup]" 256 ;; 257esac 258 259# reset cloud-init configuration and poweroff 260sudo cloud-init clean --logs 261sleep 2 && sudo poweroff & 262exit 0 263