diff options
Diffstat (limited to 'images/freebsd/genimg')
| -rwxr-xr-x | images/freebsd/genimg | 275 | +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 |
