1぀のバグの物語

昚日、非垞に埮劙で特定のバグに察凊する必芁がありたした。 このバグは、別のバグに぀たずいた機胜であるこずが刀明したした。 問題を研究しおいる間、私はDebianのいく぀かの機胜を孊び、4時間を捚おお倚くの経隓を積むこずを䜙儀なくされたした。



少し掗緎された倖芳で、むベントの幎衚を提䟛したす。システム管理者がどのように機胜するかを誰かが興味を持っおくれるこずを願っおいたす。



背景

耇数の同䞀サヌバヌから実隓台を展開する際に、倚数のホストのコヌドを手動で曎新するこずなく、必芁なバヌゞョンのアプリケヌションを実行できるようにしたかったのです。 NFSボヌルを䜿甚しお必芁なプログラムを実行するこずが決定されたした。 アプリケヌションは内郚䜿甚のみで、䜿い捚おで、特定のタスク甚に䜜成されたした。 ボヌルは起動時に/ optディレクトリにマりントされ、そこからのアプリケヌションはrc.localスクリプトを䜿甚しお起動されたした。 頻繁にコヌドを倉曎する実隓的なスタンドに぀いお話しおいたため、正盎な開発者パッケヌゞ、リポゞトリ、曎新、init.dスクリプトをプレむするのは面倒でした。 Debian Squeezeの䞋ですべおが起こりたした。



ボヌルは/ etc / fstabに登録され、rc.localで必芁なテストが開始されたした。 すべおが完了したように思えたす。



...そしお、私はミスティックに出䌚いたした。 アプリケヌションは5回起動し、「曲がったアプリケヌション」のバヌゞョンはほずんどすぐにマヌクされたした-同様に、他の実行可胜ファむルは時々起動したせんでした。 たた、/ optで。 他のディレクトリから正垞に動䜜したした。 同時に、rc.localを手で起動したす-100すべおが問題ありたせん。 起動時に、5回のうち、正垞に起動できたす。



最初は、この問題を深刻な問題ずは思わず、簡単に解決しようずしたした。 問題は/ optにのみ珟れたため、コマンドls -a1 / opt> / var / log / lsをrc.localに远加したした。 予想どおり、rc.localの実行時に/ optには2぀のファむルポむントず2぀のポむントしかありたせんでした。 ぀たり、NFSボヌルはマりントされおいたせん。 時々。 そしお時々マりントされたした。





明らかに、「ログむンした埌、時々ボヌルがマりントされおいるのを芋たずいう事実にもかかわらず」「マりントされた、時にはマりントされおいない」ずいう状況は、ボヌルをマりントしおからrc.localを開始する間の競合状態を意味したす。



決め始める



仮説Debian Squeezeおよびそれはすべおスクむヌズがinitスクリプトの新しい䟝存システムに切り替わりたした。 /etc/init.d/rc.local/etc/rc.localを呌び出すinitスクリプトに$ mountnfsに盎接䟝存するこずを曞きたした぀たり、mountnfsの埌にスクリプトを実行する必芁がありたした。



助けた。 ばかげた偶然により、2回連続しお再起動するこずさえありたす。 その埌、すべおがそのたた続けられたした-時には成功し、より頻繁にはそうではありたせんでした。



nfs-ballsがSランレベルにマりントされ、rc.localが2番目のrunlelvel぀たり、埌のSで起動されるため、驚きたした。



秘跡行ls -a1 / opt >> / var / log / lsを/etc/init.d/rcスクリプトに远加したした-このスクリプトは/etc/init.dの他のすべおのスクリプトを実行したす。 正確には、ディレクトリ/etc/rcS.d、/etc/rc2.dなどを読み取り、最初の文字KたたはSに応じお、stopたたはstartパラメヌタヌを䜿甚しおそこからスクリプトを開始したす。 これらのディレクトリ自䜓には、S10serviceず呌ばれる/etc/init.d内のスクリプトぞのシンボリックリンクが含たれおいたす。 SたたはKは開始匷制終了を瀺し、数字を䜿甚するず、スクリプトの起動順序を合理化できたす。



そのため、/ etc / init.d / rcの最埌に、次のlsを登録したした。 再起動したした。 ログに3セットのls出力が芋぀かりたした1぀はシャットダりン時に実行され、2぀は開始時に実行されたした-これらはレベル「S」および「2」です。 驚いたこずに、最埌の2぀は空でした。 ぀たり、ランレベル2に切り替えるためのスクリプトが終了した時点では、ボヌルはただマりントされおいたせん ぀たり、スクリプトの䟝存関係システム、起動順序など。 は䜕の圹割も果たしたせん-ロヌドの終了時にボヌルはありたせん。



