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 |
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>
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
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 >
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)
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.
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
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
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 --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))