[Bug 2080233] Re: do-release-upgrade fails when snap returns non-zero exit code [[wsl] do-release-upgrade fails with systemd disabled]
Nick Rosbrook
2080233 at bugs.launchpad.net
Tue Apr 1 17:05:24 UTC 2025
** Description changed:
+ [Impact]
+
+ There are various setups where snap will not behave as expected, such as
+ in WSL or chroot environments. There are currently quirks in ubuntu-
+ release-upgrader that are not resilient to general snap failures.
+
+ Such errors currently are fatal to the upgrade, but they should not be.
+
+ [Test Plan]
+
+ In an Ubuntu container, simulate snap errors by doing:
+
+ $ ln -s /usr/bin/false /usr/local/bin/snap
+ $ which snap
+ /usr/local/bin/snap
+
+ Then, attempt an upgrade. Without a patch, the upgrade will fail early:
+
+ $ do-release-upgrade
+
+ [...]
+
+ Building dependency tree... Done
+ Reading state information... Done
+
+ Traceback (most recent call last):
+ File "/tmp/ubuntu-release-upgrader-0xsphvrt/noble", line 8, in <module>
+ sys.exit(main())
+ File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeMain.py", line 241, in main
+ if app.run():
+ File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeController.py", line 2662, in run
+ return self.fullUpgrade()
+ File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeController.py", line 2467, in fullUpgrade
+ if not self.doPostInitialUpdate():
+ File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeController.py", line 1438, in doPostInitialUpdate
+ self.quirks.run("PostInitialUpdate")
+ File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeQuirks.py", line 102, in run
+ func()
+ File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeQuirks.py", line 127, in noblePostInitialUpdate
+ self._test_and_fail_on_tpm_fde()
+ File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeQuirks.py", line 1906, in _test_and_fail_on_tpm_fde
+ snap_list = subprocess.check_output(['snap', 'list'])
+ File "/usr/lib/python3.10/subprocess.py", line 421, in check_output
+ return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
+ File "/usr/lib/python3.10/subprocess.py", line 526, in run
+ raise CalledProcessError(retcode, process.args,
+ subprocess.CalledProcessError: Command '['snap', 'list']' returned non-zero exit status 1.
+
+ With a patch in place, the error should be logged instead, and the
+ upgrade should continue.
+
+ [Where problems could occur]
+
+ TODO
+
+ [Original Description]
+
Original report: https://github.com/ubuntu/WSL/issues/493
On WSL, systemd is not always enabled. This is the case on WSL1 where it
cannot be enabled and on WSL2 when it's been disabled or not enabled by
default.
When systemd is not available do-release-upgrade fails with the error
below and upgrade is cancelled:
- From the report
+ From the report
===
Traceback (most recent call last):
File "/tmp/ubuntu-release-upgrader-uqmd8iby/noble", line 8, in <module>
sys.exit(main())
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeMain.py", line 241, in main
if app.run():
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeController.py", line 2642, in run
return self.fullUpgrade()
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeController.py", line 2447, in fullUpgrade
if not self.doPostInitialUpdate():
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeController.py", line 1438, in doPostInitialUpdate
self.quirks.run("PostInitialUpdate")
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeQuirks.py", line 102, in run
func()
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeQuirks.py", line 127, in noblePostInitialUpdate
self._test_and_fail_on_tpm_fde()
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeQuirks.py", line 1898, in _test_and_fail_on_tpm_fde
snap_list = subprocess.check_output(['snap', 'list'])
File "/usr/lib/python3.10/subprocess.py", line 421, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
File "/usr/lib/python3.10/subprocess.py", line 526, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['snap', 'list']' returned non-zero exit status 1.
"""
This error should be ignored when systemd is not running.
Read https://github.com/ubuntu/WSL/issues/493#issuecomment-2324510606
for details. Thanks to Vadim for the investigation.
"""
In /tmp/ubuntu-release-upgrader-t8sg0mg9/DistUpgrade/DistUpgradeQuirks.py:
- def _test_and_fail_on_tpm_fde(self):
- """
- LP: #2065229
- """
- try:
- snap_list = subprocess.check_output(['snap', 'list'])
- snaps = [s.decode().split()[0] for s in snap_list.splitlines()]
- except FileNotFoundError:
- # snapd not installed?
- return
+ def _test_and_fail_on_tpm_fde(self):
+ """
+ LP: #2065229
+ """
+ try:
+ snap_list = subprocess.check_output(['snap', 'list'])
+ snaps = [s.decode().split()[0] for s in snap_list.splitlines()]
+ except FileNotFoundError:
+ # snapd not installed?
+ return
I think except FileNotFoundError: should be extended to except:
Because DistUpgradeQuirks.py is stored in some temp directory, it was hard to change it inplace, but I succeeded, and then the upgrade process continued as it should
===
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to ubuntu-release-upgrader in
Ubuntu.
https://bugs.launchpad.net/bugs/2080233
Title:
do-release-upgrade fails when snap returns non-zero exit code [[wsl]
do-release-upgrade fails with systemd disabled]
Status in ubuntu-release-upgrader package in Ubuntu:
Fix Released
Status in ubuntu-release-upgrader source package in Noble:
New
Status in ubuntu-release-upgrader source package in Oracular:
New
Bug description:
[Impact]
There are various setups where snap will not behave as expected, such
as in WSL or chroot environments. There are currently quirks in
ubuntu-release-upgrader that are not resilient to general snap
failures.
Such errors currently are fatal to the upgrade, but they should not
be.
[Test Plan]
In an Ubuntu container, simulate snap errors by doing:
$ ln -s /usr/bin/false /usr/local/bin/snap
$ which snap
/usr/local/bin/snap
Then, attempt an upgrade. Without a patch, the upgrade will fail
early:
$ do-release-upgrade
[...]
Building dependency tree... Done
Reading state information... Done
Traceback (most recent call last):
File "/tmp/ubuntu-release-upgrader-0xsphvrt/noble", line 8, in <module>
sys.exit(main())
File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeMain.py", line 241, in main
if app.run():
File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeController.py", line 2662, in run
return self.fullUpgrade()
File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeController.py", line 2467, in fullUpgrade
if not self.doPostInitialUpdate():
File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeController.py", line 1438, in doPostInitialUpdate
self.quirks.run("PostInitialUpdate")
File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeQuirks.py", line 102, in run
func()
File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeQuirks.py", line 127, in noblePostInitialUpdate
self._test_and_fail_on_tpm_fde()
File "/tmp/ubuntu-release-upgrader-0xsphvrt/DistUpgrade/DistUpgradeQuirks.py", line 1906, in _test_and_fail_on_tpm_fde
snap_list = subprocess.check_output(['snap', 'list'])
File "/usr/lib/python3.10/subprocess.py", line 421, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
File "/usr/lib/python3.10/subprocess.py", line 526, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['snap', 'list']' returned non-zero exit status 1.
With a patch in place, the error should be logged instead, and the
upgrade should continue.
[Where problems could occur]
TODO
[Original Description]
Original report: https://github.com/ubuntu/WSL/issues/493
On WSL, systemd is not always enabled. This is the case on WSL1 where
it cannot be enabled and on WSL2 when it's been disabled or not
enabled by default.
When systemd is not available do-release-upgrade fails with the error
below and upgrade is cancelled:
From the report
===
Traceback (most recent call last):
File "/tmp/ubuntu-release-upgrader-uqmd8iby/noble", line 8, in <module>
sys.exit(main())
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeMain.py", line 241, in main
if app.run():
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeController.py", line 2642, in run
return self.fullUpgrade()
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeController.py", line 2447, in fullUpgrade
if not self.doPostInitialUpdate():
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeController.py", line 1438, in doPostInitialUpdate
self.quirks.run("PostInitialUpdate")
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeQuirks.py", line 102, in run
func()
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeQuirks.py", line 127, in noblePostInitialUpdate
self._test_and_fail_on_tpm_fde()
File "/tmp/ubuntu-release-upgrader-uqmd8iby/DistUpgrade/DistUpgradeQuirks.py", line 1898, in _test_and_fail_on_tpm_fde
snap_list = subprocess.check_output(['snap', 'list'])
File "/usr/lib/python3.10/subprocess.py", line 421, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
File "/usr/lib/python3.10/subprocess.py", line 526, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['snap', 'list']' returned non-zero exit status 1.
"""
This error should be ignored when systemd is not running.
Read https://github.com/ubuntu/WSL/issues/493#issuecomment-2324510606
for details. Thanks to Vadim for the investigation.
"""
In /tmp/ubuntu-release-upgrader-t8sg0mg9/DistUpgrade/DistUpgradeQuirks.py:
def _test_and_fail_on_tpm_fde(self):
"""
LP: #2065229
"""
try:
snap_list = subprocess.check_output(['snap', 'list'])
snaps = [s.decode().split()[0] for s in snap_list.splitlines()]
except FileNotFoundError:
# snapd not installed?
return
I think except FileNotFoundError: should be extended to except:
Because DistUpgradeQuirks.py is stored in some temp directory, it was hard to change it inplace, but I succeeded, and then the upgrade process continued as it should
===
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/ubuntu-release-upgrader/+bug/2080233/+subscriptions
More information about the foundations-bugs
mailing list