Skip to content
Snippets Groups Projects
Commit 96e38aae authored by Gatis Paeglis's avatar Gatis Paeglis
Browse files

ostree: Update revison


- Dependency to libgsystem has been removed by the
  upstream project.
- Booting without initramfs does not require patching
  kernel anymore. Now ostree-prepare-root can be used
  as the init process to prepare rootfs for ostree.

For more info refer to the ostree's change log.

Change-Id: I7de61ffc2f9957055402f7733f16566e635a8e99
Reviewed-by: default avatarSamuli Piippo <samuli.piippo@qt.io>
parent 0f25d3ba
No related branches found
No related tags found
No related merge requests found
Showing
with 518 additions and 275 deletions
############################################################################
##
## Copyright (C) 2016 The Qt Company Ltd.
## Contact: https://www.qt.io/licensing/
##
## This file is part of the Boot to Qt meta layer.
##
## $QT_BEGIN_LICENSE:GPL$
## Commercial License Usage
## Licensees holding valid commercial Qt licenses may use this file in
## accordance with the commercial license agreement provided with the
## Software or, alternatively, in accordance with the terms contained in
## a written agreement between you and The Qt Company. For licensing terms
## and conditions see https://www.qt.io/terms-conditions. For further
## information use the contact form at https://www.qt.io/contact-us.
##
## GNU General Public License Usage
## Alternatively, this file may be used under the terms of the GNU
## General Public License version 3 or (at your option) any later version
## approved by the KDE Free Qt Foundation. The licenses are as published by
## the Free Software Foundation and appearing in the file LICENSE.GPL3
## included in the packaging of this file. Please review the following
## information to ensure the GNU General Public License requirements will
## be met: https://www.gnu.org/licenses/gpl-3.0.html.
##
## $QT_END_LICENSE$
##
############################################################################
SUMMARY = "LibGSystem is a GIO-based library, targeted primarily for use by operating system components."
LICENSE = "LGPL-2.1"
LIC_FILES_CHKSUM = "file://COPYING;md5=5f30f0716dfdd0d91eb439ebec522ec2"
inherit autotools pkgconfig
SRC_URI = "gitsm://github.com/GNOME/libgsystem.git;protocol=git"
SRCREV = "86c24c181ec6c3ec334a39145efc022c3e744929"
S = "${WORKDIR}/git"
DEPENDS = "glib-2.0 attr libcap"
do_configure_prepend() {
# Workaround a broken configure.ac. It should check first if GTK_DOC_CHECK
# macro is actually defined before trying to use it. For how-to see:
# https://developer.gnome.org/gtk-doc-manual/stable/settingup_autoconf.html.en
# We get a syntax error since we do not bundle gnome recipes that define this macro.
sed -i '/GTK_DOC_CHECK/d' ${S}/configure.ac
}
......@@ -35,19 +35,22 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=5f30f0716dfdd0d91eb439ebec522ec2"
inherit autotools pkgconfig systemd
SRC_URI = " \
git://github.com/GNOME/ostree.git \
file://Fix-enable_rofiles_fuse-no-build.patch \
git://github.com/ostreedev/ostree.git \
file://Mount-boot-partition.patch \
file://ostree-prepare-root-enabler-for-simpler-kernel-arg.patch \
file://deploy-add-karg-none-argument.patch \
file://Support-for-booting-without-initramfs.patch \
file://Allow-updating-files-in-the-boot-directory.patch \
file://u-boot-add-bootdir-to-the-generated-uEnv.txt.patch \
file://u-boot-Merge-ostree-s-and-systems-uEnv.txt.patch \
file://Create-firmware-convenience-symlinks.patch \
"
SRCREV = "v2016.5"
SRCREV = "77af6844d8330b31d58080076afb31e08974ce09"
S = "${WORKDIR}/git"
DEPENDS = "glib-2.0 e2fsprogs gpgme attr libsoup-2.4 libgsystem libassuan xz"
DEPENDS = "glib-2.0 e2fsprogs gpgme attr libsoup-2.4 libassuan xz"
# Bash is needed by the shipped dracut module. This dracut module is used to generate initramfs image.
# The production image do not require bash for proper working.
RDEPENDS_${PN} += "bash"
......@@ -68,6 +71,7 @@ EXTRA_OECONF = "--with-dracut \
--enable-gtk-doc-html=no \
--enable-man=no \
--with-soup \
--with-static-prepare-root \
--enable-libsoup-client-certs"
do_configure_prepend() {
......
From 7f4549c6e94494460be06311c3a4d23ae684ab21 Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@theqtcompany.com>
Date: Wed, 20 Apr 2016 13:58:27 +0200
Subject: [PATCH 1/3] Allow updating files in the /boot directory.
From cc31c80658a90cf1b13fdf9fe8b6dde1cc9a0d24 Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@qt.io>
Date: Mon, 22 Aug 2016 11:32:16 +0200
Subject: [PATCH 1/3] Allow updating files in the /boot directory
Until now OSTree copied only the vmlinuz and initramfs
binaries to the boot/ directory (which in some setups
might be on a separate partition). This patch adds
support for copying other files from the deployment's
/boot directory to the real /boot.
How this works:
Ignore subdirectories, only files in root of the boot
directory are copied. There is overhead of copying files
to boot/, therefore the amount of files in boot/ should
be kept to the minimum and subdirectories shouldn't
really be necessary.
Files in the boot/ directory are updated only with major
releases, when kernel/initramfs bootcsum changes. Files
that require frequent updates should not be stored here.
This patch adds support for copying (or hardlinking on
single partition systems) all files from the deployment's
/usr/lib/ostree-boot directory to the relevant
/boot/ostree/$os-$bootcsum/ directory. This feature can
be enabled by 'touch .ostree-bootcsumdir-source' in
/usr/lib/ostree-boot.
---
src/libostree/ostree-sysroot-deploy.c | 52 +++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
src/libostree/ostree-sysroot-deploy.c | 101 +++++++++++++++++++++++++++++++---
1 file changed, 94 insertions(+), 7 deletions(-)
diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c
index 8877236..8cf080e 100644
index a05ca30..f34e3f3 100644
--- a/src/libostree/ostree-sysroot-deploy.c
+++ b/src/libostree/ostree-sysroot-deploy.c
@@ -1295,6 +1295,7 @@ install_deployment_kernel (OstreeSysroot *sysroot,
@@ -165,12 +165,31 @@ dirfd_copy_attributes_and_xattrs (int src_parent_dfd,
}
static gboolean
+hardlink_or_copy_dir_recurse (int src_parent_dfd,
+ int dest_parent_dfd,
+ const char *name,
+ gboolean hardlink,
+ GCancellable *cancellable,
+ GError **error);
+
+static gboolean
copy_dir_recurse (int src_parent_dfd,
int dest_parent_dfd,
const char *name,
GCancellable *cancellable,
GError **error)
{
+ return hardlink_or_copy_dir_recurse (src_parent_dfd, dest_parent_dfd, name, FALSE, cancellable, error);
+}
+
+static gboolean
+hardlink_or_copy_dir_recurse (int src_parent_dfd,
+ int dest_parent_dfd,
+ const char *name,
+ gboolean hardlink,
+ GCancellable *cancellable,
+ GError **error)
+{
g_auto(GLnxDirFdIterator) src_dfd_iter = { 0, };
glnx_fd_close int dest_dfd = -1;
struct dirent *dent;
@@ -210,17 +229,27 @@ copy_dir_recurse (int src_parent_dfd,
if (S_ISDIR (child_stbuf.st_mode))
{
- if (!copy_dir_recurse (src_dfd_iter.fd, dest_dfd, dent->d_name,
- cancellable, error))
+ if (!hardlink_or_copy_dir_recurse (src_dfd_iter.fd, dest_dfd, dent->d_name,
+ hardlink, cancellable, error))
return FALSE;
}
else
{
- if (!glnx_file_copy_at (src_dfd_iter.fd, dent->d_name, &child_stbuf,
- dest_dfd, dent->d_name,
- GLNX_FILE_COPY_OVERWRITE,
- cancellable, error))
- return FALSE;
+ if (hardlink)
+ {
+ if (!hardlink_or_copy_at (src_dfd_iter.fd, dent->d_name,
+ dest_dfd, dent->d_name,
+ cancellable, error))
+ return FALSE;
+ }
+ else
+ {
+ if (!glnx_file_copy_at (src_dfd_iter.fd, dent->d_name, &child_stbuf,
+ dest_dfd, dent->d_name,
+ GLNX_FILE_COPY_OVERWRITE,
+ cancellable, error))
+ return FALSE;
+ }
}
}
@@ -1301,6 +1330,7 @@ install_deployment_kernel (OstreeSysroot *sysroot,
g_autofree char *version_key = NULL;
g_autofree char *ostree_kernel_arg = NULL;
g_autofree char *options_key = NULL;
......@@ -36,60 +92,66 @@ index 8877236..8cf080e 100644
GString *title_key;
__attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL;
const char *val;
@@ -1361,6 +1362,57 @@ install_deployment_kernel (OstreeSysroot *sysroot,
@@ -1367,6 +1397,63 @@ install_deployment_kernel (OstreeSysroot *sysroot,
}
}
+
+ /* Copy other files that are stored in deployment's /usr/lib/ostree-boot. Lets keep this simple:
+ *
+ * - Ignore subdirectories. Only files in root of the /usr/lib/ostree-boot directory are copied.
+ * There is an overhead of copying files to boot/, therefore the amount of files in a deployment's
+ * usr/lib/ostree-boot should be kept to the minimum and subdirectories shouldn't really
+ * be necessary.
+ *
+ * - Files in /boot are updated only with major releases, when kernel/initramfs
+ * bootcsum changes. Files that require frequent updates should not be stored here.
+ */
+ if (!glnx_dirfd_iterator_init_take_fd (dup (tree_boot_dfd), &dfd_iter, error))
+ goto out;
+
+ while (TRUE)
+ if (fstatat (tree_boot_dfd, ".ostree-bootcsumdir-source", &stbuf, 0) == 0)
+ {
+ struct dirent *dent;
+
+ if (!glnx_dirfd_iterator_next_dent (&dfd_iter, &dent, cancellable, error))
+ if (!glnx_dirfd_iterator_init_at (tree_boot_dfd, ".", FALSE, &dfd_iter, error))
+ goto out;
+
+ if (dent == NULL)
+ break;
+
+ if (fstatat (dfd_iter.fd, dent->d_name, &stbuf, 0) != 0)
+ while (TRUE)
+ {
+ if (errno == ENOENT)
+ continue;
+ glnx_set_error_from_errno (error);
+ goto out;
+ }
+ struct dirent *dent;
+
+ if (g_str_has_prefix (dent->d_name, "vmlinuz-") || g_str_has_prefix (dent->d_name, "initramfs-")
+ || !S_ISREG(stbuf.st_mode))
+ continue;
+ if (!glnx_dirfd_iterator_next_dent (&dfd_iter, &dent, cancellable, error))
+ goto out;
+ if (dent == NULL)
+ break;
+
+ if (fstatat (bootcsum_dfd, dent->d_name, &stbuf, 0) != 0)
+ {
+ if (errno != ENOENT)
+ /* Skip special files - vmlinuz-* and initramfs-* are handled separately */
+ if (g_str_has_prefix (dent->d_name, "vmlinuz-") || g_str_has_prefix (dent->d_name, "initramfs-"))
+ continue;
+
+ if (fstatat (bootcsum_dfd, dent->d_name, &stbuf, AT_SYMLINK_NOFOLLOW) != 0)
+ {
+ glnx_set_prefix_error_from_errno (error, "fstat %s", dent->d_name);
+ goto out;
+ if (errno != ENOENT)
+ {
+ glnx_set_prefix_error_from_errno (error, "fstatat %s", dent->d_name);
+ goto out;
+ }
+
+ if (fstatat (dfd_iter.fd, dent->d_name, &stbuf, AT_SYMLINK_NOFOLLOW) != 0)
+ {
+ glnx_set_error_from_errno (error);
+ goto out;
+ }
+
+ if (S_ISDIR (stbuf.st_mode))
+ {
+ if (!hardlink_or_copy_dir_recurse (tree_boot_dfd, bootcsum_dfd, dent->d_name,
+ TRUE, cancellable, error))
+ goto out;
+ }
+ else
+ {
+ if (!hardlink_or_copy_at (tree_boot_dfd, dent->d_name,
+ bootcsum_dfd, dent->d_name,
+ cancellable, error))
+ goto out;
+ }
+ }
+ if (!glnx_file_copy_at (tree_boot_dfd, dent->d_name, &stbuf,
+ bootcsum_dfd, dent->d_name, 0,
+ cancellable, error))
+ goto out;
+ }
+ }
+
+ else
+ {
+ if (errno != ENOENT)
+ {
+ glnx_set_prefix_error_from_errno (error, "fstatat %s", ".ostree-bootcsumdir-source");
+ goto out;
+ }
+ }
+
if (fstatat (deployment_dfd, "usr/lib/os-release", &stbuf, 0) != 0)
{
......
From 310ddd84dc353d93a2cc118725b459dba643cf0b Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@theqtcompany.com>
Date: Thu, 21 Apr 2016 16:54:05 +0200
Subject: [PATCH 3/3] Create firmware convenience symlinks.
From c4df63488b9e09a9aa69e32ea5c0671c9dc50c9d Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@qt.io>
Date: Wed, 24 Aug 2016 12:29:38 +0200
Subject: [PATCH] Create firmware convenience symlinks.
Later this could be moved into utils or a similar
location, if other boot loader backends will need
this functionality.
---
src/libostree/ostree-bootloader-uboot.c | 97 ++++++++++++++++++++++++++++++++-
1 file changed, 96 insertions(+), 1 deletion(-)
src/libostree/ostree-bootloader-uboot.c | 93 ++++++++++++++++++++++++++++++++-
1 file changed, 92 insertions(+), 1 deletion(-)
diff --git a/src/libostree/ostree-bootloader-uboot.c b/src/libostree/ostree-bootloader-uboot.c
index 9bcde9c..be5e8c5 100644
index 22251da..26a3127 100644
--- a/src/libostree/ostree-bootloader-uboot.c
+++ b/src/libostree/ostree-bootloader-uboot.c
@@ -66,6 +66,100 @@ _ostree_bootloader_uboot_get_name (OstreeBootloader *bootloader)
@@ -62,6 +62,97 @@ _ostree_bootloader_uboot_get_name (OstreeBootloader *bootloader)
return "U-Boot";
}
+/* It is common for firmware to search / on the boot partition for additional
+ * files that are required for booting. It can be difficult to change this search
+ * logic if it is hardcoded somewhere low in the stack or is in a read-only memory.
+ * This issue can be solved from the OS installer, by creating a symlink in the
+ * following way:
+ * This issue can be solved by system builders by creating a convenience symlink:
+ *
+ * cd sysroot/boot
+ * ln -s loader/second-stage-bootloader second-stage-bootloader
+ *
+ * This function will make sure that loader/second-stage-bootloader points to the
+ * correct target file version. This function does nothing if boot/ does not contain
+ * symlink files pointing into loader/.
+ * symlink files pointing into the loader/ directory.
+ */
+static gboolean
+create_firmware_convenience_symlinks (OstreeBootloaderUboot *self,
+create_firmware_convenience_symlinks (OstreeBootloaderUboot *self,
+ char *bootcsum_dir,
+ int bootversion,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ glnx_fd_close int loader_dfd = -1;
+ glnx_fd_close int boot_dfd = -1;
+ g_autofree char *loader_dir = NULL;
......@@ -46,18 +44,18 @@ index 9bcde9c..be5e8c5 100644
+
+ loader_dir = g_strdup_printf ("boot/loader.%d/", bootversion);
+ if (!glnx_opendirat (self->sysroot->sysroot_fd, loader_dir, FALSE, &loader_dfd, error))
+ goto out;
+ return FALSE;
+ if (!glnx_opendirat (self->sysroot->sysroot_fd, "boot", FALSE, &boot_dfd, error))
+ goto out;
+ return FALSE;
+ if (!glnx_dirfd_iterator_init_take_fd (dup (boot_dfd), &dfd_iter, error))
+ goto out;
+ return FALSE;
+
+ while (TRUE) {
+ struct dirent *dent;
+ struct stat stbuf;
+
+ if (!glnx_dirfd_iterator_next_dent (&dfd_iter, &dent, cancellable, error))
+ goto out;
+ return FALSE;
+ if (dent == NULL)
+ break;
+
......@@ -66,7 +64,7 @@ index 9bcde9c..be5e8c5 100644
+ if (errno == ENOENT)
+ continue;
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "fstatat");
+ goto out;
+ return FALSE;
+ }
+
+ if (S_ISLNK(stbuf.st_mode))
......@@ -87,44 +85,42 @@ index 9bcde9c..be5e8c5 100644
+ if (errno == ENOENT)
+ continue;
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "faccessat");
+ goto out;
+ return FALSE;
+ }
+
+ /* In case 'ostree admin cleanup' was not run after an interrupted deployment */
+ /* Cleanup from stray symlinks. This can happend when the previous deployment was
+ interrupted and no cleanup routines were run before restaring the deployment. */
+ if (unlinkat (loader_dfd, dent->d_name, 0) == -1 && errno != ENOENT)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "unlinkat");
+ goto out;
+ return FALSE;
+ }
+ /* Complete the link chain to the current boot file version */
+ /* Complete the link chain to the current boot file version. */
+ snprintf (path_buffer, sizeof(path_buffer), "..%s/%s", bootcsum_dir, dent->d_name);
+ if (symlinkat (path_buffer, loader_dfd, dent->d_name) == -1)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "symlinkat");
+ goto out;
+ return FALSE;
+ }
+ }
+ }
+ }
+
+ ret = TRUE;
+out:
+ return ret;
+ return TRUE;
+}
+
static gboolean
create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
int bootversion,
@@ -130,7 +224,8 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
@@ -138,7 +229,7 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
}
}
- ret = TRUE;
+ ret = create_firmware_convenience_symlinks (self, bootdir, bootversion, cancellable, error);
+
out:
return ret;
- return TRUE;
+ return create_firmware_convenience_symlinks (self, bootdir, bootversion, cancellable, error);
}
static gboolean
--
2.7.4
From b54643153cade28523cccee44fdddea2c94e0684 Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@theqtcompany.com>
Date: Mon, 25 Apr 2016 13:57:03 +0200
Subject: [PATCH] Fix --enable_rofiles_fuse=no build
---
Makefile.am | 2 ++
configure.ac | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am
index 488d4b6..e49b7c5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -71,7 +71,9 @@ include Makefile-otutil.am
include Makefile-libostree.am
include Makefile-ostree.am
include Makefile-switchroot.am
+if BUILDOPT_FUSE
include src/rofiles-fuse/Makefile-inc.am
+endif
include Makefile-tests.am
include Makefile-boot.am
include Makefile-man.am
diff --git a/configure.ac b/configure.ac
index dca9f53..6af60e8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -222,7 +222,7 @@ AC_ARG_ENABLE(rofiles-fuse,
[AS_HELP_STRING([--enable-rofiles-fuse],
[generate rofiles-fuse helper [default=yes]])],,
enable_rofiles_fuse=yes)
-AS_IF([ test $enable_rofiles_fuse != xno ], [
+AS_IF([ test x$enable_rofiles_fuse != xno ], [
PKG_CHECK_MODULES(BUILDOPT_FUSE, $FUSE_DEPENDENCY)
], [enable_rofiles_fuse=no])
AM_CONDITIONAL(BUILDOPT_FUSE, test x$enable_rofiles_fuse = xyes)
--
2.7.4
From a31c9083870fd934e242cc9cc56fdd39ad0a42cb Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@qt.io>
Date: Wed, 24 Aug 2016 12:00:14 +0200
Subject: [PATCH 3/4] Support for booting without initramfs
Previously when initramfs-* was not found in a deployment's
boot directory, it was assumed that rootfs is prepared for
ostree booting by a kernel patch.
With this patch, the behaviour changes to be - if initramfs-*
is not found, assume that system is using a static
ostree-prepare-root as init process. Booting without initramfs
is a common use case on embedded systems. This approach is
also more convenient, than having to patch the kernel.
---
Makefile-switchroot.am | 3 +++
configure.ac | 8 ++++++++
src/boot/grub2/ostree-grub-generator | 8 +++++---
src/libostree/ostree-sysroot-deploy.c | 18 +++++++++++++-----
4 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/Makefile-switchroot.am b/Makefile-switchroot.am
index ef837ce..70a6de7 100644
--- a/Makefile-switchroot.am
+++ b/Makefile-switchroot.am
@@ -29,6 +29,9 @@ libswitchroot_mountutil_la_SOURCES = \
ostree_prepare_root_SOURCES = src/switchroot/ostree-prepare-root.c
ostree_prepare_root_LDADD = libswitchroot-mountutil.la
ostree_prepare_root_CFLAGS = $(AM_CFLAGS) -Isrc/switchroot
+if BUILDOPT_STATIC_PREPARE_ROOT
+ostree_prepare_root_LDFLAGS = --static
+endif
ostree_remount_SOURCES = src/switchroot/ostree-remount.c
ostree_remount_LDADD = libswitchroot-mountutil.la
diff --git a/configure.ac b/configure.ac
index 4831bcc..97f3112 100644
--- a/configure.ac
+++ b/configure.ac
@@ -294,6 +294,13 @@ AS_IF([test x$with_grub2_mkconfig_path = x], [
],[GRUB2_MKCONFIG=$with_grub2_mkconfig_path])
AC_DEFINE_UNQUOTED([GRUB2_MKCONFIG_PATH], ["$GRUB2_MKCONFIG"], [The system grub2-mkconfig executible name])
+AC_ARG_WITH(static-prepare-root,
+ AS_HELP_STRING([--with-static-prepare-root],
+ [Build static version of the 'ostree-prepare-root' binary. Useful when
+ using 'ostree-prepare-root' as the init (PID 1) process. (default: no)]),,
+ [with_static_prepare_root=no])
+AM_CONDITIONAL(BUILDOPT_STATIC_PREPARE_ROOT, test x$with_static_prepare_root = xyes)
+
dnl for tests
AS_IF([test "x$found_introspection" = xyes], [
AC_PATH_PROG(GJS, [gjs])
@@ -327,6 +334,7 @@ echo "
libarchive (parse tar files directly): $with_libarchive
static deltas: yes (always enabled now)
O_TMPFILE: $enable_otmpfile
+ static ostree-prepare-root $with_static_prepare_root
man pages (xsltproc): $enable_man
api docs (gtk-doc): $enable_gtk_doc
gjs-based tests: $have_gjs
diff --git a/src/boot/grub2/ostree-grub-generator b/src/boot/grub2/ostree-grub-generator
index 5673b26..ceca806 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=""
@@ -62,11 +62,13 @@ read_config()
populate_menu()
{
boot_prefix="${OSTREE_BOOT_PARTITION}"
- 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 a05ca30..c0a0347 100644
--- a/src/libostree/ostree-sysroot-deploy.c
+++ b/src/libostree/ostree-sysroot-deploy.c
@@ -1458,20 +1458,28 @@ install_deployment_kernel (OstreeSysroot *sysroot,
ostree_bootconfig_parser_set (bootconfig, "linux", boot_relpath);
}
+ val = ostree_bootconfig_parser_get (bootconfig, "options");
+ kargs = _ostree_kernel_args_from_string (val);
+
if (dest_initramfs_name)
{
g_autofree char * boot_relpath = g_strconcat ("/", bootcsumdir, "/", dest_initramfs_name, 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));
+ }
ostree_kernel_arg = g_strdup_printf ("ostree=/ostree/boot.%d/%s/%s/%d",
new_bootversion, osname, bootcsum,
ostree_deployment_get_bootserial (deployment));
- 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));
+
options_key = _ostree_kernel_args_to_string (kargs);
ostree_bootconfig_parser_set (bootconfig, "options", options_key);
--
2.7.4
From 9ca3a2cc64bc709649d0d756fa715aaef807dca8 Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@qt.io>
Date: Fri, 12 Aug 2016 11:51:04 +0200
Subject: [PATCH 2/4] deploy: add --karg-none argument
If the current deployment has "rootwait root=/dev/sda2",
but the new deployment does not need "rootwait" anymore,
there is no way to clear this arg at the moment (as opposed
to "karg=root=", which overrides any earlier argument with
the same name). With "--karg-none" users can now clear all
the previous args and set new "root=":
ostree admin deploy --karg-none --karg=root=LABEL=rootfs
---
src/ostree/ot-admin-builtin-deploy.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/ostree/ot-admin-builtin-deploy.c b/src/ostree/ot-admin-builtin-deploy.c
index c66c9b3..420efa3 100644
--- a/src/ostree/ot-admin-builtin-deploy.c
+++ b/src/ostree/ot-admin-builtin-deploy.c
@@ -38,6 +38,7 @@ static char **opt_kernel_argv_append;
static gboolean opt_kernel_proc_cmdline;
static char *opt_osname;
static char *opt_origin_path;
+static gboolean opt_kernel_arg_none;
static GOptionEntry options[] = {
{ "os", 0, 0, G_OPTION_ARG_STRING, &opt_osname, "Use a different operating system root than the current one", "OSNAME" },
@@ -46,6 +47,7 @@ static GOptionEntry options[] = {
{ "karg-proc-cmdline", 0, 0, G_OPTION_ARG_NONE, &opt_kernel_proc_cmdline, "Import current /proc/cmdline", NULL },
{ "karg", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_kernel_argv, "Set kernel argument, like root=/dev/sda1; this overrides any earlier argument with the same name", "NAME=VALUE" },
{ "karg-append", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_kernel_argv_append, "Append kernel argument; useful with e.g. console= that can be used multiple times", "NAME=VALUE" },
+ { "karg-none", 0, 0, G_OPTION_ARG_NONE, &opt_kernel_arg_none, "Do not import kernel arguments", NULL },
{ NULL }
};
@@ -77,6 +79,12 @@ ot_admin_builtin_deploy (int argc, char **argv, GCancellable *cancellable, GErro
goto out;
}
+ if (opt_kernel_proc_cmdline && opt_kernel_arg_none)
+ {
+ ot_util_usage_error (context, "Can't specify both --karg-proc-cmdline and --karg-none", error);
+ goto out;
+ }
+
refspec = argv[1];
if (!ostree_sysroot_load (sysroot, cancellable, error))
@@ -135,7 +143,7 @@ ot_admin_builtin_deploy (int argc, char **argv, GCancellable *cancellable, GErro
if (!_ostree_kernel_args_append_proc_cmdline (kargs, cancellable, error))
goto out;
}
- else if (merge_deployment)
+ else if (merge_deployment && !opt_kernel_arg_none)
{
OstreeBootconfigParser *bootconfig = ostree_deployment_get_bootconfig (merge_deployment);
g_auto(GStrv) previous_args = g_strsplit (ostree_bootconfig_parser_get (bootconfig, "options"), " ", -1);
--
2.7.4
From d183819e6e7bdc7a9476542cbef384285f592f3f Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@qt.io>
Date: Fri, 12 Aug 2016 08:50:29 +0200
Subject: [PATCH 1/4] ostree-prepare-root: enabler for simpler kernel arg
With the current approach, when ostree-prepare-root is used
on the kernel command line as init=, it always assumes that
the next value in the argument list is a path to the sysroot.
The code for falling back to a default path (if none is provided),
would only work if init= is the last arg in the argument list.
We can not rely on that and have to explicitly provide the
path to the sysroot. Which defeats the purpose of a default
path selection code.
To keep command line neater assume that sysroot is on / when
using ostree-prepare-root as init. This probably is what most
people want anyways. Also _ostree_kernel_args* API assumes
that args are space separated list. Which is problematic for:
"init=${ostree}/usr/lib/ostree/ostree-prepare-root /" as it
gets split in two.
---
src/switchroot/ostree-prepare-root.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/switchroot/ostree-prepare-root.c b/src/switchroot/ostree-prepare-root.c
index 895b2e5..449fc33 100644
--- a/src/switchroot/ostree-prepare-root.c
+++ b/src/switchroot/ostree-prepare-root.c
@@ -199,10 +199,19 @@ main(int argc, char *argv[])
char srcpath[PATH_MAX];
struct stat stbuf;
- if (argc < 2)
- root_mountpoint = "/";
+ if (getpid() == 1)
+ {
+ root_mountpoint = "/";
+ }
else
- root_mountpoint = argv[1];
+ {
+ if (argc < 2)
+ {
+ fprintf (stderr, "usage: ostree-prepare-root SYSROOT\n");
+ exit (EXIT_FAILURE);
+ }
+ root_mountpoint = argv[1];
+ }
root_mountpoint = realpath (root_mountpoint, NULL);
deploy_path = resolve_deploy_path (root_mountpoint);
--
2.7.4
From 86184e5a266b087ba222b03141b491241e27e284 Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@theqtcompany.com>
Date: Thu, 21 Apr 2016 14:28:38 +0200
Subject: [PATCH 2/3] u-boot: Merge ostree's and systems uEnv.txt
From 4d8648d35ba7fe60f428aab2240aa6044fb51c50 Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@qt.io>
Date: Tue, 23 Aug 2016 14:32:35 +0200
Subject: [PATCH 1/2] u-boot: Merge ostree's and systems uEnv.txt
This allow for simpler u-boot scripts and is a proper
fix for: https://bugzilla.gnome.org/show_bug.cgi?id=755787
This is a proper fix for:
https://bugzilla.gnome.org/show_bug.cgi?id=755787
With this patch admin can now:
With this patch, an admin (system builder) can now:
1) Edit /usr/lib/ostree-boot/uEnv.txt
2) Deploy the new tree. OSTree will append system's uEnv.txt
to the OSTree's managed uEnv.txt (loader/uEnv.txt).
2) Download the update to a target. And during the deploy
process OSTree will prepend its env (loader/uEnv.txt)
to the system's uEnv.txt
It is common for u-boot systems to read in an extra env
from external /uEnv.txt. The same file OSTree uses to pass
in its env. With this patch /uEnv.txt now contains OSTree's
env + custom env added by system builders.
---
src/libostree/ostree-bootloader-uboot.c | 41 ++++++++++++++++++++++++++++++---
1 file changed, 38 insertions(+), 3 deletions(-)
src/libostree/ostree-bootloader-uboot.c | 40 ++++++++++++++++++++++++++++++++-
1 file changed, 39 insertions(+), 1 deletion(-)
diff --git a/src/libostree/ostree-bootloader-uboot.c b/src/libostree/ostree-bootloader-uboot.c
index f67e9bd..9bcde9c 100644
index f95ea84..5172477 100644
--- a/src/libostree/ostree-bootloader-uboot.c
+++ b/src/libostree/ostree-bootloader-uboot.c
@@ -29,6 +29,10 @@
#include "otutil.h"
@@ -95,7 +95,45 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
struct _OstreeBootloaderUboot
{
@@ -69,13 +73,17 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
GCancellable *cancellable,
GError **error)
{
+ gboolean ret = FALSE;
g_autoptr(GPtrArray) boot_loader_configs = NULL;
OstreeBootconfigParser *config;
const char *val;
+ g_autofree char *bootdir = NULL;
+ g_autoptr(GFile) uenv_file = NULL;
+ char uenv_path[PATH_MAX];
if (!_ostree_sysroot_read_boot_loader_configs (self->sysroot, bootversion, &boot_loader_configs,
cancellable, error))
- return FALSE;
+ goto out;
/* U-Boot doesn't support a menu so just pick the first one since the list is ordered */
config = boot_loader_configs->pdata[0];
@@ -85,10 +93,13 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"No \"linux\" key in bootloader config");
- return FALSE;
+ goto out;
}
g_ptr_array_add (new_lines, g_strdup_printf ("kernel_image=%s", val));
+ bootdir = strndup (val, strrchr(val, '/') - val);
+ g_ptr_array_add (new_lines, g_strdup_printf ("bootdir=%s/", bootdir));
+
val = ostree_bootconfig_parser_get (config, "initrd");
if (val)
g_ptr_array_add (new_lines, g_strdup_printf ("ramdisk_image=%s", val));
@@ -97,7 +108,31 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
val = ostree_bootconfig_parser_get (config, "options");
if (val)
g_ptr_array_add (new_lines, g_strdup_printf ("bootargs=%s", val));
- return TRUE;
+ /* Append user's uEnv.txt if it exists */
+ snprintf (uenv_path, sizeof(uenv_path), "boot/%s/uEnv.txt", bootdir);
+ uenv_file = g_file_get_child (self->sysroot->path, uenv_path);
+ if (g_file_query_exists (uenv_file, cancellable))
- g_ptr_array_add (new_lines, g_strdup_printf ("bootargs=%s", val));
+ {
+ g_autoptr(GInputStream) instream = NULL;
+ g_autoptr(GDataInputStream) datastream = NULL;
+ gsize len;
+ instream = (GInputStream*)g_file_read (uenv_file, cancellable, error);
+ if (!instream)
+ goto out;
+ glnx_fd_close int uenv_fd = -1;
+ g_autofree char* kargs = g_strdup (val);
+ const char *uenv_path = NULL;
+ const char *ostree_arg = NULL;
+
+ datastream = g_data_input_stream_new (instream);
+ while (TRUE)
+ g_ptr_array_add (new_lines, g_strdup_printf ("bootargs=%s", val));
+
+ /* Append system's uEnv.txt, if it exists in $deployment/usr/lib/ostree-boot/ */
+ ostree_arg = strtok (kargs, " ");
+ while (ostree_arg != NULL && !g_str_has_prefix (ostree_arg, "ostree="))
+ ostree_arg = strtok (NULL, " ");
+ if (!ostree_arg)
+ {
+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "No ostree= kernel argument found in boot loader configuration file");
+ return FALSE;
+ }
+ uenv_path = glnx_strjoina (ostree_arg + strlen ("ostree=/"), "/usr/lib/ostree-boot/uEnv.txt");
+ uenv_fd = openat (self->sysroot->sysroot_fd, uenv_path, O_CLOEXEC | O_RDONLY);
+ if (uenv_fd != -1)
+ {
+ char *uenv = glnx_fd_readall_utf8 (uenv_fd, NULL, cancellable, error);
+ if (!uenv)
+ {
+ glnx_set_prefix_error_from_errno (error, "%s", uenv_path);
+ return FALSE;
+ }
+ g_ptr_array_add (new_lines, uenv);
+ }
+ else
+ {
+ val = g_data_input_stream_read_line (datastream, &len, cancellable, error);
+ if (!val)
+ break;
+ g_ptr_array_add (new_lines, (char *)val);
+ if (errno != ENOENT)
+ {
+ glnx_set_prefix_error_from_errno (error, "%s", uenv_path);
+ return FALSE;
+ }
+ }
+ }
+
+ ret = TRUE;
+out:
+ return ret;
}
static gboolean
return TRUE;
}
--
2.7.4
From 8323c038733522f7f31fefc8921b7c1760416638 Mon Sep 17 00:00:00 2001
From: Gatis Paeglis <gatis.paeglis@qt.io>
Date: Mon, 22 Aug 2016 15:52:21 +0200
Subject: [PATCH 3/3] u-boot: add 'bootdir' to the generated uEnv.txt
When doing a full copy of:
$deployment/usr/lib/ostree-boot -> /boot/ostree/$os-$bootcsum/
U-Boot bootscript can use the 'bootdir' to find, for example,
the Device Tree (dtb) file, as in:
load ${dtype} ${disk}:${bootpart} ${a_fdt} ${bootdir}${dtbname}
Or u-boot external bootscript:
load ${dtype} ${disk}:${bootpart} ${a_scr} ${bootdir}${scriptname}
It could also be possible to point 'bootdir' directly to the
$deployment/usr/lib/ostree-boot, but this would add unnecessary
restrictions on what file system can be used for rootfs as u-boot,
for example, can not read from BTRFS. So having
bootdir=/boot/ostree/$os-$bootcsum/ is a better approach here, as
/boot can be on a separate partition with its own file system type.
---
src/libostree/ostree-bootloader-uboot.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/libostree/ostree-bootloader-uboot.c b/src/libostree/ostree-bootloader-uboot.c
index f95ea84..0786626 100644
--- a/src/libostree/ostree-bootloader-uboot.c
+++ b/src/libostree/ostree-bootloader-uboot.c
@@ -72,6 +72,7 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
g_autoptr(GPtrArray) boot_loader_configs = NULL;
OstreeBootconfigParser *config;
const char *val;
+ g_autofree char *bootdir = NULL;
if (!_ostree_sysroot_read_boot_loader_configs (self->sysroot, bootversion, &boot_loader_configs,
cancellable, error))
@@ -88,6 +89,8 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
return FALSE;
}
g_ptr_array_add (new_lines, g_strdup_printf ("kernel_image=%s", val));
+ bootdir = strndup (val, strrchr(val, '/') - val);
+ g_ptr_array_add (new_lines, g_strdup_printf ("bootdir=%s/", bootdir));
val = ostree_bootconfig_parser_get (config, "initrd");
if (val)
--
2.7.4
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment