分类 Linux 下的文章

本来我不想换手机,但是最近被设备权限导致的一些问题恶心到了。痛定思痛,务必把设备权限拿回自己的手里,简单查询了一下确定OnePlus Ace3V 可以解锁Bootloader lock且价格合适之后我就下单花了1455买了,昨天买今天到,顺丰效率很高。
随机赠送了充电头和红色USB A2C线材,充电器型号为:VCBAOBCH ,手机代号:JHPC
到手后立即

sudo apt install adb fastboot 
adb reboot bootloader
fastboot flashing unlock

解锁完整个人都舒了口气,接下来迁移旧机数据,随后备份init.img 再刷入KernelSU即可将权限拿回自己手里。

问题原因

Linux(包括 Debian 12)默认将硬件时钟(RTC)设置为 UTC 时间(协调世界时),而 Windows 11 则会将硬件时钟视为 本地时间(Local Time)。因此,当你从 Windows 切换到 Debian 时,Linux 会将硬件时钟视为 UTC,并根据你的时区调整显示时间;同样,从 Debian 切换到 Windows 时,Windows 会将硬件时钟视为本地时间,从而导致时间显示错误。

要解决这个问题,你可以选择以下两种方法之一:要么让 Linux 也使用本地时间,要么让 Windows 使用 UTC 时间。

解决方案一:将 Linux 设置为使用本地时间

如果你更常使用 Windows,或者更习惯 Windows 处理本地时间的方式,你可以让 Debian 12 也将硬件时钟视为本地时间。这样在切换操作系统时,时间显示将保持一致。

步骤

  1. 在 Debian 12 中执行以下命令,将硬件时钟设置为本地时间:

    timedatectl set-local-rtc 1 --adjust-system-clock
  2. 运行以下命令,验证设置是否生效:

    timedatectl
  3. 你应该在输出中看到类似以下内容:

    RTC in local TZ: yes

这意味着你的 Linux 系统现在会使用本地时间,而不是 UTC 时间。

注意事项

虽然这种方法简单有效,但可能会对依赖于 UTC 时间的服务产生影响。例如,一些日志系统或时间同步服务可能会在这种设置下产生错误的时间戳。因此,如果你在 Linux 下运行这些服务,请谨慎选择该方案。

解决方案二:将 Windows 设置为使用 UTC

如果你更常使用 Linux 或者希望遵循 UTC 时间的国际标准,可以选择让 Windows 11 使用 UTC 时间。这样,两个操作系统都将以 UTC 为基础进行时间显示,避免冲突。

步骤

  1. 按下 Win + R,输入 regedit,并按回车,打开 Windows 注册表编辑器。
  2. 导航到以下路径:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
  3. 在右侧区域,右键单击空白区域,选择 新建 > DWORD(32位)值,并将其命名为 RealTimeIsUniversal
  4. 双击该值,将其数值数据设置为 1,然后点击 确定
  5. 重启 Windows 使更改生效。

注意事项

这种方法对 Windows 的使用几乎没有影响,特别是如果你不依赖 Windows 的时间戳精确性(如对本地时间的依赖较少)。Windows 和 Linux 都会以 UTC 为基准,保证两个系统时间一致。

总结

在双系统中纠正时间错误有两种解决方法,分别是让 Linux 使用本地时间 或者 Windows 使用 UTC 时间。根据你日常使用的操作系统以及对时间精度的需求,你可以选择适合你的方案:

  • 如果你更常使用 Windows,选择 解决方案一
  • 如果你更常使用 Linux,或者希望两个系统都基于 UTC 时间,选择 解决方案二

这样,无论你在两个系统之间如何切换,都能确保时间显示正确。


必看:NvidiaGraphicsDrivers ——Debian Wiki

启用专有/争议存储库

命令忘了,手动编辑吧=-=手动编辑是不可能的,一行命令能解决我为什么要再打开编辑器?
sudo apt-add-repository non-free
sudo apt-add-repository contrib
你还可以使用--remove参数禁用某个存储库,比如main

安装驱动

sudo apt install nvidia-driver firmware-misc-nonfree

启用wayland

使用NVIDIA驱动程序启用内核模式设置

echo 'GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX nvidia-drm.modeset=1"' | sudo tee /etc/default/grub.d/nvidia-modeset.cfg
sudo update-grub
## 避免休眠问题
sudo apt install nvidia-suspend-common  #可能已被安装
sudo systemctl enable nvidia-suspend.service
sudo systemctl enable nvidia-hibernate.service
sudo systemctl enable nvidia-resume.service

验证是否已启用PreserveVideoMemoryAllocations NVIDIA模块参数

cat /proc/driver/nvidia/params | grep PreserveVideoMemoryAllocations
我们希望他输出1
这时候你大概还没有在安装后重启操作系统,所以这个文件压根还不存在。为了一劳永逸,你可以执行如下命令提前解决,反正多重复一次也没什么关系。
echo 'options nvidia NVreg_PreserveVideoMemoryAllocations=1' | sudo tee /etc/modprobe.d/nvidia-power-management.conf
sudo reboot #重启直接选择Wayland登录,如果你刚安装好的的操作系统没被你动过别的地方那么Wayland应该可用正常使用。