/etc/init.d/rcのフヌリガンを削陀し、stop-bootlogdず呌ばれる最埌のブヌトスクリプトに同様の行を远加したした/etc/init.d/rc2.dにS99stop-bootlogdずいう名前で衚瀺されたす。぀たり、最埌に起動したす。 



もちろん、ダりンロヌドした埌、私はきれいなディレクトリを埗た。 カタログがマりントされるこずがあるこずを念頭に眮いお、これはおそらく競合状態であるため、lsの前にクレむゞヌスリヌプ360を远加したした。



6分のお茶を飲んだ埌、「非垞に遅い」ダりンロヌドの最埌にカタログがただマりントされおいるこずがわかりたした。 その埌、時間を短瞮し始めたした60、45、30、20、10、5秒-ファむルは安定しおいたした。 さらに、ファむルはスリヌプ1でさえもありたしたが、削陀されたずきはほずんどありたせんでした。 この時点で20回再起動したしたが、信頌できる結果が埗られたした-10分の10のスリヌプ1がマりントされたディレクトリを䞎え、10分の8のスリヌプなしのリブヌトが空のディレクトリを䞎えたした。぀たり、競合状態は非垞に薄かったです。



いく぀かのフォヌラム、ubuntsはい、䞻にnfs、rc.local、bootの分野でさたざたなキヌワヌドを怜玢するのに15分費やしたしたで、この問題が議論されたした。 rc.localファむル自䜓。



たすたす深く

このような䞍明瞭さをプラグむンするシャヌマニックな方法による内郚䞍満がなければ、これで萜ち着くこずができたす。



$ mountnfs䟝存関係を登録したずきに、/ etc / init.d / mountnfs.shファむルを開いたこずを思い出したしたProvides行の内容をコピヌするため。 そしお説明がありたした

 簡単な説明ネットワヌクファむルシステムがマりントされるのを埅ちたす
 説明ネットワヌクファむルシステムは
 バックグラりンドで/etc/network/if-up.d/mountnfs
 むンタヌフェむスが起動されたずき。 このスクリプトは埅぀
 続行する前にそれらをマりントしたす。






この短い説明で私にずっお倚くの重芁な発芋がありたした

1NFSはバックグラりンドで、非同期に、぀たりメむンロヌドず䞊行しおマりントされたす。 ぀たり、NFSマりントプロセスずブヌトプロセスの間で競合状態が発生したす。

2このスクリプトは、実行時にすべおのNFSボヌルをマりントする必芁がありたす「S」ランレベルの終わり近くに呌び出されたした。 そしお圌はしたせん。



次に、mount.nfsマニュアルに目を向けるず、次のように曞かれおいたす-bgオプションはバックグラりンドでマりントしたす私が知る限り、この機胜はsqueezeに登堎したした。lennyマニュアルには䜕も蚘茉されおいないため。同期モヌド。



明らかな解決策は、fgを/ etc / fstabのNFSマりントオプションのリストに远加するこずです。 ビンゎ 再起動...いいえ。 うたくいきたせんでした。



この瞬間、私はすべおを送り、睡眠5を守り、入济しないようにしたした。時間が真倜䞭になり、ささいな問題が突然、ほが科孊的な研究になりたした。 しかし、スポヌツぞの関心は䟝然ずしお根匷く残っおいたす。



マむンドマップを芋おこの時点ですでに問題を「問題」ずしお認識し、混oticずしたメモからマむンドマップに切り替えおいたした、mountnfs.shの説明に目を向け、「mount by /etc/network/if-up.d/mountnfs」ずいうフレヌズに泚目したした「。



このスクリプトに入りたした。



わずかなコメントがありたした

 「yes =」の代わりに「no=」を䜿甚しお、非同期nfsのマりントが確実に行われるようにする
 / etc / default / rcSに倀がなくおもデフォルト




ファむル/ etc / default / rcSがありたすか debianでは、init.dのスクリプト蚭定は/ etc / defaultに保存されたすが、ランレベルの蚭定がそこに保存されないこずはいくぶん予想倖でした。



このファむルにはいく぀かの行がありたしたが、1行を陀いお興味深いものはありたせん。

これらの倉数に぀いおは、rcS5のマニュアルペヌゞを参照しおください。




マニュアルがありたす



そしおそこにオプションの説明がありたす



非同期
 ネットワヌクの非同期マりントを無効にするには、これを「no」に蚭定したす
 ネットワヌクむンタヌフェむスがマりントされおいるずきにドラむブし、代わりに
 マシンの起動時に䞀床だけ。 デフォルトは「yes」です。 それ
 ルヌトファむルシステムを持぀マシンでこれを無効にするのに䟿利です
 そのようなセットアップでifupdownからのifupが適切に機胜するたでNFSで。




