安装 Arch Linux 和 Debian 双系统至同一分区

问题

之前,稣的服务器都用 Debian 和 Hyper-V Server,桌面则用 Debian、macOS、Windows,从不用不支持 Secure Boot 的 Arch Linux。

直到遇见一个需要在 Arch Linux 物理机下才容易编译的项目……那就装个双系统吧!

现状

Debian 的豪华 SSD 只分两个区:

  • /dev/nvme0n1p1:EFI 分区,64MiB;

  • /dev/nvme0n1p2:btrfs 分区,剩余空间。

没有 swap 分区,毕竟稣有 48GB 内存,而且从不使用休眠。

思考

  1. 重新分区显得格外 Secure Boot,毕竟稣就是因为某些系统强行分了 20~30GB 做系统的备份分区,而拉黑它。这可是高贵的 SSD,多一个分区就意味着空间利用率降低一分!系统和软件都能轻易地恢复,备份啥呢?依托答辩还占着 20~30GB 这么巨大的坑!这拿来备份数据不香吗?

  2. Debian 12 的 / 挂在 btrfs 分区的 @rootfs 子卷,据说其它系统可能用的是其它名字的子卷,所以它们天然是能和谐地装在同一个分区的。比如 Ubuntu 和 OpenSUSE(哦喷稣𢶍)用 @ 子卷。而 Arch Linux 出了名的啥都能(让)自定义,所以装在 @arch 子卷的话,还能和 OpenSUSE(哦喷稣𢶍)组个三系统。

  3. 安装顺序有影响吗?没有!虽然稣是先装的 Debian,但哪个先都行。只要装一个 grub 就行,那就用 Debian 的,Arch Linux 不装即可。

步骤

1. 安装 Debian

唯一要注意的是:根目录选择 btrfs 格式,其它请参考《快速安装 Debian》。

2. 把 /home 指向 @home 子卷

建议两个系统都这么干。因为虽然是双系统,但用户还是一套的好,避免精神分裂!这样的好处很多,比如:只要在任意系统里设置一次用户的登录公钥,就能在两个系统都生效。

1
2
3
4
5
6
7
# 在 Debian 上操作
sudo mount -t btrfs -o compress=zstd /dev/nvme0n1p2 /mnt
sudo btrfs subvolume create /mnt/@home
# 可能需要移动现有文件到 /mnt/@home
sudo umount /mnt
sudo mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p2 /home
# 改 /etc/fstab

3. 安装 Arch Linux

请参考以下链接:

注意:安装 Debian 时已经分过区,到这步,只需要创建子卷:

1
2
3
btrfs subvolume create /mnt/@arch
# 相应地,挂载 Arch 根目录所在子卷到 /mnt 那步改为
mount -t btrfs -o subvol=/@arch,compress=zstd /dev/nvme0n1p2 /mnt

然后,@home 子卷之前已经创建,直接挂载即可。

最后,**不要安装引导程序!**重启去 Debian,手动加 Arch 的启动项。这步解释起来麻烦,直接发一下 Debian 的 /boot/grub/grub.cfg 里的片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
menuentry 'Arch Linux' --class archlinux --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9b30a786-55a7-4068-8886-226f147eef4d' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod btrfs
search --no-floppy --fs-uuid --set=root 9b30a786-55a7-4068-8886-226f147eef4d
echo 'Loading Arch Linux ...'
linux /@/boot/vmlinuz-linux root=UUID=9b30a786-55a7-4068-8886-226f147eef4d ro rootflags=subvol=@arch,compress=zstd nowatchdog
echo 'Loading initial ramdisk ...'
initrd /@/boot/initramfs-linux.img
}
menuentry 'Arch Linux fallback' --class archlinux --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9b30a786-55a7-4068-8886-226f147eef4d' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod btrfs
search --no-floppy --fs-uuid --set=root 9b30a786-55a7-4068-8886-226f147eef4d
echo 'Loading Arch Linux ...'
linux /@/boot/vmlinuz-linux root=UUID=9b30a786-55a7-4068-8886-226f147eef4d ro rootflags=subvol=@arch quiet
echo 'Loading initial ramdisk ...'
initrd /@/boot/amd-ucode.img /@/boot/initramfs-linux-fallback.img
}
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9b30a786-55a7-4068-8886-226f147eef4d' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod btrfs
search --no-floppy --fs-uuid --set=root 9b30a786-55a7-4068-8886-226f147eef4d
echo 'Loading Linux 6.1.0-21-amd64 ...'
linux /@rootfs/boot/vmlinuz-6.1.0-21-amd64 root=UUID=9b30a786-55a7-4068-8886-226f147eef4d ro rootflags=subvol=@rootfs quiet
echo 'Loading initial ramdisk ...'
initrd /@rootfs/boot/initrd.img-6.1.0-21-amd64
}