本文标题很长,但是没有废话:请再次确定你的设备情况是否与我相同
解决Debian12 N卡驱动更新到bookworm-backports 版本BIOS 使用dGPU(独显直连)模式时被迫从wayland切换到X11导致开机无法自动切换到KDE登录界面的问题

为什么我不得不使用X11

我通过backports更新到了最新的Nvidia driver 版本:
NVIDIA Driver Version:535.183.06
NVML Version:12.535.183.06
这个版本即使设置nvidia_drm.modeset=1 wayland登录仍然会卡在黑屏+鼠标的界面动弹不得。
即使时过去的Stable版本驱动可使用wayland,也不可避免出现多窗口时闪屏的问题且无法修复。
所以我不得不使用x11。

解决问题

sudo nvidia-settings
选择X Server Display Configuration
确定此页面配置信息无误后点击右下角Save to X Configuration File
点击保存即可。
接下来关机重启X11登录试试吧!

准备工作

一个Canokey Pigeon,本地gpg密钥。(推荐主密钥+子密钥,仅将子密钥转移到Canokey里。)
如果你还没有准备好GPG密钥,请参考使用GPG 生成SSH密钥替代密码进行SSH登录认证 & 续期GPG密钥

阅读官方文档/社区案例

CanoKeys 使用文档
Canokey 签名和认证应用指南——Dejavu’s Blog
我在Debian12上使用非root账户 依赖systemd,因此需要创建并修改以下文件:

sudo nano /etc/udev/rules.d/69-canokeys.rules
# GnuPG/pcsclite
SUBSYSTEM!="usb", GOTO="canokeys_rules_end"
ACTION!="add|change", GOTO="canokeys_rules_end"
ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="42d4", ENV{ID_SMARTCARD_READER}="1"
LABEL="canokeys_rules_end"

# FIDO2/U2F
# note that if you find this line in 70-u2f.rules, you can ignore it
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="42d4", TAG+="uaccess", GROUP="plugdev", MODE="0660"

# make this usb device accessible for users, used in WebUSB
# change the mode so unprivileged users can access it, insecure rule, though
#SUBSYSTEMS=="usb", ATTR{idVendor}=="20a0", ATTR{idProduct}=="42d4", MODE:="0666"
# if the above works for WebUSB (web console), you may change into a more secure way
# choose one of the following rules
# note if you use "plugdev", make sure you have this group and the wanted user is in that group
#SUBSYSTEMS=="usb", ATTR{idVendor}=="20a0", ATTR{idProduct}=="42d4", GROUP="plugdev", MODE="0660"
SUBSYSTEMS=="usb", ATTR{idVendor}=="20a0", ATTR{idProduct}=="42d4", TAG+="uaccess"

修改后
sudo udevadm control --reload-rules && sudo udevadm trigger

安装必要的依赖

sudo apt install libpcsclite1 pcscd scdaemon
否则在执行:gpg --card-status 查看智能卡状态时会出现如下错误
gpg: 从 ‘scdaemon’ 获取版本时出现错误: 没有智能卡守护进程gpg: OpenPGP 卡不可用:没有智能卡守护进程

依赖正常安装后先查看本地密钥列表
xfox@JiaoLoong5-76s:~$ gpg --list-keys

/home/xfox/.gnupg/pubring.kbx

pub rsa4096 2022-10-09 [SC] [有效至:2028-01-31]

  7CF9D5312AC4AF470A6F83E052DD030D36987CE3

uid [ 未知 ] x fox mailto:axfox@foxmail.com
sub rsa4096 2022-10-09 [E] [有效至:2025-10-08]
sub ed25519 2024-02-01 [A] [有效至:2028-01-31]

开始转移

转移后的本地计算机的密钥将消失,如果你希望他仍然存在必须提前导出备份)
gpg --expert --edit-key yourmail@mail.com/指纹
key 1 # 勾选第一个子密钥(勾选后回显内容里可见被勾选密钥前有一个*
keytocard #写入以上勾选的一个密钥
key 1 # 取消勾选
重复以上操作将你需要转移到Canokey的所有子密钥迁移进去。
此时输入save 即可保存你的操作。

特别注意 LOOK at ME!

官方文档要求你修改~/.gnupg/scdaemon.conf 但是,你不应该完全按照docs写的那样操作!

pcsc-driver /usr/lib/libpcsclite.so #Debian用户无需此行!系统缺省路径即为正确路径,如果一定要填写,务必按照你的硬件架构填写正确的库文件路径!
card-timeout 5 #你不写也不是不能用
disable-ccid  #Debian12/13无需此行!仅在GnuPG版本超过2.4的发行版上启用!

省流: Debian用户别去改~/.gnupg/scdaemon.conf

为什么要使用Wine

因为我打算使用网易云音乐,但是他的Linux客户端已经没人维护里,Debain12无法安装也无法启动。隔壁QQ音乐是可安装但是和提供的Appimage一样打开就闪退。
暂时还不能完全离开这些专有服务,只能去用wine了。

开始安装

