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
- Saat mengekstraksi,
tar
akan secara otomatis mendeteksi arsip yang dibuat dengan-S
jadi tidak perlu menentukannya. - Arsip yang dibuat dengan
pbzip2
disimpan dalam bongkahan. Ini menghasilkan arsip yang sedikit lebih besar daripada ifbzip2
digunakan, tetapi juga berarti bahwa ekstraksi dapat multithreaded, tidak seperti arsip yang dibuat denganbzip2
. pbzip2
danbzip2
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