aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'images/freebsd/genimg')
-rwxr-xr-ximages/freebsd/genimg275+198 −77
1 files changed, 198 insertions, 77 deletions
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