注意:直接修改 /boot/grub/grub.cfg 通常被认为是不好的,但这里的 Arch 是个不支持 Secure Boot 的擸𢶍,不用太客气。

答疑

  1. 这么做有啥好处?

    • 减少分区数量,提高 SSD 空间利用率,榨干每个颗粒。抠就要抠到极致。

    • 系统搞坏一个,还可能进另一个修。但比起虚拟机,没有安全性、健壮性上的优势。

    • 随时可以 chroot 到另一个系统。但比起容器,没有便捷性上的优势。

  2. EFI 分区 64MiB 够用吗?

    没翻过车,之前都用 40MiB 的,已经放大过。

警惕!劣质的 HDR 正在摧毁程序员的职业生涯

问题

有的屏幕看起来就容易眼睛疲劳,都不能愉快地写代码了!

故事

自从 2020 年,全面换成双 4K 显示器后,稣明显感觉眼睛不太够用!半天左右就开始无法直视屏幕。以为自己驾驭不了双 4K,吓得稣把它们分开使用。

但即使是单个 4K 显示器,看起来也比之前用两个 2K 累眼。即使换上 144Hz 的 AOC U28G2X/D 也没有改进多少。

稣一度以为人到中年就是不能再像之前那样能每天娱乐(但别人看起来是工作)18~20 小时都不会有任何不适。

解决

耿直的稣怎么也不会想到万恶的资本居然发现一种叫“8 抖 10”的技术,或者叫“8 位递色”,而开启伤害的动作居然是没深究就打开的“HDR”!

稣以前的双 2K Dell 显示器是不支持 HDR 的,当看到买来的 4K 显示器能支持 HDR,便尝试性地开启了。于是开启长达四年的八哥。

自从关掉 HDR,稣又测试了几次通宵写代码,除了饿,简直不能太爽!

有人说,价格超过 5000 元的显示器是可以开 HDR 的。也许吧!但两个就一万以上了……为了一个用不上的 HDR,何必呢?

PARTUUID

问题

blkid 的输出里有 UUID 和 PARTUUID,为何需要两套 ID?

分析

  • PARTUUID 是分区表级 UUID (Universally Unique Identifier),是 GPT (GUID Partition Table) 硬盘上所有分区的标准特性。因为它是从分区表中检索的,所以访问它时不需要对分区的实际内容做任何假设。即不需要理会分区的文件系统是哪种格式,比如 btrfs、ext4、FAT、NTFS 等。如果分区是使用某种未知加密方法加密的,则 PARTUUID 可能是该分区唯一可访问的唯一标识符。

  • UUID 是一个文件系统级别的 UUID,它从分区内的文件系统元数据中检索。只有当文件系统类型已知并可读时,才能读取它。

  • UUID 适用于所有层(块设备、分区、raid、luks、lvm),PARTUUID 仅适用于 GPT 分区。

解决

GPT 是 UEFI 的规范。Linux 诞生时,UEFI 尚未诞生,所以是先用 UUID,后用 PARTUUID。

