Skip to content

Commit

Permalink
eos-updater: Add support for OSTree sysroot autocleanup
Browse files Browse the repository at this point in the history
When OSTree staged deployments are used, the old rollback deployment is
deleted during system shutdown. To keep from slowing down shutdown, the
OSTree repo is not pruned at that time. That means that even though the
deployment was deleted, the objects are still on disk. Since that may be
a significant amount of wasted disk space, the full cleanup with repo
pruning needs to be run at some time after rebooting. See
ostreedev/ostree#2510 for details.

To detect when cleanup is necessary, a systemd drop in is added to touch
the `/sysroot/.cleanup` file after `ostree-finalize-staged.service` has
finalized the new deployment. The reason to use a drop-in for
`ostree-finalize-staged.service` rather then creating the file from
`eos-updater` is to avoid the situation where an unclean shutdown occurs
and the new deployment is not finalized. In that case, cleanup would be
run unnecessarily on the next boot.

A new systemd service, `eos-updater-autocleanup.service`, is added to
run `ostree admin cleanup` when `/sysroot/.cleanup` exists and then
delete it afterwards. This adds a dependency on the `ostree` CLI but a
separate program could be provided calling the `ostree_sysroot_cleanup`
API and deleting the `/sysroot/.cleanup` file itself.

https://phabricator.endlessm.com/T5658
  • Loading branch information
dbnicholson committed Jan 11, 2022
1 parent a49c5e9 commit b5c457e
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 0 deletions.
1 change: 1 addition & 0 deletions debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ Multi-arch: no
Depends:
gir1.2-glib-2.0,
mogwai-scheduled,
ostree,
python3-gi,
systemd (>= 200),
${misc:Depends},
Expand Down
2 changes: 2 additions & 0 deletions debian/eos-updater.install
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ lib/systemd/system/eos-autoupdater.service
lib/systemd/system/eos-autoupdater.timer
lib/systemd/system/eos-updater-avahi.path
lib/systemd/system/eos-updater-avahi.service
lib/systemd/system/eos-updater-autocleanup.service
lib/systemd/system/eos-updater-flatpak-installer.service
lib/systemd/system/eos-updater-flatpak-installer-fallback.service
lib/systemd/system/eos-updater-flatpak-installer-fallback.timer
lib/systemd/system/eos-updater.service
lib/systemd/system/eos-update-server.service
lib/systemd/system/eos-update-server.socket
lib/systemd/system/ostree-finalize-staged.service.d/autocleanup.conf
usr/libexec/eos-updater
usr/libexec/eos-autoupdater
usr/libexec/eos-updater-avahi
Expand Down
37 changes: 37 additions & 0 deletions eos-updater/eos-updater-autocleanup.service.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
[Unit]
Description=Automatically cleanup after staged Endless OS Updater deployment
Documentation=man:ostree-admin-cleanup(1) man:eos-updater(8)

# Run ostree admin cleanup only if /sysroot/.cleanup is present and then
# delete it when cleanup is successful.
#
# FIXME: Drop this when https://github.com/ostreedev/ostree/issues/2510
# is resolved.
ConditionPathExists=/sysroot/.cleanup

# We want this to be triggered by multi-user.target but not block it via
# the default After added to target units since pruning the repo can be
# slow. See the Default Dependencies sections in systemd.service(5) and
# systemd.target(5).
DefaultDependencies=no
Requires=sysinit.target
After=sysinit.target basic.target
Conflicts=shutdown.target
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=@ostree@ admin cleanup
ExecStart=/bin/rm -f /sysroot/.cleanup

# Only /sysroot and /boot need to be written to.
ProtectSystem=strict
ReadWritePaths=/sysroot /boot

# This will be allowed to run in the background, so try to make it less
# disruptive while it prunes the repo.
IOSchedulingClass=idle

[Install]
WantedBy=multi-user.target
9 changes: 9 additions & 0 deletions eos-updater/finalize-autocleanup.conf.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# This is a drop-in file for ostree-finalize-staged.service.
#
# FIXME: Drop this when https://github.com/ostreedev/ostree/issues/2510
# is resolved.

[Service]
# After finalizing the staged deployment, touch the .cleanup file so
# that the cleanup can be completed on the next boot.
ExecStop=-/bin/touch /sysroot/.cleanup
15 changes: 15 additions & 0 deletions eos-updater/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ install_data(
# systemd files
config = configuration_data()
config.set('libexecdir', join_paths(get_option('prefix'), get_option('libexecdir')))
config.set('ostree', find_program('ostree').path())

configure_file(
input: 'eos-updater.service.in',
Expand All @@ -113,6 +114,20 @@ configure_file(
configuration: config,
)

configure_file(
input: 'eos-updater-autocleanup.service.in',
output: 'eos-updater-autocleanup.service',
install_dir: dependency('systemd').get_pkgconfig_variable('systemdsystemunitdir'),
configuration: config,
)

configure_file(
input: 'finalize-autocleanup.conf.in',
output: 'autocleanup.conf',
install_dir: join_paths(dependency('systemd').get_pkgconfig_variable('systemdsystemunitdir'), 'ostree-finalize-staged.service.d'),
configuration: config,
)

# Example configuration
install_data(
files('eos-updater.conf'),
Expand Down

0 comments on commit b5c457e

Please sign in to comment.