Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support transient /etc #3062

Merged
merged 1 commit into from
Oct 12, 2023
Merged

Support transient /etc #3062

merged 1 commit into from
Oct 12, 2023

Conversation

alexlarsson
Copy link
Member

This is a new version of #2972
There was a lot of complexities, so this is essentially a clean restart. So, rather than reusing that PR I created a new one.

This PR does multiple things:

  • Adds a etc.transient=true option to prepare-root.conf, which causes /etc to be and overlayfs mount with a tmpfs-based upper.
  • Relabels /usr/etc as if it was /etc in the generated composefs image, allowing the use of usr/etc as the lower for the above /etc overlayfs mount.
  • Since we're changing the composefs image format anyway (due to the relabeling), we're copying the mkcomposefs change that inlines files at 64 bytes or smaller to avoid overhead.

The actual transient etc overlay mount details are quite complex due to selinux interactions between tmpfs, selinux policy loading, and overlayfs. See #2972 (comment) for some details. In the end, after a discussion with @rhatdan I ended up with a new ostree selinux module that will be needed for transient mode to work.

@github-actions github-actions bot added the area/prepare-root Issue relates to ostree-prepare-root label Oct 2, 2023
@alexlarsson alexlarsson force-pushed the transient-etc branch 2 times, most recently from a0d9b81 to 1841d0b Compare October 2, 2023 13:35
@cgwalters
Copy link
Member

Sorry I meant to comment earlier but IMO the best fix here is not to relabel /etc on boot, but to change rpm-ostree to label /usr/etc as if it was /etc and just use that.

@alexlarsson
Copy link
Member Author

@cgwalters Sure. That approach works too, although only with ostree commits built with a new rpm-ostree.

@alexlarsson
Copy link
Member Author

@cgwalters And btw, we're not relabeing /etc on boot for this reason. We relabel /usr/etc during deploy, when we generate the composefs image. The on-boot stuff (the part in ostree-remount) is to fix up the labels for things that changed in upperdir during the initramfs.

@cgwalters
Copy link
Member

Hmm; changing the labels just in the composefs flow is making it asymmetric with the legacy case though. I'm not strictly opposed to that but...it seems better to support setting up the labels in this way in both cases so we can test it more uniformly.

@alexlarsson
Copy link
Member Author

alexlarsson commented Oct 2, 2023

@cgwalters Just so we're on the same page. Is this what you mean:

With this PR, this is how transient-etc works:

  • rpm-ostree labels usr/etc "wrong"
  • If not composefs:
    • ostree deploy relabels the $deploydir/etc
    • This is then 3-way merged with previous /etc during update
    • /etc is an overlayfs with lower=$deploydir/etc
  • else:
    • ostree deploy relabels usr/etc in the composefs image
    • /etc is an overlayfs with lower=$cfsmount/usr/etc

And your proposal is:

  • rpm-ostree labels usr/etc as /etc
  • We don't care about $deploydir/etc
  • if not composefs
    • /etc is an overlayfs with lower=$deploydir/usr/etc
  • else:
    • /etc is an overlayfs with lower=$cfsmount/usr/etc

That makes a lot of sense to me.

@alexlarsson
Copy link
Member Author

In that case, we also don't need to change the composefs format, so lemme separate out the inline-small-files from this PR

@alexlarsson
Copy link
Member Author

I'll have a look at the rpm-ostree side, then we can just drop the first two commits in this PR. I want to test the current code against the autosd images though, to ensure it works there. So far I've only tried against fcos.

@cgwalters
Copy link
Member

I started looking at rpm-ostree but I think it's actually mainly on this side, started to test out

diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c
index c269142e..2292bec8 100644
--- a/src/libostree/ostree-repo-commit.c
+++ b/src/libostree/ostree-repo-commit.c
@@ -3272,8 +3272,12 @@ get_final_xattrs (OstreeRepo *self, OstreeRepoCommitModifier *modifier, const ch
   if (modifier && modifier->sepolicy)
     {
       g_autofree char *label = NULL;
+      const char *path_for_labeling = relpath;
 
-      if (!ostree_sepolicy_get_label (modifier->sepolicy, relpath,
+      if ((modifier->flags & OSTREE_REPO_COMMIT_MODIFIER_FLAGS_USRETC_AS_ETC) > 0 && g_str_has_prefix (relpath, "/usr/etc"))
+        path_for_labeling += strlen ("/usr");
+
+      if (!ostree_sepolicy_get_label (modifier->sepolicy, path_for_labeling,
                                       g_file_info_get_attribute_uint32 (file_info, "unix::mode"),
                                       &label, cancellable, error))
         return FALSE;
diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h
index 2dea9092..235b5bef 100644
--- a/src/libostree/ostree-repo.h
+++ b/src/libostree/ostree-repo.h
@@ -517,6 +517,8 @@ typedef OstreeRepoCommitFilterResult (*OstreeRepoCommitFilter) (OstreeRepo *repo
  * 2017.13
  * @OSTREE_REPO_COMMIT_MODIFIER_FLAGS_DEVINO_CANONICAL: If a devino cache hit is found, skip
  * modifier filters (non-directories only); Since: 2017.14
+ * @OSTREE_REPO_COMMIT_MODIFIER_FLAGS_USRETC_AS_ETC: For SELinux and other systems, label /usr/etc as if it was /etc.
+ * modifier filters (non-directories only); Since: 2023.7
  *
  * Flags modifying commit behavior. In bare-user-only mode,
  * @OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CANONICAL_PERMISSIONS and
@@ -532,6 +534,7 @@ typedef enum
   OSTREE_REPO_COMMIT_MODIFIER_FLAGS_ERROR_ON_UNLABELED = (1 << 3),
   OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CONSUME = (1 << 4),
   OSTREE_REPO_COMMIT_MODIFIER_FLAGS_DEVINO_CANONICAL = (1 << 5),
+  OSTREE_REPO_COMMIT_MODIFIER_FLAGS_USRETC_AS_ETC = (1 << 6),
 } OstreeRepoCommitModifierFlags;
 
 /**

@alexlarsson
Copy link
Member Author

New version following this approach. To test it I just commented out the flag check, and it seems to work well. Hoever, the real fix is to make rpm-ostree pass this flag. Do we always pass it?


if (transient_etc)
{
/* Systemd will create a /run/machine-id -> /etc/machine-id bind mount if /etc is
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Historically ostree-remount.service has just been a big source of race conditions.

In general the direction has been to ensure that the target / is set up fully in the initramfs.

In particular the historical rationale for ostree-remount.service was compatibility with the legacy behavior of remounting / as writable only in the real root early boot.

If that's done in the initramfs, there is no reason to run ostree-remount.service. And I think we should aim to do that uniformly - and actually disable ostree-remount.service by default.

I'd need to dig in here into what point the /etc/machine-id is being dealt with in systemd, but it really seems to me like the relevant code here should be run in the initramfs.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If that's done in the initramfs, there is no reason to run ostree-remount.service.

Ah wait, there is one load bearing thing left that it's doing, which is to reset the propagation mode of /sysroot.

Blah...I wonder if we can work with systemd upstream to add some way to opt out of that for particular mounts.

Alternatively...I could imagine actually hiding the /sysroot mount in a separate mount namespace entirely, held open by some process that we keep running from the initramfs.

That would be much stronger isolation, but it'd mean every tool that wants to operate on that state would need to nsenter -m -t $(pidof ostree-mountns-holder).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is impossible to do this relabeling in the initrd, becase at that point the selinux policy is not loaded.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And, for reasons described in #2972 (comment) it isn't even possible to manually fake the relabeling in the initrd. It has to be done after the policy is loaded.

Comment on lines 17 to 20
# To fix this we make the kernel context unconfined. It essentially is anyway, as
# the kernel is the entity that validates the permissions anyway.

unconfined_domain(kernel_t)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK I think we need to debate this. I hope you'd agree with me that logically this change isn't really related to ostree.

I think if we're going to do this it should probably be just changed in the base SELinux policy package.

Isn't this effectively undoing some effort to confine kernel_t actually? IIRC there was some...something for constraining usermode helpers that could be executed, etc.

I haven't dug in deep to this but could we do something like add an overlayfs option that disables LSM checks for it? And then when we switch to the real root and selinux policy is loaded, we remount it, setting the mounter credentials to unconfined_t and re-enabling LSM checks.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a lot of work, which I don't find that useful, we can hack around this, but the kernel is enforcing the rules, and confining it just makes for hacks to get around it while adding no real security benefit.
@wrabcak @zpytela WDYT?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alternatively, I could imagine building something like initramfs_t into the kernel itself, and use it for things we run from the initramfs.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also not a fan of this approach, or having it live here.

What kind of SELinux denials are you getting BTW? There was a related BZ to this a while back: https://bugzilla.redhat.com/show_bug.cgi?id=2154428.

At that time, it was the overlay created by ostree admin hotfix causing issues (so on /usr, not /etc), but it lead to fedora-selinux/selinux-policy#1574 which greatly loosened what kernel_t can do. I'm assuming you're running your tests with that patch there? If so, it might just need to tweaked a bit further.

Alternatively, I could imagine building something like initramfs_t into the kernel itself, and use it for things we run from the initramfs.

I like it. That's a similar (but better) idea to what I mentioned in https://bugzilla.redhat.com/show_bug.cgi?id=2154428#c19 to be able to differentiate between pre and post-pivot.

Also /cc @WOnder93

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The issues are that initramfs launches processes before the policy is loaded. When systemd loads the policy any process launched prior to systemd is going to be labeled kernel_t, if those processes do anything that is not currently defined, then they blow up. It becomes a big mess.

Since these processes exists before systemd load_policy, they can only be labeled kernel_t not initramfs_t.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you want to do something like
setexeccon(unconfined_t) before mounting
This is only possible after the policy is loaded.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unconfined_t does not exists before policy is loaded, kernel_t also does not exists before policy is loaded.

When policy is loaded, the kernel is told that all procesess identifiers that existed before the policy load are labeled as kernel_t.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unconfined_domain(kernel_t) == ("kernel_t = unconfined_t - execute_no_trans")

No, it is not, because of files_unconfined_type and filesystem_unconfined_type.

Well not quite, but I don't think it is an issue.
allow unconfined_domain_type container_domain:process { dyntransition transition };
allow unconfined_domain_type container_runtime_t:process transition;
allow unconfined_domain_type qm_container_domain:process { dyntransition transition };

How is that relevant? Once you allow read + execute + execute_no_trans on all files, then SELinux won't prevent an attacker exploiting the modprobe path vulnerability from running a binary they control (most likely labeled user_tmp_t or user_home_t). When you eliminate execute_no_trans from kernel_t, then the upper bound of what file types it can execute is those that it has a type_transition defined for, which is easy to check and control. And it is best to avoid execute_no_trans even for selected file types, as you would get userspace processes running as root (always - systemd hardening features can't be used here) + kernel_t, which is risky even for binaries considered "safe" (system binaries). Plus the task being labeled kernel_t would be confusing as it's no longer running in kernel space.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@WOnder93 So, in practical terms, how would one go about creating rules for this?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One thing that's somewhat tangentially related to this is I think usermode helper execution is a bit better constrained via other LSMs, like e.g. LoadPin etc...that's something we can more strongly push for in an image-based world.

@cgwalters
Copy link
Member

Hoever, the real fix is to make rpm-ostree pass this flag. Do we always pass it?

See coreos/rpm-ostree#4640

@cgwalters cgwalters marked this pull request as draft October 2, 2023 17:38
@cgwalters cgwalters mentioned this pull request Oct 2, 2023
@zpytela
Copy link

zpytela commented Oct 3, 2023

Can we also get list of services started from initramfs which need to persist switchroot?

@rhatdan
Copy link
Contributor

rhatdan commented Oct 3, 2023

This is not really a persistent process issue, it is more of what Colin said. If I am running in initramfs and I mount an overlay, from the kernel's point of view kernel_t mounted the file system. When a user tries to read/or write content in the overlay, the way the kernel works is it checks whether the "mounter" (kernel_t) is able to read/execute the file that the process in userspace is attempting to use. The AVC's are things like kernel_t trying to read /etc/foobar, and getting an AVC. We could write a policy that says the kernel_t can read/execute all file_types to fix this issue, but I think this ends up being a slippery path. Eventually we end up with an AVC saying the kernel is not allowed to do something, and user say WTH?

@rhatdan
Copy link
Contributor

rhatdan commented Oct 3, 2023

I don't thing the solution to this is to change the kernel. to tell overlay to work differently from a security point of view. But to simply fix the SELinux policy to give broader permissions to kernel_t. We can work more closely on fixing the issues with init_t, if necessary.

@alexlarsson
Copy link
Member Author

Yeah, I think my example from a comment above is a simple way to understand it.

I log in as root, so I am unconfined_t, then i run mkdir /etc/foo, and since the label on /etc is etc_t the mkdir syscall entry is allowed and the makedir code proceeds.

However, then somewhere deep inside overlayfs it creates the backing directory in the upperdir (which is also etc_t). This is done in the context of the mounter (kernel_t), and kernel_t is not allowed to create a directory in etc_t, so it fails:

avc: denied { create } for pid=2101 comm="mkdir" name="foo" scontext=system_u:system_r:kernel_t:s0 tcontext=unconfined_u:object_r:etc_t:s0 tclass=dir permissive=1

Now, I'm supposedly unconfined, so I should be able to do anything. However, for that to work, the overlayfs mount must also be unconfined. Anything more limited means that there are things unconfined_t cannot do in /etc.

@rhatdan
Copy link
Contributor

rhatdan commented Oct 4, 2023

I don't think
avc: denied { create } for pid=2101 comm="mkdir" name="foo" scontext=system_u:system_r:kernel_t:s0 tcontext=unconfined_u:object_r:etc_t:s0 tclass=dir permissive=1

Is coming from the overlay, if it is, then I don't understand. The mounter as I understand it should only be requesting read/execute permissions on types, and the creation should be done by the unconfined_t process, since it should be created in the upper directory.

@cgwalters
Copy link
Member

Is coming from the overlay, if it is, then I don't understand. The mounter as I understand it should only be requesting read/execute permissions on types, and the creation should be done by the unconfined_t process, since it should be created in the upper directory.

See https://docs.kernel.org/filesystems/overlayfs.html#permission-model

I saw at one point the maintainer of overlayfs once described it as a "just in time cp -a". Hence, the mounter credentials are captured and checked for each access in addition to the calling task.

So what we're hitting is this:

task creating the overlay mount MUST NOT gain additional privileges

@WOnder93
Copy link
Contributor

WOnder93 commented Oct 5, 2023

avc: denied { create } for pid=2101 comm="mkdir" name="foo" scontext=system_u:system_r:kernel_t:s0 tcontext=unconfined_u:object_r:etc_t:s0 tclass=dir permissive=1

@alexlarsson This AVC is sus, because it should be allowed since commit fedora-selinux/selinux-policy@f5438002d7... What was the selinux-policy RPM version on the system where you got this? In fact, I think that commit should fully suffice for the early boot overlayfs mounts to work.

@alexlarsson
Copy link
Member Author

So, I looked into what it would mean to have kernel_t be a fully unconfined domain, and it seems way too much. Like its got the ability to talk to systemd and all sorts of stuff. Instead I tried to make the minimal policy that I got to boot the system, and let me create some files in /etc as unconfined_t root.

This is what I came up with:

allow kernel_t file_type:dir_file_class_set { read write append map open create link unlink rename getattr setattr relabelfrom relabelto };
allow kernel_t file_type:dir { add_name remove_name reparent rmdir search };

domain_role_change_exemption(kernel_t)
domain_obj_id_change_exemption(kernel_t)

(Also in the latest commit here)

Basically, this allows all the file operations that I see overlayfs doing while it is in a section between ovl_override_creds() and revert_creds(). I also had to add the excemptions, because the mount ends up running as system_u:system_r:kernel_t and /etc files may not have those roles or object ids.

This seems a lot safer to me...

@WOnder93
Copy link
Contributor

WOnder93 commented Oct 5, 2023

@alexlarsson Please see my previous comment. This is all already in the policy since at least February... (except the domain_role_change_exemption(), but that one is not needed here, because files can only have object_r as the role).

@cgwalters
Copy link
Member

Can we also get list of services started from initramfs which need to persist switchroot?

@zpytela I'm pretty sure there are zero userspace processes which persist today; it's possible we'd add something in the future but I'd like to avoid it. (And if we do we can probably have it save its own state and re-exec after policy load or so?)

The "thing that persists from the initramfs" here is the overlayfs credentials cached in the kernel.

@alexlarsson
Copy link
Member Author

Unmarked this as draft, as the selinux part now works out of the box (although needs selinux policy master for now). It should however work as is with older selinux-policy that have a fully unconfined kernel_t including, i believe, rhel9.

@alexlarsson
Copy link
Member Author

I don't undestand the "Adding composefs metadata: composefs is not supported in this ostree build" CI failures. These checks passed before, did we end up with an older ostree version in the CI?

@cgwalters
Copy link
Member

See #3067

@zpytela
Copy link

zpytela commented Oct 10, 2023

FYI the selinux-policy rawhide build is now available at https://bodhi.fedoraproject.org/updates/FEDORA-2023-5be6d65113

@alexlarsson
Copy link
Member Author

After rebase it passed CI, @cgwalters can you review it now?

@cgwalters
Copy link
Member

I just merged #3063 - this will need to drop the other patch for it now.

src/switchroot/ostree-remount.c Show resolved Hide resolved
src/switchroot/ostree-remount.c Show resolved Hide resolved
* are set before selinux policy is loaded.
*/
static void
relabel_dir_for_upper (const char *upper_path, const char *real_path, gboolean is_dir)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need this though if we land coreos/rpm-ostree#4640 and use it?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. The problem is not the labels on the lowerdir, those are fixed by that commit. The problem is the labels in upperdir and in the overlayfs itself (i.e. in-memory overlayfs inodes cache the selinux label from the upper).

Basically, in the initramfs all the files created in the tmpfs upper will get their xattrs reset at selinux policy load. So, what we do is to look at upperdir (in tmpfs), and for any file that exists there (and there should be few, only for files created in initramfs), we relabel the corresponding overlayfs file via /etc. This will set the correct selinux label both on the in-memory overlayfs inode, and the backing upperdir file.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: We still need that commit tho.

If the `prepare-root.conf` file contains:
```
[etc]
transient=yes
```

Then during prepare-root, an overlayfs is mounted as /etc, with the
upper dir being in /run. If composefs is used, the lower dir is
`usr/etc` from the composefs image , or it is the deployed
`$deploydir/usr/etc`.

Note that for this to work with selinux, the commit must have been
built with OSTREE_REPO_COMMIT_MODIFIER_FLAGS_USRETC_AS_ETC. Otherwise
the lowerdir (/usr/etc) will have the wrong selinux contexts for the
final location of the mount (/etc).

We also set the transient-etc key in the ostree-booted file, pointing it
to the directory that is used for the overlayfs.

There are some additional work happening in ostree-remount, mostly
related to selinux (as this needs to happen post selinux policy
load):

 * Recent versions of selinux-poliy have issues with the overlayfs
   mount being kernel_t, and that is not allowed to manage files as
   needed. This is fixed in
   fedora-selinux/selinux-policy#1893

 * Any /etc files created in the initramfs will not be labeled,
   because the selinux policy has not been loaded. In addition, the
   upper dir is on a tmpfs, and any manually set xattr-based selinux
   labels on those are reset during policy load. To work around this
   ostree-remount will relabel all files on /etc that have
   corresponding files in overlayfs upper dir.

 * During early boot, systemd mounts /run/machine-id on top of
   /etc/machine-id (as /etc is readonly). Later during boot, when etc
   is readwrite, systemd-machine-id-commit.service will remove the
   mount and update the real file under it with the right content. To
   ensure that this keeps working, we need to ensure that when we
   relabel /etc/machine-id we relabel the real (covered) file, not the
   temporary bind-mount.

 * ostree-remount no longer needs to remount /etc read-only in the
   transient-etc case.

Signed-off-by: Alexander Larsson <alexl@redhat.com>
@alexlarsson
Copy link
Member Author

Rebased on #3063 and retested.

Copy link
Member

@cgwalters cgwalters left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work!

I think we can add an installed test for this, but not gating.

@cgwalters cgwalters merged commit 3894fe2 into ostreedev:main Oct 12, 2023
24 checks passed
@alexlarsson
Copy link
Member Author

@cgwalters The installed test will probably be easier once the selinux changes have propagated too.

@zpytela
Copy link

zpytela commented Oct 13, 2023

@cgwalters The installed test will probably be easier once the selinux changes have propagated too.

Which changes do you have in mind? Rawhide selinux-policy build is available since 3 days ago.

@alexlarsson
Copy link
Member Author

@zpytela Yes, but it has to propagate to the fedora coreos images used in the CI here.

@cgwalters
Copy link
Member

I want to try spinning up testing against ELN across our repositories soon, which will fix that.

zpytela pushed a commit to zpytela/selinux-policy that referenced this pull request Oct 19, 2023
Extend the abitlity to manage all files also to character & block
device files and also allow relabeling any file.

This is required for early boot overlay mounts to fully work, but may be
needed for other legitimate oprations as well.

See also: ostreedev/ostree#3062

Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>

Resolves: rhbz#2182033
zpytela pushed a commit to zpytela/selinux-policy that referenced this pull request Oct 19, 2023
Extend the abitlity to manage all files also to character & block
device files and also allow relabeling any file.

This is required for early boot overlay mounts to fully work, but may be
needed for other legitimate oprations as well.

See also: ostreedev/ostree#3062

Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>

Resolves: rhbz#2182033
zpytela pushed a commit to fedora-selinux/selinux-policy that referenced this pull request Oct 20, 2023
Extend the abitlity to manage all files also to character & block
device files and also allow relabeling any file.

This is required for early boot overlay mounts to fully work, but may be
needed for other legitimate oprations as well.

See also: ostreedev/ostree#3062

Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>

Resolves: rhbz#2182033
zpytela pushed a commit to fedora-selinux/selinux-policy that referenced this pull request Oct 20, 2023
Extend the abitlity to manage all files also to character & block
device files and also allow relabeling any file.

This is required for early boot overlay mounts to fully work, but may be
needed for other legitimate oprations as well.

See also: ostreedev/ostree#3062

Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>

Resolves: rhbz#2182033
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/prepare-root Issue relates to ostree-prepare-root
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

7 participants