SDB:系统升级

跳转至: 导航, 搜索
这篇指南告诉您如何使用 Zypper 对 openSUSE 发行版进行在线升级。

对老版本进行在线升级已被官方支持。这意味着用户可以在原地完成完整的系统更新而无需重新安装系统。


摘要

这个页面教你如何使用一个工具或一些命令来将您的系统升级为最新版本的 openSUSE。

在线升级有许多优点,但相对的也有一些缺点。

优点是:

  • 您只需要下载需要升级的软件包,这样可以减少网络的使用。
  • 在升级的过程中,您仍可以使用您的工作站(即使我们并不建议您这样做);只有升级完成之后的重启才会使您的工作站离线。
  • 您不需要浪费一张 DVD,也不需要 DVD 刻录机。(您也可以从网络或 U 盘启动,并从网络上安装剩余的部分……)

缺点是:

  • 任何原因导致升级程序中断(例如: 停电,断网),都可能使您得到一个损坏的系统(这取决于您在哪个步骤中断)。
  • 如果您有很多个系统需要升级,您还是下载 ISO 镜像比较好。
  • 它不像使用离线 DVD 升级一样执行所有的清理与维护工作。

警告: 请不要跨版本升级!例如:不要从 15.1 直接升级到 15.3 。而应该先从 15.1 升到 15.2,接着再从 15.2 升到 15.3 。

其他升级方式:

离线升级,又称传统或DVD升级。要了解更多信息,请阅读 离线升级 。这种升级方法更安全,用途更广。除非你有很好的理由不这样做,否则请使用离线升级方法。


支持的版本

32 位的 openSUSE 无法升级到 Leap 版本,因为 Leap 只有 64 位版本。如果你的设备支持 x86_64 架构,你可以先将 13.2 升级到 64 位版本,再升级到 Leap 。详见:32-bit to 64-bit upgrade

在 AArch64 架构上(64位 ARM),Leap 15.0 是无法升级到 Leap 15.1 的,请重新安装您的系统。

请注意:原则上更新程序只是 “尽力而为”,也就是说一些第三方包和参数可能无法正确配置,在一些特定的组合上也可能导致升级失败。

并且请记住下列重要原则:

  • 所有重要资料必须在升级开始前先行备份。
  • 您必须先更新您的系统(zypper up),再执行在线升级(zypper dup)。
  • 您只能够执行 zypper dup 升级到下一个版本。跨版本升级(如从 13.2 到 Leap 42.2)是不支持的。

注意:根据工厂邮件列表,它已经在 openQA 中测试了从 openSUSE 12.x 直接升级到 Tumbleweed(直到快照 1101 )。目前( 2017年11月 )这个过程已经被测试过,从 13.x 和 42.x 直接到 TW 。然而,这并不意味着你应该这样做! 你可能会遇到一个未知的问题。


迁移至 SUSE Enterprise Linux

如果您对从 openSUSE Leap 迁移到 SUSE Linux Enterprise 感兴趣。那么请遵循我们的迁移到 SUSE Linux Enterprise 的指南

确保您已更新

支持的起始点是上一个 openSUSE 版本并获得了全部的更新。这不包含您自行加入的 openSUSE 构建服务(OBS)软件源。我们建议您在升级之前禁用所有的 OBS 软件源,升级之后再重新启用它们。下列步骤将教您在升级之前将现行的发行版获得全部的更新。

注意,移除额外仓库(repositories)的建议可能会被废弃。

额外仓库的处理

Zypper dup 现在可以在升级时更好地处理额外的软件库。删除一个软件库会导致这样的问题:每一个从它们那里安装的软件包都会恢复到另一个软件库(如果找到的话),或者被删除,或者留在旧版本,这取决于管理员的选择。让软件库处于活动状态可能是一个更好的方法。典型的例子是 packman。

然而,系统升级可能是删除一些软件库的最佳时机,因为太多的软件库会使维护工作复杂化。例如,假设我们有一些 XFCE 或 Plasma 仓库,我们激活了这些仓库以获得较新的版本(比如我们需要一个功能或纠正一个在较新版本中处理的问题):现在是恢复到主线版本的最佳时机。这将是一个考虑删除所有我们真的不需要的 HOME 库的机会。

