[PATCH v2] tests/vm/freebsd: Update to FreeBSD 13.2

Thomas Huth posted 1 patch 1 year ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20230419144553.719749-1-thuth@redhat.com
Maintainers: Warner Losh <imp@bsdimp.com>, Kyle Evans <kevans@freebsd.org>, Ed Maste <emaste@freebsd.org>, Li-Wen Hsu <lwhsu@freebsd.org>, "Alex Bennée" <alex.bennee@linaro.org>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Thomas Huth <thuth@redhat.com>, Wainer dos Santos Moschetta <wainersm@redhat.com>, Beraldo Leal <bleal@redhat.com>
tests/vm/freebsd | 101 ++++++++++++-----------------------------------
1 file changed, 25 insertions(+), 76 deletions(-)
[PATCH v2] tests/vm/freebsd: Update to FreeBSD 13.2
Posted by Thomas Huth 1 year ago
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.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 v2: Removed the "ftp/" folder from the URL - it's not necessary anymore
     (thanks to Li-Wen for the hint!)

 tests/vm/freebsd | 101 ++++++++++++-----------------------------------
 1 file changed, 25 insertions(+), 76 deletions(-)

diff --git a/tests/vm/freebsd b/tests/vm/freebsd
index ba2ba23d24..11de6473f4 100755
--- a/tests/vm/freebsd
+++ b/tests/vm/freebsd
@@ -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
@@ -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")
@@ -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 = "$"
@@ -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__":
-- 
2.31.1
Re: [PATCH v2] tests/vm/freebsd: Update to FreeBSD 13.2
Posted by Alex Bennée 1 year ago
Thomas Huth <thuth@redhat.com> writes:

> 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.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>

Queued to testing/next, thanks.

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro
Re: [PATCH v2] tests/vm/freebsd: Update to FreeBSD 13.2
Posted by Warner Losh 1 year ago
On Wed, Apr 19, 2023 at 8:46 AM Thomas Huth <thuth@redhat.com> wrote:

> 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.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  v2: Removed the "ftp/" folder from the URL - it's not necessary anymore
>      (thanks to Li-Wen for the hint!)
>
>  tests/vm/freebsd | 101 ++++++++++++-----------------------------------
>  1 file changed, 25 insertions(+), 76 deletions(-)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

I also wonder if we should expand this to aarch64... but it looks like
there's no CI image
for that, so I'll see if I can make something like that happen before 14.0.

Warner


> diff --git a/tests/vm/freebsd b/tests/vm/freebsd
> index ba2ba23d24..11de6473f4 100755
> --- a/tests/vm/freebsd
> +++ b/tests/vm/freebsd
> @@ -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
> @@ -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")
> @@ -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 = "$"
> @@ -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__":
> --
> 2.31.1
>
>