第一部分:准备安装介质

下载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池

sudo zpool import -f rpool
sudo zpool set cachefile=/etc/zfs/zpool.cache rpool

问题2:磁盘故障处理

sudo zpool status -v
sudo journalctl -u zfs-import-cache.service -n 50
sudo smartctl -a ${DISK1}

紧急恢复

  1. 用 LMDE/Debian Live 启动
  2. `apt update && apt install -y zfsutils-linux`
  3. `zpool import -R /mnt rpool`
  4. `zfs mount rpool/ROOT/lmde && zfs mount -a`
  5. `mount ${DISK1}-part1 /mnt/boot`
  6. `arch-chroot /mnt`

常用命令速查

# ZFS管理
sudo zpool status
sudo zfs list
sudo zpool scrub rpool
sudo zpool trim rpool

# 磁盘健康
sudo zpool status -v rpool
zpool iostat -v rpool
sudo smartctl -a $DISK1

# 定时器管理
systemctl list-timers | grep zfs
sudo systemctl start zfs-scrub-weekly@rpool.service
sudo systemctl start zfs-trim@rpool.service

# 快照管理
sudo zfs snapshot rpool/ROOT/lmde@backup-$(date +%Y%m%d)
zfs list -t snapshot
sudo /usr/local/bin/zfs-apt-snapshot pre
tail -f /var/log/zfs-apt-snapshots.log
zfs list -t snapshot | grep apt
sudo systemctl status znapzend
sudo journalctl -u znapzend -f

# 休眠/交换
swapon --show
sudo systemctl hibernate
cat /sys/power/state
free -h

# zram
sudo zramctl
sudo systemctl status systemd-zram-setup@zram0.service
cat /proc/sys/vm/swappiness

安装 Podman 与兼容层

apt install -y podman podman-docker podman-compose
podman info
podman run --rm hello-world

附录:Podman 常用命令与日常维护

基本信息与运行

podman info
podman run --rm hello-world

镜像与容器管理

podman images
podman ps -a
podman pull alpine
podman run -d --name web -p 8080:80 nginx:alpine
podman logs -f web
podman exec -it web sh
podman stop web && podman rm web

清理与空间回收

podman image prune -a
podman container prune
podman volume ls
podman volume prune
podman system df
podman system prune -a

Quadlet 自启(简要)

  • 用户路径:`~/.config/containers/systemd/`
  • 系统路径:`/etc/containers/systemd/`
  • 常用步骤:写入 .container -> `systemctl –user daemon-reload` -> `systemctl –user start <name>.service` -> `loginctl enable-linger $USER`(可选)

附录:NVIDIA显卡禁用配置

禁用NVIDIA显卡(使用bbswitch)

echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
echo "options nouveau modeset=0" | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
sudo update-initramfs -u
sudo reboot
sudo apt install -y bbswitch-dkms
sudo modprobe bbswitch
echo OFF | sudo tee /proc/acpi/bbswitch
echo "bbswitch" | sudo tee -a /etc/modules
echo "options bbswitch load_state=0 unload_state=0" | sudo tee /etc/modprobe.d/bbswitch.conf

验证NVIDIA显卡禁用状态

cat /proc/acpi/bbswitch
lspci | grep -i nvidia
lsmod | grep -E "(nouveau|nvidia|bbswitch)"
sudo powertop || true