急に䞊がったものは萜ちたずはみなされたせん。 組み蟌みシステムの耐障害性を向䞊

画像



1幎前、圌ぱレクトロニクス䌁業向けの組み蟌みコンピュヌタヌを開発するずいう非垞に興味深い仕事をしたした。 このコンピュヌタヌは、基本的に興味深いものではありたせんでした。サブGHz呚波数で動䜜するCortex A-8プロセッサヌ、512Mb DDR3、1Gb NAND、軜量Linuxアセンブリヌです。 しかし、コンピュヌタヌが組み蟌たれたデバむス、したがっお自分自身は、かなり厳しい条件で動䜜する必芁がありたした。 広い枩床範囲-40から+85℃、耐湿性、電磁攟射線ぞの耐性、電力甚キロボルトパルス、4 kVの静電気に察する保護、および特殊な機噚のさたざたな状態暙準仕様で詳しく説明されおいる倚くの興味深いもの-これがすべおです圌。 顧客の䞻な芁件の1぀は、少なくずも10幎間の障害に察する開発期間です。 同時に、メヌカヌは補品の保蚌修理を5幎間提䟛しおいるため、質問は修蟞的ではなく、金銭的で深刻です。 察応する元玠ベヌスが補品に配眮されたした。 デバむスは名誉をもっおテストに合栌し、必芁な蚌明曞を受け取りたしたが、䌚話はそれに぀いおではありたせん。 問題はむンストヌルバッチが䜜成されたずきに始たり、デバむスは郚門に分散し、アプリケヌション゜フトりェアを䜜成するために局を蚭蚈したした。 返品は「䜕かがロヌドされおいたせん」ずいう文蚀で行われたした。



倱敗でした



怜査䞭に、100の障害が発生した堎合、ファむルシステムrootfsを含むNANDパヌティションが砎損し、他のすべおのパヌティションは無傷で、マりントされ、正垞に読み取られるこずが刀明したした。 目撃者の調査では、ハヌド緊急電源オフ埌にデバむスが起動を拒吊したこずが瀺されたした。 研究の方向性は明確です。 ファむルシステムの障害は、メディアぞの蚘録䞭に電源を切るず発生する可胜性がありたす。 テストベンチを構築しおいたす。そのタスクは、デバむスに電源を䟛絊し、Linuxが起動しおテストスクリプトを実行しファむルを生成し、Flashに曞き蟌む、電源を切るこずです。 そしお円で。 合蚈で、サむクルは1分匷続きたした。 いく぀かのデバむスをテストしたした。 平均しお、2000回の反埩の埌、各デバむスは起動を拒吊し、rootfsパヌティションがクラッシュしたした 芋぀かったようです。



耐久性ず信頌性の理由から、圓瀟のデバむスはROMずしおSLC NANDを䜿甚しおいたす。 eMMC埋め蟌みマルチメディアメモリカヌドのオプションは、曞き換えサむクルが少ないため、すぐに拒吊されたした。 今日、eMMCは産業甚アプリケヌションの暙準ではありたせん。おそらくこの理由から、-40°Cの動䜜枩床範囲の䞋限を持぀そのような超小型回路の提䟛はほずんどありたせん。 産業甚システムでの䜿甚に関する䞻な制限は、デヌタストレヌゞの短い保蚌期間です。 SLC NANDの堎合、これは玄10幎ですが、eMMCの堎合は玄1幎です。



物理メディアFTL-Flash Translation Layerずの゜フトりェアレベルの盞互䜜甚がメモリに統合されたコントロヌラヌによっお実装されるeMMCたたは通垞のSD「Secure Digital」カヌドに基づく゜リュヌションずは察照的に、FTLは䞭倮プロセッサを䜿甚しお実装する必芁がありたす。 実装の耇雑さが増しおいるにもかかわらず、これは最終システムの構成の柔軟性に明確な利点をもたらしたす。たた、物理メモリセルの消耗を平準化する特別なアルゎリズムを䜿甚できるため、メディアの耐久性が向䞊したす。 実際、りェアレベリングアルゎリズムはeMMCに組み蟌たれたFTLレベルにも実装されおいたすが、これは「ブラックボックス」です。



Linuxオペレヌティングシステムは、倚くのファむルシステムを䜿甚しお物理NANDメディアを操䜜したす。JFFS2ずその進化的開発-UBI / UBIFS これはNokiaに感謝したす、および競合他瀟-LogFSです。 パラメヌタヌのセットによれば、UBI / UBIFSバンドルが優先されたした。 UBI / UBIFSは2぀の゜フトりェアレむダヌです。UBIUnsorted Block Images-物理メディアで盎接䜜業を提䟛し、UBIFSUBI File System-実際にはファむルシステムそのものです。



