Stay Awhile and Listen.
英雄请留步,且听我一言。

cachyos on zfs 在 zfs 上安装 cachyos

本指南专为在单块 1TB 固态硬盘、32GB 内存环境下安装基于 ZFS 的 CachyOS 编写。旨在平衡 ZFS 的强大快照保护功能与 CachyOS 极致的游戏/办公性能。 在单块固态硬盘上使用 ZFS 的核心目的和权衡: *时光机快照(Snapshot)*:瞬间备份与回滚,完美抵御系统更新滚挂或误删文件 *透明压缩(Compression)*:变相扩容 1TB 固态硬盘,延长闪存写入寿命 *数据完整性校验(Checksum)*:实时发现静默数据损坏(Bit-rot) *限制*:单盘无法自我修复数据,轻微的性能损耗,建议保持 80% 容量红线 第一部分:准备安装介质 下载 CachyOS ISO 从 CachyOS 官方网站下载最新 ISO 镜像: # 使用 wget 下载(替换为最新版本链接) wget https://mirror.cachyos.org/ISO/cachyos-desktop-linux-250202.iso 创建启动U盘 # 使用 dd 命令写入U盘(将 /dev/sdX 替换为实际的U盘设备) sudo dd if=cachyos-desktop-linux-250202.iso of=/dev/sdX bs=4M status=progress # 或使用 Ventoy 制作多系统启动盘 第二部分:使用 Calamares 图形界面分区 启动 CachyOS 安装程序 引导器选择 在引导器选择页面: 选择 Limine 作为引导器 Limine 原生支持 ZFS,具备自动探测能力,可跨硬盘扫描 Windows Boot Manager 图形化分区配置 在 Calamares 的分区步骤,选择 *“手动分区(Manual Partitioning)”*: ...

March 8, 2026 · wang1zhen

使用 systemd 用户服务自动挂载 rclone

简介 使用 systemd 的 用户服务 (User Service) 来自动挂载 rclone 是最优雅且安全的做法。不需要 root 权限,且挂载点直接关联到当前用户。本文档记录了将名为 onedrive 的 rclone remote 挂载到 ~/onedrive 的完整流程。 创建本地挂载目录 在开始配置服务之前,必须确保目标挂载文件夹存在,否则 systemd 会拒绝启动服务。 mkdir -p ~/onedrive 创建 systemd 用户服务文件 我们需要在用户的 systemd 配置目录下创建一个服务文件。 创建存放服务文件的目录(如果尚不存在): mkdir -p ~/.config/systemd/user/ 创建并编辑服务文件 rclone-onedrive.service : vim ~/.config/systemd/user/rclone-onedrive.service 填入以下配置内容(注意 %h 会自动解析为当前用户的家目录): [Unit] Description=Rclone Mount Service for ~/onedrive AssertPathIsDirectory=%h/onedrive After=network-online.target [Service] Type=notify # 启动挂载 # 将 onedrive: 替换为你的 rclone remote 名称 ExecStart=/usr/bin/rclone mount onedrive: %h/onedrive \ --config=%h/.config/rclone/rclone.conf \ --vfs-cache-mode writes \ --allow-non-empty \ --dir-cache-time 1h \ --log-level INFO # 停止挂载时卸载目录 ExecStop=/usr/bin/fusermount -u %h/onedrive # 崩溃后自动重启 Restart=on-failure RestartSec=10 [Install] WantedBy=default.target 重载并启用服务 通知 systemd 读取新创建的配置文件,并启动挂载。 ...

March 7, 2026 · wang1zhen

kdenlive amd 加速渲染

系统准备 sudo pacman -S kdenlive ffmpeg libva-utils libva-mesa-driver amdgpu_top vainfo | grep -E "H264|HEVC|AV1" sudo cat /sys/class/drm/renderD128/device/uevent | grep PCI_SLOT_NAME lspci -nn | grep -E "VGA|3D|Display" 参数 H264 Windows (AMF) f=mp4 vcodec=h264_amf rc=cqp qp_i=20 qp_p=20 qp_b=20 g=75 bf=2 acodec=aac ab=320k usage=transcoding quality=quality vprofile=high movflags=+faststart Linux (VAAPI) f=mp4 vcodec=h264_vaapi vaapi_device=/dev/dri/renderD128 qp=20 g=75 bf=2 acodec=aac ab=320k vprofile=high movflags=+faststart H.265 / HEVC Windows (AMF) f=mp4 vcodec=hevc_amf rc=cqp qp_i=20 qp_p=20 qp_b=20 g=75 bf=2 acodec=aac ab=320k usage=transcoding quality=quality vprofile=main movflags=+faststart Linux (VAAPI) ...

