怪需求,其实有些自欺欺人,感谢群友用 Gemini 3 Pro 提供思路。

gpg 私钥之前用图形化安装的图形化界面给搞完了,无非是 DVD ISO 断网安装了带 GNOME 的系统,然后开了个最小的 vmdk,加密,然后把私钥从以前的 veracrypt 容器换到这里,当然,灵活性肯定是不如以前用 veracrypt 的。真要哪天搬走的话,估计又是一通折腾,先不想它,相信以后自己的智慧。

一开始创建的时候设置好分区的 Label 可以节省后面的很多力气

# vmdk, size 0.1GB, only one partition, /dev/nvme0nXp1, labeled as "gpg"
cryptsetup luksFormat /dev/disk/by-partlabel/gpg
cryptsetup open /dev/disk/by-partlabel/gpg gpg
mkfs.ext4 /dev/mapper/gpg

但是后面感觉还是太重了,能不能弄轻一点,反正也就管理密钥时候用一下,不太在乎美观什么的,倒不如让界面更 primitive 一点,反而能让自己变得严肃一些,免得碰密钥的时候出事故。还能省点硬盘,平时就 ~10GB 还是挺浪费的。

实质上我只需要

  • gnupg, 管理密钥对
  • keepassxc, 暂存密码,帮我 autofill, 不然每次手打必定超时
  • cryptsetup, 面向加密分区
  • pcscdscdaemon,用来管理硬件密钥

基础系统

先把必须要装的给装上,就是用 netinst CD 一路回车过去完事。

但是考虑到每次跑 setup 流程太慢了,一旦失手就要从头再来,这次也不想折腾 preseed, 还是用打包好的 qcow2 吧,选 nocloud 分支不然没法直接 tty 登陆,然后用 qemu 转一下格式方便给 VMware 用:

$ qemu-img convert -f qcow2 -O vmdk debian-13-nocloud-arm64.qcow2 qc.vmdk

这个预制菜 rootfs 大概占地 1.3GB

然后选择已有的 existing virtual disk 就行,让它自己拷贝进来。

CPU 给 2c 足够,RAM 至少给 1.5GB,不然 cryptsetup 加解密占用太高,会报错。

声卡、摄像头、光驱,都不需要,等后面还可以把网卡也删了。

复制粘贴和拖拽文件也都关掉。

装软件

然后开机,用户名 root, 没有密码

手打会非常困难,但是配 shared folder 也困难,还没断网,不如直接下载

bash <(curl -fsSL 3.h3a.moe/qc1)

注释已经说明了大部分事情,

没有 DE,直接用最小的窗管 openbox, 依赖主要是 xorg 带来的,大概 0.5GB

禁用 root login, 然后给 user 配密码,挂载点我按一般的 Linux DE 惯例来了

#!/bin/bash

# This script should be executed as root

# prevent extra packages
echo 'APT::Install-Recommends "0";' > /etc/apt/apt.conf.d/01norecommend
echo 'APT::Install-Suggests "0";' >> /etc/apt/apt.conf.d/01norecommend
apt update
# GnuPG and dm-crypt
apt install gnupg cryptsetup pcscd scdaemon 
# Fish makes prompt easier, though kind of heavy (~40MB)
apt install fish #rsync
# GUI
apt install xserver-xorg-core xserver-xorg-input-all xinit openbox dbus-x11 keepassxc pinentry-qt lxterminal

# set non-root user
useradd -m -G sudo -s /usr/bin/fish user
passwd user
# add mountpoint for user
mkdir -p /media/user/gpg
chown -R user:user /media/user
# prevent root login
passwd -l root
# switch to non-root user
su user

用户配置

root 也可以启动这个图形界面,所以先 su 了再配

同上,别手敲了很累的

bash <(curl -fsSL 3.h3a.moe/qc2)

配一下 X Server,拉起一个 gpg-agent 和窗管 openbox

顺便配个自启,省得自己按

#!/bin/bash

# This script should be executed as NON-ROOT user

# GnuPG config
#mkdir -p ~/.gnupg
#chmod 700 ~/.gnupg
# echo "# disable-ccid" > ~/.gnupg/scdaemon.conf

# X Server config
cat <<EOF > ~/.xinitrc
#!/bin/sh
# 1. Merge X resources (Optional styling for xterm)
[ -f ~/.Xresources ] && xrdb -merge ~/.Xresources
# 3. Initialize the GPG Agent
# Ensures the agent is running and ready to handle smartcard requests.
eval $(gpg-agent --daemon)
# 4. Start the Window Manager
# using 'exec' ensures that when Openbox exits, the X server shuts down.
exec openbox-session
EOF
# preserve keepassxc autostart
mkdir -p ~/.config/openbox
echo "keepassxc &" > ~/.config/openbox/autostart
echo "lxterminal &" >> ~/.config/openbox/autostart

挂载 gpg homedir

到这里没有问题,就把 VM 的网络适配器掐掉

挂载 keyring 所在的加密分区,不妨写个脚本节省力气:

#!/bin/bash
# save this to ~/mountgpg.sh
cryptsetup open /dev/disk/by-label/gpg gpg
mount /dev/mapper/gpg /media/user/gpg
sudo mountgpg.sh

第一次配置的时候,把 gpg 默认的 homedir 软连接指向加密分区的 keyring

ln -s /media/user/gpg/.gnupg /home/user/.gnupg

然后输入 startx 就能进桌面了,

加上这个感人的分辨率,稍微有点模糊,这感觉太对了,我太喜欢了,就是要这样才好

结算

最终效果大概 ~2GB, 还是很不错的

顺便提一句,keepass 的解锁时间开大一点,有利于防范爆破