diff mbox series

[v4,09/11] tests/vm: netbsd autoinstall, using serial console

Message ID 20190617043858.8290-10-kraxel@redhat.com (mailing list archive)
State New, archived
Headers show
Series tests/vm: serial console autoinstall, misc fixes. | expand

Commit Message

Gerd Hoffmann June 17, 2019, 4:38 a.m. UTC
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 <kraxel@redhat.com>
Reviewed-by: Kamil Rytarowski <n54@gmx.com>
Tested-by: Thomas Huth <thuth@redhat.com>
---
 tests/vm/netbsd | 187 +++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 177 insertions(+), 10 deletions(-)

Comments

Philippe Mathieu-Daudé June 17, 2019, 4:13 p.m. UTC | #1
On 6/17/19 6:38 AM, 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 <kraxel@redhat.com>
> Reviewed-by: Kamil Rytarowski <n54@gmx.com>
> Tested-by: Thomas Huth <thuth@redhat.com>

From v3:
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Alex Bennée July 5, 2019, 10:24 a.m. UTC | #2
Gerd Hoffmann <kraxel@redhat.com> writes:

> 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've had to drop this from my v3 PR as Peter was seeing a very
slow/hanging install when running his merge tests. I've tried to
reproduce and I see it stall while installing packages but nowhere near
the delay Peter has seen.

Any pointers on how to debug gratefully received.

