sfondo
Mi ha esaurito lo spazio su /home/data
e necessità di trasferire /home/data/repo
a /home/data2
.
/home/data/repo
contiene 1M dirs, ognuno dei quali contiene 11 dir e 10 file. Ha un totale di 2 TB.
/home/data
è su ext3 con dir_index abilitato.
/home/data2
è su ext4. Esecuzione di CentOS 6.4.
Presumo che questi approcci siano lenti a causa del fatto che repo/
ha 1 milione di dir direttamente sotto di esso.
Tentativo 1: mv
è veloce ma viene interrotto
Potrei fare se questo fosse finito:
/home/data> mv repo ../data2
Ma è stato interrotto dopo il trasferimento di 1,5 TB. Stava scrivendo a circa 1 GB / min.
Tentativo 2: ricerca per rsync
indicizzazione dopo 8 ore dall'elenco dei file di costruzione
/home/data> rsync --ignore-existing -rv repo ../data2
Ci sono volute diverse ore per costruire la "lista dei file incrementali" e poi trasferire a 100 MB / min.
Lo annullo per provare un approccio più veloce.
Tentativo 3a: si mv
lamenta
Test su una sottodirectory:
/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
Non sono sicuro di cosa si tratti di un errore, ma forse cp
mi può salvare.
Tentativo 3b: cp
non arriva da nessuna parte dopo 8 ore
/home/data> cp -nr repo ../data2
Legge il disco per 8 ore e decido di annullarlo e tornare a rsync.
Tentativo 4: ricerca per rsync
indicizzazione dopo 8 ore dall'elenco dei file di costruzione
/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2
Pensavo --remove-source-files
che avrebbe potuto renderlo più veloce se avessi iniziato la pulizia ora.
Sono necessarie almeno 6 ore per compilare l'elenco dei file, quindi trasferisce a 100-200 MB / min.
Ma il server è stato caricato durante la notte e la mia connessione è stata chiusa.
Tentativo 5: SOLO 300 GB A SINISTRA PER MUOVERSI PERCHÉ È COSÌ DOLORE
/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2
Interrotto di nuovo. La -W
quasi sembrava di fare "l'invio di elenco di file incrementale" più veloce, che per la mia comprensione non dovrebbe avere un senso. Indipendentemente da ciò, il trasferimento è terribilmente lento e mi sto arrendendo.
Tentativo 6: tar
/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)
Fondamentalmente tentando di ricopiare tutto ma ignorando i file esistenti. Deve superare 1,7 TB di file esistenti ma almeno sta leggendo a 1,2 GB / min.
Finora, questo è l'unico comando che dà gratificazione istantanea.
Aggiornamento: interrotto di nuovo, in qualche modo, anche con nohup ..
Tentativo 7: harakiri
Sto ancora discutendo questo
Tentativo 8: script 'unisci' con mv
La directory di destinazione aveva circa 120.000 directory vuote, quindi ho corso
/home/data2/repo> find . -type d -empty -exec rmdir {} \;
Script 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
FATTO.
mv
nuovo? In teoria mv
eliminerà un file di origine solo se il file di destinazione è stato completamente copiato, quindi dovrebbe funzionare correttamente. Inoltre, hai accesso fisico alla macchina o è fatto attraverso una ssh
connessione?
mv
non perdona, se continui a disconnetterti potresti perdere i dati e nemmeno conoscerli. Come hai detto che lo stai facendo ssh
, ti consiglio vivamente di utilizzare screen
e staccare. Abilita la registrazione e tieni traccia di quello. Se stai usando verbose ci vorrà solo più tempo. Prova ancheiotop
screen
. Mi chiedevo di essere prolisso, ma credo sia troppo tardi per riavviare tar
adesso. Ed iotop
è stata la mia utility preferita negli ultimi giorni :)