mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
* 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:
commit
da7da9d5e6
@ -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.
|
||||
|
@ -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':
|
||||
|
||||
::
|
||||
|
@ -50,7 +50,7 @@ QMPObject = Dict[str, object]
|
||||
|
||||
# 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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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'],
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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"
|
||||
|
@ -99,6 +99,11 @@ class BaseVM(object):
|
||||
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()
|
||||
|
@ -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()
|
||||
|
@ -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))
|
||||
|
@ -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);
|
||||
|
@ -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))
|
@ -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>
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user