昨天我与某人就我在这里回答的逻辑和/或真实性进行了一场小辩论,vis.,在一个像样的 (GB+) 大小的 SD 卡上记录和维护 fs 元数据永远不会足够重要到佩戴该卡在合理的时间内(年和年)。反驳的要点似乎是我一定是错的,因为网上有很多关于人们磨损 SD 卡的故事。
由于我确实有带有 SD 卡的设备,其中包含 24/7 保留的 rw 根文件系统,因此我之前已经测试过这个前提,令我自己满意。我稍微调整了这个测试,重复了它(实际上是使用同一张卡)并在这里展示它。我的两个核心问题是:
我把问题放在这里而不是 SO 或 SuperUser 因为对第一部分的反对可能不得不断言我的测试并没有像我确定的那样真正写入卡,并且断言这需要一些linux 的特殊知识。
[也可能是 SD 卡使用某种智能缓冲或缓存,这样对同一位置的重复写入将被缓冲/缓存在不易磨损的地方。我在任何地方都没有发现任何迹象,但我在 SU 上询问了这一点]
测试背后的想法是向卡上的同一个小块写入数百万次。这远远超出了此类设备可以承受多少写入周期的任何说法,但假设磨损均衡是有效的,如果卡的大小合适,那么数百万次此类写入仍然无关紧要,因为“同一个块”会不是字面上的相同物理块。为此,我需要确保每次写入都真正刷新到硬件,并刷新到相同的明显位置。
为了刷新到硬件,我依赖于 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) { …Run Code Online (Sandbox Code Playgroud) 我有一系列失败/有时失败的 SD 卡。它们要么提供以下dmesg输出之一:
完全死掉的(不要在 处列出/dev/mmcblk0):
[ +0,000010] mmc0: error -110 whilst initializing SD card
[ +2,819983] mmc0: card never left busy state
Run Code Online (Sandbox Code Playgroud)
失败的(偶尔仍然可以安装):
[Jun16 06:28] mmc0: new high speed SDHC card at address 0001
[ +0,000339] mmcblk0: mmc0:0001 00000 3.68 GiB
[ +0,002835] mmcblk0: p1 p2 p3 p4
[ +10,256689] mmcblk0: timed out sending r/w cmd command, card status 0x900
[ +11,264358] mmcblk0: timed out sending r/w cmd command, card status 0x900
[ +0,000016] print_req_error: I/O …Run Code Online (Sandbox Code Playgroud) 我有一张 SanDisk Ultra Plus 64gb MicroSd XC 卡,我用它在树莓派 PI 上运行 ubuntu 服务器。
现在我必须格式化这张卡,但我无法成功。我尝试过很多事情,包括:

到目前为止我可以看出,该卡不处于只读模式+我不使用带有开关的适配器。
sd-card ×3
corruption ×1
debugging ×1
fdisk ×1
gparted ×1
hardware ×1
linux ×1
linux-kernel ×1