welcome to my journal

不知道写什么,先放个placeholder~

撬开龟壳

历经千百次的 a) b) c) 之后,终于成功撬开了龟壳www 撬壳细节 几乎全新的chrome浏览器 手机wifi热点,不开代理 姓名全大写 使用谷歌邮箱注册 中行万事达莫奈卡 机翻地址 区域我选择了新加坡区,成功开出来了www 遗憾的是,AMD的VM.Standard.E2.1.Micro和ARM的VM.Standard.A1.Flex全都没有配额,还开不出机子😭

2026-10-30 约 1 分钟

使用 Vaultwarden 自建 Bitwarden 服务端

bitwarden是一个自由开源、跨平台的密码管理器,且提供浏览器插件,支持自动填充、totp、passkey等功能。

服务端选择

Vaultwarden 是一个基于Rust开发的轻量级 Bitwarden 服务端,支持MFA、多用户、多设备同步等。

使用 Docker Compose 构建

$ mkdir vaultwarden && cd vaultwarden
$ vim compose.yml

services:
vaultwarden:
image: vaultwarden/server:1.35.1 # 显式指定版本号,防止使用latest拉取到n年前的版本
container_name: vaultwarden
restart: always
environment:
DOMAIN: "https://example.com" # 使用反向代理时必填;您的域名;Vaultwarden 需要知道它是 https 才能正确处理附件
SIGNUPS_ALLOWED: "true" # 创建账户后,使用 "false" 停用此选项,这样就不会有陌生人注册了

volumes:
- ./vw-data:/data # : 前面的路径可以修改
ports:
- 1145:80 # 您可以将 1145 替换为您喜欢的端口



$ sudo docker compose up -d

使用nginx反代

先在/etc/nginx/sites-available创建一个.conf配置文件

$ sudo vim /etc/nginx/sites-available/example.conf

# 默认服务器块 - 拒绝所有其他访问
server {
listen 1146 ssl default_server; # 1146改为外网访问使用的端口
listen [::]:1146 ssl default_server; # 1146改为外网访问使用的端口

ssl_certificate /path/to/cert.pem; # ssl证书公钥
ssl_certificate_key /path/to/private.key; # ssl证书私钥

# 默认拒绝所有请求
return 403;
}

# vaultwarden 专用服务器块
server {
listen 1146 ssl; # 1146改为外网访问使用的端口
server_name example.com; # 保持与compose.yml里设置的一致

ssl_certificate /path/to/cert.pem; # ssl证书公钥
ssl_certificate_key /path/to/private.key; # ssl证书私钥

# SSL 配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# 安全头
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

# 反向代理配置
location / {
proxy_pass http://127.0.0.1:1145; # 1145改为vaultwarden的端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# 限制只允许特定域名访问
if ($host != 'example.com') { # 保持与compose.yml里设置的一致
return 403;
}
}
}

软链接到/etc/nginx/sites-enabled/启用配置文件

$ sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/example.com.conf

检查并重载nginx

$ sudo nginx -t


nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


$sudo nginx -s reload

随后访问https://example.com:1146检查是否正常运行

2026-01-09 约 6 分钟 ✿ Bitwarden ✿ 服务器

Btrfs下配置swapfile并启用休眠

配置swap

为防止swapfile被拍进快照里,我们需要单独为swapfile建一个子卷

$ sudo mount /dev/nvme0n1p4 -o subvolid=0 /mnt #挂载父卷
$ sudo btrfs subvolume create /mnt/@swap

创建并启用swapfile

$ sudo btrfs filesystem mkswapfile --size 16G /mnt/@swap/swapfile
$ sudo chattr +C /mnt/@swap/swapfile #禁用CoW
$ sudo swapon /mnt/@swap/swapfile

随后查看/proc/swaps,确保成功激活

$ cat /proc/swaps
Filename Type Size Used Priority
/mnt/@swap/swapfile file 16777212 0 -2

编辑/etc/fstab,永久启用swapfile

# 首先将@swap子卷挂载到/swap
UUID=f3e8494a-ff37-4932-9085-e03dce5ab458 /swap btrfs subvol=@swap 0 0

