Baru-baru ini saya menyadari bahwa kita dapat menggunakan cat
sebanyak mungkin dd
, dan sebenarnya lebih cepat daripadadd
Saya tahu dd
itu berguna dalam menangani kaset di mana ukuran blok sebenarnya penting dalam kebenaran, bukan hanya kinerja. Namun, pada hari-hari ini, adakah situasi di mana dd
bisa melakukan sesuatu yang cat
tidak bisa? (Di sini saya akan menganggap perbedaan kinerja kurang dari 20% tidak relevan.)
Contoh nyata akan menyenangkan!
Jawaban:
Dalam penampilan,
dd
adalah alat dari sistem operasi IBM yang mempertahankan penampilan asingnya (passing parameternya), yang melakukan beberapa fungsi yang sangat jarang digunakan (seperti konversi EBCDIC ke ASCII atau pembalikan endianness ... bukan kebutuhan umum saat ini).Saya dulu berpikir bahwa
dd
itu lebih cepat untuk menyalin blok data yang besar pada disk yang sama (karena penggunaan buffering yang lebih efisien), tetapi ini tidak benar , setidaknya pada sistem Linux saat ini.Saya pikir beberapa
dd
opsi berguna ketika berhadapan dengan kaset, di mana pembacaan benar-benar dilakukan dalam blok (driver tape tidak menyembunyikan blok pada media penyimpanan seperti cara disk driver lakukan). Tapi saya tidak tahu secara spesifik.Satu hal yang
dd
dapat dilakukan yang tidak dapat (dengan mudah) dilakukan oleh alat POSIX lainnya adalah mengambil N byte pertama dari sebuah stream. Banyak sistem dapat melakukannya denganhead -c 42
, tetapihead -c
, sementara umum, tidak ada dalam POSIX (dan tidak tersedia hari ini di misalnya OpenBSD). (tail -c
adalah POSIX.) Juga, bahkan jikahead -c
ada, mungkin membaca terlalu banyak byte dari sumber (karena menggunakan stdio buffering secara internal), yang merupakan masalah jika Anda membaca dari file khusus di mana hanya membaca memiliki efek. (Coreutils GNU saat ini membaca hitungan persisnyahead -c
, tetapi FreeBSD dan NetBSD menggunakan stdio.)Secara lebih umum,
dd
memberikan antarmuka ke file API yang mendasarinya yang unik di antara alat Unix: hanyadd
dapat menimpa atau memotong file di titik mana pun atau mencari dalam file. (Ini adalahdd
kemampuan unik, dan ini adalah yang besar; anehnya cukupdd
terkenal untuk hal-hal yang dapat dilakukan alat lain.)>
pengalihan di shell juga.>>
pengalihan di shell, atau dengantee -a
.Jika Anda ingin mempersingkat file dengan menghapus semua data setelah titik tertentu , ini didukung oleh kernel dan C API yang mendasari melalui
truncate
fungsi, tetapi tidak diekspos oleh alat baris perintah apa pun kecualidd
:Jika Anda ingin menimpa data di tengah file, sekali lagi, ini dimungkinkan dalam underyling API dengan membuka file untuk ditulis tanpa memotong (dan memanggil
lseek
untuk pindah ke posisi yang diinginkan jika perlu), tetapi hanyadd
dapat membuka file tanpa memotong atau menambahkan, atau mencari dari shell ( contoh yang lebih kompleks ).Jadi ... Sebagai alat sistem, tidak
dd
ada gunanya. Sebagai alat pengolah teks (atau file biner), ini cukup berharga!sumber
trunc
danseek
dapat digunakan daridd
).dd
dapat membaca data biner dari deskriptor file nonseekable tanpa berpotensi menghancurkan data yang belum dibaca karena buffering stdio. Lihat di sini untuk contoh: etalabs.net/sh_tricks.htmlhead -c N
panggilanread
dan tidak pernah melampaui N. Dalam NetBSD 5.1,head -c
panggilangetc
. Dalam FreeBSD 7.4,head -c
panggilanfread
.dd
juga mengekspos O_DIRECT (dll.) Ke skrip shell, yang menurut saya juga unik.truncate
memungkinkan pemotongan atau perluasan file, sehingga menghilangkan penggunaan lain daridd
.The
dd
perintah meliputi BANYAK pilihan yang kucing tidak mampu menampung. Mungkin dalam kasus penggunaan Anda kucing adalah pengganti yang bisa diterapkan, tetapi itu bukan pengganti dd.Satu contoh akan digunakan
dd
untuk menyalin bagian dari sesuatu tetapi tidak semuanya. Mungkin Anda ingin merobek beberapa bit dari tengah gambar iso atau tabel partisi dari hard drive berdasarkan lokasi yang diketahui pada perangkat. Dengandd
Anda dapat menentukan opsi mulai, berhenti dan jumlah yang memungkinkan tindakan ini.Opsi-opsi ini
dd
membuatnya sangat diperlukan untuk manipulasi data berbutir halus sedangkancat
* hanya dapat beroperasi pada objek file keseluruhan, perangkat atau stream.* Seperti dicatat oleh Gilles dalam komentar, dimungkinkan untuk menggabungkan
cat
dengan alat lain untuk mengisolasi bagian dari sesuatu, tetapicat
masih beroperasi pada seluruh objek.sumber
dd
sebenarnya tidak ada hubungannya dengan perangkat tingkat rendah, perlu masuk/dev
seperti yang lain. Anda dapat menyalin seluruh partisi dengancat
, atau sebagian dengantail +c $(($start+1)) | head -c $count
.cat | head | tail
untuk mengambil MB terakhir beberapa disk berputar akan menyedot bulan lebih dekat ke bumi.Belum ada yang menyebutkan bahwa Anda dapat menggunakan dd untuk membuat file jarang , meskipun
truncate
juga dapat digunakan untuk tujuan yang sama.Ini hampir instan dan membuat file besar sembarang yang dapat digunakan sebagai file loopback misalnya:
Yang menyenangkan adalah bahwa awalnya hanya menggunakan satu blok ruang disk, dan setelah itu tumbuh hanya sesuai kebutuhan (format ext4 dari file 10GB mengkonsumsi 291 MB pada sistem saya). Gunakan
du
untuk melihat berapa banyak ruang disk yang sebenarnya digunakan -ls
hanya melaporkan ukuran maksimum file yang mungkin tumbuh.sumber
ls -ls
menunjukkan ukuran yang jarang.dd of=sparse-file bs=1 count=0 seek=10G
akan setara dengantruncate -s 10GB sparse-file
. Cukup membingungkan,truncate
dandd
memiliki interpretasi yang berlawanan denganGB
vs.G
...man dd
mengatakan:MB =1000*1000, M =1024*1024
dan seterusnya. Danman truncate
mengatakan:,MB 1000*1000, M 1024*1024
jadi tidak ada perbedaan. Saya menggunakan keduanyadd
dantruncate
dari GNU coreutils. Anda juga harus melakukannya! :-)Mengganti segmen tertentu dari hard drive dengan sesuatu adalah contoh umum. Misalnya Anda mungkin ingin menghapus MBR Anda menggunakan perintah ini:
Anda juga dapat membuat file kosong dengan itu (katakan untuk gambar loop disk):
sumber
head -c
? Silakan bagikan tolok ukur !dd
sangat berguna untuk mencadangkan sektor boot dari hard drive atau perangkat penyimpanan lainnya (dd if=/dev/sda of=boot_sector.bin bs=512 count=1
) dan kemudian menulis ulangnya (dd if=boot_sector.bin of=/dev/sda
). Ini juga berguna untuk membackup header volume yang dienkripsi.cat
mungkin bisa diputar untuk melakukan itu tetapi saya tidak akan percaya pada bagian penulisan ulang. Sulit untukcat
hanya membaca / menulis sejumlah byte.sumber
Saya baru-baru ini memiliki alasan untuk mengkloning beberapa partisi multi-100-of-GB untuk pertama kalinya dalam sejarah linuxing saya (cf
cp -ar
ataursync
yang telah melayani saya berkali-kali). Tentu saja saya beralih kedd
'karena semua orang tahu itu yang Anda gunakan ... dan terkejut oleh kinerja. Sedikit googling segera membawa saya keddrescue
, yang saya gunakan beberapa kali sekarang dan bekerja dengan sangat baik (jauh lebih cepat daripada dd).sumber
ddrescue
sangat bagus, terutama untuk mengeluarkan data dari disk yang rusak.Berikut adalah beberapa trik yang saya buat selama bertahun-tahun ..
Potong-dan-Tempel di bash mode tty atau non-interaktif
Jika Anda berada dalam situasi di mana EOF / ^ D / ^ F tidak terdeteksi, Anda dapat menggunakan dd untuk mentransfer file teks ke host. Karena itu akan berhenti membaca setelah jumlah byte yang ditentukan secara otomatis.
Saya menggunakan ini baru-baru ini tahun lalu selama latihan keamanan di mana kami bisa mendapatkan kerang non-tty pada host jarak jauh dan diperlukan untuk mentransfer file.
Bahkan, saya bahkan melakukan beberapa file biner dengan base64 mengkodekannya dan menggunakan script decoding pure-bash base64 murni yang lambat.
Trik yang sangat keren adalah ketika dd sedang berjalan, jika Anda mengirimkan sinyal USR1, itu akan memancarkan statusnya saat ini (byte dibaca, byte per detik ..)
Filter state throughput universal
Saya menulis ini untuk bertindak sebagai filter kemajuan bash murni untuk setiap program yang memancarkan data melalui stdout. (Catatan: Hampir semua hal akan memancarkan data melalui stdout - untuk program yang tidak, Anda dapat menipu jika mereka tidak menganggap Anda menggunakan / dev / stdout sebagai nama file. Tapi idenya pada dasarnya, setiap kali Anda mendapatkan X jumlah byte, cetak tanda pagar (seperti FTP sekolah lama saat mode hash Anda aktif)
(Catatan) Berkas progresnya payah, ini sebagian besar merupakan bukti konsep. Jika saya redid, saya hanya akan menggunakan variabel.
file irisan-dan-dadu menggunakan file menangani shell anonim
Berikut adalah contoh kode pseudo-sangat tentang bagaimana Anda dapat memiliki file tar yang ditandatangani yang dapat Anda ekstrak tanpa kesalahan dengan memberikan input tar melalui penanganan file anonim - tanpa menggunakan file tmp apa pun untuk menyimpan data file parsial.
Tl; dr adalah: Saya merasa sangat berguna. Dan ini hanya tiga contoh yang bisa saya pikirkan dari atas kepala saya.
sumber
Anda dapat mengarahkan beberapa konten keluaran. Ini sangat berguna, jika Anda perlu menulis dengan
sudo
:Selain
sudo
itu setara dengan:atau ini:
sumber