diff --git a/Makefile-tests.am b/Makefile-tests.am index 9198eb3183..350209dedb 100644 --- a/Makefile-tests.am +++ b/Makefile-tests.am @@ -116,6 +116,7 @@ _installed_or_uninstalled_test_scripts = \ tests/test-pull-mirrorlist.sh \ tests/test-summary-update.sh \ tests/test-summary-view.sh \ + tests/test-no-initramfs.sh \ $(NULL) experimental_test_scripts = \ diff --git a/src/boot/grub2/ostree-grub-generator b/src/boot/grub2/ostree-grub-generator index ad8c2b8301..3985008f42 100644 --- a/src/boot/grub2/ostree-grub-generator +++ b/src/boot/grub2/ostree-grub-generator @@ -28,7 +28,7 @@ entries_path=$(dirname $new_grub2_cfg)/entries read_config() { - config_file=${entries_path}/${1} + config_file=${1} title="" initrd="" options="" @@ -67,11 +67,13 @@ populate_menu() else boot_prefix="${OSTREE_BOOT_PARTITION}" fi - for config in $(ls ${entries_path}); do + for config in $(ls $entries_path/*.conf); do read_config ${config} menu="${menu}menuentry '${title}' {\n" menu="${menu}\t linux ${boot_prefix}${linux} ${options}\n" - menu="${menu}\t initrd ${boot_prefix}${initrd}\n" + if [ -n "${initrd}" ] ; then + menu="${menu}\t initrd ${boot_prefix}${initrd}\n" + fi menu="${menu}}\n\n" done # The printf command seems to be more reliable across shells for special character (\n, \t) evaluation diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index 29c90ea7f5..5dc5bde074 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -1700,21 +1700,29 @@ install_deployment_kernel (OstreeSysroot *sysroot, g_autofree char * boot_relpath = g_strconcat ("/", bootcsumdir, "/", kernel_layout->kernel_namever, NULL); ostree_bootconfig_parser_set (bootconfig, "linux", boot_relpath); + val = ostree_bootconfig_parser_get (bootconfig, "options"); + g_autoptr(OstreeKernelArgs) kargs = _ostree_kernel_args_from_string (val); + if (kernel_layout->initramfs_namever) { g_autofree char * boot_relpath = g_strconcat ("/", bootcsumdir, "/", kernel_layout->initramfs_namever, NULL); ostree_bootconfig_parser_set (bootconfig, "initrd", boot_relpath); } - - val = ostree_bootconfig_parser_get (bootconfig, "options"); + else + { + g_autofree char *prepare_root_arg = NULL; + prepare_root_arg = g_strdup_printf ("init=/ostree/boot.%d/%s/%s/%d/usr/lib/ostree/ostree-prepare-root", + new_bootversion, osname, bootcsum, + ostree_deployment_get_bootserial (deployment)); + _ostree_kernel_args_replace_take (kargs, g_steal_pointer (&prepare_root_arg)); + } /* Note this is parsed in ostree-impl-system-generator.c */ g_autofree char *ostree_kernel_arg = g_strdup_printf ("ostree=/ostree/boot.%d/%s/%s/%d", new_bootversion, osname, bootcsum, ostree_deployment_get_bootserial (deployment)); - g_autoptr(OstreeKernelArgs) kargs = _ostree_kernel_args_from_string (val); - _ostree_kernel_args_replace_take (kargs, ostree_kernel_arg); - ostree_kernel_arg = NULL; + _ostree_kernel_args_replace_take (kargs, g_steal_pointer (&ostree_kernel_arg)); + g_autofree char *options_key = _ostree_kernel_args_to_string (kargs); ostree_bootconfig_parser_set (bootconfig, "options", options_key); diff --git a/tests/test-no-initramfs.sh b/tests/test-no-initramfs.sh new file mode 100755 index 0000000000..dcd21ee1c8 --- /dev/null +++ b/tests/test-no-initramfs.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +. $(dirname $0)/libtest.sh + +echo "1..3" + +setup_os_repository "archive-z2" "uboot" + +cd ${test_tmpdir} + +${CMD_PREFIX} ostree --repo=sysroot/ostree/repo remote add --set=gpg-verify=false testos $(cat httpd-address)/ostree/testos-repo +${CMD_PREFIX} ostree --repo=sysroot/ostree/repo pull testos testos/buildmaster/x86_64-runtime +${CMD_PREFIX} ostree admin deploy --karg=root=LABEL=rootfs --os=testos testos:testos/buildmaster/x86_64-runtime + +assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'root=LABEL=rootfs' +assert_not_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'init=' + +echo "ok deployment with initramfs" + +cd ${test_tmpdir}/osdata/boot +rm -f initramfs* vmlinuz* +echo "the kernel only" > vmlinuz-3.6.0 +bootcsum=$(cat vmlinuz-3.6.0 | sha256sum | cut -f 1 -d ' ') +mv vmlinuz-3.6.0 vmlinuz-3.6.0-${bootcsum} +cd - +${CMD_PREFIX} ostree --repo=${test_tmpdir}/testos-repo commit --tree=dir=osdata/ -b testos/buildmaster/x86_64-runtime +${CMD_PREFIX} ostree pull testos:testos/buildmaster/x86_64-runtime +${CMD_PREFIX} ostree admin deploy --os=testos --karg=root=/dev/sda2 --karg=rootwait testos:testos/buildmaster/x86_64-runtime +assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'rootwait' +assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'init=' +assert_not_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'initrd' + +echo "ok switching to bootdir with no initramfs" + +cd ${test_tmpdir}/osdata/boot +rm -f initramfs* vmlinuz* +echo "the kernel" > vmlinuz-3.6.0 +echo "initramfs to assist the kernel" > initramfs-3.6.0 +bootcsum=$(cat vmlinuz-3.6.0 initramfs-3.6.0 | sha256sum | cut -f 1 -d ' ') +mv vmlinuz-3.6.0 vmlinuz-3.6.0-${bootcsum} +mv initramfs-3.6.0 initramfs-3.6.0-${bootcsum} +cd - +${CMD_PREFIX} ostree --repo=${test_tmpdir}/testos-repo commit --tree=dir=osdata/ -b testos/buildmaster/x86_64-runtime +${CMD_PREFIX} ostree pull testos:testos/buildmaster/x86_64-runtime +${CMD_PREFIX} ostree admin deploy --os=testos --karg-none --karg=root=LABEL=rootfs testos:testos/buildmaster/x86_64-runtime +assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'initrd' +assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'root=LABEL=rootfs' +assert_not_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'rootwait' +assert_not_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'init=' + +echo "ok switching from no initramfs to initramfs enabled sysroot" +