February 16, 2026 · wang1zhen

mpv 配置

前言 MPV 是一款强大而轻量的开源媒体播放器,支持高度自定义。 当前配置主要优化了以下方面: 使用 GPU 加速和 Anime4K 着色器提升画质 自定义快捷键实现高效操作 通过脚本扩展功能(现代化 OSC、播放列表管理、自动加载等) 优化中日文字幕显示和双字幕支持 核心配置文件 (mpv.conf) mpv.conf 是 MPV 的主配置文件,位于 =~/.config/mpv/mpv.conf=。 # ========== 画质设置 ========== profile=gpu-hq # 使用高画质预设 vo=gpu-next # 使用新的GPU渲染器 gpu-api=auto # 自动选择最佳GPU API dither-depth=auto # 自动抖动深度 hwdec=auto-safe hwdec-codecs=all video-sync=display-resample interpolation tscale=oversample # 使得插值更平滑 # ========== 播放控制 ========== keep-open=always # 播放完暂停 save-position-on-quit=yes # ========== 音频/字幕 ========== audio-file-auto=fuzzy audio-channels=stereo audio-normalize-downmix=yes volume=100 volume-max=200 sub-auto=fuzzy alang=ja,en,zh slang=zh,en,ja # 字幕样式 sub-font='Noto Sans CJK SC' sub-font-size=48 sub-color='#FFFFFF' sub-border-size=3 sub-border-color='#000000' sub-shadow-offset=1 sub-shadow-color='#000000' # 次字幕配置 secondary-sid=auto secondary-sub-pos=95 secondary-sub-visibility=yes # ========== 界面设置 ========== osc=no # 禁用默认OSC (使用 ModernZ) osd-bar=no border=no autofit-larger=80%x80% # ========== Anime4K 智能加载策略 ========== # 定义一个条件配置:只有分辨率 <= 1080P (高度 <= 1080) 时才启用 Anime4K [Anime4K-Auto] profile-cond=height <= 1080 profile-restore=copy glsl-shaders="~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_Restore_CNN_M.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl" # 定义一个针对 4K+ 视频的保护配置(可选,确保清理着色器) [HighRes-Safe] profile-cond=height > 1080 profile-restore=copy glsl-shaders-clr 画质设置详解 profile=gpu-hq : 启用 MPV 内置的高画质预设,包含多项优化选项 vo=gpu-next : 使用新一代 GPU 渲染器,性能更好,支持更多特性 gpu-api=auto : 自动选择 GPU API(Linux 通常选择 Vulkan 或 OpenGL) hwdec=auto-safe : 启用硬件解码,=auto-safe= 避免某些不稳定的解码器 video-sync=display-resample : 视频同步到显示器刷新率,配合插值使用 interpolation : 帧插值/运动补偿,让 24fps 视频在高刷屏上更流畅 播放控制 keep-open=always : 播放结束后暂停而不是关闭,方便查看最后一帧或重播 save-position-on-quit=yes : 记住播放进度,下次打开同一文件时从上次位置继续 音频和字幕配置 audio-file-auto=fuzzy : 模糊匹配自动加载外挂音轨文件 sub-auto=fuzzy : 模糊匹配自动加载外挂字幕文件 alang/slang : 设置音轨和字幕的语言优先级,我优先日语音轨+中文字幕 字幕样式使用 Noto Sans CJK SC 字体,确保中文显示美观,白色字体配黑色描边和阴影提升可读性。 ...

February 16, 2026 · wang1zhen

S5M2 + Kdenlive + Ocenaudio 剪辑弦乐四重奏视频