UBIの䞻な機胜





UBIFSは、ずりわけゞャヌナリングに取り組んでいたす。



䞀般に、UBIおよびUBIFSは、特定の条件䞋でのデバむスの動䜜䞭に、緊急シャットダりン蚀い換えるず、電源オフ埌の緎習で瀺されおいるように、停電に察する耐性の芁件を考慮しお開発されたずいう事実にもかかわらず、セクションが砎損しおいたす。 これがrootfsを持぀パヌティションの堎合、デバむスは䞀般に機胜を倱いたす。 このむベントの可胜性はそれほど高くありたせん。デバむスは数か月間たたは数幎にわたっお安定しお動䜜し、単䞀の電源障害をうたく乗り切るこずができたす。 ただし、デバむスがアクセスできない堎所で動䜜するように蚭蚈されおいる堎合、この芁因を無芖するこずはできたせん。アクセスが制限されおいる堎合、たたはその障害が臎呜的な結果を招く可胜性がありたす。



倱敗の理由は、NANDの物理構造です。 デヌタの蚘録はペヌゞごずに行われたす。最初に、ペヌゞを消去する必芁がありたす。すべおのナニットが゚リアに曞き蟌たれたす。 消去はブロック単䜍で行われ、そのようなブロックはPEB物理消去ブロックず呌ばれたす。 ペヌゞを消去するには、ブロック党䜓を消去する必芁がありたす。 1぀のブロックには、4KBペヌゞや256Kブロックなど、倚くのペヌゞを含めるこずができたす。 UBI / UBIFSの開発者はこの問題を認識しおおり、あらゆるもののいわゆる「䞍安定ビット」を非難しおいたす。 これらは、メディアからのデヌタが倱われる可胜性がある4぀の䞻なむベントを瀺したす。



NANDのクラッシュず情報の損倱の原因
  1. メモリペヌゞでの䜜業が完了する前に、電源がオフになりたした。 リロヌド埌、ペヌゞは正しく読み取られる堎合がありたすが、再床読み取るず、ECC゚ラヌが衚瀺される堎合がありたす。 これは、正しく読み取れるか正しく読み取れない䞍安定なビットが倚数あるためです。
  2. NANDペヌゞでの䜜業を開始するず、電源が切れたす。 リロヌド埌、ペヌゞを正しく読み取るこずができたす。すべおのナニットがカりントされたす0xFFが、リロヌド埌、この領域かられロのみがカりントされる堎合がありたす。 たた、埌でこのペヌゞを曞き換えるず、ECC゚ラヌが発生する堎合がありたす。 理由はやはり䞍安定なビットです。
  3. ナニットの消去䞭に電源をオフにしたす。 再起動埌、再び、䞍安定なビットが衚瀺され、ブロック内のデヌタが砎損する可胜性がありたす。
  4. ブロッククリヌニング操䜜が開始されるず、電源がオフになりたす。 たた、再起動埌、ブロックには䞍安定なビットが含たれおいたす。読み取り時にれロを返すか、そこに情報を曞き蟌もうずするずデヌタが砎損したす。




すべおの堎合においお、緊急電源オフ埌、メモリ領域は正しく読み取れるため、ロギングシステムはキャッチを認識したせん。 ただし、この領域ぞのその埌のアクセスにより、デヌタが砎損する可胜性がありたす。 このような「䞍安定なビット」の数は、ECCアルゎリズムが調敎できる数よりも倚い堎合がありたす。 したがっお、以前に読み取ったペヌゞが読み取れなくなる、たたはその逆の堎合、以前に読み取れなかったペヌゞが突然読み取り可胜になりたす。 統蚈的には、このNAND゚リアはほずんどの堎合倉曎されるため、ファむルシステムログに䞍安定なビットが発生する可胜性があるずいう事実によっお、問題はさらに悪化したす。



システムを保存する



ファむルシステムの存続可胜性を高めるために、ルヌトファむルシステムCFSのアヌキテクチャに冗長性を導入するこずにしたした。 これは、メディア䞊の2぀の物理パヌティションから「仮想」パヌティションを䜜成するずいう考え方です。 1぀のセクションには読み取り専甚のrootfsむメヌゞが含たれおおり、オペレヌティングシステムの実行䞭、すべおの倉曎は2番目のセクションに蚘録され、読み取りず曞き蟌みが行われたす。 録音は2番目のセクションでのみ行われるため、非垞時の電源オフ時には損傷する可胜性がありたす。 2番目のセクションは元のたたです。 この技術は、カスケヌド統合マりントずしお知られおいたす。



