Linux 服务器磁盘映像备份与恢复实战指南
背景
在服务器运维中,磁盘健康度下降可能导致数据丢失风险,特别是在未配置 RAID 的情况下。针对这种情况,备份磁盘数据并恢复到新设备是确保数据安全的关键。本文记录了使用 dd
命令通过 NFS 实现全盘映像备份,并将备份恢复到另一台服务器的裸盘(/dev/sdb
)的完整流程。恢复后,系统进入 initramfs
紧急模式,通过 fsck
修复文件系统问题,最终成功启动系统的操作步骤。
本文适用于以下场景:
- 系统:Ubuntu(本文基于 Ubuntu 22.04,内核 6.2)
- 需求:全量备份磁盘数据,并在另一台服务器上恢复,保持系统和数据完整
- 环境:源服务器磁盘健康度低,目标服务器使用裸盘,无 RAID 配置
环境准备
源服务器
:
- 系统:Ubuntu 22.04(或其他版本)
- 磁盘:
/dev/sda
(待备份磁盘,健康度不足 1%) - 网络:可访问 NFS 服务器
目标服务器
- 系统:Ubuntu 22.04(或其他版本)
- 磁盘:
/dev/sdb
(裸盘,用于恢复映像) - 原系统盘:
/dev/sda
(恢复后移除)
NFS 服务器
- 提供充足存储空间,用于存放备份映像
工具
dd
:用于全盘映像备份和恢复fsck
:用于修复文件系统nfs-common
:用于挂载 NFS
其他
- Ubuntu Live USB(用于修复或验证)
- 网络配置确保两台服务器与 NFS 通信正常
操作步骤
1. 确认磁盘健康状态
在源服务器上,检查磁盘健康状态以评估备份的紧急程度。
sudo apt update
sudo apt install smartmontools
sudo smartctl -a /dev/sda
- 查看
SMART
输出中的Reallocated_Sector_Ct
、Wear_Leveling_Count
等指标,确认磁盘健康度。 - 如果健康度低于 1%,立即停止不必要的写操作,进入备份流程。
2. 挂载 NFS 并备份磁盘映像
为确保备份安全,将磁盘映像存储到 NFS 服务器。
2.1 配置 NFS 客户端
安装 NFS 客户端工具并挂载 NFS 共享目录:
sudo apt install nfs-common
sudo mkdir /mnt/nfs
sudo mount -t nfs <NFS_SERVER_IP>:/path/to/share /mnt/nfs
替换
<NFS_SERVER_IP>
和/path/to/share
为实际 NFS 服务器地址和共享路径。验证挂载:
df -h /mnt/nfs
2.2 使用 dd
创建全盘映像
停止可能导致磁盘写入的服务(如数据库、Web 服务器)以确保数据一致性:
sudo systemctl stop mysql apache2 # 根据实际情况调整
执行 dd
备份整个磁盘:
sudo dd if=/dev/sda of=/mnt/nfs/full_backup.img bs=64K status=progress
if=/dev/sda
:源磁盘设备。of=/mnt/nfs/full_backup.img
:备份文件存储路径。bs=64K
:设置块大小以提高效率。status=progress
:显示备份进度。
注意:
确保 NFS 存储空间足够(至少等于源磁盘容量)。
可选:备份后生成校验和以验证完整性:
md5sum /mnt/nfs/full_backup.img > /mnt/nfs/full_backup.img.md5
3. 在目标服务器上恢复磁盘映像
将备份映像恢复到目标服务器的裸盘(/dev/sdb
)。
3.1 确认目标磁盘
在目标服务器上,确认目标磁盘为裸盘(/dev/sdb
):
sudo fdisk -l
如果磁盘已有分区,建议清空:
sudo wipefs -a /dev/sdb
sudo dd if=/dev/zero of=/dev/sdb bs=1M count=100
3.2 挂载 NFS
在目标服务器上挂载 NFS 以访问备份映像:
sudo apt install nfs-common
sudo mkdir /mnt/nfs
sudo mount -t nfs <NFS_SERVER_IP>:/path/to/share /mnt/nfs
验证备份文件存在:
ls /mnt/nfs/full_backup.img
3.3 恢复映像
将备份映像恢复到 /dev/sdb
:
sudo dd if=/mnt/nfs/full_backup.img of=/dev/sdb bs=64K status=progress
确保目标磁盘容量不小于源磁盘。
验证恢复完成:
sudo fdisk -l /dev/sdb
4. 移除原系统盘并重启
为使用恢复的磁盘作为系统盘,移除目标服务器的原系统盘(/dev/sda
)。
关机:
sudo poweroff
物理移除
/dev/sda
(或在 BIOS 中调整启动顺序,确保从/dev/sdb
启动)。重启服务器:
- 如果使用 BIOS,进入 BIOS 设置,将
/dev/sdb
设置为首选启动设备。 - 如果使用 UEFI,确保 EFI 分区正确配置。
- 如果使用 BIOS,进入 BIOS 设置,将
5. 处理 initramfs
紧急模式
重启后,系统进入 initramfs
紧急模式(提示类似 (initramfs)
),通常是由于文件系统错误或分区配置问题。
5.1 运行 fsck
修复文件系统
在 initramfs
提示符下,执行以下命令:
fsck /dev/sda1
替换
/dev/sda1
为根分区(恢复后/dev/sdb
可能被识别为/dev/sda
)。如果提示修复错误,按
y
确认。如果需要检查所有分区:
fsck -A -y
5.2 确认修复并重启
修复完成后,退出 initramfs
:
exit
系统将尝试继续启动。如果仍无法进入正常模式,重启:
reboot
6. 验证系统恢复
重启后,检查系统是否正常启动:
确认登录:
登录系统,验证用户和数据是否完整。
检查关键目录:
ls /bin /sbin /home
检查 GRUB:
确保 GRUB 正常加载:
cat /boot/grub/grub.cfg
如果 GRUB 配置缺失,重新安装:
sudo grub-install /dev/sda sudo update-grub
检查文件系统:
df -h sudo fsck /dev/sda1
验证服务:
检查关键服务是否正常运行:
systemctl status
注意事项
备份完整性:
- 备份前停止写操作,确保映像一致性。
- 验证备份文件完整性(使用
md5sum
或挂载映像检查)。
目标磁盘准备:
- 确保目标磁盘为空,避免覆盖已有系统导致冲突。
- 目标磁盘容量需大于或等于源磁盘。
NFS 配置:
- 确保 NFS 服务器稳定,网络带宽足够,避免备份或恢复中断。
- 检查 NFS 权限,确保目标服务器有写权限。
分区和 UUID:
恢复后检查
/etc/fstab
中的 UUID 是否与blkid
输出一致:blkid cat /etc/fstab
如有不匹配,编辑
/etc/fstab
修正。
GRUB 配置:
如果系统无法启动,可能需从 Ubuntu Live USB 重新安装 GRUB:
sudo mount /dev/sda1 /mnt sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo mount --bind /run /mnt/run sudo chroot /mnt grub-install /dev/sda update-grub
硬件兼容性:
确保目标服务器硬件(如磁盘控制器、CPU)与源系统兼容。
如果内核版本不匹配,可能需重新安装内核:
apt install --reinstall linux-image-$(uname -r)
总结
通过 dd
命令结合 NFS 实现全盘映像备份与恢复,是一种高效的服务器数据迁移方案。本文详细记录了从备份到恢复的完整流程,以及处理 initramfs
紧急模式的修复方法。关键点包括:
- 使用
dd
确保全量备份,结合 NFS 提供可靠存储。 - 恢复到裸盘并移除原系统盘,简化启动配置。
- 通过
fsck
修复文件系统,解决initramfs
问题。
后续建议:
- 配置 RAID(如 RAID 1)以提高数据冗余。
- 定期验证备份完整性,建立自动化备份机制(如
cron
+rsync
)。 - 使用监控工具(如
smartmontools
)跟踪磁盘健康状态。
希望这篇实战指南能为你的服务器运维提供参考!如果有其他问题,欢迎留言交流。