qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v3 10/14] tests/vm: openbsd autoinstall, using s


From: Philippe Mathieu-Daudé
Subject: Re: [Qemu-devel] [PATCH v3 10/14] tests/vm: openbsd autoinstall, using serial console
Date: Wed, 29 May 2019 13:50:26 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1

On 5/20/19 2:47 PM, Gerd Hoffmann wrote:
> 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.
> 
> Signed-off-by: Gerd Hoffmann <address@hidden>
> ---
>  tests/vm/openbsd | 158 +++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 145 insertions(+), 13 deletions(-)
> 
> diff --git a/tests/vm/openbsd b/tests/vm/openbsd
> index 2105c01a267a..c5f0a1521833 100755
> --- a/tests/vm/openbsd
> +++ b/tests/vm/openbsd
> @@ -2,10 +2,11 @@
>  #
>  # OpenBSD 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.
> @@ -13,34 +14,165 @@
>  
>  import os
>  import sys
> +import socket
>  import subprocess
>  import basevm
>  
>  class OpenBSDVM(basevm.BaseVM):
>      name = "openbsd"
>      arch = "x86_64"
> +
> +    link = "https://cdn.openbsd.org/pub/OpenBSD/6.5/amd64/install65.iso";
> +    csum = "38d1f8cadd502f1c27bf05c5abde6cc505dd28f3f34f8a941048ff9a54f9f608"
> +    size = "20G"
> +    pkgs = [
> +        # tools
> +        "git",
> +        "pkgconf",
> +        "bzip2", "xz",
> +
> +        # gnu tools
> +        "bash",
> +        "gmake",
> +        "gsed",
> +        "bison",
> +
> +        # libs: usb
> +        "libusb1",
> +
> +        # libs: crypto
> +        "gnutls",
> +
> +        # libs: images
> +        "jpeg",
> +        "png",
> +
> +     # libs: ui
> +        "sdl2",
> +        "gtk+3",
> +        "libxkbcommon",
> +    ]
> +
>      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/rsd1c;
> -        ./configure --cc=x86_64-unknown-openbsd6.1-gcc-4.9.4 
> --python=python2.7 {configure_opts};
> -        gmake --output-sync -j{jobs} {verbose};
> -        # XXX: "gmake check" seems to always hang or fail
> -        #gmake --output-sync -j{jobs} check {verbose};
> +        cd ../build
> +        ../src/configure --cc=cc --python=python3 {configure_opts};
> +        gmake --output-sync -j{jobs} {target} {verbose};
>      """
> +    poweroff = "halt -p"
>  
>      def build_image(self, img):
> -        cimg = 
> self._download_with_cache("http://download.patchew.org/openbsd-6.1-amd64.img.xz";,
> -                
> sha256sum='8c6cedc483e602cfee5e04f0406c64eb99138495e8ca580bc0293bcf0640c1bf')
> -        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(["cp", "-f", cimg, img_tmp_xz])
> -        subprocess.check_call(["xz", "-dvf", img_tmp_xz])
> +        iso = img + ".install.iso"
> +
> +        self.print_step("Preparing iso and disk image")
> +        subprocess.check_call(["cp", "-f", cimg, iso])
> +        subprocess.check_call(["qemu-img", "create", "-f", "qcow2",
> +                               img_tmp, self.size])
> +
> +        self.print_step("Booting installer")
> +        self.boot(img_tmp, extra_args = [
> +            "-machine", "graphics=off",
> +            "-cdrom", iso
> +        ])
> +        self.console_init()
> +        self.console_wait_send("boot>", "set tty com0\n")
> +        self.console_wait_send("boot>", "\n")
> +
> +        # pre-install configuration
> +        self.console_wait_send("(I)nstall",               "i\n")
> +        self.console_wait_send("Terminal type",           "xterm\n")
> +        self.console_wait_send("System hostname",         "openbsd\n")
> +        self.console_wait_send("Which network interface", "vio0\n")
> +        self.console_wait_send("IPv4 address",            "dhcp\n")
> +        self.console_wait_send("IPv6 address",            "none\n")
> +        self.console_wait_send("Which network interface", "done\n")
> +        self.console_wait_send("DNS domain name",         "localnet\n")
> +        self.console_wait("Password for root account")
> +        self.console_send("%s\n" % self.ROOT_PASS)
> +        self.console_wait("Password for root account")
> +        self.console_send("%s\n" % self.ROOT_PASS)
> +        self.console_wait_send("Start sshd(8)",           "yes\n")
> +        self.console_wait_send("X Window System",         "\n")
> +        self.console_wait_send("xenodm",                  "\n")
> +        self.console_wait_send("console to com0",         "\n")
> +        self.console_wait_send("Which speed",             "\n")
> +
> +        self.console_wait("Setup a user")
> +        self.console_send("%s\n" % self.GUEST_USER)
> +        self.console_wait("Full name")
> +        self.console_send("%s\n" % self.GUEST_USER)
> +        self.console_wait("Password")
> +        self.console_send("%s\n" % self.GUEST_PASS)
> +        self.console_wait("Password")
> +        self.console_send("%s\n" % self.GUEST_PASS)
> +
> +        self.console_wait_send("Allow root ssh login",    "yes\n")
> +        self.console_wait_send("timezone",                "UTC\n")
> +        self.console_wait_send("root disk",               "\n")
> +        self.console_wait_send("(W)hole disk",            "\n")
> +        self.console_wait_send("(A)uto layout",           "\n")
> +        self.console_wait_send("Location of sets",        "cd0\n")
> +        self.console_wait_send("Pathname to the sets",    "\n")
> +        self.console_wait_send("Set name(s)",             "\n")
> +        self.console_wait_send("without verification",    "yes\n")
> +
> +        self.print_step("Installation started now, this will take a while")
> +        self.console_wait_send("Location of sets",        "done\n")
> +
> +        self.console_wait("successfully completed")
> +        self.print_step("Installation finished, rebooting")
> +        self.console_wait_send("(R)eboot",                "reboot\n")
> +
> +        # 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 = "openbsd#"
> +        self.console_ssh_init(prompt, "root", self.ROOT_PASS)
> +        self.console_sshd_config(prompt)
> +
> +        # setup virtio-blk #1 (tarfile)
> +        self.console_wait(prompt)
> +        self.console_send("echo 'chmod 666 /dev/rsd1c' >> /etc/rc.local\n")
> +
> +        # enable w+x for /home
> +        self.console_wait(prompt)
> +        self.console_send("sed -i -e '/home/s/rw,/rw,wxallowed,/' 
> /etc/fstab\n")
> +
> +        # tweak datasize limit
> +        self.console_wait(prompt)
> +        self.console_send("sed -i -e 
> 's/\\(datasize[^=]*\\)=[^:]*/\\1=infinity/' /etc/login.conf\n")
> +
> +        # use http (be proxy cache friendly)
> +        self.console_wait(prompt)
> +        self.console_send("sed -i -e 's/https/http/' /etc/installurl\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_add %s\n" % " ".join(self.pkgs))
> +
> +        # shutdown
> +        self.ssh_root(self.poweroff)
> +        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(OpenBSDVM))
> 

This works like charm.

Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
Tested-by: Philippe Mathieu-Daudé <address@hidden>



reply via email to

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