我一直想知道为什么软件更新工具(“更新管理器”)在执行包更新后会显示几秒钟“正在更新快照”,但实际上它并没有这样做。
相反,在软件更新程序完成后,我经常在终端中输入“sudo snap refresh”来查找是否有可用的 snap 更新并进行更新。(如果我不这样做,snap 更新将在一段时间后自动安装,但我希望在开始工作之前而不是在工作时获取所有最新更新。)
使用 Ubuntu 22.04,但它总是与 20.04 相同。
答案1
我认为“更新快照”这句话具有误导性。它并没有像你想象的那样运行,也没有像任何理性的人所期望的那样运行。
我看了一下更新管理器的代码,虽然我不是开发人员,但我想我明白发生了什么。
deb
代码看起来像是说“更新 snap”,然后继续获取正在从 迁移到的snap 列表snap
- 例如lxd
、firefox
和chromium-browser
。然后它会处理它们(如果有的话),然后继续。正如您所期望的那样,它不会处理任何已安装的 snap。
消息“更新快照”可能应该是“处理 deb 到快照迁移”或类似的内容。
这是代码。
def update_snaps(self):
# update status and progress bar
def update_status(status):
GLib.idle_add(self.label_details.set_label, status)
def update_progress(progress_bar):
progress_bar.pulse()
return True
update_status(_("Updating snaps"))
progress_bar = None
progress_timer = None
progress_bars = self.progressbar_slot.get_children()
if progress_bars and isinstance(progress_bars[0], Gtk.ProgressBar):
progress_bar = progress_bars[0]
progress_timer = GLib.timeout_add(100, update_progress,
progress_bar)
# populate snap_list with deb2snap transitions
snap_list = self.get_snap_transitions()
if progress_timer:
GLib.source_remove(progress_timer)
progress_bar.set_fraction(0)
# (un)install (un)seeded snap(s)
try:
client = Snapd.Client()
client.connect_sync()
index = 0
count = len(snap_list)
for snap, snap_object in snap_list.items():
command = snap_object['command']
if command == 'refresh':
update_status(_("Refreshing %s snap" % snap))
client.refresh_sync(snap, snap_object['channel'],
self.update_snap_cb,
progress_callback_data=(index, count,
progress_bar))
elif command == 'remove':
update_status(_("Removing %s snap" % snap))
client.remove_sync(snap, self.update_snap_cb,
progress_callback_data=(index, count,
progress_bar))
else:
update_status(_("Installing %s snap" % snap))
client.install_sync(snap, snap_object['channel'],
self.update_snap_cb,
progress_callback_data=(index, count,
progress_bar))
index += 1
except GLib.Error as e:
logging.debug("error updating snaps (%s)" % e)
GLib.idle_add(self.window_main.start_error, False,
_("Upgrade only partially completed."),
_("An error occurred while updating snaps. "
"Please check your network connection."))
return
# continue with the rest of the updates
GLib.idle_add(self.window_main.start_available)