aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat
-rwxr-xr-ximages/alpine/3.20/genimg6+0 −6
-rwxr-xr-ximages/alpine/3.21/genimg6+0 −6
-rwxr-xr-ximages/alpine/3.22/genimg6+0 −6
-rwxr-xr-ximages/alpine/3.23/genimg6+0 −6
-rwxr-xr-ximages/alpine/3.24/genimg6+0 −6
-rwxr-xr-ximages/alpine/edge/genimg6+0 −6
-rwxr-xr-ximages/alpine/genimg40+24 −16
-rwxr-xr-ximages/debian/bookworm/genimg6+0 −6
-rwxr-xr-ximages/debian/forky/genimg6+0 −6
-rwxr-xr-ximages/debian/genimg33+23 −10
-rwxr-xr-ximages/debian/sid/genimg6+0 −6
-rwxr-xr-ximages/debian/trixie/genimg6+0 −6
-rwxr-xr-ximages/fedora/42/genimg6+0 −6
-rwxr-xr-ximages/fedora/43/genimg6+0 −6
-rwxr-xr-ximages/fedora/44/genimg6+0 −6
-rwxr-xr-ximages/fedora/genimg23+18 −5
-rwxr-xr-ximages/freebsd/14.x/genimg6+0 −6
-rwxr-xr-ximages/freebsd/15.x/genimg7+0 −7
-rwxr-xr-ximages/freebsd/current/genimg6+0 −6
-rwxr-xr-ximages/freebsd/genimg275+198 −77
-rwxr-xr-ximages/freebsd/genpkgimg98+0 −98
-rwxr-xr-ximages/ubuntu/genimg27+20 −7
-rwxr-xr-ximages/ubuntu/jammy/genimg6+0 −6
-rwxr-xr-ximages/ubuntu/noble/genimg6+0 −6
-rwxr-xr-ximages/ubuntu/resolute/genimg6+0 −6
25 files changed, 283 insertions, 328 deletions
diff --git a/images/alpine/3.20/genimg b/images/alpine/3.20/genimg
deleted file mode 100755
--- a/images/alpine/3.20/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -xeu
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=v3.20
-exec ../genimg
diff --git a/images/alpine/3.21/genimg b/images/alpine/3.21/genimg
deleted file mode 100755
--- a/images/alpine/3.21/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -xeu
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=v3.21
-exec ../genimg
diff --git a/images/alpine/3.22/genimg b/images/alpine/3.22/genimg
deleted file mode 100755
--- a/images/alpine/3.22/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -xeu
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=v3.22
-exec ../genimg
diff --git a/images/alpine/3.23/genimg b/images/alpine/3.23/genimg
deleted file mode 100755
--- a/images/alpine/3.23/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -xeu
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=v3.23
-exec ../genimg
diff --git a/images/alpine/3.24/genimg b/images/alpine/3.24/genimg
deleted file mode 100755
--- a/images/alpine/3.24/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -xeu
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=v3.24
-exec ../genimg
diff --git a/images/alpine/edge/genimg b/images/alpine/edge/genimg
deleted file mode 100755
--- a/images/alpine/edge/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -xeu
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=edge
-exec ../genimg
diff --git a/images/alpine/genimg b/images/alpine/genimg
index 2ac659b..908132a 100755
--- a/images/alpine/genimg
+++ b/images/alpine/genimg
@@ -3,10 +3,28 @@
# SPDX-FileCopyrightText: 2026 Nikolay Govorov
# SPDX-License-Identifier: AGPL-3.0-only
-echo "$release" >/dev/null # fail on -u if release unset
-arch="${1:-x86_64}"
+self=$(dirname "$(readlink -f "$0")")
+cd "$self"
+
+version=${1:-}
+arch="${2:-x86_64}"
linux="${linux:-linux-lts}"
+case $version in
+ 3.20|3.21|3.22|3.23|3.24)
+ release="v$version"
+ ;;
+ edge)
+ release="edge"
+ ;;
+ *)
+ echo "usage: ${0##*/} <3.20|3.21|3.22|3.23|3.24|edge> [arch]" >&2
+ exit 1
+ ;;
+esac
+
+out="$version/$arch"
+
cleanup() {
# The order here is important if you don't want to hose your mounts
sync
@@ -22,11 +40,11 @@ cleanup() {
qemu-nbd --disconnect /dev/nbd0 || true
}
-mkdir -p "$arch"
+mkdir -p "$out"
-qemu-img create -f qcow2 "$arch"/root.img.qcow2 24G
+qemu-img create -f qcow2 "$out"/root.img.qcow2 24G
modprobe nbd max_part=16
-qemu-nbd --connect=/dev/nbd0 "$arch"/root.img.qcow2
+qemu-nbd --connect=/dev/nbd0 "$out"/root.img.qcow2
for i in $(seq 1 5); do
sleep 0.$i
partprobe /dev/nbd0 && break
@@ -53,16 +71,6 @@ mkdir /mnt/boot
mount /dev/nbd0p1 /mnt/boot
swapon /dev/nbd0p2
-extra=""
-case $release in
- 3.23)
- extra="!usr-merge-nag"
- ;;
- edge)
- extra="!usr-merge-nag"
- ;;
-esac
-
# TODO: Remove bash
apk add -U \
-X http://dl-cdn.alpinelinux.org/alpine/$release/main/ \
@@ -73,7 +81,7 @@ apk add -U \
--initdb \
acct alpine-base alpine-conf alpine-sdk linux-firmware-none $linux \
git mercurial openssh sudo syslinux tzdata gnupg haveged bash curl \
- doas $extra
+ doas
mount --bind /dev /mnt/dev
mount --bind /dev/pts /mnt/dev/pts
diff --git a/images/debian/bookworm/genimg b/images/debian/bookworm/genimg
deleted file mode 100755
--- a/images/debian/bookworm/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -eux
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=bookworm
-exec ../genimg "$@"
diff --git a/images/debian/forky/genimg b/images/debian/forky/genimg
deleted file mode 100755
--- a/images/debian/forky/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -eux
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=forky
-exec ../genimg "$@"
diff --git a/images/debian/genimg b/images/debian/genimg
index 297a26d..7c98cd3 100755
--- a/images/debian/genimg
+++ b/images/debian/genimg
@@ -3,8 +3,20 @@
# SPDX-FileCopyrightText: 2026 Nikolay Govorov
# SPDX-License-Identifier: AGPL-3.0-only
-echo "$release" >/dev/null # fail on -u if release unset
-arch=${1:-amd64}
+self=$(dirname "$(readlink -f "$0")")
+cd "$self"
+
+release=${1:-}
+arch=${2:-amd64}
+
+case $release in
+ bookworm|forky|sid|trixie) ;;
+ *)
+ echo "usage: ${0##*/} <bookworm|forky|sid|trixie> [arch]" >&2
+ exit 1
+ ;;
+esac
+
case $arch in
amd64)
iface=ens3
@@ -41,11 +53,12 @@ cleanup() {
qemu-nbd --disconnect /dev/nbd0 || true
}
-mkdir -p "$arch"
+out="$release/$arch"
+mkdir -p "$out"
-qemu-img create -f qcow2 $arch/root.img.qcow2 32G
+qemu-img create -f qcow2 "$out/root.img.qcow2" 32G
modprobe nbd max_part=16
-qemu-nbd --connect=/dev/nbd0 $arch/root.img.qcow2
+qemu-nbd --connect=/dev/nbd0 "$out/root.img.qcow2"
for i in $(seq 1 5); do
sleep 0.$i
partprobe /dev/nbd0 && break
@@ -75,7 +88,7 @@ if [ "$arch" = "amd64" ]
then
debootstrap --include=gnupg2 --arch=$arch $release /mnt
else
- ../qemu-debootstrap --include=gnupg2 --arch=$arch $release /mnt
+ ./qemu-debootstrap --include=gnupg2 --arch=$arch $release /mnt
fi
mount --bind /dev /mnt/dev
@@ -163,12 +176,12 @@ case "$arch" in
EOF
;;
arm64)
- cp /mnt/boot/vmlinuz-* $arch/vmlinuz
- cp /mnt/boot/initrd.img-* $arch/initrd.img
+ cp /mnt/boot/vmlinuz-* "$out/vmlinuz"
+ cp /mnt/boot/initrd.img-* "$out/initrd.img"
;;
ppc64el)
- cp /mnt/boot/vmlinux-* $arch/vmlinux
- cp /mnt/boot/initrd.img-* $arch/initrd.img
+ cp /mnt/boot/vmlinux-* "$out/vmlinux"
+ cp /mnt/boot/initrd.img-* "$out/initrd.img"
;;
esac
diff --git a/images/debian/sid/genimg b/images/debian/sid/genimg
deleted file mode 100755
--- a/images/debian/sid/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -eux
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=sid
-exec ../genimg "$@"
diff --git a/images/debian/trixie/genimg b/images/debian/trixie/genimg
deleted file mode 100755
--- a/images/debian/trixie/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -eux
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=trixie
-exec ../genimg "$@"
diff --git a/images/fedora/42/genimg b/images/fedora/42/genimg
deleted file mode 100755
--- a/images/fedora/42/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=42
-exec ../genimg "$*"
diff --git a/images/fedora/43/genimg b/images/fedora/43/genimg
deleted file mode 100755
--- a/images/fedora/43/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=43
-exec ../genimg "$*"
diff --git a/images/fedora/44/genimg b/images/fedora/44/genimg
deleted file mode 100755
--- a/images/fedora/44/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=44
-exec ../genimg "$*"
diff --git a/images/fedora/genimg b/images/fedora/genimg
index 7983380..5ba53e7 100755
--- a/images/fedora/genimg
+++ b/images/fedora/genimg
@@ -6,8 +6,20 @@
# Network Block Device used to interact with the QCOW2 image.
NBD_DEVICE=/dev/nbd0
-echo "$release" >/dev/null # fail on -u if release unset
-arch=${1:-x86_64}
+self=$(dirname "$(readlink -f "$0")")
+cd "$self"
+
+release=${1:-}
+arch=${2:-x86_64}
+
+case $release in
+ 42|43|44) ;;
+ *)
+ echo "usage: ${0##*/} <42|43|44> [arch]" >&2
+ exit 1
+ ;;
+esac
+
case $arch in
x86_64)
iface=ens3
@@ -37,11 +49,12 @@ run_root() {
sh -c "$*"
}
-mkdir -p "$arch"
+out="$release/$arch"
+mkdir -p "$out"
-qemu-img create -f qcow2 "$arch/root.img.qcow2" 24G
+qemu-img create -f qcow2 "$out/root.img.qcow2" 24G
modprobe nbd max_part=16
-qemu-nbd --connect=$NBD_DEVICE "$arch/root.img.qcow2"
+qemu-nbd --connect=$NBD_DEVICE "$out/root.img.qcow2"
trap cleanup EXIT
# Looks like qemu-nbd is non-blocking. Wait one second to make sure $NBD_DEVICE
diff --git a/images/freebsd/14.x/genimg b/images/freebsd/14.x/genimg
deleted file mode 100755
--- a/images/freebsd/14.x/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release="14.4-RELEASE"
-exec ../genimg "$@"
diff --git a/images/freebsd/15.x/genimg b/images/freebsd/15.x/genimg
deleted file mode 100755
--- a/images/freebsd/15.x/genimg
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release="15.1-RELEASE"
-export repo="FreeBSD-ports"
-exec ../genimg "$@"
diff --git a/images/freebsd/current/genimg b/images/freebsd/current/genimg
deleted file mode 100755
--- a/images/freebsd/current/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release="16.0"
-exec ../genpkgimg "$@"
diff --git a/images/freebsd/genimg b/images/freebsd/genimg
index c5219ea..59500f8 100755
--- a/images/freebsd/genimg
+++ b/images/freebsd/genimg
@@ -3,53 +3,56 @@
# SPDX-FileCopyrightText: 2026 Nikolay Govorov
# SPDX-License-Identifier: AGPL-3.0-only
-echo "$release" >/dev/null # fail on -u if unset
-arch="${1:-amd64}"
-: ${repo:=FreeBSD}
-
-dist_base="https://download.freebsd.org/ftp/releases/$arch/$release"
-
-dist_files="kernel.txz base.txz base-dbg.txz"
-dist_dir="/usr/freebsd-dist/$arch/$release"
-
-mkdir -p "$dist_dir"
-for f in $dist_files
-do
- fetch -m -o "$dist_dir/$f" "$dist_base/$f"
-done
-
-cleanup() {
- sync || true
- umount /mnt/dev || true
- umount /mnt || true
- mdconfig -du md0 || true
-}
-trap cleanup EXIT
-
-rm -f disk.img
-truncate -s 8G disk.img
-mdconfig -a -t vnode -f disk.img -u md0
-gpart create -s gpt /dev/md0
-gpart add -t freebsd-boot -l bootfs -b 40 -s 512K md0
-gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 md0
-gpart add -t freebsd-ufs -l rootfs -b 1M md0
-newfs -U /dev/md0p2
-
-mount /dev/md0p2 /mnt
-
-mkdir -p /mnt/dev
-mount -t devfs devfs /mnt/dev
-
-for f in $dist_files
-do
- tar -C /mnt -xJf "$dist_dir/$f"
-done
-
-echo "/dev/gpt/rootfs / ufs rw,noatime 1 1" >/mnt/etc/fstab
-touch /mnt/firstboot
-echo 'autoboot_delay="-1"' >>/mnt/boot/loader.conf
-
-cat >>/mnt/etc/rc.conf <<EOF
+self=$(dirname "$(readlink -f "$0")")
+cd "$self"
+
+version=${1:-}
+arch="${2:-amd64}"
+repo=FreeBSD
+
+# Build a RELEASE image from the published distribution tarballs.
+genimg() {
+ dist_base="https://download.freebsd.org/ftp/releases/$arch/$release"
+
+ dist_files="kernel.txz base.txz base-dbg.txz"
+ dist_dir="/usr/freebsd-dist/$arch/$release"
+
+ mkdir -p "$dist_dir"
+ for f in $dist_files; do
+ fetch -m -o "$dist_dir/$f" "$dist_base/$f"
+ done
+
+ cleanup() {
+ sync || true
+ umount /mnt/dev || true
+ umount /mnt || true
+ mdconfig -du md0 || true
+ }
+ trap cleanup EXIT
+
+ rm -f disk.img
+ truncate -s 8G disk.img
+ mdconfig -a -t vnode -f disk.img -u md0
+ gpart create -s gpt /dev/md0
+ gpart add -t freebsd-boot -l bootfs -b 40 -s 512K md0
+ gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 md0
+ gpart add -t freebsd-ufs -l rootfs -b 1M md0
+ newfs -U /dev/md0p2
+
+ mount /dev/md0p2 /mnt
+
+ mkdir -p /mnt/dev
+ mount -t devfs devfs /mnt/dev
+
+ for f in $dist_files; do
+ tar -C /mnt -xJf "$dist_dir/$f"
+ done
+
+ echo "/dev/gpt/rootfs / ufs rw,noatime 1 1" >/mnt/etc/fstab
+ touch /mnt/firstboot
+ echo 'autoboot_delay="-1"' >>/mnt/boot/loader.conf
+
+ cat >>/mnt/etc/rc.conf <<EOF
ntpd_enable=YES
sshd_enable=YES
growfs_enable=YES
@@ -57,52 +60,170 @@ hostname="build"
ifconfig_DEFAULT="inet 10.0.2.15 netmask 255.255.255.0"
defaultrouter="10.0.2.2"
EOF
-echo "nameserver 8.8.8.8" >/mnt/etc/resolv.conf
-echo "nameserver 9.9.9.9" >>/mnt/etc/resolv.conf
-echo "nameserver 1.1.1.1" >>/mnt/etc/resolv.conf
-tzsetup -s -C /mnt UTC
+ echo "nameserver 8.8.8.8" >/mnt/etc/resolv.conf
+ echo "nameserver 9.9.9.9" >>/mnt/etc/resolv.conf
+ echo "nameserver 1.1.1.1" >>/mnt/etc/resolv.conf
+ tzsetup -s -C /mnt UTC
-cat >>/mnt/etc/ssh/sshd_config <<EOF
+ cat >>/mnt/etc/ssh/sshd_config <<EOF
PermitRootLogin yes
PasswordAuthentication yes
PermitEmptyPasswords yes
UsePAM no
EOF
-mkdir -p /mnt/usr/local/etc/pkg/repos/
-cat >/mnt/usr/local/etc/pkg/repos/FreeBSD.conf <<EOF
+ mkdir -p /mnt/usr/local/etc/pkg/repos/
+ cat >/mnt/usr/local/etc/pkg/repos/FreeBSD.conf <<EOF
$repo: {
url: pkg+http://pkg.FreeBSD.org/\$\{ABI\}/latest
enabled: yes
}
EOF
-# freebsd-update is only supported for RELEASE
-if [ "${release%-RELEASE}" != "$release" ]
-then
- env PAGER=true /usr/sbin/freebsd-update \
- -b /mnt \
- --currently-running "$release" \
- --not-running-from-cron -F \
- fetch install
-fi
+ # freebsd-update is only supported for RELEASE
+ if [ "${release%-RELEASE}" != "$release" ]; then
+ env PAGER=true /usr/sbin/freebsd-update \
+ -b /mnt \
+ --currently-running "$release" \
+ --not-running-from-cron -F \
+ fetch install
+ fi
+
+ env ASSUME_ALWAYS_YES=YES pkg -c /mnt bootstrap -f
+ # TODO: remove bash
+ env ASSUME_ALWAYS_YES=YES pkg -c /mnt install git mercurial bash sudo curl
+
+ git clone https://github.com/freebsd/freebsd-ports /mnt/usr/ports --depth=1 --single-branch
+
+ pw -R /mnt groupadd sudo
+ pw -R /mnt useradd -n build -u 1000 -s /usr/local/bin/bash -m -w none -G sudo
+ echo "%sudo ALL=(ALL) NOPASSWD: ALL" >>/mnt/usr/local/etc/sudoers
+
+ cleanup
+ trap : EXIT
+
+ mkdir -p "$out"
+ qemu-img convert -f raw -O qcow2 disk.img "$out"/root.img.qcow2
+ rm disk.img
+
+ # Filesystem will be enlarged by growfs(7) on next startup
+ qemu-img resize "$out"/root.img.qcow2 24G
+}
+
+# Build an image entirely from pkg base (used for -CURRENT, which has no
+# published release tarballs).
+genpkgimg() {
+ rel=${release%%.*}
+
+ cleanup() {
+ umount disk/usr/share/keys/pkg || true
+ chflags -R noschg disk || true
+ rm -rf disk || true
+ }
+ trap cleanup EXIT
+
+ rm -f disk.img
+ mkdir disk
+ mkdir -p disk/usr/local/etc/pkg/repos
+ # pkg -R needs absolute path
+ reposdir=$(pwd)/disk/usr/local/etc/pkg/repos
+
+ cat >${reposdir}/FreeBSD.conf <<EOF
+FreeBSD: {
+ url: pkg+http://pkg.FreeBSD.org/\$\{ABI\}/latest
+ enabled: yes
+ mirror_type: srv
+ signature_type: fingerprint
+}
+FreeBSD-base: {
+ url: pkg+http://pkg.FreeBSD.org/\$\{ABI\}/base_latest
+ enabled: yes
+ mirror_type: srv
+ signature_type: fingerprint
+}
+EOF
+ export ABI="FreeBSD:$rel:$arch"
+ export IGNORE_OSVERSION=yes
+ mkdir -p disk/usr/share/keys/pkg
+ mount -t nullfs /usr/share/keys/pkg disk/usr/share/keys/pkg
+ pkg -C /dev/null -R ${reposdir} -r disk update
+ umount disk/usr/share/keys/pkg
+ # XXX replace by group FreeBSD-base the day it is implemented :D
+ pkg -C /dev/null -R ${reposdir} -r disk rquery -g "%n" "FreeBSD*" | grep -vE "(lib32|dbg|kernel|src|tests)" |
+ xargs pkg -C /dev/null -R ${reposdir} -r disk install -y
+ if pkg -C /dev/null -R ${reposdir} -r disk install -y FreeBSD-kernel-generic-nodebug; then
+ echo "kernel=kernel.GENERIC-NODEBUG" >disk/boot/loader.conf
+ else
+ pkg -C /dev/null -R ${reposdir} -r disk install -y FreeBSD-kernel-generic
+ fi
+
+ echo "/dev/gpt/rootfs / ufs rw,noatime 1 1" >disk/etc/fstab
+ touch disk/firstboot
+ echo 'autoboot_delay="-1"' >>disk/boot/loader.conf
+
+ cat >>disk/etc/rc.conf <<EOF
+ntpd_enable=YES
+sshd_enable=YES
+growfs_enable=YES
+hostname="build"
+ifconfig_DEFAULT="inet 10.0.2.15 netmask 255.255.255.0"
+defaultrouter="10.0.2.2"
+EOF
+ cat >disk/etc/resolv.conf <<EOF
+nameserver 8.8.8.8
+nameserver 8.8.4.4
+EOF
+ tzsetup -s -C disk UTC
+
+ cat >>disk/etc/ssh/sshd_config <<EOF
+PermitRootLogin yes
+PasswordAuthentication yes
+PermitEmptyPasswords yes
+UsePAM no
+EOF
-env ASSUME_ALWAYS_YES=YES pkg -c /mnt bootstrap -f
-# TODO: remove bash
-env ASSUME_ALWAYS_YES=YES pkg -c /mnt install git mercurial bash sudo curl
+ # TODO: remove bash
+ pkg -r disk -R ${reposdir} install -y pkg git-lite mercurial bash sudo curl
+ pkg -r disk -R ${reposdir} clean -ay
-git clone https://github.com/freebsd/freebsd-ports /mnt/usr/ports --depth=1 --single-branch
+ pw -R disk groupadd sudo
+ pw -R disk useradd -n build -u 1000 -s /usr/local/bin/bash -m -w none -G sudo
+ echo "%sudo ALL=(ALL) NOPASSWD: ALL" >>disk/usr/local/etc/sudoers
-pw -R /mnt groupadd sudo
-pw -R /mnt useradd -n build -u 1000 -s /usr/local/bin/bash -m -w none -G sudo
-echo "%sudo ALL=(ALL) NOPASSWD: ALL" >>/mnt/usr/local/etc/sudoers
+ makefs -s 5g -B little -o label=rootfs -o version=2 -o softupdates=1 disk.img disk
+ mkdir -p "$out"
+ mkimg -s gpt \
+ -b disk/boot/pmbr \
+ -C 16G \
+ -p freebsd-boot:=disk/boot/gptboot \
+ -p freebsd-ufs/rootfs:=disk.img \
+ -f qcow2 \
+ -o "$out"/root.img.qcow2
-cleanup
-trap : EXIT
+ cleanup
+ trap : EXIT
-mkdir -p "$arch"
-qemu-img convert -f raw -O qcow2 disk.img "$arch"/root.img.qcow2
-rm disk.img
+ rm disk.img
+}
-# Filesystem will be enlarged by growfs(7) on next startup
-qemu-img resize "$arch"/root.img.qcow2 24G
+out="$version/$arch"
+
+case $version in
+14.x)
+ release="14.4-RELEASE"
+ genimg
+ ;;
+15.x)
+ release="15.1-RELEASE"
+ repo="FreeBSD-ports"
+ genimg
+ ;;
+current)
+ release="16.0"
+ genpkgimg
+ ;;
+*)
+ echo "usage: ${0##*/} <14.x|15.x|current> [arch]" >&2
+ exit 1
+ ;;
+esac
diff --git a/images/freebsd/genpkgimg b/images/freebsd/genpkgimg
deleted file mode 100755
--- a/images/freebsd/genpkgimg
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/bin/sh -eux
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-FileCopyrightText: 2026 Nikolay Govorov
-# SPDX-License-Identifier: AGPL-3.0-only
-
-echo "$release" >/dev/null # fail on -u if unset
-arch="${1:-amd64}"
-rel=${release%%.*}
-
-cleanup() {
- umount disk/usr/share/keys/pkg || true
- chflags -R noschg disk || true
- rm -rf disk || true
-}
-trap cleanup EXIT
-
-rm -f disk.img
-mkdir disk
-mkdir -p disk/usr/local/etc/pkg/repos
-# pkg -R needs absolute path
-reposdir=$(pwd)/disk/usr/local/etc/pkg/repos
-
-cat >${reposdir}/FreeBSD.conf <<EOF
-FreeBSD: {
- url: pkg+http://pkg.FreeBSD.org/\$\{ABI\}/latest
- enabled: yes
- mirror_type: srv
- signature_type: fingerprint
-}
-FreeBSD-base: {
- url: pkg+http://pkg.FreeBSD.org/\$\{ABI\}/base_latest
- enabled: yes
- mirror_type: srv
- signature_type: fingerprint
-}
-EOF
-export ABI="FreeBSD:$rel:$arch"
-export IGNORE_OSVERSION=yes
-mkdir -p disk/usr/share/keys/pkg
-mount -t nullfs /usr/share/keys/pkg disk/usr/share/keys/pkg
-pkg -C /dev/null -R ${reposdir} -r disk update
-umount disk/usr/share/keys/pkg
-# XXX replace by group FreeBSD-base the day it is implemented :D
-pkg -C /dev/null -R ${reposdir} -r disk rquery -g "%n" "FreeBSD*" | grep -vE "(lib32|dbg|kernel|src|tests)" | \
- xargs pkg -C /dev/null -R ${reposdir} -r disk install -y
-if pkg -C /dev/null -R ${reposdir} -r disk install -y FreeBSD-kernel-generic-nodebug ; then
- echo "kernel=kernel.GENERIC-NODEBUG" > disk/boot/loader.conf
-else
- pkg -C /dev/null -R ${reposdir} -r disk install -y FreeBSD-kernel-generic
-fi
-
-echo "/dev/gpt/rootfs / ufs rw,noatime 1 1" >disk/etc/fstab
-touch disk/firstboot
-echo 'autoboot_delay="-1"' >>disk/boot/loader.conf
-
-cat >>disk/etc/rc.conf <<EOF
-ntpd_enable=YES
-sshd_enable=YES
-growfs_enable=YES
-hostname="build"
-ifconfig_DEFAULT="inet 10.0.2.15 netmask 255.255.255.0"
-defaultrouter="10.0.2.2"
-EOF
-cat > disk/etc/resolv.conf <<EOF
-nameserver 8.8.8.8
-nameserver 8.8.4.4
-EOF
-tzsetup -s -C disk UTC
-
-cat >>disk/etc/ssh/sshd_config <<EOF
-PermitRootLogin yes
-PasswordAuthentication yes
-PermitEmptyPasswords yes
-UsePAM no
-EOF
-
-# TODO: remove bash
-pkg -r disk -R ${reposdir} install -y pkg git-lite mercurial bash sudo curl
-pkg -r disk -R ${reposdir} clean -ay
-
-pw -R disk groupadd sudo
-pw -R disk useradd -n build -u 1000 -s /usr/local/bin/bash -m -w none -G sudo
-echo "%sudo ALL=(ALL) NOPASSWD: ALL" >>disk/usr/local/etc/sudoers
-
-makefs -s 5g -B little -o label=rootfs -o version=2 -o softupdates=1 disk.img disk
-mkdir -p "$arch"
-mkimg -s gpt \
- -b disk/boot/pmbr \
- -C 16G \
- -p freebsd-boot:=disk/boot/gptboot \
- -p freebsd-ufs/rootfs:=disk.img \
- -f qcow2 \
- -o "$arch"/root.img.qcow2
-
-cleanup
-trap : EXIT
-
-rm disk.img
diff --git a/images/ubuntu/genimg b/images/ubuntu/genimg
index bb42bf1..4b519be 100755
--- a/images/ubuntu/genimg
+++ b/images/ubuntu/genimg
@@ -3,8 +3,20 @@
# SPDX-FileCopyrightText: 2026 Nikolay Govorov
# SPDX-License-Identifier: AGPL-3.0-only
-echo "$release" >/dev/null # fail on -u if release unset
-arch=${1:-amd64}
+self=$(dirname "$(readlink -f "$0")")
+cd "$self"
+
+release=${1:-}
+arch=${2:-amd64}
+
+case $release in
+ jammy|noble|resolute) ;;
+ *)
+ echo "usage: ${0##*/} <jammy|noble|resolute> [arch]" >&2
+ exit 1
+ ;;
+esac
+
case $arch in
amd64)
iface=ens3
@@ -34,11 +46,12 @@ cleanup() {
qemu-nbd --disconnect /dev/nbd0 || true
}
-mkdir -p "$arch"
+out="$release/$arch"
+mkdir -p "$out"
-qemu-img create -f qcow2 $arch/root.img.qcow2 32G
+qemu-img create -f qcow2 "$out/root.img.qcow2" 32G
modprobe nbd max_part=16
-qemu-nbd --connect=/dev/nbd0 $arch/root.img.qcow2
+qemu-nbd --connect=/dev/nbd0 "$out/root.img.qcow2"
trap cleanup EXIT
# Looks like qemu-nbd is non-blocking. Wait one second to make sure $NBD_DEVICE
@@ -171,8 +184,8 @@ EOF
if [ "$arch" != "amd64" ]
then
- cp /mnt/boot/vmlinuz $arch/vmlinuz
- cp /mnt/boot/initrd.img $arch/initrd.img
+ cp /mnt/boot/vmlinuz "$out/vmlinuz"
+ cp /mnt/boot/initrd.img "$out/initrd.img"
fi
sync
diff --git a/images/ubuntu/jammy/genimg b/images/ubuntu/jammy/genimg
deleted file mode 100755
--- a/images/ubuntu/jammy/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -eux
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=jammy
-exec ../genimg "$@"
diff --git a/images/ubuntu/noble/genimg b/images/ubuntu/noble/genimg
deleted file mode 100755
--- a/images/ubuntu/noble/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -eux
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=noble
-exec ../genimg "$@"
diff --git a/images/ubuntu/resolute/genimg b/images/ubuntu/resolute/genimg
deleted file mode 100755
--- a/images/ubuntu/resolute/genimg
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh -eux
-# SPDX-FileCopyrightText: 2017-2026 Drew DeVault
-# SPDX-License-Identifier: AGPL-3.0-only
-
-export release=resolute
-exec ../genimg "$@"