* Clean up tests/vm (remove obsolte VMs, upgrade Ubuntu 18.04 to 20.04 etc.)

* Fix broken build on Haiku
 * Replace the term 'whitelist' in some files with a better one
 * Some other minor test related fixes
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmLWVV4RHHRodXRoQHJl
 ZGhhdC5jb20ACgkQLtnXdP5wLbXhyg/7Bu0tf9hyx9q8WwUHNEkhFwKN/QaWY3Ow
 8FDVul0nSAr80RfNJT6TNYI82m+Sz/s8QKVFSTYexZpCwZcU/H5M1mvS8AfQfzpb
 j+wQQtSBaRWg+rFYgylc0RIsML7bipm3pJTe123HZDxnuAgFEncZoD9Wazo1kvZh
 jvMFW2c7nCNW829MC4hereWOMxt/JExqqIEjTXLgaE4XQtpMRsyVWDBDiS/yPjrA
 3WUWpUA1t/3PjtIadfXtuicZCEq6C8GGX5uiPBCG6MTOHvfUFP5HukZECkqDJmTA
 V1T7IWzic5T/6xkE5hOS2YTw4aMeX12/pgIJwgzcapvdo1X4zwALsCyzhNklabZi
 fyiYV+hxzN3cTPuFcSmcJWqeTeE8MKtcvCz8kGk1ETbEmzQ0oA65vdWSVk7Yqk70
 eYHS3zWuBSqJ/Kw6dl1KKirG4DpaffNbwySeWPmGRVVE5qfhc7ObuhyA1KpLCYn1
 gyVnmYuVvXExFnoLaBK0kK9qBwZli/EfrQ6StDQ8+Hh+C7SRfo7HC4echV+IAHHZ
 LrcsHPwZ1MH+yWzJs9MAZI2ZgQh6kuB/pW1x6djMxGMKy+5JD4SH4AR3fqYrIHyF
 takNB7a3owSrLuXSYuSLKTvZougBaUp4Jmyc7iux9AbR1Cj58rfoCA1jZ4OPb3H3
 QTXhrq2dI2I=
 =JuhN
 -----END PGP SIGNATURE-----

Merge tag 'pull-request-2022-07-19' of https://gitlab.com/thuth/qemu into staging

* Clean up tests/vm (remove obsolte VMs, upgrade Ubuntu 18.04 to 20.04 etc.)
* Fix broken build on Haiku
* Replace the term 'whitelist' in some files with a better one
* Some other minor test related fixes

# gpg: Signature made Tue 19 Jul 2022 07:55:26 BST
# gpg:                using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5
# gpg:                issuer "thuth@redhat.com"
# gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full]
# gpg:                 aka "Thomas Huth <thuth@redhat.com>" [full]
# gpg:                 aka "Thomas Huth <huth@tuxfamily.org>" [full]
# gpg:                 aka "Thomas Huth <th.huth@posteo.de>" [unknown]
# Primary key fingerprint: 27B8 8847 EEE0 2501 18F3  EAB9 2ED9 D774 FE70 2DB5

* tag 'pull-request-2022-07-19' of https://gitlab.com/thuth/qemu:
  python/qemu/qmp/legacy: Replace 'returns-whitelist' with the correct type
  util: Fix broken build on Haiku
  Replace 'whitelist' with 'allow'
  tests/unit: Replace g_memdup() by g_memdup2()
  qtest/machine-none: Add LoongArch support
  tests/vm: Remove docker cross-compile test from CentOS VM
  tests/vm: add 1GB extra memory per core
  tests/vm: remove duplicate 'centos' VM test
  tests/vm: remove ubuntu.i386 VM test
  tests/vm: upgrade Ubuntu 18.04 VM to 20.04
  tests/vm: switch centos.aarch64 to CentOS 8 Stream
  tests/vm: switch CentOS 8 to CentOS 8 Stream
  tests/vm: use 'cp' instead of 'ln' for temporary vm images
  qga: treat get-guest-fsinfo as "best effort"

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2022-07-19 13:05:06 +01:00
commit da7da9d5e6
16 changed files with 84 additions and 234 deletions

