Operating system and container binary deployment and upgrades
C Shell Makefile Yacc M4 JavaScript Other
Latest commit 2c326d7 Feb 23, 2017 @cgwalters cgwalters committed with rh-atomic-bot fetcher: Log failures into journal
Particularly when HTTP requests fail, I really want a lot more information.
We could theoretically stuff it into the `GError` message field, but
that gets ugly *fast*.

Using the systemd journal allows us to log things in a structured fashion.
Right now e.g. rpm-ostree won't be aware of this additional information,
but I think we could teach it to be down the line.

In the short term, users can learn to find it from `systemctl status rpm-ostreed`
or `journalctl -b -r -u rpm-ostreed`, etc.

One thing I'd like to do next is log successful fetches of e.g. commit objects
as well with more information about the originating server (things like the
final URL if we were redirected, did we use TLS pinning, what was the negotiated
TLS version+cipher, etc).

Closes: #708
Approved by: jlebon
Failed to load latest commit information.
apidoc lib: Add ostree_repo_reload_config() Feb 7, 2017
bsdiff @ 1edf9f6 bsdiff: change submodule location Mar 26, 2015
build-aux Add infrastructure for "make syntax-check" Jan 30, 2015
buildutil Terminate individual tests after (10 * $TEST_TIMEOUT_FACTOR) minutes Dec 1, 2016
docs doc: fix typo in CONTRIBUTING Feb 3, 2017
libglnx @ 0c1603d libglnx: Re-bump to master due to accidental reversion Feb 21, 2017
man man/repo-config: Document mirrorlist Feb 24, 2017
manual-tests tests/delta-crosscheck: Add missing --from Jul 29, 2016
rust rust: Support `make dist` -> cargo vendor Feb 7, 2017
src fetcher: Log failures into journal Feb 24, 2017
tests main: Make ostree --version output YAML (and add gitrev) Feb 22, 2017
.dir-locals.el .dir-locals.el: Standard Emacs indentation config Jan 12, 2017
.gitmodules bsdiff: change submodule location Mar 26, 2015
.redhat-ci.Dockerfile ci: Install PyYAML Feb 17, 2017
.redhat-ci.yml ci: Hard error on all -fsanitize=undefined warnings Feb 21, 2017
.travis.yml libcurl backend Feb 9, 2017
CONTRIBUTING.md Rewrite manual in mkdocs Jan 28, 2016
COPYING COPYING: Update to latest FSF with current address Jan 16, 2014
GNUmakefile Add infrastructure for "make syntax-check" Jan 30, 2015
Makefile-boot.am Move ostree-* executables to /usr/lib/ostree Aug 11, 2016
Makefile-decls.am build-sys: Minor makefile tweaks Jan 4, 2017
Makefile-libostree-defines.am libostree: mark ostree_repo_checkout_tree_at as deprecated Jul 30, 2016
Makefile-libostree.am build: Remove .PHONY for Rust shared library Feb 14, 2017
Makefile-man.am build: Actually distribute man page XML source Sep 1, 2016
Makefile-ostree.am libcurl backend Feb 9, 2017
Makefile-otutil.am lib: Use sd_journal directly (optionally) Jun 21, 2016
Makefile-switchroot.am build: clean up ostree-remount if building without systemd Nov 29, 2016
Makefile-tests.am oxidation: Add implementation of bupsplit in Rust Feb 3, 2017
Makefile.am main: Make ostree --version output YAML (and add gitrev) Feb 22, 2017
README-historical.md README: Just link to wiki, move most of it to README-historical.md Jan 20, 2014
README.md README.md: Add more/clean up links to consuming projects Feb 21, 2017
TODO Fix repeated words. Jan 30, 2015
autogen.sh libglnx porting: Migrate to new tempfile code Jul 29, 2016
cfg.mk small cleanups Apr 8, 2016
configure.ac deploy/libmount: Fix build with old util-linux 2.23 (CentOS7) Feb 24, 2017
git.mk Use git.mk Apr 7, 2016
maint.mk tests: prefix invocation of ostree with where missing Nov 16, 2015
mkdocs.yml docs: Add a section on repository management Mar 29, 2016
ostree.doap doap category infrastructure Jul 31, 2014



New! See the docs online at Read The Docs (OSTree)

This project is now known as "libOSTree", renamed from "OSTree"; the focus is on the shared library. However, in most of the rest of the documentation, we will use the term "OSTree", since it's slightly shorter, and changing all documentation at once is impractical. We expect to transition to the new name over time.

libOSTree is a library and suite of command line tools that combines a "git-like" model for committing and downloading bootable filesystem trees, along with a layer for deploying them and managing the bootloader configuration.

The core OSTree model is like git in that it checksums individual files and has a content-addressed-object store. It's unlike git in that it "checks out" the files via hardlinks, and they should thus be immutable. Therefore, another way to think of OSTree is that it's just a more polished version of Linux VServer hardlinks.


  • Atomic upgrades and rollback for the system
  • Replicating content incrementally over HTTP via GPG signatures and "pinned TLS" support
  • Support for parallel installing more than just 2 bootable roots
  • Binary history on the server side (and client)
  • Introspectable shared library API for build and deployment systems

This last point is important - you should think of the OSTree command line as effectively a "demo" for the shared library. The intent is that package managers, system upgrade tools, container build tools and the like use OSTree as a "deduplicating hardlink store".

Projects using OSTree

meta-updater is a layer available for OpenEmbedded systems.

QtOTA is Qt's over-the-air update framework which uses libostree.

rpm-ostree is a next-generation hybrid package/image system for Fedora and CentOS, used by the Atomic Host project. By default it uses libostree to atomically replicate a base OS (all dependency resolution is done on the server), but it supports "package layering", where additional RPMs can be layered on top of the base. This brings a "best of both worlds"" model for image and package systems.

flatpak uses libostree for desktop application containers. Unlike most of the other systems here, flatpak does not use the "libostree host system" aspects (e.g. bootloader management), just the "git-like hardlink dedup". For example, flatpak supports a per-user OSTree repository.

Endless OS uses libostree for their host system as well as flatpak. See their eos-updater and deb-ostree-builder projects.

GNOME Continuous is where OSTree was born - as a high performance continuous delivery/testing system for GNOME.


Releases are available as GPG signed git tags, and most recent versions support extended validation using git-evtag.

However, in order to build from a git clone, you must update the submodules. If you're packaging OSTree and want a tarball, I recommend using a "recursive git archive" script. There are several available online; this code in OSTree is an example.

Once you have a git clone or recursive archive, building is the same as almost every autotools project:

env NOCONFIGURE=1 ./autogen.sh
./configure --prefix=...
make install DESTDIR=/path/to/dest

More documentation

New! See the docs online at Read The Docs (OSTree)

Some more information is available on the old wiki page: https://wiki.gnome.org/Projects/OSTree


See Contributing.