sudo apt install -y build-essential curl

在Linux环境中输入这个命令行,有报错如下

Sub-process /usr/bin/dpkg returned an error code (1)

网上有很多资料,大多都是给出一种或多种解决方案,解释清楚原因的甚少,今天我来复盘一下这个问题以及解决方案。


具体步骤
(1)备份/var/lib/dpkg/info这个目录,我们使用mv命令重命名这个目录代替cp起到备份的作用

sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_bak

​​⚪为什么需要备份并替换 /var/lib/dpkg/info 目录?​​

  • ​​/var/lib/dpkg/info 的作用​​:
    该目录存储了系统中所有已安装软件包的元数据(如配置文件、依赖关系、状态记录等)。如果这些文件损坏(例如因中断安装、磁盘错误或手动误操作),dpkg 将无法正确识别软件包状态,导致后续操作报错。
  • ​​备份与替换的逻辑​​:
    通过 mv 重命名原目录(而非直接删除),保留原始损坏状态的备份。新建空的 info 目录后,dpkg 会在此生成新的元数据文件,覆盖原有损坏内容,从而重置状态。

(2)重新创建/var/lib/dpkg/info这个目录

sudo mkdir /var/lib/dpkg/info

(3)然后执行apt --fix-broken install,执行完之后再次安装你的软件apt install softname,期间有告警不必理会。

sudo apt --fix-broken install
sudo apt install softname

⚪apt --fix-broken install 的作用​​

  • ​​依赖关系修复​​:
    该命令会尝试自动修复因依赖缺失或冲突导致的软件包问题。例如,若某个软件包因依赖未满足而无法安装,--fix-broken 会自动安装缺失的依赖项或移除冲突包。
  • ​​重新生成状态文件​​:
    在干净的 info 目录下执行此命令,dpkg 能重新生成正确的软件包状态记录,解决因元数据错误导致的 E: Sub-process /usr/bin/dpkg returned an error code (1)。

(4)把新创建info目录下生成的文件复制到原先的info中即我们第一步备份改名的那个目录info.bak,然后删除你创建的info文件,或者不删除改个其他名字起个备份效果也行,之后再把第一步备份的文件info.bak改回info

cp /var/lib/dpkg/info/* /var/lib/dpkg/info_bak
rm -rf /var/lib/dpkg/info 或者mv /var/lib/dpkg/info /var/lib/dpkg/info_bak
mv /var/lib/dpkg/info.bak /var/lib/dpkg/info

⚪复制新旧 info 目录内容的意义​​

  • ​​合并历史配置​​:
    新生成的 info 目录包含修复后的状态文件,而备份的 info.bak 保留原有软件包的配置信息(如已安装包的列表)。将两者合并后,既能保留用户自定义配置,又能修复损坏部分。
  • ​​还原目录结构​​:
    最终将备份的 info.bak 重命名为 info,确保系统恢复到标准状态,避免后续操作因目录名称异常报错。

⚪为何能解决 E: Sub-process /usr/bin/dpkg returned an error code (1)?​​

  • ​​核心问题​​:该错误通常由 dpkg 数据库损坏或状态不一致引发。例如:
    • 软件包安装中断导致元数据不完整。
    • 手动修改 status 文件引发冲突。
    • 依赖关系循环或版本冲突。
  • ​​修复逻辑​​:
    通过重置 info 目录强制 dpkg 重新初始化状态,结合 apt --fix-broken install 自动修复依赖链,最终恢复软件包管理系统的完整性。

​​!!!注意事项​​

  • ​​风险​​:直接操作 /var/lib/dpkg/info 可能导致系统软件包记录丢失,需谨慎操作。
  • ​​替代方案​​:若问题较轻,可先尝试 sudo dpkg --configure -a 或 sudo apt clean 清理缓存。
  • ​​适用场景​​:此方法适用于 dpkg 元数据严重损坏且常规修复无效的情况。


总体操作步骤:

sudo mv /var/lib/dpkg/info /var/lib/dpkg/info.bak   //记住先备份
sudo mkdir /var/lib/dpkg/info                      //创建新的info目录
sudo apt --fix-broken install
sudo apt install softname      //安装你要装的软件
sudo cp /var/lib/dpkg/info/* /var/lib/dpkg/info.bak     //把新创建info目录下生成的文件复制到原先的info中,然后在把原先的info改回来
sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_bak
sudo mv /var/lib/dpkg/info.bak /var/lib/dpkg/info

该方法通过​​重置 dpkg 的元数据​​和​​依赖修复机制​​,解决了因状态文件损坏或依赖冲突导致的安装错误。其核心在于利用系统工具自动重建正确状态,而非手动修复具体错误点,因此具有普适性。

更多推荐