WSL中apt升级systemd时报错:无法锁定passwd文件
WSL中apt升级systemd时报错:无法锁定passwd文件
来源 https://www.neohope.com/2025/06/29/wsl2%e4%b8%adapt%e5%8d%87%e7%ba%a7systemd%e6%97%b6%e6%8a%a5%e9%94%99%ef%bc%9a%e6%97%a0%e6%b3%95%e9%94%81%e5%ae%9apasswd%e6%96%87%e4%bb%b6/
1、环境:
Windows10+WSL2+Ubuntu24
PS:另一台电脑Windows11+WSL2+Ubuntu24,不会报错
2、再现方式及错误信息
Reading package lists... Done Building dependency tree... Done Reading state information... Done Calculating upgrade... Done ... ... Setting up systemd (255.4-1ubuntu8.8) ... Initializing machine ID from random generator. Failed to take /etc/passwd lock: Invalid argument dpkg: error processing package systemd (--configure): installed systemd package post-installation script subprocess returned error exit status 1 Errors were encountered while processing: systemd E: Sub-process /usr/bin/dpkg returned an error code (1)
3、错误发生原因
systemd升级的脚本,会调用systemd-sysusers,systemd-sysusers会尝试通过fcntl锁定文件,但WSL中fcntl实现效果与Linux中不同,导致脚本执行失败。
更进一步的解释:
Linux中文件锁是基于文件描述符的,子进程会自动继承该文件锁。
Windows中文件锁是基于进程的,子进程需要自行获取新的文件锁。
WSL中,实现方式,更接近与Windows,重复获取同一个文件的锁自然是失败的。
openat(AT_FDCWD, "/etc/.pwd.lock", O_WRONLY|O_CREAT|O_NOCTTY|O_NOFOLLOW|O_CLOEXEC, 0600) = 3 fcntl(3, F_OFD_SETLKW, {l_type=F_WRLCK, l_whence=SEEK_SET, l_start=0, l_len=0}) = -1 EINVAL (Invalid argument)
4、如何绕过该错误
# 原文在此:https://github.com/microsoft/WSL/issues/10397 # 切换到/bin # 将systemd-sysusers修改为systemd-sysusers.org # 将systemd-sysusers做成一个echo的符号链接(用于欺骗升级脚本,让其以为得到了正确的结果) # 切换回之前的目录 sudo su cd /bin && mv -f systemd-sysusers{,.org} && ln -s echo systemd-sysusers && cd - exit # 修复所有依赖 sudo dpkg --configure -a # 修复包依赖 sudo apt --fix-broken install
---------------------------
dpkg:Error processing package XXX (--configure)
来源 https://zhuanlan.zhihu.com/p/459871397
不管是原生Linux系统还是Win10自带的Ubuntu Linux子系统,安装一些工具比较常用的是Linux自带的sudo apt install xxx或者sudo apt-get install xxx,两者没有任何区别。
查看apt-get使用可以输入:apt-get install --help
比如常用的sudo apt install xxxx:安装某个软件
sudo apt reinstall xxxx :重新安装该软件
sudo apt autoremove xxxx :卸载该软件
今天使用 sudo apt install colordiff 软件时遇到了一个错误:
dpkg:error processing lackage colordiff (--configure)
subprocess installed post-installation script returned error exit status 127
出现这个错误的原因是之前安装软件的时候出现中断情况,或者你强行终止安装导致不完全的安装。
解决方法:
sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old
sudo mkdir /var/lib/dpkg/info
sudo apt-get update
再次执行sudo apt-get install xxx即可。
============ End