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

image

比如常用的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

 

posted @ 2025-08-05 10:30  lsgxeva  阅读(249)  评论(1)    收藏  举报