Sonlu boyutlu aygıtları kopyalarken neden blok boyutunu belirtmelisiniz?


15

Çevrimiçi eğitimlerde, CDROM'u iso görüntüsüne kopyalamak için genellikle aşağıdaki komutu kullanmanız önerilir:

$ dd if=/dev/dvd of=foobar.iso bs=2048

Bayt boyutu neden belirtilmelidir? Aslında 2048'in CDROM görüntüleri için standart bayt boyutu olduğunu fark ettim, ancak ddbelirtmeden bs=veya de count=çalışmadan görünüyor .

Hangi şartlar altında sorunlu olacağını değil belirtmek bs=veya count=sonlu boyutta bir cihazdan kopyalama yaparken?

Yanıtlar:


13

DD ne zaman veri kopyalamak için uygundur? (veya, okunduğunda () ve write () kısmi) kullanıldığında önemli bir uyarıyı işaret eder count: ddkısmi blokları kopyalayabilir, böylece verildiğinde count, bazı bloklar eksik olsa bile, verilen blok sayısından sonra duracaktır. Bu nedenle bs * count, siz belirtmedikçe, kopyalanan bayttan daha azıyla sonuçlanabilir iflag=fullblock.

Varsayılan blok boyutu aa 512 bayttır. countbir sınırdır; sorunuzun ima ettiği gibi, sonlu boyutlu bir cihaz kopyalanırken gerekli değildir ve gerçekten cihazın yalnızca bir kısmını kopyalamak için tasarlanmıştır.

Burada dikkate alınması gereken iki nokta olduğunu düşünüyorum: performans ve veri kurtarma.

Performans söz konusu olduğunda, ideal olarak blok boyutunun altta yatan fiziksel blok boyutuna (ve bir CD-ROM okurken 2048 bayt) en azından eşit ve bunun katları olmasını istersiniz. Aslında günümüzde, alttaki önbellek sistemlerine sizin için bir şeyleri tamponlama şansı vermek için daha büyük blok boyutları da belirleyebilirsiniz. Ancak blok boyutunu artırmak, dddaha fazla bellek kullanmak zorunda demektir ve paket parçalanması nedeniyle bir ağ üzerinden kopyalama yapıyorsanız karşı üretken olabilir.

Veri kurtarma söz konusu olduğunda, daha küçük blok boyutları kullanırsanız, arızalı bir sabit diskten daha fazla veri alabilirsiniz; Bu gibi programlar dd-rescueotomatik olarak yapılır: başlangıçta büyük blokları okurlar, ancak bir blok başarısız olursa daha küçük blok boyutlarıyla yeniden okurlar. ddbunu yapmayacak, sadece tüm bloğu başarısız olacak.


2
Özellikle performans; SD karta bir bölüm görüntüsü yazın, örneğin, dd bs=4m iflag=fullblockvs kullanarak dd bs=1111ve öncekinin size vereceği çok daha yüksek veri hızlarına dikkat edin. Bunun nedeni, ilkinin SD kartta doğal blok boyutlarıyla hizalanması, ikincisinin ise SD denetleyicinin kısmi fiziksel bloklar yazmak için çok fazla okuma, kopyalama ve yeniden tepki vermesini gerektirmesidir. Bu fullblockarada, onsuz bs, sadece maksimum ve kısmi okumaların kalıcı olarak sonraki yanlış hizalamalara yol açabileceğinden, önemi göz ardı edilmemelidir .
Jason C

6

Etrafta biraz yük kültü var dd. Başlangıçta, cpsorunlara neden olan iki hata vardı : 512 dışında bir blok boyutuyla (Linux 1024 blok boyutu kullandı) rapor edildiğinde dosyaları seyrek olarak yanlış algılar ve bir bir blok cihaza seyrek dosya.

Bunun bazı referanslarını Linux'un ilk posta listesi arşivlerinde bulabilirsiniz .

