summaryrefslogtreecommitdiff
path: root/src/libostree/ostree-sysroot.h
Commit message (Collapse)AuthorAgeFilesLines
* tree-wide: Run clang-formatColin Walters2023-05-021-158/+96
| | | | | This is a one-time tree wide reformatting to ensure consistency going forward.
* lib/sysroot-deploy: Add experimental support for automatic early pruneJonathan Lebon2023-05-011-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | During the early design of FCOS and RHCOS, we chose a value of 384M for the boot partition. This turned out to be too small: some arches other than x86_64 have larger initrds, kernel binaries, or additional artifacts (like device tree blobs). We'll likely bump the boot partition size in the future, but we don't want to abandon all the nodes deployed with the current size.[[1]] Because stale entries in `/boot` are cleaned up after new entries are written, there is a window in the update process during which the bootfs temporarily must host all the `(kernel, initrd)` pairs for the union of current and new deployments. This patch determines if the bootfs is capable of holding all the pairs. If it can't but it could hold all the pairs from just the new deployments, the outgoing deployments (e.g. rollbacks) are deleted *before* new deployments are written. This is done by updating the bootloader in two steps to maintain atomicity. Since this is a lot of new logic in an important section of the code, this feature is gated for now behind an environment variable (`OSTREE_ENABLE_AUTO_EARLY_PRUNE`). Once we gain more experience with it, we can consider turning it on by default. This strategy increases the fallibility of the update system since one would no longer be able to rollback to the previous deployment if a bug is present in the bootloader update logic after auto-pruning (see [[2]] and following). This is however mitigated by the fact that the heuristic is opportunistic: the rollback is pruned *only if* it's the only way for the system to update. [1]: https://github.com/coreos/fedora-coreos-tracker/issues/1247 [2]: https://github.com/ostreedev/ostree/issues/2670#issuecomment-1179341883 Closes: #2670
* sysroot: Add an API to initialize with mountnsColin Walters2022-11-221-0/+3
| | | | | | | | | | | | | This lowers down into the C library some logic we have in the binary/app logic, in prep for having more Rust-native CLI code in https://github.com/ostreedev/ostree-rs-ext/pull/412 Basically we want to *ensure* a mount namespace by invoking `unshare()` if necessary, instead of requiring our callers to do this dance. This also helps fix e.g. Closes: https://github.com/ostreedev/ostree/issues/2769
* Fix `ostree admin kargs edit-in-place` fails issueHuijing Hei2022-07-121-0/+7
| | | | | | Add func to set kernel arguments in place, instead of create new deployment Fix https://github.com/ostreedev/ostree/issues/2664
* sysroot: Add a public `#define OSTREE_PATH_BOOTED`Colin Walters2022-01-121-0/+8
| | | | | This is public API. Motivated by https://github.com/coreos/rpm-ostree/pull/3325/files#diff-56528694f6f3213d6fb88d872f77291412dceec263b57166519843b13eca9a4dR30
* Update FSF license notices to use URL instead of addressJoseph Marrero2021-12-071-3/+1
|
* sysroot: Add _require_booted_deployment() APIColin Walters2021-03-171-0/+3
| | | | | This is a common pattern that is replicated both in our code and in rpm-ostree a lot. Let's add a canonical API.
* lib/deploy: Add support for overlay initrdsJonathan Lebon2020-09-301-1/+9
| | | | | | | | | | | | | | | | | | | | | | | | | In FCOS and RHCOS, the need to configure software in the initramfs has come up multiple times. Sometimes, using kernel arguments suffices. Other times, it really must be a configuration file. Rebuilding the initramfs on the client-side however is a costly operation. Not only does it add complexity to the update workflow, it also erodes a lot of the value obtained from using the baked "blessed" initramfs from the tree itself. One elegant way to address this is to allow specifying multiple initramfses. This is supported by most bootloaders (notably GRUB) and results in each initrd being overlayed on top of each other. This patch allows libostree clients to leverage this so that they can avoid regenerating the initramfs entirely. libostree itself is agnostic as to what kind and how much data overlay initrds contain. It's up to the clients to enforce such boundaries. To implement this, we add a new ostree_sysroot_stage_overlay_initrd which takes a file descriptor and returns a checksum. Then users can pass these checksums when calling the deploy APIs via the new array option `overlay_initrds`. We copy these files into `/boot` and add them to the BLS as another `initrd` entry.
* lib/deploy: Add deploy/stage APIs with optionsJonathan Lebon2020-09-301-0/+30
| | | | | | | And make the `override_kernel_argv` one of those options. This is mostly a mechanical move here, no functional change otherwise. Prep for adding a new option.
* sysroot: Remove unimplemented ostree_sysroot_lock_with_mount_namespaceColin Walters2020-06-181-3/+0
| | | | | | | | This came in with 5af403be0cc64df50ad21cef05f3268ead256d6d but was never implemented. I noticed this now because the Rust ostree bindings generate a wrapper for it which the linker tries to use.
* Support mounting /sysroot (and /boot) read-onlyColin Walters2019-12-111-0/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | We want to support extending the read-only state to cover `/sysroot` and `/boot`, since conceptually all of the data there should only be written via libostree. Or at least for `/boot` should *mostly* just be written by ostree. This change needs to be opt-in though to avoid breaking anyone. Add a `sysroot/readonly` key to the repository config which instructs `ostree-remount.service` to ensure `/sysroot` is read-only. This requires a bit of a dance because `/sysroot` is actually the same filesystem as `/`; so we make `/etc` a writable bind mount in this case. We also need to handle `/var` in the "OSTree default" case of a bind mount; the systemd generator now looks at the writability state of `/sysroot` and uses that to determine whether it should have the `var.mount` unit happen before or after `ostree-remount.service.` Also add an API to instruct the libostree shared library that the caller has created a new mount namespace. This way we can freely remount read-write. This approach extends upon in a much better way previous work we did to support remounting `/boot` read-write. Closes: https://github.com/ostreedev/ostree/issues/1265
* lib/sysroot: Add wrapper API to prune system repositoryColin Walters2018-05-241-0/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | The initial motivation for this is that the "staging" code currently didn't rewrite the deployment refs, meaning that the staged commit could be pruned. Hence first, this new API ensures that deployments also hold a strong ref to their commit, without relying on the magical "deployment refs" that we inject. That has always been a weird artifact of the strict layering separation between OstreeSysroot and OstreeRepo. I also plan to change rpm-ostree to start using this API to hold references to base layers for client-side layering; it also today generates various refs. That said, if we still want to support multiple processes writing to a single repo (as happens on EndlessOS today) we still need to write refs; perhaps later we could add a concept of "generators" or something that create refs based on whatever logic? Another minor thing this fixes is that we had a printf inside the library; this propagates the pruned data to the higher level which can log however it likes. Closes: #1566 Approved by: jlebon
* Add concept of "staged" deploymentColin Walters2018-04-121-0/+13
| | | | | | | | | | | | | | | | | | | | | | Add API to write a deployment state to `/run/ostree/staged-deployment`, along with a systemd service which runs at shutdown time. This is a big change to the ostree model for hosts, but it closes a longstanding set of bugs; many, many people have hit the "losing changes in /etc" problem. It also avoids the other problem of racing with programs that modify `/etc` such as LVM backups: https://bugzilla.redhat.com/show_bug.cgi?id=1365297 We need this in particular to go to a full-on model for automatically updated host systems where (like a dual-partition model) everything is fully prepared and the reboot can be taken asynchronously. Closes: https://github.com/ostreedev/ostree/issues/545 Closes: #1503 Approved by: jlebon
* sysroot: Add concept of deployment "pinning" đź“ŚColin Walters2018-02-261-0/+6
| | | | | | | | | | | | | Example user story: Jane rebases her OS to a new major version N, and wants to keep around N-1 even after a few upgrades for a while so she can easily roll back. I plan to add `rpm-ostree rebase --pin` to opt-in to this for example. Builds on the new `libostree-transient` group to store pinning state there. Closes: https://github.com/ostreedev/ostree/issues/1460 Closes: #1464 Approved by: jlebon
* Add SPDX-License-Identifier to source filesMarcus Folkesson2018-01-301-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | SPDX License List is a list of (common) open source licenses that can be referred to by a “short identifier”. It has several advantages compared to the common "license header texts" usually found in source files. Some of the advantages: * It is precise; there is no ambiguity due to variations in license header text * It is language neutral * It is easy to machine process * It is concise * It is simple and can be used without much cost in interpreted environments like java Script, etc. * An SPDX license identifier is immutable. * It provides simple guidance for developers who want to make sure the license for their code is respected See http://spdx.org for further reading. Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com> Closes: #1439 Approved by: cgwalters
* tree-wide: Remove Emacs modelinesColin Walters2017-09-211-2/+1
| | | | | | | | | We added a `.dir-locals.el` in commit: 9a77017d87b74c5e2895cdd64ad098018929403f There's no need to have it per-file, with that people might think to add other editors, which is the wrong direction. Closes: #1206 Approved by: jlebon
* ostree-sysroot: make simple_write_deployment smarterJonathan Lebon2017-08-251-0/+2
| | | | | | | | | | | | | | | | | | | | This is a follow-up to https://github.com/ostreedev/ostree/pull/1097. We make simple_write_deployment smart enough so that it can be used for rpm-ostree's purposes. This is mostly an upstreaming of logic that already existed there. Notably we correctly append NOT_DEFAULT deployments *after* the booted deployment and we now support RETAIN_PENDING and RETAIN_ROLLBACK flags to have more granularity on deployment pruning. Expose these new flags on the CLI using new options (as well as expose the previously existing NOT_DEFAULT flag as --not-as-default). I couldn't add tests for --retain-pending because the merge deployment is always the topmost one. Though I did check that it worked in a VM. Closes: #1110 Approved by: cgwalters
* lib/sysroot: Add API to get pending/rollback for given staterootAnton Gerasimov2017-06-141-0/+6
| | | | | | | | | | | This imports a function that is used in rpm-ostree, and it's also intended for use by https://github.com/advancedtelematic/aktualizr to display what deployment we're going to boot next after the reboot. Updated-by: Colin Walters <walters@verbum.org> Closes: #897 Approved by: OYTIS
* lib/sysroot: Add non-failable ostree_sysroot_repo()Colin Walters2017-05-261-0/+3
| | | | | | | | | | | | Having a failable accessor is annoying, since it's really common to reference both. Instead, open the repo once when we load the sysroot, and provide a non-failable accessor. This is also prep for `ostree_repo_open_at()`, which collapses the separation between `ostree_repo_new()` and `ostree_repo_open()`. Closes: #886 Approved by: jlebon
* sysroot: Add ostree_sysroot_write_deployments_with_options()Colin Walters2017-03-231-0/+14
| | | | | | | | | | | | | | More sophisticated users of libostree like rpm-ostree need control over things like the system repository. Previously we introduced a "no cleanup" flag to `ostree_sysroot_simple_write_deployment()`, but that's a high level API that does filtering on its own. Since rpm-ostree needs more control, let's expose the bare essentials of the "sysroot commit" operation with an extensible options structure, where one of the options is whether or not to do post-transaction repository operations. Closes: #745 Approved by: jlebon
* sysroot: Add a flag to suppress post-deploy cleanupColin Walters2016-08-291-1/+2
| | | | | | | | | | | | | I noticed seeing the output of `prune` twice in rpm-ostree, and had always wondered why. When reading the rpm-ostree code to fix something else, reasons, I noticed the reason - we were pruning once here, and then once after rpm-ostree regenerates its "base" refs. There's no reason to clean twice, so let's add a flag so rpm-ostree can suppress doing it inside libostree. Closes: #474 Approved by: giuseppe
* admin: Add an `unlock` command, and libostree APIColin Walters2016-03-231-1/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I'm trying to improve the developer experience on OSTree-managed systems, and I had an epiphany the other day - there's no reason we have to be absolutely against mutating the current rootfs live. The key should be making it easy to rollback/reset to a known good state. I see this command as useful for two related but distinct workflows: - `ostree admin unlock` will assume you're doing "development". The semantics hare are that we mount an overlayfs on `/usr`, but the overlay data is in `/var/tmp`, and is thus discarded on reboot. - `ostree admin unlock --hotfix` first clones your current deployment, then creates an overlayfs over `/usr` persistent to this deployment. Persistent in that now the initramfs switchroot tool knows how to mount it as well. In this model, if you want to discard the hotfix, at the moment you roll back/reboot into the clone. Note originally, I tried using `rofiles-fuse` over `/usr` for this, but then everything immediately explodes because the default (at least CentOS 7) SELinux policy denies tons of things (including `sshd_t` access to `fusefs_t`). Sigh. So the switch to `overlayfs` came after experimentation. It still seems to have some issues...specifically `unix_chkpwd` is broken, possibly because it's setuid? Basically I can't ssh in anymore. But I *can* `rpm -Uvh strace.rpm` which is handy. NOTE: I haven't tested the hotfix path fully yet, specifically the initramfs bits.
* lib: Add ostree_sysroot_load_if_changed() APIColin Walters2016-03-031-0/+6
| | | | | | | | | This will allow daemons like rpm-ostree to detect if there are any new deployments efficiently, in combination with using inotify. If there are any changes, rpm-ostree wants publish them on DBus. While we're here, add some changes to start doing unit C testing of the sysroot API.
* lib: Add ostree_sysroot_init_osname() API, bump mtimeColin Walters2016-03-031-0/+6
| | | | | | | | | | And change the command line to use it. rpm-ostree had a copy of this code, and thus there's a clear reason to have an API. While we're moving this into API, ensure the mtime on deploy is bumped after an osname is created, so that daemons like rpm-ostree can notice changes. (In reality, creating the directory should do this, but let's be double sure)
* lib: Introduce versioned symbolsColin Walters2016-03-011-0/+31
| | | | | | | | | | | | | | | | | | | | As rpm-ostree evolves, it keeps driving API additions to libostree. This creates a relatively tight coupling. However, if delivering via e.g. RPM, unless one manually remembers to increment the `Requires:` in the spec file, it's possible for the two to become desynchronized. RPM handles versioned symbols and will ensure a dependency if the application starts using a newer version. To implement this, switch to `-fvisibility=hidden`, along with an annotation in the header, and finally add a `.sym` file. This matches what other projects like systemd and libvirt do. Although rather than attempting to retroactively version symbols, glom them all onto the current one.
* Mutable is a keyword in C++11Leandro Santiago2015-09-231-1/+1
| | | | This fix allows including OSTree on C++ projects.
* sysroot: Add ostree_sysroot_prepare_cleanup()Matthew Barnes2015-09-161-0/+4
| | | | | | | | | | New public function works like ostree_sysroot_cleanup() EXCEPT FOR pruning the repository. Under the hood, add _ostree_sysroot_piecemeal_cleanup() which takes flags to better control what files are cleaned up. Both public cleanup functions are now wrappers for _ostree_sysroot_piecemeal_cleanup() with different flags.
* sysroot: Add an unload() APIColin Walters2015-08-131-0/+2
| | | | | | This will be used by gnome-continuous at least to drop the reference to the fd so that unmounting can proceed. See https://git.gnome.org/browse/gnome-continuous/commit/?id=95e9910ea288d302509ca667e0d190dd89377dd5
* sysroot: Add a try_lock() APIColin Walters2015-05-101-0/+10
| | | | | | | | | | | | | The blocking locking API wasn't sufficient for use in the rpm-ostree daemon; it really wants to know if the lock is held, then continue to do other things (like service DBus requests), and get notification when the lock is available. We also add an async variant that can be called if the lock is not available. Implement a higher level "loop until lock is available" method in the `ostree admin` commandline.
* sysroot: Add an API to lockColin Walters2015-05-051-0/+3
| | | | | | | | | | | | | | | | | | If a system administrator happens to type `ostree admin upgrade` multiple times, currently that will lead to a potentially corrupted system. I originally attempted to do locking *internally* in `libostree`, but that didn't work out because currently a number of the commands perform multi-step operations that all need to be serialized. All of the current code in `ostree admin deploy` is an example. Therefore, allow callers to perform locking, as most of the higher level logic is presently implemented there. At some point, we can revisit having internal locking, but it will be difficult. A more likely approach would be similar to Java's approach with concurrency on iterators - a "fail fast" method.
* sysroot: Add ostree_sysroot_get_fd()Colin Walters2015-04-171-0/+2
| | | | | | | | This way external programs like rpm-ostree can do fd-relative operations on the deployment directories, like inspecting the RPM database. Closes: https://github.com/GNOME/ostree/pull/91
* Add an API to set/unset a deployment tree's mutabilityColin Walters2015-04-101-0/+6
| | | | | | This will be used by rpm-ostree to unset the immutable bit temporarily in order to do package layering. We could add an API to deploy a tree without the immutable bit, but this is simpler.
* sysroot: Read some bootloader state with fd-relative APIColin Walters2015-03-091-0/+3
| | | | | This is the start of migrating the deployment path to fd-relative code.
* syntax-check: Remove empty lines at the end of fileGiuseppe Scrivano2015-02-021-1/+0
| | | | Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
* sysroot: Add ostree_sysroot_write_origin_file() APIColin Walters2015-01-191-0/+6
| | | | | | We want to allow admins to change the origin file without doing a new deployment, so this will be part of a future "admin set-origin" command.
* Move basic commit API into ostree_sysroot_simple_write_deployment()Colin Walters2014-03-231-0/+13
| | | | | The admin commands had this shared in tool common, but we want to encourage external programs to do this as well.
* libostree: Add ostree_sysroot_deployment_set_kargs()Colin Walters2014-03-191-0/+6
| | | | | | | It turns out people sometimes want to be able to change the kernel arguments. Add a convenient API to do so for the current deployment. This will be used by Anaconda.
* deploy: Rework kernel arguments, add --karg-append to "admin deploy"Colin Walters2014-01-161-9/+9
| | | | | | | | | | | | | | | | | The "ordered hash" code was really just for kernel arguments. And it turns out it needs to be a multihash (for e.g. multiple console= arguments). So turn the OstreeOrderedHash into OstreeKernelArgs, and move the bits to split key=value and such into there. Now we're not making this public API yet - the public OstreeSysroot just takes char **kargs. To facilitate code reuse between ostree/ and libostree/, make it a noinst libtool library. It'll be duplicated in the binary and library, but that's OK for now. We can investigate making OstreeKernelArgs public later. https://bugzilla.gnome.org/show_bug.cgi?id=721136
* sysroot: Move ostree_sysroot_origin_new_from_refspec hereColin Walters2013-10-031-0/+4
| | | | | Rather than having it live in admin. This is useful for other consumers like the test suite.
* sysroot: Support more arbitrary deployment changesColin Walters2013-10-021-1/+0
| | | | | | | | | This commit changes the sysroot API so that one can create arbitrary new deployment checkouts, then commit them as one step. This is to enable things like an automatic bisection tool which say create 50 deployments at once, then when done clean them up. This also moves some printfs from the library into src/ostree.
* libostree: Remove private header file from ostree.hColin Walters2013-09-201-1/+0
| | | | Was breaking pkgsys-ostree.
* sysroot: Clean up APIColin Walters2013-09-161-47/+21
| | | | | | | | | | | | | Now that we have a real GObject for the sysroot, we have a convenient place to keep track of 4 pieces of state: * The current deployment list * The current bootversion * The current subbootversion * The current booted deployment (if any) Avoid requiring callers to pass all of this around and load it piecemeal; instead the new thing is ostree_sysroot_load().
* doc: Add some more OstreeSysroot docsColin Walters2013-09-151-2/+2
|
* libostree: Make OstreeBootloader privateColin Walters2013-09-151-2/+0
| | | | | It was only temporarily public while functionality was being merged down; that's done now.
* libostree: Nearly complete move of API into OstreeSysrootColin Walters2013-09-151-0/+41
| | | | Move the deployment code too.
* libostree: Move a lot more sysroot API hereColin Walters2013-09-151-0/+31
| | | | OstreeBootloader is temporarily public API.
* libostree: Move sysroot initialization API hereColin Walters2013-09-151-0/+4
|
* libostree: Add new OstreeSysroot classColin Walters2013-09-151-0/+42
| | | | | At the moment, just a container for a path, but we will start moving admin functionality here.
* Remove built in "triggers"Colin Walters2013-07-071-39/+0
| | | | | | | | | | | | | | | Originally, the idea was that clients would replicate "OS/tree"s from a build server, but we'd run things like "ldconfig" on the client. This was to allow adding e.g. the nVidia binary driver. However, the triggers were the only thing in the system at the moment that really had expected knowledge of the *contents* of the OS, like the location of binaries. For now, it's architecturally cleaner if we move the burden of triggers to the tree builder (e.g. gnome-ostree or RPM). Eventually we may want OSTree to assist with this type of thing (perhaps something like RPM %ghost), but this is the right thing to do now.
* core: Associate branches with remotes, move trigger runs into checkoutColin Walters2012-04-031-0/+39
Also add --atomic-retarget option to checkout. This does the magical symlink dance to do atomic swaps between trees.