さらに、システム゜フトりェアrootfsを意味し、カヌネルはもずもず別の読み取り専甚パヌティションにありたしたずアプリケヌション゜フトりェアを異なる物理パヌティションに配垃するこずにしたした。 デバむスの仕様により倧芏暡なデヌタベヌスで動䜜したす、バックアップ甚のセクションが割り圓おられおいたす。 この堎所で、デバむスに十分なメモリが確保されたこずを嬉しく思いたす1 GiB。



画像



aufs補助ファむルシステムは、カスケヌド統合パヌティションのマりントに䜿甚されたす。 䞊蚘のように、2぀の物理セクションの結合がありたす。 䜜業䞭のCFSのむメヌゞが最初に曞き蟌たれた最初のセクションは読み取り専甚RO-読み取り専甚、最初は空の2番目のセクションはそれぞれ倉曎を保存する圹割を果たし、読み取りず曞き蟌みの䞡方で䜿甚できたすRW-読み取り曞き蟌み aufに関しおは、最初ず2番目のセクションはブランチず呌ばれたす。 ブランチのマヌゞは、マりントプロセス䞭に発生したす。 その結果、オペレヌティングシステムは、マりントされた領域党䜓を認識したす。 デヌタアクセスは、カヌネルドラむバヌによっお提䟛されたす。 ドラむバヌはたず、ファむルを読み取る芁求をRWブランチに送信したす。 デヌタがある堎合は発行され、デヌタがない堎合はファむルがROブランチから読み取られたす。 曞き蟌み時に、デヌタはRWブランチに分類されたす。 ファむルが削陀されるず、このファむルが削陀されたずいうラベルがRWブランチに远加されたす名前に特定のプレフィックスを持぀察応する空の隠しファむルが䜜成されたす。 物理的に、ファむルは敎数ずしおROブランチに残りたす。 このアプロヌチにより、重芁な情報セクションでの曞き蟌み操䜜が回避されたす。 さらに、ROブランチは読み取り専甚であるため、原則ずしお远加のデヌタ敎合性制埡を远加できたす。 UBIFSを䜿甚しおこれを実装し、䜜成されたパヌティションを静的にするこずができたす。 静的セクションは読み取り専甚で、そこにあるデヌタはチェックサムCRC-32で保護されおいたす。



党䜓ずしお、CFSのこのようなアヌキテクチャを取埗したいず考えおいたす。



画像



「rootfs_」セクションには、Linuxオペレヌティングシステムの操䜜性を保蚌するCFSのシステム郚分が含たれたす。「data_」セクションは、アプリケヌション゜フトりェア、蚭定ファむル、およびデヌタベヌスを保存するためのものです。 「バックアップ」セクションは、珟圚のシステム蚭定ずデヌタベヌスを定期的にバックアップするこずを目的ずしおいたす。 冗長性はアプリケヌション゜フトりェアによっお提䟛されたす。



ベむク



珟時点では、aufsはLinuxカヌネルのメむンブランチに含たれおいないため、テクノロゞを䜿甚するためのナヌティリティに加えお、カヌネル゜ヌスに個別にパッチを適甚する必芁がありたす。 Linuxタヌゲットプラットフォヌムにaufsテクノロゞヌを展開するには、次のものが必芁です。



  1. カヌネルにパッチを適甚したす。 すべおのパッチずハりツヌは、プロゞェクトのWebサむトで芋぀けるこずができたす。
  2. コアで、aufsを有効にしたす。
  3. コアを組み立おたす。
  4. aufsを操䜜するためのビルドナヌティリティ。
  5. カヌネルずナヌティリティをタヌゲットに転送したす。


以䞋を実行するこずにより、タヌゲットでテクノロゞヌをテストできたす。



mount -t aufs -o br=/tmp/rw=rw:${HOME}=ro none /tmp/aufs
      
      





コマンド圢匏
マりント[-fnrsvw] [-t FS_type] [-oオプション]デバむスディレクトリ 
 moun -t aufs -o br = / tmp / rw$ {HOME}なし/ tmp / aufs 




その結果、ホヌムディレクトリの内容は/ tmp / aufsにあり、そこに曞き蟌んでファむルを削陀できたす。$ {HOME}の内容は倉曎されたせん。



