21
2
Background
I ran out of space on /home/data
and need to transfer /home/data/repo
to /home/data2
.
/home/data/repo
contains 1M dirs, each of which contain 11 dirs and 10 files. It totals 2TB.
/home/data
is on ext3 with dir_index enabled.
/home/data2
is on ext4.
Running CentOS 6.4.
I assume these approaches are slow because of the fact that repo/
has 1 million dirs directly underneath it.
Attempt 1: mv
is fast but gets interrupted
I could be done if this had finished:
/home/data> mv repo ../data2
But it was interrupted after 1.5TB was transferred. It was writing at about 1GB/min.
Attempt 2: rsync
crawls after 8 hours of building file list
/home/data> rsync --ignore-existing -rv repo ../data2
It took several hours to build the 'incremental file list' and then it transfers at 100MB/min.
I cancel it to try a faster approach.
Attempt 3a: mv
complains
Testing it on a subdirectory:
/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
I'm not sure what this is error about, but maybe cp
can bail me out..
Attempt 3b: cp
gets nowhere after 8 hours
/home/data> cp -nr repo ../data2
It reads the disk for 8 hours and I decide to cancel it and go back to rsync.
Attempt 4: rsync
crawls after 8 hours of building file list
/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2
I used --remove-source-files
thinking it might make it faster if I start cleanup now.
It takes at least 6 hours to build the file list then it transfers at 100-200MB/min.
But the server was burdened overnight and my connection closed.
Attempt 5: THERES ONLY 300GB LEFT TO MOVE WHY IS THIS SO PAINFUL
/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2
Interrupted again. The -W
almost seemed to make "sending incremental file list" faster, which to my understanding shouldn't make sense. Regardless, the transfer is horribly slow and I'm giving up on this one.
Attempt 6: tar
/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)
Basically attempting to re-copy everything but ignoring existing files. It has to wade thru 1.7TB of existing files but at least it's reading at 1.2GB/min.
So far, this is the only command which gives instant gratification.
Update: interrupted again, somehow, even with nohup..
Attempt 7: harakiri
Still debating this one
Attempt 8: scripted 'merge' with mv
The destination dir had about 120k empty dirs, so I ran
/home/data2/repo> find . -type d -empty -exec rmdir {} \;
Ruby script:
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
DONE.
You are correct,it has to find and enumerate each directory and 1 million dirs is going to be painful. – cybernard – 2013-09-06T16:19:03.213
2Look at the bright side... if it were Windows, you couldn't even have a million subdirectories and still have an OS that works. :) – Jack – 2013-09-06T16:55:00.620
@Jack really? Does Windows have a limit? Is this not a relic from the FAT32 days (I haven't used Windows as a main OS since ~2001 so I am not really up to date on it)? – terdon – 2013-09-06T17:27:45.737
1@Tim, why don't you just
mv
again? In theorymv
will only delete a source file if the destination file has been completely copied so it should work OK. Also, do you have physical access to the machine or is this done through anssh
connection? – terdon – 2013-09-06T17:28:42.850@terdon - Windows doesn't have a limit, per se... but it has a point where it becomes unusable for all intents and purposes. Windows Explorer will take forever to display the file list, etc. – Jack – 2013-09-06T18:25:39.810
@Jack OK, but that will only affect that one directory right? Or will the entire system be affected? – terdon – 2013-09-06T18:27:45.943
@terdon - Just the one directory. See http://technet.microsoft.com/en-us/magazine/hh395477.aspx
– Jack – 2013-09-06T18:43:05.680@terdon - Wanted to use
mv -f
but tested it on a subdir and gotmv: inter-device move failed: '(foobar)' to '../../data2/repo/foobar'; unable to remove target: Is a directory
. And yes, I'm usingssh
. – Tim – 2013-09-06T19:33:55.897With that many files/directories you'd honestly be better off using
dd
(though for 2TB it'd take hours/days to finish) – justbrowsing – 2013-09-06T19:53:21.617@justbrowsing - the problem now is that I need to merge/resume. Can
dd
do that? If some of the source files weren't deleted already, I'd just delete the destination dir andmv
the source again. It would have taken only 24 hours had it not been interrupted. – Tim – 2013-09-06T20:20:59.6875No it can't.
mv
isn't forgiving, if you keep getting disconnected you could lose data and not even know it. As you said you are doing this overssh
, I highly recommend usingscreen
and detach. Enable logging and keep track that way. If you are using verbose it'll just take longer. Also tryiotop
– justbrowsing – 2013-09-06T20:34:55.1032@justbrowsing - Good call on
screen
. I was wondering about verbose but I guess it's too late to restarttar
right now. Andiotop
has been my favorite utility for the last few days :) – Tim – 2013-09-06T20:45:46.850is one of your directories mounted from a server? then I would recommend using a direct link using
rsync dir1 server:dir2
orrsync server:dir1 dir2
depending on the server that is less likely to get disconnected. nesting this command in ascreen
shell allows to avoid some disconnections. – meduz – 2013-09-10T09:56:01.633