前期拍摄与录音设置 视频拍摄 (Panasonic S5M2) 录制格式: 设为 *6K 3:2 Open Gate*。 帧率: *25.00p*。 编码与采样: 此模式下相机固定为 *HEVC 4:2:0 10-bit*(通常码率为 200Mbps LongGOP)。 关键动作: 每次录制开始时,请在画面中清晰地 *拍手一次*(打板),这对于后续对齐音频至关重要。 音频录制 (Sony PCM-M10) 格式: WAV (LPCM) 48kHz / 24bit。 理由:48kHz 是视频标准采样率,避免后期不同步或重采样音质损失。 电平控制: 确保弦乐最响的片段(ff)电平在 -12dB 到 -6dB 之间,切勿爆音(超过 0dB)。 音频预处理 (Ocenaudio 方案) 在导入剪辑软件之前,先对 PCM-M10 的原始录音进行修整,确保剪辑时全程使用高质量音频。 打开文件: 将 PCM-M10 录制的原始 .WAV 文件拖入 Ocenaudio。 EQ (均衡器) - 针对弦乐优化: 菜单选择 效果 (Effects) -> 均衡器 (Equalization) -> 31段均衡器 (31-Band Equalizer)。 关键操作: 务必点击左下角的 播放 按钮和 实时预览 (Preview) 复选框,边听边调。 参数调整: 80Hz 以下: 全部拉低 (-12dB),彻底切除环境低频噪音(空调、脚步声)。 315Hz - 400Hz: 稍微向下拉 (-3dB),消除大提琴的“发闷”感。 3.15kHz - 5kHz: 稍微向上推 (+2dB),增加小提琴的清晰度和擦弦质感。 点击 应用 (Apply)。 Reverb (混响) - 增加空间感: 菜单选择 效果 (Effects) -> 延迟 (Delay) -> 混响 (Reverb)。 参数: 同样开启预览。设置 Room Size 为 40*;Dry (干声) 保持 *0dB*;Wet (湿声) 设为 *-20dB (仅需一点点润色,不可过重)。 点击 应用。 Normalize (归一化): 菜单选择 效果 (Effects) -> 振幅 (Amplitude) -> 归一化 (Normalize)。 设置峰值为 -1.0 dB (或 90%)。这能确保音量饱满且不爆音。 导出: 文件 -> 另存为,命名为 M10_Mastered.wav。 Kdenlive 项目初始化 (4K 分辨率) *打开 Kdenlive*,点击顶部菜单 设置 (Settings) -> 管理项目配置 (Manage Project Profiles)。 点击左上角的 新建配置 (Create new profile) 按钮。 输入以下参数: 描述: S5M2 Downscale 4K 尺寸: 3840 x 2560 帧率: 25 / 1 像素长宽比: 1 : 1 (Square) 色彩空间: Rec. 709 保存并设为当前项目配置。 素材导入与代理生成(解决卡顿的核心) 导入素材 将 S5M2 的 .MOV 视频文件拖入 *项目箱 (Project Bin)*。 将 第二阶段处理好的 M10_Mastered.wav 音频文件拖入项目箱。 清理多余音轨 (删除 Track 3 & 4) S5M2 有时会录制 4 条音轨(后两条可能为空或噪音)。在剪辑前处理更干净: ...

February 11, 2026 · wang1zhen

podman 部署 frp 和 caddy

