Saya memiliki ruang disk bebas 200 GB, RAM 16 GB (yang ~ 1 GB ditempati oleh desktop dan kernel) dan 6 GB swap.
Saya memiliki SSD eksternal 240 GB, dengan 70 GB digunakan 1 dan sisanya gratis, yang saya perlukan untuk mencadangkan ke disk saya.
Biasanya, saya akan dd if=/dev/sdb of=Desktop/disk.img
disk terlebih dahulu, dan kemudian kompres, tetapi membuat gambar pertama bukanlah pilihan karena melakukan hal itu akan memerlukan ruang disk jauh lebih banyak daripada yang saya miliki, meskipun langkah kompresi akan menghasilkan ruang kosong yang tergencet sehingga arsip terakhir dapat dengan mudah masuk ke disk saya.
dd
menulis ke STDOUT secara default, dan gzip
dapat membaca dari STDIN, jadi secara teori saya dapat menulis dd if=/dev/sdb | gzip -9 -
, tetapi gzip
secara signifikan membutuhkan waktu lebih lama untuk membaca byte daripada dd
menghasilkannya.
Dari man pipe
:
Data yang ditulis ke ujung tulis pipa disangga oleh kernel sampai dibaca dari ujung baca pipa.
Saya memvisualisasikan a |
sebagai seperti pipa nyata - satu aplikasi mendorong data masuk dan yang lainnya mengambil data dari antrian pipa secepat mungkin.
Bagaimana ketika program di sisi kiri menulis lebih banyak data lebih cepat daripada sisi lain dari pipa yang bisa memprosesnya? Apakah akan menyebabkan penggunaan memori atau swap yang ekstrem, atau akankah kernel mencoba membuat FIFO pada disk, sehingga mengisi disk? Atau akankah hanya gagal SIGPIPE Broken pipe
jika buffer terlalu besar?
Pada dasarnya, ini bermuara pada dua pertanyaan:
- Apa implikasi dan hasil dari mendorong lebih banyak data ke dalam pipa daripada dibaca pada suatu waktu?
- Apa cara andal untuk mengompres datastream ke disk tanpa meletakkan seluruh datastream yang tidak terkompresi pada disk?
Catatan 1: Saya tidak bisa hanya menyalin persis 70 GB yang digunakan pertama dan berharap untuk mendapatkan sistem kerja atau sistem file, karena fragmentasi dan hal-hal lain yang akan membutuhkan konten lengkap untuk utuh.
sumber
lzop
alih-alihgzip
; itu kompres lebih cepat dengan hanya rasio kompresi yang sedikit lebih rendah. Saya merasa ideal untuk gambar disk di mana kecepatan kompresi dapat menjadi hambatan nyata.Jawaban:
Secara teknis Anda bahkan tidak perlu
dd
:Jika Anda menggunakan
dd
, Anda harus selalu pergi dengan lebih besar dari ukuran default sepertidd bs=1M
atau menderita neraka syscall (dd
default ukuran blok adalah 512 byte, karena ituread()
danwrite()
s itu4096
panggilan sys perMiB
, terlalu banyak overhead).gzip -9
menggunakan BANYAK lebih banyak CPU dengan sangat sedikit untuk ditampilkan. Jikagzip
memperlambat Anda, turunkan tingkat kompresi, atau gunakan metode kompresi yang berbeda (lebih cepat).Jika Anda melakukan backup berbasis file alih-alih
dd
gambar, Anda dapat memiliki beberapa logika yang memutuskan apakah akan dikompres sama sekali atau tidak (tidak ada gunanya melakukannya untuk berbagai jenis file).dar
(tar
alternative`) adalah salah satu contoh yang memiliki opsi untuk melakukannya.Jika ruang kosong Anda NOL (karena ini adalah SSD yang andal mengembalikan nol setelah TRIM dan Anda berlari
fstrim
dan menjatuhkan cache) Anda juga dapat menggunakandd
denganconv=sparse
flag untuk membuat gambar jarang terkompresi, loop-mountable, jarang yang menggunakan ruang disk nol untuk area nol . Membutuhkan file gambar untuk didukung oleh sistem file yang mendukung file jarang.Atau untuk beberapa sistem file ada program yang hanya dapat gambar area yang digunakan.
sumber
dd bs=1M
" - Anda bisa, tetapi jangan berharap terlalu banyak. Di PC saya,dd
akan dilakukan sekitar 2GB / s dengan blok 512-byte. Itu tidak akan menjadi hambatan;gzip
akan.dd
2GB / s dengan blok 512-byte, saya akan terkejut jika tidak memaksimalkan satu inti CPU 100% dalam proses. Sekarang jika kotak Anda adalah quadcore yang hanya diam, Anda mungkin tidak melihat perbedaan. Namun, semua orang masih melakukannya.dd
blocksize disebutkan, orang-orang datang mengolok-olok.gzip
menjadi cpu intensif juga bagian dari jawaban saya, oke? Dan maaf, saya tidak setuju dengan "diabaikan". Mungkin hanya menambahkan 1-2s per gig dengangzip -9
(tapi itu masih berarti beberapa menit saat memproses ratusan pertunjukan) tetapi mengambil saran Anda denganlzop -1
itu 1s per pertunjukan vs 4s per pertunjukan. Diuji pada kentang (vserver inti tunggal). Menambahkan blocksize waras kedd
biaya apa-apa dan memiliki nol kerugian. Jangan rewel. Lakukan saja. ymmvdd
membaca dan menulis data satu blok pada satu waktu, dan hanya memiliki satu blok yang beredar. Begitumenunjukkan bahwa
dd
menggunakan sekitar 1MB memori. Anda dapat bermain-main dengan ukuran blok, dan menjatuhkanvalgrind
, untuk melihat efeknya padadd
kecepatan.Ketika Anda memasang pipa
gzip
,dd
cukup memperlambat agar sesuaigzip
dengan kecepatan. Penggunaan memorinya tidak meningkat, juga tidak menyebabkan kernel untuk menyimpan buffer pada disk (kernel tidak tahu bagaimana melakukan itu, kecuali melalui swap). Pipa yang rusak hanya terjadi ketika salah satu ujung pipa mati; lihatsignal(7)
danwrite(2)
untuk detailnya.Demikian
adalah cara aman untuk melakukan apa yang Anda cari.
Ketika melakukan piping, proses penulisan akhirnya diblokir oleh kernel jika proses membaca tidak berjalan. Anda dapat melihat ini dengan menjalankan
Anda akan melihat bahwa
dd
membaca 1MB, lalu mengeluarkanwrite()
yang duduk di sana menunggu satu menit saatsleep
berjalan. Begitulah cara kedua sisi pipa menyeimbangkan: kernel blok menulis jika proses penulisan terlalu cepat, dan blok membaca jika proses membaca terlalu cepat.sumber
dd
tahu memperlambat untuk mencocokkangzip
kecepatan? Ini otomatis, seperti oleh kernel, atau apakah ia menghitung dari metadata tentang deskriptor file outputnya?dd
panggilanwrite()
untuk memasukkan data ke dalam pipa.write()
sebenarnya mentransfer kontrol ke kernel sehingga dapat memanipulasi memori pipa. Jika kernel melihat pipa penuh, ia akan menunggu ("blok") sampai pipa memiliki cukup ruang. Hanya kemudianwrite()
panggilan akan selesai dan transfer kontrol kembali kedd
, yang kemudian akan menulis data ke pipa lagi.Tidak ada implikasi negatif selain kinerja: pipa memiliki buffer, yang biasanya 64K, dan setelah itu, penulisan ke pipa hanya akan memblokir sampai
gzip
membaca beberapa data lagi.sumber
Menjawab pertanyaan aktual tentang cara kerjanya: "bagaimana jika program di sisi kiri menulis lebih banyak data lebih cepat daripada sisi lain dari pipa dapat berharap untuk memprosesnya?"
Ini tidak terjadi. Ada penyangga ukuran yang cukup kecil di dalam pipa; Lihat Seberapa besar penyangga pipa?
Setelah buffer pipa penuh, program pengiriman terhalang . Ketika melakukan panggilan tulis, kernel tidak akan mengembalikan kontrol ke program sampai data telah ditulis ke dalam buffer. Ini memberi waktu membaca program CPU untuk mengosongkan buffer.
sumber
Mungkin Anda hanya perlu file, lalu gunakan tar. Anda dapat mengisi dengan nol blok yang tidak mengandung apa pun yang Anda inginkan, seseorang telah bertanya tentangnya. Bersihkan ruang yang tidak digunakan dengan nol (ext3, ext4)
Lalu, ada
pigz
yang biasanya lebih cepat darigzip
.sumber