当我在 Ubuntu 18.10 中运行时sudo apt update
收到以下错误消息:
E: flAbsPath on /var/lib/dpkg/status failed - realpath (2: No such file or directory)
E: Could not open file - open (2: No such file or directory)
E: Problem opening
E: The package lists or status file could not be parsed or opened.
运行后sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status
显示以下错误信息:
cp: cannot stat '/var/lib/dpkg/status-old': No such file or directory
答案1
运行以下命令:
sudo mkdir -p /var/lib/dpkg/{alternatives,info,parts,triggers,updates}
sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
sudo apt-get download dpkg
sudo dpkg -i dpkg*.deb
sudo apt-get download base-files
sudo dpkg -i base-files*.deb
sudo apt-get update
sudo apt-get check
答案2
/var/lib/dpkg/status
从备份文件恢复文件( /var/lib/dpkg/status-old
)。打开终端并输入:
sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status
然后再次运行sudo apt update
。
如果这不起作用,请运行以下命令:
sudo touch /var/lib/dpkg/status
sudo apt update && sudo apt upgrade
sudo reboot
sudo apt full-upgrade
答案3
我的/var/lib/dpkg/status
文件被删除了,根据 apt 的说法,我没有安装任何软件包,因为它是根据文件来确定的status
。我使用以下方法重新生成/var/lib/dpkg/status
文件。这种方法在基于 Debian 的 Kali GNU/Linux 中对我来说非常有效。
笔记:
此方法假定所有已安装的包都已在
/usr/share/doc
目录中创建条目。此方法从一个空
/var/lib/dpkg/status
文件开始。如果您有多个存储库提供相同的软件包,则此方法可能不起作用。如果您有多个存储库提供相同的软件包,请暂时禁用子存储库,然后删除 中的存储库的软件包缓存列表
/var/lib/apt/lists/
。
删除当前
status
文件status-old
。删除前请备份文件,以防出现错误。mkdir ~/dpkg-status-backup cp /var/lib/dpkg/{status,status-old} ~/dpkg-status-backup rm /var/lib/dpkg/{status,status-old}
获取已安装的所有软件包的列表,每行一个软件包。注意:是
1
(一) 而不是l
(小写的L
)。ls -1 /usr/share/doc > installed-packages.list
将包列表重写为一行。
tr '\n' ' ' < installed-packages.list > installed-packages-one-line.list
创建一个空
status
文件以使 apt-cache 能够运行。touch /var/lib/dpkg/status
使用 apt-cache 生成包记录。
cat installed-packages-one-line.list | xargs apt-cache show > raw-status-file
可能
raw-status-file
包含Status:
某些包的字段。请删除它们以避免重复。sed -i '/^Status:/d' raw-status-file
为每个包添加
Status:
字段以向 apt 和 dpkg 指示它们已安装。sed -i 's/^Package:.*/&\nStatus: install ok installed/' raw-status-file
status
删除文件:SHA1:
、SHA256:
、MD5sum:
、Description-md5:
、Size:
&中 dpkg 不需要的字段Filename:
。sed -i '/^MD5sum:/d' raw-status-file sed -i '/^SHA1:/d' raw-status-file sed -i '/^SHA256:/d' raw-status-file sed -i '/^Size:/d' raw-status-file sed -i '/^Filename:/d' raw-status-file sed -i '/^Description-md5:/d' raw-status-file
raw-status-file
运行上述命令后的结果现在是实际的 dpkgstatus
文件。mv raw-status-file status
将文件复制
status
到/var/lib/dpkg/
asstatus
和status-old
。cp status /var/lib/dpkg/status cp status /var/lib/dpkg/status-old
现在运行 dpkg 来验证您的新状态文件。如果出现错误,请从 dpkg 的错误报告中获取提示并进行相应解决。如果没有出现错误,则文件
status
具有正确的语法。dpkg --get-selections
重新启用已禁用的 repos,然后运行 apt 来更新包缓存列表,以防止出现错误
packages have unmet dependencies
。apt update
如果您在 apt 中遇到
packages have unmet dependencies
错误,请确保您已启用提供依赖项的附属存储库,然后运行 aptitude。我更喜欢它,aptitude
因为它更擅长解决软件包安装错误。aptitude full-upgrade
如果你没有收到任何错误或你的错误已经从 apt 或 dpkg 中解决,并且得到“包裹已经是最新版本...”当您尝试安装一个您确定已经安装的程序时,例如coreutils
,那么您就成功重新生成了 dpkgstatus
文件。
清理创建的临时文件和备份。
rm installed-packages.list installed-packages-one-line.list status
rm -r ~/dpkg-status-backup