14 Haziran 2020 Pazar

dd komutu - Kullanmayın

Giriş
Bu komut "data definition" kelimelerinin kısalması olsa da ben "disk dump" olarak hatırlamayı daha kolay buluyorum.  Tehlikeli bir komut olduğu için bazıları şakayla karışık "disk destroyer" olarak ta anıyor.  Bir dosyadan başka dosyaya bloklar şeklinde veri aktarmaya yarar.

Tarihçesi
Açıklaması şöyle
The command dd was modeled after the command DDR (Disk Dump and Restore) from IBM mainframes from the 1960s and is mainly intended to convert and reblock block oriented I/O from/to block oriented disks.
dd Çıktısı
Şöyledir. Burada 8 s aslında "latency veya gecikme" diye nitelenebilir. 255 MB/s ise "speed veya hız"  diye nitelenebilir.
$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20 iflag=fullblock
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 8 s, 255 MB/s 

Neden Tehlikeli
bs + iflag = fullblock şeklinde kullanılması unutulduğu için tehlikeli.

bs seçeneği
Block size anlamına gelir. Okuma/yazma işleminde kullanılacak blokların büyüklüğünü belirtir. Blok büyüklüğü rakam veya okunabilir (1M) şekilde belirtilebilir.

Okuma yapılan kaynak belirtilen blok büyüklüğünde okumaya desteklemiyorsa daha küçük bir miktar okunabilir.

Örneğin /dev/urandom bir üst sınıra sahiptir ve 1M'lik bloklar şeklinde okunamaz!.

Örnek
Diski 0 ile doldurmak için şöyle yaparız.
dd if=/dev/zero of=/dev/sdb bs=1M
count seçeneği
Okuma/yazma işleminin kaç kere yapılacağını belirtir.

bs + conv seçeneği
bs seçeneği conv seçeneği ile birlitek kullanılabilir. Açıklaması şöyle. Yani bs seçeneğinin döndürdüğü blok büyüklüğü conv seçeneği tarafından değiştirilebilir.
If the bs= expr operand is specified and no conversions other than syncnoerror, or notrunc are requested, the data returned from each input block shall be written as a separate output block; if the read returns less than a full block and the sync conversion is not specified, the resulting output block shall be the same size as the input block. If the bs= expr operand is not specified, or a conversion other than syncnorerror, or notrunc is requested, the input shall be processed and collected into full-sized output blocks until the end of the input is reached.
conv seçeneği - ascii seçeneği
EBCDIC dosyayı ASCII dosyaya çevirmek için şöyle yaparız.
dd if=blah.ebcdic conv=ascii > blah.txt
conv seçeneği - notrunc
Çıktı dosyasını truncate edip etmemeyi bu seçenek ile belirtiriz. oflag ile kullanılırsa dosyanın sonuna ekleme yapılabilir.

Örnek
Dosyayı truncate etmeden seek ile dosyanın ortasından başlayarak bazı byte'lar yazarak dosyayı özellikle bozmak için şöyle yaparız.
dd if=/dev/zero of=file_to_fuzz.zip bs=1 count=1 seek=N conv=notrunc
conv seçeneği - sync - 0 İle Padler
Bu seçenek son derece tehlikeli. Eğer kısmı okuma varsa (partial read) block size'ı padleyerek doldurur. Açıklaması şöyle,
sync   pad  every  input  block  with  NULs to ibs-size; when used with
          block or unblock, pad with spaces rather than NULs
if seçeneği
input file anlamına gelir. Hangi dosyadan okunacağını belirtir.
dd if=/dev/zero of=10MBfile1 count=10000 bs=1024
bs + iflag seçeneği
bs seçeneği iflag seçeneği ile birlitek kullanılabilir.

iflag seçeneği - fullblock
Normalde eğer belirtilen blok büyüklüğünden daha az veri okunursa dd komutu uyarı mesajı verir. Görmek için şöyle yaparız.
$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20 
dd: warning: partial read (33554431 bytes); suggest iflag=fullblock
Bunu düzeltmek için iflag=fullblock kullanarak şöyle yaparız.
$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20 iflag=fullblock
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 8 s, 255 MB/s 
of seçeneği
output file anlamına gelir. Hangi dosyaya yazılacağını belirtir.

oflag seçeneği
Örnek
Dosyanın sonuna ekleme yapmak için şöyle yaparız.
dd if=/dev/zero of=12mb.bin bs=1MiB count=10 conv=notrunc oflag=append
seek seçeneği
Başlangıçtan itibaren kaç byte sonra yazma işlemi olacağını belirtir.
$ dd if=tmp of=test obs=1 seek=1460 conv=notrunc
swab seçeneği
Açıklaması şöyle. İki byte'ın yerini değiştirir. Yani little endian'dan big endian'a çevirir.
swap every pair of input bytes

Hiç yorum yok:

Yorum Gönder