这可能更适合 UNIX 和 Linux,所以请告诉我。我想知道 Linux 中是否有一个文件系统可以承受(或设计为能够更好地处理)SSD/闪存介质的硬断开?一个好的亚军答案是建议一个文件系统挂载参数配置,通过适当的调整,可以为断开事件做好最好的准备。
为了使我的用例清晰,一个例子是删除安装SD 卡无需经过软件/操作系统卸载过程。谢谢!
答案1
这是一个令人恐惧的话题,有几种途径可供调查......我将介绍其中两个大途径。
请观看 ELC 2015 的此次演讲:嵌入式设备的文件系统注意事项。
文件系统
文件系统需要小心处理对磁盘的写入。例如,如果先扩展文件的长度,然后再写入数据,则可能会出现问题。这是一个很容易发生的问题,我今天刚刚查看了一个显示此问题的日志文件 - 系统意外断电:
00017ea0 6f 74 29 20 43 4d 44 20 28 20 20 20 63 64 20 2f |ot) CMD ( cd /|
00017eb0 20 26 26 20 72 75 6e 2d 70 61 72 74 73 20 2d 2d | && run-parts --|
00017ec0 72 65 70 6f 72 74 20 2f 65 74 63 2f 63 72 6f 6e |report /etc/cron|
00017ed0 2e 68 6f 75 72 6c 79 29 0a 00 00 00 00 00 00 00 |.hourly)........|
00017ee0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017ef0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fa0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fb0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fc0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fd0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fe0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017ff0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00018000 4d 61 72 20 31 30 20 31 35 3a 31 38 3a 33 34 20 |Mar 10 15:18:34 |
00018010 72 6f 6c 6c 79 20 72 73 79 73 6c 6f 67 64 3a 20 |rolly rsyslogd: |
00018020 5b 6f 72 69 67 69 6e 20 73 6f 66 74 77 61 72 65 |[origin software|
所以是的……文件系统必须能够处理此类事件。有商业产品可以提供断电恢复能力,但我不推荐。
当然,尽可能多地使用只读文件系统是一大优势 - 例如,将操作系统放在只读文件系统上,将配置(等等)放在读写文件系统上。这可能会帮助您从损坏中恢复并恢复服务。
此外,日志文件系统将通常会更好地处理此类事件,但不假设任何级别的保证...上面的日志文件位于ext4
具有日志记录的文件系统中。
存储介质
您提到 SD 卡是底层存储……这令人担忧。事实上,所有闪存都存在意外断电的问题。这是由于它们的工作方式 - 磨损均衡完全由存储控制器处理,因此它可以随时决定移动页面。
此外,对页面的写入通常包含一整套操作,并且没有保证/标准来规定它们发生的顺序。
- 检查是否有已擦除或新页面 - 必要时擦除一页
- 从旧页面读取数据
- 根据应用修改
write()
- 撰写新页面
- 重新链接逻辑到物理映射
有很多这样的故事,人们拔掉系统或存储设备的电源后发现“我的 128GB SSD 显示为 1GB“ 或者 ”我的 SD 卡不再起作用“, ETC...
引自 JEDEC 84-A441:(诚然指的是 eMMC,但可能相关)
重置卡(使用 CMD0、CMD15 或 e•MMC 的硬件重置)或电源故障将终止任何待处理或活动的编程操作。除非启用了可靠写入,否则这可能会使操作处理的部分或全部数据处于未知状态。主机有责任防止这种情况发生。
概括
不幸的是,实际上没有任何好的/可靠的步骤可以采取来促进“无需经过软件/操作系统卸载过程即可移除已安装的 SD 卡“并且不会遇到问题。
故事的寓意是 - 找到一种正确的方法来sync
确保unmount
文件系统数据是连续的,并且write()
当用户断开连接时没有任何正在进行的操作。
答案2
RFS——三星文件系统“强健文件系统”应该可以满足这一要求。
实际上,您应该能够使用任何日志文件系统或执行写时复制的系统(ext3、ext4 甚至 btrfs)。您面临的风险(适用于任何文件系统)是操作系统可能会缓冲信息,或者在您拔出磁盘时可能尚未完成写入 - 在这种情况下,任何未完成写入的信息都不会被存储(但现有数据不会被破坏,或者,如果被破坏,可以从日志中重放)。