>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> Reviewed-by: Kamil Rytarowski <n54@gmx.com>
> Tested-by: Thomas Huth <thuth@redhat.com>
> ---
>  tests/vm/netbsd | 187 +++++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 177 insertions(+), 10 deletions(-)
>
> diff --git a/tests/vm/netbsd b/tests/vm/netbsd
> index 4c6624ea5ed5..be59a2c1da1d 100755
> --- a/tests/vm/netbsd
> +++ b/tests/vm/netbsd
> @@ -2,10 +2,11 @@
>  #
>  # NetBSD 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.
> @@ -13,32 +14,198 @@
>
>  import os
>  import sys
> +import time
>  import subprocess
>  import basevm
>
>  class NetBSDVM(basevm.BaseVM):
>      name = "netbsd"
>      arch = "x86_64"
> +
> +    link = "https://cdn.netbsd.org/pub/NetBSD/NetBSD-8.0/images/NetBSD-8.0-amd64.iso"
> +    size = "20G"
> +    pkgs = [
> +        # tools
> +        "git-base",
> +        "pkgconf",
> +        "xz",
> +        "python37",
> +
> +        # gnu tools
> +        "bash",
> +        "gmake",
> +        "gsed",
> +        "flex", "bison",
> +
> +        # libs: crypto
> +        "gnutls",
> +
> +        # libs: images
> +        "jpeg",
> +        "png",
> +
> +	# libs: ui
> +        "SDL2",
> +        "gtk3+",
> +        "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/rld1a;
> -        ./configure --python=python2.7 {configure_opts};
> +        cd ../build
> +        ../src/configure --python=python3.7 --disable-opengl {configure_opts};
>          gmake --output-sync -j{jobs} {target} {verbose};
>      """
> +    poweroff = "/sbin/poweroff"
>
>      def build_image(self, img):
> -        cimg = self._download_with_cache("http://download.patchew.org/netbsd-7.1-amd64.img.xz",
> -                                         sha256sum='b633d565b0eac3d02015cd0c81440bd8a7a8df8512615ac1ee05d318be015732')
> -        img_tmp_xz = img + ".tmp.xz"
> +        cimg = self._download_with_cache(self.link)
>          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 = [
> +            "-bios", "pc-bios/bios-256k.bin",
> +            "-machine", "graphics=off",
> +            "-cdrom", iso
> +        ])
> +        self.console_init()
> +        self.console_wait("Primary Bootstrap")
> +
> +        # serial console boot menu output doesn't work for some
> +        # reason, so we have to fly blind ...
> +        for char in list("5consdev com0\n"):
> +            time.sleep(0.2)
> +            self.console_send(char)
> +            self.console_wait("")
> +        self.console_wait_send("> ", "boot\n")
> +
> +        self.console_wait_send("Terminal type",            "xterm\n")
> +        self.console_wait_send("a: Installation messages", "a\n")
> +        self.console_wait_send("b: US-English",            "b\n")
> +        self.console_wait_send("a: Install NetBSD",        "a\n")
> +        self.console_wait("Shall we continue?")
> +        self.console_wait_send("b: Yes",                   "b\n")
> +
> +        self.console_wait_send("a: ld0",                   "a\n")
> +        self.console_wait_send("a: This is the correct",   "a\n")
> +        self.console_wait_send("b: Use the entire disk",   "b\n")
> +        self.console_wait("NetBSD bootcode")
> +        self.console_wait_send("a: Yes",                   "a\n")
> +        self.console_wait_send("b: Use existing part",     "b\n")
> +        self.console_wait_send("x: Partition sizes ok",    "x\n")
> +        self.console_wait_send("for your NetBSD disk",     "\n")
> +        self.console_wait("Shall we continue?")
> +        self.console_wait_send("b: Yes",                   "b\n")
> +
> +        self.console_wait_send("b: Use serial port com0",  "b\n")
> +        self.console_wait_send("f: Set serial baud rate",  "f\n")
> +        self.console_wait_send("a: 9600",                  "a\n")
> +        self.console_wait_send("x: Exit",                  "x\n")
> +
> +        self.console_wait_send("a: Full installation",     "a\n")
> +        self.console_wait_send("a: CD-ROM",                "a\n")
> +
> +        self.print_step("Installation started now, this will take a while")
> +        self.console_wait_send("Hit enter to continue",    "\n")
> +
> +        self.console_wait_send("d: Change root password",  "d\n")
> +        self.console_wait_send("a: Yes",                   "a\n")
> +        self.console_wait("New password:")
> +        self.console_send("%s\n" % self.ROOT_PASS)
> +        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("o: Add a user",            "o\n")
> +        self.console_wait("username")
> +        self.console_send("%s\n" % self.GUEST_USER)
> +        self.console_wait("to group wheel")
> +        self.console_wait_send("a: Yes",                   "a\n")
> +        self.console_wait_send("a: /bin/sh",               "a\n")
> +        self.console_wait("New password:")
> +        self.console_send("%s\n" % self.GUEST_PASS)
> +        self.console_wait("New password:")
> +        self.console_send("%s\n" % self.GUEST_PASS)
> +        self.console_wait("Retype new password:")
> +        self.console_send("%s\n" % self.GUEST_PASS)
> +
> +        self.console_wait_send("a: Configure network",     "a\n")
> +        self.console_wait_send("a: vioif0",                "a\n")
> +        self.console_wait_send("Network media type",       "\n")
> +        self.console_wait("autoconfiguration")
> +        self.console_wait_send("a: Yes",                   "a\n")
> +        self.console_wait_send("DNS domain",               "localnet\n")
> +        self.console_wait("Are they OK?")
> +        self.console_wait_send("a: Yes",                   "a\n")
> +        self.console_wait("installed in /etc")
> +        self.console_wait_send("a: Yes",                   "a\n")
> +
> +        self.console_wait_send("e: Enable install",        "e\n")
> +        proxy = os.environ.get("http_proxy")
> +        if not proxy is None:
> +            self.console_wait_send("f: Proxy",             "f\n")
> +            self.console_wait("Proxy")
> +            self.console_send("%s\n" % proxy)
> +        self.console_wait_send("x: Install pkgin",         "x\n")
> +        self.console_init(1200)
> +        self.console_wait_send("Hit enter to continue", "\n")
> +        self.console_init()
> +
> +        self.console_wait_send("g: Enable sshd",           "g\n")
> +        self.console_wait_send("x: Finished conf",         "x\n")
> +        self.console_wait_send("Hit enter to continue",    "\n")
> +
> +        self.print_step("Installation finished, rebooting")
> +        self.console_wait_send("d: Reboot the computer",   "d\n")
> +
> +        # setup qemu user
> +        prompt = "localhost$"
> +        self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
> +        self.console_wait_send(prompt, "exit\n")
> +
> +        # setup root user
> +        prompt = "localhost#"
> +        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/rld1a' >> /etc/rc.local\n")
> +
> +        # turn off mprotect (conflicts with tcg)
> +        self.console_wait(prompt)
> +        self.console_send("echo security.pax.mprotect.enabled=0 >> /etc/sysctl.conf\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("pkgin update\n")
> +        self.ssh_root_check("pkgin -y install %s\n" % " ".join(self.pkgs))
> +
> +        # shutdown
> +        self.ssh_root(self.poweroff)
> +        self.console_wait("entering state S5")
> +        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(NetBSDVM))


--
Alex Bennée
Kamil Rytarowski July 5, 2019, 10:43 a.m. UTC | #3
On 05.07.2019 12:24, Alex Bennée wrote:
> 
> Gerd Hoffmann <kraxel@redhat.com> writes:
> 
>> 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've had to drop this from my v3 PR as Peter was seeing a very
> slow/hanging install when running his merge tests. I've tried to
> reproduce and I see it stall while installing packages but nowhere near
> the delay Peter has seen.
> 
> Any pointers on how to debug gratefully received.
> 

Does it use virtio? There were performance issues with virio disk device.

>>
>> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
>> Reviewed-by: Kamil Rytarowski <n54@gmx.com>
>> Tested-by: Thomas Huth <thuth@redhat.com>
>> ---
>>  tests/vm/netbsd | 187 +++++++++++++++++++++++++++++++++++++++++++++---
>>  1 file changed, 177 insertions(+), 10 deletions(-)
>>
>> diff --git a/tests/vm/netbsd b/tests/vm/netbsd
>> index 4c6624ea5ed5..be59a2c1da1d 100755
>> --- a/tests/vm/netbsd
>> +++ b/tests/vm/netbsd
>> @@ -2,10 +2,11 @@
>>  #
>>  # NetBSD 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.
>> @@ -13,32 +14,198 @@
>>
>>  import os
>>  import sys
>> +import time
>>  import subprocess
>>  import basevm
>>
>>  class NetBSDVM(basevm.BaseVM):
>>      name = "netbsd"
>>      arch = "x86_64"
>> +
>> +    link = "https://cdn.netbsd.org/pub/NetBSD/NetBSD-8.0/images/NetBSD-8.0-amd64.iso"
>> +    size = "20G"
>> +    pkgs = [
>> +        # tools
>> +        "git-base",
>> +        "pkgconf",
>> +        "xz",
>> +        "python37",
>> +
>> +        # gnu tools
>> +        "bash",
>> +        "gmake",
>> +        "gsed",
>> +        "flex", "bison",
>> +
>> +        # libs: crypto
>> +        "gnutls",
>> +
>> +        # libs: images
>> +        "jpeg",
>> +        "png",
>> +
>> +	# libs: ui
>> +        "SDL2",
>> +        "gtk3+",
>> +        "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/rld1a;
>> -        ./configure --python=python2.7 {configure_opts};
>> +        cd ../build
>> +        ../src/configure --python=python3.7 --disable-opengl {configure_opts};
>>          gmake --output-sync -j{jobs} {target} {verbose};
>>      """
>> +    poweroff = "/sbin/poweroff"
>>
>>      def build_image(self, img):
>> -        cimg = self._download_with_cache("http://download.patchew.org/netbsd-7.1-amd64.img.xz",
>> -                                         sha256sum='b633d565b0eac3d02015cd0c81440bd8a7a8df8512615ac1ee05d318be015732')
>> -        img_tmp_xz = img + ".tmp.xz"
>> +        cimg = self._download_with_cache(self.link)
>>          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 = [
>> +            "-bios", "pc-bios/bios-256k.bin",
>> +            "-machine", "graphics=off",
>> +            "-cdrom", iso
>> +        ])
>> +        self.console_init()
>> +        self.console_wait("Primary Bootstrap")
>> +
>> +        # serial console boot menu output doesn't work for some
>> +        # reason, so we have to fly blind ...
>> +        for char in list("5consdev com0\n"):
>> +            time.sleep(0.2)
>> +            self.console_send(char)
>> +            self.console_wait("")
>> +        self.console_wait_send("> ", "boot\n")
>> +
>> +        self.console_wait_send("Terminal type",            "xterm\n")
>> +        self.console_wait_send("a: Installation messages", "a\n")
>> +        self.console_wait_send("b: US-English",            "b\n")
>> +        self.console_wait_send("a: Install NetBSD",        "a\n")
>> +        self.console_wait("Shall we continue?")
>> +        self.console_wait_send("b: Yes",                   "b\n")
>> +
>> +        self.console_wait_send("a: ld0",                   "a\n")
>> +        self.console_wait_send("a: This is the correct",   "a\n")
>> +        self.console_wait_send("b: Use the entire disk",   "b\n")
>> +        self.console_wait("NetBSD bootcode")
>> +        self.console_wait_send("a: Yes",                   "a\n")
>> +        self.console_wait_send("b: Use existing part",     "b\n")
>> +        self.console_wait_send("x: Partition sizes ok",    "x\n")
>> +        self.console_wait_send("for your NetBSD disk",     "\n")
>> +        self.console_wait("Shall we continue?")
>> +        self.console_wait_send("b: Yes",                   "b\n")
>> +
>> +        self.console_wait_send("b: Use serial port com0",  "b\n")
>> +        self.console_wait_send("f: Set serial baud rate",  "f\n")
>> +        self.console_wait_send("a: 9600",                  "a\n")
>> +        self.console_wait_send("x: Exit",                  "x\n")
>> +
>> +        self.console_wait_send("a: Full installation",     "a\n")
>> +        self.console_wait_send("a: CD-ROM",                "a\n")
>> +
>> +        self.print_step("Installation started now, this will take a while")
>> +        self.console_wait_send("Hit enter to continue",    "\n")
>> +
>> +        self.console_wait_send("d: Change root password",  "d\n")
>> +        self.console_wait_send("a: Yes",                   "a\n")
>> +        self.console_wait("New password:")
>> +        self.console_send("%s\n" % self.ROOT_PASS)
>> +        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("o: Add a user",            "o\n")
>> +        self.console_wait("username")
>> +        self.console_send("%s\n" % self.GUEST_USER)
>> +        self.console_wait("to group wheel")
>> +        self.console_wait_send("a: Yes",                   "a\n")
>> +        self.console_wait_send("a: /bin/sh",               "a\n")
>> +        self.console_wait("New password:")
>> +        self.console_send("%s\n" % self.GUEST_PASS)
>> +        self.console_wait("New password:")
>> +        self.console_send("%s\n" % self.GUEST_PASS)
>> +        self.console_wait("Retype new password:")
>> +        self.console_send("%s\n" % self.GUEST_PASS)
>> +
>> +        self.console_wait_send("a: Configure network",     "a\n")
>> +        self.console_wait_send("a: vioif0",                "a\n")
>> +        self.console_wait_send("Network media type",       "\n")
>> +        self.console_wait("autoconfiguration")
>> +        self.console_wait_send("a: Yes",                   "a\n")
>> +        self.console_wait_send("DNS domain",               "localnet\n")
>> +        self.console_wait("Are they OK?")
>> +        self.console_wait_send("a: Yes",                   "a\n")
>> +        self.console_wait("installed in /etc")
>> +        self.console_wait_send("a: Yes",                   "a\n")
>> +
>> +        self.console_wait_send("e: Enable install",        "e\n")
>> +        proxy = os.environ.get("http_proxy")
>> +        if not proxy is None:
>> +            self.console_wait_send("f: Proxy",             "f\n")
>> +            self.console_wait("Proxy")
>> +            self.console_send("%s\n" % proxy)
>> +        self.console_wait_send("x: Install pkgin",         "x\n")
>> +        self.console_init(1200)
>> +        self.console_wait_send("Hit enter to continue", "\n")
>> +        self.console_init()
>> +
>> +        self.console_wait_send("g: Enable sshd",           "g\n")
>> +        self.console_wait_send("x: Finished conf",         "x\n")
>> +        self.console_wait_send("Hit enter to continue",    "\n")
>> +
>> +        self.print_step("Installation finished, rebooting")
>> +        self.console_wait_send("d: Reboot the computer",   "d\n")
>> +
>> +        # setup qemu user
>> +        prompt = "localhost$"
>> +        self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
>> +        self.console_wait_send(prompt, "exit\n")
>> +
>> +        # setup root user
>> +        prompt = "localhost#"
>> +        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/rld1a' >> /etc/rc.local\n")
>> +
>> +        # turn off mprotect (conflicts with tcg)
>> +        self.console_wait(prompt)
>> +        self.console_send("echo security.pax.mprotect.enabled=0 >> /etc/sysctl.conf\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("pkgin update\n")
>> +        self.ssh_root_check("pkgin -y install %s\n" % " ".join(self.pkgs))
>> +
>> +        # shutdown
>> +        self.ssh_root(self.poweroff)
>> +        self.console_wait("entering state S5")
>> +        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(NetBSDVM))
> 
> 
> --
> Alex Bennée
>
Philippe Mathieu-Daudé July 5, 2019, 10:47 a.m. UTC | #4
On 7/5/19 12:43 PM, Kamil Rytarowski wrote:
> On 05.07.2019 12:24, Alex Bennée wrote:
>>
>> Gerd Hoffmann <kraxel@redhat.com> writes:
>>
>>> 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've had to drop this from my v3 PR as Peter was seeing a very
>> slow/hanging install when running his merge tests. I've tried to
>> reproduce and I see it stall while installing packages but nowhere near
>> the delay Peter has seen.
>>
>> Any pointers on how to debug gratefully received.
>>
> 
> Does it use virtio? There were performance issues with virio disk device.

