
Category Archives: Windows
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\""
查看进程环境变量
1、Linux系统
cat /proc/pid/environ | tr '\0' '\n'
2、Windows系统
使用工具Process Explorer
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>