如何使用命令行从18.10升级到19.10?

我正在尝试使用sudo do-release-upgrade从18.10升级到19.10,但是我只收到一个错误:An upgrade from 'cosmic' to 'eoan' is not supported with this tool. 我执行了更新我的sources.list的步骤,指向旧版本服务器,如此处建议:How to install software or upgrade from an old unsupported release? 这并没有帮助。我仍然收到相同的错误。

2除了从长期支持版(LTS)升级到另一个LTS版本外,没有其他可以跳过版本的升级路径。您需要安装19.10版本。如果我是您,我会等几周,然后选择20.04版本。 - Rinzwind
1你说的“安装”19.10是什么意思?你是指完全安装而不是升级吗?那么先安装19.04呢?这样做可行吗? - Droopycom
1@Rinzwind 是正确的 - 你错过了支持升级的时间窗口(从18.10到19.04,以及之后的19.04到19.10)。抱歉。你可以研究如何尝试一个不受支持的升级。如果出现问题,那么在这里你会得到一个(受支持的)干净安装19.10的建议。无论你选择什么,对于你认为有价值的所有数据进行完整备份是明智的。提示:我会在日历上标记我的升级时间,以确保在时间窗口内顺利进行。 - user535733
@Rinzwind 等待20.04有何帮助呢?我现在的印象是,由于我的当前版本(18.10)已经停止支持,所以它也不会升级到20.04。 - Droopycom
1Rinzwind建议进行全新安装,而不是升级。如果您有备份,现在可以选择清洁安装19.10版本,或者稍等一段时间直到20.04测试版发布,这将是最简单的方法。虽然有一些升级的解决方案,但它们并不可靠。20.04版本将至少获得5年的支持,而19.10版本只有大约5个月的支持(?)。 - crip659
我直接从16.04升级到19.10,但并不容易。首先,你应该在克隆系统上执行升级操作:https://askubuntu.com/questions/1028604/bash-script-to-backkup-clone-ubuntu-to-another-partition/1028605#1028605 然后我所做的步骤在这里:https://www.linuxbabe.com/ubuntu/upgrade-ubuntu-18-04-to-ubuntu-19-10-from-command-line - WinEunuuchs2Unix
3@Rinzwind "在升级过程中,没有可以跳过版本的路径(除了长期支持版到长期支持版)。" 需要注意的是,这并不准确。跳过不受支持的版本以从一个受支持的版本跳转到另一个受支持的版本是官方支持的,甚至会自动提供。这个问题的问题在于*(a)* 18.10本身已经超过了七个月的不受支持期限,更加重要的是,*(b)* 在18.10可用但19.04不可用的时候从18.10跳过19.04到19.10从来没有得到过支持。 - Eliah Kagan
6个回答

升级仍然是可能的,你只需要按照这篇博客文章中的指示来修改一些文件,以便首先升级到19.04版本。我成功地按照他的方法进行了升级。

引用博客上的内容:

在18.10系统上运行do-release-upgrade。这将导致出现不支持的错误。但在幕后,工具会下载一些我们想要修改的元数据文件。
以root身份进入/var/lib/update-manager目录,并将文件meta-release复制到一个新文件meta-release2中。这个文件是由do-release-upgrade从互联网上下载的,它告诉升级程序如何进行升级。
编辑meta-release2文件。完全删除所有关于eoan的条目。修改disco条目,使其显示为Supported: 1
编辑文件/usr/lib/python3/dist-packages/UpdateManager/Core/MetaRelease.py。将以下代码行更改为: self.metarelease_information = open(self.METARELEASE_FILE, "r") 更改为: self.metarelease_information = open(self.METARELEASE_FILE + "2", "r") 这将告诉升级程序使用您修改后的文件而不是原始文件。(这也将避免任何重新下载覆盖您的更改。)
运行do-release-upgrade。现在应该正在进行18.10 → 19.04的升级。让它正常运行并重新启动。
恭喜!您现在正在运行19.04版本。删除您创建的/var/lib/update-manager/meta-release2文件。
由于19.10版本是受支持的,所以要升级19.04 → 19.10,只需再次运行do-release-upgrade即可。不需要任何黑客操作,您回到了正常的升级路径上。