Yes, virtio-blk, you can see how the VM is started looking at
tests/vm/basevm.py:

 "-drive",
 "file=%s,if=none,id=%s,cache=writeback,format=raw" % (tarfile, name),

 "-device",
 "virtio-blk,drive=%s,serial=%s,bootindex=1" % (name, name)
Kamil Rytarowski July 5, 2019, 10:49 a.m. UTC | #5
On 05.07.2019 12:47, Philippe Mathieu-Daudé wrote:
> On 7/5/19 12:43 PM, Kamil Rytarowski wrote:
>> On 05.07.2019 12:24, Alex Bennée wrote:
>>>
>>> Gerd Hoffmann <kraxel@redhat.com> writes:
>>>
>>>> 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've had to drop this from my v3 PR as Peter was seeing a very
>>> slow/hanging install when running his merge tests. I've tried to
>>> reproduce and I see it stall while installing packages but nowhere near
>>> the delay Peter has seen.
>>>
>>> Any pointers on how to debug gratefully received.
>>>
>>
>> Does it use virtio? There were performance issues with virio disk device.
> 
> Yes, virtio-blk, you can see how the VM is started looking at
> tests/vm/basevm.py:
> 
>  "-drive",
>  "file=%s,if=none,id=%s,cache=writeback,format=raw" % (tarfile, name),
> 
>  "-device",
>  "virtio-blk,drive=%s,serial=%s,bootindex=1" % (name, name)
> 