# 然后启用swapfile
/swap/swapfile none swap sw 0 0

重启系统,再查看/proc/swaps,确保swapfile成功启用

配置zswap

在稳定版的官方内核中,zswap被默认启用,有:

$ cat /sys/module/zswap/parameters/enabled
Y

要使用zstd作为默认压缩算法,要启动zstd和zstd_compress这两个内核模块

$ sudo vim /etc/mkinitcpio.conf


MODULES=(zstd zstd_compress)

随后运行mkinitcpio更新initramfs

$ sudo mkinitcpio -p linux

修改内核参数,指定zstd为默认压缩算法

rEFInd引导下,修改/boot/refind_linux.conf,添加参数zswap.compressor=zstd

重启系统,查看/sys/module/zswap/parameters/compressor

$ cat /sys/module/zswap/parameters/compressor
zstd

配置并启动休眠

配置initramfs,在udev钩子后加入resume钩子

$ sudo vim /etc/mkinitcpio.conf


HOOKS=(base udev ... resume)


$ sudo mkinitcpio -p linux

在Btrfs下,需要使用$ sudo btrfs inspect-internal map-swapfile /swap/swapfile -r获取偏移量

$ sudo btrfs inspect-internal map-swapfile /swap/swapfile -r
2982144

添加内核参数

resume=UUID=f3e8494a-ff37-4932-9085-e03dce5ab458 resume_offset=2982144 hibernate.compressor=zstd

随后重启系统运行systemctl hibernate测试休眠是否正常

Gnome下可以安装 Power Off Options 插件来添加休眠按钮

参考资料:

2026-01-05 约 4 分钟 ✿ ArchLinux ✿ btrfs

配置zsh

原先使用的shell是fish,虽然开箱即用方便,但是posix兼容性差于zsh,且配置灵活度不如zsh,遂决定改用zsh

安装zsh和oh-my-zsh并启用

sudo pacman -S zsh zsh-completions 
chsh -s /bin/zsh #设置zsh为默认shell

安装oh-my-zsh

这里用pacman安装,需要添加archlinuxcn源

sudo pacman -Ss oh-my-zsh-git
cp /usr/share/oh-my-zsh/zshrc ~/.zshrc
source ~/.zshrc

为了在root账户上使用oh-my-zsh,可以

sudo ln -s ~/.zshrc /root/.zshrc

终端配置

主题

根据 What’s the best theme for Oh My Zsh? ,我选择 Powerlevel10k 主题

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

修改 ~/.zshrc

ZSH_THEME="powerlevel10k/powerlevel10k"

再重新加载.zshrc,按提示配置主题,不满意可运行以下命令重新配置

p10k configure

插件

安装方式:在 ~/.zshrc 的plugin中添加相应插件,如:

plugins=(git
python
z
copypath
extract
zsh-autosuggestions
zsh-syntax-highlighting
)

仅介绍自用插件,更多内置插件请查看 ohmyzsh/ohmyzsh/wiki/Plugins ,外置插件可前往 awesome-zsh-plugins 寻找

1. zsh-autosuggestions

这是一个fish-like的推测、命令补全插件

安装方式:丢到 /usr/share/oh-my-zsh/custom/plugins 中

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

2. zsh-syntax-highlighting

这是一个fish-like的语法高亮插件

安装方式同上,丢到 /usr/share/oh-my-zsh/custom/plugins 中

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

3. 其他内置插件

  • python插件给python命令一个py的别名,方便运行python脚本

  • z是一个类似cd的目录跳转插件,配合tab补全可以模糊模糊跳转最近使用过的目录

  • copypath用于复制文件路径

  • extract用于解压任何压缩包,命令为x

2026-01-05 约 4 分钟 ✿ ArchLinux

记一次将ext4迁移到btrfs并开启透明压缩

想更换桌面环境,苦于ext4的快照不够方便、优雅,遂折腾转为btrfs

使用btrfs-convert转换

确保磁盘有一定的空间,进入到livecd