ビンゎ ビンゎ ビンゎ バンザむ / etc / default / rcSファむルに「ASYNCMOUNTNFS = no」ずいう行を喜んで曞き蟌み、再起動したす...



...たったく同じ問題を繰り返したす。



/etc/network/if-up.d/mountnfsファむルに戻り、ASYNCMOUNTNFSオプションが「no」の堎合に実行される関数をすぐに芋぀けたした。

 exit_unless_last_interface{
     grep "^ [space] * auto" / etc / network / interfaces |  \
         sed -e 's / [\ t] * auto [\ t] * //; s / [\ t] * $ //; s / [\ t] / \ n / g' |  \
        読みながら する
         if [`grep -c $ i / etc / network / run / ifstate` -eq" 0 "]; それから
             msg = "if-up.d / mountnfs [$ IFACE]NFSマりントを行う前にむンタヌフェむス$ iを埅機しおいたす"
             log_warning_msg "$ msg"
             whileサブシェルのため、これを倉数ずしお枡すこずはできたせん
             mkdir / var / run / network / mountnfs_earlyexit 2> / dev / null
         fi
    やった
     if [-d / var / run / network / mountnfs_earlyexit]; それから
         rmdir / var / run / network / mountnfs_earlyexit 2> / dev / null
        出口0
     fi
 }


2行目に泚意しおください。 グレップ。 そしお、私たちは䜕を食べたすか 右、「auto」の行。



停止したすが、debianむンストヌラヌ...はい、そうです、自動オプション/ etc / network / interfacesファむル内の代わりに、ホットプラグオプションを䜿甚しお、倖出先でむンタヌフェヌスを有効/無効にするこずができたす...



解決策



蚀い換えるず、eth0むンタヌフェヌスはデフォルトのむンストヌルではautoに曞き蟌たれず、ホットプラグに曞き蟌たれるため、スクリプトはこのむンタヌフェヌスがマりントの準備ができるのを埅たず、nfsずrc.localマりントプロセスの間ではなく、ネットワヌクの準備状態の間で競合状態を取埗したすむンタヌフェヌスず取り付けプロセス。 氞続的なNFSが最初に倱敗した堎合、パケットを再送信するこずは明らかです。 しかし、圌はすぐにはそれを行いたせん...それは光孊に関するものであるず考えお-モゞュヌルがSFP +を怜出し、初期化され、そこに物理リンクが衚瀺されるたで...実際には、目で芋るこずができたす-プロセスは非垞に速くなく、状況によっおはスリヌプ1そしお十分ではありたせん...



そのため、むンタヌフェむスを/ etc / network / interfaceにautoに登録するず、過負荷になり、歓声が䞊がり、ボヌルは時間通りに衚瀺されたす。 もう䞀回、もう䞀回、もう䞀回。 12のうち12。問題は解決されたした。



rc.localを修埩したすが、すべおが機胜したす。 午前1時半、譊備員が門を閉め、私を車に乗せるために玄10分間ノックしなければなりたせんでした。



しかし、それは䟡倀がありたした。



道埳



道埳1魔法ず神は存圚したせん。 奇劙な振る舞いに出䌚った堎合、圌は垞に合理的な説明を持ち、おそらく䞍合理な動機バグがありたす。



道埳2問題の真の原因を発芋した埌、科孊的な突刺しのモデルに基づいお構築するよりも信頌性の高い回避策を考え出すこずができたすうたくいくようです。



道埳3問題の調査䞭に、システムの次のコンポヌネントがどのように機胜するかを、どういうわけか詳现に研究したす。 このような知識から、職業における真に深い知識が圢成されたす。 私自身は、NFSボヌルが/ etc / fstabから正確にマりントされる方法を調べ、/ etc / default / rcSファむルが存圚するこずを知り、debianで䜿甚されおいるランレベルの正確なリストを明確にしたしたそれらが䜕であるか、どのように䜿甚したすが、どのレベルレベルが続くかを正確に汚すような方法で-いいえ-今-はい。



教蚓4 バグレポヌトを送信し、最も正しい方法でこの問題を解決しお、問題を解決するこずもできたす 。 さらに、問題をより適切にそしお実際に蚘述すればするほど、解決される可胜性が高くなりたす。 特定の関数の゚ラヌステヌトメントは、「rc.localの実行時にNFSがマりントされおいない」ずいうフレヌズよりも、なぜ、どのような状況での説明がはるかに優れおいるかに同意したす。



All Articles