#!/bin/bash
# Debian 系统迁移脚本 - 使用 Btrfs + ZSTD 压缩
# 用法: bash migrate_debian.sh
set -e
echo "源磁盘: /dev/sda1 (Debian系统)"
echo "目标磁盘: /dev/vda"
echo ""
read -p "确认开始迁移?(yes/no): " confirm
[[ "$confirm" != "yes" ]] && exit 1
# 检查工具
for cmd in btrfs parted rsync mkfs.vfat; do
if ! command -v $cmd &> /dev/null; then
apt-get update && apt-get install -y btrfs-progs parted rsync dosfstools
break
fi
done
# 创建分区
echo "创建分区..."
parted -s /dev/vda mklabel gpt
parted -s /dev/vda mkpart primary fat32 1MiB 101MiB
parted -s /dev/vda set 1 esp on
parted -s /dev/vda mkpart primary btrfs 101MiB 100%
# 格式化
echo "格式化分区..."
mkfs.vfat -F32 -n "DEBIAN-EFI" /dev/vda1
mkfs.btrfs -f -L "DEBIAN-ROOT" -m single -d single /dev/vda2
# 挂载
echo "挂载分区..."
mkdir -p /mnt/{old,new}
mount /dev/sda1 /mnt/old
mkdir -p /mnt/old/boot/efi
mount /dev/sda15 /mnt/old/boot/efi
mount -o compress-force=zstd:1 /dev/vda2 /mnt/new
mkdir -p /mnt/new/boot/efi
mount /dev/vda1 /mnt/new/boot/efi
# 复制文件
echo "复制系统文件..."
rsync -aAXHv --info=progress2 \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/swapfile","*.log","*~","/var/cache/*","/var/tmp/*"} \
/mnt/old/ /mnt/new/
# 创建系统目录
mkdir -p /mnt/new/{dev,proc,sys,tmp,run,mnt,media}
chmod 1777 /mnt/new/tmp
# 更新 fstab
echo "更新 fstab..."
NEW_ROOT_UUID=$(blkid -s UUID -o value /dev/vda2)
NEW_EFI_UUID=$(blkid -s UUID -o value /dev/vda1)
cat > /mnt/new/etc/fstab << EOF
UUID=${NEW_ROOT_UUID} / btrfs defaults,compress-force=zstd:1,noatime 0 0
UUID=${NEW_EFI_UUID} /boot/efi vfat umask=0077 0 2
EOF
# 准备 chroot
mount --bind /dev /mnt/new/dev
mount --bind /proc /mnt/new/proc
mount --bind /sys /mnt/new/sys
mount --bind /dev/pts /mnt/new/dev/pts
# 安装 GRUB
echo "安装 GRUB..."
chroot /mnt/new /bin/bash -c "
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck /dev/vda
update-grub
"
# 显示空间使用
echo ""
df -h /mnt/new
# 卸载
echo ""
echo "卸载文件系统..."
sync
umount /mnt/new/dev/pts
umount /mnt/new/dev
umount /mnt/new/proc
umount /mnt/new/sys
umount /mnt/new/boot/efi
umount /mnt/new
umount /mnt/old/boot/efi
umount /mnt/old
echo ""
echo "迁移完成。重启后从 /dev/vda 启动。"