The systemd unit file unattended-upgrades.service is used to stop a running unattended-upgrade
process during shutdown. This unit file is running together with all filesystem
unmount services.
The unattended-upgrades service checks if the lockfile for unattended-upgrade
(in /var/run) exists, and if it does, there is an unattended-upgrade in progress
and the service will wait until it finishes (and therefore automatically wait at
shutdown).
However, if /var is a separate filesystem, it will get unmounted even though /var/run
is a tmpfs that's still mounted on top of the /var/run directory in the /var filesystem.
The unattended-upgrade script will fail to find lockfile, sleeps for 5 seconds, and
tries to check the lockfile again. After 10 minutes (the default timeout), it will finally
exit and the system will continue shutdown.
The problem is the error handling in /usr/share/unattended-upgrades/unattended-upgrade-shutdown
where it tries to lock itself:
while True:
res = apt_pkg.get_lock(options.lock_file) logging.debug("get_lock returned %i" % res)
# exit here if there is no lock
if res > 0: logging.debug("lock not taken")
break lock_was_taken = True
The function apt_pkg.get_lock() either returns a file descriptor, or -1 on an error.
File descriptors are just C file descriptors, so they are always positive integers.
The code should check the result to be negative, not positive. I have attached a patch
to reverse the logic.
The systemd unit file unattended- upgrades. service is used to stop a running unattended-upgrade
process during shutdown. This unit file is running together with all filesystem
unmount services.
The unattended-upgrades service checks if the lockfile for unattended-upgrade
(in /var/run) exists, and if it does, there is an unattended-upgrade in progress
and the service will wait until it finishes (and therefore automatically wait at
shutdown).
However, if /var is a separate filesystem, it will get unmounted even though /var/run
is a tmpfs that's still mounted on top of the /var/run directory in the /var filesystem.
The unattended-upgrade script will fail to find lockfile, sleeps for 5 seconds, and
tries to check the lockfile again. After 10 minutes (the default timeout), it will finally
exit and the system will continue shutdown.
The problem is the error handling in /usr/share/ unattended- upgrades/ unattended- upgrade- shutdown
where it tries to lock itself:
while True: get_lock( options. lock_file)
logging. debug(" get_lock returned %i" % res)
logging. debug(" lock not taken")
lock_was_ taken = True
res = apt_pkg.
# exit here if there is no lock
if res > 0:
break
The function apt_pkg.get_lock() either returns a file descriptor, or -1 on an error.
File descriptors are just C file descriptors, so they are always positive integers.
The code should check the result to be negative, not positive. I have attached a patch
to reverse the logic.
Additional information:
1)
Description: Ubuntu 16.04.1 LTS
Release: 16.04
2) upgrades: nl.archive. ubuntu. com/ubuntu xenial-updates/main amd64 Packages nl.archive. ubuntu. com/ubuntu xenial-updates/main i386 Packages dpkg/status nl.archive. ubuntu. com/ubuntu xenial/main amd64 Packages nl.archive. ubuntu. com/ubuntu xenial/main i386 Packages
unattended-
Installed: 0.90ubuntu0.3
Candidate: 0.90ubuntu0.3
Version table:
*** 0.90ubuntu0.3 500
500 http://
500 http://
100 /var/lib/
0.90 500
500 http://
500 http://
3)
Fast reboot
4)
Very slow reboot (after a 10 minutes timeout)