Diski sıfırlarken yazma hataları nasıl yok sayılır?


19

Arızalı bir sabit diski sıfırlamak istediğinizi varsayalım. Sıfırlarla mümkün olduğunca üzerine yazmak istiyorsunuz. İstemediğiniz şey: işlem ilk yazma hatasına son verir. Bu nasıl yapılır?

AFAICS, ddyalnızca okuma hatalarını yok saymak için bir seçenek sunar. Böylece,

dd if=/dev/zero of=/dev/disk/by-id/lousy-vendor-123 bs=128k

yeterli değil.

ddrescue hataları görmezden gelmek daha iyi görünüyor - ama onunla en uygun komut satırı ne olurdu?

GNU ddrescue ile denemem:

ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123

1
dd conv=noerrorbir GNU uzantısı olabilir, emin değilim. Her durumda, hile yapmalı. SATA, sürücüye-silmeyi-söyle yanıtı, tüm sürücüleri silmeye değer.
Peter Cordes

1
@PeterCordes, GNU ddbelgelerinin kılavuz sayfası noerror'okuma hatalarından sonra devam et' ...
maxschlepzig

1
dd conv=noerrorist POSIX standardı, ancak gerçekten yavaş olabilir
schily

2
dd conv=noerrorhataları okumak için olmalı (sayfaya göre), yazma hataları değil. conv=notruncBenim için yazma hatalarını görmezden gelmenin hile yaptığı ile birleştirmek kötü bir şey yok . unix.stackexchange.com/a/229379/4319
imz - Ivan Zakharyaschev

Kullanmak gibi bir HDD'ye basit bir yazma işlemi dd if=/dev/zero of=/dev/sdXdisk okumaları gerçekleştirmez. Neden dd komutu "yeterli değil" diye düşünüyorsunuz ? Hangi "hataları" yaşıyorsunuz?
talaş

Yanıtlar:


12

Bunun badblocksiçin yıkıcı yazma modunda tercih ederim . Yazıyor, hatalara çarptığında bunu yapmaya devam ediyor ve son olarak size bu hataların nerede olduğunu söyler ve bu bilgiler daha sonra ne yapacağınıza karar vermenize yardımcı olabilir (Karıştırır mı?).

# badblocks -v -b 4096 -t random -o badblocks.txt -w /dev/destroyme
Checking for bad blocks in read-write mode
From block 0 to 2097151
Testing with random pattern: done
Reading and comparing: done
Pass completed, 52105 bad blocks found. (0/52105/0 errors)

Ve blok listesi:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

Ve daha sonra diskte ne kaldı:

# hexdump -C /dev/destroyme
00000000  be e9 2e a5 87 1d 9e 61  e5 3c 98 7e b6 96 c6 ed  |.......a.<.~....|
00000010  2c fe db 06 bf 10 d0 c3  52 52 b8 a1 55 62 6c 13  |,.......RR..Ubl.|
00000020  4b 9a b8 d3 b7 57 34 9c  93 cc 1a 49 62 e0 36 8e  |K....W4....Ib.6.|

Bunun gerçekten rastgele bir veri olmadığını unutmayın - desen tekrarlayıcıdır, bu yüzden atlarsanız 1MiBaynı çıktıyı tekrar görürsünüz.

Ayrıca, verileri tekrar okuduktan sonra doğrulamaya çalışacaktır, bu nedenle başarıyla yazıldığını iddia eden, ancak okuma sırasında yanlış veri döndüren bir diskiniz varsa, bu hataları da bulur. (Yanlış pozitiflerden kaçınmak için badblocks çalışırken başka hiçbir işlemin diske yazmadığından emin olun.)

Tabii ki bozuk bir diskte bu çok uzun sürebilir: arızalı alanları tamamen atlamasını sağlayacak hiçbir kod yoktur. Bunu başarabilmenin tek yolu badblocksçok daha büyük bir blok boyutu kullanmak olacaktır.

Bunu ddrescuedaha iyi yapıp yapmadığından emin değilim ; bunu diğer yönde yapması gerekiyordu (olabildiğince hızlı veri kurtarın). İlk / son bloğu belirleyerek dd / ddrescue / badblocks için manuel olarak yapabilirsiniz ...


1
Eğer -t randomveya -t 0- badblocks kullanırsam o zaman sadece bir yazma geçişi yapmak? Man sayfasına bakıldığında - o olmadan -t4 geçiş yapar ('0xaa, 0x55, 0xff, 0x00' için).
maxschlepzig

2
-tKomut satırında sağladığınız her biri için bir geçiş yapar . Dediğiniz gibi varsayılan 4 geçiştir.
frostschutz

13

Disk ise değil USB ile bağlanan, daha sonra kullanmayı düşünün hdparmbir yürütmek için (versiyon> 9.31) ATA Güvenli Sil diskin. Bu komut, sürücünün ürün yazılımının bozuk bloklar da dahil olmak üzere diskin içeriğini silmesine neden olur.