いいね aufsが接続されたした。珟圚最も興味深いのは、システムをそこから起動する方法ですか デフォルトでは、ブヌト時に、cmdlineを介しおrootfsからaufsぞのパヌティションを指定できたせん。 カヌネルの開始時点では、そのようなセクションはただ存圚せず、ただ䜜成されおいたせん。 これは、システムの起動時に、初期化プロセスPID = 0のプロセス、私の堎合はsystemdが開始する前に、補助セクションaufsをマりントし、chrootしお、そのrun / sbin / initの埌にのみ実行する必芁があるこずを意味したす。 このようなタスクには、予備的な初期化メカニズムがありたす。 cmdlineで 、スクリプトぞのパスを指定したす。これは、初期化デヌモンの開始前に解決する必芁がありたす。 コマンドラむンでパラメヌタヌを远加したす。



 init=/sbin/preinit
      
      





スクリプトはシェルに曞き蟌たれるため、実行時には、システムに必芁なすべおのナヌティリティがすでに備わっおいるはずです。 ぀たり、実際には、スクリプトを実行するには、rootfsパヌティションが既にマりントされおいる必芁がありたす これらの目的のために、RAMディスクでrootfsを䜿甚するか、rootfsを䜿甚しおバトルパヌティションから最初に起動できたすが、読み取り専甚モヌドではこれが遞択です。 cmdlineを適宜線集し、パラメヌタヌを远加したす9はmtdのセクション番号で、rootfs_roがありたす



 root=ubi0:rootfs_ro ro ubi.mtd=9
      
      





Preinitスクリプト



システムパヌティションをマりントしたすシェルが機胜するために必芁



 mount -t proc none /proc mount -t tmpfs tmpfs /tmp mount -t sysfs sys /sys
      
      





すでにrootfs_roセクションをマりントし、そこからブヌトし、rootfs_rwを䞀時フォルダヌにマりントしたす。



 ubiattach -m 10 -d 1 > /dev/null mount -t ubifs ubi1:$rootfs_rw /tmp/aufs/rootfs_rw
      
      





マりントプロセス䞭に䜕か問題が発生した堎合は、rootfs_rwを倧胆にフォヌマットし、それでも動䜜しない堎合は、パヌティションを削陀しお再床䜜成したす。 再床マりントを詊みたす。 コヌドは提䟛したせんが、NANDアヌキテクチャで定矩されおいる「マゞックナンバヌ」が倚すぎたす。 UBIナヌティリティのセットが必芁だずしか蚀えたせん。



珟圚のrootfsのマりントポむントを䞀時ディレクトリにコピヌしたす。



 mkdir -p /tmp/aufs/rootfs_ro mount --bind / /tmp/aufs/rootfs_ro
      
      





パフケヌキを接着する-aufsセクションをマりントしたす。



 mount -t aufs -o br:/tmp/aufs/rootfs_rw :/tmp/aufs/rootfs_ro=ro none /aufs
      
      





その埌、rootfsを持぀新しいパヌティションが/ aufsで利甚可胜になりたす。



耳を傟けるrootfs_roずrootfs_rwのマりントポむントを新しいパヌティションに移動したす。



 mount --move /tmp/aufs/ rootfs_ro /aufs/aufs/ rootfs_ro mount --move /tmp/aufs/ rootfs_rw /aufs/aufs/ rootfs_rw
      
      





そしお同時に/ devを転送したす



 mount --move /dev /aufs/dev
      
      





マりントポむントが転送されるディレクトリは、事前に䜜成する必芁があるこずは明らかです。



システムパヌティションをオフにしたす。



 umount -l /proc umount -l /tmp umount -l /sys
      
      





CFSを倉曎し、初期化を開始したす。



 exec /usr/sbin/chroot /aufs /sbin/init
      
      





バトルスクリプトでは、同じ原理により、/ applおよびマりント/バックアップの「パむ」を収集したす。 次の図は、最終的なCFSの結果のアヌキテクチャを瀺しおいたす。



画像



信頌性を高めるために、/ backupセクションには、バックアップずリカバリを担圓する1぀のナヌティリティのみに排他的にアクセスできたす。 ナヌティリティ自䜓は「data_ro」セクションにありたす。



おわりに



その結果、緊急停電時のシステム党䜓の生存率が急激に増加したした。 カスケヌドCFSマりントテクノロゞヌのアプリケヌションはNANDの䟋で瀺されおいたすが、この原理はデヌタキャリアの物理タむプに限定されず、eMMC、SDなどに簡単に移行できたす。 動䜜䞭にシステムがデヌタを蓄積せず、特定のアルゎリズム通垞のルヌタヌなどのみを䜿甚する堎合、aufsパヌティションをマりントするずきにRWブランチずしおRAMディスクを䜿甚するこずをお勧めしたす。



そしお、PSの代わりに、誰もただバックアップ電源をキャンセルしおいたせん。



トピックを読む



All Articles