前置条件
- 能正常进入Linux系统
- 新硬盘(硬盘2)容量应大于或等于旧硬盘(硬盘1)
- 以root身份操作
- 停止所有对外服务(如网站、API等),避免迁移过程中产生新数据
1. 更新系统并安装必要工具
apt update
apt install -y rsync
2. 检查硬盘信息
# 查看所有硬盘
lsblk
# 假设旧硬盘为sda,新硬盘为sdb
# 检查旧硬盘分区
lsblk -f /dev/sda
# 例如:/dev/sda1 (ext4, /) 和 /dev/sda5 (swap)
# 检查新硬盘分区
lsblk -f /dev/sdb
# 新硬盘应无分区
3. 格式化新硬盘
使用fdisk对新硬盘分区并格式化为ext4文件系统:
由于后续我通过swap 文件来管理,这里就不创建swap分区了
fdisk /dev/sdb
# 依次输入以下命令:
o # 新建空的DOS分区表
n # 新建分区
p # 主分区
1 # 分区号1
# 默认起始扇区
# 默认结束扇区(整个磁盘)
w # 写入分区表并退出
mkfs.ext4 /dev/sdb1
4. 挂载新旧硬盘
mkdir -p /mnt/oldroot /mnt/newroot
mount /dev/sda1 /mnt/oldroot
mount /dev/sdb1 /mnt/newroot
5. 拷贝数据
使用rsync进行数据迁移,排除不需要复制的目录:
rsync -aAXHv \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \
/mnt/oldroot/ /mnt/newroot/
-aA
:保留权限和ACL-X
:保留SELinux标签(如有)--exclude
:排除虚拟和挂载文件系统
6. 配置新系统环境并安装引导
# 1. 绑定伪文件系统
mount --bind /dev /mnt/newroot/dev
mount --bind /proc /mnt/newroot/proc
mount --bind /sys /mnt/newroot/sys
# 2. 进入chroot环境
chroot /mnt/newroot /bin/bash
# 3. 更新/etc/fstab
blkid /dev/sdb1
# 编辑/etc/fstab,只保留根分区一行,例如:
# UUID=你的-sdb1-UUID / ext4 defaults,noatime 0 1
# 删除或注释掉原swap行
# 4. 安装GRUB到新硬盘
apt install -y grub-pc
grub-install /dev/sdb
update-grub
7. 验证迁移结果
重启进入BIOS,将新硬盘设置为第一启动项:
通过lsblk检查跟分区是否为新硬盘,命名可能也被叫做/dev/sda了,如果硬盘大小不一致具体看容量区分吧
lsblk # 根分区应为 /dev/sdb1
df -h # “/” 挂载点对应 sdb1
8. (可选)创建swap文件
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
9. 清除旧硬盘数据(如需)
注意:此操作会清空旧硬盘所有数据,请谨慎操作!
fdisk /dev/sda
# 在fdisk提示符下输入:
o # 新建空的DOS分区表(删除所有分区)
w # 写入并退出
# 快速清零前10MB
dd if=/dev/zero of=/dev/sda bs=1M count=10 status=progress
# 全盘快速填零(时间较长)
dd if=/dev/zero of=/dev/sda bs=1M status=progress
lsblk /dev/sda
写在最后
验证完成,现在可以安心地继续使用服务器了。其实对于硬盘分区、数据无损迁移这些我一直心存敬畏,总担心操作失误会导致数据丢失。这次迁移的顺利完成,让我对自己多了一些信心。也许对于高手来说,这只是轻松的小事,但对我这样的新手而言,整个过程还是挺有挑战的。趁着迁移完成的第二天,我特地复盘并记录下整个流程,希望以后遇到类似需求时可以作为参考,也希望能帮到有同样困惑的朋友。