背景
我跑出空位的/home/data
需要,并转移/home/data/repo
至/home/data2
。
/home/data/repo
包含1M个目录,每个目录包含11个目录和10个文件。总计2TB。
/home/data
在启用了dir_index的ext3上。
/home/data2
在ext4上。运行CentOS 6.4。
我认为这些方法之所以缓慢,是因为repo/
在其正下方有100万个目录。
尝试1:mv
很快但被打断
如果完成,我可以完成:
/home/data> mv repo ../data2
但在转移1.5TB后中断。它的写入速度约为1GB / min。
尝试2:rsync
在建立文件列表8小时后进行爬网
/home/data> rsync --ignore-existing -rv repo ../data2
建立“增量文件列表”花费了几个小时,然后以100MB / min的速度传输。
我取消它以尝试更快的方法。
尝试3a:mv
抱怨
在子目录上对其进行测试:
/home/data/repo> mv -f foobar ../../data2/repo/
mv: inter-device move failed: '(foobar)' to '../../data2/repo/foobar'; unable to remove target: Is a directory
我不确定这是什么错误,但也许cp
可以让我摆脱困境。
尝试3b:cp
8小时后无济于事
/home/data> cp -nr repo ../data2
它会读取磁盘8个小时,因此我决定取消磁盘并返回rsync。
尝试4:rsync
建立档案清单8小时后进行检索
/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2
我曾经--remove-source-files
认为如果现在开始清理,它可能会使其更快。
建立文件列表至少需要6个小时,然后以100-200MB / min的速度传输。
但是服务器一夜之间负担很重,我的连接关闭了。
尝试5:只有300GB左右空间,为什么会这么痛
/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2
再次中断。在-W
几乎似乎让“发送增量文件列表”更快,这对我的理解不应该是有意义的。无论如何,传输速度非常慢,我放弃了这一步。
尝试6: tar
/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)
基本上是尝试重新复制所有内容,但忽略现有文件。它必须经过1.7TB的现有文件,但至少以1.2GB / min的速度读取。
到目前为止,这是唯一可以立即得到满足的命令。
更新:甚至以nohup再次中断。
尝试7:rak立
还在争论这个
尝试8:脚本与“合并” mv
目标目录中有大约12万个空目录,所以我跑了
/home/data2/repo> find . -type d -empty -exec rmdir {} \;
Ruby脚本:
SRC = "/home/data/repo"
DEST = "/home/data2/repo"
`ls #{SRC} --color=never > lst1.tmp`
`ls #{DEST} --color=never > lst2.tmp`
`diff lst1.tmp lst2.tmp | grep '<' > /home/data/missing.tmp`
t = `cat /home/data/missing.tmp | wc -l`.to_i
puts "Todo: #{t}"
# Manually `mv` each missing directory
File.open('missing.tmp').each do |line|
dir = line.strip.gsub('< ', '')
puts `mv #{SRC}/#{dir} #{DEST}/`
end
完成。
mv
一次?从理论上讲,mv
只有在目标文件已完全复制后才删除源文件,这样就可以正常工作。另外,您对计算机有物理访问权还是通过ssh
连接完成的?
mv
不能原谅,如果您一直断开连接,则可能会丢失数据甚至不知道它。正如您所说的那样ssh
,我强烈建议使用screen
和分离。启用日志记录并保持跟踪。如果您使用的是详细信息,则需要更长的时间。也可以尝试iotop
screen
。我想知道冗长的内容,但tar
现在重新启动为时已晚。iotop
在最近几天里,它一直是我最喜欢的实用工具:)