Tôi đã có một cuộc tranh luận nhỏ với ai đó ngày hôm qua về logic và / hoặc tính xác thực của câu trả lời của tôi ở đây , rằng, việc ghi nhật ký và duy trì dữ liệu meta fs trên thẻ SD có kích thước (GB +) không bao giờ đủ đáng kể để đeo thẻ trong một khoảng thời gian hợp lý (năm và năm). Ý chính của cuộc tranh luận dường như là tôi phải sai vì có quá nhiều câu chuyện trực tuyến về những người đeo thẻ SD.
Vì tôi có các thiết bị có thẻ SD trong đó có chứa các hệ thống tập tin gốc rw còn sót lại 24/7, tôi đã thử nghiệm tiền đề trước đây để tự hài lòng. Tôi đã điều chỉnh bài kiểm tra này một chút, lặp lại nó (thực tế là sử dụng cùng một thẻ) và đang trình bày nó ở đây. Hai câu hỏi trung tâm tôi có là:
- Là phương pháp tôi đã sử dụng để cố gắng phá hỏng thẻ có thể tồn tại được không, hãy nhớ rằng nó có ý định tái tạo hiệu ứng của việc liên tục viết lại một lượng nhỏ dữ liệu?
- Là phương pháp tôi đã sử dụng để xác minh thẻ vẫn còn khả thi?
Tôi đang đặt câu hỏi ở đây chứ không phải SO hay SuperUser bởi vì sự phản đối đối với phần đầu tiên có lẽ phải khẳng định rằng bài kiểm tra của tôi không thực sự ghi vào thẻ theo cách tôi chắc chắn, và khẳng định rằng sẽ cần một số kiến thức đặc biệt về linux.
[Cũng có thể là thẻ SD sử dụng một số loại bộ đệm hoặc bộ đệm thông minh, do đó việc ghi lặp lại vào cùng một vị trí sẽ được đệm / lưu vào bộ đệm ở một nơi nào đó ít bị hao mòn hơn. Tôi không tìm thấy bất kỳ dấu hiệu nào về điều này ở bất cứ đâu, nhưng tôi đang hỏi về điều đó trên SU]
Ý tưởng đằng sau bài kiểm tra là viết vào cùng một khối nhỏ trên thẻ hàng triệu lần. Điều này vượt xa mọi tuyên bố về việc có bao nhiêu chu kỳ ghi như vậy mà các thiết bị có thể duy trì, nhưng giả sử cân bằng hao mòn có hiệu quả, nếu thẻ có kích thước khá, hàng triệu lần viết như vậy vẫn không quan trọng lắm, vì "cùng một khối" sẽ không thực sự là cùng một khối vật lý. Để làm điều này, tôi cần đảm bảo rằng mọi ghi đều thực sự được chuyển sang phần cứng và đến cùng một vị trí rõ ràng .
Để xóa phần cứng, tôi đã dựa vào cuộc gọi thư viện 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;
}
Tôi đã chạy nó trong 8 giờ, cho đến khi tôi tích lũy được 2 triệu + ghi vào đầu /dev/sdb1
phân vùng. 1 Tôi có thể dễ dàng sử dụng /dev/sdb
(thiết bị thô chứ không phải phân vùng) nhưng tôi không thể thấy điều này sẽ tạo ra sự khác biệt gì.
Sau đó tôi đã kiểm tra thẻ bằng cách cố gắng tạo và gắn hệ thống tập tin vào /dev/sdb1
. Điều này đã làm việc, chỉ ra khối cụ thể mà tôi đã viết cho cả đêm là khả thi. Tuy nhiên, điều đó không có nghĩa là một số vùng của thẻ không bị hao mòn và bị dịch chuyển do cân bằng độ mòn, nhưng vẫn có thể truy cập được.
Để kiểm tra điều đó, tôi đã sử dụng badblocks -v -w
trên phân vùng. Đây là một bài kiểm tra đọc-ghi phá hủy , nhưng mặc cân bằng hay không, nó phải là một dấu hiệu mạnh mẽ về tính khả thi của thẻ vì nó vẫn phải cung cấp không gian cho mỗi lần ghi. Nói cách khác, nó hoàn toàn tương đương với việc điền đầy đủ vào thẻ, sau đó kiểm tra xem tất cả những thứ đó có ổn không. Một vài lần, vì tôi đã để badblocks hoạt động thông qua một vài mẫu.
[Ý kiến của Contra Jason C bên dưới, không có gì sai hay sai khi sử dụng badblocks theo cách này. Mặc dù sẽ không hữu ích khi thực sự xác định các khối xấu do bản chất của thẻ SD, nhưng sẽ rất tốt khi thực hiện các bài kiểm tra đọc ghi phá hủy có kích thước tùy ý bằng cách sử dụng các công tắc -b
và -c
chuyển đổi, đó là nơi kiểm tra đã được sửa đổi (xem câu trả lời của riêng tôi ). Bộ điều khiển của thẻ không có phép thuật hoặc bộ nhớ đệm nào có thể đánh lừa bài kiểm tra, theo đó một vài megabyte dữ liệu có thể được ghi vào phần cứng và đọc lại chính xác. Những bình luận khác của Jason dường như dựa trên việc đọc sai - IMO một ý định có chủ ý , đó là lý do tại sao tôi không bận tâm tranh luận. Với cái đầu đó, tôi để nó cho độc giả quyết định điều gì có ý nghĩa và điều gì không .]
1 Thẻ là thẻ Sandisk 4 GB cũ (không có số "hạng" trên đó) mà tôi hầu như không sử dụng. Một lần nữa, hãy nhớ rằng đây không phải là 2 triệu ghi vào cùng một vị trí vật lý; do cân bằng hao mòn, "khối đầu tiên" sẽ được bộ điều khiển di chuyển liên tục trong quá trình thử nghiệm, như thuật ngữ trạng thái, san bằng độ mòn.
/dev/sdb1
vs /dev/sdb
nó làm cho không có sự khác biệt cho chương trình của bạn, nhưng những gì không tạo sự khác biệt (như mô tả dưới đây) là tình trạng khối chưa sử dụng trên thiết bị của bạn chưa được biết rõ và mất tích trong thử nghiệm của bạn, và trừ khi bạn lấp đầy toàn bộ thiết bị (ví dụ /dev/sdb
) với dữ liệu đầu tiên, số lượng cân bằng hao mòn không gian phải làm việc là một biến số chính. Vì vậy, mặc dù thiết bị so với phân vùng không liên quan đến thử nghiệm của bạn, nhưng điều đó chủ yếu là hậu quả của thử nghiệm thiếu sót, vì sau khi điền đúng thiết bị với dữ liệu, mỗi phân vùng sẽ không phải là một tùy chọn khả dụng (trừ khi bạn định dạng sau).
badblocks
để hiển thị lỗi trang trên ổ đĩa flash (và cho rằng điều đó rất sai lệch). Chúng được xử lý bởi bộ điều khiển và ánh xạ tới không gian dự trữ khi được phát hiện. Bố cục vật lý của dữ liệu trên ổ đĩa không giống với bố cục vật lý mà bạn thấy khi thực hiện I / O, đó là cách cân bằng hao mòn duy trì độ trong suốt của nó. Không ai trong số này có thể nhìn thấy bạn trong I / O. Nhiều nhất, nếu ổ đĩa hỗ trợ SMART, bạn có thể nhận được một ít thông tin về lỗi và không gian dành riêng từ bộ điều khiển.