Try to switch to a non-virtio option and retry.
Peter Maydell July 5, 2019, 10:52 a.m. UTC | #6
On Fri, 5 Jul 2019 at 11:43, Kamil Rytarowski <n54@gmx.com> wrote:
>
> On 05.07.2019 12:24, Alex Bennée wrote:
> >
> > Gerd Hoffmann <kraxel@redhat.com> writes:
> >
> >> 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've had to drop this from my v3 PR as Peter was seeing a very
> > slow/hanging install when running his merge tests. I've tried to
> > reproduce and I see it stall while installing packages but nowhere near
> > the delay Peter has seen.
> >
> > Any pointers on how to debug gratefully received.
> >
>
> Does it use virtio? There were performance issues with virio disk device.

The symptoms I see with this patch are that the VM appears to
completely stall, rather than progressing but slowly.
(I do also see on the current NetBSD tests/vm setup that sometimes
'make check' runs pretty slowly, but in that case it does make
progress, it just completes much slower than either the openbsd
or freebsd VMs. 'make check' is not particularly IO intensive,
certainly not compared to the actual compile phase, though.
And sometimes the initial "wait for VM to boot and ssh in"
phase just hits our 6 minute timeout.)

thanks
-- PMM
Daniel P. Berrangé July 5, 2019, 11:05 a.m. UTC | #7
On Fri, Jul 05, 2019 at 11:52:20AM +0100, Peter Maydell wrote:
> On Fri, 5 Jul 2019 at 11:43, Kamil Rytarowski <n54@gmx.com> wrote:
> >
> > On 05.07.2019 12:24, Alex Bennée wrote:
> > >
> > > Gerd Hoffmann <kraxel@redhat.com> writes:
> > >
> > >> 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've had to drop this from my v3 PR as Peter was seeing a very
> > > slow/hanging install when running his merge tests. I've tried to
> > > reproduce and I see it stall while installing packages but nowhere near
> > > the delay Peter has seen.
> > >
> > > Any pointers on how to debug gratefully received.
> > >
> >
> > Does it use virtio? There were performance issues with virio disk device.
> 
> The symptoms I see with this patch are that the VM appears to
> completely stall, rather than progressing but slowly.
> (I do also see on the current NetBSD tests/vm setup that sometimes
> 'make check' runs pretty slowly, but in that case it does make
> progress, it just completes much slower than either the openbsd
> or freebsd VMs. 'make check' is not particularly IO intensive,
> certainly not compared to the actual compile phase, though.
> And sometimes the initial "wait for VM to boot and ssh in"
> phase just hits our 6 minute timeout.)