View file

@ -39,7 +39,7 @@ ideas from other posts. If you do subscribe, be prepared for a high
volume of email, often over one thousand messages in a week. The list is
moderated; first-time posts from an email address (whether or not you
subscribed) may be subject to some delay while waiting for a moderator
to whitelist your address.
to allow your address.
The larger your contribution is, or if you plan on becoming a long-term
contributor, then the more important the rest of this page becomes.

View file

@ -225,7 +225,7 @@ disconnects:
qemu-nbd -f qcow2 file.qcow2
Start a long-running server listening with encryption on port 10810,
and whitelist clients with a specific X.509 certificate to connect to
and allow clients with a specific X.509 certificate to connect to
a 1 megabyte subset of a raw file, using the export name 'subset':
::

View file

@ -50,7 +50,7 @@
# QMPMessage can be outgoing commands or incoming events/returns.
# QMPReturnValue is usually a dict/json object, but due to QAPI's
# 'returns-whitelist', it can actually be anything.
# 'command-returns-exceptions', it can actually be anything.
#
# {'return': {}} is a QMPMessage,
# {} is the QMPReturnValue.

View file

@ -1207,7 +1207,15 @@ static void build_guest_fsinfo_for_device(char const *devpath,
syspath = realpath(devpath, NULL);
if (!syspath) {
error_setg_errno(errp, errno, "realpath(\"%s\")", devpath);
if (errno != ENOENT) {
error_setg_errno(errp, errno, "realpath(\"%s\")", devpath);
return;
}
/* ENOENT: This devpath may not exist because of container config */
if (!fs->name) {
fs->name = g_path_get_basename(devpath);
}
return;
}

View file

@ -40,7 +40,7 @@ def check_fields_match(name, s_field, d_field):
return True
# Some fields changed names between qemu versions. This list
# is used to whitelist such changes in each section / description.
# is used to allow such changes in each section / description.
changed_names = {
'apic': ['timer', 'timer_expiry'],
'e1000': ['dev', 'parent_obj'],

View file

@ -54,6 +54,7 @@ static struct arch2cpu cpus_map[] = {
{ "riscv64", "rv64" },
{ "riscv32", "rv32" },
{ "rx", "rx62n" },
{ "loongarch64", "la464"},
};
static const char *get_cpu_model_by_arch(const char *arch)

View file

@ -798,64 +798,64 @@ static void add_ptimer_tests(uint8_t policy)
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
g_memdup(&policy, 1), check_set_count, g_free);
g_memdup2(&policy, 1), check_set_count, g_free);
g_free(tmp);
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
g_memdup(&policy, 1), check_set_limit, g_free);
g_memdup2(&policy, 1), check_set_limit, g_free);
g_free(tmp);
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
g_memdup(&policy, 1), check_oneshot, g_free);
g_memdup2(&policy, 1), check_oneshot, g_free);
g_free(tmp);
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
g_memdup(&policy, 1), check_periodic, g_free);
g_memdup2(&policy, 1), check_periodic, g_free);
g_free(tmp);
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s",
policy_name),
g_memdup(&policy, 1), check_on_the_fly_mode_change, g_free);
g_memdup2(&policy, 1), check_on_the_fly_mode_change, g_free);
g_free(tmp);
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s",
policy_name),
g_memdup(&policy, 1), check_on_the_fly_period_change, g_free);
g_memdup2(&policy, 1), check_on_the_fly_period_change, g_free);
g_free(tmp);
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s",
policy_name),
g_memdup(&policy, 1), check_on_the_fly_freq_change, g_free);
g_memdup2(&policy, 1), check_on_the_fly_freq_change, g_free);
g_free(tmp);
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/run_with_period_0 policy=%s",
policy_name),
g_memdup(&policy, 1), check_run_with_period_0, g_free);
g_memdup2(&policy, 1), check_run_with_period_0, g_free);
g_free(tmp);
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/run_with_delta_0 policy=%s",
policy_name),
g_memdup(&policy, 1), check_run_with_delta_0, g_free);
g_memdup2(&policy, 1), check_run_with_delta_0, g_free);
g_free(tmp);
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s",
policy_name),
g_memdup(&policy, 1), check_periodic_with_load_0, g_free);
g_memdup2(&policy, 1), check_periodic_with_load_0, g_free);
g_free(tmp);
g_test_add_data_func_full(
tmp = g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s",
policy_name),
g_memdup(&policy, 1), check_oneshot_with_load_0, g_free);
g_memdup2(&policy, 1), check_oneshot_with_load_0, g_free);
g_free(tmp);
}

