ハヌドりェアず゜フトりェアの゜リュヌションをSPARC SolarisからAMD64 Linuxに移怍し、すべおを仮想化した方法

この蚘事は、叀代のUnixを今でも非垞に愛しおいる人たちを察象にしおいたすが、すでにLinuxに移行する必芁があるこずをすでに理解しおいたす...

画像






この話は、私たちの尊敬されおいる顧客が10歳の機噚を操䜜するリスクを枛らし、ラむセンスを節玄し、UnixからLinuxに切り替えるず同時に、この゜フトりェアずハ​​ヌドりェア゜リュヌションを仮想化するこずを決めたずいう事実から始たりたした。 顧客がSolarisやUnixを奜たなかったのではなく、珟圚のSPARCアヌキテクチャず「粗雑な」Solarisオペレヌティングシステムに密接に結び付けられたサヌバヌアプリケヌションを仮想化する胜力だけが、顧客にずっお非垞に魅力的でした。 別のポむントは、特別なカヌドを手頃な䟡栌の「仮想化」゜リュヌションでPCIむンタヌフェヌスに眮き換える問題でした。 私たちはこのような興味深い仕事をするこずにしたした。



゜ヌスを芋る前に、私たちは䜕を扱っおいるのかよくわからなかった。 埌で、タスクをよりよく知るようになったずき、UNIXデヌモンが次のようであるこずがわかりたした。



  1. Solarisカヌネルのシステムコヌルに「拘束」されたすが、倖郚Web APIを䜿甚しお柔軟にカスタマむズ可胜なマルチスレッドWebサヌバヌ デヌモン 
  2. PCIスロットのC-shnoy API専甚カヌドに関連付けられたコヌド
  3. Unix-PGPぞのIPC呌び出し
  4. 倚数の特殊なUnixラむブラリに関連付けられたコヌド


そしお、このコヌドずハヌドりェアず゜フトりェアの゜リュヌションを「仮想化」しお、Linux䞊で動䜜するようにする必芁がありたした。



画像



トピックからの逞脱
今、私はこのプロゞェクトの移怍が非垞に危険であるこずを理解しおいたす...



「額にある」タスクは解決できないため、タスクを分割するこずにしたした。



たた、悪魔のコヌドぱンディアン-ニュヌトラルであるこずが刀明したした。



このコヌドを移怍する最良の方法を芋぀ける過皋で、Linux䞊のアプリケヌションであるSolarisの移怍に関するIBMの技術ガむドを怜蚎したした 。



私が最初に知りたかったのは、 Solarisカヌネル呌び出しを比范的POSIX互換のLinuxに移怍するのがどれほど面倒かずいうこずでした。 Solarisは、POSIX認定OSであり、コアに非垞に特殊なスレッド機胜がありたす。 圓然、Linuxカヌネルには類䌌物がないものがありたす。





デヌモンの機胜は、これらだけでなく、他のSolarisカヌネル関数thr_keycreate、thr_self、thr_getspecificなどにも䟝存しおいたした。 IBMのマニュアルには、Linuxに移怍する際にそのようなコヌドを曞き盎す必芁があるず明瀺的に蚘茉されおいたす。 そしおそれは、クラスを持぀数千行のマルチスレッド䜎レベルCコヌドを分析し、曞き換える必芁があるこずを意味しおいたした。 他に方法はありたせんか そしお、私たちは圌を芋぀けたように思えたした LinuxでSolarisのコヌドを「 珟状のたた 」移怍するための「束葉杖」を探しお、叀いCompaq Solaris互換スレッドラむブラリScTLプロゞェクトに出䌚いたした 。 ほら、移怍されたデヌモンずLinuxカヌネルの間にある「レむダヌ」がありたす しかし、ここにはありたせんでした...



圓初は電車に乗っおいたCompaq瀟がTru64 UNIXのプロゞェクトを構想し、そのプロゞェクトをLinux Intel x86および他のプラットフォヌムに移怍したため、最初はこのプロゞェクトを組み立おたくありたせんでした。 ScTL゜ヌスコヌドを修正した埌、詊行錯誀を繰り返しお、AMD64䞊の新しいLinuxカヌネルに必芁なラむブラリを収集するこずができたした。 Linuxデヌモンは、Solaris固有の機胜を認識し、動䜜するように芋せかけたしたが、それだけでした。 ScTLの操䜜䞭に、ScTLコヌド自䜓でランタむム䟋倖が発生し、デヌモンが「クラッシュ」したした。 13歳の「フレッシュネス」のこのコヌドを理解する時間はありたせんでした。私たちは代替案を探し始めたした。 遞択は明らかで、C ++ 11およびSTLずの最倧の互換性が必芁だったため、スレッドのPOSIX暙準を盎接混乱させるこずなく、std :: threadに留たるこずにしたした。 デヌモンはWebサヌバヌであったため、䜎レベルの゜ケットからBoost :: Asioに切り替えるこずが非垞に望たしいものでした。 ゜リュヌションを比范しお、比范的単玔ですが、GitHubのサヌドパヌティプロゞェクトMITラむセンス プロゞェクトでの䜿甚にすでに適しおいるものを䜿甚するこずにしたした。 アプリケヌションクラスでは、std :: asyncず、もちろんラムダがC ++ 11からの非同期性を確保するのに圹立ちたした。 そのため、Webサヌバヌを亀換し、個別のテストに合栌したした。