Uyarı:/dev/sdX Örnek olarak gösterdiğim doğru sürücü harfini kullanın - yalnızca kopyalayıp yapıştırmayın.

İlk olarak, ATA komutlarını anladığını kontrol edin (son on yılda veya daha fazlasında üretilen sürücülerin çoğu gerekir):

$ sudo hdparm -I /dev/sdX
.
# lots of other info here...
.
Security: 
    Master password revision code = 65534
        supported
    not enabled
    not locked
    not frozen
    not expired: security count
        supported: enhanced erase
    202min for SECURITY ERASE UNIT. 202min for ENHANCED SECURITY ERASE UNIT.

Ekstraktın son iki satırı, desteklendiğini gösterir.

Bu nedenle sürücüye bir parola ekleyin (görünüşte bir gereksinim):

$sudo hdparm --user-master u --security-set-pass p /dev/sdX
security_password="p"

ve sil:

$sudo hdparm --user-master u --security-erase p /dev/sdX
security_password="p"

/dev/sdX:
Issuing SECURITY_ERASE command, password="p", user=user

Bu prosedür hakkında daha fazla bilgiyi burada bulabilirsiniz .


Bu şanslıysanız USB üzerinden çalışabilir ve USB <-> SATA köprünüz standart olmayan SATA komutlarından geçebilir (ve Linux sürücüsü + hdparm bu modelde nasıl yapılacağını bilir). Ayrıca, örnek yazmak /dev/sdXiçin iyidir, çünkü o zaman birisi yapıştırırken ve özelleştirirken bir örneğini özlüyorsa, bir sorun olmayacaktır.
Peter Cordes

@Peter Cordes - 24 diskiniz olmadığı sürece ... Hayır, aptal bana! Teşekkürler, sdX olarak değiştirdim, bu bana bir cevap acele etmeyi öğretecek!
garethTheRed

2
Bağlantılı sayfada bu yöntemle çok fazla donanım / bellenim ile ilgili uyarılar listeleniyor ... tür korkutucu
maxschlepzig

Gerçekten de birkaç uyarı gösteriyor! Söyleyebileceğim tek şey, sorunsuz bir şekilde benim için çalıştı.
GarethTheRed

2

Burada dört uygulanabilir cevap görüyorum:

  1. hdparmYöntem tarafından gönderildi garethTheRed bilgisayarınıza doğrudan bağlıysanız muhtemelen en iyisidir. Görünüşe göre, USB üzerinden bağlamayı denerseniz, sürücünüzü tutabilirsiniz. Bunu atmak üzere olduğunuz bir sürüş için yapıyorsanız, bu iyi bir şey olabilir. Ancak, atmadan önce silme işlemini güvenli bir şekilde yapmak isteyebilirsiniz.

  2. İmz - Ivan Zakharyaschev tarafından bildirilen teknik işe yarayacak, ancak çok yavaş olabilir. Eğer veri kurtarılabilir olmasını istiyoruz kalmazsam öneririm /dev/urandomyerine /dev/zero; Örneğin,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Aşağıdakilere karşı tavsiye ederim. Aynı şeyi yapan daha hızlı bir şey için, maxschlepzig tarafından bildirilen tekniği kullanın (soruda):

    ddrescue --verbose --force --nosplit /dev/urandom /dev/sdX
    

    Bu ddkomuttan daha hızlı olacaktır , ancak komut kadar hızlı olmayacaktır hdparm. Bunu neden önermediğimi aşağıya bakın ...

  4. badblocksKomut ayrıca iş, ama o şekilde verileri rastgele olamaz olacak ve yine çok yavaş olacaktır.

Son olarak, insanların bir diski tamamen silmek istedikleri bir numaralı nedeni belirtmediysem hatırlatmak isterim. Bu durumda, henüz yapmadıysanız, önce diski kurtarmayı deneyebilirsiniz. Bir bloğu okursanız ve bu G / Ç hatasını döndürürse, bir daha aynı bloğa yazdığınızda disk yedek bir listeden farklı bir bloğu yeniden tahsis etmeye çalışır. Yedek listesi dolduğunda yazma işlemlerinde G / Ç hataları alırsınız. İşte o zaman sürücüyü gerçekten atmalısınız.

Böylece basit bir şey yapabilirsiniz:

dd if=/dev/sdX of=/dev/null conv=noerror

Ve sonra, kötü blokları yeniden yazmak için:

dd if=/dev/zero of=/dev/sdX bs=128k

Bu komut çalışırsa, cesursanız, diskinizi yeniden biçimlendirebilir ve tekrar kullanabilirsiniz.

Alternatif olarak, badblockskomutu diskte iki kez çalıştırabilirsiniz . İkinci kez kötü bloklar rapor etmemeli ...

badblocks -v -s -w -t random /dev/sdX
badblocks -v -s -w -t random /dev/sdX

Bu daha uzun sürer, ancak daha güvenilirdir.