我们删除的每一个软件库都会导致 zypper 询问如何处理从它们那里安装的软件包:保留还是升级并改变供应商。如果我们打算在系统升级后重新添加该软件库,政策将是 "保留" ,否则就是 "更新" 。我们可以使用 "--allow-vendor-change" ,但这可能会产生意想不到的后果,因为 zypper 会在考虑到它们的优先级的情况下,评估是否有软件包从另一个软件仓库获得版本会更好。

因此,作为管理员,你必须选择走什么路 ;-)

命令行

1. 检查更新软件源是否存在并已启用

zypper repos --uri

检查 http://download.opensuse.org/update/leap/15.0/oss/(适用于 openSUSE 15 或更旧的版本,请将 15.0 替换为你的版本)是否存在于 URI 列,并且 Enabled 列显示为 Yes,就像下面显示的一样:

#  | Alias           | Name            | Enabled | Refresh | URI
---+-----------------+-----------------+---------+---------+---------------------------------------
1  | repo-update     | repo-update     | Yes     | Yes     | http://download.opensuse.org/update/leap/15.0/oss/

如果 Enabled 列显示为 No,通过以下命令启用它:

zypper modifyrepo --enable repo-update

repo-update 是你更新源的名称。如果它已经存在并且已被启用,请跳转到步骤 3

2. 添加更新源

如果你的升级前系统是15.0,并且更新库已经不存在的话

zypper addrepo --check --refresh --name 'openSUSE-Leap-15.0-Update' http://download.opensuse.org/update/leap/15.0/oss/ repo-update
用您当前的 openSUSE 版本替换上面的 15.0 。

3. 移动 /var/cache 到一个单独的子卷

注意:如果根文件系统不是Btrfs,或者你是从15.0或更高版本升级的,那么跳过这一部分,继续到第4步。

/var/cache 包含了大量易失数据,例如 Zypper 缓存和每次更新的 RPM 包。作为存储大量冗余且易失数据的结果,快照占用的空间会快速的增加。为了解决这个问题,请移动 /var/cache 到一个单独的子卷。

  • 找到根文件分区的设备名:
df /
  • 找出 / 子卷的所有其他子卷。在 openSUSE 13.2 上,这些子卷以 @ 开头:
sudo btrfs subvolume list / | grep '@'
  • 如果这个命令的输出是空的,那么你并没有 @ 开头的子卷。对于这种情况,你也许需要在旧版本的 openSUSE 中挂载 ID 为 5 的子卷。
  • 挂载一个特殊的子卷到一个暂时的挂载点:
mount /dev/<root-device> -o subvol=@ /mnt
如果你的子卷名中不包含 @,则请挂载 ID 为 5 的子卷:
mount /dev/<root-device> -o subvolid=5 /mnt
  • /mnt/var/cache 可能已经存在并且与 /var/cache 目录相同。为了避免数据丢失,请移动它:
mv /mnt/var/cache /mnt/var/cache.old
  • 创建一个新的子卷:
btrfs subvol create /mnt/var/cache
  • 如果这里已经有了 /var/cache.old,将它移到一个新的位置:
