Выпуск отказоустойчивой Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы LittleFS 2.10

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ выпуск ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° LittleFS 2.10, Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΡƒΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму для встраиваСмых устройств ΠΈ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ². Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ файловая систСма Π±Ρ‹Π»Π° создана ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ ARM для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Mbed OS, Π½ΠΎ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Код Π€Π‘ написан Π½Π° языкС Π‘ΠΈ ΠΈ распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ BSD. Эталонная рСализация LittleFS поставляСтся Π² Π²ΠΈΠ΄Π΅ Π‘ΠΈ-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½Π° Π±Π°Π·Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ создан FUSE-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ обвязки для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языков программирования.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ LittleFS:

  • НизкиС трСбования ΠΊ рСсурсам ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² условиях ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠžΠ—Π£. Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ LittleFS ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ статичСски ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π±ΡƒΡ„Π΅Ρ€Ρ‹ (Π±Π΅Π· динамичСского выдСлСния памяти) ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ рСкурсивныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, благодаря Ρ‡Π΅ΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ потрСбляСмой ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΈ слуТСбных структур LittleFS Π½Π° Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»Π΅ всСгда остаётся постоянным, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ записываСтся Π² Π€Π‘ ΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.
  • БрСдства для выравнивания износа Flash-носитСлСй (wear leveling), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС Π±Π»ΠΎΠΊΠΎΠ² ΠΈ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ очистки Π±Π»ΠΎΠΊΠΎΠ² Π½Π° Flash-памяти, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ обСспСчиваСт Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ.
  • ΠžΡ‡Π΅Π½ΡŒ высокая ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΊ сбоям — Π€Π‘ рассматриваСт случайноС ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ (Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ питания) Π² качСствС ΡˆΡ‚Π°Ρ‚Π½ΠΎΠΉ ситуации ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π° дискС Π² цСлостном состоянии Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ цСлости ΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… примСняСтся ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ copy-on-write (COW), ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ измСнСния Π½Π΅ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π° ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² Π½ΠΎΠ²ΠΎΠ΅ мСсто.
  • ΠΡ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅, Π΄Π°ΠΆΠ΅ Π² случаС пропадания питания Π²ΠΎ врСмя ΠΈΡ… выполнСния. ИзмСнСния Ρ„Π°ΠΉΠ»Π° ΡΠ±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° диск Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Π²Ρ‹Π·ΠΎΠ²Π° sync ΠΈΠ»ΠΈ close. Рассогласования, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ опСрациями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ, Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ deorphan, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ всСму Π΄Π΅Ρ€Π΅Π²Ρƒ Π€Π‘ послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° POSIX-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² LittleFS прСдставлСно COW-списками CTZ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ слоТности O(1) ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈ O(nlogn) ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΎΠ² осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· сканированиС Π€Π‘ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Π² области фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°. Для упрощСния сканирования всС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ связанного списка, ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ всю Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму. Если ΠΏΡ€ΠΈ записи Π±Π»ΠΎΠΊΠ° опрСдСляСтся ошибка, Ρ‚ΠΎ выдСляСтся Π½ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ пСрСносятся Π² Π½Π΅Π³ΠΎ.

Π‘Ρ€Π΅Π΄ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π½ΠΎΠ²ΠΎΠΉ вСрсии LittleFS:

  • ΠŸΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½ ΠΊΠΎΠ΄ Ρ€Π°Π·Π±ΠΎΡ€Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π€Π‘ ΠΊ POSIX-систСмам ΠΈ оТиданиям ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² Ρ‚Π°ΠΊΠΈΡ… ситуациях, ΠΊΠ°ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ слэшСм, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° пустых ΠΏΡƒΡ‚Π΅ΠΉ ΠΈ навигация Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρƒ корня Π€Π‘.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π΄Π²Π° Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±Π»ΠΎΡ‡Π½Ρ‹Ρ… устройств ramcrc32bd ΠΈ ramrsbd, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΠΈ ошибок, совмСстимый с LittleFS. Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ Π² самой Π€Π‘ LittleFS отсутствуСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° опрСдСлСния ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΠΈ ошибок, ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ выносятся Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π±Π»ΠΎΡ‡Π½Ρ‹Ρ… устройств.
  • Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ lfs_mkdir Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΡ… слэшСй, Ρ‚.Π΅. Π²Ρ‹Π·ΠΎΠ² lfs_mkdir(«a/») Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ошибки.
  • Π’ функциях lfs_stat ΠΈ lfs_getattr Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выводится ошибка ΠΏΡ€ΠΈ использовании Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΡ… слэшСй, Ссли ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π² Π€Π‘ ΠΏΡƒΡ‚ΡŒ Π½Π΅ являСтся ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ.
  • ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° открытия Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ lfs_file_open Ρ„Π°ΠΉΠ»Π° с Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌ слСшСм Π² ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ошибкС LFS_ERR_NOTDIR, Ссли Ρ„Π°ΠΉΠ» Π½Π΅ являСтся ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ Π² Π€Π‘, LFS_ERR_ISDIR, Ссли имя ссылаСтся Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² Π€Π‘, ΠΈ LFS_O_CREAT, Ссли Ρ„Π°ΠΉΠ» Π½Π΅ сущСствуСт.
  • ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° обращСния Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρƒ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π€Π‘, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, lfs_stat(«/../a»), Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ошибки.
  • Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ пустого ΠΏΡƒΡ‚ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ являСтся синонимом обращСния ΠΊ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌΡƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ, Ρ‚.Π΅. Π²Ρ‹Π·ΠΎΠ² lfs_stat(«») ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ошибки.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru