Unattended upgrades?

Commissario
Joined
16 Oct 2002
Posts
343,154
Location
In the radio shack
I have unattended-upgrades installed on a Pi but whenever I do the dry-run thing, it always tells me there's nothing to do.

Looking at /etc/apt/apt.conf.d/50unattended-upgrades, I'm not actually sure it's doing anything really.

Code:
// Unattended-Upgrade::Origins-Pattern controls which packages are
// upgraded.
//
// Lines below have the format format is "keyword=value,...".  A
// package will be upgraded only if the values in its metadata match
// all the supplied keywords in a line.  (In other words, omitted
// keywords are wild cards.) The keywords originate from the Release
// file, but several aliases are accepted.  The accepted keywords are:
//   a,archive,suite (eg, "stable")
//   c,component     (eg, "main", "contrib", "non-free")
//   l,label         (eg, "Debian", "Debian-Security")
//   o,origin        (eg, "Debian", "Unofficial Multimedia Packages")
//   n,codename      (eg, "jessie", "jessie-updates")
//     site          (eg, "http.debian.net")
// The available values on the system are printed by the command
// "apt-cache policy", and can be debugged by running
// "unattended-upgrades -d" and looking at the log file.
//
// Within lines unattended-upgrades allows 2 macros whose values are
// derived from /etc/debian_version:
//   ${distro_id}            Installed origin.
//   ${distro_codename}      Installed codename (eg, "buster")
Unattended-Upgrade::Origins-Pattern {
        // Codename based matching:
        // This will follow the migration of a release through different
        // archives (e.g. from testing to stable and later oldstable).
        // Software will be the latest available for the named release,
        // but the Debian release itself will not be automatically upgraded.
//      "origin=Debian,codename=${distro_codename}-updates";
//      "origin=Debian,codename=${distro_codename}-proposed-updates";
        "origin=Debian,codename=${distro_codename},label=Debian";
        "origin=Debian,codename=${distro_codename},label=Debian-Security";

        // Archive or Suite based matching:
        // Note that this will silently match a different release after
        // migration to the specified archive (e.g. testing becomes the
        // new stable).
//      "o=Debian,a=stable";
//      "o=Debian,a=stable-updates";
//      "o=Debian,a=proposed-updates";
//      "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports";
};

// Python regular expressions, matching packages to exclude from upgrading
Unattended-Upgrade::Package-Blacklist {
    // The following matches all packages starting with linux-
//  "linux-";

    // Use $ to explicitely define the end of a package name. Without
    // the $, "libc6" would match all of them.
//  "libc6$";
//  "libc6-dev$";
//  "libc6-i686$";

    // Special characters need escaping
//  "libstdc\+\+6$";

    // The following matches packages like xen-system-amd64, xen-utils-4.1,
    // xenstore-utils and libxenstore3.0
//  "(lib)?xen(store)?";

    // For more information about Python regular expressions, see
    // https://docs.python.org/3/howto/regex.html
};

// This option allows you to control if on a unclean dpkg exit
// unattended-upgrades will automatically run 
//   dpkg --force-confold --configure -a
// The default is true, to ensure updates keep getting installed
//Unattended-Upgrade::AutoFixInterruptedDpkg "true";

// Split the upgrade into the smallest possible chunks so that
// they can be interrupted with SIGTERM. This makes the upgrade
// a bit slower but it has the benefit that shutdown while a upgrade
// is running is possible (with a small delay)
//Unattended-Upgrade::MinimalSteps "true";

// Install all updates when the machine is shutting down
// instead of doing it in the background while the machine is running.
// This will (obviously) make shutdown slower.
// Unattended-upgrades increases logind's InhibitDelayMaxSec to 30s.
// This allows more time for unattended-upgrades to shut down gracefully
// or even install a few packages in InstallOnShutdown mode, but is still a
// big step back from the 30 minutes allowed for InstallOnShutdown previously.
// Users enabling InstallOnShutdown mode are advised to increase
// InhibitDelayMaxSec even further, possibly to 30 minutes.
//Unattended-Upgrade::InstallOnShutdown "false";

// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. A package that provides
// 'mailx' must be installed. E.g. "[email protected]"
//Unattended-Upgrade::Mail "";

// Set this value to "true" to get emails only on errors. Default
// is to always send a mail if Unattended-Upgrade::Mail is set
//Unattended-Upgrade::MailOnlyOnError "false";

// Remove unused automatically installed kernel-related packages
// (kernel images, kernel headers and kernel version locked tools).
//Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

// Do automatic removal of newly unused dependencies after the upgrade
//Unattended-Upgrade::Remove-New-Unused-Dependencies "true";

// Do automatic removal of unused packages after the upgrade
// (equivalent to apt-get autoremove)
//Unattended-Upgrade::Remove-Unused-Dependencies "false";

// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
//Unattended-Upgrade::Automatic-Reboot "false";

// Automatically reboot even if there are users currently logged in
// when Unattended-Upgrade::Automatic-Reboot is set to true
Unattended-Upgrade::Automatic-Reboot-WithUsers "true";

// If automatic reboot is enabled and needed, reboot at the specific
// time instead of immediately
//  Default: "now"
Unattended-Upgrade::Automatic-Reboot-Time "02:00";

// Use apt bandwidth limit feature, this example limits the download
// speed to 70kb/sec
//Acquire::http::Dl-Limit "70";

// Enable logging to syslog. Default is False
// Unattended-Upgrade::SyslogEnable "false";

// Specify syslog facility. Default is daemon
// Unattended-Upgrade::SyslogFacility "daemon";

// Download and install upgrades only on AC power
// (i.e. skip or gracefully stop updates on battery)
// Unattended-Upgrade::OnlyOnACPower "true";

// Download and install upgrades only on non-metered connection
// (i.e. skip or gracefully stop updates on a metered connection)
// Unattended-Upgrade::Skip-Updates-On-Metered-Connections "true";

// Verbose logging
// Unattended-Upgrade::Verbose "false";

// Print debugging information both in unattended-upgrades and
// in unattended-upgrade-shutdown
// Unattended-Upgrade::Debug "false";

I've removed the // on the lines for reboot and given it a time to do it but I'm not sure if I should be doing anything else.

Am I missing something blindingly obvious here please?

Here's the output of the dry run command: sudo unattended-upgrade -d -v --dry-run

Thanks.

Code:
Initial blacklist : 
Initial whitelist: 
Starting unattended upgrades script
Allowed origins are: origin=Debian,codename=buster,label=Debian, origin=Debian,codename=buster,label=Debian-Security
Using (^linux-image-[0-9]+\.[0-9\.]+-.*|^linux-headers-[0-9]+\.[0-9\.]+-.*|^linux-image-extra-[0-9]+\.[0-9\.]+-.*|^linux-modules-[0-9]+\.[0-9\.]+-.*|^linux-modules-extra-[0-9]+\.[0-9\.]+-.*|^linux-signed-image-[0-9]+\.[0-9\.]+-.*|^linux-image-unsigned-[0-9]+\.[0-9\.]+-.*|^kfreebsd-image-[0-9]+\.[0-9\.]+-.*|^kfreebsd-headers-[0-9]+\.[0-9\.]+-.*|^gnumach-image-[0-9]+\.[0-9\.]+-.*|^.*-modules-[0-9]+\.[0-9\.]+-.*|^.*-kernel-[0-9]+\.[0-9\.]+-.*|^linux-backports-modules-.*-[0-9]+\.[0-9\.]+-.*|^linux-modules-.*-[0-9]+\.[0-9\.]+-.*|^linux-tools-[0-9]+\.[0-9\.]+-.*|^linux-cloud-tools-[0-9]+\.[0-9\.]+-.*|^linux-buildinfo-[0-9]+\.[0-9\.]+-.*|^linux-source-[0-9]+\.[0-9\.]+-.*) regexp to find kernel packages
Using (^linux-image-5\.10\.103\-v7\+$|^linux-headers-5\.10\.103\-v7\+$|^linux-image-extra-5\.10\.103\-v7\+$|^linux-modules-5\.10\.103\-v7\+$|^linux-modules-extra-5\.10\.103\-v7\+$|^linux-signed-image-5\.10\.103\-v7\+$|^linux-image-unsigned-5\.10\.103\-v7\+$|^kfreebsd-image-5\.10\.103\-v7\+$|^kfreebsd-headers-5\.10\.103\-v7\+$|^gnumach-image-5\.10\.103\-v7\+$|^.*-modules-5\.10\.103\-v7\+$|^.*-kernel-5\.10\.103\-v7\+$|^linux-backports-modules-.*-5\.10\.103\-v7\+$|^linux-modules-.*-5\.10\.103\-v7\+$|^linux-tools-5\.10\.103\-v7\+$|^linux-cloud-tools-5\.10\.103\-v7\+$|^linux-buildinfo-5\.10\.103\-v7\+$|^linux-source-5\.10\.103\-v7\+$) regexp to find running kernel packages
Checking: curl ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: firmware-atheros ([<Origin component:'main' archive:'oldstable' origin:'Raspberry Pi Foundation' label:'Raspberry Pi Foundation' site:'archive.raspberrypi.org' isTrusted:True>])
Checking: firmware-brcm80211 ([<Origin component:'main' archive:'oldstable' origin:'Raspberry Pi Foundation' label:'Raspberry Pi Foundation' site:'archive.raspberrypi.org' isTrusted:True>])
Checking: firmware-libertas ([<Origin component:'main' archive:'oldstable' origin:'Raspberry Pi Foundation' label:'Raspberry Pi Foundation' site:'archive.raspberrypi.org' isTrusted:True>])
Checking: firmware-misc-nonfree ([<Origin component:'main' archive:'oldstable' origin:'Raspberry Pi Foundation' label:'Raspberry Pi Foundation' site:'archive.raspberrypi.org' isTrusted:True>])
Checking: firmware-realtek ([<Origin component:'main' archive:'oldstable' origin:'Raspberry Pi Foundation' label:'Raspberry Pi Foundation' site:'archive.raspberrypi.org' isTrusted:True>])
Checking: libcurl3-gnutls ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: libcurl4 ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: libpam-systemd ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: libpcre2-8-0 ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: libpcre2-posix0 ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: libsystemd0 ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: libudev1 ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: systemd ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: systemd-sysv ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: tzdata ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
Checking: udev ([<Origin component:'main' archive:'oldstable' origin:'Raspbian' label:'Raspbian' site:'raspbian.raspberrypi.org' isTrusted:True>])
pkgs that look like they should be upgraded: 
Fetched 0 B in 0s (0 B/s)                                                                                                                                                                                     
fetch.run() result: 0
blacklist: []
whitelist: []
No packages found that can be upgraded unattended and no pending auto-removals
 
Based off of the debug, you're trying to upgrade Raspbian repos, but the unattended upgrades doesn't have a clue about them. You need to add them into:

Bash:
/etc/apt/apt.conf.d/50unattended-upgrades

You can see this 'bug' has been around for a good while now, but it's also kind of working as intended as it's using the default Debian config, but they could append it with Raspbian origins too.


Run
Bash:
"apt-cache policy | grep release"
and then convert that into the structure in unattented-upgrades. For example:

Bash:
"o=Raspberry Pi Foundation,a=testing,n=buster,l=Raspberry Pi Foundation,c=main";
 
Hmm, that's interesting, thanks. It was actually installed as a default in my pivpn build and I think it's working there but perhaps it's tweaked as part of the installation. At least, I'm sure it did a restart at 04:20 one morning which is the time I have set.

On the other couple of Pis I'm looking at....

Code:
pi@pihole-bullseye1:~ $ apt-cache policy | grep release
     release a=now
     release o=Raspberry Pi Foundation,a=stable,n=bullseye,l=Raspberry Pi Foundation,c=main,b=armhf
     release o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=rpi,b=armhf
     release o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=non-free,b=armhf
     release o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=contrib,b=armhf
     release o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=main,b=armhf

And

Code:
pi@pihole-buster2:~ $ apt-cache policy | grep release
     release a=now
     release o=Raspberry Pi Foundation,a=oldstable,n=buster,l=Raspberry Pi Foundation,c=main,b=armhf
     release o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=rpi,b=armhf
     release o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=non-free,b=armhf
     release o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=contrib,b=armhf
     release o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=main,b=armhf

Is the result on my bullseye and buster systems respectively but I'm not quite sure how to interpret that and what I should put into /etc/apt/apt.conf.d/50unattended-upgrades and where I should put it.
 
So you would want to use:

Bash:
o=Raspberry Pi Foundation,a=stable,n=bullseye,l=Raspberry Pi Foundation,c=main
o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=rpi
o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=non-free
o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=contrib
o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=main


o=Raspberry Pi Foundation,a=oldstable,n=buster,l=Raspberry Pi Foundation,c=main
o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=rpi
o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=non-free
o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=contrib
o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=main

I caveat this here, with I'm not 100% sure on the b=armhf element, I don't know if that's needed to target ARM CPUs, but if the first doesn't work then try:

Bash:
o=Raspberry Pi Foundation,a=stable,n=bullseye,l=Raspberry Pi Foundation,c=main,b=armhf
o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=rpi,b=armhf
o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=non-free,b=armhf
o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=contrib,b=armhf
o=Raspbian,a=stable,n=bullseye,l=Raspbian,c=main,b=armhf


o=Raspberry Pi Foundation,a=oldstable,n=buster,l=Raspberry Pi Foundation,c=main,b=armhf
o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=rpi,b=armhf
o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=non-free,b=armhf
o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=contrib,b=armhf
o=Raspbian,a=oldstable,n=buster,l=Raspbian,c=main,b=armhf

I personally use Ansible to manage my updates these days, so can't test this myself.
 
Back
Top Bottom