I wonder if there's some undiagnosed timer or interrupt problems we're
hitting in NetBSD. We had someone just yesterdayt on IRC reporting they
needed kernel irqchip disabled for OpenBSD under some circumstances
for example. So could be worth trying one or more of the various
tweak args like:

    -machine kernel_irqchip=off
    -global kvm-pit.lost_tick_policy=discard

to see if it affects stability to any useful extent.

Regards,
Daniel
Alex Bennée July 5, 2019, 11:10 a.m. UTC | #8
Peter Maydell <peter.maydell@linaro.org> writes:

> On Fri, 5 Jul 2019 at 11:43, Kamil Rytarowski <n54@gmx.com> wrote:
>>
>> On 05.07.2019 12:24, Alex Bennée wrote:
>> >
>> > Gerd Hoffmann <kraxel@redhat.com> writes:
>> >
>> >> 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've had to drop this from my v3 PR as Peter was seeing a very
>> > slow/hanging install when running his merge tests. I've tried to
>> > reproduce and I see it stall while installing packages but nowhere near
>> > the delay Peter has seen.
>> >
>> > Any pointers on how to debug gratefully received.
>> >
>>
>> Does it use virtio? There were performance issues with virio disk device.
>
> The symptoms I see with this patch are that the VM appears to
> completely stall, rather than progressing but slowly.