UUID 的应用场景:

  • 默认情况下,/etc/fstab 里用的是 UUID,比如安装 Debian 12 时就写入 UUID,而不是 PARTUUID。

  • MBR 硬盘没有 PARTUUID,只能用 UUID。

PARTUUID 的应用场景:

  • efibootmgr -v 查看 EFI 启动信息,可以发现 EFI 使用 PARTUUID。

额外

UUID 的缺点是必须扫描所有设备的内容才能找到它们,毕竟 UUID 可以在任何地方。使用 PARTUUID,则只需检查分区表,因此更容易/更高效(但是需要有大量的块设备才能看出差别)。

通过 PARTUUID 挂载可以在没有 initramfs 的情况下工作,因此如果您想制作一个无 initrd 的系统,请使用 PARTUUID。

ext4 分区可以用 sudo tune2fs -U <UUID> device 修改 UUID,重新格式化、转换文件系统格式也可能导致 UUID 改变,所以实际上 /etc/fstab 里用 PARTUUID 更好一点点,除非您还在使用 MBR 磁盘。

快速安装 Debian

问题

前不久在知乎上看到有人说“安装 Debian 的体验很差,会卡很久”,还有人说“装了一两天”,稣心想:“怎么是相反的认知呢?哪里出八哥了?”

分析

目测是使用 netinst 映像,并且遇到网络问题。

这一点也不奇怪,比较奇怪的是,为何稣完美错过出八哥的条件?思考一阵后,得出这样的答案:

  1. 最早当然都是用完整安装映像在虚拟机里安装。也有直接用 qcow2 格式的云映像。

  2. 稣第一次亲自安装 Debian 是在一家区块链公司,一开始没有运维,只能自己上阵。但环境是 GCP、AWS 这些云,“安装系统”是不存在的,那叫“选择系统”,选好即可用。而且它们的网络都特别好,即使后来自己安装任何包,也都很快。

  3. 稣第一次使用 netinst 映像在物理机上安装 Debian,是在跨国公司的企业网络,能自动加速到新加坡网络……

  4. 稣在家里第一次使用 netinst 映像在物理机上安装 Debian,网卡没认出来……离线安装后,才找到一个 USB 有线网卡,终于连上网,手动改源到 USTC 后,再继续安装的。

  5. 再后来已经知道 debian-security 的坑了。详见《在华硕灵耀 X 纵横上装 Debian 桌面的经验》。也知道如何在安装时,使用极客的方式改变 debian-security 源。

事实上,在国内安装 Debian 大概率会因为 debian-security 源访问十分缓慢而花费几个小时。而且,在安装界面选择源无法解决这个问题!因为无论您在安装界面怎么换源,换掉的只有 debian 源,而 debian-security 源始总是默认的 http://security.debian.org

解决

显然,直接使用较庞大的完整安装映像可以很容易解决这个问题。但带来的问题是,下载 ISO 和刻盘时间都变长。最可怕的是,需要下载的 ISO 将近 4GB。对于稣这样的穷人,用于安装的 U 盘只有 1GB,这个方式根本不可行!所以,在安装时,使用极客的方式改变 debian-security 源,才是正确的方式。

思路大致如下:

  1. 在选择源的界面,选择适合的国内源,比如在厦门、上海,都可以使用 USTC。

  2. 下一步是“Select and install software”,也就是开始慢的第一步。在这步界面下,按 Ctrl+Alt+F2,再按回车,打开一个控制台。

  3. 在控制台里换 debian-security 源,注意位置是 /target/etc/apt/sources.list,使用 sed 换即可,例如 sed -i.bak 's|security.debian.org|mirrors.ustc.edu.cn|g' /target/etc/apt/sources.list

  4. 此时源修改并未生效,如果按 Ctrl+Alt+F5 回到安装界面,会发现依然在慢吞吞地下载。所以,还需要把当前使用默认源的下载会话给杀掉。还是在 Ctrl+Alt+F2 控制台里操作,先 ps | grep http 找到 /usr/lib/methods/http 进程的 pid,然后 kill 掉。

  5. 按 Ctrl+Alt+F5 回到安装界面,键鼠操作,重试这一步即可使新的 debian-security 源生效,后面将快很多。

