我试图修复 Ubuntu 16.04 中损坏的软件包 (libnl-route-3-200)。我错误地执行以下操作:
sudo apt-get remove libnl-3-200
并没有意识到网络库的重要性。
现在,我的 Ubuntu 系统无法连接到网络。
我收到以下消息:
系统网络服务与此版本的 Ubuntu 不兼容。
我该如何修复该系统?
答案1
看来您仍然可以通过其他设备访问互联网。
在这种情况下,我的建议是去https://packages.ubuntu.com并搜索所需 ubuntu 版本的所需软件包。对于你的情况(假设是 amd64),这将导致此下载链接。
下载文件(可选但建议:验证指纹)并通过某种方式(例如闪存驱动器)将其复制到您的计算机,最后安装包运行
sudo dpkg -i libnl-3-200_3.2.27-1ubuntu0.16.04.1_amd64.deb
该包现在是手动安装的,但我认为一旦有更新可用,它将被存储库中的较新版本替换。
答案2
如果apt
删除该软件包,那么所有依赖该软件包也会被删除,这是一个更大的问题。
首先,我会检查/var/log/apt/history.log
实际删除了哪些软件包。该文件末尾应该有一个部分,其中包含调用 apt 的日期和时间、其命令行以及删除了哪些软件包:
$ cat /var/log/apt/history.log
这种格式使用起来有点烦人,所以使用:
$ sed -e 's/ ([^)]*)//g' -e 's/, / /g' /var/log/apt/history.log
这将从日志文件中删除版本号和逗号,以便于复制和粘贴。
对于该块中列出的每个软件包Remove:
或Purge:
,将它们添加到 ① 的命令行中
# apt --print-uris install libnl-3-200
这将为您提供要下载的 URL 列表。通过附加来处理此列表
| sed -ne "/http/s/'\([^']*\)'.*/\1/p"
删除 URL 和文件名及校验和周围的引号,并将其重定向到文件中。完整的命令行应类似于
# apt --print-uris install libnl-3-200 | sed -ne "/http/s/'\([^']*\)'.*/\1/p" >urls.txt
但还有一堆其他的包裹。
将该文件复制到 USB 驱动器上,转到另一台机器并下载这些文件,例如使用wget
:
$ wget -i urls.txt
将 USB 放回原始机器,将.deb
文件复制到/var/cache/apt/archives/
:
# cp *.deb /var/cache/apt/archives/
然后,像之前在 ① 下一样运行 apt 进行安装,但不使用--print-uris
选项。它应该从缓存目录中获取文件并进行安装。