which is odd given we are both testing on the same machine (hackbox2?).
I wonder if there is a environmental issue? Possibly the host file-system?

> (I do also see on the current NetBSD tests/vm setup that sometimes
> 'make check' runs pretty slowly, but in that case it does make
> progress, it just completes much slower than either the openbsd
> or freebsd VMs. 'make check' is not particularly IO intensive,
> certainly not compared to the actual compile phase, though.
> And sometimes the initial "wait for VM to boot and ssh in"
> phase just hits our 6 minute timeout.)
>
> thanks
> -- PMM


--
Alex Bennée
diff mbox series

Patch

diff --git a/tests/vm/netbsd b/tests/vm/netbsd
index 4c6624ea5ed5..be59a2c1da1d 100755
--- a/tests/vm/netbsd
+++ b/tests/vm/netbsd
@@ -2,10 +2,11 @@ 
 #
 # NetBSD 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.
@@ -13,32 +14,198 @@ 
 
 import os
 import sys
+import time
 import subprocess
 import basevm
 
 class NetBSDVM(basevm.BaseVM):
     name = "netbsd"
     arch = "x86_64"
+
+    link = "https://cdn.netbsd.org/pub/NetBSD/NetBSD-8.0/images/NetBSD-8.0-amd64.iso"
+    size = "20G"
+    pkgs = [
+        # tools
+        "git-base",
+        "pkgconf",
+        "xz",
+        "python37",
+
+        # gnu tools
+        "bash",
+        "gmake",
+        "gsed",
+        "flex", "bison",
+
+        # libs: crypto
+        "gnutls",
+
+        # libs: images
+        "jpeg",
+        "png",
+
+	# libs: ui
+        "SDL2",
+        "gtk3+",
+        "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/rld1a;
-        ./configure --python=python2.7 {configure_opts};
+        cd ../build
+        ../src/configure --python=python3.7 --disable-opengl {configure_opts};
         gmake --output-sync -j{jobs} {target} {verbose};
     """
+    poweroff = "/sbin/poweroff"
 
     def build_image(self, img):
-        cimg = self._download_with_cache("http://download.patchew.org/netbsd-7.1-amd64.img.xz",
-                                         sha256sum='b633d565b0eac3d02015cd0c81440bd8a7a8df8512615ac1ee05d318be015732')
-        img_tmp_xz = img + ".tmp.xz"
+        cimg = self._download_with_cache(self.link)
         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 = [
+            "-bios", "pc-bios/bios-256k.bin",
+            "-machine", "graphics=off",
+            "-cdrom", iso
+        ])
+        self.console_init()
+        self.console_wait("Primary Bootstrap")
+
+        # serial console boot menu output doesn't work for some
+        # reason, so we have to fly blind ...
+        for char in list("5consdev com0\n"):
+            time.sleep(0.2)
+            self.console_send(char)
+            self.console_wait("")
+        self.console_wait_send("> ", "boot\n")
+
+        self.console_wait_send("Terminal type",            "xterm\n")
+        self.console_wait_send("a: Installation messages", "a\n")
+        self.console_wait_send("b: US-English",            "b\n")
+        self.console_wait_send("a: Install NetBSD",        "a\n")
+        self.console_wait("Shall we continue?")
+        self.console_wait_send("b: Yes",                   "b\n")
+
+        self.console_wait_send("a: ld0",                   "a\n")
+        self.console_wait_send("a: This is the correct",   "a\n")
+        self.console_wait_send("b: Use the entire disk",   "b\n")
+        self.console_wait("NetBSD bootcode")
+        self.console_wait_send("a: Yes",                   "a\n")
+        self.console_wait_send("b: Use existing part",     "b\n")
+        self.console_wait_send("x: Partition sizes ok",    "x\n")
+        self.console_wait_send("for your NetBSD disk",     "\n")
+        self.console_wait("Shall we continue?")
+        self.console_wait_send("b: Yes",                   "b\n")
+
+        self.console_wait_send("b: Use serial port com0",  "b\n")
+        self.console_wait_send("f: Set serial baud rate",  "f\n")
+        self.console_wait_send("a: 9600",                  "a\n")
+        self.console_wait_send("x: Exit",                  "x\n")
+
+        self.console_wait_send("a: Full installation",     "a\n")
+        self.console_wait_send("a: CD-ROM",                "a\n")
+
+        self.print_step("Installation started now, this will take a while")
+        self.console_wait_send("Hit enter to continue",    "\n")
+
+        self.console_wait_send("d: Change root password",  "d\n")
+        self.console_wait_send("a: Yes",                   "a\n")
+        self.console_wait("New password:")
+        self.console_send("%s\n" % self.ROOT_PASS)
+        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("o: Add a user",            "o\n")
+        self.console_wait("username")
+        self.console_send("%s\n" % self.GUEST_USER)
+        self.console_wait("to group wheel")
+        self.console_wait_send("a: Yes",                   "a\n")
+        self.console_wait_send("a: /bin/sh",               "a\n")
+        self.console_wait("New password:")
+        self.console_send("%s\n" % self.GUEST_PASS)
+        self.console_wait("New password:")
+        self.console_send("%s\n" % self.GUEST_PASS)
+        self.console_wait("Retype new password:")
+        self.console_send("%s\n" % self.GUEST_PASS)
+
+        self.console_wait_send("a: Configure network",     "a\n")
+        self.console_wait_send("a: vioif0",                "a\n")
+        self.console_wait_send("Network media type",       "\n")
+        self.console_wait("autoconfiguration")
+        self.console_wait_send("a: Yes",                   "a\n")
+        self.console_wait_send("DNS domain",               "localnet\n")
+        self.console_wait("Are they OK?")
+        self.console_wait_send("a: Yes",                   "a\n")
+        self.console_wait("installed in /etc")
+        self.console_wait_send("a: Yes",                   "a\n")
+
+        self.console_wait_send("e: Enable install",        "e\n")
+        proxy = os.environ.get("http_proxy")
+        if not proxy is None:
+            self.console_wait_send("f: Proxy",             "f\n")
+            self.console_wait("Proxy")
+            self.console_send("%s\n" % proxy)
+        self.console_wait_send("x: Install pkgin",         "x\n")
+        self.console_init(1200)
+        self.console_wait_send("Hit enter to continue", "\n")
+        self.console_init()
+
+        self.console_wait_send("g: Enable sshd",           "g\n")
+        self.console_wait_send("x: Finished conf",         "x\n")
+        self.console_wait_send("Hit enter to continue",    "\n")
+
+        self.print_step("Installation finished, rebooting")
+        self.console_wait_send("d: Reboot the computer",   "d\n")
+
+        # setup qemu user
+        prompt = "localhost$"
+        self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
+        self.console_wait_send(prompt, "exit\n")
+
+        # setup root user
+        prompt = "localhost#"
+        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/rld1a' >> /etc/rc.local\n")
+
+        # turn off mprotect (conflicts with tcg)
+        self.console_wait(prompt)
+        self.console_send("echo security.pax.mprotect.enabled=0 >> /etc/sysctl.conf\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("pkgin update\n")
+        self.ssh_root_check("pkgin -y install %s\n" % " ".join(self.pkgs))
+
+        # shutdown
+        self.ssh_root(self.poweroff)
+        self.console_wait("entering state S5")
+        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(NetBSDVM))