在执行升级版本以避免问题之前,我应该采取哪些步骤?

在收到关于1404_HWE_EOL的通知后,我正在考虑将一个重要的生产系统升级到16.04.1版本。我之所以说这是一个“重要的生产系统”,是因为这是我每天在工作中使用的工作站。我希望避免出现错误或其他问题,因为我没有多余的时间来调试和解决问题(IT部门不提供对Linux系统的帮助)。我已经备份了所有数据,但没有备份当前的操作系统分区(我可能会将操作系统驱动器进行dd备份作为另一层备用)。在升级之前,我应该执行哪些其他步骤?我想知道如何在使用Ubuntu提供的发行版升级时尽量减少复杂性。
我已经阅读了关于在升级之前删除PPA源的内容。我安装了27个PPA源,删除所有这些源以及它们带来的程序,然后在升级后再恢复这些源将需要一些时间。这样做是否有明显的好处?还有其他需要注意的事项吗?

这个生产系统是一个虚拟机吗?如果是的话,您可能有一个选项可以在升级之前拍摄快照并恢复到它。我以前在本地开发机上使用过这个方法来避免升级失败(不是生产服务器)。 - ashes999
这不是虚拟机。在这种情况下,这将是一个很好的选择。 - Steven C. Howell
1当我升级时,该过程会自动禁用我添加的PPA(软件源)- 您不需要将它们移除。升级后,我可以重新启用它们。对于我来说,最大的问题主要是一些PPA尚未更新以支持Xenial。 - Paddy Landau
请注意。如果您使用的是AMD显卡,请务必确保其与16.04版本提供的驱动程序兼容。我的显卡不兼容,为了保护硬件的寿命,我已回滚到14.04版本。 - Tony Martin
4个回答

重要的生产系统
我不会升级这样的系统。我会在另一台机器上安装16.04,将实时数据复制到那台机器上。进行测试,再进行更多的测试。然后将那台机器作为生产服务器。
而且你可以使用当前的14.04服务器重新进行18.04的操作。
为什么要冒险呢?

在我的情况下,我没有完全相同的硬件堆栈,所以这意味着使用dd来克隆我的驱动器(从SSD到HDD),测试原始和克隆版本,然后重新安装新的操作系统。过去我一直这样做,但我一直希望有一套可靠的步骤来升级到新版本。这是不是太乐观了? - Steven C. Howell
不对。完全有可能的。你需要考虑一件事:16.04使用了“systemd”。因此,所有服务的启动方式都发生了变化。 - Rinzwind
使用 do-release-upgrade 升级 Ubuntu 到下一个 LTS 版本,有哪些步骤可以带来改善的结果? - Steven C. Howell
虽然这个回答提供了可靠的建议,根据我的经验来说,这是一种安全的升级方式,但它并没有提供关于使用内置的版本升级选项的信息。这正是我想更好地了解的内容。 - Steven C. Howell
抱歉,“使用do-release-upgrade时改善的结果”与什么相比较? - Rinzwind
除了备份系统之外,是否还有其他主动步骤可以执行,以便do-release-upgrade能够按照Ubuntu开发人员的意图无故障地运行?是否应该删除已安装的软件包(可能是来自PPA的软件包),将设置恢复为默认值等等?我预计Ubuntu开发人员会在纯净安装上测试do-release-upgrade,可能还有一些其他测试用例,但每个真实的系统都是不同的,这使得升级过程完全健壮变得不可能。我预计将我的系统接近纯净安装状态会减少问题,但这是真的吗? - Steven C. Howell

我会对工作站进行图像备份(在Linux Live系统中使用“dd”命令),然后将其转换为VirtualBox虚拟机(从RAW镜像转换为VDI格式)。之后,创建一个快照并在VirtualBox中运行该镜像。按照升级的步骤进行操作,如果遇到问题,可以回滚到快照状态。在完成升级后,您可以将VDI转换回RAW格式,并使用“dd”命令还原到您的系统中,或者按照运行手册进行操作。
但是,在覆盖旧系统之前,一定要始终进行最后一次“dd”图像备份。
我更喜欢使用USB闪存驱动器来运行我的系统,因此系统安装是通过“VDI -> RAW -> USB闪存驱动器”完成的,并从升级/安装的系统启动。这样做会占用一个USB端口,但您永远不会感到压力,并且可以轻松进行系统备份。多年来,我一直在生产环境中使用这种方法来管理我的工作站和服务器。

这是@rinzwind答案的一个变种,可能适用于您已经拥有的硬件。
如果您在内部磁盘驱动器上有足够的空闲空间(或者可以释放出足够的空间),您可以创建2个新分区(使用类似gparted的工具从一个活动CD/USB发行版中)并将根目录(/)复制到其中一个分区,将/home复制到另一个分区,并将它们标记为root2和home2,以便易于查找。
如果根目录和home目录位于同一分区,您只需复制该分区即可,但出于许多原因,将它们分开会更好。
您需要通过编辑更改到新根目录分区的/etc/fstab文件(更新新/home和根分区的UUID)来将新根目录指向新的/home。
您可以通过执行ls -l /dev/disk/by-label来查找新根目录和home目录当前所在的设备,然后运行ls -l /dev/disk/by-uuid来从设备名称获取UUID。
接下来,使用类似grub-customizer的工具(从您的生产系统中)更新grub菜单,将新根目录添加到其中。
现在,你将在这些分区上拥有一个与实际系统完全相同的副本。你可以在这个副本上运行升级操作,而原始版本仍然保持不变。你可以选择启动任何一个你想要工作的版本。
一旦你完成了升级,你只需要告诉grub,这个副本是实际版本(默认入口),而原始版本现在是备份。使用grub-customizer可以使这样的操作变得相当容易。
如果/home或根目录中有太多数据(使它们太大而无法复制),请先将其放入自己的分区中(确保通知访问它的程序进行移动)。它不需要被复制,只需要备份。
这也使得备份数据变得更加容易,因为它不再与系统文件混合在一起。
有了第二组“测试”分区,你现在可以尝试各种你不愿意冒险在日常工作中依赖的系统上进行的操作。
我目前正在这样的方式下运行Kubuntu 12.04,并在我的“开发”分区中配置16.04,直到它符合我的要求。
如今,硬盘驱动器的价格如此之低,你甚至可以将现有的内部驱动器复制到一个更大的新驱动器上,并在必要时使用它-如果你的公司允许的话。
这个答案涵盖了如何完成此操作的所有主要细节。我没有试图覆盖每个步骤的每个小细节。但是,由于您正在使用一份完整的副本,所以不应该有任何严重问题,而且其他所有内容已经在StackExchange的某个地方进行了讨论。

虽然这不适用于您的特定情况,但如果Ubuntu系统是一个虚拟机,您可以通过在升级之前拍摄快照,并在升级失败时恢复到快照来解决此问题。
我曾经升级过我的一个虚拟机,尽管升级失败并且据说已回滚,但我没有得到一个干净/可用的系统。
@Rinzwind的答案也适用于虚拟机:创建一个新的虚拟机,在其上安装新的Ubuntu版本,并开始复制文件。