4在我的情况下,我遇到了一个FileNotFoundError: [...]/.cache/update-manager-core/meta-release2'的错误。要解决这个问题,只需在缓存目录中创建一个包含来自meta-release文件的所有编辑(第3步)的meta-release2文件即可。 - jonasstaehle
1@xeddo 太棒了 - Novicegrammer
1这篇帖子真是太有帮助了!应该被接受为最佳答案! - Andrzej Wąsowski
2这不仅是一篇非常有帮助的帖子,而且它实际上做到了我所期望的do-release-upgrade能做到的事情。 - Daniel F
@DanielF 我知道...很烦人,对吧? - Nicolas Holthaus
对我来说没用。我收到了一条消息:“目前不支持从18.04版本升级到i386架构”。不过还是非常感谢,值得一试。 - Clon
4嘿,那是我的博客!很高兴它能帮助到人们;我收到了很多反馈,说我写的笔记很有帮助。享受那些甜蜜的 Stack 声望吧 :-)Clon,Ubuntu 在 18.04 版本停止支持32位 i386。你真的无法升级。 - Nelson
@Nelson,你真是太牛了!只是想与大家分享你发现的好东西。非常乐意修改我的回答,更准确地归功于你的博客。 - Nicolas Holthaus
1没事的,信息想要自由。 - Nelson
9从2020年4月开始,您还需要将“meta-release2”和“/etc/apt/sources.list”文件中的仿生或链接从http://archive.ubuntu.com更改为http://old-releases.ubuntu.com/。否则,在执行“do-release-upgrade”时会出现404错误。 - ikaerom
1我遇到了与@xeddo所描述的相同问题,关于缺少文件或文件的问题。据我回忆,该文件名为meta-release2,它在我的家目录下的.cache文件夹中缺失。操作似乎卡在一个日志文件的中间,我没有返回到提示符。我通过按下Ctrl+C终止操作,然后运行sudo do-release-upgrade来解决这个问题。在此之前,我只运行了do-release-upgrade。所以确保你使用sudo升级到下一个版本。 - Samir
@samir,你和xeddo只是没有仔细遵循指示。在第二步中,你应该创建meta-release2文件... - Nicolas Holthaus
我不知道xeddo是什么,但我知道我执行了cp meta-release meta-release2命令,所以我创建了一个副本,然后修改了MetaRelease.py文件来使用第二个版本。这一切都是按计划进行的,我对此非常确定。 - Samir
@NicolasHolthaus 我确实按照指示完全操作,并在 /var/lib/update-manager 中创建了 meta-releas2 文件。但在我的情况下,错误指向的是 .cache 目录中缺少的文件,而不是最初创建的文件。 - jonasstaehle
我花了时间重新做了整个事情。我正在使用虚拟机,所以这样做相对容易。我可以确认不使用sudo会导致未处理的异常,并且我有截图来证明。这个问题可以通过sudo do-release-upgrade或者在安全壳中运行所有命令时使用sudo -i来解决。 - Samir
说实话,我已经将故障排除说明和我的截图作为原始答案的新部分添加了进去。 - Samir
1我按照上述步骤以及@Moreaki关于更改meta-release2和/etc/apt/sources.list文件中的链接的建议进行了操作。我已经安装了Docker(版本19.03.6),但每次升级都失败,并显示“无法安全地从此存储库进行更新,因此默认情况下被禁用。”、“请参阅apt-secure(8)手册以获取存储库创建和用户配置详细信息。”、“存储库'https://download.docker.com/linux/ubuntu sylvia Release'没有发现发布文件”。有人可以指导我接下来该怎么做吗? - SMcCK
2我按照那些步骤操作,但仍然收到完全相同的错误信息("此工具不支持从'...'升级到'...'"). 然而,使用sudo运行,即sudo do-release-upgrade,可以正确地选择文件。 - Cedric Reichenbach
8此外,我不得不将行self.metarelease_information = f替换为self.metarelease_information = open(self.METARELEASE_FILE + "2", "r")(因为服务器似乎即使在后续运行中也不总是报告304)。 - Cedric Reichenbach
当Disco 19.04也到了EOL(终止支持)时,我们可以采取哪些措施呢? - neobie
1@neobie 那么就只剩下最后一步了,我刚刚完成了从18.10升级到19.04,再到19.10,最后到20.04 LTS的升级。你可能想看一下最新的答案,因为它们承诺有更简单的方法来完成这个过程。 - Fabian Horlacher

升级到19.04很简单,就像sysopchblog上建议的那样。
  1. mkdir /tmp/upgrade
  2. cd /tmp/upgrade
  3. wget http://old-releases.ubuntu.com/ubuntu/dists/disco-updates/main/dist-upgrader-all/current/disco.tar.gz
  4. tar -xf disco.tar.gz
  5. python3 ./dist-upgrade.py
我自己试过了,效果非常好。之后,do-release-upgrade似乎没有出错,但是我个人没有升级到19.10(我对19.04很满意)。
在第5步中,我不得不使用**sudo** python3 ./dist-upgrade.py