Böylece insanlar disk görüntüleri ile başa çıkmak için doğru yolu olmak için alıştılar ve cp yol kenarına düştü. Ve dd varsayılan blok boyutu 512 kullandığından yavaştır (modern sistemlerde cp'den daha yavaştır). Ancak hangi blok boyutunu kullanmanız gerektiği açık değildir. Muhtemelen sizin durumunuzda birisi 2048'in bir CD-ROM için "doğal" blok boyutu olduğunu okumuştur (CD-ROM'lar, hata düzeltme bilgileriyle birlikte 2.048 bayt veri içeren 2.352 bayt sektörlere ayrılmıştır) ve bunun dd ile kullanılacak "doğru" boyuttur, aslında (orta derecede) daha büyük bir blok boyutu kullanırsanız muhtemelen daha hızlı sonuçlar elde edersiniz. Aslında, GNU cp bu nedenle 64k varsayılan blok boyutunu kullanır.

tl; dr: cp /dev/dvd foobar.iso iyi çalışmalı. Varsayılan blok boyutu dd512'dir. Tek başına bırakılan tek etkinin çoğu modern durumda olması muhtemeldir, kopyalama işlemini yavaşlatmaktır.


değişmiş olabilir, yine de GNU cp varsayılan olarak 128k blok boyutunu kullanıyor (64k değil), bkz. eklitzke.org/efficient-file-copying-on-linux
apurkrt

5

Blok boyutunun değiştirilmesi, bir seferde ne kadar arabelleğe alınacağını veya okunacağını / yazıldığını değiştirmenin iyi bir yoludur.

Gerçek bir blok cihazı mı yoksa sonsuz / sanal bir cihaz mı olduğu ile ilgili değildir. ddYazmaya başlamadan önce bellekte ne kadar depolanmasını istediğinizle ilgilidir . (bir seferde ne kadar verinin okunduğunu) ve ( bir anda ne kadar verinin yazıldığını ) bs=ayarlar . Daha yüksek daha yineleme için yeterli veriye sahip öncesinde gerekli olacaktır hedefe yazmaya başlamak için.ibs=obs=obs=ibs=dd

count=aynı zamanda ne yapmak istediğinizden başka bir şeye bağımlı değildir. İşinin yapıldığını düşünmek ibs=için kaç "blok" (ölçülen ) gerekli olacağını kontrol eder dd.


Not Stephens ddkısmi blokları kopyalama noktası - her zaman değil bs * count.
Drav Sloan

Bazı Unix sistemlerinde bunu unutmayın gerekir yerli blok ölçüsüne okumak; ddolmadan bs=2048ya da bir blok aygıtı CDROM sürücüsünden okunurken bir çok bunun bir hata verecektir.
wurtel

2

Blocksize seçeneğini ddetkin olarak kullanmak, çıkış G / Ç alt sistemine geri yazmaya çalışmadan önce giriş G / Ç alt sisteminden ne kadar verinin belleğe kopyalanacağını belirler. Çıktı aynıdır (tüm disk kopyalanırken), parçalar sadece belirttiğiniz farklı boyutta okunur (çoğu dduygulama 512 baytlık varsayılan bir blok boyutuyla gider).

Büyük miktarda yedek belleğiniz varsa ve blok boyutunu arttırırsanız, art arda daha büyük veri parçaları okunabilir, arabelleğe alınabilir ve çıktı hedefine akıtılabilir. Daha düşük bir blok boyutu, her bir lseek, memset vb.

Kilometreniz if=ve of=ayarlandığınız yere ve hafızanız düşükse vb. Hangi donanımdan geçtiğinize bağlı olarak kilometreniz değişebilir .


1

Bs = blok boyutunu okumak yazma temsil eder. Alanı olduğu gibi bırakmak veya belirtmemek aynı kopyalama işini yapıyor gibi görünebilir, ancak kullanımda gizli bir gerçek vardır. Örneğin,

  • Her biri sadece 1 ~ 10 kb olan 1000000000000000 dosyalarına sahip olmak.
  • 10 gb için tek bir dosyaya sahip olmak

İlk durumda, daha düşük blok boyutu kullanmanın kopyalama hızını arttırdığı bulunmuştur. İkincisindeyken, daha yüksek sector changeG / Ç işlemleriyle sonuçlanan daha az komut bırakarak sektör boyutunu arttırdığı için Yüksek blok boyutu daha iyi bir seçenek olmuştur .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.