Saya masuk ke sebuah perdebatan kecil dengan seseorang kemarin mengenai logika dan / atau kebenaran jawaban saya di sini , vis., Bahwa logging dan memelihara meta-data fs pada kartu SD berukuran (GB +) yang layak tidak akan pernah cukup signifikan untuk memakai kartu dalam jumlah waktu yang wajar (bertahun-tahun). Inti dari kontra-argumen tampaknya adalah bahwa saya pasti salah karena ada begitu banyak cerita online tentang orang-orang yang memakai kartu SD.
Karena saya memiliki perangkat dengan kartu SD di dalamnya yang berisi filesystem rw root yang tersisa pada 24/7, saya telah menguji premis sebelumnya untuk kepuasan saya sendiri. Saya telah mengubah tes ini sedikit, mengulanginya (menggunakan kartu yang sama, sebenarnya) dan saya mempresentasikannya di sini. Dua pertanyaan utama yang saya miliki adalah:
- Apakah metode yang saya gunakan untuk mencoba merusak kartu layak, mengingat itu dimaksudkan untuk mereproduksi efek terus menulis ulang sejumlah kecil data?
- Apakah metode yang saya gunakan untuk memverifikasi kartu masih layak?
Saya mengajukan pertanyaan di sini daripada SO atau SuperUser karena keberatan pada bagian pertama mungkin harus menyatakan bahwa tes saya tidak benar-benar menulis ke kartu seperti yang saya yakin, dan menyatakan bahwa akan memerlukan beberapa pengetahuan khusus tentang linux.
[Bisa juga kartu SD menggunakan semacam buffering pintar atau cache, sehingga menulis berulang ke tempat yang sama akan disangga / di-cache di suatu tempat yang kurang rentan untuk dikenakan. Saya belum menemukan indikasi ini di mana pun, tetapi saya bertanya tentang itu di SU]
Gagasan di balik tes ini adalah menulis ke blok kecil yang sama pada kartu jutaan kali. Ini jauh melampaui klaim berapa banyak siklus tulis yang dapat dipertahankan oleh perangkat seperti itu, tetapi menganggap leveling keausan efektif, jika kartu berukuran layak, jutaan penulisan semacam itu masih tidak terlalu penting, seperti "blok yang sama" tidak secara harfiah menjadi blok fisik yang sama. Untuk melakukan hal ini, saya perlu untuk memastikan setiap menulis itu benar-benar memerah ke perangkat keras, dan sama jelas tempat.
Untuk membilas ke perangkat keras, saya mengandalkan panggilan perpustakaan POSIX fdatasync()
:
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
// Compile std=gnu99
#define BLOCK 1 << 16
int main (void) {
int in = open ("/dev/urandom", O_RDONLY);
if (in < 0) {
fprintf(stderr,"open in %s", strerror(errno));
exit(0);
}
int out = open("/dev/sdb1", O_WRONLY);
if (out < 0) {
fprintf(stderr,"open out %s", strerror(errno));
exit(0);
}
fprintf(stderr,"BEGIN\n");
char buffer[BLOCK];
unsigned int count = 0;
int thousands = 0;
for (unsigned int i = 1; i !=0; i++) {
ssize_t r = read(in, buffer, BLOCK);
ssize_t w = write(out, buffer, BLOCK);
if (r != w) {
fprintf(stderr, "r %d w %d\n", r, w);
if (errno) {
fprintf(stderr,"%s\n", strerror(errno));
break;
}
}
if (fdatasync(out) != 0) {
fprintf(stderr,"Sync failed: %s\n", strerror(errno));
break;
}
count++;
if (!(count % 1000)) {
thousands++;
fprintf(stderr,"%d000...\n", thousands);
}
lseek(out, 0, SEEK_SET);
}
fprintf(stderr,"TOTAL %lu\n", count);
close(in);
close(out);
return 0;
}
Saya menjalankan ini selama ~ 8 jam, sampai saya mengumpulkan 2 juta + penulisan ke awal /dev/sdb1
partisi. 1 Saya bisa saja dengan mudah menggunakan /dev/sdb
(perangkat mentah dan bukan partisi) tetapi saya tidak bisa melihat apa bedanya ini.
Saya kemudian memeriksa kartu dengan mencoba membuat dan me-mount sistem file aktif /dev/sdb1
. Ini berhasil, menunjukkan blok spesifik yang telah saya tulis sepanjang malam itu layak. Namun, itu tidak berarti bahwa beberapa wilayah kartu tidak aus dan tergeser oleh leveling keausan, tetapi tetap dapat diakses.
Untuk mengujinya, saya gunakan badblocks -v -w
pada partisi. Ini adalah tes baca-tulis yang merusak , tetapi leveling aus atau tidak, itu harus menjadi indikasi kuat kelayakan kartu karena masih harus memberikan ruang untuk setiap rolling menulis. Dengan kata lain, itu setara dengan mengisi kartu sepenuhnya, lalu memeriksa bahwa semua itu baik-baik saja. Beberapa kali, sejak saya membiarkan badblock bekerja melalui beberapa pola.
[Komentar Contra Jason C di bawah ini, tidak ada yang salah atau salah tentang menggunakan badblocks dengan cara ini. Meskipun tidak akan berguna untuk mengidentifikasi blok-blok buruk karena sifat kartu SD, tidak apa-apa untuk melakukan tes baca-tulis destruktif dengan ukuran acak menggunakan -b
dan -c
sakelar, yang merupakan tempat uji revisi berjalan (lihat jawaban saya sendiri) ). Tidak ada jumlah sihir atau caching oleh pengontrol kartu yang dapat mengelabui tes di mana beberapa megabyte data dapat ditulis ke perangkat keras dan dibaca kembali dengan benar. Komentar Jason yang lain tampaknya didasarkan pada kesalahan membaca - IMO yang disengaja , itulah sebabnya saya tidak repot-repot berdebat. Dengan kepala itu, saya serahkan kepada pembaca untuk memutuskan apa yang masuk akal dan apa yang tidak .]
1 Kartu itu adalah kartu Sandisk 4 GB lama (tidak ada nomor "kelas" di atasnya) yang jarang saya gunakan. Sekali lagi, perlu diingat bahwa ini bukan 2 juta menulis ke tempat fisik yang sama secara harfiah; karena leveling keausan, "blok pertama" akan dipindahkan secara konstan oleh pengontrol selama pengujian, seperti yang dinyatakan dalam istilah, leveling keausan.
/dev/sdb1
vs /dev/sdb
tidak ada bedanya untuk program Anda, tetapi apa yang membuat perbedaan (seperti yang dijelaskan di bawah) adalah bahwa negara blok yang tidak digunakan pada perangkat Anda tidak diketahui dan belum ditemukan dalam pengujian Anda, dan kecuali Anda mengisi seluruh perangkat (misalnya /dev/sdb
) dengan data pertama, jumlah levelling ruang pakai harus bekerja dengan adalah variabel utama. Jadi, sementara perangkat vs partisi tidak relevan untuk pengujian Anda, yang sebagian besar merupakan konsekuensi dari pengujian cacat, seperti setelah mengisi perangkat dengan data dengan benar, per-partisi tidak akan menjadi pilihan yang tersedia (kecuali Anda diformat setelah).
badblocks
untuk menunjukkan kegagalan halaman pada flash drive (dan mengklaim itu sangat menyesatkan). Itu ditangani oleh pengontrol dan dipetakan untuk menyediakan ruang ketika terdeteksi. Tata letak fisik data pada drive tidak sama dengan tata letak fisik yang Anda lihat ketika melakukan I / O, karena itulah leveling aus menjaga transparansi. Semua ini tidak terlihat oleh Anda selama I / O. Paling-paling, jika drive mendukung SMART, Anda bisa mendapatkan sedikit info tentang kegagalan dan ruang yang tersisa dari pengontrol.