Debian环境下无需手动指定目录将2n容量源盘镜像拆分至两个1n容量驱动器的方案咨询(含Rsync溢出模式疑问)
Debian环境下无需手动指定目录将2n容量源盘镜像拆分至两个1n容量驱动器的方案咨询(含Rsync溢出模式疑问)
嘿,我来帮你搞定这个问题~首先明确说:rsync本身并没有内置的“溢出模式”,但咱们可以用简单的脚本+rsync组合,实现不用手动指定目录、自动把4TB源盘内容拆分到两个2TB旧盘的效果,完全符合你的需求,而且不用额外花钱买硬件。
先理清楚整体思路:先把原镜像的完整内容同步到新4TB盘(作为主源),然后通过脚本自动把大目录优先填满第一个旧盘,剩余内容自动转到第二个旧盘,全程不用手动挑目录。
第一步:先把内容同步到新4TB盘
首先确保你的4TB盘已经分区、格式化(比如用ext4),挂载到某个路径,比如/mnt/new4tb。然后把当前2TB镜像盘的内容完整同步过去:
rsync -av --delete /mnt/your_old_mirror_drive/ /mnt/new4tb/
加--delete是为了保证新盘和原镜像盘完全一致,同步前可以先加--dry-run参数测试,避免误操作:
rsync -av --delete --dry-run /mnt/your_old_mirror_drive/ /mnt/new4tb/
第二步:自动拆分内容到两个旧2TB盘
假设两个旧盘分别挂载到/mnt/old_drive1和/mnt/old_drive2,先确保这两个盘是空的(或者已经做好数据备份,因为下面的脚本会用--delete清理目标盘上的冗余文件)。
我给你写了一个简单的bash脚本,它会自动按目录大小从大到小排序,优先把大目录放到第一个旧盘,当第一个盘剩余空间不够时,自动切换到第二个盘同步:
#!/bin/bash # 配置路径 SOURCE="/mnt/new4tb" DEST1="/mnt/old_drive1" DEST2="/mnt/old_drive2" # 按目录大小从大到小遍历源目录 for dir in $(du -sh "$SOURCE"/* | sort -hr | awk '{print $2}'); do # 计算第一个目标盘的剩余空间(字节) FREE_SPACE_DEST1=$(df -B1 "$DEST1" | grep -v Filesystem | awk '{print $4}') # 计算当前目录的大小(字节) DIR_SIZE=$(du -B1 "$dir" | awk '{print $1}') # 判断当前目录能不能放进第一个盘 if [ "$DIR_SIZE" -le "$FREE_SPACE_DEST1" ]; then echo "正在同步 $dir 到 $DEST1..." rsync -av --delete "$dir" "$DEST1/" else echo "$DEST1 空间不足,正在同步 $dir 到 $DEST2..." rsync -av --delete "$dir" "$DEST2/" fi done
把这个脚本保存成sync_split.sh,加执行权限:chmod +x sync_split.sh,然后运行就行。
一些注意事项
- 同步前一定要用
--dry-run测试rsync命令,确认不会误删重要数据 - 后续如果要更新内容,需要同时同步到两个旧盘,或者修改脚本让它自动判断新文件/目录应该放到哪个剩余空间足够的盘
- 关于你提到的未来ZFS JBOD计划:现在这样拆分的话,后续迁移到ZFS时需要把两个旧盘的内容合并到ZFS池里,建议你同步完后记录一下哪些目录在哪个旧盘,方便后续合并操作
备注:内容来源于stack exchange,提问作者ChiggyClaus
相关产品推荐
相关产品推荐

