升级后我收到此错误

我在最近的升级后收到此错误消息:

dpkg: dependency problems prevent configuration of initramfs-tools: initramfs-tools depends on initramfs-tools-bin (<< 0.99ubuntu13.2.1~); however: Version of initramfs-tools-bin on system is 0.103ubuntu0.2. klibc-utils (2.0.1-1ubuntu2) breaks initramfs-tools (<= 2.28); however: Package mountall is not configured yet. dpkg: error processing initscripts (--configure): dependency problems - leaving unconfigured dpkg: dependency problems prevent configuration of upstart: upstart depends on initscripts; however: Package initscripts is not configured yet. upstart depends on mountall; however: Package mountall is not configured yet. dpkg: error processing upstart (--configure): dependency problems - leaving unconfigured dpkg: dependency problems prevent configuration of passwd: passwd depends on upstart-job; however: Package upstart-job is not installed. Package upstart which provides upstart-job is not configured yet. dpkg: error processing passwd (--configure): dependency problems - leaving unconfigured No apport report written because MaxReports is reached already No apport report written because MaxReports is reached already No apport report written because MaxReports is reached already Errors were encountered while processing: initramfs-tools plymouth mountall initscripts upstart passwd E: Sub-process /usr/bin/dpkg returned an error code (1) 

打开终端并执行以下命令:

 sudo apt-get autoremove sudo apt-get --purge remove && sudo apt-get autoclean sudo apt-get -f install sudo dpkg-reconfigure -a 

上一个命令需要一些时间取决于系统中安装的软件包。 所以请耐心等待。 如果您没有任何损坏/残留包,它将无任何消息静默执行。

 sudo apt-get update sudo apt-get upgrade && sudo apt-get dist-upgrade sudo dpkg-reconfigure -a sudo dpkg --configure -a sudo update-initramfs -u 

然后重新启动系统。

我的一行代码删除旧内核(这也释放了磁盘空间):

 dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge 

解释(记住, |使用上一个命令的输出作为下一个命令的输入)

  • dpkg --list列出了所有已安装的软件包
  • grep linux-image查找已安装的linux映像
  • awk '{ print $2 }'只输出第二列(这是包名)
  • sort -V按版本号按顺序放置项目
  • sed -n '/'`uname -r`'/q;p'打印当前内核之前的行
  • xargs sudo apt-get -y purge清除找到的内核

展开sed调用:

  • -n告诉sed要安静
  • `uname -r`输出当前安装的内核版本 – 我们将其包含在反引号中,以便输出包含在命令中(您可能还会将其视为$(uname -r)
  • /something/q表示匹配’something’时停止(在这种情况下,某些东西是uname -r输出) – /环绕正则表达式
  • p是打印
  • ; 是命令separtor,所以/something/q;p表示匹配时退出,否则打印

总而言之, sed -n '/'`uname -r`'/q;p'打印行,直到它与当前内核名称匹配。

如果你是偏执狂(像我一样),你可以让最后一部分xargs echo sudo apt-get -y purge以便打印清除旧内核的命令,然后你可以在运行之前检查是否包含任何意外的内容。


修改版本以删除标题:

 dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge 

注意: sed调用已修改。 "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"仅提取版本(例如“ 3.2.0-44“),没有”-generic“或类似于uname -r


一体化版本删除图像和标题(结合上面的两个版本):

 echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge