All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Philippe Mathieu-Daudé" <philmd@redhat.com>
To: Gerd Hoffmann <kraxel@redhat.com>, qemu-devel@nongnu.org
Cc: "Fam Zheng" <fam@euphon.net>, "Ed Maste" <emaste@freebsd.org>,
	"Kamil Rytarowski" <kamil@netbsd.org>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Li-Wen Hsu" <lwhsu@freebsd.org>,
	"Brad Smith" <brad@comstyle.com>
Subject: Re: [Qemu-devel] [PATCH v2 10/13] tests/vm: freebsd autoinstall, using serial console
Date: Sun, 19 May 2019 00:55:09 +0200	[thread overview]
Message-ID: <40966599-9a55-8078-bc49-e2597ce5d498@redhat.com> (raw)
In-Reply-To: <20190510104633.9428-11-kraxel@redhat.com>

Hi Gerd,

On 5/10/19 12:46 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.

I'm impressed how charmly this works :)

3 comments so far.

1/ We could record (in tests/vm/freebsd header?) roughly how many local
storage will be used (or display in 'make vm-help'?). FYI this image
takes ~3.1GiB.

2/ "Autoboot in 9 seconds, hit [Enter] to boot or any other key to stop"

3/ I am a bit annoyed it overwrote my previous
~/.cache/qemu-vm/images/freebsd.img VM. Not sure what's the best hash to
use, maybe "git log -n 1 --pretty=format:%H -- tests/vm/freebsd"?
(Similarly for other images).

> 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 <kraxel@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>  tests/vm/freebsd | 175 ++++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 165 insertions(+), 10 deletions(-)
> 
> diff --git a/tests/vm/freebsd b/tests/vm/freebsd
> index b0066017a617..57e5c97f3b26 100755
> --- a/tests/vm/freebsd
> +++ b/tests/vm/freebsd
> @@ -2,43 +2,198 @@
>  #
>  # FreeBSD VM image
>  #
> -# Copyright 2017 Red Hat Inc.
> +# Copyright 2017-2019 Red Hat Inc.
>  #
>  # Authors:
>  #  Fam Zheng <famz@redhat.com>
> +#  Gerd Hoffmann <kraxel@redhat.com>
>  #
>  # 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(["cp", "-f", cimg, img_tmp_xz])
> -        subprocess.check_call(["xz", "-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 = [
> +            "-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 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))
> 


  reply	other threads:[~2019-05-18 22:56 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-10 10:46 [Qemu-devel] [PATCH v2 00/13] tests/vm: serial console autoinstall, misc fixes Gerd Hoffmann
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 01/13] scripts: use git archive in archive-source Gerd Hoffmann
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 02/13] tests/vm: send proxy environment variables over ssh Gerd Hoffmann
2019-05-18 22:15   ` Philippe Mathieu-Daudé
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 03/13] tests/vm: use ssh with pty unconditionally Gerd Hoffmann
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 04/13] tests/vm: run test builds on snapshot Gerd Hoffmann
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 05/13] tests/vm: proper guest shutdown Gerd Hoffmann
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 06/13] tests/vm: add vm-boot-{ssh, serial}-<guest> targets Gerd Hoffmann
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 07/13] tests/vm: add DEBUG=1 to help text Gerd Hoffmann
2019-05-18 22:23   ` Philippe Mathieu-Daudé
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 08/13] tests/vm: serial console support helpers Gerd Hoffmann
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 09/13] tests/vm: openbsd autoinstall, using serial console Gerd Hoffmann
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 10/13] tests/vm: freebsd " Gerd Hoffmann
2019-05-18 22:55   ` Philippe Mathieu-Daudé [this message]
2019-05-20  5:26     ` Gerd Hoffmann
2019-05-20  7:14       ` Thomas Huth
2019-05-20 11:24         ` Philippe Mathieu-Daudé
2019-05-20 12:18           ` Gerd Hoffmann
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 11/13] tests/vm: netbsd " Gerd Hoffmann
2019-05-16  5:16   ` Kamil Rytarowski
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 12/13] tests/vm: fedora " Gerd Hoffmann
2019-05-10 10:46 ` [Qemu-devel] [PATCH v2 13/13] tests/vm: ubuntu.i386: apt proxy setup Gerd Hoffmann
2019-05-18 22:18   ` Philippe Mathieu-Daudé
2019-05-17  1:04 ` [Qemu-devel] QEMU on OpenBSD is broken? (was: Re: [PATCH v2 00/13] tests/vm: serial console autoinstall, misc fixes.) Thomas Huth
2019-05-18 21:27   ` [Qemu-devel] QEMU on OpenBSD is broken? Jim Payne
2019-05-19  4:27     ` Brad Smith
2019-05-20  7:54     ` Gerd Hoffmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=40966599-9a55-8078-bc49-e2597ce5d498@redhat.com \
    --to=philmd@redhat.com \
    --cc=alex.bennee@linaro.org \
    --cc=brad@comstyle.com \
    --cc=emaste@freebsd.org \
    --cc=fam@euphon.net \
    --cc=kamil@netbsd.org \
    --cc=kraxel@redhat.com \
    --cc=lwhsu@freebsd.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.