qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v1 12/17] tests/vm: freebsd autoinstall, using s


From: Alex Bennée
Subject: Re: [Qemu-devel] [PATCH v1 12/17] tests/vm: freebsd autoinstall, using serial console
Date: Thu, 20 Jun 2019 12:01:32 +0100
User-agent: mu4e 1.3.2; emacs 26.1

Philippe Mathieu-Daudé <address@hidden> writes:

> On 6/19/19 9:40 PM, Alex Bennée wrote:
>> From: Gerd Hoffmann <address@hidden>
>>
>> Instead of fetching the prebuilt image from patchew download the install
>> iso and prepare the image locally.  Install to disk, using the serial
>> console.  Create qemu user, configure ssh login.  Install packages
>> needed for qemu builds.
>>
>> Note that freebsd package downloads are delivered as non-cachable
>> content, so I had to configure squid with "ignore-no-store
>> ignore-private ignore-reload" for pkgmir.geo.freebsd.org to make the
>> caching actually work.
>>
>> Signed-off-by: Gerd Hoffmann <address@hidden>
>> Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
>> Tested-by: Philippe Mathieu-Daudé <address@hidden>
>> Tested-by: Thomas Huth <address@hidden>
>> Message-Id: <address@hidden>
>
> Signed-off-by: Alex Bennée <address@hidden>

So I do have a check for this in my PR scripts. I guess I should
replicate it in my patch series workflow.

>
>> ---
>>  tests/vm/freebsd | 182 ++++++++++++++++++++++++++++++++++++++++++++---
>>  1 file changed, 172 insertions(+), 10 deletions(-)
>>
>> diff --git a/tests/vm/freebsd b/tests/vm/freebsd
>> index 091be1a065..2a19461a90 100755
>> --- a/tests/vm/freebsd
>> +++ b/tests/vm/freebsd
>> @@ -2,41 +2,203 @@
>>  #
>>  # FreeBSD VM image
>>  #
>> -# Copyright 2017 Red Hat Inc.
>> +# Copyright 2017-2019 Red Hat Inc.
>>  #
>>  # Authors:
>>  #  Fam Zheng <address@hidden>
>> +#  Gerd Hoffmann <address@hidden>
>>  #
>>  # This code is licensed under the GPL version 2 or later.  See
>>  # the COPYING file in the top-level directory.
>>  #
>>
>>  import os
>> +import re
>>  import sys
>> +import time
>> +import socket
>>  import subprocess
>>  import basevm
>>
>>  class FreeBSDVM(basevm.BaseVM):
>>      name = "freebsd"
>>      arch = "x86_64"
>> +
>> +    link = 
>> "https://download.freebsd.org/ftp/releases/ISO-IMAGES/12.0/FreeBSD-12.0-RELEASE-amd64-disc1.iso.xz";
>> +    csum = 
>> "1d40015bea89d05b8bd13e2ed80c40b522a9ec1abd8e7c8b80954fb485fb99db"
>> +    size = "20G"
>> +    pkgs = [
>> +        # build tools
>> +        "git",
>> +        "pkgconf",
>> +        "bzip2",
>> +
>> +        # gnu tools
>> +        "bash",
>> +        "gmake",
>> +        "gsed",
>> +        "flex", "bison",
>> +
>> +        # libs: crypto
>> +        "gnutls",
>> +
>> +        # libs: images
>> +        "jpeg-turbo",
>> +        "png",
>> +
>> +        # libs: ui
>> +        "sdl2",
>> +        "gtk3",
>> +        "libxkbcommon",
>> +
>> +        # libs: opengl
>> +        "libepoxy",
>> +        "mesa-libs",
>> +    ]
>> +
>>      BUILD_SCRIPT = """
>>          set -e;
>> -        rm -rf /var/tmp/qemu-test.*
>> -        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
>> +        rm -rf /home/qemu/qemu-test.*
>> +        cd $(mktemp -d /home/qemu/qemu-test.XXXXXX);
>> +        mkdir src build; cd src;
>>          tar -xf /dev/vtbd1;
>> -        ./configure {configure_opts};
>> +        cd ../build
>> +        ../src/configure --python=python3.6 {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):
>> -        cimg = 
>> self._download_with_cache("http://download.patchew.org/freebsd-11.1-amd64.img.xz";,
>> -                
>> sha256sum='adcb771549b37bc63826c501f05121a206ed3d9f55f49145908f7e1432d65891')
>> -        img_tmp_xz = img + ".tmp.xz"
>> +        self.print_step("Downloading install iso")
>> +        cimg = self._download_with_cache(self.link, sha256sum=self.csum)
>>          img_tmp = img + ".tmp"
>> -        sys.stderr.write("Extracting the image...\n")
>> -        subprocess.check_call(["ln", "-f", cimg, img_tmp_xz])
>> -        subprocess.check_call(["xz", "--keep", "-dvf", img_tmp_xz])
>> +        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])
>> +        subprocess.check_call(["qemu-img", "create", "-f", "qcow2",
>> +                               img_tmp, self.size])
>> +
>> +        self.print_step("Booting installer")
>> +        self.boot(img_tmp, extra_args = [
>> +            "-bios", "pc-bios/bios-256k.bin",
>> +            "-machine", "graphics=off",
>> +            "-cdrom", iso
>> +        ])
>> +        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("New Password:")
>> +        self.console_send("%s\n" % self.ROOT_PASS)
>> +        self.console_wait("Retype New Password:")
>> +        self.console_send("%s\n" % self.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",    "a\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("Username")
>> +        self.console_send("%s\n" % self.GUEST_USER)
>> +        self.console_wait("Full name")
>> +        self.console_send("%s\n" % self.GUEST_USER)
>> +        self.console_wait_send("Uid",                   "\n")
>> +        self.console_wait_send("Login group",           "\n")
>> +        self.console_wait_send("Login group",           "\n")
>> +        self.console_wait_send("Login class",           "\n")
>> +        self.console_wait_send("Shell",                 "\n")
>> +        self.console_wait_send("Home directory",        "\n")
>> +        self.console_wait_send("Home directory perm",   "\n")
>> +        self.console_wait_send("Use password",          "\n")
>> +        self.console_wait_send("Use an empty password", "\n")
>> +        self.console_wait_send("Use a random password", "\n")
>> +        self.console_wait("Enter password:")
>> +        self.console_send("%s\n" % self.GUEST_PASS)
>> +        self.console_wait("Enter password again:")
>> +        self.console_send("%s\n" % self.GUEST_PASS)
>> +        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()
>> +
>> +        # setup qemu user
>> +        prompt = "$"
>> +        self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
>> +        self.console_wait_send(prompt, "exit\n")
>> +
>> +        # setup root user
>> +        prompt = "root@freebsd:~ #"
>> +        self.console_ssh_init(prompt, "root", self.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__":
>>      sys.exit(basevm.main(FreeBSDVM))
>>


--
Alex Bennée



reply via email to

[Prev in Thread] Current Thread [Next in Thread]