Saya seorang mahasiswa pascasarjana kimia komputasi dengan akses ke cluster Linux. Cluster ini terdiri dari server file yang sangat besar (25 TB), yang terhubung dengan beberapa lusin node. Setiap node komputasi terdiri dari 8 hingga 24 core Intel Xeon. Setiap node komputasi juga mengandung disk lokal sekitar 365 TB.
Karena fileserver diakses secara rutin oleh selusin pengguna dalam grup riset, fileserver terutama digunakan untuk penyimpanan file jangka panjang (didukung setiap malam, sedangkan disk lokal node komputasi tidak pernah dicadangkan). Dengan demikian, administrator sistem telah menginstruksikan kami untuk menjalankan simulasi pada disk lokal - yang memiliki I / O lebih cepat dari server file - agar tidak memperlambat server file untuk pengguna lain.
Jadi, saya menjalankan simulasi pada disk lokal dan kemudian, setelah selesai, saya menyalin file lintasan - saya menjalankan simulasi dinamika molekul (MD) - ke server file untuk penyimpanan. Misalkan saya memiliki file lintasan yang dipanggil traj.trr
dalam direktori pada disk lokal sebuah node /home/myusername/mysimulation1/traj.trr
,. Untuk penyimpanan jangka panjang, saya selalu menyalin traj.trr
ke direktori di server file ~/mysimulation1/traj.trr
,, di mana ~
merupakan direktori saya di server file /export/home/myusername
,. Setelah menyalinnya, maka biasanya saya gunakan du -h
untuk memverifikasi yang /home/myusername/mysimulation1/traj.trr
memiliki ukuran file yang sama ~/mysimulation1/traj.trr
. Dengan cara ini, setidaknya saya cukup yakin bahwa transfer ke server file berhasil. Sebagai contoh:
cd /home/myusername/mysimulation1/
cp -v traj.trr ~/mysimulation1/
du /home/myusername/mysimulation1/traj.trr -h
du ~/mysimulation1/traj.trr -h
Jika dua panggilan untuk du -h
memberikan ukuran file yang dapat dibaca oleh manusia yang sama, maka saya dapat cukup yakin bahwa transfer / salinan berhasil. ( traj.trr
Ukuran file tipikal saya berkisar dari sekitar 15 hingga 20 GB, tergantung pada simulasi persis yang telah saya jalankan.) Jika saya menjalankan du
(yaitu, tanpa -h
saklar) pada dua traj.trr
file, ukurannya dalam byte biasanya sangat, sangat mirip - - Biasanya hanya dalam beberapa byte. Saya telah menggunakan metode keseluruhan ini selama satu setengah tahun terakhir, tanpa masalah.
Namun, baru-baru ini saya mengalami masalah berikut: kadang-kadangdu -h
melaporkan bahwa keduatraj.trr
file berbeda ukurannya beberapa GB. Berikut ini sebuah contoh:
cd /home/myusername/mysimulation1/ # this is the local disk
cp -v traj.trr ~/mysimulation1/
du traj.trr -h
cd ~/mysimulation1/ # this is the fileserver
du traj.trr -h
Output dari dua panggilan ke du -h
adalah sebagai berikut, masing-masing:
20G traj.trr
28G traj.trr
Saya percaya bahwa yang pertama (yaitu, traj.trr
dalam disk lokal, /home/myusername/mysimulation1/
) adalah ukuran file yang benar, karena lintasan simulasi saya masing-masing sekitar 15 hingga 20 GB. Tapi bagaimana mungkin file di server file sebenarnya lebih besar ? Saya bisa melihat bagaimana itu bisa lebih kecil, jika entah bagaimana cp
transfer gagal. Tapi saya tidak melihat bagaimana sebenarnya bisa lebih besar .
Saya mendapatkan output yang sama ketika saya menjalankan perintah yang sama seperti di atas, tetapi tanpa -h
saklar diberikan kepada du
:
20717480 traj.trr
28666688 traj.trr
Bisakah Anda memikirkan alasan untuk perbedaan itu?
Jika, karena kebetulan, du
entah bagaimana tidak berfungsi, saya bisa setuju dengan itu. Tapi saya hanya perlu memastikan bahwa salinan traj.trr
pada fileserver lengkap dan identik dengan versi sumbernya pada disk lokal. Saya perlu menghapus file lokal sehingga saya memiliki cukup ruang disk lokal untuk menjalankan simulasi baru, tetapi saya tidak mampu membuat versi traj.trr
pada fileserver rusak.
The format file .trr (dari Gromacs dinamika molekul paket) adalah format biner, tidak teks. Jadi, saya tidak yakin apakah file dapat dibandingkan secara andal oleh program seperti diff
.
sumber
md5sum
atausha1sum
pada file. Apakah mereka cocok?md5sum
di dua file. Kedua pertandingan checksum. Jadi saya kira ini berarti kedua file itu sama?ls -l
? Perintahdu
melaporkan berapa banyak ruang pada disk yang digunakan untuk file Anda, bukan seberapa besar file Anda. Ukuran pada disk dapat dipengaruhi oleh sistem file Anda dan strategi alokasinya.ls -l -h
mengatakan bahwa kedua file berukuran 20 GB. Demikian juga,ls -l
mengatakan bahwa kedua file tersebut adalah 21214683940 byte. Jadi saya kira file memiliki ukuran yang sama, tetapi jangan menggunakan jumlah ruang disk yang sama (sesuai dengandu
).Jawaban:
Anda benar-benar harus menggunakan sesuatu seperti
md5sum
atausha1sum
untuk memeriksa integritas.Jika Anda benar-benar ingin menggunakan ukuran gunakan
ls -l
ataudu -b
.The
du
utilitas biasanya hanya menunjukkan penggunaan disk dari file, yaitu berapa banyak dari sistem file yang digunakan oleh itu. Nilai ini sepenuhnya tergantung pada sistem file dukungan dan faktor-faktor lain seperti file jarang.Contoh:
Kami memiliki dua file yang keduanya berisi 512MB nol. Yang pertama disimpan jarang dan tidak menggunakan ruang disk apa pun, sedangkan yang kedua menyimpan setiap byte secara eksplisit pada disk. - File yang sama, tetapi penggunaan disk yang sama sekali berbeda.
The
-b
pilihan mungkin baik untuk Anda:sumber
Ini adalah masalah umum ketika Anda meletakkan data yang sama pada 2 HDD berbeda. Anda akan ingin menjalankan
du
perintah dengan dan sakelar tambahan, dengan anggapan memilikinya - yang seharusnya diberikan adalah simpul Linux.Tombol?
Contoh
Filesystem di atas adalah disk lokal (
/root
) sementara yang lain/home/sam
adalah bagian NFS dari NAS saya.Jadi ada apa?
Ini membingungkan banyak orang, tetapi ingat bahwa ketika file disimpan ke disk, mereka mengkonsumsi blok ruang bahkan jika mereka hanya menggunakan sebagian dari blok itu. Ketika Anda menjalankan
du
tanpa--apparent-size
Anda mendapatkan ukuran berdasarkan jumlah ruang blok disk yang digunakan, bukan ruang aktual yang dikonsumsi oleh file.menggunakan checksum saja?
Ini kemungkinan merupakan opsi yang lebih baik jika Anda khawatir tentang membandingkan 2 pohon file. Anda dapat menggunakan perintah ini untuk menghitung checksum untuk semua file, dan kemudian menghitung checksum checksum terakhir. Contoh ini menggunakan
sha1sum
tetapi Anda bisa dengan mudah menggunakannyamd5sum
.Contoh
Jadi kita dapat melihat bahwa 2 pohon itu identik.
(Catatan: perintah find akan mencantumkan file ketika muncul di sistem file. Jadi, jika Anda membandingkan dua direktori dari sistem file yang berbeda (mis. Ext3 vs. APFS), Anda perlu mengurutkan terlebih dahulu sebelum sha1sum akhir. (Ditambahkan oleh Xianjun Dong)
sumber
Jawaban singkat: jangan menguji ukuran file, uji status pengembalian perintah. Status pengembalian satu-satunya indikasi yang dapat diandalkan apakah salinan berhasil (pendek membandingkan dua file byte demi byte, secara langsung tidak langsung - yang berlebihan jika salinan berhasil).
Memeriksa ukuran file bukanlah cara yang sangat berguna untuk memeriksa apakah salinan berhasil. Dalam beberapa kasus, ini mungkin merupakan pemeriksaan kewarasan yang berguna, misalnya ketika Anda mengunduh file dari web. Tapi di sini ada cara yang lebih baik.
Semua perintah Unix mengembalikan status untuk menunjukkan apakah mereka berhasil: 0 untuk sukses, 1 atau lebih untuk kesalahan. Jadi periksa status keluar dari
cp
.cp
biasanya akan mencetak pesan kesalahan jika gagal, menunjukkan apa kesalahannya. Dalam skrip, status keluar dari perintah terakhir ada di variabel ajaib$?
.Alih-alih memeriksa apakah
$?
nol, Anda dapat menggunakan operator boolean.Jika Anda menjalankan skrip dan ingin skrip berhenti jika ada perintah gagal, jalankan
set -e
. Jika ada perintah yang gagal (yaitu mengembalikan status bukan nol), skrip akan segera keluar dengan status yang sama dengan perintah.Adapun alasan file yang Anda salin lebih besar, itu pasti karena itu adalah file yang jarang . File jarang adalah bentuk kompresi kasar di mana blok yang hanya berisi byte nol tidak disimpan. Ketika Anda menyalin file,
cp
perintah membaca dan menulis nol byte, jadi di mana aslinya memiliki blok yang hilang, salinan memiliki blok yang penuh dengan byte nol. Di Linux,cp
perintah mencoba mendeteksi file jarang, tetapi tidak selalu berhasil;cp --sparse=always
membuatnya berusaha lebih keras dengan mengorbankan sedikit peningkatan waktu CPU.Lebih umum,
du
dapat mengembalikan hasil yang berbeda karena bentuk kompresi lainnya. Sistem file terkompresi jarang terjadi. Jika Anda ingin mengetahui ukuran file seperti dalam jumlah byte dalam file, berbeda dengan jumlah blok disk yang digunakannya, gunakanls -l
sebagai gantidu
.sumber