Windows 平台安装安全版掩耳(Thunder)

需求

下载小文件,一般直接用浏览器。中等规模的,则一般用 aria2。大文件,还是要用 P2P 工具。

在国内,拥有 P2SP 的掩耳在下载 iso 等大文件时,无疑是具备巨大优势的。

比如,前几天稣下载一个 Windows Server 镜像,用 aria2 是 2.8MB/s,而掩耳则达到 6.1MB/s。

但是!Window 版掩耳的界面确实复杂而龟速,还有许多稣不需要的功能,比如它带了一个 WFP 驱动,又没开源,怎么知道它除了监控流量,还有没有监控流量呢!还有那个分配空间用的服务,又没开源,为啥给它系统权限?总之,不够安(fh)全(xb)!

思路

如果在 Linux 上,可以使用 Docker 版,或者干脆装在虚拟机里。

Windows 也可以装在虚拟机里,但损耗比较大,而且操作麻烦。另一个方案是“Windows 沙盒”,需要使用一个类似“远程桌面客户端(mstsc)”的界面操作,比虚拟机方便,但还不够方便。

更好用的方式是通过 WSL 使用 Linux 版掩耳,它本身就是精简版,一次性解决船部烦恼。

安装流程

1. 安装 WSL Debian

在 Windows 上操作:

1
wsl --install -d Debian

2. 安装掩耳

这步在 Debian 上操作,由于稣的 Windows 是 ARM64 版本,所以以下安装的是 arm64 的掩耳:

1
2
wget https://archive.kylinos.cn/kylin/partner/pool/com.xunlei.download_1.0.0.1_arm64.deb
sudo dpkg -i com.xunlei.download_1.0.0.1_arm64.deb

x64 的 Windows 是这样:

1
2
wget https://archive.kylinos.cn/kylin/partner/pool/com.xunlei.download_1.0.0.1_amd64.deb
sudo dpkg -i com.xunlei.download_1.0.0.1_amd64.deb

3. 安装依赖库

目前掩耳是安装了,但还跑不起来,除非您的 Debian 本来已经安装过桌面环境。以下安装依赖库:

1
sudo apt install libgtk2.0-bin libx11-xcb1 libxtst6 libxss1 libnss3 libasound2 libdbus-glib-1-2

此时已经可以使用 /opt/apps/com.xunlei.download/files/start.sh 启动掩耳,但是中文字体都口了。

4. 安装中文字体

1
sudo apt install fonts-wqy-zenhei

大功告成!

Debian 12 上用 TPM 2.0 安全登陆 SSH

需求

之前在《macOS 上用触控 ID 安全登录 SSH》,最近比较常用 Linux 桌面,所以还得在 Linux 上也搞一套安全的登陆方式。

分析

目前,MBA13 M1 的 Touch ID 在 Asahi Linux 下无法使用,其它机器也都没有指纹识别器,显然只有 TPM 2.0 模块是唯一适合的安全手段。

参考

实现

1. 检查 TPM

1
sudo dmesg | grep -i tpm

如果没有输出,那可能是内核不支持或者没有 TPM 芯片;但也可能只是内核比较老,没有输出而已,比如华为擎云 W515 就没有输出,但它能用。

类似以下输出,是没有芯片:

1
2
[    0.800622] ima: No TPM chip found, activating TPM-bypass!
[ 2.030844] systemd[1]: systemd 252.22-1~deb12u1 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)

内核识别出 TPM 芯片的输出:

1
2
3
4
[    0.000000] efi: ACPI=0x75620000 ACPI 2.0=0x75620014 TPMFinalLog=0x755ef000 SMBIOS=0x75cac000 SMBIOS 3.0=0x75cab000 MEMATTR=0x6bf5d018 ESRT=0x6e822718 MOKvar=0x75ce8000
[ 0.014309] ACPI: TPM2 0x00000000754DF000 00004C (v04 ALASKA A M I 00000001 AMI 00000000)
[ 0.014336] ACPI: Reserving TPM2 table memory at [mem 0x754df000-0x754df04b]
[ 12.590389] systemd[1]: systemd 252.22-1~deb12u1 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TP2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)

