[Çözüldü] dd komutu hakkında

Başlatan cygmad, 07 Ağustos 2017 - 04:37:39

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

cygmad

Merhaba benim birkaç sorum olacak

dd if=... of=... count=1 bs=512
dd if=... of=... count=512 bs=1

Komutları arasındaki fark nedir?

Count değeri her zaman sayı değerli midir yoksa byte kb mb cinsinden de değerler alabilir mi?

Örneğin

dd if=/dev/zero of=/tmp/swap bs=4k count=1M

Bu komutta count değeri 1 megabyte mıdır yoksa 1 milyon sayısı mıdır?

Bilen varsa çok makbule geçer.

decent

Şu bilgi de kenarda dursun:
https://linux.die.net/man/1/dd
dd(1) - Linux man page
Name
dd - convert and copy a file
Synopsis
dd [OPERAND]...
dd OPTION
Description

Copy a file, converting and formatting according to the operands.

bs=BYTES
    read and write BYTES bytes at a time (also see ibs=,obs=)
cbs=BYTES
    convert BYTES bytes at a time
conv=CONVS
    convert the file as per the comma separated symbol list
count=BLOCKS
    copy only BLOCKS input blocks
ibs=BYTES
    read BYTES bytes at a time (default: 512)
if=FILE
    read from FILE instead of stdin
iflag=FLAGS
    read as per the comma separated symbol list
obs=BYTES
    write BYTES bytes at a time (default: 512)
of=FILE
    write to FILE instead of stdout
oflag=FLAGS
    write as per the comma separated symbol list
seek=BLOCKS
    skip BLOCKS obs-sized blocks at start of output
skip=BLOCKS
    skip BLOCKS ibs-sized blocks at start of input
status=noxfer
    suppress transfer statistics

BLOCKS and BYTES may be followed by the following multiplicative suffixes: c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M GB =1000*1000*1000, G =1024*1024*1024, and so on for T, P, E, Z, Y.

Each CONV symbol may be:

ascii
    from EBCDIC to ASCII
ebcdic
    from ASCII to EBCDIC
ibm
    from ASCII to alternate EBCDIC
block
    pad newline-terminated records with spaces to cbs-size
unblock
    replace trailing spaces in cbs-size records with newline
lcase
    change upper case to lower case
nocreat
    do not create the output file
excl
    fail if the output file already exists
notrunc
    do not truncate the output file
ucase
    change lower case to upper case
swab
    swap every pair of input bytes
noerror
    continue after read errors
sync
    pad every input block with NULs to ibs-size; when used with block or unblock, pad with spaces rather than NULs
fdatasync
    physically write output file data before finishing
fsync
    likewise, but also write metadata

Each FLAG symbol may be:

append
    append mode (makes sense only for output; conv=notrunc suggested)
direct
    use direct I/O for data
directory
    fail unless a directory
dsync
    use synchronized I/O for data
sync
    likewise, but also for metadata
fullblock
    accumulate full blocks of input (iflag only)
nonblock
    use non-blocking I/O
noatime
    do not update access time
noctty
    do not assign controlling terminal from file
nofollow
    do not follow symlinks

Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.

CW$ dd if=/dev/zero of=/dev/null& pid=$!

    CW$ kill -USR1 $pid; sleep 1; kill $pid
18335302+0 records in
    18335302+0 records out 9387674624 bytes (9.4 GB) copied, 34.6279 seconds, 271 MB/s

Options are:

--help
    display this help and exit
--version
    output version information and exit

afeser

Ben hep bs argümanını block size olarak düşünmüştüm.
Yani
bs=1 count=512
512 tane 1 baytlık blok iken
bs=512 count=1
1 tane 512 baytlık blok demek oluyor.

Alıntı Yap
dd if=/dev/zero of=/tmp/swap bs=4k count=1M

Bu komutta count değeri 1 megabyte mıdır yoksa 1 milyon sayısı mıdır?
Count dediği sayı, bayt ise bilginin birimi(hafızanın). Bu yüzden 1M derken 1 MB demeye çalıştığını düşünmüyorum.
Bence 4 kilobaytlık bloklardan 1 milyon tane koyması gerektiğini söylüyor.
4096 bayt * 1 milyon adet = 4GB

Yanlışım varsa affola :)
Gelecek illa ki gelecek, önemli olan kimin getirdiği...

cygmad

#3
Cevaplarınız için teşekkürler. Peki büyük birimler kopyalarken bs ile count değerlerinin ideal oranları var mıdır? Yani bs yi küçük tutup count mı artırmalıyız yoksa tam tersi mi? Ulaşmak istenen 4gb birim için sonucu 4gb veren tüm bs ve count değerleri yazılabilir mi?

Yani benim anlamak istediğim verinin sağlıgı bütünlüğü tüm olasılıklarda aynı mı olacak?

afeser

#4
Alıntı yapılan: cygmad - 07 Ağustos 2017 - 17:17:59
Cevaplarınız için teşekkürler. Peki büyük birimler kopyalarken bs ile count değerlerinin ideal oranları var mıdır? Yani bs yi küçük tutup count mı artırmalıyız yoksa tam tersi mi? Ulaşmak istenen 4gb birim için sonucu 4gb veren tüm bs ve count değerleri yazılabilir mi?

Yani benim anlamak istediğim verinin sağlıgı bütünlüğü tüm olasılıklarda aynı mı olacak?

Veri sağlığı derken 1 0 lar hep aynı olacak ama farklı boyut kaplayabilirler(bu sıradan dosyalar için yani blok boyutunu belirleyip tğm dosyayı okuduğunuz, zero aygıtında yani sizin yaptığınız işlemde son boyut aynı olur hep) . Siz swap alanı için sanırım zero aygıından veri okuyorsunuz. Tüm alacağınız veri 0. Sorun olmadığı sürece veri aynen kopyalanır yani, aynı boyutta olur.
Genelde büyük boyutlu dosyalar ile kullanılacak ise blok boyutu büyük olur, bu erişim hızını arttırır bunu tek bir bloktan 100MB veri okuyormuş gibi düşün. Ama blok sayısı artar ise, yani boyutu düşer ise, bu sefer 100MBlık veriyi örneğin 1MBlık bloklar halinde 100 kez erişim sağlayıp okumuş olacaksın.
Ancak blok değeri çok yükselir ise de hızdan kazanmak isterken belllekten kayıp verilebilir. Örneğin 1 KB boyutundaki 100 adet dosya 100MBlık blok boyutunda 10,000MB kaplayacaktır.

İdeal oran olarak pratikte bilgim yok.

Ancak şimdi benim de kafam karıştı çünkü block size dosya sistemi için belirlenir ve sabittir diye biliyorum. Eğer öyle ise bs derken block size'dan bahsetmiyor olabilir miyiz?
Gelecek illa ki gelecek, önemli olan kimin getirdiği...

cygmad

#5
Veri bütünlüğü için dev aygıtı değil de hdd olarak düşünmüştüm ama dd komutu ne veriyle ne de dosya sistemi ile ilgilenmiyormuş. Okunan ve yazılan blocklar eşit oldukça hata olmuyormuş. Şurada bir yazı okudum.
http://www.mail-archive.com/eug-lug@efn.org/msg12073.html

Buradan anladığıma göre dediğiniz gibi bs değerleri işlem hızını etkiliyor ama tuhaf olan öntanımlı degeri 512 byte olan bs değerine 512 den büyük herhangi bir değer verildiğinde işlem süresi ciddi bir biçimde kısalıyor. Eski ve düşük sistemler için böyle uygun görülmüş olabilir.

Ben cevabı aldım tekrar sağolun.