Skip to content

Commit

Permalink
tests/vm/freebsd: Update to FreeBSD 13.2
Browse files Browse the repository at this point in the history
According to QEMU's support policy, we stop supporting the previous
major release two years after the the new major release has been
published. So we can stop testing FreeBSD 12 now and should switch
our FreeBSD VM to version 13 instead.

Some changes are needed for this update: The downloadable .ISO images
do not use the serial port as console by default anymore, so they
are not usable in the same way as with FreeBSD 12. Fortunately, the
FreeBSD project now also offers some pre-installed CI images that
have the serial console enabled, so we can use those now, with the
benefit that we can skip almost all parts of the previous installation
process.

Message-Id: <20230419144553.719749-1-thuth@redhat.com>
Reviewed-by: Warner Losh <imp@bsdimp.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
  • Loading branch information
huth committed Apr 20, 2023
1 parent bcbbd95 commit ec6fb1c
Showing 1 changed file with 25 additions and 76 deletions.
101 changes: 25 additions & 76 deletions tests/vm/freebsd
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,15 @@ class FreeBSDVM(basevm.BaseVM):
name = "freebsd"
arch = "x86_64"

link = "https://download.freebsd.org/ftp/releases/ISO-IMAGES/12.4/FreeBSD-12.4-RELEASE-amd64-disc1.iso.xz"
csum = "1dcf6446e31bf3f81b582e9aba3319a258c29a937a2af6138ee4b181ed719a87"
link = "https://download.freebsd.org/releases/CI-IMAGES/13.2-RELEASE/amd64/Latest/FreeBSD-13.2-RELEASE-amd64-BASIC-CI.raw.xz"
csum = "a4fb3b6c7b75dd4d58fb0d75e4caf72844bffe0ca00e66459c028b198ffb3c0e"
size = "20G"
pkgs = [
# build tools
"git",
"pkgconf",
"bzip2",
"python37",
"python39",
"ninja",

# gnu tools
Expand Down Expand Up @@ -78,72 +78,42 @@ class FreeBSDVM(basevm.BaseVM):
mkdir src build; cd src;
tar -xf /dev/vtbd1;
cd ../build
../src/configure --python=python3.7 {configure_opts};
../src/configure --python=python3.9 {configure_opts};
gmake --output-sync -j{jobs} {target} {verbose};
"""

def console_boot_serial(self):
self.console_wait_send("Autoboot", "3")
self.console_wait_send("OK", "set console=comconsole\n")
self.console_wait_send("OK", "boot\n")

def build_image(self, img):
self.print_step("Downloading install iso")
self.print_step("Downloading disk image")
cimg = self._download_with_cache(self.link, sha256sum=self.csum)
img_tmp = img + ".tmp"
iso = img + ".install.iso"
iso_xz = iso + ".xz"

self.print_step("Preparing iso and disk image")
subprocess.check_call(["cp", "-f", cimg, iso_xz])
subprocess.check_call(["xz", "-dvf", iso_xz])
self.exec_qemu_img("create", "-f", "qcow2", img_tmp, self.size)

self.print_step("Booting installer")
tmp_raw = img + ".tmp.raw"
tmp_raw_xz = tmp_raw + ".xz"
img_tmp = img + ".tmp.qcow2"

self.print_step("Preparing disk image")
subprocess.check_call(["cp", "-f", cimg, tmp_raw_xz])
subprocess.check_call(["xz", "-dvf", tmp_raw_xz])
self.exec_qemu_img("convert", "-O", "qcow2", tmp_raw, img_tmp)
self.exec_qemu_img("resize", img_tmp, self.size)
os.remove(tmp_raw)

self.print_step("Preparing disk image")
self.boot(img_tmp, extra_args = [
"-machine", "graphics=off",
"-device", "VGA",
"-cdrom", iso
"-vga", "none"
])
self.console_init()
self.console_boot_serial()
self.console_wait_send("Console type", "xterm\n")

# pre-install configuration
self.console_wait_send("Welcome", "\n")
self.console_wait_send("Keymap Selection", "\n")
self.console_wait_send("Set Hostname", "freebsd\n")
self.console_wait_send("Distribution Select", "\n")
self.console_wait_send("Partitioning", "\n")
self.console_wait_send("Partition", "\n")
self.console_wait_send("Scheme", "\n")
self.console_wait_send("Editor", "f")
self.console_wait_send("Confirmation", "c")

self.print_step("Installation started now, this will take a while")

# post-install configuration
self.console_wait_send("login:", "root\n")
self.console_wait_send("~ #", "service growfs onestart\n")

# root user
self.console_wait_send("~ #", "passwd\n")
self.console_wait("New Password:")
self.console_send("%s\n" % self._config["root_pass"])
self.console_wait("Retype New Password:")
self.console_send("%s\n" % self._config["root_pass"])

self.console_wait_send("Network Configuration", "\n")
self.console_wait_send("IPv4", "y")
self.console_wait_send("DHCP", "y")
self.console_wait_send("IPv6", "n")
self.console_wait_send("Resolver", "\n")

self.console_wait_send("Time Zone Selector", "0\n")
self.console_wait_send("Confirmation", "y")
self.console_wait_send("Time & Date", "\n")
self.console_wait_send("Time & Date", "\n")

self.console_wait_send("System Configuration", "\n")
self.console_wait_send("System Hardening", "\n")

# qemu user
self.console_wait_send("Add User Accounts", "y")
self.console_wait_send("~ #", "adduser\n")
self.console_wait("Username")
self.console_send("%s\n" % self._config["guest_user"])
self.console_wait("Full name")
Expand All @@ -165,13 +135,7 @@ class FreeBSDVM(basevm.BaseVM):
self.console_wait_send("Lock out", "\n")
self.console_wait_send("OK", "yes\n")
self.console_wait_send("Add another user", "no\n")

self.console_wait_send("Final Configuration", "\n")
self.console_wait_send("Manual Configuration", "\n")
self.console_wait_send("Complete", "\n")

self.print_step("Installation finished, rebooting")
self.console_boot_serial()
self.console_wait_send("~ #", "exit\n")

# setup qemu user
prompt = "$"
Expand All @@ -183,35 +147,20 @@ class FreeBSDVM(basevm.BaseVM):
self.console_ssh_init(prompt, "root", self._config["root_pass"])
self.console_sshd_config(prompt)

# setup serial console
self.console_wait(prompt)
self.console_send("echo 'console=comconsole' >> /boot/loader.conf\n")

# setup boot delay
self.console_wait(prompt)
self.console_send("echo 'autoboot_delay=1' >> /boot/loader.conf\n")

# setup virtio-blk #1 (tarfile)
self.console_wait(prompt)
self.console_send("echo 'chmod 666 /dev/vtbd1' >> /etc/rc.local\n")

self.print_step("Configuration finished, rebooting")
self.console_wait_send(prompt, "reboot\n")
self.console_wait("login:")
self.wait_ssh()

self.print_step("Installing packages")
self.ssh_root_check("pkg install -y %s\n" % " ".join(self.pkgs))

# shutdown
self.ssh_root(self.poweroff)
self.console_wait("Uptime:")
self.wait()

if os.path.exists(img):
os.remove(img)
os.rename(img_tmp, img)
os.remove(iso)
self.print_step("All done")

if __name__ == "__main__":
Expand Down

0 comments on commit ec6fb1c

Please sign in to comment.