Wczoraj wdałem się w krótką debatę na temat logiki i / lub prawdziwości mojej odpowiedzi , vis., Że rejestrowanie i utrzymywanie metadanych fs na karcie SD o przyzwoitym rozmiarze (GB +) nigdy nie będzie wystarczająco znaczące, aby ją nosić w rozsądnym czasie (lata i lata). Najpierw zdawało się, że muszę się mylić, ponieważ w Internecie jest tak wiele historii o ludziach, którzy mają na sobie karty SD.
Ponieważ mam urządzenia z kartami SD, które zawierają systemy plików rootkw rw pozostawione 24 godziny na dobę, 7 dni w tygodniu, przetestowałem tę zasadę wcześniej dla własnego zadowolenia. Ulepszyłem nieco ten test, powtórzyłem go (w rzeczywistości przy użyciu tej samej karty) i przedstawiam go tutaj. Dwa główne pytania, które mam, to:
- Czy metoda, którą podjąłem, próbując zniszczyć kartę, jest wykonalna, pamiętając, że ma ona na celu odtworzenie efektów ciągłego ponownego zapisywania niewielkich ilości danych?
- Czy metoda, której użyłem do sprawdzenia, czy karta jest nadal w porządku, jest wykonalna?
Zadaję tutaj pytanie zamiast SO lub SuperUser, ponieważ sprzeciw wobec pierwszej części prawdopodobnie musiałby stwierdzić, że mój test tak naprawdę nie zapisał się na karcie w sposób, w jaki jestem pewien, i twierdzenie, że wymagałoby to trochę specjalna znajomość systemu Linux.
[Możliwe też, że karty SD używają pewnego rodzaju inteligentnego buforowania lub pamięci podręcznej, tak że wielokrotne zapisy w tym samym miejscu byłyby buforowane / buforowane w miejscu mniej podatnym na zużycie. Nigdzie nie znalazłem żadnych oznak tego, ale pytam o to na SU]
Ideą testu jest zapisanie tego samego małego bloku na karcie miliony razy. Jest to znacznie ponad twierdzenie, ile cykli zapisu może wytrzymać takie urządzenie, ale zakładając, że poziomowanie zużycia jest skuteczne, jeśli karta ma przyzwoity rozmiar, miliony takich zapisów wciąż nie powinny mieć większego znaczenia, ponieważ „ten sam blok” nie może być dosłownie tym samym fizycznym blokiem. Aby to zrobić, musiałem upewnić się, że każdy zapis był naprawdę zapisany na sprzęcie i w tym samym widocznym miejscu.
W przypadku opróżniania ze sprzętu korzystałem z wywołania biblioteki 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;
}
Pracowałem przez około 8 godzin, aż zgromadziłem 2 miliony + zapisów na początku /dev/sdb1
partycji. 1 Mogłem po prostu łatwo użyć /dev/sdb
(surowe urządzenie, a nie partycję), ale nie widzę, jaka to by różnica.
Następnie sprawdziłem kartę, próbując utworzyć i zamontować system plików /dev/sdb1
. To zadziałało, wskazując, że konkretny blok, do którego pisałem całą noc, był wykonalny. Nie oznacza to jednak, że niektóre obszary karty nie zostały zużyte i przesunięte przez wyrównanie zużycia, ale pozostawiono dostępne.
Aby to sprawdzić, użyłem badblocks -v -w
na partycji. Jest to niszczący test odczytu / zapisu, ale wyrównywanie zużycia, czy nie, powinno być silnym wskaźnikiem wykonalności karty, ponieważ wciąż musi zapewniać miejsce dla każdego ciągłego zapisu. Innymi słowy, jest to dosłowny odpowiednik całkowitego wypełnienia karty, a następnie sprawdzenia, czy wszystko było w porządku. Kilka razy, odkąd pozwalam badblockom działać według kilku wzorców.
[Komentarze Contra Jason C poniżej, nie ma nic złego lub fałszywego w używaniu badblocków w ten sposób. Chociaż nie byłoby przydatne do faktycznej identyfikacji uszkodzonych bloków ze względu na naturę kart SD, jest w porządku do wykonywania destrukcyjnych testów odczytu i zapisu o dowolnej wielkości za pomocą przełączników -b
i -c
, czyli tam, gdzie poszedł poprawiony test (patrz moja własna odpowiedź ). Żadna ilość magii ani pamięci podręcznej kontrolera karty nie może oszukać testu, w którym kilka megabajtów danych można zapisać na sprzęcie i odczytać ponownie poprawnie. Inne komentarze Jasona wydają się opierać na błędnym odczytaniu - IMO jest celowe , dlatego nie zadałem sobie trudu, aby się kłócić. Z podniesioną głową pozostawiam czytelnikowi decyzję, co ma sens, a co nie .]
1 Karta była starą kartą Sandisk o pojemności 4 GB (nie ma na niej numeru „klasy”), której prawie nie używałem. Jeszcze raz pamiętajcie, że to nie 2 miliony pisze dosłownie w tym samym fizycznym miejscu; z powodu wyrównywania zużycia „pierwszy blok” będzie stale przesuwany przez kontroler podczas testu, aby, jak to określa termin, wyrównać zużycie.
/dev/sdb1
vs, /dev/sdb
to nie ma znaczenia dla twojego programu, ale to, co robi różnicę (jak opisano poniżej), to to, że stan nieużywanych bloków na twoim urządzeniu jest nieznany i nie został uwzględniony w teście, i dopóki nie wypełnisz całego urządzenia (np. /dev/sdb
), w pierwszej kolejności danych, stopień wyrównywania zużycia przestrzeni musi być znaczącą zmienną. Tak więc, podczas gdy urządzenie vs. partycja nie ma znaczenia dla twojego testu, jest to głównie konsekwencja wadliwego testu, ponieważ po prawidłowym wypełnieniu urządzenia danymi, na partycję nie będzie dostępna opcja (chyba że sformatujesz później).
badblocks
do wyświetlania błędów strony na dysku flash (i twierdzenie, że jest to bardzo mylące). Są one obsługiwane przez kontroler i mapowane w celu zarezerwowania miejsca po wykryciu. Fizyczny układ danych na dysku nie jest taki sam jak fizyczny układ, który widzisz podczas wykonywania operacji we / wy, w ten sposób wyrównanie zużycia zachowuje przejrzystość. Nic z tego nie jest dla ciebie widoczne podczas operacji we / wy. Co najwyżej, jeśli dysk obsługuje SMART, możesz uzyskać trochę informacji o awariach i pozostałym zarezerwowanym miejscu z kontrolera.