有个惊喜,不知道是不是维护者看到了我发的帖子,总之Wine官网的下载安装页面更新了,简中Wiki的万年遗留错误也修了。

现在官方文档很清楚,我不再重复。
参见:Debian-Ubuntu安装 WineHQ 安装包

解决证书问题

有的人会卡在第二步:


xfox@JiaoLoong5-76s:~$  sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
--2024-09-15 00:21:18--  https://dl.winehq.org/wine-builds/winehq.key
正在解析主机 dl.winehq.org (dl.winehq.org)... 2a04:4e42:8c::729, 146.75.114.217
正在连接 dl.winehq.org (dl.winehq.org)|2a04:4e42:8c::729|:443... 已连接。错误: “dl.winehq.org” 的证书不可信。

如果你去搜索,恐怕很容易找到这样的内容: 使用--no-check-certificate参数 ,特别是*SDN的垃圾帖子。
但是,这是非常危险且不被推荐的!这意味着你和服务器的通信可能不知不觉的受到中间人篡改。

手动信任证书

浏览器打开https://dl.winehq.org/ 在证书详情页面选择导出,接下来

sudo cp _.winehq.pem /usr/local/share/ca-certificates/winehq.crt
sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
rehash: warning: skipping ca-certificates.crt,it does not contain exactly one certificate or CRL
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

然后继续执行即可。

额外的

证书验证失败也可能是你的本地设备时间偏差过大导致的。
timedatectl #查看当前时间处于什么状态,是否偏差过大 ,Windows+Linux双系统易出此问题
sudo apt update
sudo apt install systemd-timesyncd
sudo systemctl enable systemd-timesyncd
sudo systemctl start systemd-timesyncd
sudo systemctl status systemd-timesyncd
sudo timedatectl set-local-rtc 0 #设置本地时间为UTC时间
timedatectl #检查时间

原委

今天下班回家一开mumble发现有延迟数值正常显示但是连不上服务器:连接服务器失败:远端主机关闭了这个连接。

排查问题

ssh home.xfox.fun 有EN经典报错:网络不可达
我还以为又宕机了,但是经过检查我的J3160活得好好的 ssh -4 -p 22022 home.xfox.fun一连就上了。
这时候再对比JiaoLoong5 nslookup回报的IPv6地址和J3160上执行ip addr返回的地址确定是DDNS出问题了,没有更新最新的ipv6地址。
看过我之前文章的同学应该知道我在使用Podman替代Docker部署NewFuture/DDNS实现ipv6 DDNS,但是在不久前更新过容器镜像后我发现服务不稳定,因为容器会自动停止运行。
自从我使用这个容器,日志里一直存在警告:
WARNING:root:Cache file is out of dated.
我不确定这是否对容器稳定性造成了影响,但是在我设定了restart=always的情况下容器还是停止了那可太玄学了。
所以我这次放弃了容器部署,直接本地从官方源码仓库部署。

开始部署

git clone https://github.com/NewFuture/DDNS

仓库文件会存储在当前目录下的DDNS文件夹里。

cd DDNS 
pyhton run.py

然后你可能得到提示:-bash: python: 未找到命令
这是因为Debain12默认安装了Python3但是默认没有将python命令软链接到pyhon3

为了解决这个问题你可以使用apt安装一个软件包:python-is-python3 (这是很久之前闲来无事apt search 发现的,没想到今天就又用上了。)如果你不想优雅的解决问题那就自己手动创建链接吧=-=。
这一步是必须的,因为NewFuture/DDNS/blob/v3.0.2/systemd.sh里写死了命令行:
ExecStart=/usr/bin/env python /usr/share/DDNS/run.py -c /etc/DDNS/config.json
所以你要么去修改源码加个3,要么....就像我现在教你的一样。
接下来执行:

sudo ./systemd.sh install

即可利用systemd注册一个名为ddns的服务。
但是需要注意一个小坑,git clone 拉下仓库文件后默认没有config.json
所以直接执行install的时候systemd.sh里的cp config.json /etc/DDNS/config.json这行压根就不会生效。
你的/etc/DDNS/里就不会有config.json
为了避免这个问题,你最好下拉仓库后先执行python run.py 让ddns脚本先在DDNS仓库文件里生成一个config.json

修改配置文件

先参考配置参数表再修改官方生成的示例配置文件。

启用服务

sudo systemctl enable ddns
sudo systemctl restart ddns

检查状态

sudo systemctl status ddns

参考内容:Force SSH Client to Use IPv4 or IPv6

假设我要连接的主机为:home.xfox.fun

两种方案

  1. 命令行直接使用特定参数指定使用ipv4/6
  2. 编辑配置文件对特定主机指定使用ipv4/6

    命令行参数

指定使用ipv4连接: ssh -4 home.xfox.fun
指定使用ipv6连接:ssh -6 home.xfox.fun

编写配置文件

对于配置文件闻之亦有两种选择:

  1. 全局用户生效 /etc/ssh/ssh_config
  2. 当前用户生效 ~/.ssh/config

Host home.xfox.fun
AddressFamily inet6 #对于ipv4 写为inet即可