Ayrıca, hdparmkomut dışında tekniklerin hiçbirinin güvenli bir şekilde silinmediğini de belirtmek gerekir . Tüm bu kötü blokları hatırlıyor musun? Bunlar hala orijinal verilerinizin birçoğunu çoğunlukla sağlam tutar. Bir veri kurtarma uzmanı, daha önce sabit diskinizde olanların küçük bir miktarını görmek için bunlara erişebilir.

Kurtarma konusunda ve neden ona karşı tavsiyede bulunduğumda, aşağıdaki panzehirim var:

Sorun ddrescure hataları görmezden ÇOK iyi olacak olmasıdır. Yaklaşık 102 GB işaretli dd yazma hızıyla tutarlı bir şekilde sabit diskim vardı ve 238 GB işaretinde yazma hataları üretmeye başladım. Ben ddrescue disk hiçbir hata rapor bile sabit bir hızda çalmaya devam etkilendim. 17 saat sonra, 1300 GB'dayken, sürücü ışığının yanıp sönmesinin durduğunu fark ettiğimde. Hızlı bir kontrol, tüm USB muhafazasının çevrimdışı olduğunu ortaya çıkardı. Sürücüyü yuvadan çıkardım. Ben ddrescue sadece mutlu hala hala elimdeki disk ile, hata olmadan kopyalama olduğunu bildirdi fark ettim. Diski başka bir makineye taktım ve şimdi bir tuğla olduğunu gördüm.

Sürücüyü bir tuğla yapmak için kurtarmayı suçlamıyorum. Sürücü başarısız oldu ve bir tuğla haline gelecekti. Sadece rahatsız edici ddrescue, kaç yazma hatası görmezden geldiğini bir hata saymak bile bulmuyorum. Bu kullanımda, ddrescue tüm yazma hatalarından bağımsız olarak tamamen başarılı olduğunu düşünmenizi sağlar. Gerçek şu ki, yavaşlama olan bölümde tam hızda devam etmemeliydi. Bölümün yavaş olmasının nedeni, sürücü tarafından birçok bloğun yer değiştirmiş olması ve bu bölüme erişirken çok fazla aramaya neden olmasıdır. Ddrescue'nun çıktısının kurgusal hale geldiği nokta muhtemelen budur.


1
'Güvenli bir şekilde silmek için aynı bloğun üzerine birkaç kez rastgele veriler yazmanız gerekir.' - talebinizi bir referansla doğrulayabilir misiniz (örneğin, modern sabit disklerdeki sıfırlanmış verilerin kurtarıldığını gösteren hakemli bir makale)? Ayrıca, sabit disk ürün yazılımı bir kara kutudur. ATA güvenli silme komutunun sadece her sektöre sıfır yazma kalıbı olarak uygulanmadığını nasıl anlarsınız?
maxschlepzig

Tam tersi. 2006'da, modern sürücüler verileri tek bir yazmanın da etkili olduğu kadar yoğun olarak depoladığı için, eski okullarda birden fazla yazma işleminin modern sürücülerle artık gerekli olmadığını gösteren bir dizi çalışma var gibi görünüyor.
user6856

1
dd conv=notrunc

muhtemelen benim için hile yaptı.

Bahsedilen

dd conv=noerror

(okuma sayfasına göre) hataları okumak için olmalıdır. İkisini birleştirmede kötü bir şey yok.

Bir diski sıfırlamak için tam komutum şöyle görünüyordu:

dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/zero of=/dev/sda

bs=Bazı durumlar için özel bir öğe eklemek de istenebilir.


1

Hızlı ve olgun bir yöntem kullanmaktır sdd.

Tüm içeriği yok etmek istiyorsanız arayın:

sdd -inull bs=1m of=/dev/rdsk/cXdXtXp0 -noerror

Her zaman "ham" disk sürücüsü arabirimini kullanın.

Bir diski onarmak ve eski içeriğin mümkün olduğunca çoğunu tutmak istiyorsanız arayın:

sdd if=/dev/rdsk/cXdXtXp0 of=/dev/rdsk/cXdXtXp0 bs=1m -noerror

Bu, okunamayan tüm blokları 512 bayt düzeyinde sıfırlarla değiştirir. Tekrar deneme sayısını değiştirmek isteyebilirsiniz try=#, varsayılan değer 2'dir.

Not sdddaha hızlı olduğu ddilk sağlanan blok boyutlu ve hatalar olması durumunda okumaya çalışır gibi hataların olması durumunda, bu 512 byte ile okur. Okuma hataları varsa, sdd sürücünün bellenimini sakinleştirmek için rasgele aramalar yapar ve sahte okumalar yapar.

Geliştirilmiş hata kurtarma özellikleri 1980'lerde ikinci en büyük Sun-Microsystems OEM için çalışırken geliştirildi.

Sdd kaynak kodu şematik araçlara dahil edilmiştir:

http://sourceforge.net/projects/schilytools/files/

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.