WSL2中apt升级systemd时报错:无法锁定passwd文件

1、环境:
Windows10+WSL2+Ubuntu24
PS:另一台电脑Windows11+WSL2+Ubuntu24,不会报错

2、再现方式及错误信息

# apt-get upgrade
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的符号链接(用于欺骗升级脚本,让其以为得到了正确的结果)
# 切换回之前的目录
cd /bin && mv -f systemd-sysusers{,.org} && ln -s echo systemd-sysusers && cd -

# 修复包依赖
apt --fix-broken install

# 继续升级
apt-get upgrade

蓝牙鼠标支持双系统

操作系统与蓝牙鼠标之间的配对,是通过三个关键值完成的:
本机蓝牙ID,鼠标蓝牙ID,LinkKey
蓝牙鼠标在配对后,连接电脑蓝牙设备时,三个值必须一致,双方才能连接成功。
对于单系统来说不会引起什么问题,但对于双系统的电脑来说,就会有问题了。

比如,你是Windows和Ubuntu双系统,或Windows和Mac双系统。
在第一个系统中配对后,会生成一个LinkKey,鼠标就可以在第一个系统中连接成功,但无法在第二个系统中连接成功。
在第二个系统配对后会生成另外一个LinkKey,鼠标就可以在第二个系统中连接成功,但无法在第一个系统中连接成功。
所以,要蓝牙鼠标支持双系统,就要把两个系统的LinkKey改为一致。

一、首先是Windows和Ubuntu双系统:
1、在Windows下配对鼠标
2、在Ubuntu下配对鼠标
3、在Ubuntu下查找配对后的LinkKey

#3.1、定位你的设备配置文件
#一般来说本机蓝牙ID只会有一个,是以:分割的一长串十六机制数字
#蓝牙设备,就是全部配过对的蓝牙设备,可以通过查看info文件判断哪个是你的蓝牙鼠标
sudo vi /var/lib/bluetooth/本机蓝牙ID/鼠标蓝牙ID/info
#3.2、找到LinkKey
#找到下面部分,并记录下来
[linkkey]
key=16位16进制数字

4、重启进入Windows

#4.1、运行命令regedit,打开注册表编辑器
#4.2、定位到下面的位置,其中:
#本机蓝牙ID与Linux下一致,只是没有:分割
#鼠标蓝牙ID与Linux下一致,只是没有:分割
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\本机蓝牙ID
鼠标蓝牙ID=16位16进制数字
#4.3、修改LinkKey,使其与Ubunt下LinkKey一致

5、重新连接蓝牙鼠标试试,是不是两个系统都可以了?

此外,由于Ubuntu默认BIOS中是UTC时间,而Windows默认BIOS是本地时区时间,所以重启后,时间会不一致,比如东八区会相差8小时。可以通过将Ubuntu的BIOS时间也设置为本地时区来解决:

sudo timedatectl set-local-rtc 1

二、然后是Windows和Mac双系统:
1、在Windows下配对鼠标
2、在Mac下配对鼠标
3、在Mac下查找配对后的LinkKey

sudo defaults read /private/var/root/Library/Preferences/blued.plist
#找到Linkkey【一串16位16进制数字】,并记录下来

4、计算Windows的Linkkey

#4.1、假设Mac下的LinkKey为
#98542ff9 88e19449 475250e1 3943255b
#4.2、按每两个数字进行分组,然后从后向前倒序排列,就可以得到Windows下的LinkKey
#空格是为了方便大家查看才添加的
#5b254339 e1505247 4994e188 f92f5498

5、重启进入Windows

#4.1、运行命令regedit,打开注册表编辑器
#4.2、定位到下面的位置,其中:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\本机蓝牙ID
鼠标蓝牙ID=16位16进制数字
#4.3、修改LinkKey,使其与计算的到的LinkKey一致

6、重新连接蓝牙鼠标试试,是不是两个系统都可以了?

三、上面的都好烦,有没有其他办法?
1、使用有线鼠标
2、使用带有接收器的蓝牙鼠标

Windows禁用蓝牙设备自动唤醒

蓝牙设备自动唤醒功能有时候很有用,有时候很鸡肋。
有一次把笔记本休眠,放到包里,结果被蓝牙鼠标重新唤醒了Windows,导致整个电脑暴热,还好电量耗尽
于是就想禁用蓝牙唤醒:

# 查询设备
powercfg -a
powercfg /devicequery wake_armed
powercfg /devicequery wake_programmable
# 禁用设备
powercfg /devicedisablewake "HID-compliant mouse (003)"
# 启用设备自动唤醒
powercfg /deviceenableawake "HID-compliant mouse (003)"

Windows平台上Chrome支持Custom Protocol

在Windows平台上,也可以通过Custom Protocol实现Chrome打开EXE进程,调用CS程序

1、通过注册表,实现单一用户支持Custom Protocol

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\MyProtocol]
"URL Protocol"=""
@="MyProtocol"

[HKEY_CURRENT_USER\SOFTWARE\Classes\MyProtocol\DefaultIcon]
@="FULL_PATH_TO_MYAPP\\MYAPP.exe.exe, 1"

[HKEY_CURRENT_USER\SOFTWARE\Classes\MyProtocol\Shell]

[HKEY_CURRENT_USER\SOFTWARE\Classes\MyProtocol\Shell\Open]

[HKEY_CURRENT_USER\SOFTWARE\Classes\MyProtocol\Shell\Open\command]
@="\"FULL_PATH_TO_MYAPP\\MYAPP.exe\" \"%1\""

2、通过注册表,让全体用户支持Custom Protocol,需要管理员权限

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\Software\Classes\MyProtocol]
"URL Protocol"=""
@="MyProtocol"

[HKEY_CURRENT_USER\SOFTWARE\Classes\MyProtocol\DefaultIcon]
@="FULL_PATH_TO_MYAPP\\MYAPP.exe.exe, 1"

[HKEY_CURRENT_USER\SOFTWARE\Classes\MyProtocol\Shell]

[HKEY_CURRENT_USER\SOFTWARE\Classes\MyProtocol\Shell\Open]

[HKEY_CURRENT_USER\SOFTWARE\Classes\MyProtocol\Shell\Open\command]
@="\"FULL_PATH_TO_MYAPP\\MYAPP.exe\" \"%1\""

Win10删除不想要的APP

一、Win10删掉不想要的APP
Win10会自带一些你不想要的APP,比如联系人、XBox什么的,有些可以在开始菜单右键删除,有些不让删除。下面就来删除这些你不想要的APP。
1、用管理员权限打开PowerShell
2、查看已经安装的APP

Get-appxpackage -allusers > package.txt

3、用Vim进行处理,删除不要的行

vim package.txt
:g!/PackageFullName/d
:sort
#这样你就得到了一个排序好的程序清单

4、按要求删除程序

#命令格式
#remove-appxpackage PackageFullName
#示例:
remove-appxpackage Microsoft.BingWeather_4.25.20211.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.GetHelp_10.1706.13331.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.Messaging_4.1901.10241.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.Microsoft3DViewer_5.1902.20012.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.MicrosoftStickyNotes_3.1.53.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.Office.OneNote_16001.11126.20076.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.People_10.1812.10232.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.Print3D_3.3.311.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.Wallet_2.4.18324.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.WindowsAlarms_10.1812.10043.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.WindowsMaps_5.1812.10071.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.Xbox.TCUI_1.24.10001.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.XboxApp_48.48.7001.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.XboxGameCallableUI_1000.18362.449.0_neutral_neutral_cw5n1h2txyewy
remove-appxpackage Microsoft.XboxGameOverlay_1.32.17005.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.XboxGamingOverlay_2.26.14003.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.XboxIdentityProvider_12.50.6001.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.XboxSpeechToTextOverlay_1.21.13002.0_x64__8wekyb3d8bbwe
remove-appxpackage Microsoft.YourPhone_0.0.13313.0_x64__8wekyb3d8bbwe

二、Win10删掉不想要的库

