[ubuntu]一次upgrade引发的一连串问题

引入

一开始只是想给ubuntu20.04更新软件,没想到引发了一连串的问题。这个博客包含了一系列的错误及其个人的解决方案,具体看下面各部分。

1 unable to make backup link of ‘./bin/systemctl’ before installing new version operation not permitted

这是更新 systemd 到最新版本的时候出现的错误。

类似错误的解决方法参考 Error: Debian/Ubuntu - unable to make backup link of `./usr/sbin/sshd’ before installing new version: Operation not permitted

网上基本上是这个教程,使用 lsattr 查看权限,使用 chattr 修改权限,我照葫芦画瓢,但是输出为:Usage: vmlinux1 [-pRVf] [-+=aAcCdDeijPsStTuF] [-v version] files...

Kimi大模型指出,这个输出表明出现了错误。但这个输出谷歌不到结果。从百度来看,应该是使用 vmlinux1 这个命令代替 chattr ,代替后输出 vmlinux1: Operation not supported while setting flags on /bin/systemctl,即使是超级用户也是这样。

但是放弃更新也不行,因为部分已经更新了,导致输入 apt --fix-broken install 后:

The following packages have unmet dependencies:
 libnss-systemd : Depends: systemd (= 245.4-4ubuntu3.23)
 libpam-systemd : Depends: systemd (= 245.4-4ubuntu3.23)
 systemd : Depends: libsystemd0 (= 245.4-4ubuntu3.22) but 245.4-4ubuntu3.23 is installed
 systemd-sysv : Depends: systemd (= 245.4-4ubuntu3.23)

于是我选择不升级这个,所以需要对其依赖项降级 sudo apt-get install --reinstall libsystemd0=245.4-4ubuntu3.22

2 apt 下载不到指定版本

提示没有这个版本。于是决定直接去网站自行下载 .deb

网站参考:Ubuntu安装包仓库
类似的经历:ubuntu安装软件需要低版本依赖的一种解决方法–以在Jetson Nano中安装libssl-dev为例,可见任何事情都不是一蹴而就的(鸡汤时间)

搜索 libsystemd0 是搜素不到的,需要先搜索 systemd ,我是选择最新版(update),然后在网址那里修改为 xxx3.22。选择 focalamd64 版本(通过 lsb_release -auname -a 分别查看,x86_64 差不多就是 amd64 了,具体差别不大懂,可以在评论区补充一下,欢迎指正)。

最后来到这个网址:https://answers.launchpad.net/ubuntu/focal/amd64/libsystemd0/245.4-4ubuntu3.22
(其实单看网址也能感觉到网址的规律)

下载之后安装就好了。可以用浏览器下载。安装用下面的命令:

# 安装deb包
sudo dpkg -i libsystemd0_245.4-4ubuntu3.22_amd64.deb

参考帖子,查看安装了的包的版本命令:sudo dpkg -s {pckage}

参考:[转帖]【Linux】使用 apt-get 查询并安装指定版本的软件

发现安装了这一个还不行,其他的也要跟着降级,像 libnss-systemdlibpam-systemdsystemd-sysv ,于是照葫芦画瓢安装,注意先装 systemd-sysv 再装 libpam-systemd

2.5 Temporary failure resolving …

修复的过程中出现了小插曲,如题。参考帖子输入:

echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null

参考:apt-get update fails to fetch files, “Temporary failure resolving …” error

3 invoke-rc.d: initscript udev, action “restart” failed.

原以为万事大吉,使用 sudo apt-get upgrade 也没报错。但是,使用 apt-get insall xxx 的时候输出:

Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.

The following packages have unmet dependencies:
 xxx : Depends: yyy but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

通常 apt 会顺带给出各种依赖的安装,但现在却是提示报错。
使用 sudo apt --fix-broken install 给我自动安装 254.4-4ubuntu3.23 版本的udev,然后报错:

Setting up udev (245.4-4ubuntu3.23) ...
/usr/sbin/invoke-rc.d: 308: test: x: unexpected operator
/usr/sbin/invoke-rc.d: 308: test: x: unexpected operator
/usr/sbin/invoke-rc.d: 317: test: x: unexpected operator
/usr/sbin/invoke-rc.d: 317: test: x: unexpected operator
invoke-rc.d: initscript udev, action "restart" failed.
● systemd-udevd.service - udev Kernel Device Manager
     Loaded: loaded (/lib/systemd/system/systemd-udevd.service; static; vendor preset: enabled)
     Active: active (running) since Sun 2024-06-02 21:58:12 CST; 35ms ago
TriggeredBy: ● systemd-udevd-kernel.socket
             ● systemd-udevd-control.socket
       Docs: man:systemd-udevd.service(8)
             man:udev(7)
   Main PID: 18359 (systemd-udevd)
     Status: "Processing with 80 children at max"
      Tasks: 1
     Memory: 3.5M
     CGroup: /system.slice/systemd-udevd.service
             └─18359 /lib/systemd/systemd-udevd

装回 254.4-4ubuntu3.22 也是如此。

3.1 脚本报错的问题

一开始以为只是脚本的报错,即针对:

/usr/sbin/invoke-rc.d: 308: test: x: unexpected operator
/usr/sbin/invoke-rc.d: 308: test: x: unexpected operator
/usr/sbin/invoke-rc.d: 317: test: x: unexpected operator
/usr/sbin/invoke-rc.d: 317: test: x: unexpected operator

对应的是 /usr/sbin/invoke-rc.d 中的:

if test x${RL} = x0 || test x${RL} = x6 ; then

进行修改。Kimi大模型的建议有误,遂转用GPT4-o。修改为:

if [ "x${RL}" = "x0" ] || [ "x${RL}" = "x6" ]; then

之后没有脚本报错了,但仍然 invoke-rc.d: initscript udev, action "restart" failed.

3.2 指标不治本(或许)的方法

参考 udev/dpkg error - askubuntu

概括地说,既然说 action "restart" failed ,不如直接放弃 restart,个人把参考链接中的方法作为备用方法。最后选择了下面的方法,但其实都一样。


参考开发者官方的说明,感觉问题很相似:sytemd-udev package upgrade breaks if udev is masked

通过输入:

sudo systemctl mask systemd-udevd.service
sudo systemctl stop systemd-udevd.service # 这里来自参考链接,所以用的是stop,确实和描述的start有些差异?

开发者的意思是由于restart,暂时的 mask/start,更新后再 unmask/stop,感觉和上面的方法大同小异?

接下来使用 sudo apt --fix-broken install ,成功了:

Setting up udev (245.4-4ubuntu3.22) ...
update-initramfs: deferring update (trigger activated)
Processing triggers for initramfs-tools (0.136ubuntu6.7) ...
update-initramfs: Generating /boot/initrd.img-5.15.0-107-generic
I: The initramfs will attempt to resume from /dev/nvme0n1p7
I: (UUID=00dc2a94-54a5-4ffc-b7bf-10e3432951b2)
I: Set the RESUME variable to override this.

最后:

sudo systemctl unmask systemd-udevd.service
sudo systemctl start systemd-udevd.service

总结

systemd 的更新导致出现了一系列的错误,最后算是回到了最初的起点,当然自己也学到了不少。希望其中一两个解决方法能够帮助到大家。

若有帮助,还望给予一个小小的赞,不胜感激。

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值