View file

@ -172,7 +172,7 @@ static void test_io(void)
}
iov_from_buf(iov, niov, 0, buf, sz);
siov = g_memdup(iov, sizeof(*iov) * niov);
siov = g_memdup2(iov, sizeof(*iov) * niov);
if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) < 0) {
perror("socketpair");
@ -349,7 +349,7 @@ static void test_discard_front_undo(void)
/* Discard zero bytes */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_tmp = iov;
iov_cnt_tmp = iov_cnt;
iov_discard_front_undoable(&iov_tmp, &iov_cnt_tmp, 0, &undo);
@ -360,7 +360,7 @@ static void test_discard_front_undo(void)
/* Discard more bytes than vector size */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_tmp = iov;
iov_cnt_tmp = iov_cnt;
size = iov_size(iov, iov_cnt);
@ -372,7 +372,7 @@ static void test_discard_front_undo(void)
/* Discard entire vector */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_tmp = iov;
iov_cnt_tmp = iov_cnt;
size = iov_size(iov, iov_cnt);
@ -384,7 +384,7 @@ static void test_discard_front_undo(void)
/* Discard within first element */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_tmp = iov;
iov_cnt_tmp = iov_cnt;
size = g_test_rand_int_range(1, iov->iov_len);
@ -396,7 +396,7 @@ static void test_discard_front_undo(void)
/* Discard entire first element */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_tmp = iov;
iov_cnt_tmp = iov_cnt;
iov_discard_front_undoable(&iov_tmp, &iov_cnt_tmp, iov->iov_len, &undo);
@ -407,7 +407,7 @@ static void test_discard_front_undo(void)
/* Discard within second element */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_tmp = iov;
iov_cnt_tmp = iov_cnt;
size = iov->iov_len + g_test_rand_int_range(1, iov[1].iov_len);
@ -498,7 +498,7 @@ static void test_discard_back_undo(void)
/* Discard zero bytes */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_cnt_tmp = iov_cnt;
iov_discard_back_undoable(iov, &iov_cnt_tmp, 0, &undo);
iov_discard_undo(&undo);
@ -508,7 +508,7 @@ static void test_discard_back_undo(void)
/* Discard more bytes than vector size */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_cnt_tmp = iov_cnt;
size = iov_size(iov, iov_cnt);
iov_discard_back_undoable(iov, &iov_cnt_tmp, size + 1, &undo);
@ -519,7 +519,7 @@ static void test_discard_back_undo(void)
/* Discard entire vector */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_cnt_tmp = iov_cnt;
size = iov_size(iov, iov_cnt);
iov_discard_back_undoable(iov, &iov_cnt_tmp, size, &undo);
@ -530,7 +530,7 @@ static void test_discard_back_undo(void)
/* Discard within last element */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_cnt_tmp = iov_cnt;
size = g_test_rand_int_range(1, iov[iov_cnt - 1].iov_len);
iov_discard_back_undoable(iov, &iov_cnt_tmp, size, &undo);
@ -541,7 +541,7 @@ static void test_discard_back_undo(void)
/* Discard entire last element */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_cnt_tmp = iov_cnt;
size = iov[iov_cnt - 1].iov_len;
iov_discard_back_undoable(iov, &iov_cnt_tmp, size, &undo);
@ -552,7 +552,7 @@ static void test_discard_back_undo(void)
/* Discard within second-to-last element */
iov_random(&iov, &iov_cnt);
iov_orig = g_memdup(iov, sizeof(iov[0]) * iov_cnt);
iov_orig = g_memdup2(iov, sizeof(iov[0]) * iov_cnt);
iov_cnt_tmp = iov_cnt;
size = iov[iov_cnt - 1].iov_len +
g_test_rand_int_range(1, iov[iov_cnt - 2].iov_len);

View file

@ -15,9 +15,9 @@ endif
EFI_AARCH64 = $(wildcard $(BUILD_DIR)/pc-bios/edk2-aarch64-code.fd)
X86_IMAGES := freebsd netbsd openbsd centos fedora haiku.x86_64
X86_IMAGES := freebsd netbsd openbsd fedora haiku.x86_64
ifneq ($(GENISOIMAGE),)
X86_IMAGES += ubuntu.i386 centos
X86_IMAGES += centos
ifneq ($(EFI_AARCH64),)
ARM64_IMAGES += ubuntu.aarch64 centos.aarch64
endif
@ -48,7 +48,6 @@ vm-help vm-test:
@echo " vm-build-fedora - Build QEMU in Fedora VM"
ifneq ($(GENISOIMAGE),)
@echo " vm-build-centos - Build QEMU in CentOS VM, with Docker"
@echo " vm-build-ubuntu.i386 - Build QEMU in ubuntu i386 VM"
ifneq ($(EFI_AARCH64),)
@echo " vm-build-ubuntu.aarch64 - Build QEMU in ubuntu aarch64 VM"
@echo " vm-build-centos.aarch64 - Build QEMU in CentOS aarch64 VM"

View file

@ -99,6 +99,11 @@ def __init__(self, args, config=None):
self._source_path = args.source_path
# Allow input config to override defaults.
self._config = DEFAULT_CONFIG.copy()
# 1GB per core, minimum of 4. This is only a default.
mem = max(4, args.jobs)
self._config['memory'] = f"{mem}G"
if config != None:
self._config.update(config)
self.validate_ssh_keys()

View file

@ -1,8 +1,8 @@
#!/usr/bin/env python3
#
# CentOS image
# CentOS 8 Stream image
#
# Copyright 2018 Red Hat Inc.
# Copyright 2018, 2022 Red Hat Inc.
#
# Authors:
# Fam Zheng <famz@redhat.com>
@ -28,13 +28,12 @@ class CentosVM(basevm.BaseVM):
tar -xf $SRC_ARCHIVE;
make docker-test-block@centos8 {verbose} J={jobs} NETWORK=1;
make docker-test-quick@centos8 {verbose} J={jobs} NETWORK=1;
make docker-test-mingw@fedora {verbose} J={jobs} NETWORK=1;
"""
def build_image(self, img):
cimg = self._download_with_cache("https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-GenericCloud-8.3.2011-20201204.2.x86_64.qcow2")
cimg = self._download_with_cache("https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-20220125.1.x86_64.qcow2")
img_tmp = img + ".tmp"
subprocess.check_call(["ln", "-f", cimg, img_tmp])
subprocess.check_call(['cp', '-f', cimg, img_tmp])
self.exec_qemu_img("resize", img_tmp, "50G")
self.boot(img_tmp, extra_args = ["-cdrom", self.gen_cloud_init_iso()])
self.wait_ssh()

View file

@ -20,150 +20,38 @@ import time
import traceback
import aarch64vm
DEFAULT_CONFIG = {
'cpu' : "max",
'machine' : "virt,gic-version=max",
'install_cmds' : "yum install -y make ninja-build git python3 gcc gcc-c++ flex bison, "\
"yum install -y glib2-devel perl pixman-devel zlib-devel, "\
"alternatives --set python /usr/bin/python3, "\
"sudo dnf config-manager "\
"--add-repo=https://download.docker.com/linux/centos/docker-ce.repo,"\
"sudo dnf install --nobest -y docker-ce.aarch64,"\
"systemctl enable docker",
'install_cmds' : (
"dnf config-manager --set-enabled powertools, "
"dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo, "
"dnf install -y make ninja-build git python38 gcc gcc-c++ flex bison "\
"glib2-devel perl pixman-devel zlib-devel docker-ce.aarch64, "
"systemctl enable docker, "
),
# We increase beyond the default time since during boot
# it can take some time (many seconds) to log into the VM.
'ssh_timeout' : 60,
}
class CentosAarch64VM(basevm.BaseVM):
name = "centos.aarch64"
name = "centos8.aarch64"
arch = "aarch64"
login_prompt = "localhost login:"
prompt = '[root@localhost ~]#'
image_name = "CentOS-8-aarch64-1905-dvd1.iso"
image_link = "http://mirrors.usc.edu/pub/linux/distributions/centos/8.0.1905/isos/aarch64/"
image_name = "CentOS-Stream-GenericCloud-8-20220125.1.aarch64.qcow2"
image_link = "https://cloud.centos.org/centos/8-stream/aarch64/images/"
image_link += image_name
BUILD_SCRIPT = """
set -e;
cd $(mktemp -d);
sudo chmod a+r /dev/vdb;
tar --checkpoint=.10 -xf /dev/vdb;
export SRC_ARCHIVE=/dev/vdb;
sudo chmod a+r $SRC_ARCHIVE;
tar -xf $SRC_ARCHIVE;
./configure {configure_opts};
make --output-sync {target} -j{jobs} {verbose};
"""
def set_key_perm(self):
"""Set permissions properly on certain files to allow
ssh access."""
self.console_wait_send(self.prompt,
"/usr/sbin/restorecon -R -v /root/.ssh\n")
self.console_wait_send(self.prompt,
"/usr/sbin/restorecon -R -v "\
"/home/{}/.ssh\n".format(self._config["guest_user"]))
def create_kickstart(self):
"""Generate the kickstart file used to generate the centos image."""
# Start with the template for the kickstart.
ks_file = self._source_path + "/tests/vm/centos-8-aarch64.ks"
subprocess.check_call("cp {} ./ks.cfg".format(ks_file), shell=True)
# Append the ssh keys to the kickstart file
# as the post processing phase of installation.
with open("ks.cfg", "a") as f:
# Add in the root pw and guest user.
rootpw = "rootpw --plaintext {}\n"
f.write(rootpw.format(self._config["root_pass"]))
add_user = "user --groups=wheel --name={} "\
"--password={} --plaintext\n"
f.write(add_user.format(self._config["guest_user"],
self._config["guest_pass"]))
# Add the ssh keys.
f.write("%post --log=/root/ks-post.log\n")
f.write("mkdir -p /root/.ssh\n")
addkey = 'echo "{}" >> /root/.ssh/authorized_keys\n'
addkey_cmd = addkey.format(self._config["ssh_pub_key"])
f.write(addkey_cmd)
f.write('mkdir -p /home/{}/.ssh\n'.format(self._config["guest_user"]))
addkey = 'echo "{}" >> /home/{}/.ssh/authorized_keys\n'
addkey_cmd = addkey.format(self._config["ssh_pub_key"],
self._config["guest_user"])
f.write(addkey_cmd)
f.write("%end\n")
# Take our kickstart file and create an .iso from it.
# The .iso will be provided to qemu as we boot
# from the install dvd.
# Anaconda will recognize the label "OEMDRV" and will
# start the automated installation.
gen_iso_img = 'genisoimage -output ks.iso -volid "OEMDRV" ks.cfg'
subprocess.check_call(gen_iso_img, shell=True)
def wait_for_shutdown(self):
"""We wait for qemu to shutdown the VM and exit.
While this happens we display the console view
for easier debugging."""
# The image creation is essentially done,
# so whether or not the wait is successful we want to
# wait for qemu to exit (the self.wait()) before we return.
try:
self.console_wait("reboot: Power down")
except Exception as e:
sys.stderr.write("Exception hit\n")
if isinstance(e, SystemExit) and e.code == 0:
return 0
traceback.print_exc()
finally:
self.wait()
def build_base_image(self, dest_img):
"""Run through the centos installer to create
a base image with name dest_img."""
# We create the temp image, and only rename
# to destination when we are done.
img = dest_img + ".tmp"
# Create an empty image.
# We will provide this as the install destination.
qemu_img_create = "qemu-img create {} 50G".format(img)
subprocess.check_call(qemu_img_create, shell=True)
# Create our kickstart file to be fed to the installer.
self.create_kickstart()
# Boot the install dvd with the params as our ks.iso
os_img = self._download_with_cache(self.image_link)
dvd_iso = "centos-8-dvd.iso"
subprocess.check_call(["cp", "-f", os_img, dvd_iso])
extra_args = "-cdrom ks.iso"
extra_args += " -drive file={},if=none,id=drive1,cache=writeback"
extra_args += " -device virtio-blk,drive=drive1,bootindex=1"
extra_args = extra_args.format(dvd_iso).split(" ")
self.boot(img, extra_args=extra_args)
self.console_wait_send("change the selection", "\n")
# We seem to need to hit esc (chr(27)) twice to abort the
# media check, which takes a long time.
# Waiting a bit seems to be more reliable before hitting esc.
self.console_wait("Checking")
time.sleep(5)
self.console_wait_send("Checking", chr(27))
time.sleep(5)
self.console_wait_send("Checking", chr(27))
print("Found Checking")
# Give sufficient time for the installer to create the image.
self.console_init(timeout=7200)
self.wait_for_shutdown()
os.rename(img, dest_img)
print("Done with base image build: {}".format(dest_img))
def check_create_base_img(self, img_base, img_dest):
"""Create a base image using the installer.
We will use the base image if it exists.
This helps cut down on install time in case we
need to restart image creation,
since the base image creation can take a long time."""
if not os.path.exists(img_base):
print("Generate new base image: {}".format(img_base))
self.build_base_image(img_base);
else:
print("Use existing base image: {}".format(img_base))
# Save a copy of the base image and copy it to dest.
# which we will use going forward.
subprocess.check_call(["cp", img_base, img_dest])
def boot(self, img, extra_args=None):
aarch64vm.create_flash_images(self._tmpdir, self._efi_aarch64)
@ -185,42 +73,28 @@ class CentosAarch64VM(basevm.BaseVM):
super(CentosAarch64VM, self).boot(img, extra_args=extra_args)
def build_image(self, img):
cimg = self._download_with_cache(self.image_link)
img_tmp = img + ".tmp"
self.check_create_base_img(img + ".base", img_tmp)
# Boot the new image for the first time to finish installation.
self.boot(img_tmp)
self.console_init()
self.console_wait_send(self.login_prompt, "root\n")
self.console_wait_send("Password:",
"{}\n".format(self._config["root_pass"]))
self.set_key_perm()
self.console_wait_send(self.prompt, "rpm -q centos-release\n")
enable_adapter = "sed -i 's/ONBOOT=no/ONBOOT=yes/g'" \
" /etc/sysconfig/network-scripts/ifcfg-enp0s1\n"
self.console_wait_send(self.prompt, enable_adapter)
self.console_wait_send(self.prompt, "ifup enp0s1\n")
self.console_wait_send(self.prompt,
'echo "qemu ALL=(ALL) NOPASSWD:ALL" | '\
'sudo tee /etc/sudoers.d/qemu\n')
self.console_wait(self.prompt)
# Rest of the commands we issue through ssh.
subprocess.run(['cp', '-f', cimg, img_tmp])
self.exec_qemu_img("resize", img_tmp, "50G")
self.boot(img_tmp, extra_args = ["-cdrom", self.gen_cloud_init_iso()])
self.wait_ssh(wait_root=True)
self.ssh_root_check("touch /etc/cloud/cloud-init.disabled")
# If the user chooses *not* to do the second phase,
# then we will jump right to the graceful shutdown
if self._config['install_cmds'] != "":
install_cmds = self._config['install_cmds'].split(',')
for cmd in install_cmds:
self.ssh_root(cmd)
self.ssh_root_check(cmd)
self.ssh_root("poweroff")
self.wait_for_shutdown()
self.wait()
os.rename(img_tmp, img)
print("image creation complete: {}".format(img))
return 0
if __name__ == "__main__":
defaults = aarch64vm.get_config_defaults(CentosAarch64VM, DEFAULT_CONFIG)
sys.exit(basevm.main(CentosAarch64VM, defaults))

View file

@ -32,9 +32,13 @@ DEFAULT_CONFIG = {
class UbuntuAarch64VM(ubuntuvm.UbuntuVM):
name = "ubuntu.aarch64"
arch = "aarch64"
image_name = "ubuntu-18.04-server-cloudimg-arm64.img"
image_link = "https://cloud-images.ubuntu.com/releases/18.04/release/" + image_name
image_sha256="0fdcba761965735a8a903d8b88df8e47f156f48715c00508e4315c506d7d3cb1"
# NOTE: The Ubuntu 20.04 cloud images are periodically updated. The
# fixed image chosen below is the latest release at time of
# writing. Using a rolling latest instead would mean that the SHA
# would be incorrect at an indeterminate point in the future.
image_name = "focal-server-cloudimg-arm64.img"
image_link = "https://cloud-images.ubuntu.com/focal/20220615/" + image_name
image_sha256="95a027336e197debe88c92ff2e554598e23c409139e1e750b71b3b820b514832"
BUILD_SCRIPT = """
set -e;
cd $(mktemp -d);

View file

@ -1,40 +0,0 @@
#!/usr/bin/env python3
#
# Ubuntu i386 image
#
# Copyright 2017 Red Hat Inc.
#
# Authors:
# Fam Zheng <famz@redhat.com>
#
# This code is licensed under the GPL version 2 or later. See
# the COPYING file in the top-level directory.
#
import sys
import basevm
import ubuntuvm
DEFAULT_CONFIG = {
'install_cmds' : "apt-get update,"\
"apt-get build-dep -y qemu,"\
"apt-get install -y libfdt-dev language-pack-en ninja-build",
}
class UbuntuX86VM(ubuntuvm.UbuntuVM):
name = "ubuntu.i386"
arch = "i386"
image_link="https://cloud-images.ubuntu.com/releases/bionic/"\
"release-20191114/ubuntu-18.04-server-cloudimg-i386.img"
image_sha256="28969840626d1ea80bb249c08eef1a4533e8904aa51a327b40f37ac4b4ff04ef"
BUILD_SCRIPT = """
set -e;
cd $(mktemp -d);
sudo chmod a+r /dev/vdb;
tar -xf /dev/vdb;
./configure {configure_opts};
make --output-sync {target} -j{jobs} {verbose};
"""
if __name__ == "__main__":
sys.exit(basevm.main(UbuntuX86VM, DEFAULT_CONFIG))

View file

@ -35,6 +35,10 @@
#include <sys/sysctl.h>
#endif
#ifdef __HAIKU__
#include <kernel/image.h>
#endif
#ifdef G_OS_WIN32
#include <pathcch.h>
#include <wchar.h>

View file

@ -62,10 +62,6 @@
#include <mach-o/dyld.h>
#endif
#ifdef __HAIKU__
#include <kernel/image.h>
#endif
#include "qemu/mmap-alloc.h"
#ifdef CONFIG_DEBUG_STACK_USAGE