2. 安装必要软件

1
sudo apt install tpm2-tools tpm2-abrmd libtpm2-pkcs11-tools libtpm2-pkcs11-1

其中:

  • tpm2-tools 是一套工具。获得 tpm2tss2 两个命令,可以用 sudo tpm2 getrandom --hex 8 测试 TPM2 是否正常工作。

  • tpm2-abrmd 是一个服务,使得非 root 用户能访问 TPM2 映射文件,只需把用户加到 tss 组即可。

  • libtpm2-pkcs11-tools 是 PKCS#11 backend,用于访问加密服务。它提供的 tpm2_ptool 是一个 Python 脚本,可用于管理令牌、密钥。

  • libtpm2-pkcs11-1 是 SSH 用的模块,即提供一个符合 PKCS#11 规范的 so 动态库。对于 x64 机器,固定链接位于 /lib/x86_64-linux-gnu/pkcs11/libtpm2_pkcs11.so。如果您安装了 gcc,则可用 TPM2_PKCS11_SO=/usr/lib/$(gcc -dumpmachine)/pkcs11/libtpm2_pkcs11.so 来保存它到变量 TPM2_PKCS11_SO,以方便使用。

3. 配置用户

1
sudo usermod -a -G tss $USER

如果在桌面或 SSH 会话,可以注销,再登录,使以上配置生效。也可以用 su - $USER 登录一个新会话,这时新会话是生效的,但 exit 后,回到的旧会话依然不生效。

4. 检验

1
tpm2 getrandom --hex 8

注意,上面这条没有 sudo,必须保证没有 sudo 也能获得随机数,才说明 tpm2-abrmd 正常工作,并且用户加入 tss 组,并且重新登录会话!

5. 新建私钥

1
2
3
4
5
6
7
8
# 在默认位置 ~/.tpm2_pkcs11 初始化一个数据库
tpm2_ptool init

tpm2_ptool addtoken --pid 1 --label SSHToken --sopin [SUPERVISOR-PIN] \
--userpin [USER-PIN]

tpm2_ptool addkey --algorithm [rsa2048/ecc256/ecc384] --label SSHToken \
--key-label [KEY-LABEL] --userpin [USER-PIN]

稣一般使用 ecc384,即 NIST P-384,但有些机器会报错,这时可以尝试 ecc256,即 NIST P-256。注意:据说 NIST 系列安全性存疑?

6. 导入私钥

这第 6 步与第 5 步只需二选一。

第 5 步中新建私钥是无法导出的,万一自己不小心删了,或者升级 BIOS,也可能无法解开,导致私钥丢失。所以,如果这私钥是不能丢的,那最好的方式是从离线保存的私钥文件里导入。

这步可能有风险,因为需要把离线保存的私钥文件复制到目标机器,而且要将私钥的密码清零。为了提高安全性,建议离线操作,并尽可能快速完成全部流程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 在内存文件系统操作,防止私钥落盘
umask 077 && mkdir /tmp/crypto && cd /tmp/crypto

# 这里断网,再复制你的私钥到 /tmp/crypto/tpm_pri
# 假设是从 U 盘复制,那命令可能是:
sudo mount -o ro /dev/sdb1 /mnt
cp /mnt/key.pem tpm_pri

# 解密私钥,即删除私钥的密码(这很危险!平时绝不能这样做!)
ssh-keygen -f tpm_pri -mPEM -ep

# 导入私钥
tpm2_ptool import --label SSHToken --key-label TPM-SSH --userpin [USER-PIN] \
--privkey /tmp/crypto/tpm_pri --algorithm ecc384

# 清理机密数据
shred -zu tpm_pri
rm -rf /tmp/crypto

