Hello community,
here is the log from the commit of package transactional-update for
openSUSE:Factory checked in at 2019-02-08 13:45:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/transactional-update (Old)
and /work/SRC/openSUSE:Factory/.transactional-update.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "transactional-update"
Fri Feb 8 13:45:58 2019 rev:36 rq:671126 version:2.12
Changes:
--------
---
/work/SRC/openSUSE:Factory/transactional-update/transactional-update.changes
2018-11-19 23:33:57.943053965 +0100
+++
/work/SRC/openSUSE:Factory/.transactional-update.new.28833/transactional-update.changes
2019-02-08 13:45:59.690824134 +0100
@@ -1,0 +2,24 @@
+Mon Jan 28 19:05:42 UTC 2019 - [email protected]
+
+- Update to version 2.12
+ - Implements support for needs-restart (Fate#326451)
+ - Adds easy rollback to last known working snapshot by using "last"
+ as the snapshot number
+ - Migrate /etc/fstab.sys entires to /etc/fstab for systemd being
+ able to create mount units; this will prevent errors on unmount
+ - Remove implicit --no-allow-vendor-change - this option can be
+ configured in zypper's configuration file now
+ - Add support for mounting the /etc overlay file system as a systemd
+ unit in /etc/fstab on a read-only system (replacing /etc/fstab.sys
+ in the long run)
+ - Various bugfixes:
+ - Only remove /etc overlays on read-only root file systems
+ [boo#1122455]
+ - Disable "Persistent" flag in systemd timer unit to prevent
+ updates during or immediately after the boot phase
+ - Don't set global zypper options during migration - this is not
+ supported by the migration plugin
+ - Fix error handling when interrupting while rsync is running
+ - Filter out security.selinux attributes during rsync
+
+-------------------------------------------------------------------
Old:
----
transactional-update-2.11.tar.xz
New:
----
transactional-update-2.12.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ transactional-update.spec ++++++
--- /var/tmp/diff_new_pack.Ve11vc/_old 2019-02-08 13:46:00.566823863 +0100
+++ /var/tmp/diff_new_pack.Ve11vc/_new 2019-02-08 13:46:00.586823857 +0100
@@ -1,7 +1,7 @@
#
# spec file for package transactional-update
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,12 +12,12 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via https://bugs.opensuse.org/
+# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
Name: transactional-update
-Version: 2.11
+Version: 2.12
Release: 0
Summary: Transactional Updates with btrfs and snapshots
License: GPL-2.0-or-later
@@ -103,7 +103,7 @@
%exclude %{_docdir}/%{name}/*.html
%package zypp-config
-Summary: zypper rule to prevent uninstallation of transactional-update
+Summary: Zypper rule to prevent uninstallation of transactional-update
Group: System/Base
BuildArch: noarch
Requires: transactional-update
++++++ transactional-update-2.11.tar.xz -> transactional-update-2.12.tar.xz
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-2.11/NEWS
new/transactional-update-2.12/NEWS
--- old/transactional-update-2.11/NEWS 2018-11-13 15:13:20.000000000 +0100
+++ new/transactional-update-2.12/NEWS 2019-02-04 14:40:40.000000000 +0100
@@ -2,9 +2,33 @@
Copyright (C) 2016, 2017, 2018 Thorsten Kukuk
+Version 2.12
+* Implements support for needs-restart (Fate#326451)
+* Adds easy rollback to last known working snapshot by using "last"
+ as the snapshot number
+* Migrate /etc/fstab.sys entires to /etc/fstab for systemd being
+ able to create mount units; this will prevent errors on unmount
+ during shutdown for /var and /etc
+* Remove implicit --no-allow-vendor-change - this option can be
+ configured in zypper's configuration file now
+* Add support for mounting the /etc overlay file system as a systemd
+ unit in /etc/fstab on a read-only system (replacing /etc/fstab.sys
+ in the long run)
+* Various bugfixes:
+ * Only remove /etc overlays on read-only root file systems
+ [boo#1122455]
+ * Disable "Persistent" flag in systemd timer unit to prevent
+ updates during or immediately after the boot phase
+ * Don't set global zypper options during migration - this is not
+ supported by the migration plugin
+ * Fix error handling when interrupting while rsync is running
+ * Filter out security.selinux attributes during rsync
+
Version 2.11
* Update man page to explain new /etc overlay handling
* Add special handling for migrating away from old overlay directory
+* Read default update method for systemd service from config file
+ (boo#1111321)
Version 2.10
* Introduce /etc overlays
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-2.11/configure
new/transactional-update-2.12/configure
--- old/transactional-update-2.11/configure 2018-11-13 15:20:46.000000000
+0100
+++ new/transactional-update-2.12/configure 2019-02-04 14:44:16.000000000
+0100
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for transactional-update 2.11.
+# Generated by GNU Autoconf 2.69 for transactional-update 2.12.
#
#
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -576,8 +576,8 @@
# Identity of this package.
PACKAGE_NAME='transactional-update'
PACKAGE_TARNAME='transactional-update'
-PACKAGE_VERSION='2.11'
-PACKAGE_STRING='transactional-update 2.11'
+PACKAGE_VERSION='2.12'
+PACKAGE_STRING='transactional-update 2.12'
PACKAGE_BUGREPORT=''
PACKAGE_URL=''
@@ -1249,7 +1249,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures transactional-update 2.11 to adapt to many kinds of
systems.
+\`configure' configures transactional-update 2.12 to adapt to many kinds of
systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1316,7 +1316,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of transactional-update 2.11:";;
+ short | recursive ) echo "Configuration of transactional-update 2.12:";;
esac
cat <<\_ACEOF
@@ -1421,7 +1421,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-transactional-update configure 2.11
+transactional-update configure 2.12
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1476,7 +1476,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by transactional-update $as_me 2.11, which was
+It was created by transactional-update $as_me 2.12, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2339,7 +2339,7 @@
# Define the identity of the package.
PACKAGE='transactional-update'
- VERSION='2.11'
+ VERSION='2.12'
cat >>confdefs.h <<_ACEOF
@@ -4650,7 +4650,7 @@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by transactional-update $as_me 2.11, which was
+This file was extended by transactional-update $as_me 2.12, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -4707,7 +4707,7 @@
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //;
s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-transactional-update config.status 2.11
+transactional-update config.status 2.12
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-2.11/configure.ac
new/transactional-update-2.12/configure.ac
--- old/transactional-update-2.11/configure.ac 2018-11-13 15:20:27.000000000
+0100
+++ new/transactional-update-2.12/configure.ac 2019-02-04 14:14:22.000000000
+0100
@@ -1,5 +1,5 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT(transactional-update, 2.11)
+AC_INIT(transactional-update, 2.12)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([sbin/transactional-update.in])
AC_PREFIX_DEFAULT(/usr)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-2.11/doc/transactional-update.txt
new/transactional-update-2.12/doc/transactional-update.txt
--- old/transactional-update-2.11/doc/transactional-update.txt 2018-10-05
17:12:05.000000000 +0200
+++ new/transactional-update-2.12/doc/transactional-update.txt 2019-02-04
14:44:19.000000000 +0100
@@ -4,13 +4,21 @@
<[email protected]>
-Version 0.1, 15. December 2017
+Ignaz Forster
+
+<[email protected]>
+
+Version 0.9, 15. December 2018
Abstract
-This documentation describes how transactional update with btrfs works, what an
-administrator needs to know about the system setup and what a packager needs to
-know for his package.
+This is the documentation for transactional-update and is intended for users,
+administrators and packagers.
+
+It describes how transactional-update with Btrfs works by giving an overview of
+the design, what an administrator needs to know about setting up and operating
+such a system and what a packager needs to know for creating compatible
+packages.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -19,16 +27,23 @@
1.1. Description
1.2. Definition
1.3. Why transactional updates?
+ 1.4. Comparison with rpm-ostree
2. How it works
2.1. Filesystem
- 2.2. Update
- 2.3. Commands used
+ 2.2. Package Management
+ 2.3. Update
+ 2.4. Simplified workflow
+
+3. System setup
+
+ 3.1. Read-only file system
+ 3.2. /etc
+ 3.3. /var
-3. Setup of system
-4. Porting to other systems
-5. Files
+4. Files
+5. Porting to other systems
6. Author/acknowledgments
7. Copyright information for this document
@@ -36,86 +51,125 @@
1.1. Description
-transactional-update is an application that allows to apply intrusive updates
-to a running system in an atomic way without influencing the running system,
-taking the system down for a longer period or blocks the boot process. It is
-not a package manager, while implemented for zypper with RPMs, it can be
-changed to use other package managers and package formats. The idea and reason
-for this is, that you can continue to use your existing packages and tool chain
-to deliver and apply updates.
-
-To archive this, transactional-update creates for every update a new snapshot
-with btrfs and updates this to the latest version of the product. Since
-snapshots contain only the difference between two versions and thus are mostly
-very small, this is very space efficient. Which also means you can have more
-parallel installations than just two bootable root partitions.
+transactional-update is an application that allows to update a Linux system and
+its applications in an atomic way: The update will be performed in the
+background, not influencing the currently running system. The update will be
+activated by a reboot instead, similar to rpm-ostree or CoreOS' previous
+Container OS. transactional-update however is not another package manager, but
+is reusing the existing system tools such as RPM as the packaging format and
+zypper as the package manager. It does however rely on Btrfs due to its
+snapshotting and copy-on-write features. The idea and reason behind this is the
+ability to contiue using your existing packages and tool chain to deliver and
+apply updates. While currently only implemented for (open)SUSE environments the
+concept is vendor independent and may also be implemented for other package
+managers and package formats. the running system, taking the system down for a
+longer period of time or blocking the boot process.
+
+To achieve this, transactional-update creates a new snapshot with btrfs before
+performing an update and uses this snapshot for any modification. Since
+snapshots contain only the difference between two versions and thus are usually
+very small transactional-update is very space efficient. This also means
+several snapshots can be installed at the same time without a problem -
+removing the limit of only two bootable root partitions as usually seen in
+other systems.
1.2. Definition
-A transactional update is a kind of update that:
+A transactional update (also called atomic upgrade by some distributions) is a
+kind of update that:
• is atomic
- □ the update does not influence your running system.
+ □ The update does not influence the running system.
- □ you can at every time power off your machine. If you power it on again,
- either you have your unmodified old state, or the complete new one.
+ □ The machine can be powered off at any time. When powered on again
+ either the unmodified old state or the new state is active, but no
+ state in between.
• can be rolled back
- □ if the upgrade fails or if the newer software version is not compatible
- with your infrastructure, you can quickly restore the situation as it
- was before the upgrade.
+ □ If the upgrade fails or if a newer software version turns out to not be
+ compatible with your infrastructure, the system can quickly be restored
+ to a previous state.
1.3. Why transactional updates?
-Linux distributions have working update mechanism since many, many years, why
-do we need something new? There are different users, which have different
-requirements. We have the Desktop user on a very stable distribution, for whom
-the current update mechanism good enough. But we also have the bleeding edge
-distribtuion with rolling updates and the enterprise customer with critical
-applications, which have different requirements.
-
-Distributions wit "rolling" updates face the problem: how should intrusive
-updates be applied in a running system? Without breaking the update mechanism
-itself? Like the migration from SysV init to systemd. Or the big version update
-of the Desktop while the Desktop is running. Very likely will this update kill
-the currently running Desktop, which would kill the update process, which
-leaves the system in a broken, undefined state. Additional, if an update breaks
-such a system, there needs to be a quick way to rollback the system to the last
-working state.
-
-On mission critical systems, the update is not allowed to interrupt the running
-services. On such systems, interrupting running services is more expensive than
-a scheduled reboot. And the system needs always to be in a defined state. Which
-means, the updates are applied without error or no change is done. E.g. if a
-post-install script of a RPM fails, the system is in an undefined state, which
-should never happen.
-
-Sometimes, new software versions of the kernel or software are incompatible
-with your hardware or other software. In this case, there should be a quick and
-easy way to rollback to the state before the update was applied.
+Linux distributions have had working update mechanisms for many, many years -
+why do we need something new? As the distributions evolved, so did the user's
+requirements: For a desktop user on a very stable distribution the current
+update mechanism will be good enough. But we also have the bleeding edge
+distributions with rolling updates and occasionally unstable software, and
+there are enterprise customers with critical applications and the desire to
+mimimize the probability of service outages.
+
+Distributions with rolling updates face the problem: how should intrusive
+updates be applied to a running system - without breaking the update mechanism
+itself? Examples like the migration from SysV init to systemd, a major version
+update of a desktop environment while the desktop is still running or even only
+a small update to D-Bus may give a good idea of the problem. The desktop
+environment may simply terminate, killing the update process and leaving the
+system in a broken, undefined state. If any update breaks such a system there
+needs to be a quick way to roll back the system to the last working state.
+
+On mission critical systems you want to make sure that no service or user
+behaviour interferes with the update of the system. And conversely the update
+should not modify the system, e.g. by uncontrolled restarts of services or
+unexpected modifications to the system in post scripts. Potential interruptions
+are deferred to a defined maintenance window instead. For really critical
+systems the update can be verified (e.g. using snapper diff) or discarded
+before actually booting into the new system. If an update encounters an error
+the new snapshot will be discarded automatically.
+
+For cluster nodes it is important that the system is always in a consistent
+state, requires no manual interaction and is able to recover itself from error
+conditions. For these systems transactional-updates provides automatic updates;
+snapshots with failed updates will be automatically removed. Automatic reboots
+can be triggered using a variety of different reboot methods (e.g. rebootmgr,
+kured or systemd), making the appliance of the updates cluster aware.
+
+Sometimes new kernel versions or software updates are incompatible with your
+hardware or other software. In this case there should be a quick and easy way
+to roll back to the state before the update was applied.
There are other solutions available for the above problems, like downloading
all RPMs upfront and apply them during the boot phase. But this blocks the user
from using his PC if there is something urgently todo.
+1.4. Comparison with rpm-ostree
+
+* Supports more than one backup state * Based on plain RPMs and repositories,
+no new technology required * No dedicated server side component required * No
+3-way merges * Space efficient (storing just the difference between snapshots
+instead of keeping two separate partitions) * No increased reboot time * Only
+supports Btrfs General: It is typically used for containerized systems
+nowadays. You want to make sure that no service or user behaviour interferes
+with the update of the system. Examples: Services restarting, post scripts
+modifying the system. Potential interruptions are deferred to a defined
+maintenance window. Another example: Dbus dies because of an update. You can
+patch it live, patch everything up, do a snapper diff to check for
+modifications and boot into the new system only when you verified everything is
+in the expected state.
+
Chapter 2. How it works
2.1. Filesystem
-For transactional updates the snapshot functionality of btrfs is used. Btrfs is
-a general purpose Copy-on-Write (Cow) filesystem. The main feature of btrfs is,
-that it provides subvolumes. This looks like a directory, but behave like a
-mount point. They can be accessed from the parent subvolume like a directory,
-or they can be mounted on other directories of the same filesytem. Snapshots
-will be created from existing subvolumes, excluding other subvolumes inside of
-it, and are by default read-only.
+For transactional updates the snapshot functionality of Btrfs is used. Btrfs is
+a general purpose Copy-on-Write (Cow) filesystem with subvolume support.
+Subvolumes look like a directory, but behave like a mount point. They can be
+accessed from the parent subvolume like a directory, or they can be mounted on
+other directories of the same filesytem. Snapshots will be created from
+existing subvolumes, excluding other subvolumes inside of it, and are by
+default read-only.
In theory this can be implemented with any CoW filesystem, as long as it
-provides snapshot functionality.
+provides snapshot functionality and the ability to boot from snapshots.
-2.2. Update
+2.2. Package Management
+
+transactional-update is
+
+2.3. Update
List of snapshots
@@ -136,7 +190,8 @@
will be updated with zypper.
In the third step the snapshot will be updated. This can be zypper up or zypper
-dup.
+dup, the installation or removal of a package or any other modification to the
+root file system.
List of snapshots with the clone again read-only.
@@ -146,26 +201,30 @@
List of snapshots with the read-only Clone the new default.
The last step is to mark the updated snapshot as new root filesystem. This is
-now the atomic step: If the power would have been pulled before, the unchanged
-old system would have been booted. Now the new, updated system will boot.
+the atomic step: If the power would have been pulled before, the unchanged old
+system would have been booted. Now the new, updated system will boot.
List of snapshots with the current root filesystem as newest at the end.
-After reboot, the newly prepared snapshot is the new root filesystem. If
-something bad happens, we can rollback to any of the older snapshots.
+After reboot, the newly prepared snapshot is the new root filesystem. If case
+anything goes wrong a rollback to any of the older snapshots can be performed.
List of snapshots with a read-write Clone of current root filesystem, which
will be updated with zypper.
-If we don't reboot and call transactional-update again, a new snapshot will be
-created and updated. This new snapshot is based again on the current running
-root filesystem. It is not based on newer snapshots. Newer snapshots cannot be
-used as base for the next snapshot, since we don't know if they work or not. It
-could be, that the admin found out that a newer snapshot did not boot and made
-a rollback. If we always base our new snapshots on the latest one, it could
-happen that the system ends in a non-working, non-fixable state.
+If the system is not rebooted and transactional-update is called again a new
+snapshot will be created and updated. This new snapshot is again based on the
+current running root filesystem, not on the new default snapshot! As it is not
+known whether that snapshot would be working it is not suitable as newer
+snapshots cannot be used as base for the next snapshot, since we don't know if
+they work or not. It could be, that the admin found out that a newer snapshot
+did not boot and made a rollback. If we always base our new snapshots on the
+latest one, it could happen that the system ends in a non-working, non-fixable
+state. For stacking changes (i.e. if several commands are supposed to be
+combined in one single snapshot) the shell can be used to perform any number of
+operations.
-2.3. Commands used
+2.4. Simplified workflow
In the end, creating and updating snapshots are only a few commands:
@@ -175,7 +234,7 @@
• btrfs property set ${SNAPSHOT_DIR} ro false
- • zypper -R ${SNAPSHOT_DIR} up|patch|dup
+ • zypper -R ${SNAPSHOT_DIR} up|patch|dup|...
• btrfs property set ${SNAPSHOT_DIR} ro true
@@ -184,41 +243,49 @@
• btrfs subvol set-default ${SNAPSHOT_DIR}
- or with a read-write root filesystem:
+ • systemctl reboot
- snapper rollback ${SNAPSHOT_ID}
+Chapter 3. System setup
- • systemctl reboot
+3.1. Read-only file system
+Transactional-update is typically used on a read-only root file system (but
+will also work with read-write file systems).
-Chapter 3. Setup of system
+3.2. /etc
-Read-only root filesystem or Read-Write filesystem? Requirements for RPMs, what
-is allowed and what not. Config files in /etc with overlayfs. Special handling
-for passwd, shadow, group. Rollback. Strict seperation from data and
-applications.
+Transactional-update is typically used on a
-Chapter 4. Porting to other systems
+3.3. /var
-You need a CoW filesystem (or anything else with snapshots and rollback), else
-this should work with every package manager.
+Transactional-update is typically used on a
-Chapter 5. Files
+Chapter 4. Files
-/usr/include/security/pam_appl.h
+/usr/etc/transactional-update.conf
Header file with interfaces for Linux-PAM applications.
-/usr/include/security/pam_misc.h
+/etc/transactional-update.conf
+
+ Header file for useful library functions for making applications easier to
+ write.
+
+/var/lib/overlay/
Header file for useful library functions for making applications easier to
write.
+Chapter 5. Porting to other systems
+
+You need a CoW filesystem (or anything else with snapshots and rollback), else
+this should work with every package manager.
+
Chapter 6. Author/acknowledgments
This document was written by Thorsten Kukuk <[email protected]> with many
-contributions from ...
+contributions from Ignaz Forster <[email protected]>.
Chapter 7. Copyright information for this document
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-2.11/doc/transactional-update.xml
new/transactional-update-2.12/doc/transactional-update.xml
--- old/transactional-update-2.11/doc/transactional-update.xml 2018-10-05
10:45:13.000000000 +0200
+++ new/transactional-update-2.12/doc/transactional-update.xml 2019-02-04
14:14:22.000000000 +0100
@@ -10,13 +10,22 @@
<surname>Kukuk</surname>
<email>[email protected]</email>
</author>
+ <author>
+ <firstname>Ignaz</firstname>
+ <surname>Forster</surname>
+ <email>[email protected]</email>
+ </author>
</authorgroup>
- <releaseinfo>Version 0.1, 15. December 2017</releaseinfo>
+ <releaseinfo>Version 0.9, 15. December 2018</releaseinfo>
<abstract>
<para>
- This documentation describes how transactional update with btrfs
- works, what an administrator needs to know about the system setup and
- what a packager needs to know for his package.
+ This is the documentation for transactional-update and is intended for
+ users, administrators and packagers.
+ </para>
+ <para> It describes how transactional-update with Btrfs works by giving
+ an overview of the design, what an administrator needs to know about
+ setting up and operating such a system and what a packager needs to
+ know for creating compatible packages.
</para>
</abstract>
</bookinfo>
@@ -27,30 +36,44 @@
<title>Description</title>
<para>
<emphasis remap='B'>transactional-update</emphasis>
- is an application that allows to apply intrusive updates to a running
- system in an <emphasis>atomic</emphasis> way without influencing the
- running system, taking the system down for a longer period or blocks
- the boot process. It is not a package manager, while implemented for
- zypper with RPMs, it can be changed to use other package managers
- and package formats. The idea and reason for this is, that you can
- continue to use your existing packages and tool chain to deliver
- and apply updates.
- </para>
- <para>
- To archive this, <emphasis remap='B'>transactional-update</emphasis>
- creates for every update a new snapshot with
- <emphasis>btrfs</emphasis> and updates this to the latest version of
- the product. Since snapshots contain only the difference between two
- versions and thus are mostly very small, this is very space efficient.
- Which also means you can have more parallel installations than just
- two bootable root partitions.
+ is an application that allows to update a Linux system and its
+ applications in an <emphasis>atomic</emphasis> way: The update will
+ be performed in the background, not influencing the currently
+ running system. The update will be activated by a reboot instead,
+ similar to
+ <ulink
url="https://rpm-ostree.readthedocs.io/en/latest/">rpm-ostree</ulink>
+ or CoreOS' previous Container OS. transactional-update however is not
+ another package manager, but is reusing the existing system tools such
+ as <emphasis>RPM</emphasis> as the packaging format and
+ <emphasis>zypper</emphasis> as the package manager. It does however
+ rely on <emphasis>Btrfs</emphasis> due to its snapshotting and
+ copy-on-write features. The idea and reason behind this is the ability
+ to contiue using your existing packages and tool chain to deliver and
+ apply updates. While currently only implemented for (open)SUSE
+ environments the concept is vendor independent and may also be
+ implemented for other package managers and package formats.
+
+the running system, taking the system down for a longer period of time or
+ blocking the boot process.
+ </para>
+ <para>
+ To achieve this, <emphasis remap='B'>transactional-update</emphasis>
+ creates a new snapshot with <emphasis>btrfs</emphasis> before
+ performing an update and uses this snapshot for any modification.
+ Since snapshots contain only the difference between two versions and
+ thus are usually very small transactional-update is very space
+ efficient.
+ This also means several snapshots can be installed at the same time
+ without a problem - removing the limit of only two bootable root
+ partitions as usually seen in other systems.
</para>
</section>
<section id="tu-introduction-definition">
<title>Definition</title>
<para>
- A <emphasis>transactional update</emphasis> is a kind of update that:
+ A <emphasis>transactional update</emphasis> (also called atomic upgrade
+ by some distributions) is a kind of update that:
</para>
<itemizedlist>
<listitem>
@@ -60,14 +83,14 @@
<itemizedlist>
<listitem>
<para>
- the update does not influence your running system.
+ The update does not influence the running system.
</para>
</listitem>
<listitem>
<para>
- you can at every time power off your machine. If you power it
- on again, either you have your unmodified old state, or the
- complete new one.
+ The machine can be powered off at any time. When powered on
+ again either the unmodified old state or the new state is
+ active, but no state in between.
</para>
</listitem>
</itemizedlist>
@@ -79,9 +102,9 @@
<itemizedlist>
<listitem>
<para>
- if the upgrade fails or if the newer software
- version is not compatible with your infrastructure, you can
- quickly restore the situation as it was before the upgrade.
+ If the upgrade fails or if a newer software version turns out
+ to not be compatible with your infrastructure, the system can
+ quickly be restored to a previous state.
</para>
</listitem>
</itemizedlist>
@@ -92,37 +115,52 @@
<section id="tu-introduction-reason">
<title>Why transactional updates?</title>
<para>
- Linux distributions have working update mechanism since many, many
- years, why do we need something new? There are different users,
- which have different requirements. We have the Desktop user on a very
- stable distribution, for whom the current update mechanism good
- enough. But we also have the bleeding edge distribtuion with rolling
- updates and the enterprise customer with critical applications, which
- have different requirements.
- </para>
- <para>
- Distributions wit "rolling" updates face the problem: how should
- intrusive updates be applied in a running system? Without breaking the
- update mechanism itself? Like the migration from SysV init to
- systemd. Or the big version update of the Desktop while the Desktop is
- running. Very likely will this update kill the currently running
- Desktop, which would kill the update process, which leaves the system
- in a broken, undefined state. Additional, if an update breaks such a
- system, there needs to be a quick way to rollback the system to the
- last working state.
- </para>
- <para>
- On mission critical systems, the update is not allowed to interrupt
- the running services. On such systems, interrupting running services
- is more expensive than a scheduled reboot. And the system needs always
- to be in a defined state. Which means, the updates are applied without
- error or no change is done. E.g. if a post-install script of a RPM
- fails, the system is in an undefined state, which should never happen.
- </para>
- <para>
- Sometimes, new software versions of the kernel or software are
- incompatible with your hardware or other software. In this case, there
- should be a quick and easy way to rollback to the state before the
+ Linux distributions have had working update mechanisms for many, many
+ years - why do we need something new? As the distributions evolved,
+ so did the user's requirements: For a desktop user on a very
+ stable distribution the current update mechanism will be good
+ enough. But we also have the bleeding edge distributions with rolling
+ updates and occasionally unstable software, and there are enterprise
+ customers with critical applications and the desire to mimimize the
+ probability of service outages.
+ </para>
+ <para>
+ Distributions with <emphasis role="bold">rolling updates</emphasis> face
+ the problem: how should intrusive updates be applied to a running system
+ - without breaking the
+ update mechanism itself? Examples like the migration from SysV init to
+ systemd, a major version update of a desktop environment while the
+ desktop is still running or even only a small update to D-Bus may give
+ a good idea of the problem. The desktop environment may simply
+ terminate, killing the update process and leaving the system in a
+ broken, undefined state. If any update breaks such a system there needs
+ to be a quick way to roll back the system to the last working state.
+ </para>
+ <para>
+ On <emphasis role="bold">mission critical systems</emphasis> you want
to make sure that no service or
+ user behaviour interferes with the update of the system. And conversely
+ the update should not modify the system, e.g. by uncontrolled restarts
+ of services or unexpected modifications to the system in post scripts.
+ Potential interruptions are deferred to a defined maintenance window
+ instead. For really critical systems the update can be verified (e.g.
+ using <command>snapper diff</command>) or discarded before actually
+ booting into the new system. If an update encounters an error the
+ new snapshot will be discarded automatically.
+ </para>
+ <para>
+ For <emphasis role="bold">cluster nodes</emphasis> it is important that
+ the system is always in a consistent state, requires no manual
+ interaction and is able to recover itself from error conditions.
+ For these systems transactional-updates provides automatic
+ updates; snapshots with failed updates will be automatically removed.
+ Automatic reboots can be triggered using a variety of different reboot
+ methods (e.g. rebootmgr, kured or systemd), making the appliance of
+ the updates cluster aware.
+ </para>
+ <para>
+ Sometimes new kernel versions or software updates are
+ incompatible with your hardware or other software. In this case there
+ should be a quick and easy way to roll back to the state before the
update was applied.
</para>
<para>
@@ -132,6 +170,21 @@
todo.
</para>
</section>
+ <section id="tu-introduction-comparison">
+ <title>Comparison with rpm-ostree</title>
+ <para>
+ * Supports more than one backup state
+ * Based on plain RPMs and repositories, no new technology required
+ * No dedicated server side component required
+ * No 3-way merges
+ * Space efficient (storing just the difference between snapshots
instead of keeping two separate partitions)
+ * No increased reboot time
+ * Only supports Btrfs
+General:
+ It is typically used for containerized systems nowadays.
+ You want to make sure that no service or user behaviour interferes with
the update of the system. Examples: Services restarting, post scripts modifying
the system. Potential interruptions are deferred to a defined maintenance
window. Another example: Dbus dies because of an update. You can patch it live,
patch everything up, do a snapper diff to check for modifications and boot into
the new system only when you verified everything is in the expected state.
+ </para>
+ </section>
</chapter>
<chapter id="tu-howitworks">
@@ -140,18 +193,24 @@
<title>Filesystem</title>
<para>
For transactional updates the snapshot functionality of
- <emphasis>btrfs</emphasis> is used. <emphasis>Btrfs</emphasis> is a
- general purpose Copy-on-Write (Cow) filesystem. The main feature of
- <emphasis>btrfs</emphasis> is, that it provides subvolumes. This looks
- like a directory, but behave like a mount point. They can be accessed
- from the parent subvolume like a directory, or they can be mounted on
- other directories of the same filesytem.
+ <emphasis>Btrfs</emphasis> is used. <emphasis>Btrfs</emphasis> is a
+ general purpose Copy-on-Write (Cow) filesystem with subvolume support.
+ Subvolumes look like a directory, but behave like a mount point. They
+ can be accessed from the parent subvolume like a directory, or they can
+ be mounted on other directories of the same filesytem.
Snapshots will be created from existing subvolumes, excluding other
subvolumes inside of it, and are by default read-only.
</para>
<para>
In theory this can be implemented with any CoW filesystem, as long as
- it provides snapshot functionality.
+ it provides snapshot functionality and the ability to boot from
+ snapshots.
+ </para>
+ </section>
+ <section id="tu-howitworks-packages">
+ <title>Package Management</title>
+ <para>
+ transactional-update is
</para>
</section>
<section id="tu-howitworks-update">
@@ -209,7 +268,9 @@
<caption>
<para>
In the third step the snapshot will be updated. This can be
- <emphasis>zypper up</emphasis> or <emphasis>zypper dup</emphasis>.
+ <emphasis>zypper up</emphasis> or <emphasis>zypper dup</emphasis>,
+ the installation or removal of a package or any other modification
+ to the root file system.
</para>
</caption>
</mediaobject>
@@ -237,7 +298,7 @@
<caption>
<para>
The last step is to mark the updated snapshot as new root
- filesystem. This is now the atomic step: If the power would have
+ filesystem. This is the atomic step: If the power would have
been pulled before, the unchanged old system would have been
booted. Now the new, updated system will boot.
</para>
@@ -254,8 +315,8 @@
<caption>
<para>
After reboot, the newly prepared snapshot is the new root
- filesystem. If something bad happens, we can rollback to any of
- the older snapshots.
+ filesystem. If case anything goes wrong a rollback to any of
+ the older snapshots can be performed.
</para>
</caption>
</mediaobject>
@@ -269,22 +330,26 @@
</textobject>
<caption>
<para>
- If we don't reboot and call
- <emphasis>transactional-update</emphasis> again, a new snapshot
- will be created and updated. This new snapshot is based again on
- the current running root filesystem. It is not based on newer
- snapshots. Newer snapshots cannot be used as base for the next
- snapshot, since we don't know if they work or not. It could be,
- that the admin found out that a newer snapshot did not boot and
- made a rollback. If we always base our new snapshots on the latest
- one, it could happen that the system ends in a non-working,
- non-fixable state.
+ If the system is not rebooted and
+ <emphasis>transactional-update</emphasis> is called again a new
+ snapshot will be created and updated. This new snapshot is again
+ based on the <emphasis>current</emphasis> running root filesystem,
+ <emphasis>not</emphasis> on the new default snapshot! As it is not
+ known whether that snapshot would be working it is not suitable as
+ newer snapshots cannot be used as base for the next snapshot, since
+ we don't know if they work or not. It could be, that the admin
+ found out that a newer snapshot did not boot and made a rollback.
+ If we always base our new snapshots on the latest one, it could
+ happen that the system ends in a non-working, non-fixable state.
+ For stacking changes (i.e. if several commands are supposed to be
+ combined in one single snapshot) the <option>shell</option> can be
+ used to perform any number of operations.
</para>
</caption>
</mediaobject>
</section>
<section id="tu-howitworks-commands">
- <title>Commands used</title>
+ <title>Simplified workflow</title>
<para>
In the end, creating and updating snapshots are only a few commands:
</para>
@@ -301,7 +366,7 @@
</listitem>
<listitem>
<programlisting>
-zypper -R ${SNAPSHOT_DIR} up|patch|dup
+zypper -R ${SNAPSHOT_DIR} up|patch|dup|...
</programlisting>
</listitem>
<listitem>
@@ -313,12 +378,6 @@
<programlisting>
btrfs subvol set-default ${SNAPSHOT_DIR}
</programlisting>
- <para>
- or with a read-write root filesystem:
- </para>
- <programlisting>
-snapper rollback ${SNAPSHOT_ID}
- </programlisting>
</listitem>
<listitem>
<programlisting>
@@ -330,28 +389,40 @@
</chapter>
<chapter id="tu-setup">
- <title> Setup of system </title>
+ <title>System setup</title>
+ <section id="tu-setup-readonly">
+ <title>Read-only file system</title>
+ <para>
+ Transactional-update is typically used on a read-only root file system
(but will also work with read-write file systems).
+ </para>
+ </section>
+ <section id="tu-setup-etc">
+ <title>/etc</title>
+ <para>
+ Transactional-update is typically used on a
+ </para>
+ </section>
+ <section id="tu-setup-var">
+ <title>/var</title>
+ <para>
+ Transactional-update is typically used on a
+ </para>
+ </section>
+<!--
<para>
Read-only root filesystem or Read-Write filesystem? Requirements for
RPMs, what is allowed and what not. Config files in /etc with
overlayfs. Special handling for passwd, shadow, group. Rollback. Strict
seperation from data and applications.
</para>
- </chapter>
-
- <chapter id='tu-porting'>
- <title>Porting to other systems</title>
- <para>
- You need a CoW filesystem (or anything else with snapshots
- and rollback), else this should work with every package manager.
- </para>
+-->
</chapter>
<chapter id='tu-files'>
<title>Files</title>
<variablelist>
<varlistentry>
- <term><filename>/usr/include/security/pam_appl.h</filename></term>
+ <term><filename>/usr/etc/transactional-update.conf</filename></term>
<listitem>
<para>
Header file with interfaces for
@@ -360,7 +431,16 @@
</listitem>
</varlistentry>
<varlistentry>
- <term><filename>/usr/include/security/pam_misc.h</filename></term>
+ <term><filename>/etc/transactional-update.conf</filename></term>
+ <listitem>
+ <para>
+ Header file for useful library functions for making
+ applications easier to write.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><filename>/var/lib/overlay/</filename></term>
<listitem>
<para>
Header file for useful library functions for making
@@ -371,11 +451,19 @@
</variablelist>
</chapter>
+ <chapter id='tu-porting'>
+ <title>Porting to other systems</title>
+ <para>
+ You need a CoW filesystem (or anything else with snapshots
+ and rollback), else this should work with every package manager.
+ </para>
+ </chapter>
+
<chapter id='tu-author'>
<title>Author/acknowledgments</title>
<para>
This document was written by Thorsten Kukuk <[email protected]>
- with many contributions from ...
+ with many contributions from Ignaz Forster <[email protected]>.
</para>
</chapter>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-2.11/man/transactional-update.8
new/transactional-update-2.12/man/transactional-update.8
--- old/transactional-update-2.11/man/transactional-update.8 2018-11-13
15:19:44.000000000 +0100
+++ new/transactional-update-2.12/man/transactional-update.8 2019-01-28
19:45:21.000000000 +0100
@@ -2,12 +2,12 @@
.\" Title: transactional-update
.\" Author: Thorsten Kukuk <[email protected]>
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\" Date: 11/13/2018
+.\" Date: 01/28/2019
.\" Manual: transactional-update
.\" Source: transactional-update
.\" Language: English
.\"
-.TH "TRANSACTIONAL\-UPDAT" "8" "11/13/2018" "transactional-update"
"transactional-update"
+.TH "TRANSACTIONAL\-UPDAT" "8" "01/28/2019" "transactional-update"
"transactional-update"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -158,7 +158,7 @@
.PP
\fBshell\fR
.RS 4
-After all actions are done, before the snapshot with the changes is unmounted
and switched to read\-only, a shell is started in the new snapshot as chroot
environment for testing and debugging\&.
+Opens a shell to execute commands like zypper manually\&. After all actions
are done, before the snapshot with the changes is unmounted and switched to
read\-only, a shell is started in the new snapshot as chroot environment for
testing and debugging\&.
.RE
.SS "Package Commands"
.PP
@@ -261,20 +261,26 @@
\fBbtrfs\fR\&. On read\-write systems
\fBsnapper\fR(8)
\fBrollback\fR
-is called\&. If no snapshot number is given the current root file system is
made the new default root file system\&. Otherwise the snapshot with
-\fBnumber\fR
-is made the new default root filesystem\&.
+is called\&.
+.sp
+If no snapshot number is given, the current root file system is set as the new
default root file system\&. Otherwise
+\fInumber\fR
+can either be a snapshot number (as displayed by
+\fBsnapper list\fR) or the word
+\fBlast\fR\&.
+\fBlast\fR
+will try to reset to the latest working snapshot\&.
.RE
.SH "OPTIONS"
.PP
\fB\-\-interactive\fR, \fB\-i\fR
.RS 4
-Ignores package command categorization, calls zypper in interactive mode\&.
+Calls zypper in interactive mode, even if the default for this command is
non\-interactive\&.
.RE
.PP
\fB\-\-non\-interactive\fR, \fB\-n\fR
.RS 4
-Ignores package command categorization, calls zypper in non\-interactive
mode\&.
+Calls zypper in non\-interactive mode, even if the default for this command is
interactive\&.
.RE
.PP
\fB\-\-no\-selfupdate\fR
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-2.11/man/transactional-update.8.html
new/transactional-update-2.12/man/transactional-update.8.html
--- old/transactional-update-2.11/man/transactional-update.8.html
2018-11-13 15:19:44.000000000 +0100
+++ new/transactional-update-2.12/man/transactional-update.8.html
2019-01-28 19:45:21.000000000 +0100
@@ -15,7 +15,7 @@
h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink,
dt:hover > a.headerlink {
visibility: visible;
}
- </style><a xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.index.html">Index </a><span
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common" style="float:right">transactional-update
2.10</span><hr xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><div class="refentry"><a
name="transactional-update.8"></a><div class="titlepage"></div><div
class="refnamediv"><a name="name"></a><h2>Name</h2><p>transactional-update,
transactional-update.service, transactional-update.timer — Apply updates to the
system in an atomic way via transactional
+ </style><a xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.index.html">Index </a><span
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common" style="float:right">transactional-update
2.11</span><hr xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><div class="refentry"><a
name="transactional-update.8"></a><div class="titlepage"></div><div
class="refnamediv"><a name="name"></a><h2>Name</h2><p>transactional-update,
transactional-update.service, transactional-update.timer — Apply updates to the
system in an atomic way via transactional
updates.</p></div><div class="refsynopsisdiv"><a
name="synopsis"></a><h2>Synopsis</h2><div class="cmdsynopsis"><p><code
class="command">transactional-update</code> [<em
class="replaceable"><code>options</code></em>...] [<em
class="replaceable"><code>general-command</code></em>...] [<em
class="replaceable"><code>package-command</code></em>
[<em class="replaceable"><code>command-argument</code></em>...]
]</p></div><div class="cmdsynopsis"><p><code
class="command">transactional-update</code> [<em
class="replaceable"><code>options</code></em>...] <em
class="replaceable"><code>standalone-command</code></em>
</p></div><p>transactional-update.service</p><p>transactional-update.timer</p></div><div
class="refsect1"><a name="description"></a><h2 id="DESCRIPTION">DESCRIPTION<a
class="headerlink" title="Permalink to this headline"
href="#DESCRIPTION">¶</a></h2><p><span
class="command"><strong>transactional-update</strong></span> updates the system
@@ -103,6 +103,7 @@
daemon to reboot the system according to the configured policies. Else
<span class="command"><strong>systemctl reboot</strong></span> is
called.
</p></dd><dt id="shell"><span class="term"><code
class="option">shell</code></span><a class="headerlink" title="Permalink to
this term" href="#shell">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>
+ Opens a shell to execute commands like zypper manually.
After all actions are done, before the snapshot with the changes is
unmounted and switched to read-only, a shell is started in the new
snapshot as chroot environment for testing and debugging.
@@ -170,11 +171,15 @@
file system is set directly using <span
class="command"><strong>btrfs</strong></span>. On
read-write systems
<a href="http://snapper.io/manpages/snapper.html"><span
class="citerefentry"><span class="refentrytitle">snapper</span>(8)</span></a>
- <code class="option">rollback</code> is called. If no snapshot number
is given
- the current root file system is made the new default root file system.
- Otherwise the snapshot with <code class="option">number</code> is made
the
- new default root filesystem.
- </p></dd></dl></div></div></div><div class="refsect1"><a
name="options"></a><h2 id="OPTIONS">OPTIONS<a class="headerlink"
title="Permalink to this headline" href="#OPTIONS">¶</a></h2><div
class="variablelist"><dl class="variablelist"><dt id="--interactive"><span
class="term"><code class="option">--interactive</code>, </span><span
class="term"><code class="option">-i</code></span><a class="headerlink"
title="Permalink to this term" href="#--interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Ignores package command categorization,
calls zypper in interactive mode.</p></dd><dt id="--non-interactive"><span
class="term"><code class="option">--non-interactive</code>, </span><span
class="term"><code class="option">-n</code></span><a class="headerlink"
title="Permalink to this term" href="#--non-interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Ignores package command categorization,
calls zypper in non-interactive mode.</p></dd><dt id="--no-selfupdate"><span
class="term"><code class="option">--no-selfupdate</code></span><a
class="headerlink" title="Permalink to this term"
href="#--no-selfupdate">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Skip checking for newer
transactional-update versions.</p></dd><dt id="--quiet"><span
class="term"><code class="option">--quiet</code></span><a class="headerlink"
title="Permalink to this term" href="#--quiet">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Don't print warnings and informational
messages to stdout.</p></dd><dt id="--help"><span class="term"><code
class="option">--help</code>, </span><span class="term"><code
class="option">-h</code></span><a class="headerlink" title="Permalink to this
term" href="#--help">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Display help and exit</p></dd><dt
id="--version"><span class="term"><code
class="option">--version</code></span><a class="headerlink" title="Permalink to
this term" href="#--version">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Output version information and
exit</p></dd></dl></div></div><div class="refsect1"><a name="important"></a><h2
id="IMPORTANT">IMPORTANT<a class="headerlink" title="Permalink to this
headline" href="#IMPORTANT">¶</a></h2><p>
+ <code class="option">rollback</code> is called.
+ </p><p>
+ If no snapshot number is given, the current root file system is set as
+ the new default root file system.
+ Otherwise <em class="replaceable"><code>number</code></em> can either
be a snapshot
+ number (as displayed by <span class="command"><strong>snapper
list</strong></span>) or the word
+ <code class="option">last</code>. <code class="option">last</code> will
try to reset to the
+ latest working snapshot.
+ </p></dd></dl></div></div></div><div class="refsect1"><a
name="options"></a><h2 id="OPTIONS">OPTIONS<a class="headerlink"
title="Permalink to this headline" href="#OPTIONS">¶</a></h2><div
class="variablelist"><dl class="variablelist"><dt id="--interactive"><span
class="term"><code class="option">--interactive</code>, </span><span
class="term"><code class="option">-i</code></span><a class="headerlink"
title="Permalink to this term" href="#--interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Calls zypper in interactive mode, even
if the default for this command is non-interactive.</p></dd><dt
id="--non-interactive"><span class="term"><code
class="option">--non-interactive</code>, </span><span class="term"><code
class="option">-n</code></span><a class="headerlink" title="Permalink to this
term" href="#--non-interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Calls zypper in non-interactive mode,
even if the default for this command is interactive.</p></dd><dt
id="--no-selfupdate"><span class="term"><code
class="option">--no-selfupdate</code></span><a class="headerlink"
title="Permalink to this term" href="#--no-selfupdate">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Skip checking for newer
transactional-update versions.</p></dd><dt id="--quiet"><span
class="term"><code class="option">--quiet</code></span><a class="headerlink"
title="Permalink to this term" href="#--quiet">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Don't print warnings and informational
messages to stdout.</p></dd><dt id="--help"><span class="term"><code
class="option">--help</code>, </span><span class="term"><code
class="option">-h</code></span><a class="headerlink" title="Permalink to this
term" href="#--help">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Display help and exit</p></dd><dt
id="--version"><span class="term"><code
class="option">--version</code></span><a class="headerlink" title="Permalink to
this term" href="#--version">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Output version information and
exit</p></dd></dl></div></div><div class="refsect1"><a name="important"></a><h2
id="IMPORTANT">IMPORTANT<a class="headerlink" title="Permalink to this
headline" href="#IMPORTANT">¶</a></h2><p>
Only RPMs which are fully part of the root filesystem and
/etc can be updated. There is also
limited handling for adding files and directories to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-2.11/man/transactional-update.8.xml
new/transactional-update-2.12/man/transactional-update.8.xml
--- old/transactional-update-2.11/man/transactional-update.8.xml
2018-11-13 12:02:13.000000000 +0100
+++ new/transactional-update-2.12/man/transactional-update.8.xml
2019-01-28 19:16:31.000000000 +0100
@@ -210,6 +210,7 @@
<term><option>shell</option></term>
<listitem>
<para>
+ Opens a shell to execute commands like zypper manually.
After all actions are done, before the snapshot with the changes is
unmounted and switched to read-only, a shell is started in the new
snapshot as chroot environment for testing and debugging.
@@ -352,12 +353,16 @@
Sets the default root file system. On a read-only system the root
file system is set directly using <command>btrfs</command>. On
read-write systems
- <citerefentry
-
project='snapper'><refentrytitle>snapper</refentrytitle><manvolnum>8</manvolnum></citerefentry>
- <option>rollback</option> is called. If no snapshot number is given
- the current root file system is made the new default root file system.
- Otherwise the snapshot with <option>number</option> is made the
- new default root filesystem.
+ <citerefentry
project='snapper'><refentrytitle>snapper</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+ <option>rollback</option> is called.
+ </para>
+ <para>
+ If no snapshot number is given, the current root file system is set as
+ the new default root file system.
+ Otherwise <replaceable>number</replaceable> can either be a snapshot
+ number (as displayed by <command>snapper list</command>) or the word
+ <option>last</option>. <option>last</option> will try to reset to the
+ latest working snapshot.
</para>
</listitem>
</varlistentry>
@@ -370,14 +375,14 @@
<term><option>--interactive</option></term>
<term><option>-i</option></term>
<listitem>
- <para>Ignores package command categorization, calls zypper in
interactive mode.</para>
+ <para>Calls zypper in interactive mode, even if the default for this
command is non-interactive.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--non-interactive</option></term>
<term><option>-n</option></term>
<listitem>
- <para>Ignores package command categorization, calls zypper in
non-interactive mode.</para>
+ <para>Calls zypper in non-interactive mode, even if the default for this
command is interactive.</para>
</listitem>
</varlistentry>
<varlistentry>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-2.11/man/transactional-update.index.html
new/transactional-update-2.12/man/transactional-update.index.html
--- old/transactional-update-2.11/man/transactional-update.index.html
2018-11-13 15:19:45.000000000 +0100
+++ new/transactional-update-2.12/man/transactional-update.index.html
2019-01-28 19:45:21.000000000 +0100
@@ -15,4 +15,4 @@
h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink,
dt:hover > a.headerlink {
visibility: visible;
}
- </style><a xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.index.html">Index </a><span
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common" style="float:right">transactional-update
2.10</span><hr xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><div class="refentry"><a
name="transactional-update.index"></a><div class="titlepage"></div><div
class="refnamediv"><h2>Name</h2><p>transactional-update.index — List all
manpages from the transactional-update project</p></div><div
class="refsect1"><a name="id-1.4"></a><h2 id="T">T<a class="headerlink"
title="Permalink to this headline" href="#T">¶</a></h2><p><a
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common" href="transactional-update.8.html"><span
class="citerefentry"><span
class="refentrytitle">transactional-update</span>(8)</span></a> -- Apply
updates to the system in an atomic way via transactional updates.<br><a
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.conf.5.html"><span class="citerefentry"><span
class="refentrytitle">transactional-update.conf</span>(5)</span></a> --
transactional-update configuration file<br><a
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.service.8.html"><span class="citerefentry"><span
class="refentrytitle">transactional-update.service</span>(8)</span></a> --
Apply updates to the system in an atomic way via transactional updates.<br><a
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.timer.8.html"><span class="citerefentry"><span
class="refentrytitle">transactional-update.timer</span>(8)</span></a> -- Apply
updates to the system in an atomic way via transactional
updates.<br></p></div><div class="refsect1"><a name="id-1.5"></a><p><a
name="counts"></a>This index contains 4 entries, referring to 2 individual
manual pages.</p></div></div></body></html>
+ </style><a xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.index.html">Index </a><span
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common" style="float:right">transactional-update
2.11</span><hr xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><div class="refentry"><a
name="transactional-update.index"></a><div class="titlepage"></div><div
class="refnamediv"><h2>Name</h2><p>transactional-update.index — List all
manpages from the transactional-update project</p></div><div
class="refsect1"><a name="id-1.4"></a><h2 id="T">T<a class="headerlink"
title="Permalink to this headline" href="#T">¶</a></h2><p><a
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common" href="transactional-update.8.html"><span
class="citerefentry"><span
class="refentrytitle">transactional-update</span>(8)</span></a> -- Apply
updates to the system in an atomic way via transactional updates.<br><a
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.conf.5.html"><span class="citerefentry"><span
class="refentrytitle">transactional-update.conf</span>(5)</span></a> --
transactional-update configuration file<br><a
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.service.8.html"><span class="citerefentry"><span
class="refentrytitle">transactional-update.service</span>(8)</span></a> --
Apply updates to the system in an atomic way via transactional updates.<br><a
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.timer.8.html"><span class="citerefentry"><span
class="refentrytitle">transactional-update.timer</span>(8)</span></a> -- Apply
updates to the system in an atomic way via transactional
updates.<br></p></div><div class="refsect1"><a name="id-1.5"></a><p><a
name="counts"></a>This index contains 4 entries, referring to 2 individual
manual pages.</p></div></div></body></html>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-2.11/man/transactional-update.service.8.html
new/transactional-update-2.12/man/transactional-update.service.8.html
--- old/transactional-update-2.11/man/transactional-update.service.8.html
2018-11-13 15:19:44.000000000 +0100
+++ new/transactional-update-2.12/man/transactional-update.service.8.html
2019-01-28 19:45:21.000000000 +0100
@@ -15,7 +15,7 @@
h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink,
dt:hover > a.headerlink {
visibility: visible;
}
- </style><a xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.index.html">Index </a><span
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common" style="float:right">transactional-update
2.10</span><hr xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><div class="refentry"><a
name="transactional-update.8"></a><div class="titlepage"></div><div
class="refnamediv"><a name="name"></a><h2>Name</h2><p>transactional-update,
transactional-update.service, transactional-update.timer — Apply updates to the
system in an atomic way via transactional
+ </style><a xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.index.html">Index </a><span
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common" style="float:right">transactional-update
2.11</span><hr xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><div class="refentry"><a
name="transactional-update.8"></a><div class="titlepage"></div><div
class="refnamediv"><a name="name"></a><h2>Name</h2><p>transactional-update,
transactional-update.service, transactional-update.timer — Apply updates to the
system in an atomic way via transactional
updates.</p></div><div class="refsynopsisdiv"><a
name="synopsis"></a><h2>Synopsis</h2><div class="cmdsynopsis"><p><code
class="command">transactional-update</code> [<em
class="replaceable"><code>options</code></em>...] [<em
class="replaceable"><code>general-command</code></em>...] [<em
class="replaceable"><code>package-command</code></em>
[<em class="replaceable"><code>command-argument</code></em>...]
]</p></div><div class="cmdsynopsis"><p><code
class="command">transactional-update</code> [<em
class="replaceable"><code>options</code></em>...] <em
class="replaceable"><code>standalone-command</code></em>
</p></div><p>transactional-update.service</p><p>transactional-update.timer</p></div><div
class="refsect1"><a name="description"></a><h2 id="DESCRIPTION">DESCRIPTION<a
class="headerlink" title="Permalink to this headline"
href="#DESCRIPTION">¶</a></h2><p><span
class="command"><strong>transactional-update</strong></span> updates the system
@@ -103,6 +103,7 @@
daemon to reboot the system according to the configured policies. Else
<span class="command"><strong>systemctl reboot</strong></span> is
called.
</p></dd><dt id="shell"><span class="term"><code
class="option">shell</code></span><a class="headerlink" title="Permalink to
this term" href="#shell">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>
+ Opens a shell to execute commands like zypper manually.
After all actions are done, before the snapshot with the changes is
unmounted and switched to read-only, a shell is started in the new
snapshot as chroot environment for testing and debugging.
@@ -170,11 +171,15 @@
file system is set directly using <span
class="command"><strong>btrfs</strong></span>. On
read-write systems
<a href="http://snapper.io/manpages/snapper.html"><span
class="citerefentry"><span class="refentrytitle">snapper</span>(8)</span></a>
- <code class="option">rollback</code> is called. If no snapshot number
is given
- the current root file system is made the new default root file system.
- Otherwise the snapshot with <code class="option">number</code> is made
the
- new default root filesystem.
- </p></dd></dl></div></div></div><div class="refsect1"><a
name="options"></a><h2 id="OPTIONS">OPTIONS<a class="headerlink"
title="Permalink to this headline" href="#OPTIONS">¶</a></h2><div
class="variablelist"><dl class="variablelist"><dt id="--interactive"><span
class="term"><code class="option">--interactive</code>, </span><span
class="term"><code class="option">-i</code></span><a class="headerlink"
title="Permalink to this term" href="#--interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Ignores package command categorization,
calls zypper in interactive mode.</p></dd><dt id="--non-interactive"><span
class="term"><code class="option">--non-interactive</code>, </span><span
class="term"><code class="option">-n</code></span><a class="headerlink"
title="Permalink to this term" href="#--non-interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Ignores package command categorization,
calls zypper in non-interactive mode.</p></dd><dt id="--no-selfupdate"><span
class="term"><code class="option">--no-selfupdate</code></span><a
class="headerlink" title="Permalink to this term"
href="#--no-selfupdate">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Skip checking for newer
transactional-update versions.</p></dd><dt id="--quiet"><span
class="term"><code class="option">--quiet</code></span><a class="headerlink"
title="Permalink to this term" href="#--quiet">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Don't print warnings and informational
messages to stdout.</p></dd><dt id="--help"><span class="term"><code
class="option">--help</code>, </span><span class="term"><code
class="option">-h</code></span><a class="headerlink" title="Permalink to this
term" href="#--help">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Display help and exit</p></dd><dt
id="--version"><span class="term"><code
class="option">--version</code></span><a class="headerlink" title="Permalink to
this term" href="#--version">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Output version information and
exit</p></dd></dl></div></div><div class="refsect1"><a name="important"></a><h2
id="IMPORTANT">IMPORTANT<a class="headerlink" title="Permalink to this
headline" href="#IMPORTANT">¶</a></h2><p>
+ <code class="option">rollback</code> is called.
+ </p><p>
+ If no snapshot number is given, the current root file system is set as
+ the new default root file system.
+ Otherwise <em class="replaceable"><code>number</code></em> can either
be a snapshot
+ number (as displayed by <span class="command"><strong>snapper
list</strong></span>) or the word
+ <code class="option">last</code>. <code class="option">last</code> will
try to reset to the
+ latest working snapshot.
+ </p></dd></dl></div></div></div><div class="refsect1"><a
name="options"></a><h2 id="OPTIONS">OPTIONS<a class="headerlink"
title="Permalink to this headline" href="#OPTIONS">¶</a></h2><div
class="variablelist"><dl class="variablelist"><dt id="--interactive"><span
class="term"><code class="option">--interactive</code>, </span><span
class="term"><code class="option">-i</code></span><a class="headerlink"
title="Permalink to this term" href="#--interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Calls zypper in interactive mode, even
if the default for this command is non-interactive.</p></dd><dt
id="--non-interactive"><span class="term"><code
class="option">--non-interactive</code>, </span><span class="term"><code
class="option">-n</code></span><a class="headerlink" title="Permalink to this
term" href="#--non-interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Calls zypper in non-interactive mode,
even if the default for this command is interactive.</p></dd><dt
id="--no-selfupdate"><span class="term"><code
class="option">--no-selfupdate</code></span><a class="headerlink"
title="Permalink to this term" href="#--no-selfupdate">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Skip checking for newer
transactional-update versions.</p></dd><dt id="--quiet"><span
class="term"><code class="option">--quiet</code></span><a class="headerlink"
title="Permalink to this term" href="#--quiet">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Don't print warnings and informational
messages to stdout.</p></dd><dt id="--help"><span class="term"><code
class="option">--help</code>, </span><span class="term"><code
class="option">-h</code></span><a class="headerlink" title="Permalink to this
term" href="#--help">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Display help and exit</p></dd><dt
id="--version"><span class="term"><code
class="option">--version</code></span><a class="headerlink" title="Permalink to
this term" href="#--version">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Output version information and
exit</p></dd></dl></div></div><div class="refsect1"><a name="important"></a><h2
id="IMPORTANT">IMPORTANT<a class="headerlink" title="Permalink to this
headline" href="#IMPORTANT">¶</a></h2><p>
Only RPMs which are fully part of the root filesystem and
/etc can be updated. There is also
limited handling for adding files and directories to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-2.11/man/transactional-update.timer.8.html
new/transactional-update-2.12/man/transactional-update.timer.8.html
--- old/transactional-update-2.11/man/transactional-update.timer.8.html
2018-11-13 15:19:44.000000000 +0100
+++ new/transactional-update-2.12/man/transactional-update.timer.8.html
2019-01-28 19:45:21.000000000 +0100
@@ -15,7 +15,7 @@
h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink,
dt:hover > a.headerlink {
visibility: visible;
}
- </style><a xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.index.html">Index </a><span
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common" style="float:right">transactional-update
2.10</span><hr xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><div class="refentry"><a
name="transactional-update.8"></a><div class="titlepage"></div><div
class="refnamediv"><a name="name"></a><h2>Name</h2><p>transactional-update,
transactional-update.service, transactional-update.timer — Apply updates to the
system in an atomic way via transactional
+ </style><a xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"
href="transactional-update.index.html">Index </a><span
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common" style="float:right">transactional-update
2.11</span><hr xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><div class="refentry"><a
name="transactional-update.8"></a><div class="titlepage"></div><div
class="refnamediv"><a name="name"></a><h2>Name</h2><p>transactional-update,
transactional-update.service, transactional-update.timer — Apply updates to the
system in an atomic way via transactional
updates.</p></div><div class="refsynopsisdiv"><a
name="synopsis"></a><h2>Synopsis</h2><div class="cmdsynopsis"><p><code
class="command">transactional-update</code> [<em
class="replaceable"><code>options</code></em>...] [<em
class="replaceable"><code>general-command</code></em>...] [<em
class="replaceable"><code>package-command</code></em>
[<em class="replaceable"><code>command-argument</code></em>...]
]</p></div><div class="cmdsynopsis"><p><code
class="command">transactional-update</code> [<em
class="replaceable"><code>options</code></em>...] <em
class="replaceable"><code>standalone-command</code></em>
</p></div><p>transactional-update.service</p><p>transactional-update.timer</p></div><div
class="refsect1"><a name="description"></a><h2 id="DESCRIPTION">DESCRIPTION<a
class="headerlink" title="Permalink to this headline"
href="#DESCRIPTION">¶</a></h2><p><span
class="command"><strong>transactional-update</strong></span> updates the system
@@ -103,6 +103,7 @@
daemon to reboot the system according to the configured policies. Else
<span class="command"><strong>systemctl reboot</strong></span> is
called.
</p></dd><dt id="shell"><span class="term"><code
class="option">shell</code></span><a class="headerlink" title="Permalink to
this term" href="#shell">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>
+ Opens a shell to execute commands like zypper manually.
After all actions are done, before the snapshot with the changes is
unmounted and switched to read-only, a shell is started in the new
snapshot as chroot environment for testing and debugging.
@@ -170,11 +171,15 @@
file system is set directly using <span
class="command"><strong>btrfs</strong></span>. On
read-write systems
<a href="http://snapper.io/manpages/snapper.html"><span
class="citerefentry"><span class="refentrytitle">snapper</span>(8)</span></a>
- <code class="option">rollback</code> is called. If no snapshot number
is given
- the current root file system is made the new default root file system.
- Otherwise the snapshot with <code class="option">number</code> is made
the
- new default root filesystem.
- </p></dd></dl></div></div></div><div class="refsect1"><a
name="options"></a><h2 id="OPTIONS">OPTIONS<a class="headerlink"
title="Permalink to this headline" href="#OPTIONS">¶</a></h2><div
class="variablelist"><dl class="variablelist"><dt id="--interactive"><span
class="term"><code class="option">--interactive</code>, </span><span
class="term"><code class="option">-i</code></span><a class="headerlink"
title="Permalink to this term" href="#--interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Ignores package command categorization,
calls zypper in interactive mode.</p></dd><dt id="--non-interactive"><span
class="term"><code class="option">--non-interactive</code>, </span><span
class="term"><code class="option">-n</code></span><a class="headerlink"
title="Permalink to this term" href="#--non-interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Ignores package command categorization,
calls zypper in non-interactive mode.</p></dd><dt id="--no-selfupdate"><span
class="term"><code class="option">--no-selfupdate</code></span><a
class="headerlink" title="Permalink to this term"
href="#--no-selfupdate">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Skip checking for newer
transactional-update versions.</p></dd><dt id="--quiet"><span
class="term"><code class="option">--quiet</code></span><a class="headerlink"
title="Permalink to this term" href="#--quiet">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Don't print warnings and informational
messages to stdout.</p></dd><dt id="--help"><span class="term"><code
class="option">--help</code>, </span><span class="term"><code
class="option">-h</code></span><a class="headerlink" title="Permalink to this
term" href="#--help">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Display help and exit</p></dd><dt
id="--version"><span class="term"><code
class="option">--version</code></span><a class="headerlink" title="Permalink to
this term" href="#--version">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Output version information and
exit</p></dd></dl></div></div><div class="refsect1"><a name="important"></a><h2
id="IMPORTANT">IMPORTANT<a class="headerlink" title="Permalink to this
headline" href="#IMPORTANT">¶</a></h2><p>
+ <code class="option">rollback</code> is called.
+ </p><p>
+ If no snapshot number is given, the current root file system is set as
+ the new default root file system.
+ Otherwise <em class="replaceable"><code>number</code></em> can either
be a snapshot
+ number (as displayed by <span class="command"><strong>snapper
list</strong></span>) or the word
+ <code class="option">last</code>. <code class="option">last</code> will
try to reset to the
+ latest working snapshot.
+ </p></dd></dl></div></div></div><div class="refsect1"><a
name="options"></a><h2 id="OPTIONS">OPTIONS<a class="headerlink"
title="Permalink to this headline" href="#OPTIONS">¶</a></h2><div
class="variablelist"><dl class="variablelist"><dt id="--interactive"><span
class="term"><code class="option">--interactive</code>, </span><span
class="term"><code class="option">-i</code></span><a class="headerlink"
title="Permalink to this term" href="#--interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Calls zypper in interactive mode, even
if the default for this command is non-interactive.</p></dd><dt
id="--non-interactive"><span class="term"><code
class="option">--non-interactive</code>, </span><span class="term"><code
class="option">-n</code></span><a class="headerlink" title="Permalink to this
term" href="#--non-interactive">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Calls zypper in non-interactive mode,
even if the default for this command is interactive.</p></dd><dt
id="--no-selfupdate"><span class="term"><code
class="option">--no-selfupdate</code></span><a class="headerlink"
title="Permalink to this term" href="#--no-selfupdate">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Skip checking for newer
transactional-update versions.</p></dd><dt id="--quiet"><span
class="term"><code class="option">--quiet</code></span><a class="headerlink"
title="Permalink to this term" href="#--quiet">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Don't print warnings and informational
messages to stdout.</p></dd><dt id="--help"><span class="term"><code
class="option">--help</code>, </span><span class="term"><code
class="option">-h</code></span><a class="headerlink" title="Permalink to this
term" href="#--help">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Display help and exit</p></dd><dt
id="--version"><span class="term"><code
class="option">--version</code></span><a class="headerlink" title="Permalink to
this term" href="#--version">¶</a></dt><dd
xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
xmlns:exsl="http://exslt.org/common"><p>Output version information and
exit</p></dd></dl></div></div><div class="refsect1"><a name="important"></a><h2
id="IMPORTANT">IMPORTANT<a class="headerlink" title="Permalink to this
headline" href="#IMPORTANT">¶</a></h2><p>
Only RPMs which are fully part of the root filesystem and
/etc can be updated. There is also
limited handling for adding files and directories to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-2.11/sbin/transactional-update.in
new/transactional-update-2.12/sbin/transactional-update.in
--- old/transactional-update-2.11/sbin/transactional-update.in 2018-11-13
17:35:03.000000000 +0100
+++ new/transactional-update-2.12/sbin/transactional-update.in 2019-02-04
13:38:55.000000000 +0100
@@ -47,6 +47,7 @@
LOGFILE="/var/log/transactional-update.log"
STATE_FILE="/var/lib/misc/transactional-update.state"
NEW_SNAPSHOT_FLAG="/var/lib/overlay/transactional-update.newsnapshot"
+NEEDS_RESTARTING_FILE="/var/run/reboot-needed"
ZYPPER_AUTO_IMPORT_KEYS=0
ETC_OVERLAY_PATTERN='^[^[:space:]]\+[[:space:]]\+\/etc[[:space:]]\+overlay[[:space:]]\+\([^[:space:]]*,\|\)workdir=\/sysroot\/var\/lib\/overlay\/work-etc[,[:space:]]'
@@ -59,7 +60,7 @@
fi
# Initialize internal variables
-HAS_SEPARATE_ETC=0
+ETC_IS_OVERLAY=0
HAS_SEPARATE_VAR=0
VAR_CACHE_CLEANUP=0
FORCE_NONINTERACTIVE=""
@@ -120,7 +121,7 @@
echo "reboot Reboot after update"
echo ""
echo "Package Commands:"
- echo "dup Call 'zypper dup --no-allow-vendor-change'
(n)"
+ echo "dup Call 'zypper dup' (n)"
echo "up Call 'zypper up' (n)"
echo "patch Call 'zypper patch' (n)"
echo "migration Updates systems registered via SCC / SMT (i)"
@@ -130,7 +131,8 @@
echo "Defaults: (i) interactive command; (n) non-interactive command"
echo ""
echo "Standalone Commands:"
- echo "rollback <number> Set given snapshot as default snapshot"
+ echo "rollback [<number>] Set the current or given snapshot as default
snapshot"
+ echo "rollback last Set the last working snapshot as default
snapshot"
echo ""
echo "Options:"
echo "--interactive, -i Use interactive mode for package command"
@@ -230,6 +232,7 @@
fi
if [ -n "${ETC_OVERLAY_DIR}" ] ; then
log_error "Removing overlay directory ${ETC_OVERLAY_DIR%/*}..."
+ umount "${ETC_OVERLAY_DIR}"
rm -rf "${ETC_OVERLAY_DIR%/*}" |& tee -a ${LOGFILE}
fi
if [ $USE_SALT_GRAINS -eq 1 ]; then
@@ -383,36 +386,36 @@
}
check_registration_on_next_reboot() {
- if [ ${HAS_SEPARATE_VAR} -eq 0 ]; then
- # /var own subvolume, not mounted during update, so touch the
- # file in the running system.
- test -d /var/lib/rollback || mkdir -p /var/lib/rollback
- touch /var/lib/rollback/check-registration
- else
- # check if /var/lib/rollback is own subvolume
- grep -q "[[:space:]]/var/lib/rollback[[:space:]]" /proc/mounts
- if [ $? -eq 0 ]; then
- # Extra subvolume, not mounted in chroot, touch outside.
- touch /var/lib/rollback/check-registration
- else
- # no subvolumes,
- test -d ${MOUNT_DIR}/var/lib/rollback || mkdir -p
${MOUNT_DIR}/var/lib/rollback
- touch ${MOUNT_DIR}/var/lib/rollback/check-registration
- fi
+ local VARDIR="/var/lib/rollback"
+ # If VARDIR is part of the root file system (usually on rw systems), then
+ # create the file in the new snapshot
+ if [ "$(findmnt --noheadings --output TARGET --target "${VARDIR}")" = "/"
]; then
+ VARDIR="${MOUNT_DIR}/${VARDIR}"
fi
+ test -d "${VARDIR}" || mkdir -p "${VARDIR}"
+ touch "${VARDIR}/check-registration"
}
get_etc_overlay_from() {
- local fstab="$1"
- local overlay_options="`sed -n "/${ETC_OVERLAY_PATTERN}/p" "${fstab}" |
cut -d ' ' -f 4`"
+ local overlay_options
local option lowerdir overlay_id
+ fstab=""
fstab_active_lowerdirs=()
fstab_lowerdirs=()
fstab_upper=""
fstab_oldest_active_snapshot=""
fstab_otheroptions=""
+ # Check for /etc overlay
+ for fstab in "$1"/etc/fstab{,.sys}; do
+ if [ -e "$fstab" ] ; then
+ overlay_options="`awk '$2 == "/etc" && $3 == "overlay" && $4 ~
"workdir=/sysroot/var/lib/overlay/work-etc" { print $4 }' "$fstab"`"
+ [ -n "${overlay_options}" ] && break
+ fi
+ done
+ [ -n "${overlay_options}" ] || return
+
for option in `echo ${overlay_options} | tr ',' ' '`; do
case "${option%=*}" in
upperdir)
@@ -423,8 +426,8 @@
overlay_id=`echo "${lowerdir#/sysroot}" | sed -n
's#^/var/lib/overlay/\([[:digit:]]\+\)/etc$#\1#p'`
# Special handling for old overlay location
- if [ "${lowerdir}" = "/var/lib/overlay/etc" ]; then
- if [ "${fstab_lowerdirs[@]}" =
"${fstab_active_lowerdirs[@]}" ]; then
+ if [ "${lowerdir}" = "/sysroot/var/lib/overlay/etc" ]; then
+ if [ "${fstab_lowerdirs[*]}" =
"${fstab_active_lowerdirs[*]}" ]; then
fstab_active_lowerdirs+=("${lowerdir}")
fi
# Add common directories and directories of existing
snapshots
@@ -440,6 +443,8 @@
;;
workdir)
;;
+ x-systemd.requires-mounts-for|x-initrd.mount)
+ ;;
*)
fstab_otheroptions="${fstab_otheroptions}${option},"
;;
@@ -451,21 +456,21 @@
# Sync /etc mount contents to target directory
sync_etc() {
log_info "Syncing /etc of oldest snapshot $1 as base into new snapshot $2"
- get_etc_overlay_from "$1"/etc/fstab.sys
+ get_etc_overlay_from "$1"
fstab_lowerdirs=("${fstab_lowerdirs[@]///sysroot\/var//var}")
mount_opts="defaults,"
mount_opts+="lowerdir=${fstab_upper#/sysroot}:"
mount_opts+="`echo ${fstab_lowerdirs[@]///sysroot/$1} | tr ' ' ':'`"
mount -t overlay overlay "${ETC_OVERLAY_DIR}" -o ${mount_opts}
if [ $? -ne 0 ]; then
- log_error "ERROR: mount of old overlay stack from $1 failed!"
- quit 1
+ log_error "ERROR: mount of old overlay stack from $1 failed!"
+ quit 1
fi
- rsync --archive --xattrs --acls --delete --quiet "${ETC_OVERLAY_DIR}" "$2"
+ rsync --archive --inplace --xattrs --filter='-x security.selinux' --acls
--delete --quiet "${ETC_OVERLAY_DIR}" "$2"
if [ $? -ne 0 ]; then
- log_error "ERROR: syncing $1 into snapshot $2 failed!"
- quit 1
+ log_error "ERROR: syncing $1 into snapshot $2 failed!"
+ quit 1
fi
umount "${ETC_OVERLAY_DIR}"
}
@@ -489,7 +494,7 @@
;;
dup)
DO_DUP=1
- ZYPPER_ARG="--no-cd dup --no-allow-vendor-change"
+ ZYPPER_ARG="--no-cd dup"
shift
;;
up|patch)
@@ -691,7 +696,7 @@
fi
fi
-if [ -n "${ZYPPER_ARG}" -a ${ZYPPER_AUTO_IMPORT_KEYS} -eq 1 ]; then
+if [ -n "${ZYPPER_ARG}" -a "${DO_MIGRATION}" -eq 0 -a
${ZYPPER_AUTO_IMPORT_KEYS} -eq 1 ]; then
ZYPPER_ARG="--gpg-auto-import-keys ${ZYPPER_ARG}"
fi
@@ -699,18 +704,22 @@
DEFAULT_SNAPSHOT_ID=`btrfs subvolume get-default / | sed -e
's|.*.snapshots/\(.*\)/snapshot|\1|g'`
RO_ROOT=`btrfs property get / ro | sed -e 's|ro=||'`
-if [ -e "/.snapshots/${CURRENT_SNAPSHOT_ID}/snapshot/etc/fstab.sys" ]; then
- get_etc_overlay_from
"/.snapshots/${CURRENT_SNAPSHOT_ID}/snapshot/etc/fstab.sys"
- if [ -n "$fstab_upper" ]; then
- log_info "Separate /etc detected."
- HAS_SEPARATE_ETC=1
- fi
+get_etc_overlay_from "/.snapshots/${CURRENT_SNAPSHOT_ID}/snapshot"
+if [ -n "$fstab_upper" ]; then
+ log_info "/etc on overlayfs detected."
+ ETC_IS_OVERLAY=1
fi
if [ ${DO_ROLLBACK} -eq 1 ]; then
NEED_REBOOT_WARNING=1
- if [ ${ROLLBACK_SNAPSHOT} -eq 0 ]; then
+ if [ "${ROLLBACK_SNAPSHOT}" = "last" ]; then
+ if [ -n "${LAST_WORKING_SNAPSHOTS}" ]; then
+ ROLLBACK_SNAPSHOT=${LAST_WORKING_SNAPSHOTS%% *}
+ else
+ log_error "No last working snapshot saved; please use 'snapper
list' for manual selection"
+ fi
+ elif [ ${ROLLBACK_SNAPSHOT} -eq 0 -o ${ROLLBACK_SNAPSHOT} -eq
${CURRENT_SNAPSHOT_ID} ]; then
ROLLBACK_SNAPSHOT=${CURRENT_SNAPSHOT_ID}
NEED_REBOOT_WARNING=0
fi
@@ -734,6 +743,10 @@
fi
# Remove possible cleanup algo
snapper ${SNAPPER_NO_DBUS} modify -c '' ${ROLLBACK_SNAPSHOT}
+
+ if [ ${NEED_REBOOT_WARNING} -eq 0 ]; then
+ rm -f "${NEEDS_RESTARTING_FILE}"
+ fi
else
snapper rollback ${ROLLBACK_SNAPSHOT}
NEED_REBOOT_WARNING=1
@@ -814,12 +827,14 @@
fi
# Clean up old unused overlays
- for overlay in /var/lib/overlay/[0-9]* /var/lib/overlay; do
- if ! grep -q "${overlay}/etc" /.snapshots/*/snapshot/etc/fstab.sys; then
- log_info "Deleting unused overlay ${overlay}"
- rm -rf "${overlay}"
- fi
- done
+ if [ ${RO_ROOT} == "true" ]; then
+ for overlay in /var/lib/overlay/[0-9]* /var/lib/overlay; do
+ if ! grep -q "${overlay}/etc"
/.snapshots/*/snapshot/etc/fstab{,.sys}; then
+ log_info "Deleting unused overlay ${overlay}"
+ rm -rf "${overlay}"
+ fi
+ done
+ fi
fi
if [ -n "${ZYPPER_ARG}" -o ${REWRITE_GRUB_CFG} -eq 1 \
@@ -837,7 +852,7 @@
# Check if there are updates at all. Don't check if we do
# a registration, as this can change the zypper result.
if [ -n "${ZYPPER_ARG}" -a -n "${ZYPPER_NONINTERACTIVE}" \
- -a ${DO_REGISTRATION} -eq 0 ]; then
+ -a ${DO_REGISTRATION} -eq 0 -a ${DO_MIGRATION} -eq 0 ]; then
TMPFILE=`mktemp /tmp/transactional-update.XXXXXXXXXX`
zypper --xml ${ZYPPER_ARG} ${ZYPPER_NONINTERACTIVE} --dry-run
"${ZYPPER_ARG_PKGS[@]}" > ${TMPFILE}
@@ -888,7 +903,7 @@
quit 1
fi
- if [ ${HAS_SEPARATE_ETC} -eq 1 ]; then
+ if [ ${ETC_IS_OVERLAY} -eq 1 ]; then
# Create new /etc overlay for snapshot
ETC_OVERLAY_DIR="/var/lib/overlay/${SNAPSHOT_ID}/etc"
ETC_OVERLAY_WORK_DIR="${ETC_OVERLAY_DIR}-work"
@@ -896,14 +911,45 @@
# Copy the contents of oldest /etc layer into snapshot
sync_etc "${fstab_oldest_active_snapshot}" "${SNAPSHOT_DIR}"
+ get_etc_overlay_from "/.snapshots/${CURRENT_SNAPSHOT_ID}/snapshot"
+
+ # Special handling /etc/fstab{.sys}: dracut needs the *current* version
+ # of the files in the snapshot, as the overlay is not yet mounted
+ # during early boot - in fact the files are required to be able to
+ # mount the overlays
+ cp /etc/fstab "${SNAPSHOT_DIR}/etc"
+ cp -a /etc/fstab.sys "${SNAPSHOT_DIR}/etc"
+
+ # Migrate fstab.sys' /var and overlay entries to regular fstab
+ if [ -e "${SNAPSHOT_DIR}/etc/fstab.sys" ] && grep -qE "^overlay /etc"
"${SNAPSHOT_DIR}/etc/fstab.sys"; then
+ awk '$3 == "overlay" && $4 ~ /=\/sysroot\/var\/lib\/overlay/'
"${SNAPSHOT_DIR}/etc/fstab.sys" >> "${SNAPSHOT_DIR}/etc/fstab"
+ # Remove /etc, /var and /var/lib/overlay (legacy) from fstab.sys
+ gawk -i inplace '$2 != "/etc" && $2 != "/var" && $2 !=
"/var/lib/overlay" &&
+ ($3 != "overlay" || $4 !~ /=\/sysroot\/var\/lib\/overlay\//)'
"${SNAPSHOT_DIR}/etc/fstab.sys"
+ # Append x-initrd.mount to /var mount options (bsc#1121279)
+ gawk -i inplace '$2 == "/var" || $2 == "/var/lib/overlay" { $4 =
$4",x-initrd.mount"; } 1' "${SNAPSHOT_DIR}/etc/fstab"
+ gawk -i inplace '$3 == "overlay" && $4 ~
"=/sysroot/var/lib/overlay/" { $4 =
$4",x-systemd.requires-mounts-for=/var,x-systemd.requires-mounts-for=/var/lib/overlay,x-systemd.requires-mounts-for=/sysroot/var,x-systemd.requires-mounts-for=/sysroot/var/lib/overlay,x-initrd.mount";
} 1' "${SNAPSHOT_DIR}/etc/fstab"
+ fi
- # Update fstab.sys entries for /etc overlays
- get_etc_overlay_from
"/.snapshots/${CURRENT_SNAPSHOT_ID}/snapshot/etc/fstab.sys"
+ # Update fstab{,.sys} entries for /etc overlays
fstab_line="overlay /etc overlay ${fstab_otheroptions}"
fstab_line+="lowerdir=${fstab_upper}:`echo ${fstab_active_lowerdirs[@]}
| tr ' ' ':'`,"
fstab_line+="upperdir=/sysroot${ETC_OVERLAY_DIR},"
- fstab_line+="workdir=/sysroot/var/lib/overlay/work-etc 0 0"
- sed -i "/${ETC_OVERLAY_PATTERN}/c ${fstab_line}"
"${SNAPSHOT_DIR}/etc/fstab.sys"
+ fstab_line+="workdir=/sysroot/var/lib/overlay/work-etc,"
+ fstab_line+="x-systemd.requires-mounts-for=/var,"
+ fstab_line+="x-systemd.requires-mounts-for=/var/lib/overlay,"
+ fstab_line+="x-systemd.requires-mounts-for=/sysroot/var,"
+ fstab_line+="x-systemd.requires-mounts-for=/sysroot/var/lib/overlay,"
+ fstab_line+="x-initrd.mount 0 0"
+ sed -i "/${ETC_OVERLAY_PATTERN}/c ${fstab_line}"
"${SNAPSHOT_DIR}/etc/fstab"
+
+ # Prettify fstab
+ gawk -i inplace 'NR==FNR { for(i=1;i<=NF;i++) { len=length($i);
collen[i]=collen[i]>len?collen[i]:(len>42?42:len); } print }
+ NR!=FNR { for(i=1;i<=NF;i++) { printf("%-"collen[i]"s ", $i); }
print ""}' "${SNAPSHOT_DIR}/etc/fstab" "${SNAPSHOT_DIR}/etc/fstab"
+
+ # Make the diff visible to the admin by copying /etc/fstab into the
+ # overlay (dracut itself wouldn't need it)
+ cp "${SNAPSHOT_DIR}/etc/fstab" "${ETC_OVERLAY_DIR}"
fi
# Remember all snapshots we create for update. If transactional-update is
@@ -952,7 +998,7 @@
log_error "ERROR: mount of sys failed!"
quit 1
fi
- if [ ${HAS_SEPARATE_ETC} -eq 1 ]; then
+ if [ ${ETC_IS_OVERLAY} -eq 1 ]; then
etc_opts="defaults,"
etc_opts+="lowerdir=/etc,"
etc_opts+="upperdir=${ETC_OVERLAY_DIR},"
@@ -1152,6 +1198,7 @@
quit ${EXITCODE}
elif [ $REBOOT_AFTERWARDS -eq 0 ]; then
echo "Please reboot your machine to activate the changes and avoid data
loss."
+ touch "${NEEDS_RESTARTING_FILE}"
fi
fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-2.11/systemd/transactional-update.timer
new/transactional-update-2.12/systemd/transactional-update.timer
--- old/transactional-update-2.11/systemd/transactional-update.timer
2018-01-05 10:07:35.000000000 +0100
+++ new/transactional-update-2.12/systemd/transactional-update.timer
2019-01-28 19:16:31.000000000 +0100
@@ -7,7 +7,7 @@
OnCalendar=daily
AccuracySec=1m
RandomizedDelaySec=2h
-Persistent=true
+#Persistent=true
[Install]
WantedBy=timers.target