首先检查磁盘问题,防止带着问题上战场。

fsck.ext4 /dev/nvme0n1p4

随后双手合十,祈求执行以下命令转换。

btrfs-convert /dev/nvme0n1p4

在转换途中会在目标分区中生成快照,如果报错执行以下命令回滚。

btrfs-convert -r /dev/nvme0n1p4

重建初始化内存盘

挂载磁盘、chroot并重建initramfs:

mount /dev/nvme0n1p4 /mnt
arch-chroot /mnt
mkinitcpio --preset linux

启动透明压缩

启动透明压缩前保证磁盘有足够的空间,否则先保证可以正常进入系统后删除快照:

btrfs subvolume delete /mnt/ext2_saved

启动透明压缩(需要较长时间):

btrfs filesystem defragment -r -v -czstd /mnt

创建子卷(subvolume)

创建子卷并迁移数据

btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@var
btrfs subvolume create /mnt/@usr_local
btrfs subvolume create /mnt/@opt
btrfs subvolume create /mnt/@snapshots
btrfs subvolume set-default /mnt/@
mkdir /mnt/.snapshots
mv /mnt/home/* /mnt/@home/
...

挂载子卷并创建fstab

# 先卸载已挂载的分区
umount /mnt

# 分别挂载
mount /dev/nvme0n1p4 -o subvolume=@,compress=zstd /mnt
mount /dev/nvme0n1p4 -o subvolume=@home,compress=zstd /mnt/home
mount /dev/nvme0n1p4 -o subvolume=@var,compress=zstd /mnt/var
mount /dev/nvme0n1p4 -o subvolume=@usr_local,compress=zstd /mnt/usr/local
mount /dev/nvme0n1p4 -o subvolume=@opt,compress=zstd /mnt/opt
mount /dev/nvme0n1p4 -o subvolume=@snapshots,compress=zstd /mnt/.snapshots
mount /dev/nvme0n1p1 /mnt/boot/efi

# 创建fstab
genfstab -U /mnt > /mnt/etc/fstab

检查/etc/fstab,将根分区调整为rw,将快照的压缩去除

# /dev/nvme0n1p4
UUID=f3e8494a-ff37-4932-9085-e03dce5ab458 / btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvol=/@ 0 0

# /dev/nvme0n1p4
UUID=f3e8494a-ff37-4932-9085-e03dce5ab458 /home btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvol=/@home 0 0

# /dev/nvme0n1p4
UUID=f3e8494a-ff37-4932-9085-e03dce5ab458 /opt btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvol=/@opt 0 0

# /dev/nvme0n1p4
UUID=f3e8494a-ff37-4932-9085-e03dce5ab458 /usr/local btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvol=/@usr_local 0 0

# /dev/nvme0n1p4
UUID=f3e8494a-ff37-4932-9085-e03dce5ab458 /var btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvol=/@var 0 0

# /dev/nvme0n1p4
UUID=f3e8494a-ff37-4932-9085-e03dce5ab458 /.snapshots btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvol=/@snapshots 0 0

# /dev/nvme0n1p1
UUID=C4EE-5413 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2

更新引导

rEFInd下:

修改/mnt/boot/refind_linux.conf

"Boot with standard options"  "root=UUID=f3e8494a-ff37-4932-9085-e03dce5ab458 rootflags=subvol=@ rootfstype=btrfs rw quiet splash loglevel=3 nvidia-drm.modeset=1 nvidia-drm.fbdev=1"
"Boot to single-user mode" "root=UUID=f3e8494a-ff37-4932-9085-e03dce5ab458 rootflags=subvol=@ rootfstype=btrfs rw quiet splash loglevel=3 nvidia-drm.modeset=1 nvidia-drm.fbdev=1 single"
"Boot with minimal options" "ro root=/dev/nvme0n1p4"

通过balance回收数据

引导进入系统后终端执行以下命令(需要较长一段时间)

btrfs balance start /

其他

禁用var目录的CoW

chattr +C /mnt/var
2026-01-04 约 8 分钟 ✿ ArchLinux ✿ btrfs
1