7. 查看公钥

1
2
3
TPM2_PKCS11_SO=/usr/lib/$(gcc -dumpmachine)/pkcs11/libtpm2_pkcs11.so

ssh-keygen -D $TPM2_PKCS11_SO

可以导到文件里:

1
ssh-keygen -D $TPM2_PKCS11_SO > ~/.ssh/tpm.pub

8. 设置 SSH 服务端

这里在本地测试:

1
cat ~/.ssh/tpm.pub >> ~/.ssh/authorized_keys2

测试连接:

1
ssh -I $TPM2_PKCS11_SO $USER@localhost

9. 【可选】使用 ssh-agent

1
2
pgrep -u $UID ssh-agent || eval `ssh-agent`
ssh-add -s $TPM2_PKCS11_SO

10. 【可选】对指定主机自动使用 TPM 密钥

添加以下文本:

1
2
3
Host umu618.com
PKCS11Provider /lib/x86_64-linux-gnu/pkcs11/libtpm2_pkcs11.so
IdentityAgent none

或者对全部主机使用:

1
2
cat <(echo "PKCS11Provider $TPM2_PKCS11_SO") ~/.ssh/config \
| tee ~/.ssh/config

家用 WiFi 方案二【MESH 版】

需求

写于 2020-03-23 21:57:52 的《家用 WiFi 方案》已经是 4 年前的方案了,现在流行 Mesh 方案。正好手头上有两台 2023-11-24 产的 CMCC RAX3000M NAND 版,那就和红米 AX6S 一起 Mesh 吧!

思考

  • 为何不用 AC+AP 方案?因为贵。如果新买成品 AC,就得买配套的 AP,不仅要一笔支出,还导致现有的 10 几个路由器都吃灰。而如果使用 OpenWRT 来实现 AC,开发成本更高,目前没发现 OpenWRT 上特别靠谱的 AC 实现。这里有一个十年前的项目。

  • 为何不用现成的 MESH 路由器?因为穷。稣的主路由是 R4S,安装的是自己编译的 OpenWRT。如果改为现成的 MESH 路由器,势必需要替换这个主路由,那不是还得买一个性能和 R4S 差不多,而且还得能刷 OpenWRT 的?买不起啊。

  • 有线回程?还是无线回程?能有线肯定有线,网络质量更好。还好家里布线还行,有线回程没问题。

具体步骤

  1. 配置成 AP

lan 口协议改为 DHCP client,关掉 lan 口的 DHCP(即打勾 Ignore interface),再把 dnsmasq 禁用。

可选,如果有 IPv6,再创建一个 lan6 口,协议为 DHCPv6 client。

  1. 查看各 AP 的 MAC 地址

注意:查看的是 WiFi 网卡的 MAC,即 Wireless Overview 页面展示的 BSSID。

以下为假设的值:

  1. 配置 WiFi

SSID 和 Encryption 设置全一样,信道错开。

  1. 开启 AP 的 802.11r 支持

位于 Interface Configuration - WLAN Roaming - 802.11r Fast Transition,打勾即可。

  1. 配置 802.11r

每个 AP 的 NAS ID 设为自己的 MAC 地址去掉冒号,比如 红米 AX6S 的 MAC 为 33:33:33:33:33:33,NAS ID 就设为 333333333333。

Mobility Domain 都设置成一样的 16 位数字的 Hex 格式,比如:abcd。

FT protocol 都设为 FT over DS,即有线回程。如果网口不够用,可以选择 FT over the Air。

R1 Key Holder 设为和 NAS ID 一样即可。

External R0 Key Holder List 添加 3 个,分别为:

  • 11:11:11:11:11:11,111111111111,1234567890abcdef1234567890abcdef
  • 22:22:22:22:22:22,222222222222,1234567890abcdef1234567890abcdef
  • 33:33:33:33:33:33,333333333333,1234567890abcdef1234567890abcdef

其中的 1234567890abcdef1234567890abcdef,您可以改为其它 128 位数值(16 字节)。

