Lý lịch
Tôi chạy ra khỏi không gian trên /home/data
và cần phải chuyển /home/data/repo
đến /home/data2
.
/home/data/repo
chứa 1M thư mục, mỗi thư mục chứa 11 thư mục và 10 tệp. Tổng cộng là 2TB.
/home/data
là trên ext3 với dir_index được kích hoạt.
/home/data2
là trên ext4. Chạy CentOS 6.4.
Tôi cho rằng các phương pháp này chậm vì thực tế repo/
có 1 triệu thư trực tiếp bên dưới nó.
Nỗ lực 1: mv
nhanh nhưng bị gián đoạn
Tôi có thể được thực hiện nếu điều này đã kết thúc:
/home/data> mv repo ../data2
Nhưng nó đã bị gián đoạn sau khi 1,5TB được chuyển. Nó được viết với tốc độ khoảng 1GB / phút.
Cố gắng 2: rsync
thu thập thông tin sau 8 giờ xây dựng danh sách tệp
/home/data> rsync --ignore-existing -rv repo ../data2
Phải mất vài giờ để xây dựng 'danh sách tệp gia tăng' và sau đó nó chuyển với tốc độ 100MB / phút.
Tôi hủy bỏ nó để thử một cách tiếp cận nhanh hơn.
Cố gắng 3a: mv
phàn nàn
Kiểm tra nó trên thư mục con:
/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
Tôi không chắc đây là lỗi gì, nhưng có lẽ cp
tôi có thể bảo lãnh cho tôi ..
Nỗ lực 3b: cp
không nơi nào sau 8 giờ
/home/data> cp -nr repo ../data2
Nó đọc đĩa trong 8 giờ và tôi quyết định hủy nó và quay lại rsync.
Cố gắng 4: rsync
thu thập thông tin sau 8 giờ xây dựng danh sách tệp
/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2
Tôi đã từng --remove-source-files
nghĩ nó có thể làm cho nó nhanh hơn nếu tôi bắt đầu dọn dẹp ngay bây giờ.
Phải mất ít nhất 6 giờ để xây dựng danh sách tệp sau đó nó chuyển với tốc độ 100-200MB / phút.
Nhưng máy chủ đã bị gánh nặng qua đêm và kết nối của tôi đóng lại.
Nỗ lực 5: CHỈ CÓ 300 GB TRÁCH NHIỆM ĐỂ CHUYỂN ĐỔI TẠI SAO NÀY LÀ RẤT NHIỀU
/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2
Bị gián đoạn một lần nữa. Việc -W
gần như dường như làm cho "gửi danh sách tập tin gia tăng" nhanh hơn, theo tôi hiểu không nên có ý nghĩa. Bất kể, việc chuyển tiền diễn ra chậm khủng khiếp và tôi đang từ bỏ việc này.
Cố gắng 6: tar
/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)
Về cơ bản cố gắng sao chép lại mọi thứ nhưng bỏ qua các tệp hiện có. Nó phải lội qua 1.7TB tệp hiện có nhưng ít nhất là nó đọc với tốc độ 1,2 GB / phút.
Cho đến nay, đây là lệnh duy nhất mang lại sự hài lòng tức thì.
Cập nhật: bị gián đoạn một lần nữa, bằng cách nào đó, ngay cả với nohup ..
Nỗ lực 7: harakiri
Vẫn đang tranh luận cái này
Nỗ lực 8: kịch bản 'hợp nhất' với mv
Các dir đích có khoảng 120k dir trống, vì vậy tôi đã chạy
/home/data2/repo> find . -type d -empty -exec rmdir {} \;
Kịch bản 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
LÀM XONG.
mv
một lần nữa? Về lý thuyết mv
sẽ chỉ xóa một tập tin nguồn nếu file đích đã được hoàn toàn sao chép vì thế nên làm việc OK. Ngoài ra, bạn có quyền truy cập vật lý vào máy hay việc này được thực hiện thông qua ssh
kết nối?
mv
không tha thứ, nếu bạn tiếp tục bị ngắt kết nối, bạn có thể mất dữ liệu và thậm chí không biết điều đó. Như bạn nói bạn đang làm điều này hơn ssh
, tôi khuyên bạn nên sử dụng screen
và tách ra. Cho phép đăng nhập và theo dõi theo cách đó. Nếu bạn đang sử dụng verbose, nó sẽ mất nhiều thời gian hơn. Cũng cố gắngiotop
screen
. Tôi đã tự hỏi về verbose nhưng tôi đoán bây giờ đã quá muộn để khởi động lại tar
. Và iotop
đã là tiện ích yêu thích của tôi trong vài ngày qua :)