我可以进行无声或无人值守的升级吗?

如何在不必回应提示的情况下升级到新的Ubuntu版本?
我现在使用的是12.04,想要安装12.10。当我开始更新时,它通常会下载一些东西,然后问一个问题,安装一点东西,再问一个问题,依此类推。我通常会让它在夜间运行,有时候发现更新几乎没有任何进展。我希望只需启动这个过程,离开一段时间后就能完成。对于自动更新/etc等配置文件,我没有意见。那么如何开始无人值守的升级呢?
5个回答

以下命令将无需提示升级到新的稳定版本:
do-release-upgrade -f DistUpgradeViewNonInteractive

以下命令将无需提示升级到当前的开发版本:
do-release-upgrade -d -f DistUpgradeViewNonInteractive

我还没有测试过,但它似乎只是在出现问题时执行默认操作。如果脚本运行时间过长,它也会超时。
如果您对某些软件包的配置不满意,您可能需要之后使用dpkg-reconfigure进行调整,但大多数情况下应该没问题。
来源:http://awaseroot.wordpress.com/2012/04/29/ubuntu-release-upgrade-fully-automatic-non-interactive-upgrade/。链接中还有其他方法可以实现这一点。

我做了这个,一切似乎都正常工作,但是在重新启动后,我只得到了一个 grub 错误,所以你似乎需要在这个无人值守的升级之后添加一些更多的 grub 配置。也许可以使用 sudo apt-get install grub-emu - rubo77
9这对于Trusty => Xenial不起作用。仍然会有关于修改的/etc文件的问题。 - Willem
这个应该用sudo来运行吗? - Cerin
1关于修改/etc文件的问题,这里有一个很棒的解决方案:https://awaseroot.wordpress.com/2012/04/29/ubuntu-release-upgrade-fully-automatic-non-interactive-upgrade/#more-91。在do-release-upgrade前面加上'echo "y\n\ny\ny\ny\n" | '命令。它会提供回答问题的答案。为了应对/etc中大量修改的文件,添加很多答案。 - nmgeek
我可以通过这种方式将可靠版升级到赛义安版本。在执行此命令之前,我会执行以下操作:sudo mv /etc/apt/sources.list.d /etc/apt/sources.list.d-NO,因为这样可以解决我进行交互式升级时遇到的99%问题。然后,我会使用Ansible重新填充该目录。 - dannyman
这个解决方案官方上说不管用。我尝试运行它来升级一个Ubuntu 16服务器到18,但它仍然提示我是否要覆盖我对/etc/logrotate.d/apache2'做的一些自定义修改。 - Cerin

为了确认Thomas Ward在他的回答中所说的并与被接受的回答相矛盾,do-release-upgrade -d -f DistUpgradeViewNonInteractive是不起作用的。
事实上,在第一个提示处,它使我的16.04到18.04的测试分区崩溃了,我不得不重新克隆它。这就是脚本冻结的地方。
Setting up mount (2.31.1-0.4ubuntu3) ...
Setting up systemd (237-3ubuntu10) ...
Installing new version of config file /etc/pam.d/systemd-user ...
Installing new version of config file /etc/systemd/journald.conf ...

Configuration file '/etc/systemd/logind.conf'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** logind.conf (Y/I/N/O/D/Z) [default=N] ? y

Y
CRASHED... NOTHING HAPPENS NOW... WILL KILL AND RESTART WITHOUT -f OPTION...

由于输入抑制器,在终止脚本后,无法重新启动或关闭计算机。您需要进行冷启动(按住电源按钮约10秒)。
谢天谢地,这只是一个16.04的克隆升级,而不是真正的16.04分区。
为了让生活更有趣,我的NVMe SSD上增加了一个新的898 MB分区,并且我的常规分区发生了变动。
$ lsdrv
NAME        FSTYPE  LABEL                  MOUNTPOINT          SIZE MODEL

nvme0n1                                                        477G Samsung SSD 960 PRO 512G
├─nvme0n1p5 ntfs                                               858M 
├─nvme0n1p3                                                     16M 
├─nvme0n1p1 ntfs                                               450M 
├─nvme0n1p8 ntfs    Shared_WSL+Linux       /mnt/e                9G 
├─nvme0n1p6 ext4    Ubuntu18.04                               23.7G 
├─nvme0n1p4 ntfs    NVMe_Win10             /mnt/c            390.4G 
├─nvme0n1p2 vfat                           /boot/efi            99M 
├─nvme0n1p9 swap    Linux Swap             [SWAP]              7.9G 
└─nvme0n1p7 ext4    NVMe_Ubuntu_16.0       /                  44.6G 
  • nvme0n1p5 曾经是我的 Ubuntu 16.04 分区所在的位置,但现在它在 nvme0n1p7 上。
  • nvme0n1p8 曾经是我的 18.04 测试分区所在的位置,但现在它仍然在 nvme0n1p8 上。

注意:今天下午我还将 Windows 10 从版本 1709 升级到版本 1803,所以有可能它创建了新的 898 MB 的 ntfs 格式的 nvme0n1p5 分区。


1这是一个大问题,所以你应该在Launchpad上报告它。之前通过几次发行版升级使用了非交互方式。 - oligofren
1在同一天升级同一台计算机的Ubuntu和Windows?你一定是喜欢折磨自己。 - JDS
@JDS Windows出了问题。缺少1700个升级,各种依赖关系都乱了,Python 2和Python 3之间也有问题。我不得不从Windows商店中擦除并重新安装Ubuntu 16.04 叹气 - WinEunuuchs2Unix

只是为了扩展之前的答案,这里是如何远程执行与接受的答案相同的操作,使用无密码升级通过ssh将您的系统升级到最新版本。这是从我的博客文章中复制过来的。
所有这些步骤都假设您的软件包仓库正常工作。也就是说,如果您执行apt-get update命令时没有因为版本过旧而出现大量404错误。您需要先解决这个问题,所以请参考这个答案

0. 更新所有现有的软件包

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

1. 设置无密码执行

将自己添加到可以使用sudo执行do-release-upgrade而无需输入密码的用户列表中,可以通过执行以下命令来实现

sudo visudo -f /etc/sudoers.d/do-release-upgrade.

并添加以下行,当然要将my-username替换为您自己的用户名:
my-username ALL=NOPASSWD: /usr/bin/do-release-upgrade

2. 开始增量升级

登出并在您的计算机上执行以下命令。它将进行一个无需询问输入(接受所有默认答案)的升级,等待计算机重新启动,然后再次尝试升级。它会一直运行,直到您升级到最新版本为止。

while true; do 
    ssh my-user@my-server sudo do-release-upgrade -f DistUpgradeViewNonInteractive;
    sleep 120; 
done

3. 修复配置文件至其先前状态
之后,您需要将备份的配置文件移回到它们先前的位置,因为升级过程已经将默认配置放在了这些位置。
对默认答案不满意吗? 这个人有一种预先准备答案的方法,适用于每个提示,但缺点是您必须知道有多少个提示...

你可以通过终端来完成这个操作,使用sudo apt-get -y upgrade命令。这将对所有提示都回答"是"。不过它不会自动运行,所以你需要手动运行它。它应该能正常工作。据我所知,没有办法使用图形界面的更新管理器来进行无人值守的软件升级(这与版本升级不同!)。
如果你想要升级到不同的Ubuntu版本(也就是版本升级,通常是相对于你当前版本的下一个发布版本),你必须手动激活它。可能可以使用sudo do-release-upgrade命令。但是无法跳过提示。这就是为什么你在有时间处理这些提示时才发起升级操作 - 会有提示出现。

1虽然没有办法跳过提示,但是DistUpgradeViewNonInteractive标志呢?它可以跳过提示。 - oligofren
1@oligofren Thomas是正确的,因为-f DistUpgradeViewNonInteractive标志会导致脚本在第一个(Y/I/N/O/D/Z)提示处锁定。请查看我刚刚发布的回答。 - WinEunuuchs2Unix

尝试在apt-get命令中添加-y选项,但要知道它会自动回答所有的查询。

1我正在使用图形化的更新管理器,而不是apt-get。我可以在控制台中进行更新,但我听说'apt-get dist-upgrade'多年来都无法正常工作(用于在版本之间升级),所以该命令不会是'apt-get'。 - jdm
@jdm apt-get dist-upgrade 应该可以正常工作。你是在哪里听说它不再起作用了? - Seth
4@Seth apt-get dist-upgrade 在任何操作系统中都不会自动执行版本升级。请参考man apt-getupgrade 只会升级那些可以在不需要安装或卸载新软件包的情况下进行升级的软件包。而 dist-upgrade 则会升级软件包,即使这意味着需要添加或删除软件包。这主要用于执行普通的更新操作,例如,upgrade 不会升级内核。 - Eliah Kagan
4sources.list更改为指向下一个版本的存档,然后运行apt-get dist-upgrade,如果成功的话,将执行版本升级。尽管Debian支持此操作,但建议使用aptitude dist-upgrade,因为它具有更高级的依赖关系解析功能。在Ubuntu中,根本不支持这样的操作,尽管可能会成功。相反,在命令行中,使用do-release-upgrade来升级到较新的版本。该实用程序不接受-y标志,因此本答案不适用于升级到新版本的情况 - Eliah Kagan
哦,有趣。那我一定是在读关于Debian的内容了。 - Seth