External R1 Key Holder List 添加 3 个,分别为:

  • 11:11:11:11:11:11,11:11:11:11:11:11,1234567890abcdef1234567890abcdef
  • 22:22:22:22:22:22,22:22:22:22:22:22,1234567890abcdef1234567890abcdef
  • 33:33:33:33:33:33,33:33:33:33:33:33,1234567890abcdef1234567890abcdef

快速杀死 Linux

问题

众所周知,Linux 上的脚本可以通过 Shebang 符号(#!)来指定它的解释器(interpreter)。那么,ELF 格式的程序又是谁来执行的呢?

研究

Linux 系统必然存在一个用于加载 ELF 程序的程序,它本身是被内核拉起的。然而,虽然有这么一个叫做 init 的进程,但对应的 init 程序文件是位于 /sbin 下,它不应该是直接用来运行其它程序的,不然普通用户的程序岂不是都无法启动?

一次使用 file 时,发现它打印出一个 interpreter:

1
2
$ file $(which bash)
/usr/bin/bash: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=0b6b11360e339f231f17484da2c87d0d78554e31, for GNU/Linux 3.2.0, stripped

这个 /lib64/ld-linux-x86-64.so.2 可以说是相当眼熟的,每次 ldd 一个 ELF 程序都会看到:

1
2
3
4
5
$ ldd $(which bash)
linux-vdso.so.1 (0x00007ffcdbf89000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fe156917000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe156736000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe156aa1000)

所以,可以拿它来运行别的 ELF 程序?

1
2
$ /lib64/ld-linux-x86-64.so.2 $(which pwd)
/root

哦吼!还真可以……看看它到底是啥:

1
2
3
4
$ file /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: symbolic link to /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
$ file /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=38e7d4a67acf053c794b3b8094e6900b5163f37d, stripped

所以,在 x64 的 Linux,ELF 的解释器其实是 /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2

结论

最快杀死 Linux 的方法是:

1
> chmod -x /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2

请勿轻易尝试。如果您真的很好奇,记得先备份这个程序,在一定时间内还能救回来。可以这么思考:这个解释器又是谁加载的?您不会已经关闭 shell 了吧?

Debian 12 的 xrdp 开启声音重定向

需求

自从给华为擎云 L420L410W515 都装上 Debian 12 后,稣就把前两者卖了,因为它们是笔记本,稣有太多笔记本了……唯独留下 W515,并宠爱有加,因为它是台式机。

稣还给它装了(华为?)MATE 桌面,获得和 xrdp 不错的兼容性!果然还是华为 MATE 牛逼!

于是乎,在远程桌面下都有图像的前提下,没有声音就显得很奇怪!

分析

很容易发现,远程桌面下,默认是没有声音输出设备的,所以没有声音!我们需要的是一个虚拟声卡。

由于 Debian 12 的声音系统是 pipewire,使用“pipewire xrdp”作为关键词,很容易能找到:

https://github.com/neutrinolabs/pipewire-module-xrdp

编译 pipewire-module-xrdp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git clone https://github.com/neutrinolabs/pipewire-module-xrdp
cd pipewire-module-xrdp

# Install build environment
sudo apt install git pkg-config autotools-dev libtool make gcc

# Install dependencies
sudo apt install libpipewire-0.3-dev libspa-0.2-dev

# Build
./bootstrap
./configure
make

# Install
sudo make install

使用

连重启都不用,只需要重新进行 RDP 连接即可生效。

诗盗·就洗淋被

《诗盗·就洗淋被》:虚拟世界虚拟币,真实人性真实利。手持千枚比体系,年薪和纸一个亿。

注解

就洗淋被:闽南语,意思是被子拿出去晒,结果被雨淋湿了,又洗了一遍。/狗头
比体系:稣曾经有一千多枚 BTC,后来都变成废纸。
年薪和纸一个亿:密钥写在纸上的,结果纸丢了,但是那张纸确实能做到年薪一个亿,还是美元哦!