警惕!劣质的 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,后来都变成废纸。
年薪和纸一个亿:密钥写在纸上的,结果纸丢了,但是那张纸确实能做到年薪一个亿,还是美元哦!

Linux 上各种 DE 和 xrdp 的兼容性

需求

稣主要使用 macOS 和 Windows 远程桌面访问 Windows 和 Linux,所以 Linux 下哪个 DE 对 xrdp 支持最好呢?

选手

在过去Linux 桌面玩稣的时代,主要使用以下 DE:

  • GNOME
  • Cinnamon
  • MATE
  • Xfce
  • KDE
  • i3

其中 GNOME 和 KDE 太大了,而且对 xrdp 支持并不好,不想再使用,直接淘汰。加入两个从没使用过的选手:

  • LXDE
  • LXQt

但由于它们太像了,简单看起来仅仅是样式不同,所以算一个吧。

对比

以下为最直观的感受,没有深入去折腾。

DE 名称 GUI 下支持的缩放个数 缩放有效否 明显的坑
Cinnamon 5 个(100、125、150、175、200) 是,立刻生效 第一次设置缩放后,开始菜单高度没变高,是个矮个子的错误状态,注销再登录才正常
MATE 2 个(100、200) 是,立刻生效 没有 Cinnamon 漂亮,界面布局需要适应,容易把左下角的“显示桌面”当成开始菜单
Xfce 5 个(100、125、150、175、200) 否,即使重新登录也无效 永远 100% 的缩放
i3 0 个(自己改配置去!) 否,改配置后无法在一次会话里即时成效 WIN 键有时候失灵,是在不同 RDP 客户端连接下键值可能和服务端本地不同!
LXDE/LXQt 0 个 否,界面上没找到地方改 永远 100% 的缩放,即使 RDP 客户端已经记住密码,每次登录必然再弹出对话框要求输入密码。

结论

似乎就 Cinnamon 和 MATE 是应该一起安装的!一个大哥,一个小妹,能互补,还能偶尔换换口味。

Xfce 和 i3 也许折腾几下也能好用。

不过,以上,在 Windows 面前,都是乐射……不管本地、还是被远程,Windows 都完美缩放。