核心思路与规划
目标:将Solaris系统上一个或多个关键文件系统(如
/,
/usr,
/export/home 等)备份到磁带设备上。
工具:主要使用Solaris经典的
ufsdump 命令。它专为备份完整的UFS文件系统设计,能保留文件属性、ACL、稀疏文件等,并支持增量备份。
磁带设备:通常为
/dev/rmt/0(第一个磁带驱动器)。可能还有其他别名如
/dev/rmt/0cn(不重绕,无压缩)。
多分区写入:即在一个磁带上连续写入多个备份集。通过指定
ufsdump 的
-S(估算大小)和
-a(自动加载)等参数,并控制磁带不重绕,可以实现。
前提条件:
- 确保系统处于多用户模式且运行稳定。
- 确保有足够权限(通常需要
root 用户)。
- 确保磁带驱动器已正确连接并被系统识别(
cfgadm -al 或 luxadm probe 查看)。
- 准备足够的空白磁带或可覆盖的磁带。
详细步骤
步骤1:系统检查与准备
确认运行级别:
who -r
输出应显示运行级别 3。
查看文件系统布局和磁盘使用情况:
df -h
确定你要备份的分区及其挂载点(例如:/, /usr, /export/home)。
检查磁带设备:
mt -f /dev/rmt/0 status
如果命令未找到,可能需要先加载 st 驱动或检查硬件。cfgadm -al 可以查看磁带机状态。
步骤2:选择备份策略
- 完全备份 (Level 0):备份所有数据。命令中使用
0 作为 dump 级别。
- 增量备份 (Level 1-9):仅备份自上次较低级别dump以来更改的文件。例如,周日晚Level 0,周一到周六Level 9。
步骤3:执行备份到磁带
我们将演示如何将 / 和 /export/home 两个文件系统连续写入同一盘磁带。
重要概念:使用 /dev/rmt/0n(n 表示 no rewind,不重绕)来确保在写完一个文件系统后,磁带停在当前位置,以便下一个备份集可以接着写入。
备份第一个文件系统 (根分区 /)
ufsdump 0ucf /dev/rmt/0cn /dev/rdsk/c0t0d0s0
0: dump 级别 0(完全备份)。
u: 更新 /etc/dumpdates 文件,记录备份时间。
c: 针对盒式磁带(cartridge)优化。
f /dev/rmt/0cn: 指定设备文件。0c 是设备号,n 是关键参数,表示 操作完成后磁带不重绕。
/dev/rdsk/c0t0d0s0: 要备份的原始磁盘设备(对应根分区的块设备)。不要直接备份挂载点目录(如 /),这可能导致不一致。
- 命令执行时会显示进度、文件数、字节数等信息。完成后,磁带停在备份集末尾。
备份第二个文件系统 (/export/home)
ufsdump 0ucf /dev/rmt/0cn /dev/rdsk/c0t0d0s7
- 注意:仍然使用
0cn。因为磁带没有重绕,这次写入会从上一次结束的位置开始。
/dev/rdsk/c0t0d0s7: 假设是 /export/home 对应的原始设备(请根据你的 df -h 和 format 输出确认)。
- 完成后,磁带停在第二个备份集的末尾。
(可选) 写入文件结束标记并倒带
如果你想现在取出磁带,最好写入一个文件结束标记(EOF)并倒带。
mt -f /dev/rmt/0n weof # 在当前位置写入两个文件结束标记(这是磁带的标准做法)
mt -f /dev/rmt/0 rewind # 然后倒带,准备用于恢复
步骤4:验证备份
方法A:使用 ufsrestore 查看磁带内容
查看第一个备份集(根分区)的目录:
ufsrestore tf /dev/rmt/0
- 这会读取磁带开头的第一个备份集,并列出文件列表。
- 完成后,磁带会停在第一个备份集的末尾。
查看第二个备份集:
ufsrestore tf /dev/rmt/0n
- 使用
0n 设备,从当前位置(第一个备份集末尾)读取第二个备份集。
方法B:使用 mt 命令操作磁带
自动化脚本示例
你可以将上述过程编写成一个Shell脚本,例如 /usr/local/bin/full_system_backup.sh:
#!/bin/bash
# full_system_backup.sh
# 多分区备份到磁带脚本
TAPE_DEV="/dev/rmt/0cn"
DUMP_OPTS="0ucf"
LOG_FILE="/var/log/backup_$(date +%Y%m%d).log"
# 要备份的文件系统及其原始设备
# 格式: “挂载点:原始设备”
FS_TO_BACKUP=(
"/:/dev/rdsk/c0t0d0s0"
"/usr:/dev/rdsk/c0t0d0s6"
"/export/home:/dev/rdsk/c0t0d0s7"
)
echo "=== 开始系统备份 $(date) ===" >> $LOG_FILE
# 倒带并清空磁带开头
mt -f /dev/rmt/0 rewind
mt -f /dev/rmt/0 erase # 注意:这会擦除整盘磁带!确保是新带或可覆盖。
for fs_item in "${FS_TO_BACKUP[@]}"; do
MOUNT_POINT="${fs_item%%:*}"
RAW_DEV="${fs_item##*:}"
echo "正在备份 $MOUNT_POINT (设备: $RAW_DEV) ..." | tee -a $LOG_FILE
# 执行备份
ufsdump $DUMP_OPTS $TAPE_DEV $RAW_DEV 2>&1 | tee -a $LOG_FILE
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo "错误: $MOUNT_POINT 备份失败!" | tee -a $LOG_FILE
exit 1
fi
echo "--- $MOUNT_POINT 备份完成 ---" | tee -a $LOG_FILE
done
# 写入结束标记并倒带
echo "写入磁带结束标记并倒带..." | tee -a $LOG_FILE
mt -f /dev/rmt/0n weof
mt -f /dev/rmt/0 rewind
echo "=== 备份流程全部完成 $(date) ===" >> $LOG_FILE
echo "备份日志已保存至: $LOG_FILE"
使用脚本前:
用
chmod +x /usr/local/bin/full_system_backup.sh 赋予执行权限。
仔细修改
FS_TO_BACKUP 数组,使其匹配你的系统。
特别注意:脚本中的
erase 命令会
擦除整盘磁带,首次使用时建议注释掉,或先用废带测试。
恢复数据关键命令
当需要从磁带恢复时,定位到对应的备份集,然后使用 ufsrestore:
交互式恢复单个文件:
mt -f /dev/rmt/0 rewind # 倒带到开头
mt -f /dev/rmt/0n fsf 1 # 如果需要,跳到第二个备份集
ufsrestore -i -f /dev/rmt/0n # 进入交互模式
在 ufsrestore> 提示符下,可以使用 ls, cd, add, extract 等命令。
恢复整个文件系统到临时目录:
ufsrestore -rf /dev/rmt/0n
重要注意事项
稳定性:在多用户模式下备份,系统文件可能正在被写入。
ufsdump 会尽量保持一致性,但对于极度活跃的数据库,仍建议有应用级的静默或快照配合。
设备名:你的磁带设备名可能不同(如
/dev/rmt/1)。使用
ls /dev/rmt/* 查看。
原始设备:务必备份原始设备(
/dev/rdsk/*),而不是块设备(
/dev/dsk/*)。
磁带容量:提前估算备份数据量(
ufsdump -S /dev/rdsk/c0t0d0s0),确保磁带容量足够。多分区写入时更要注意。
日志:始终记录备份的详细信息(日期、级别、分区、磁带编号),并将
ufsdump 输出重定向到日志文件。
测试恢复:
定期进行恢复测试是备份策略中必不可少的一环,确保磁带和备份数据是可用的。
通过以上步骤,你可以在Solaris多用户模式下,安全、有效地执行多分区系统备份到磁带的操作。