배경
나는 공간이 부족 에 /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/
바로 아래에 백만 개의 디렉토리가 있기 때문에 이러한 접근 방식이 느리다고 가정 합니다.
시도 1 : mv
빠르지 만 중단됩니다
이것이 완료되면 할 수 있습니다.
/home/data> mv repo ../data2
그러나 1.5TB가 전송 된 후 중단되었습니다. 약 1GB / 분으로 작성되었습니다.
시도 2 : rsync
8 시간의 파일 목록 작성 후 크롤링
/home/data> rsync --ignore-existing -rv repo ../data2
'증분 파일 목록'을 작성하는 데 몇 시간이 걸리고 100MB / 분으로 전송됩니다.
더 빠른 접근을 시도하기 위해 취소합니다.
시도 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 / 분으로 전송됩니다.
그러나 서버에 하룻밤이 걸리고 연결이 끊어졌습니다.
시도 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 / 분으로 읽습니다.
지금까지 이것은 즉각적인 만족감을주는 유일한 명령입니다.
업데이트 : 어떻게 든 nohup으로 다시 중단되었습니다 ..
시도 7 :하라 키리
아직도 이것에 대해 토론
시도 8 : 스크립트로 '병합' mv
대상 디렉토리에는 약 120k 개의 빈 디렉토리가 있으므로 실행했습니다.
/home/data2/repo> find . -type d -empty -exec rmdir {} \;
루비 스크립트 :
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
지난 며칠 동안 내가 가장 좋아하는 유틸리티는 :)