1我找到了相同的方法,而且它有效。 - Shimon Doodkin
2请注意,20.04版本很快就会发布,一旦发布后,你可能会发现无法从19.04版本升级。建议你尽快升级到19.10版本。 - Nelson
2archive.ubuntu.com的链接已经失效了,请使用这个链接代替: http://old-releases.ubuntu.com/ubuntu/dists/disco-updates/main/dist-upgrader-all/current/对我来说运行良好。 - omglolbah
下载所需版本后,我需要进行大量查找和替换,将 archive.ubuntu.comsecurity.ubuntu.com 替换为 old-releases.ubuntu.com,然后才能运行升级程序。 - Get Off My Lawn
太棒了!2021年1月份。 - Reza Hajianpour
接受的答案对我来说不起作用(2022年1月从20.10升级),因为Groovy不在old-releases.ubuntu.com上(他们现在把它们放在哪里我也不知道...)。这个方法完美运行(除了我需要给我的/usr文件系统添加空间之外...)。 - Auspex
1我今天尝试了这种方法,顺利地将系统从Cosmic升级到了Disco。现在,我打算尝试升级至Eoan版本,看看会发生什么。 - Christopher Thomas
1它在Disco和Eoan之间也可以工作。Focal显然是最后一个LTS,所以我不需要使用这种方法来升级此版本。但是在未来,我认为这种模式将适用于一般情况。 - Christopher Thomas
2023年2月到了,我用这个方法成功地将Ubuntu 19.04(disco)升级到了19.10(eoan)。谢谢你,Nelson! - Judah Himango

更简单的方法:18.10 -> 19.04 -> 19.10 -> 20.04 LTS(2020年5月24日)
我在这个问题上遇到了困难,因为我有超过20个Ubuntu虚拟机,它们运行着不同版本的18.04 / 18.10 / 19.04 / 19.10。
我已经测试了从18.10升级到20.04的多种更新方式,使用了之前提供的指南中的变化。
以下是高级步骤:
1. 只能通过一系列步骤完成:18.10(cosmic)-> 19.04(disco)-> 19.10(eoan)-> 20.04(focal) 2. 18.10和19.04是问题所在,因为它们已经“过时”,存档已经移动到“old-releases”,所以您需要编辑/etc/apt/sources.list文件,将其指向: "deb http://old-releases.ubuntu.com/ubuntu" 而不是其他任何仓库。
使用命令行(而非用户界面)执行以下操作:
1. sudo apt update 2. sudo apt upgrade 3. sudo apt autoremove 4. 然后重新启动
现在你可以尝试升级,但首先检查:/etc/update-manager/release-upgrades 文件中的 "Prompt=normal",如果需要的话进行编辑。 然后通过命令行执行以下操作:
do-release-upgrade 有三种可能的结果:
a. 一切顺利;-) - 然后进入步骤(6) b. 出现错误,提示无法从 "cosmic" 升级到 "eoan" c. 出现 "do-release-upgrade" 命令未找到 d. 找不到可用的版本(参见步骤 6)
如果是 4b,你需要编辑缓存的更新列表,该列表位于:~/.cache/update-manager-core/meta-release 编辑时应删除 "disco" 之后的所有版本,并将 "cosmic" 和 "disco" 的支持标志从 "0" 更改为 "1",例如:
Dist: cosmic

...

...

Supported: 1

...

...

现在回到第4步
4c. 您需要安装更新软件:sudo apt install ubuntu-release-upgrader-core 现在回到第4步
5. 重新执行:do-release-upgrade 请记住,您可能会回到第4b步。
如果一切顺利,请继续到第6步
6. 您现在应该处于19.04或19.10版本(取决于您的起始版本)。
现在您只需要重复这些步骤。
只需重复第4步。
如果出现“找不到发布版”错误,则应删除之前编辑的缓存发布文件(~/.cache/update-manager-core/meta-release)并重新运行。
7. 您现在应该能够升级到20.04 LTS
注意1:我是根据草稿记录写的,希望我记得正确。
注意2:如果您在/etc/apt/sources.list.d目录中使用了“外部PPA”,则在开始更新过程之前应禁用它们。

注意3:我刚刚进行了一个18.04 LTS的更新,它的过程是:18.04 -> 19.10 -> 20.04。所以它没有直接从18.04 -> 20.04...令人困惑


1绝对最佳答案:在 Lubuntu 18.10 到 20.04 上完美运行。谢谢! - caneta
"编辑应删除宇宙版之后的所有版本是什么意思?我的文件有一个很长的列表,宇宙版在中间...非常感谢简短回复 :-)" - Christoph
1这里开始,这些行非常重要:

必需的