系统级目录布局 应用配置放在 /opt;Quadlet 单元放在 /etc/containers/systemd。 /opt/podman/ ├─ frp/ │ └─ frps.toml └─ caddy/ └─ Caddyfile /etc/containers/systemd/ ├─ frps.container └─ caddy.container frps 配置 /opt/podman/frp/frps.toml bindPort = 7000 auth.method = "token" auth.token = "REPLACE_WITH_STRONG_TOKEN" webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "REPLACE_WITH_STRONG_PASSWORD" Caddy 配置 /opt/podman/caddy/Caddyfile vps.wang1zhen.com:7500 { reverse_proxy http://127.0.0.1:7750 } :80 { root * /usr/share/caddy file_server } :443 { root * /usr/share/caddy file_server tls internal } frps Quadlet /etc/containers/systemd/frps.container [Unit] Description=frps [Container] Image=docker.io/snowdreamtech/frps:alpine ContainerName=frps PublishPort=7000:7000/tcp PublishPort=127.0.0.1:7750:7500/tcp Volume=/opt/podman/frp/frps.toml:/etc/frp/frps.toml:ro [Service] Restart=always [Install] WantedBy=multi-user.target Caddy Quadlet /etc/containers/systemd/caddy.container ...

October 28, 2025 · wang1zhen

系统熵生成随机密钥 token

openssl rand -base64 32

October 28, 2025 · wang1zhen

LMDE on zfs 在 zfs 上安装 LMDE

第一部分:准备安装介质 下载LMDE Live镜像 从 Linux Mint 官网获取 LMDE 最新 ISO(例如 LMDE 7 Virginia 基于 Debian 13/trixie)。 制作启动U盘 可使用 balenaEtcher、Rufus 或 `dd` 写入 U 盘。 第二部分:启动并配置网络环境 启动到Live环境 从 U 盘启动,进入 LMDE Live 桌面。 配置网络连接 使用 NetworkManager 图形界面或 `nmcli` 连接网络。 设置系统时间 sudo timedatectl set-ntp true timedatectl status 启用SSH(可选) sudo apt update && sudo apt install -y openssh-server sudo systemctl enable --now ssh 第三部分:磁盘分区 安装必要工具 sudo apt update sudo apt install -y gdisk dosfstools parted arch-install-scripts 识别目标磁盘 lsblk -o NAME,SIZE,TYPE,MOUNTPOINT 设置磁盘变量 # 使用 by-id 更稳健,以下为示例占位,请替换为实际 by-id 设备 DISK1=/dev/disk/by-id/nvme-EXAMPLE_DEVICE_ID echo "DISK1: $DISK1" 创建GPT分区表 # 清空并新建分区:EFI(1G) + SWAP(16G) + ZFS(余下) sudo sgdisk --zap-all "$DISK1" sudo sgdisk -n 1:1M:+1G -t 1:EF00 "$DISK1" # EFI sudo sgdisk -n 2:0:+16G -t 2:8200 "$DISK1" # SWAP sudo sgdisk -n 3:0:0 -t 3:BF00 "$DISK1" # ZFS sudo sgdisk -p "$DISK1" 格式化EFI和交换分区 sudo mkfs.fat -F32 ${DISK1}-part1 sudo mkswap ${DISK1}-part2 sudo swapon ${DISK1}-part2 查看磁盘ID ls -lh /dev/disk/by-id/ | grep -E "nvme|ssd|ata" 第四部分:安装ZFS支持 添加ZFS仓库(可选) trixie 默认仓库已有 ZFS;若需更高版本,可添加 backports: echo "deb http://deb.debian.org/debian trixie-backports main contrib non-free-firmware non-free" | sudo tee -a /etc/apt/sources.list sudo apt update 安装ZFS包 sudo apt install -y zfs-dkms zfsutils-linux sudo modprobe zfs 第五部分:ZFS配置 创建ZFS存储池 # 变量 ZFS_PART=${DISK1}-part3 POOL=rpool sudo zpool create -f \ -o ashift=12 \ -o autotrim=on \ -O compression=zstd \ -O atime=off \ -O xattr=sa \ -O acltype=posixacl \ -O mountpoint=none \ "$POOL" "$ZFS_PART" 创建ZFS数据集 sudo zfs create -o mountpoint=none $POOL/ROOT sudo zfs create -o mountpoint=/ -o canmount=noauto $POOL/ROOT/lmde sudo zfs create -o mountpoint=/home $POOL/home sudo zfs create -o mountpoint=/var $POOL/var sudo zfs create -o mountpoint=/var/log $POOL/var/log sudo zfs create -o mountpoint=/var/cache $POOL/var/cache 验证数据集创建 zpool status zfs list 设置ZFS缓存文件 sudo zpool set cachefile=/etc/zfs/zpool.cache $POOL 重新导入ZFS池 sudo zpool export $POOL sudo zpool import -R /mnt $POOL 验证挂载 sudo zfs mount $POOL/ROOT/lmde sudo mkdir -p /mnt/{boot,boot/efi,home,var,var/log,var/cache} sudo mount ${DISK1}-part1 /mnt/boot/efi zfs list 第六部分:安装LMDE系统 挂载EFI分区作为/boot sudo mount ${DISK1}-part1 /mnt/boot/efi 安装基础系统 sudo apt install -y debootstrap sudo debootstrap --arch=amd64 trixie /mnt http://deb.debian.org/debian 配置系统挂载点 使用 ZFS 自挂载,无需在 fstab 中为根写入条目。 第七部分:系统配置 进入chroot环境 sudo mount -t proc /proc /mnt/proc sudo mount --rbind /sys /mnt/sys sudo mount --rbind /dev /mnt/dev sudo arch-chroot /mnt 配置基本系统信息 echo "lmde-zfs" > /etc/hostname printf "127.0.0.1\tlocalhost\n127.0.1.1\tlmde-zfs\n" > /etc/hosts echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && locale-gen ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime || true 配置包管理器 cat > /etc/apt/sources.list << 'EOF' deb http://deb.debian.org/debian trixie main contrib non-free-firmware non-free deb http://security.debian.org/debian-security trixie-security main contrib non-free-firmware non-free deb http://deb.debian.org/debian trixie-updates main contrib non-free-firmware non-free EOF apt update 安装必要软件包 apt install -y linux-image-amd64 systemd-sysv zfs-initramfs zfsutils-linux \ grub-efi-amd64 shim-signed sudo vim less network-manager 安装桌面环境(可选) 如需 Mint 桌面,可在后续添加 LMDE 仓库与 keyring 后安装 `mint-meta-cinnamon`。 配置ZFS服务 systemctl enable zfs-import-cache.service systemctl enable zfs-mount.service systemctl enable zfs-zed.service 配置initramfs update-initramfs -u -k all 配置GRUB sed -i 's|^GRUB_CMDLINE_LINUX=.*|GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/lmde"|g' /etc/default/grub update-grub grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=LMDE --recheck 设置root密码 echo "root:changeme" | chpasswd 创建普通用户 user_new="YOUR_USERNAME" adduser "$user_new" usermod -aG sudo "$user_new" 创建用户缓存和容器数据集 zfs create -o mountpoint=/home/${user_new}/.cache rpool/cache-${user_new} zfs create -o mountpoint=/home/${user_new}/.local/share/containers rpool/containers-${user_new} 重新挂载数据集 exit # 退出 chroot zfs mount -a arch-chroot /mnt 设置用户目录权限 chown 1000:1000 "/home/${user_new}/.cache" \ "/home/${user_new}/.local/share/containers" chmod 755 "/home/${user_new}/.cache" "/home/${user_new}/.local/share/containers" 配置SMB共享 apt install -y samba mkdir -p /share chown 1000:1000 /share && chmod 700 /share cat > /etc/samba/smb.conf << 'EOF' [global] workgroup = WORKGROUP security = user map to guest = never server string = LMDE ZFS Server [share] path = /share guest ok = no read only = no valid users = YOUR_USERNAME comment = Private ZFS Share create mask = 0660 directory mask = 0770 EOF smbpasswd -a ${user_new} testparm -s systemctl enable smbd systemctl disable nmbd || true 启用基本服务 systemctl enable NetworkManager systemctl enable systemd-resolved || true systemctl enable ssh || true 第八部分:ZFS定期维护配置 配置ZFS定期维护服务 # zpool trim 定制单元与定时器(与 Debian 同步) cat > /etc/systemd/system/zfs-trim@.service << 'EOF' [Unit] Description=zpool trim on %i Documentation=man:zpool-trim(8) Requires=zfs.target After=zfs.target ConditionACPower=true ConditionPathIsDirectory=/sys/module/zfs [Service] Nice=19 IOSchedulingClass=idle KillSignal=SIGINT ExecStart=/bin/sh -c '\ if /usr/sbin/zpool status %i | grep "trimming"; then\ exec /usr/sbin/zpool wait -t trim %i;\ else exec /usr/sbin/zpool trim -w %i; fi' ExecStop=-/bin/sh -c '/usr/sbin/zpool trim -s %i 2>/dev/null || true' [Install] WantedBy=multi-user.target EOF cat > /etc/systemd/system/zfs-trim@.timer << 'EOF' [Unit] Description=Monthly zpool trim on %i [Timer] OnCalendar=monthly AccuracySec=1h Persistent=true [Install] WantedBy=multi-user.target EOF systemctl enable zfs-scrub-weekly@rpool.timer systemctl enable zfs-trim@rpool.timer 第九部分:完成安装 退出chroot并清理 exit umount /mnt/boot || true zfs umount -a zpool export rpool 重启系统 reboot 第十部分:首次启动后配置 验证系统状态 sudo zpool status sudo zfs list df -h mount | grep zfs systemctl status zfs.target systemctl status NetworkManager 启动ZFS定期维护服务 sudo systemctl start zfs-scrub-weekly@rpool.timer sudo systemctl start zfs-trim@rpool.timer systemctl status zfs-scrub-weekly@rpool.timer systemctl status zfs-trim@rpool.timer systemctl list-timers | grep zfs 验证SMB共享 sudo systemctl status smbd sudo testparm -s smbclient -L localhost -U ${USER} ls -la /share SMB用户管理 sudo pdbedit -L sudo pdbedit -L -v -u ${USER} sudo smbpasswd -a new_username sudo smbpasswd ${USER} sudo smbpasswd -d ${USER} sudo smbpasswd -e ${USER} sudo smbpasswd -x ${USER} sudo smbstatus 系统更新 sudo apt update && sudo apt upgrade -y 安装 znapzend 自动快照系统 sudo apt install -y znapzend 配置 znapzend 自动快照 # 保留=>间隔:1d=>1h, 7d=>1d, 4w=>1w(无需递归) sudo znapzendzetup create --tsformat='znapzend-%Y-%m-%d-%H%M%S' SRC '1d=>1h,7d=>1d,4w=>1w' rpool/ROOT/lmde sudo znapzendzetup create --tsformat='znapzend-%Y-%m-%d-%H%M%S' SRC '1d=>1h,7d=>1d,4w=>1w' rpool/home sudo systemctl enable znapzend sudo systemctl start znapzend sudo systemctl kill -s HUP znapzend || true sudo znapzendzetup list 第十一部分:创建APT快照管理系统 创建快照管理脚本 sudo tee /usr/local/bin/zfs-apt-snapshot << 'EOF' #!/usr/bin/env bash # Create and prune ZFS snapshots around apt transactions. # Snapshots are named: apt_{pre|post}_YYYYmmdd_HHMMSS set -uo pipefail SNAPSHOT_PREFIX="apt" MAX_SNAPSHOTS=50 DATASETS=("rpool/ROOT/lmde" "rpool/home") LOG_FILE="/var/log/zfs-apt-snapshots.log" TIMESTAMP="$(date +%Y%m%d_%H%M%S)" log() { local msg="$1"; mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true; printf '[%s] %s\n' "$(date '+%F %T')" "$msg" >>"$LOG_FILE"; } require_cmd() { command -v "$1" >/dev/null 2>&1 || { log "missing: $1"; return 1; }; } acquire_lock() { exec 9>/run/zfs-apt-snapshot.lock || exec 9>/tmp/zfs-apt-snapshot.lock; flock -n 9 || { log "another instance"; return 1; }; } create_snapshot() { local phase="$1"; local snap="${SNAPSHOT_PREFIX}_${phase}_${TIMESTAMP}"; log "creating $phase: $snap" for ds in "${DATASETS[@]}"; do if zfs list -H -o name "$ds" >/dev/null 2>&1; then zfs snapshot "${ds}@${snap}" >/dev/null 2>&1 && log "created: ${ds}@${snap}" || log "error: ${ds}@${snap}" else log "missing dataset: $ds"; fi done } cleanup_snapshots() { log "pruning old apt snapshots (keep newest ${MAX_SNAPSHOTS})" for ds in "${DATASETS[@]}"; do zfs list -H -o name "$ds" >/dev/null 2>&1 || continue mapfile -t snaps < <(zfs list -H -t snapshot -o name -S creation -r "$ds" 2>/dev/null | awk -v ds="$ds" -F'@' '$1==ds && $2 ~ /^apt_/ {print $0}') local count=${#snaps[@]}; (( count<=MAX_SNAPSHOTS )) && { log "no prune: $ds ($count)"; continue; } for ((i=MAX_SNAPSHOTS;i<count;i++)); do zfs destroy "${snaps[$i]}" >/dev/null 2>&1 && log "destroyed: ${snaps[$i]}" || log "destroy failed: ${snaps[$i]}"; done done } main() { require_cmd zfs || return 0; acquire_lock || return 0 case "${1:-}" in pre) create_snapshot pre;; post) create_snapshot post; cleanup_snapshots;; *) echo "Usage: $0 {pre|post}";; esac return 0 } main "$@" || true; exit 0 EOF sudo chmod +x /usr/local/bin/zfs-apt-snapshot 创建APT钩子 sudo tee /etc/apt/apt.conf.d/00-zfs-snapshot-pre << 'EOF' DPkg::Pre-Invoke { "/usr/local/bin/zfs-apt-snapshot pre"; }; EOF sudo tee /etc/apt/apt.conf.d/99-zfs-snapshot-post << 'EOF' DPkg::Post-Invoke { "/usr/local/bin/zfs-apt-snapshot post"; }; EOF 测试快照系统 sudo /usr/local/bin/zfs-apt-snapshot pre sleep 2 sudo /usr/local/bin/zfs-apt-snapshot post zfs list -t snapshot | grep apt || echo "no apt snapshots" 第十二部分:ZFS维护管理 常用ZFS命令 zpool status zfs list sudo zfs snapshot rpool/ROOT/lmde@manual-$(date +%Y%m%d) zfs list -t snapshot sudo zfs destroy rpool/ROOT/lmde@manual-20240101 || true 磁盘健康监控 zpool status -v rpool zpool iostat -v rpool sudo smartctl -a $DISK1 性能监控 zpool iostat 1 zpool iostat -v 1 zfs get used,available,referenced,compressratio 第十三部分:故障排除 常见问题 问题1:启动时找不到ZFS池 ...

October 17, 2025 · wang1zhen

linux-to-go-debian

配置 Live 环境 切换到 root shell sudo -i 定义系统 ID 定义一个系统标识符,用作将要安装的文件系统的简短名称。 export ID=debian 配置和更新 APT cat <<EOF > /etc/apt/sources.list deb http://deb.debian.org/debian/ trixie main non-free-firmware contrib non-free deb-src http://deb.debian.org/debian/ trixie main non-free-firmware contrib non-free EOF apt update 注意: 已添加 non-free 源以支持 NVIDIA 驱动等专有软件 将 deb.debian.org 替换为本地镜像源可能会获得更快的下载速度 安装辅助工具 apt install debootstrap gdisk dkms linux-headers-$(uname -r) apt install zfsutils-linux arch-install-scripts 生成 /etc/hostid zgenhostid -f 定义磁盘变量 为方便操作并减少出错可能性,设置环境变量来引用将在安装过程中配置的设备。 重要: 对于 Linux To Go 系统,**必须使用** /dev/disk/by-id/ 路径来引用磁盘。这样可以确保在不同机器上插入 USB 设备时,磁盘标识保持持久性和唯一性,避免因设备顺序变化导致的启动问题。 ...

September 29, 2025 · wang1zhen

zfs 备份

硬盘初始化 确认设备 lsblk 清除旧分区表(可选) sudo wipefs -a /dev/sda 使用 gdisk 分区 sudo gdisk /dev/sda 输入 o → 新建空 GPT 表 输入 n → 新建分区(整盘) 类型代码:=BF00= (Solaris / ZFS) 输入 w → 写入 完成后得到 /dev/sda1 创建 ZFS 池 sudo zpool create -f backup /dev/sda1 优化设置 sudo zfs set mountpoint=/mnt/backup backup sudo zfs set compression=zstd backup 卸载/挂载池 sudo zpool export backup # 卸载 sudo zpool import # 查看可导入的池 sudo zpool import -d /dev/disk/by-id backup # 重新挂载(指定设备路径) 检查池状态 ...

September 26, 2025 · wang1zhen