dd giriş cihazının sonunu geçiyor
dd
Tamir ettiğim bir sabit diski klonlamak için kullanmaya çalışıyorum . dd
Kopyalama verisini sürücüden 10GB'lık parçalar halinde yapmaya çalışıyorum , ancak sürücünün içermesi gerekenden daha fazla veri aktarıyor. Sürücünün kendisi çalışır ve üzerindeki bölme monte edilebilir.
Kullanarak df -h
sürücünün boyutunu 1000204886016 bayt (1TB sürücü) olarak aldım.
Başlangıçta denedim:
sudo dd if=/dev/sdb of=/dev/sdd status=progress
Ancak bu, yaklaşık 300 GB sonra yavaşladı ve sonunda bir okuma hatası nedeniyle başarısız oldu. 10GB'lık parçalar halinde kopyalamaya karar verdim. 128kByte blok boyutuyla 10GB okumanın 78125 bloğun kopyalanmasını gerektirdiğini hesapladım.
Bunu yapmak için kullanıyorum:
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n
dd
her seferinde 10240000000 bayt aktarıldığını bildiriyordu. Her yineleme için arama değerini hesaplamak için, aktarılan baytları topladım ve bir miktar çakışma olduğundan emin olmak için 1 GB çıkardım. Ortaya çıkan sıra:
seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000
Bunları ayrı dd komutlarıyla bir kabuk betiğine yazdım ve çalıştırdım. Son yinelemeyi, gerektiği kadar veri kopyalamak için serbest bıraktım.
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000
Son yinelemeye kadar sürücünün sonunu geçmesi gerekirdi, ancak devam etti. Klon bağlanır, ancak açıkça bozuktur ve veriler eksiktir.
- Matematiğimde veya kullandığım argümanlarda bir sorun mu var
dd
? - Verileri 10 GB'lık parçalar halinde almak için bir 'dd' komutu yazmamın daha iyi bir yolu var mı?
Yanıtlar
Sorun, seek
gerçekte bir blok sayısı aldığında, bir bayt değeri aldığını varsaymanızdır . Sen kullanarak olmalıdır seek=0
, 78125
, 156250
vb
Ancak, şunlardan kurtularak bunu oldukça basitleştirebilirsiniz dd
:
split -b 10G < /dev/sdd
Tamir ettiğim bir sabit diski klonlamak için dd kullanmaya çalışıyorum
Yapma.
ddrescueBunun yerine, okunamayan bloklarla ve diğer medya hatalarıyla iyi başa çıkabilen kullanın .
Çözümümün başarısız olmasının nedeninin arama bayrağının ne yaptığını yanlış anlamak olduğunu keşfettim. Yalnızca çıkış sürücüsündeki yazma konumunu değiştiriyordu. Yani komut dosyası çıktıya ilk 10GB’ı defalarca kopyalıyordu. Cihazın sonuna asla ulaşmaz.
Girişi kaydırmak için atlama bayrağının da kullanılması gerekir:
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n
Ayarlama oflag=seek_bytes
ve iflag=skip_bytes
matematiğin blokların aksine bayt cinsinden yapılmasına izin verir.
Ancak roaima ( ddrescue kullanın) ve diğer adam ( split -b 10G < /dev/sdd
) tarafından sunulan seçenekler , hasarlı sürücüleri kurtarmak ve sırasıyla bölümlere ayrılmış transferler gerçekleştirmek için daha iyi bir yoldur.