From 775215234e0e02ad2eaf6939c50253537a16625a Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Wed, 11 Jun 2025 09:58:48 +0200 Subject: [PATCH 01/12] nixvm: Allways run a kernel setup function The path is ready for when we need to run an imageless nixvm without a -k. But for now it will always fail. Signed-off-by: Joel Granados --- cmd/run | 4 +++- lib/qemu/kern | 43 +++++++++++++++++++++++++++++-------------- lib/qemu/nix | 34 ++++++++++++++++++++-------------- 3 files changed, 52 insertions(+), 29 deletions(-) diff --git a/cmd/run b/cmd/run index 81b087a..c5ae39a 100644 --- a/cmd/run +++ b/cmd/run @@ -145,7 +145,9 @@ _run() { QEMU_PARAMS+=("-pidfile" "${VMROOT}/run/${VMNAME}/pidfile") if [[ -v kernel_dir ]]; then - qemu_kern_add_custom --kernel-dir "${kernel_dir}" + qemu_kernel_setup --kernel-dir "${kernel_dir}" + else + qemu_kernel_setup fi if [[ -v do_background ]]; then diff --git a/lib/qemu/kern b/lib/qemu/kern index 333f012..7e1ad20 100644 --- a/lib/qemu/kern +++ b/lib/qemu/kern @@ -36,9 +36,15 @@ _qemu_kern_img_add() { QEMU_PARAMS+=("-append" "$cmdline") } -qemu_kern_add_custom() { - local cmdline_extra="" - local mod_share="9p" +_qemu_check_kern_globs() { + for var in GUEST_KERNEL_IMAGE GUEST_KERNEL_CONSOLE; do + if [[ ! -v ${var} ]]; then + _fatal 1 "${FUNCNAME[0]} Missing var ${var}. Add it to ${VMCONFIG}" + fi + done +} + +qemu_kernel_setup() { local long="kernel-dir:,cmdline-extra:,mod-share:" if ! tmp=$(getopt -o "" --long "$long" -n "${FUNCNAME[0]}" -- "$@"); then @@ -69,24 +75,33 @@ qemu_kern_add_custom() { done if [[ ! -v kernel_dir ]]; then - _fatal 1 "${FUNCNAME[0]} Missing required --kernel-dir argument" + # Yes!; Do nothing with image-backed + if [[ -v NIX_STORE_PATH ]]; then + _qemu_check_kern_globs + qemu_nix_add_noimgnix + fi + return fi - for var in GUEST_KERNEL_IMAGE GUEST_KERNEL_CONSOLE; do - if [[ ! -v ${var} ]]; then - _fatal 1 "${FUNCNAME[0]} Missing var ${var}. Add it to ${VMCONFIG}" - fi - done + _qemu_check_kern_globs - if [[ -v NIX_STORE_PATH ]]; then - qemu_nix_add_noimgnix - else - _qemu_kern_img_add "${cmdline_extra}" + if [[ ! -v mod_share ]]; then + local mod_share="9p" fi local kernel_tag="kernel_dir" qemu_share_add --shared-dir "${kernel_dir}" \ --tag "${kernel_tag}" \ --share-type "${mod_share}" -} + if [[ ! -v cmdline_extra ]]; then + local cmdline_extra="" + fi + + if [[ -v NIX_STORE_PATH ]]; then + qemu_nix_add_noimgnix --kernel-dir "${kernel_dir}" + else + _qemu_kern_img_add "${cmdline_extra}" + fi + +} diff --git a/lib/qemu/nix b/lib/qemu/nix index 200e1e1..0431656 100644 --- a/lib/qemu/nix +++ b/lib/qemu/nix @@ -67,8 +67,11 @@ qemu_nix_add_noimgnix () { _require_program nix _require_path "${NIX_STORE_PATH}" - local long="cmd-line-extra:" + if [[ ! -v VMSTATE ]]; then + _fatal 1 "${FUNCNAME[0]}: VMSTATE global var is not set" + fi + local long="cmd-line-extra:,kernel-dir:" if ! tmp=$(getopt -o "" --long "$long" -n "${FUNCNAME[0]}" -- "$@"); then exit 1 fi @@ -82,6 +85,9 @@ qemu_nix_add_noimgnix () { '--cmd-line-extra' ) cmd_line_extra="$2"; shift 2 ;; + '--kernel-dir' ) + local kernel_dir="$2"; shift 2 + ;; '--' ) shift; break ;; @@ -91,25 +97,28 @@ qemu_nix_add_noimgnix () { esac done - if [[ ! -v VMSTATE ]]; then - _fatal 1 "${FUNCNAME[0]}: VMSTATE global var is not set" - fi - - local dst_path="${VMSTATE}/nixsys" + local nixsys_path="${VMSTATE}/nixsys" : "${NIX_SYS_BUILD_FORCE:="no"}" # defaults to "no" if not set - if [[ ${NIX_SYS_BUILD_FORCE} == "yes" || ! -h ${dst_path} ]]; then - _qemu_nix_create_nix_sys "${dst_path}" + if [[ ${NIX_SYS_BUILD_FORCE} == "yes" || ! -h ${nixsys_path} ]]; then + _qemu_nix_create_nix_sys "${nixsys_path}" fi - _qemu_nix_create_nix_init "${VMSTATE}" - qemu_share_add --shared-dir "${NIX_STORE_PATH}" \ --tag "nixstore" \ --share-type "virtiofs" \ --vm-dir "/nix/store" + _qemu_nix_create_nix_init "${VMSTATE}" + + if [[ -v kernel_dir ]]; then + QEMU_PARAMS+=("-kernel" "${kernel_dir}/${GUEST_KERNEL_IMAGE}") + QEMU_PARAMS+=("-initrd" "${VMSTATE}/init.img") + else + _fatal 1 "${FUNCNAME[0]}: Running a nixvm without a kernel is unsupported" + fi + local nix_init_path="" - nix_init_path="$(readlink "${dst_path}")/init" + nix_init_path="$(readlink "${nixsys_path}")/init" local cmd_line="root=/dev/ram0 console=${GUEST_KERNEL_CONSOLE}" if [[ -v GUEST_KERNEL_APPEND_EXTRA ]]; then cmd_line="${cmd_line} ${GUEST_KERNEL_APPEND_EXTRA}" @@ -122,8 +131,5 @@ qemu_nix_add_noimgnix () { done fi - QEMU_PARAMS+=("-kernel" "${kernel_dir}/${GUEST_KERNEL_IMAGE}") QEMU_PARAMS+=("-append" "${cmd_line}") - QEMU_PARAMS+=("-initrd" "${VMSTATE}/init.img") - } From f5d2645bebe7e086b6ed15f4134ad4986af9f663 Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Tue, 17 Jun 2025 08:40:00 +0200 Subject: [PATCH 02/12] nixvm: separate nix sys result link from result path Signed-off-by: Joel Granados --- lib/qemu/nix | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/qemu/nix b/lib/qemu/nix index 0431656..c9fd417 100644 --- a/lib/qemu/nix +++ b/lib/qemu/nix @@ -97,10 +97,11 @@ qemu_nix_add_noimgnix () { esac done - local nixsys_path="${VMSTATE}/nixsys" + local nixsys_link="${VMSTATE}/nixsys" + local nixsys_path=""; nixsys_path="$(readlink "${nixsys_link}")" : "${NIX_SYS_BUILD_FORCE:="no"}" # defaults to "no" if not set - if [[ ${NIX_SYS_BUILD_FORCE} == "yes" || ! -h ${nixsys_path} ]]; then - _qemu_nix_create_nix_sys "${nixsys_path}" + if [[ ${NIX_SYS_BUILD_FORCE} == "yes" || ! -h ${nixsys_link} ]]; then + _qemu_nix_create_nix_sys "${nixsys_link}" fi qemu_share_add --shared-dir "${NIX_STORE_PATH}" \ @@ -117,14 +118,12 @@ qemu_nix_add_noimgnix () { _fatal 1 "${FUNCNAME[0]}: Running a nixvm without a kernel is unsupported" fi - local nix_init_path="" - nix_init_path="$(readlink "${nixsys_path}")/init" local cmd_line="root=/dev/ram0 console=${GUEST_KERNEL_CONSOLE}" if [[ -v GUEST_KERNEL_APPEND_EXTRA ]]; then cmd_line="${cmd_line} ${GUEST_KERNEL_APPEND_EXTRA}" fi cmd_line="${cmd_line} ${cmd_line_extra}" - cmd_line="${cmd_line} -- --init-path ${nix_init_path}" + cmd_line="${cmd_line} -- --init-path ${nixsys_path}/init" if [[ -v NIX_MOUNTS ]]; then for nmount in "${NIX_MOUNTS[@]}"; do cmd_line="${cmd_line} --mount ${nmount}" From e0737fa1aabccda46264e2c1902a2a042db0fa6c Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Tue, 17 Jun 2025 21:22:22 +0200 Subject: [PATCH 03/12] nixvm: always share kernel_dir when -k is used Signed-off-by: Joel Granados --- lib/qemu/kern | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/lib/qemu/kern b/lib/qemu/kern index 7e1ad20..b86215f 100644 --- a/lib/qemu/kern +++ b/lib/qemu/kern @@ -45,7 +45,7 @@ _qemu_check_kern_globs() { } qemu_kernel_setup() { - local long="kernel-dir:,cmdline-extra:,mod-share:" + local long="kernel-dir:,cmdline-extra:" if ! tmp=$(getopt -o "" --long "$long" -n "${FUNCNAME[0]}" -- "$@"); then exit 1 @@ -62,9 +62,6 @@ qemu_kernel_setup() { '--cmdline-extra' ) cmdline_extra="${cmdline_extra} $2"; shift 2 ;; - 'mod-share' ) - mod_share="$2"; shift 2 - ;; '--' ) shift; break ;; @@ -85,23 +82,19 @@ qemu_kernel_setup() { _qemu_check_kern_globs - if [[ ! -v mod_share ]]; then - local mod_share="9p" - fi - - local kernel_tag="kernel_dir" - qemu_share_add --shared-dir "${kernel_dir}" \ - --tag "${kernel_tag}" \ - --share-type "${mod_share}" - if [[ ! -v cmdline_extra ]]; then local cmdline_extra="" fi if [[ -v NIX_STORE_PATH ]]; then qemu_nix_add_noimgnix --kernel-dir "${kernel_dir}" + local mod_share="9p" else _qemu_kern_img_add "${cmdline_extra}" + local mod_share="virtiofs" fi + qemu_share_add --shared-dir "${kernel_dir}" \ + --tag "kernel_dir" \ + --share-type "${mod_share}" } From e43ab466e8fadcacff967af9c403ad2a9ad89100 Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Fri, 20 Jun 2025 09:41:11 +0200 Subject: [PATCH 04/12] kern: Pass custom kernel path with a GLOB Signed-off-by: Joel Granados --- cmd/run | 12 ++++-------- lib/qemu/kern | 17 +++++++---------- lib/qemu/nix | 9 +++------ 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/cmd/run b/cmd/run index c5ae39a..00f2fce 100644 --- a/cmd/run +++ b/cmd/run @@ -49,10 +49,10 @@ _run() { while true; do case "$1" in '-k' | '--kernel-dir' ) - local kernel_dir="$2"; shift 2 + GUEST_KERNEL_CUSTOM_DIR="$2"; shift 2 - if [[ ! -d "$kernel_dir" ]]; then - _fatal 1 "no such directory: '$kernel_dir'" + if [[ ! -d "${GUEST_KERNEL_CUSTOM_DIR}" ]]; then + _fatal 1 "no such directory: '${GUEST_KERNEL_CUSTOM_DIR}'" fi ;; @@ -144,11 +144,7 @@ _run() { QEMU_PARAMS+=("-pidfile" "${VMROOT}/run/${VMNAME}/pidfile") - if [[ -v kernel_dir ]]; then - qemu_kernel_setup --kernel-dir "${kernel_dir}" - else - qemu_kernel_setup - fi + qemu_kernel_setup if [[ -v do_background ]]; then QEMU_PARAMS+=("-daemonize") diff --git a/lib/qemu/kern b/lib/qemu/kern index b86215f..b3a99e4 100644 --- a/lib/qemu/kern +++ b/lib/qemu/kern @@ -32,7 +32,7 @@ _qemu_kern_img_add() { cmdline="$cmdline ${GUEST_KERNEL_APPEND_EXTRA}" fi - QEMU_PARAMS+=("-kernel" "${kernel_dir}/${GUEST_KERNEL_IMAGE}") + QEMU_PARAMS+=("-kernel" "${GUEST_KERNEL_CUSTOM_DIR}/${GUEST_KERNEL_IMAGE}") QEMU_PARAMS+=("-append" "$cmdline") } @@ -45,7 +45,7 @@ _qemu_check_kern_globs() { } qemu_kernel_setup() { - local long="kernel-dir:,cmdline-extra:" + local long="cmdline-extra:" if ! tmp=$(getopt -o "" --long "$long" -n "${FUNCNAME[0]}" -- "$@"); then exit 1 @@ -56,9 +56,6 @@ qemu_kernel_setup() { while true; do case "$1" in - '--kernel-dir' ) - local kernel_dir="$2"; shift 2 - ;; '--cmdline-extra' ) cmdline_extra="${cmdline_extra} $2"; shift 2 ;; @@ -71,7 +68,7 @@ qemu_kernel_setup() { esac done - if [[ ! -v kernel_dir ]]; then + if [[ ! -v GUEST_KERNEL_CUSTOM_DIR ]]; then # Yes!; Do nothing with image-backed if [[ -v NIX_STORE_PATH ]]; then _qemu_check_kern_globs @@ -87,14 +84,14 @@ qemu_kernel_setup() { fi if [[ -v NIX_STORE_PATH ]]; then - qemu_nix_add_noimgnix --kernel-dir "${kernel_dir}" - local mod_share="9p" + qemu_nix_add_noimgnix + local mod_share="virtiofs" else _qemu_kern_img_add "${cmdline_extra}" - local mod_share="virtiofs" + local mod_share="9p" fi - qemu_share_add --shared-dir "${kernel_dir}" \ + qemu_share_add --shared-dir "${GUEST_KERNEL_CUSTOM_DIR}" \ --tag "kernel_dir" \ --share-type "${mod_share}" } diff --git a/lib/qemu/nix b/lib/qemu/nix index c9fd417..e8d63b9 100644 --- a/lib/qemu/nix +++ b/lib/qemu/nix @@ -71,7 +71,7 @@ qemu_nix_add_noimgnix () { _fatal 1 "${FUNCNAME[0]}: VMSTATE global var is not set" fi - local long="cmd-line-extra:,kernel-dir:" + local long="cmd-line-extra:" if ! tmp=$(getopt -o "" --long "$long" -n "${FUNCNAME[0]}" -- "$@"); then exit 1 fi @@ -85,9 +85,6 @@ qemu_nix_add_noimgnix () { '--cmd-line-extra' ) cmd_line_extra="$2"; shift 2 ;; - '--kernel-dir' ) - local kernel_dir="$2"; shift 2 - ;; '--' ) shift; break ;; @@ -111,8 +108,8 @@ qemu_nix_add_noimgnix () { _qemu_nix_create_nix_init "${VMSTATE}" - if [[ -v kernel_dir ]]; then - QEMU_PARAMS+=("-kernel" "${kernel_dir}/${GUEST_KERNEL_IMAGE}") + if [[ -v GUEST_KERNEL_CUSTOM_DIR ]]; then + QEMU_PARAMS+=("-kernel" "${GUEST_KERNEL_CUSTOM_DIR}/${GUEST_KERNEL_IMAGE}") QEMU_PARAMS+=("-initrd" "${VMSTATE}/init.img") else _fatal 1 "${FUNCNAME[0]}: Running a nixvm without a kernel is unsupported" From ac270d1b24e52e3d3cbf77a5c885dd133352143e Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Fri, 20 Jun 2025 09:59:20 +0200 Subject: [PATCH 05/12] kern: consolidate all kern extra cmdline in GUEST_KERNEL_APPEND_EXTRA Signed-off-by: Joel Granados --- lib/qemu/kern | 39 +++------------------------------------ lib/qemu/nix | 28 +--------------------------- 2 files changed, 4 insertions(+), 63 deletions(-) diff --git a/lib/qemu/kern b/lib/qemu/kern index b3a99e4..3e9cdc4 100644 --- a/lib/qemu/kern +++ b/lib/qemu/kern @@ -5,8 +5,6 @@ # Written by Joel Granados _qemu_kern_img_add() { - local cmdline_extra="$1" - for var in GUEST_BOOT GUEST_BOOT_BASE; do if [[ ! -v ${var} ]]; then _fatal 1 "${FUNCNAME[0]} Missing var ${var}. Add it to ${VMCONFIG}" @@ -27,13 +25,9 @@ _qemu_kern_img_add() { GUEST_KERNEL_BOOTDEV="/dev/vda1" fi - local cmdline="root=${GUEST_KERNEL_BOOTDEV} console=${GUEST_KERNEL_CONSOLE} ${cmdline_extra}" - if [[ -v GUEST_KERNEL_APPEND_EXTRA ]]; then - cmdline="$cmdline ${GUEST_KERNEL_APPEND_EXTRA}" - fi - QEMU_PARAMS+=("-kernel" "${GUEST_KERNEL_CUSTOM_DIR}/${GUEST_KERNEL_IMAGE}") - QEMU_PARAMS+=("-append" "$cmdline") + QEMU_PARAMS+=("-append" \ + "root=${GUEST_KERNEL_BOOTDEV} console=${GUEST_KERNEL_CONSOLE} ${GUEST_KERNEL_APPEND_EXTRA}") } _qemu_check_kern_globs() { @@ -45,29 +39,6 @@ _qemu_check_kern_globs() { } qemu_kernel_setup() { - local long="cmdline-extra:" - - if ! tmp=$(getopt -o "" --long "$long" -n "${FUNCNAME[0]}" -- "$@"); then - exit 1 - fi - - eval set -- "$tmp" - unset tmp - - while true; do - case "$1" in - '--cmdline-extra' ) - cmdline_extra="${cmdline_extra} $2"; shift 2 - ;; - '--' ) - shift; break - ;; - * ) - _fatal 1 "unknown argument '$1'" - ;; - esac - done - if [[ ! -v GUEST_KERNEL_CUSTOM_DIR ]]; then # Yes!; Do nothing with image-backed if [[ -v NIX_STORE_PATH ]]; then @@ -79,15 +50,11 @@ qemu_kernel_setup() { _qemu_check_kern_globs - if [[ ! -v cmdline_extra ]]; then - local cmdline_extra="" - fi - if [[ -v NIX_STORE_PATH ]]; then qemu_nix_add_noimgnix local mod_share="virtiofs" else - _qemu_kern_img_add "${cmdline_extra}" + _qemu_kern_img_add local mod_share="9p" fi diff --git a/lib/qemu/nix b/lib/qemu/nix index e8d63b9..0d01bd7 100644 --- a/lib/qemu/nix +++ b/lib/qemu/nix @@ -71,29 +71,6 @@ qemu_nix_add_noimgnix () { _fatal 1 "${FUNCNAME[0]}: VMSTATE global var is not set" fi - local long="cmd-line-extra:" - if ! tmp=$(getopt -o "" --long "$long" -n "${FUNCNAME[0]}" -- "$@"); then - exit 1 - fi - - eval set -- "$tmp" - unset tmp - - local cmd_line_extra="" - while true; do - case "$1" in - '--cmd-line-extra' ) - cmd_line_extra="$2"; shift 2 - ;; - '--' ) - shift; break - ;; - * ) - _fatal 1 "unknown argument '$1'" - ;; - esac - done - local nixsys_link="${VMSTATE}/nixsys" local nixsys_path=""; nixsys_path="$(readlink "${nixsys_link}")" : "${NIX_SYS_BUILD_FORCE:="no"}" # defaults to "no" if not set @@ -116,10 +93,7 @@ qemu_nix_add_noimgnix () { fi local cmd_line="root=/dev/ram0 console=${GUEST_KERNEL_CONSOLE}" - if [[ -v GUEST_KERNEL_APPEND_EXTRA ]]; then - cmd_line="${cmd_line} ${GUEST_KERNEL_APPEND_EXTRA}" - fi - cmd_line="${cmd_line} ${cmd_line_extra}" + cmd_line="${cmd_line} ${GUEST_KERNEL_APPEND_EXTRA}" cmd_line="${cmd_line} -- --init-path ${nixsys_path}/init" if [[ -v NIX_MOUNTS ]]; then for nmount in "${NIX_MOUNTS[@]}"; do From 04846849abd0e5a147df4fd6347e4b49fe62ff45 Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Mon, 23 Jun 2025 19:56:56 +0200 Subject: [PATCH 06/12] treewide: generalize checking for globals in common Signed-off-by: Joel Granados --- common/rc | 8 ++++++++ lib/qemu/kern | 18 +++--------------- lib/qemu/nix | 5 +---- lib/qemu/share | 4 +--- 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/common/rc b/common/rc index 3222a5a..1a38436 100644 --- a/common/rc +++ b/common/rc @@ -137,6 +137,14 @@ _require_path() { fi } +_require_vars() { + for var in $1; do + if [[ ! -v ${var} ]]; then + _fatal 1 "${FUNCNAME[0]} Missing var ${var}. Missing in ${VMCONFIG}?" + fi + done +} + _is_running() { if [[ -f "${VMRUN}/pidfile" ]]; then return 0 diff --git a/lib/qemu/kern b/lib/qemu/kern index 3e9cdc4..c99f7ba 100644 --- a/lib/qemu/kern +++ b/lib/qemu/kern @@ -5,11 +5,7 @@ # Written by Joel Granados _qemu_kern_img_add() { - for var in GUEST_BOOT GUEST_BOOT_BASE; do - if [[ ! -v ${var} ]]; then - _fatal 1 "${FUNCNAME[0]} Missing var ${var}. Add it to ${VMCONFIG}" - fi - done + _require_vars "GUEST_BOOT GUEST_BOOT_BASE" if [[ ! -f "${VMROOT}/$GUEST_BOOT" ]]; then if [[ ! -f "${VMROOT}/$GUEST_BOOT_BASE" ]]; then @@ -30,25 +26,17 @@ _qemu_kern_img_add() { "root=${GUEST_KERNEL_BOOTDEV} console=${GUEST_KERNEL_CONSOLE} ${GUEST_KERNEL_APPEND_EXTRA}") } -_qemu_check_kern_globs() { - for var in GUEST_KERNEL_IMAGE GUEST_KERNEL_CONSOLE; do - if [[ ! -v ${var} ]]; then - _fatal 1 "${FUNCNAME[0]} Missing var ${var}. Add it to ${VMCONFIG}" - fi - done -} - qemu_kernel_setup() { if [[ ! -v GUEST_KERNEL_CUSTOM_DIR ]]; then # Yes!; Do nothing with image-backed if [[ -v NIX_STORE_PATH ]]; then - _qemu_check_kern_globs + _require_vars "GUEST_KERNEL_IMAGE GUEST_KERNEL_CONSOLE" qemu_nix_add_noimgnix fi return fi - _qemu_check_kern_globs + _require_vars "GUEST_KERNEL_IMAGE GUEST_KERNEL_CONSOLE" if [[ -v NIX_STORE_PATH ]]; then qemu_nix_add_noimgnix diff --git a/lib/qemu/nix b/lib/qemu/nix index 0d01bd7..89ee688 100644 --- a/lib/qemu/nix +++ b/lib/qemu/nix @@ -66,10 +66,7 @@ _qemu_nix_create_nix_init () { qemu_nix_add_noimgnix () { _require_program nix _require_path "${NIX_STORE_PATH}" - - if [[ ! -v VMSTATE ]]; then - _fatal 1 "${FUNCNAME[0]}: VMSTATE global var is not set" - fi + _require_vars "VMSTATE" local nixsys_link="${VMSTATE}/nixsys" local nixsys_path=""; nixsys_path="$(readlink "${nixsys_link}")" diff --git a/lib/qemu/share b/lib/qemu/share index 4cb375f..b2d15df 100644 --- a/lib/qemu/share +++ b/lib/qemu/share @@ -6,9 +6,7 @@ _qemu_share_force_memshare() { # memshare for virtiofs https://virtio-fs.gitlab.io/howto-qemu.html - if [[ ! -v GUEST_MEMORY ]]; then - _fatal 1 "${FUNCNAME[0]}: GUEST_MEMORY variable is undefined" - fi + _require_vars "GUEST_MEMORY" if [[ "${QEMU_PARAMS[*]}" != *"memory-backend-file"* ]]; then QEMU_PARAMS+=("-object" "memory-backend-file,id=mem,size=${GUEST_MEMORY},mem-path=/dev/shm,share=on") From 7747f4fb76dacb75b5f473abe614958a639c5741 Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Mon, 23 Jun 2025 20:09:55 +0200 Subject: [PATCH 07/12] nixvm: Add all the nix commands to VMPRE Signed-off-by: Joel Granados --- lib/qemu/nix | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/lib/qemu/nix b/lib/qemu/nix index 89ee688..80660a1 100644 --- a/lib/qemu/nix +++ b/lib/qemu/nix @@ -15,18 +15,12 @@ _qemu_nix_create_nix_sys () { _fatal 1 "${FUNCNAME[0]}: File not found (${NIX_FLAKE_PATH})" fi - if ! cp -f "${NIX_FLAKE_PATH}" "${flake_dst_path}"; then - _fatal 1 "${FUNCNAME[0]}: Error copying \ - src:(${NIX_FLAKE_PATH}) dest:(${flake_dst_path})" - fi + _add_pre_cmd "cp -f \"${NIX_FLAKE_PATH}\" \"${flake_dst_path}\"" - local nix_build_cmd="nix build \ + _add_pre_cmd "nix build \ 'path:${flake_dst_dir}#${flake_attr_path}' \ -o \"${dst_path}\" \ --no-write-lock-file" - if ! eval "${nix_build_cmd}"; then - _fatal 1 "${FUNCNAME[0]}: Error running '${nix_build_cmd}'" - fi } _qemu_nix_create_nix_init () { @@ -41,26 +35,19 @@ _qemu_nix_create_nix_init () { local make_path="${state_dir}/Makefile" if [[ ! -f ${make_path} ]]; then - if ! ln -s "${BASEDIR}/contrib/nix/Makefile" "${make_path}"; then - _fatal 1 "${FUNCNAME[0]}: Error creating sym link for ${make_path}" - fi + _add_pre_cmd "ln -s \"${BASEDIR}/contrib/nix/Makefile\" \"${make_path}\"" fi local c_init_path="${state_dir}/vmctl_init.c" if [[ ! -f ${c_init_path} ]]; then - if ! ln -s "${BASEDIR}/contrib/nix/vmctl_init.c" "${c_init_path}"; then - _fatal 1 "${FUNCNAME[0]}: Error creating sym link for ${c_init_path}" - fi + _add_pre_cmd "ln -s \"${BASEDIR}/contrib/nix/vmctl_init.c\" \"${c_init_path}\"" fi if [[ ${NIX_INIT_REBUILD} == "yes" ]]; then - if ! make -C "${state_dir}" clean; then - _fatal 1 "${FUNCNAME[0]}: Error cleaning ${c_init_path}" - fi - fi - if ! make -C "${state_dir}" all; then - _fatal 1 "${FUNCNAME[0]}: Error compiling ${c_init_path}" + _add_pre_cmd "make -C \"${state_dir}\" clean" fi + + _add_pre_cmd "make -C \"${state_dir}\" all" } qemu_nix_add_noimgnix () { From fa6be13d2f1c964861ac9de85b6b26181859c3b9 Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Mon, 23 Jun 2025 20:27:30 +0200 Subject: [PATCH 08/12] treewide: use _require_path for path check that fail when missing Signed-off-by: Joel Granados --- cmd/env | 4 +--- cmd/run | 5 +---- common/rc | 2 +- lib/qemu/share | 4 +--- vmctl | 5 +---- 5 files changed, 5 insertions(+), 15 deletions(-) diff --git a/cmd/env b/cmd/env index cb27fc3..08b0fa3 100644 --- a/cmd/env +++ b/cmd/env @@ -52,9 +52,7 @@ _env() { _require_program socat exampledir="${BASEDIR}/examples/vm" - if [[ ! -d ${exampledir} ]]; then - _fatal 1 "Example dir (${exampledir}) not found." - fi + _require_path "${exampledir}" if [ ! -d "${bootstrap_dir}" ]; then if ! mkdir --parent ${verbose} "${bootstrap_dir}"; then diff --git a/cmd/run b/cmd/run index 00f2fce..491b6a3 100644 --- a/cmd/run +++ b/cmd/run @@ -50,10 +50,7 @@ _run() { case "$1" in '-k' | '--kernel-dir' ) GUEST_KERNEL_CUSTOM_DIR="$2"; shift 2 - - if [[ ! -d "${GUEST_KERNEL_CUSTOM_DIR}" ]]; then - _fatal 1 "no such directory: '${GUEST_KERNEL_CUSTOM_DIR}'" - fi + _require_path "${GUEST_KERNEL_CUSTOM_DIR}" ;; '-c' | '--cloud-init' ) diff --git a/common/rc b/common/rc index 1a38436..5c1c7f7 100644 --- a/common/rc +++ b/common/rc @@ -130,7 +130,7 @@ _require_program() { } _require_path() { - local rpath="$1"; shift + local rpath="$1" if [[ ! -d "${rpath}" ]]; then _fatal 1 "Path not found (${rpath}). $*" diff --git a/lib/qemu/share b/lib/qemu/share index b2d15df..5d21276 100644 --- a/lib/qemu/share +++ b/lib/qemu/share @@ -77,9 +77,7 @@ qemu_share_add() { _fatal 1 "${FUNCNAME[0]}: missing required '--shared-dir' argument" fi - if [[ ! -d ${shared_dir} ]]; then - _fatal 1 "${FUNCNAME[0]}: ${shared_dir} does not exist" - fi + _require_path "${shared_dir}" if [[ ! -v tag ]]; then _fatal 1 "${FUNCNAME[0]}: missing required '--tag' argument" diff --git a/vmctl b/vmctl index 8b6b94f..262f1b5 100755 --- a/vmctl +++ b/vmctl @@ -73,11 +73,8 @@ _main() { ;; '-b' | '--basedir' ) - if [[ ! -d "$2" ]]; then - _fatal 1 "invalid base directory '$2'" - fi - VMCTL_VMROOT="$2"; shift 2 + _require_path "${VMCTL_VMROOT}" ;; '-h' | '--help' ) From d6ac4019362cd984aa73d785c98508b3da00f23d Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Thu, 26 Jun 2025 11:54:31 +0200 Subject: [PATCH 09/12] kern: Move kernel path check to qemu_kernel_setup Signed-off-by: Joel Granados --- cmd/run | 1 - lib/qemu/kern | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/run b/cmd/run index 491b6a3..25199ee 100644 --- a/cmd/run +++ b/cmd/run @@ -50,7 +50,6 @@ _run() { case "$1" in '-k' | '--kernel-dir' ) GUEST_KERNEL_CUSTOM_DIR="$2"; shift 2 - _require_path "${GUEST_KERNEL_CUSTOM_DIR}" ;; '-c' | '--cloud-init' ) diff --git a/lib/qemu/kern b/lib/qemu/kern index c99f7ba..6e8dde3 100644 --- a/lib/qemu/kern +++ b/lib/qemu/kern @@ -36,6 +36,7 @@ qemu_kernel_setup() { return fi + _require_path "${GUEST_KERNEL_CUSTOM_DIR}" _require_vars "GUEST_KERNEL_IMAGE GUEST_KERNEL_CONSOLE" if [[ -v NIX_STORE_PATH ]]; then From 858b6db7117f696fef0c883cffb3b570557f57f1 Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Thu, 26 Jun 2025 11:55:02 +0200 Subject: [PATCH 10/12] nixvm: create a nixstage staging dir to avoid nix build errors Signed-off-by: Joel Granados --- lib/qemu/nix | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/qemu/nix b/lib/qemu/nix index 80660a1..0bddfeb 100644 --- a/lib/qemu/nix +++ b/lib/qemu/nix @@ -7,7 +7,7 @@ _qemu_nix_create_nix_sys () { local dst_path="$1" local flake_attr_path="nixosConfigurations.vm.config.system.build.toplevel" - local flake_dst_dir="${VMSTATE}" + local flake_dst_dir="${VMSTATE}/nixstage" local flake_dst_path="${flake_dst_dir}/flake.nix" : "${NIX_FLAKE_PATH:="${BASEDIR}/contrib/nix/x86_64-noimgnix-base.nix"}" @@ -15,6 +15,7 @@ _qemu_nix_create_nix_sys () { _fatal 1 "${FUNCNAME[0]}: File not found (${NIX_FLAKE_PATH})" fi + _add_pre_cmd "mkdir -p \"${flake_dst_dir}\"" _add_pre_cmd "cp -f \"${NIX_FLAKE_PATH}\" \"${flake_dst_path}\"" _add_pre_cmd "nix build \ @@ -56,7 +57,7 @@ qemu_nix_add_noimgnix () { _require_vars "VMSTATE" local nixsys_link="${VMSTATE}/nixsys" - local nixsys_path=""; nixsys_path="$(readlink "${nixsys_link}")" + local nixsys_path=""; nixsys_path="$(readlink -f "${nixsys_link}")" : "${NIX_SYS_BUILD_FORCE:="no"}" # defaults to "no" if not set if [[ ${NIX_SYS_BUILD_FORCE} == "yes" || ! -h ${nixsys_link} ]]; then _qemu_nix_create_nix_sys "${nixsys_link}" From 6cb071a93b00921c6df9bf19ae27767e6735e65b Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Mon, 30 Jun 2025 14:07:55 +0200 Subject: [PATCH 11/12] kern: Replace the kernel dir after we source the config file Signed-off-by: Joel Granados --- cmd/run | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/run b/cmd/run index 25199ee..2951f20 100644 --- a/cmd/run +++ b/cmd/run @@ -49,7 +49,7 @@ _run() { while true; do case "$1" in '-k' | '--kernel-dir' ) - GUEST_KERNEL_CUSTOM_DIR="$2"; shift 2 + local kernel_dir="$2" ; shift 2 ;; '-c' | '--cloud-init' ) @@ -140,6 +140,9 @@ _run() { QEMU_PARAMS+=("-pidfile" "${VMROOT}/run/${VMNAME}/pidfile") + if [[ -v kernel_dir ]]; then + GUEST_KERNEL_CUSTOM_DIR="${kernel_dir}" + fi qemu_kernel_setup if [[ -v do_background ]]; then From e68b90e7bdef298617ca83e04db1b9fe58bdf06f Mon Sep 17 00:00:00 2001 From: Joel Granados Date: Wed, 2 Jul 2025 21:42:17 +0200 Subject: [PATCH 12/12] shellcheck: silence GUEST_KERNEL_CUSTOM_DIR Signed-off-by: Joel Granados --- common/shellcheck | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/shellcheck b/common/shellcheck index 73629e8..c585dfb 100644 --- a/common/shellcheck +++ b/common/shellcheck @@ -6,5 +6,9 @@ # suppress unused global variable warnings _silence_sc2034() { - echo "$QEMU_SYSTEM_BINARY $QEMU_TRACE_EVENTS ${GUEST_KERNEL_CMDLINE[*]} $RESET" > /dev/null + echo "$QEMU_SYSTEM_BINARY \ + $QEMU_TRACE_EVENTS \ + ${GUEST_KERNEL_CMDLINE[*]} \ + $RESET \ + $GUEST_KERNEL_CUSTOM_DIR " > /dev/null }