GNU/Linux >> Belajar Linux >  >> Linux

Menyalin file jarang 1TB

Saya menyadari pertanyaan ini sudah sangat lama, tetapi berikut adalah pembaruan yang mungkin berguna bagi orang lain yang menemukan jalan mereka ke sini dengan cara yang sama seperti saya.

Untungnya, jawaban bagus mvp sekarang sudah usang. Menurut catatan rilis tar GNU, SEEK_HOLE/SEEK_DATA ditambahkan di v. 1.29, dirilis 16-05-2016. (Dan dengan GNU tar v.1.30 menjadi standar di Debian stable sekarang, dapat diasumsikan bahwa versi tar ≥ 1.29 tersedia hampir di semua tempat.)

Jadi cara menangani file renggang sekarang adalah dengan mengarsipkannya dengan tar mana pun (GNU atau BSD) yang terpasang di sistem Anda, dan sama untuk mengekstraksinya.

Selain itu, untuk file jarang yang benar-benar berisi beberapa data, jika perlu menggunakan kompresi (yaitu data cukup dapat dikompresi untuk menghemat ruang disk yang substansial, dan penghematan ruang disk sebanding dengan waktu dan sumber daya CPU yang mungkin diperlukan untuk mengompresnya) :

  • tar -cSjf <archive>.tar.bz2 /path/to/sparse/file keduanya akan memanfaatkan fungsionalitas SEEK_HOLE tar untuk mengarsipkan file jarang dengan cepat &efisien, dan menggunakan bzip2 untuk mengompres data sebenarnya.
  • tar --use-compress-program=pbzip2 -cSf <archive>.tar.bz2 /path/to/sparse/file , sebagaimana disinggung dalam komentar marcin, akan melakukan hal yang sama juga menggunakan banyak inti untuk tugas kompresi.

Di server rumah kecil saya dengan CPU Atom quad-core, menggunakan pbzip2 vs bzip2 mengurangi waktu sekitar 25 atau 30%.

Dengan atau tanpa kompresi, ini akan memberi Anda arsip yang tidak memerlukan penanganan file jarang khusus, kira-kira berukuran 'nyata' dari file jarang asli (atau kurang jika dikompresi), dan dapat dipindahkan tanpa khawatir tentang ketidakkonsistenan antara kemampuan file jarang utilitas yang berbeda. Misalnya:cp akan secara otomatis mendeteksi file jarang dan melakukan hal yang benar, rsync akan menangani file jarang dengan benar jika Anda menggunakan -S bendera, dan scp tidak memiliki opsi untuk file jarang (itu akan menghabiskan bandwidth menyalin nol untuk semua lubang dan salinan yang dihasilkan akan menjadi file non-jarang yang ukurannya adalah ukuran 'jelas' dari aslinya); tetapi semuanya tentu saja akan menangani arsip tar dengan baik—apakah itu berisi file jarang atau tidak—tanpa tanda khusus.

Catatan Tambahan

  1. Saat mengekstraksi, tar akan secara otomatis mendeteksi arsip yang dibuat dengan -S jadi tidak perlu menentukannya.
  2. Arsip yang dibuat dengan pbzip2 disimpan dalam bongkahan. Ini menghasilkan arsip yang sedikit lebih besar daripada if bzip2 digunakan, tetapi juga berarti bahwa ekstraksi dapat multithreaded, tidak seperti arsip yang dibuat dengan bzip2 .
  3. pbzip2 dan bzip2 akan mengekstrak arsip satu sama lain dengan andal tanpa kesalahan atau kerusakan.

Jawaban singkat: Gunakan bsdtar atau GNU tar (versi 1.29 atau lebih baru) untuk membuat arsip, dan GNU tar (versi 1.26 atau lebih baru) untuk mengekstraknya di kotak lain.

Jawaban panjang: Ada beberapa persyaratan agar ini berfungsi.

Pertama, Linux setidaknya harus kernel 3.1 (Ubuntu 12.04 atau yang lebih baru), sehingga mendukung SEEK_HOLE fungsionalitas.

Kemudian, Anda memerlukan utilitas tar yang dapat mendukung syscall ini. GNU tar mendukungnya sejak versi 1.29 (dirilis pada 2016/05/16, seharusnya sudah ada secara default sejak Ubuntu 18.04), atau bsdtar sejak versi 3.0.4 (tersedia sejak Ubuntu 12.04) - instal menggunakan sudo apt-get install bsdtar .

Sedangkan bsdtar (yang menggunakan libarchive ) luar biasa, sayangnya, ini tidak terlalu pintar dalam hal untarring - dengan bodohnya membutuhkan setidaknya ruang kosong pada drive target sebanyak ukuran file untarred, tanpa memperhatikan lubang. GNU tar akan menghapus arsip jarang tersebut secara efisien dan tidak akan memeriksa kondisi ini.

Ini adalah log dari Ubuntu 12.10 (Linux kernel 3.5):

$ dd if=/dev/zero of=1tb seek=1T bs=1 count=1
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.000143113 s, 7.0 kB/s

$ time bsdtar cvfz sparse.tar.gz 1tb 
a 1tb

real    0m0.362s
user    0m0.336s
sys 0m0.020s

# Or, use gnu tar if version is later than 1.29:
$ time tar cSvfz sparse-gnutar.tar.gz 1tb
1tb

real    0m0.005s
user    0m0.006s
sys 0m0.000s

$ ls -l
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov  7 01:43 1tb
-rw-rw-r-- 1 autouser autouser           257 Nov  7 01:43 sparse.tar.gz
-rw-rw-r-- 1 autouser autouser           134 Nov  7 01:43 sparse-gnutar.tar.gz
$

Seperti yang saya katakan di atas, sayangnya, untarring dengan bsdtar tidak akan berfungsi kecuali Anda memiliki ruang kosong 1TB. Namun, versi apa pun dari GNU tar berfungsi dengan baik untuk menghapus sparse.tar tersebut :

$ rm 1tb 
$ time tar -xvSf sparse.tar.gz 
1tb

real    0m0.031s
user    0m0.016s
sys 0m0.016s
$ ls -l
total 8
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov  7 01:43 1tb
-rw-rw-r-- 1 autouser autouser           257 Nov  7 01:43 sparse.tar.gz

Linux
  1. Apa itu file jarang di Linux

  2. Memperbarui satu file dalam tar terkompresi

  3. Bagaimana cara membuat file jarang?

  1. Bagaimana Mengubah File Tar Menjadi File Tgz?

  2. Cara mengompres/dekompresi di Linux

  3. Mengekstrak file *.tar.bz2?

  1. Cara Mengekstrak atau Mengunzip File tar.xz di Linux

  2. Cara mengekstrak file nama file.tar.gz

  3. tar -C dengan pola file wildcard