Saya memiliki hard drive yang diisi dengan angka nol.
Bagaimana memeriksa apakah semua bit pada hard drive nol menggunakan bash?
hard-drive
bash
ubuntu-12.10
gkfvbnhjh2
sumber
sumber
Jawaban:
od
akan menggantikan proses yang sama dengan*
, sehingga Anda dapat dengan mudah menggunakannya untuk memindai byte yang bukan nol:sumber
| head
pada akhirnya, sehingga jika ternyata drive tidak memusatkan perhatian, berhenti setelah hanya menghasilkan output yang cukup untuk menunjukkan fakta, alih-alih membuang seluruh drive ke layar.Saya telah menulis program C ++ singkat untuk melakukannya, sumber tersedia di sini .
Untuk membangunnya:
Untuk menjalankannya:
Ini akan menampilkan posisi dan nilai byte yang bukan nol. Anda dapat mengarahkan output ini ke file dengan
>
, misalnya:Anda mungkin ingin mencoba mengubah
BUFFER_SIZE
untuk efisiensi yang lebih baik. Saya tidak yakin apa nilai optimalnya. Perhatikan bahwa ini juga memengaruhi seberapa sering ia mencetak kemajuan, yang agaknya akan mempengaruhi kecepatan (hasil cetak ke konsol lambat ). Tambahkan2>/dev/null
untuk menyingkirkan hasil kemajuan.Saya sadar ini tidak menggunakan standar bash, atau bahkan builtin, tetapi seharusnya tidak memerlukan hak istimewa tambahan. Solusi @Hennes masih lebih cepat (saya belum benar-benar mengoptimalkan apa pun - ini adalah solusi naif); Namun, program kecil ini dapat memberi Anda gambaran yang lebih baik tentang berapa banyak byte yang dihapus oleh wiper Anda, dan di lokasi apa. Jika Anda menonaktifkan output progres, itu masih akan lebih cepat daripada yang dapat dibaca oleh kebanyakan hard drive konsumen (> 150 MB / s), jadi itu bukan masalah besar.
Versi yang lebih cepat dengan output yang lebih sedikit tersedia di sini . Namun, masih sedikit lebih lambat dari solusi @ Henne. Yang ini, bagaimanapun, akan berhenti pada karakter bukan nol pertama yang dihadapinya sehingga berpotensi jauh lebih cepat jika ada nol di dekat awal aliran.
Menambahkan sumber ke pos untuk menjaga agar jawaban tetap lengkap:
sumber
iszero /dev/sda
daripada mengharuskannya untuk disalurkan dengan sesuatu sepertiiszero < /dev/sda
?int main(int argc, char *argv[])
laluFILE* file = fopen(argv[1], "r");
. Dilakukan dengan benar itu termasuk memeriksa apakah argumen itu benar-benar ada, memeriksa kesalahan berhasil terbuka (melakukan pemeriksaan tambahanferror
setelahfopen
), dll, tetapi terlalu banyak kesulitan untuk program sekali pakai.gcc
itu tidak selalu tersedia di semua distro Linux tanpa menarik paket tambahan. Kemudian lagi numpy juga bukan bagian dari paket Python standar ...-O3
dan-march=native
Anda mungkin melihat beberapa speedups; yang seharusnya memastikan GCC mengaktifkan auto-vectorisation dan menggunakan yang terbaik yang tersedia untuk CPU Anda saat ini (AVX, SSE2 / SSE3, dll.). Bersamaan dengan itu Anda bisa bermain dengan ukuran buffer; ukuran buffer yang berbeda mungkin lebih optimal dengan loop vectorised (saya akan bermain dengan 1MB +, yang sekarang adalah 1kB).@Bob
) dalam obrolan: chat.stackexchange.com/rooms/118/root-accessMemperluas jawaban Gordon,
pv
memberikan indikasi seberapa jauh prosesnya adalah:sumber
Ini sepertinya solusi yang tidak efisien dan jelek, tetapi jika Anda hanya perlu memeriksa sekali:
dd if=/dev/sdX | tr --squeeze-repeats "\000" "T"
Menggunakan dd untuk membaca dari disk
sdX
. (ganti X dengan drive yang ingin Anda baca),Kemudian terjemahkan semua byte nol yang tidak dapat diproduksi menjadi sesuatu yang dapat kami tangani.
Selanjutnya kita menghitung byte yang bisa kita tangani dan periksa apakah itu angka yang tepat (gunakan
wc -c
untuk itu), atau kita lewati menghitung dan menggunakan-s
atau--squeeze-repeats
untuk memeras semua kemunculan banyak ke satu karakter.Dengan demikian
dd if=/dev/sdX | tr --squeeze-repeats "\000" "T"
harus mencetak hanya satu T.Jika Anda ingin melakukan ini secara teratur maka Anda menginginkan sesuatu yang lebih efisien.
Jika Anda ingin melakukan ini hanya sekali saja maka kludge ini dapat memverifikasi bahwa penghapus normal Anda berfungsi dan Anda dapat mempercayainya.
sumber
Untuk memeriksa saja, Anda akan melihat blok apa pun yang tidak cocok tercantum
Atau gunakan badblock untuk menulisnya serta memeriksa:
Tes destrucive default adalah penghapusan pilihan saya yang aman
Jika ada yang bisa mengambil apa pun setelah mengisi drive dengan 0s dan 1s bergantian, maka pelengkap mereka, maka semua 1s, lalu semua 0s, dengan setiap pass diverifikasi berfungsi, semoga sukses untuk mereka!
Melakukan pemeriksaan pra-penempatan yang baik pada drive baru juga
untuk opsi lain
Tidak mengatakan itu cepat, tetapi berhasil ...
sumber
Terbaik dari kedua dunia. Perintah ini akan melewati bad sector:
Gunakan
kill -USR1 <pid of dd>
untuk melihat kemajuan.sumber
Beberapa waktu lalu saya penasaran
AIO
. Hasilnya adalah program uji sampel yang terjadi untuk memeriksa sektor (blok 512 byte) yangNUL
. Anda dapat melihat ini sebagai varian dari detektor wilayah file yang jarang . Saya pikir sumber mengatakan semuanya.NUL
terlihat seperti output0000000000-eof
. Perhatikan bahwa ada trik dalam fungsi programfin()
tidak dipanggil pada baris 107 dengan sengaja untuk memberikan hasil yang ditunjukkan.AIO
tidak lurus seperti cara lain,AIO
adalah mungkin cara tercepat untuk menjaga drive sibuk membaca , karenaNUL
membandingkan dilakukan sedangkan blok data berikutnya dibaca dalam. (Kita bisa memeras beberapa milidetik lebih dengan melakukan tumpang tindihAIO
, tapi aku benar-benar tidak berpikir ini bernilai upaya.)true
jika file dapat dibaca dan semuanya berfungsi. Itu tidak kembalifalse
jika file tersebut bukanNUL
.NUL
masih berfungsi, karena buffer memori sudah berisiNUL
. Jika seseorang berpikir ini perlu diperbaiki, pada baris 95memcmp(nullblock, buf+off, SECTOR)
bisa dibacamemcmp(nullblock, buf+off, len-off<SECTOR : len-off : SECTOR)
. Tetapi satu-satunya perbedaan adalah, bahwa "pelaporan akhir" mungkin agak acak (bukan untuk file yang seluruhnyaNUL
).memcmp()
juga memperbaiki masalah lain pada platform, yang tidak mengubahNUL
alloc()
memori, karena kode tidak melakukannya. Tapi ini hanya dapat dilihat oleh file kurang dari 4 MiB, tapichecknul
mungkin berlebihan untuk tugas sekecil itu;)HTH
sumber
Ingin memposting solusi pintar ini dari pertanyaan yang serupa tetapi sebelumnya, diposkan oleh pengguna yang belum masuk untuk sementara waktu:
sumber