Jika saya menjalankan tar -cvf
direktori ukuran 937MB untuk membuat salinan yang mudah diunduh dari struktur folder yang bersarang, apakah saya berisiko mengisi disk dengan df -h
output sebagai berikut :
/dev/xvda1 7.9G 3.6G 4.3G 46% /
tmpfs 298M 0 298M 0% /dev/shm
Pertanyaan-pertanyaan Terkait:
- Jika disk mungkin terisi, mengapa apa yang akan Linux (Amazon AMI) dan / atau
tar
lakukan di bawah tenda? - Bagaimana saya dapat secara akurat menentukan informasi ini sendiri tanpa bertanya lagi?
tar
disk-usage
codecowboy
sumber
sumber
--totals
opsi. Either way jika Anda mengisi disk Anda hanya dapat menghapus arsip, imho. Untuk memeriksa semua opsi yang tersedia, Anda dapat melewatitar --help
.Jawaban:
tar -c data_dir | wc -c
tanpa kompresiatau
tar -cz data_dir | wc -c
dengan kompresi gzipatau
tar -cj data_dir | wc -c
dengan kompresi bzip2akan mencetak ukuran arsip yang akan dibuat dalam byte, tanpa menulis ke disk. Anda kemudian dapat membandingkannya dengan jumlah ruang kosong pada perangkat target Anda.
Anda dapat memeriksa ukuran direktori data itu sendiri, jika asumsi dibuat tentang ukurannya, dengan perintah berikut:
du -h --max-depth=1 data_dir
Seperti yang sudah dijawab, tar menambahkan header ke setiap record dalam arsip dan juga mengumpulkan ukuran setiap record hingga kelipatan 512 byte (secara default). Akhir dari arsip ditandai oleh setidaknya dua catatan tanpa diisi berurutan. Jadi selalu terjadi bahwa Anda akan memiliki file tar terkompresi lebih besar dari file itu sendiri, jumlah file dan bagaimana mereka menyelaraskan ke batas 512 byte menentukan ruang ekstra yang digunakan.
Tentu saja, filesystem itu sendiri menggunakan ukuran blok yang mungkin lebih besar dari konten file individual jadi berhati-hatilah saat Anda membukanya, filesystem mungkin tidak dapat menampung banyak file kecil meskipun memiliki ruang bebas lebih besar dari ukuran tar!
https://en.wikipedia.org/wiki/Tar_(computing)#Format_details
sumber
-f -
untuk tar adalah mubazir, karena Anda bisa mengabaikan-f
argumen itu untuk menulis hasilnya ke stdout (yaitutar -c data_dir
).Ukuran file tar Anda akan menjadi 937MB plus ukuran metadata yang diperlukan untuk setiap file atau direktori (512 byte per objek), dan padding ditambahkan untuk menyelaraskan file ke batas 512-byte.
Perhitungan yang sangat kasar memberi tahu kami bahwa salinan data Anda yang lain akan memberikan Anda 3.4GB gratis. Dalam 3.4GB kami memiliki ruang untuk sekitar 7 juta catatan metadata, dengan asumsi tidak ada padding, atau lebih sedikit jika Anda mengasumsikan rata-rata padding 256 byte per file. Jadi, jika Anda memiliki jutaan file dan direktori untuk ditampung, Anda mungkin mengalami masalah.
Anda dapat mengurangi masalah dengan
z
atauj
untuktar
tar
sebagai pengguna biasa sehingga ruang yang disediakan pada/
partisi tidak akan disentuh jika Anda kehabisan ruang.sumber
tar
sendiri dapat melaporkan ukuran arsipnya dengan--test
opsi:Perintah di atas tidak menulis apa pun ke disk dan memiliki manfaat tambahan dari mendaftarkan masing-masing filesize masing-masing file yang terkandung dalam tarball. Menambahkan berbagai
z/j/xz
operan ke kedua sisi|pipe
akan menangani kompresi seperti yang Anda mau.KELUARAN:
Tidak sepenuhnya yakin dengan tujuan Anda, tetapi jika ingin mengunduh tarball, ini mungkin lebih penting:
Atau hanya menyalin
tar
:sumber
tar
menyalin pohon ke disk lokal Anda dalam aliran tanpa menyimpan apa pun ke disk jarak jauh sama sekali, setelah itu Anda dapat menghapusnya dari host jarak jauh dan mengembalikannya nanti. Anda mungkin harus menambahkan-z
untuk kompresi seperti yang ditunjukkan goldilocks, untuk menghemat bandwidth transfer tengah.-i
benar maafSaya telah melakukan banyak penelitian tentang ini. Anda dapat melakukan tes pada file dengan jumlah kata tetapi itu tidak akan memberi Anda nomor nomor yang sama dengan a
du -sb adir
.du
menghitung setiap direktori sebagai 4096 byte, dantar
menghitung direktori sebagai 0 byte. Anda harus menambahkan 4096 ke setiap direktori:maka Anda harus menambahkan semua karakter. Untuk sesuatu yang terlihat seperti ini:
Saya tidak yakin apakah ini sempurna karena saya tidak mencoba file yang telah disentuh (file 0 byte) atau file yang memiliki 1 karakter. Ini akan membuat Anda lebih dekat.
sumber
-cvf
tidak termasuk kompresi, melakukan hal itu pada folder ~ 1 GB akan menghasilkan file tar ~ 1 GB (jawaban Flub memiliki detail lebih lanjut tentang ukuran tambahan dalam file tar, tetapi perhatikan bahkan jika ada 10.000 file ini hanya 5 MB). Karena Anda memiliki 4+ GB gratis, tidak, Anda tidak akan mengisi partisi.Kebanyakan orang akan menganggap "lebih mudah" identik dengan "lebih kecil" dalam hal mengunduh, jadi Anda harus menggunakan beberapa kompresi di sini.
bzip2
harus sekarang-a-hari tersedia pada sistem w / tar, saya pikir, jadi termasukj
dalam switch Anda mungkin merupakan pilihan terbaik.z
(gzip
) mungkin bahkan lebih umum, dan ada kemungkinan lain (kurang di mana-mana) dengan squash lebih banyak.Jika maksud Anda, apakah
tar
menggunakan ruang disk tambahan untuk sementara dalam melakukan tugas, saya cukup yakin itu bukan karena beberapa alasan, satu karena tanggal kembali ke waktu ketika tape drive adalah bentuk penyimpanan utama, dan dua karena memiliki memiliki dekade untuk berkembang (dan saya yakin tidak perlu menggunakan ruang perantara sementara, bahkan jika kompresi terlibat).sumber
Jika kecepatan penting dan kompresi tidak diperlukan, Anda dapat mengaitkan pembungkus syscall yang digunakan dengan
tar
menggunakanLD_PRELOAD
, untuk mengubahtar
untuk menghitungnya bagi kami. Dengan mengimplementasikan kembali beberapa fungsi ini untuk memenuhi kebutuhan kita (menghitung ukuran data tar potensial), kita dapat menghilangkan banyakread
danwrite
yang dilakukan dalam operasi normaltar
. Ini membuattar
lebih cepat karena tidak perlu konteks bolak-balik ke kernel di mana saja dekat sebanyak dan hanyastat
file input / folder yang diminta harus dibaca dari disk daripada data file yang sebenarnya.Kode di bawah meliputi implementasi dari
close
,read
, danwrite
fungsi POSIX. MakroOUT_FD
mengontrol deskriptor file mana yang kami harapkantar
untuk digunakan sebagai file output. Saat ini diatur ke stdout.read
diubah menjadi hanya mengembalikan nilai keberhasilancount
byte alih-alih mengisi buf dengan data, mengingat bahwa data aktual tidak dibaca buf tidak akan berisi data yang valid untuk diteruskan ke kompresi, dan dengan demikian jika kompresi digunakan kami akan menghitung yang salah ukuran.write
diubah untuk menjumlahkancount
byte input ke dalam variabel globaltotal
dan mengembalikan nilai keberhasilancount
byte hanya jika file deskriptor cocokOUT_FD
, jika tidak maka akan memanggil wrapper asli yang diperoleh melaluidlsym
untuk melakukan syscall dengan nama yang sama.close
masih melakukan preforms semua fungsionalitas aslinya, tetapi jika deskriptor file cocok dengan OUT_FD, ia tahu bahwatar
sudah selesai mencoba untuk menulis file tar, jaditotal
angkanya adalah final dan mencetaknya ke stdout.Benchmark membandingkan solusi di mana akses disk baca dan semua syscalls operasi tar normal dilakukan terhadap
LD_PRELOAD
solusi.Kode di atas, skrip build dasar untuk membangun di atas sebagai pustaka bersama, dan skrip dengan "
LD_PRELOAD
teknik" menggunakannya disediakan dalam repo: https://github.com/G4Vi/tarsizeBeberapa info tentang cara menggunakan LD_PRELOAD: https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/
sumber