deb http://old-releases.ubuntu.com/ubuntu/ CODENAME main restricted universe multiverse deb http://old-releases.ubuntu.com/ubuntu/ CODENAME-updates main restricted universe multiverse deb http://old-releases.ubuntu.com/ubuntu/ CODENAME-security main restricted universe multiverse
- Christoph
抱歉,我不是专家,但我也需要从上面的评论中获取相同链接的sudo apt-get update、sudo apt-get dist-upgrade和sudo do-release-upgrade。但还是谢谢你的解释 - 它起作用了 :-) - Christoph
1对我来说没起作用。~/.cache/update-manager-core/meta-release 不存在。 - jonathan
Christoph和Jonathan - 步骤4b应该是在“disco”之后删除所有版本,并将“disco”和“cosmic”的支持标志更改为1。如果您在~/.cache中找不到.cache目录,则可以尝试在var/lib/update-manager中查找,或者如果您使用的是LTS版本,则可能会在"meta-release-lts"中找到。注意:已在此处进行了更全面的重新测试和记录:https://tips.graphica.com.au/upgrading-from-retired-ubuntu-releases/ - zebity

有同样的问题。 经过一些研究(以为你可以随意升级),找到了this ubuntu help page
引用: 为了进一步稳定LTS版本,如果您当前正在运行LTS版本,行为会有轻微变化。只有在第一个点发布之后,LTS系统才会自动考虑升级到下一个LTS版本。所以例如,14.04只会在16.04.1发布后升级一次。如果您想要在此之前更新,例如在一部分机器上评估LTS升级是否适合您的设置,必须使用与开发版本升级相同的参数,即通过-d开关。 我们应该能够在2020年5月至6月升级(我想)当20.04.X发布时。 更新于2020-02-20 算了吧,18.04就好了。18.10已经死了(除非你有时间机器或对Ubuntu内部有更好的了解,知道如何进行升级)。
我们只能更新sources.listhttp://old-releases.ubuntu.com/ubuntu/,这样apt-get才能正常工作。
显然,过去你可以在一个小的时间范围内进行更新。当前的工具(do-release-upgrade,它是一个黑盒子做魔术)只能升级到最新可用的版本。
所以,举个例子,你可以进行进一步的更新:
  • 18.10 => 19.04(当19.04还在当前版本时,但现在已经不是了,它已经到了生命周期结束)

  • 19.04 => 19.10(当19.10还在当前版本时)

  • 19.10 => 20.04(总是?当它在当前版本时?)

  • 18.04 => 20.04(总是?当它在当前版本时?)

附带一些信息的链接


谢谢您分享这个信息。对我来说,这真是大开眼界...我一直在使用最新的Ubuntu版本,但我并不了解“不受支持的中间版本”会有多么迅速地失去支持。我至少以为我能够升级呢! - Nicolas Holthaus
18.04升级到20.04的轨道不会立即发布,顺便说一下 - 这通常会在我观察到的LTS的第一个点版本发布时更接近。 - Thomas Ward

以下是绕过不支持升级的步骤。

升级之前,请确保您的系统已经安装了最新的更新:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
# Reboot if needed.

这是实际的解决方法(通过强制支持所有版本来修补文件)。
sudo sed -i'.bak' "s/supported = int/supported = 1|int/" /usr/lib/python3/dist-packages/UpdateManager/Core/MetaRelease.py

注意:与通过修补“MetaRelease.py”文件的已接受答案类似,但简化了(不需要复制/重命名文件)。
然后按照通常的方式运行升级。
sudo do-release-upgrade

升级到另一个版本后,再次执行上述命令即可完成升级。
注意事项:
- 以上测试是在升级Ubuntu时进行的 - 从19.04(Disco Dingo)升级到19.10(Eoan Ermine)(截至2020年10月)。 - 从19.10(Eoan Ermine)升级到20.04(Focal Fossa)(截至2020年10月)。 - 如果您以root身份登录,无需在命令前加sudo。 - 如果您正在进行远程升级,建议使用screen运行命令,例如sudo screen do-release-upgrade(这样升级过程中不会因为连接问题而停止)。

这个sed指令似乎让事情完美地运行起来了。已经完成了从cosmic到disco的转换,disco到eoan只是登录,使用sed和do-release-upgrade就可以重新开始了。 - Kaithar

我成功地直接从16.04升级到19.10,但这并不是在我的生产系统上进行的,而是在一个测试系统上进行的:

我使用了以下指南:

简而言之,该文章并非“升级”,而是通过欺骗系统以为当前版本是19.10,并执行常规的“更新”操作:

We need to run the following command to change all instances of cosmic to eoan in the source list file (/etc/apt/sources.list). Cosmic is the code name for Ubuntu 18.10, whereas eoan is the code name for Ubuntu 19.10.

sudo sed -i 's/cosmic/eoan/g' /etc/apt/sources.list

Then we need to disable third-party repositories (PPAs) with the command below.

sudo sed -i 's/^/#/' /etc/apt/sources.list.d/*.list
记住,我遇到了一些错误,需要运行sudo apt cleansudo apt install -f来解决。有时在修复其他错误信息后,我不得不多次执行这些命令。幸运的是,通过谷歌搜索和Ask Ubuntu上的答案,我成功完成了任务。

  • 相关问题