#1、Regedit打开注册表
#2、定位到这个路径
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace

#3、根据你想屏蔽的内容,在键值最后添加一个字符,比如X
下载{088e3905-0323-4b02-9826-5b99428e115f}
3D{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}X
未知{1CF1260C-4DD0-4ebb-811F-33C572699FDE}
图片{24ad3ad4-a569-4530-98e1-ab02f9417aa8}X
未知{374DE290-123F-4565-9164-39C4925E467B}
未知{3ADD1653-EB32-4cb0-BBD7-DFA0ABB5ACCA}
音乐{3dfdf396-dbec-4fb4-81d1-6a3438bcf4de}X
未知{A0953C92-50DC-43bf-BE83-3742FED03C9C}
未知{A8CDFF1C-4878-43be-B5FD-F8091C1C60D0}
桌面{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}
文档{d3162b92-9365-467a-956b-92703aca08af}
视频{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}X

#4、按上面操作后,Explorer中就只有三个库了:
下载、桌面、文档

三、Win10删掉不想要的开始菜单

C:\Users\neohope\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\

Win10隐私设置

1、隐藏explorer的快速访问功能

#1.1、打开注册表编辑器
regedit
#1.2、定位到下面的路径
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer
#1.3、新建一个DWORD (32-bit) Value的键值对
HubMode=1

2、关闭Cortana

#2.1、打开组策略编辑器
gepedit.msc
#2.2、定位路径
计算机配置/管理模板/Windows组件/搜索
#2.3、禁用Cortana
允许使用Cortana=已禁用

3、关闭搜索历史记录

开始/设置/Search/Permissions&History
My device history = off

4、关闭TaskView历史记录

开始/设置/Privacy/Activity history
去掉Store my activity history on this device
去掉Send my activity to Microsoft
点击Clear activity history

Windows创建符号连接

1、mklink
该命令可以创建符号链接、硬链接及快捷方式。

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      Creates a directory symbolic link.  Default is a file
                symbolic link.
        /H      Creates a hard link instead of a symbolic link.
        /J      Creates a Directory Junction.
        Link    specifies the new symbolic link name.
        Target  specifies the path (relative or absolute) that the new link
                refers to.

2、fsutil hardlink
该命令可以创建硬链接。

create          Create a hardlink
list            Enumerate hardlinks on a file

3、junction
该工具是SYSINTERNALS提供的,可以新增或删除符号链接。

The first usage is for displaying reparse point information, the
second usage is for creating a junction point, and the last for
deleting a junction point:
usage: junction.exe [-s] [-q] <file or directory>
       -q     Don't print error messages (quiet)
       -s     Recurse subdirectories

usage: junction.exe <junction directory> <junction target>
       example: junction d:\link c:\windows

usage: junction.exe -d <junction directory>

CMD常用命令17常用软件注册为Widows服务

1、Apache注册为Widows服务

httpd -k install

2、MySQL注册为Widows服务

mysqld --install MySQL --defaults-file="D:\MySQL\MySQL Server 5.1\my.ini"

3、PostgreSQL注册为Widows服务

pg_ctl.exe register -N "postgresql-8.4" -D "D:/PostgreSQL/8.4/data" -w

4、SVN注册为Widows服务

sc create svnserve binPath= "\"D:\Subversion\bin\svnserve.exe\" --service -r \"D:\Subversion\repository\"" displayname= "Subversion Service" depend= Tcpip start= auto 
sc start svnserve 
sc stop svnserve 
sc delete svnserve

5、redis注册为Widows服务

#loglevel 分为debug, notice, warning三级
redis-server.exe --service-install D:\Database\Redis2.8\db\redis.windows.conf --loglevel notice
redis-server --service-start
redis-server --service-stop
redis-server --service-uninstall

6、mongodb注册为Widows服务

mongod --dbpath=D:\Database\MongoDB3\db --logpath=D:\Database\MongoDB3\log\mongo.log --port 27027 --noauth --install -serviceName MongoDB01 --serviceDisplayName MongoDB01 
net start MongoDB01