mv /var/cache.old/* /mnt/var/cache
如果没有这种情况,请执行这个:
mv /var/cache/* /mnt/var/cache/
  • 在执行后移除 /mnt/var/cache.old(可选):
rm -rf /mnt/var/cache.old
  • 从临时挂载点取消子卷的挂载:
umount /mnt
  • 在 /etc/fstab 中为新的 /var/cache 子卷添加一个条目。使用一个现有的子卷作为模板来复制。确保不改动UUID(这是根文件系统的UUID),并将子卷的名称和它的挂载点一致改为 /var/cache。
  • 按照 /etc/fstab 中的规定挂载新的子卷。
mount /var/cache

4. 升级系统到最新的软件包

zypper refresh
zypper update

了解更多,请见 Zypper 使用方法

图形化工具

请见 YaST 在线更新


执行升级

下列步骤将告诉您如何升级您的 openSUSE 到下一个版本(例如:15.1->15.2)。再次强调,任何的第三方或是 OBS 软件源都可能会引起不必要的麻烦,建议您在进行升级前停用或移除它们。

注意,移除额外仓库(repositories)的建议可能会被废弃。

在开始之前

请确认您已阅读过您将要安装的新版本已知问题。有些问题可能会影响升级程序。一般来说,这些问题都会列有解决方法或暂时性方案,请您对即将遇到的问题做好心理准备。

此外,请阅读发行说明,其中列出了新版本中的变化和故障。

命令行

作为一个例子,以下步骤显示了如何升级到 15.2 :

  • 切换并刷新所有仓库至 15.2
    # zypper --releasever=15.2 ref
    
  • 现在执行完整的发行升级。
只有在你在 /etc/zypp/repos.d/ 中定义的 Leap repos 已经使用 $releasever 变量的情况下,上述方法才会起作用。如果它们仍然是用特定的Leap 版本号硬编码的,那么你需要先修改它们。例如,假设 Leap 15.1,那么可以用 sudo sed -i 's/15.1/${releasever}/g' /etc/zypp/repos.d/*.repo完成。

如果你在正式发布日期前(例如,2019-05-22 为 Leap 15.1 的发布日期)做了上述 dist 升级,你可能已经安装了候选发布版(RC)或里程碑(milestone)版本,现在需要重复最后的 zypper dup 步骤来接收最终版本。

注意: 强烈建议你在X-窗口图形模式之外运行升级。因此,建议你从运行级别(runlevel)3(文本+网络)或虚拟控制台运行该命令。不幸的是,很多时候 WIFI 连接只有在运行级别5中才被管理/可用,所以虚拟文本控制台可能是最好的,同时保持登录到幕后的图形控制台。在升级过程中,人们的X会话停止/崩溃,导致升级中止,这反过来又使系统处于不一致的状态。要改变到运行级别3,请参阅SDB:Switch_runlevel 。要保持在运行级别5,但使用 "虚拟控制台",键入 control-alt-F1(作为一个例子)。
# zypper --releasever=15.2 dup

通过上述命令,zypper 将下载所有需要的软件包,并以堆(heaps)的形式安装它们。要提前下载所有软件包,请使用

# zypper --releasever=15.2 dup --download-in-advance


如果您在正式发布日期(如2019-05-22 的 Leap 15.1)之前进行了上述 dist 升级,您可能已经安装了候选版本(RC)或里程碑版本,现在需要重复最后的 zypper dup 步骤以获得最终版本。
  • 搜索您之前使用过的更新的 openSUSE Leap 15.2 兼容的第三方软件库————如果您仍然需要它们————并添加它们。
    注意: 请谨慎使用。使用第三方软件库可能会破坏你的系统或导致不稳定。
    zypper addrepo --name <name> <url> <alias>
    
    或者,如果你有一个 .repo 文件的 URL:
    # zypper ar <url.repo>
    

后话

升级后,建议重启,以启动新的内核和所有东西的较新版本。

以及:发现并享受你的新系统 :)

此外,可以不时地运行 zypper up ,以确保你有来自你所启用的各种存储库的最新可用软件包。YOU(Yast Online Update)只处理来自官方软件库的安全更新。

openSUSE Leap 15.3 alpha/beta/RC 测试版

上面的说明也可以让您更新到任何一个 openSUSE Leap 15.3 候选版本,只需替换相关的(15.3)版本即可。请再次记住,升级应该是循序渐进的(即15.0,15.1,15.2,然后才是 15.3),并注意这些版本是为测试而设计的,有些软件包处于变动状态。您的系统用户是测试者,所以强烈鼓励快速反馈问题和漏洞(通过 Bugzilla)。

请注意,openSUSE Leap 15.3(目前处于测试阶段,计划于 2021年6月最终发布)使用来自 SUSE Linux Enterprise 的二进制文件,因此从 15.2 升级到 15.3 涉及供应商从 openSUSE 到 SUSE LLC 的变更,我们建议用户使用

# zypper --releasever=15.3 dup --allow-vendor-change

或者在此基础上只做供应商的改变是必要的。

# zypper --releasever=15.3 dup --no-allow-vendor-change --force-resolution

yast 或 zypper migrate 应该允许供应商从 openSUSE 变为 SUSE LLC 而不需要明确的白名单。