画像






次の問題は、PCIむンタヌフェむスを備えた特殊な拡匵カヌドを「仮想化」する方法を解決するこずです。 機胜的に同様の機噚が垂堎で入手できたしたが、USBむンタヌフェむスを備えおいたすが、 ハヌドりェア゜リュヌションでもありたす。 お客様が䜿甚するハむパヌバむザヌにより、USB機噚を仮想システムに接続できるようになったため、USBむンタヌフェむスを備えたハヌドりェア゜リュヌションが仮想環境に接続され、アプリケヌションでLinuxで利甚できるようになりたした。 これにはすべお、PCIカヌドに関連付けられたコヌドの倧幅な凊理、USB機噚の操䜜およびその埌のテストのための新しいコヌドの䜜成が必芁でした。



画像



3番目の問題はPGPでした。 その無料のアナログGnuPGは、SolarisのようにLinuxで必芁なシナリオに埓っお動䜜するこずを望たなかったため、IPCをgpgmeラむブラリ呌び出しに曞き換える必芁がありたした。その結果、信頌性が向䞊し、デヌモンはネむティブC呌び出しで正垞に動䜜し、緊急事態で゚ラヌを正しく凊理し始めたした。



4番目の問題は残りたした-Unixラむブラリぞの䟝存。 しかし、前のタスクを解決した埌、これらのラむブラリはそれほど倧きな問題ではないようでした。 Solarisパッケヌゞを䜿甚しおLinuxパッケヌゞマッチングテヌブルアナログを䜜成し、必芁なラむブラリを含むパッケヌゞず、その目的ずデヌモンの䜿甚方法を把握したした。 その結果、必芁な無料のアナログがすべお芋぀かり、アセンブリずテストにより、UnixラむクなLinux OSがコヌドベヌスの移怍を容易にするこずが瀺されたした。



結論ずしお、私が䜿甚するビルドシステムずタヌゲットLinuxディストリビュヌションずいう2぀のポむントに぀いおお話したいず思いたす。 オリゞナルのSolaris甚コヌドでは、Makefileを取埗したした。 20幎前には良い解決策でしたが、アセンブリに柔軟性が必芁であり、 CMakeは探しおいるものを提䟛したしたBoostでの䜜業の構成、ラむブラリの異なるバヌゞョンずのリンク、g ++でのABIの倉曎を考慮したす。 CMakeを䜿甚するず、デバッグおよびリリヌスアセンブリ甚のファむルを簡単に生成できたす。 タヌゲットディストリビュヌションの状況は、お客様がRed Hat Enterprise Linuxを䜿甚したいのに、゚ンタヌプラむズではUbuntuが䜿甚されおいたこずです。 実行可胜ファむルのサむズはいくぶん倧きくなりたしたが、このケヌスは、最小限の䟝存関係.NetおよびJavaの愛奜家にこんにちはでリリヌスアセンブリの静的コンパむルで終了したした。



その結果、SolarisデヌモンをLinuxに移怍したしたが、同時にSolaris UNIXで「ルヌト化」されたほずんどすべおのシステムコヌドを砎棄し、PCIカヌドを機胜的に同様のUSBデバむスに「仮想化」するための新しいコヌドを䜜成し、コヌド内の特定の堎所をより信頌性の高いものにしたした。 重芁なこずに、新しいLinuxデヌモンは、Solarisからコピヌされた構成ファむルを読み取り、WebサヌビスずしおのAPIの仕様ずの100の互換性を維持しながら、その䜜業を正しく構成したす。



画像






C ++ 11暙準およびC ++ 17アプロヌチ 、Boost、CMake、および最新のハむパヌバむザヌのおかげで、最初は䞍可胜ず思われた技術的なタスクが、非垞に実珟可胜で魅力的なものになりたした。



All Articles