Sphinx検索エンジン(sphinxsearch)は、高負荷および大規模なインデックスボリュームに非常にうまく対応できるシステムとして位置付けられています。 一般に、これは悪いことではありませんが、16コアプロセッサと256GBのRAMを備えたマシンが手元にない場合があります。 しかし、コアが1つだけの場合はどうでしょうか。 そして、メモリの量ではない場合は? そして、これがサーバーや平均的なPCでさえなく、一般的なSoCルーターであり、最速の「ストーン」からは遠く、どこに32 MBのRAMがあり、それでも他のプロセスやシステムと共有する必要がある場合 この場合、検索エンジンは起動しますか? 機能しますか? それは正当化されますか?
はい、離陸します。 はい、動作します。 はい、それは正当化されます。
背景私は1つの小さなトレーニングライブラリで働いています。 いいえ、これは.dllまたは.soファイルではありませんが、最も一般的なのは棚とたくさんの本、約3万の部屋です。 図書館は20年前でもありません。 かつては数ラックから始まり、数十冊の本しかなく、それらはすべてよく知られていました。 それから図書館は発展し始め、本はますます多くなりました。 古い部屋には彼らのための場所がなく、移動が行われました。 当時、私がそこで働き始めたとき、基金には約15,000冊の本(より公式には「ストレージユニット」)があり、すべての棚のすべての棚の全長は1キロに近づいていました。
しかし...いや、それは図書館ではありませんでした。 巨大なダンプでした!
あいまいな標識に関する本は、異なる棚に配置されました。 「公式の」ライブラリ管理システムは使用されず、すべてが「ひざまずき」に行われました。 私はこのダンプと「データベース」を継承しました。MSAccessファイルでは、すべてがすべて誇らしげに誇らしげに表されています(同じ成功で、Excelテーブルまたは単語のリストの形で存在することもできます-データベース」は、正規化やテーブル内のテーブル間の関係などの機能であり、少なくともそうではありませんでした)。 本を取り、読者は彼の姓と本の名前を裏打ち形式で書かなければなりませんでした。
「ベース」内の書籍の検索は、テーブルを開いてCtrl + Fを押すことで実行されました。
「ダンプ」での実際の本の検索...ああ、それが主な仕事でした。 直接検索、cho ...数か月の作業の後、特定の本をどこで探すべきか既に考えていましたが、これはプロセスを少しだけ加速しました。 結局、この無意味なレッスンは私を悩ませ、私は「すべて」のリメイクを始めました。
約1年後(ほとんどの場合、書籍の在庫に直接行きました)、すべての「ストレージユニット」に番号が付けられ、バーコードが装備され、特定の棚に結び付けられた、きちんとした基盤を得ました。 書籍の発行は、データベース内の書籍を検索して、どの棚にあったかを確認し、書籍番号(バーコードからスキャナーで)を読者の仮想カードに入力するだけになりました。 送信は再びバーコードのスキャンであり、その後、書籍はリーダーのカードから自動的に削除され、データベースは親切に特定の棚に置くことを申し出ます。 丸1日かかっていたレッスンに数分かかるようになりました。 やった!
次は? データベースを正規化しますか? はい、できました。
ああ! さて、MS Accessから「もっと無料の」ソフトウェアにドラッグしてください。 OK、完了、mysqlにドラッグアンドドロップします。 元のデータベースは影響を受けませんでした-ODBCドライバーをインストールし、内部テーブルを現在の外部テーブルに置き換えただけです。
読者が本を見つけるのを止めるものは何もありません! (これまでは誰も干渉していませんでした-しかし、これは.mdbデータベースのコピーを作成し、そこから機密データをリストや配布されたもののように削除し、それをアーカイブの形でそれを望んでいる人に配布することによって行われました。 ...)。 最もシンプルな検索フォームを備えた控えめなphpアプリケーションがデータベースに割り当てられました。今では、書籍を検索する必要さえありません:)。 読者は自分でそれらを見つけ、見つかった棚からそれを取り出して、コードをスキャンして手に入れるためだけに私に持って行きます。 作業ロボット、幸せな男!
費用はいくらですか? それでは、ベース、フォーム、検索-完全なLAMPSスタック(= LAMP + S [phinx])、すべてが外部IPを備えたホームデスクトップ上で回転しています。
信頼できない!
さて、手放します。 結局のところ、これは国の半分のリアルタイム取引サービスの銀行サイトではありません。
しかし、いまいましい、24時間年中無休のコンピューターは電気も消費します。 そして、それはノイズを作ります...そして、あなたがそれについて考えるならば、それから図書館サイトのほかに、それを絶えずそれを保ち続ける他の理由があります
ルーターを使用するとどうなりますか?
古いルーター(DI-624)の定期的なハングに完全に飽き飽きして、WRT-160NLに変更したときがきました。 私はインターネットを感じ、新機能の説明を検索しました...そして翌日、ストックファームウェアをdd-wrtに置き換えました。 外付けのhddであるshamanilを拾い上げ、控えめなNASファイルのウォッシュを行いました。 彼はインターネット上で大騒ぎし、オプトウェアについて読み、それを試してみました-そして、同じ外部hddで、ルーター自体のために追加のソフトウェアがすでに巻き上げられていました。 送信-お願い; lighttpd-簡単! php? 問題ありません! うーん...図書館サイトは離陸しますか? はい、離陸しました。 そして、もし彼のmysqlベースをルーターに直接入れたら? わあ、わかった! 確かに、mysqlビルドはかなり複雑です。 テーブルからのみMyISAM-しかし、それでも動作します!
検索はどうですか?
さて、これは出てきています-ルーター自体は現在トレントをダウンロードしています。 ファイルクリーニングとそれが提供するサイトさえも...足りない唯一のものはスフィンクス検索です。 デスクトップ上でまだ回転しています。 そして、彼がルーターに乗ったらどうなりますか?..
はい それが判明したように-それが開始しようとしている、それは動作します。 うまくいきます!
後にルーターをAsus RT-N16に変更し、現在はNetGear WNDR-4300に変更しました。 ファームウェアをdd-wrtからopenwrtに変更しました。 しかし、スフィンクスはまだ生き続けています。
ルーター用にソフトウェアを組み立てる方法は?
もちろん、コンソールとスクリプトを収集する機能があれば、さまざまな方法でプログラムを作成できます。 それらのいくつかは非常に頑固です。 ./configure && make && make installを使用して、debまたはrpmベースのディストリビューションのソースからプログラムをインストールする方法について説明します。アセンブルして、起動することもできます。 したがって、より文明化された方法が使用されます。 ルーター用の2つのビルド/公開システムを扱っていました。 それらについて説明します。
オプトウェア
サードパーティのファームウェア用の代替ソフトウェアの知識は、それから始まりました。
要するに、
optwareは/ optブランチに完全に集中しているソフトウェアです。 したがって、名前。 たとえば、optwareにインストールされたデーモンは/ opt / usr / sbinのどこかにあり、共有ライブラリは/ opt / usr / libにドロップされ、構成は/ opt / etcで待機し、起動スクリプトは/ opt / etcにスローされます。 /init.d。 ターゲットシステムに4 MBのフラッシュメモリしかない場合、誰もがファームウェアで詰まっている-それは問題ではありません! 別の場所から他の方法でマウント/オプトする必要があります-そして私たちはチョコレートの中にいます! オプトウェアをインストールして作業できます! この他の場所は、たとえば、外部フラッシュドライブ(既存のusbポートに挿入)です。 または、プログラムで制御できる状態(たとえば、電源、アクティビティ、出力用のステータスLED、入力用のwpsおよびリセットボタンなど)がルーター内のすべての接点に「膝上」ではんだ付けされたSDカードです。別のMK-指定された連絡先を必要な順序で「点滅」させ、SPIバスの動作を示し、「ボタンを押す」を読み取ります。SDカードはこれを理解しているため、その内容に文字通り「
LEDとボタンを通じて 」アクセスできます。 さて、またはSMBプロトコルを使用してWindowsを実行しているルーターにマウントされた外部ネットワークFSでさえもです。 確かに、この場合、サービスを完全にサービスできる小さなスタンドアロンコンピューターとしてのルーターの意味はなくなります。
Optwareはかつて無料のopenwrtファームウェアの開発の一部でしたが、後に独立したプロジェクトに分割されました。これは、Optwareが構築するパッケージが完全に独立しており、自給自足しているためです。 作業に必要な標準ライブラリ(uclibcの形式のlibc)もアセンブルされ、optwareに配置されます。 これにより、特定のデバイスのファームウェアの機能をほとんど心配することなく、多くのアプリケーションを実行できます。
このアプローチの欠点は、
すべてが機能するとは
限らないことです。 たとえば、この方法でカーネルモジュールをビルドして接続することはできません。 また、独自の標準ライブラリにバインドすることは、既存の標準ファームウェアライブラリとともにメモリにロードすることを意味します。これは、ルーターのRAMの要件が増えないことを意味します。 最後に、特定の鉄についてはシャープ化されていないアセンブリを取得しますが、「ユニバーサルアベレージルーター」のパッケージはi386のプログラムのようなものです(クールコアi7で同時に実行します)。特定のプロセッサ/プラットフォームの多くの機能は無視され、レガシーにロールバックされます。 それでも、optwareは完全に機能するソリューションです。
Optwareは通常、Linuxベースのホスト上のクロスコンパイラーによって構築されます(たとえば、ubuntu 12.04でコンパイルします)。 プロジェクトの
svnリポジトリを確認すると、ソースとREADMEファイルの両方をすぐに詳細な指示とともに受け取ります(興味のある人は誰でもどうぞ)。
Openwrt
これは完全に独立したファームウェアであり、元の在庫を完全に置き換えます。 ddwrt + optwareでは不十分であることが明らかになったとき、OpenWrtに連絡する必要がありました。 「スマートホーム」に関するKhabrovの記事を読んで、さまざまなホームエレクトリックを徐々に自動化することにしました。 私はz-waveを選び、「ホイッスル」を購入し、z-wave.meクラウドに参加しました。 ただし、ホームオートメーションをクラウドに接続するためにデスクトップをオンにしておくのは無駄です。 さらに、私のルーターには1つではなく、2つのUSBポート全体がありました。 しかし... ...は鳴りませんでした。 必要なカーネルモジュール(cp21xx)がファームウェアにありませんでした。 この種のソフトウェアをオプトウェアで構築することはできませんでした。 dd-wrtファームウェア全体を再構築することも完全に重要なタスクです(ひどいシステムです!ツールチェーンを設定し、すべての依存関係を満たし、ビルドを成功させるのに私の忍耐は十分ではありませんでした!)。 私のルーター(rt-n16)のOpenwrtは最初はサポートされていませんでしたが、その時点で、動作するファームウェアを作成できるパッチが既にありました。 だから私はdd-wrtに別れを告げ、「さらに無料の」ファームウェアを支持しました。
openwrtの良いところは何ですか? はい、
すべてが構成されているという事実によって。 オプトウェアの不利な点を見て、頭から追い出します。 重複するライブラリはありません(既存のファームウェアのソフトウェアを直接収集します)。 カーネルモジュールに問題はありません(通常の本格的なlinux。エキゾチックな「ホイッスル」が必要ですか?3Gモデムを取り付けてインターネットを利用したいですか?それは簡単です!)。 このソフトウェアは、既存のプラットフォーム向けに最適化できます(また、コンパイラーは、アセンブルするときに、ルーターのチップで特に使用可能な機能を使用し、レガシーにロールバックしません)。
最後に、openwrtは実際にはオプトウェアと矛盾しないと言っておく価値があります。 より柔軟で快適です。 ただし、/ optパーティションが以前のファームウェアから保存されている場合、そこで使用可能なソフトウェアは新しいopenwrtで正常に起動する可能性が高いでしょう。 何も組み立て直しません! (確かに、分離オプトウェアのすべての欠点は残ります)。
Embedded Sphinx-あなたはそれから何が必要ですか?
スフィンクスのスケーラビリティは印象的です! プロジェクトの「powered by」ページで成果を検討および評価するだけで十分です。 数十億のドキュメントのインデックス。 1日に5億件のリクエストを処理することは、かなり有効な数字です。 しかし、これはすべて、高速プロセッサと大量のRAMを備えた深刻なマシンまたはクラスターでさえも高負荷です。 他の方向のスケーラビリティについてはどうですか? メモリ不足、プロセッサとディスクがあいまいですか? それはそれほど悪くないことが判明しました。 非x86ネイティブプラットフォームでは、sphinxはRaspberry Pi上で非常に普通にビルド(および内部テストに合格)します。 ただし、詳細を考慮すると、
他のアーキテクチャに加えて、「Malinka」の他のすべてが非常に優れています。 最大256-512MBのRAM! そして、スフィンクスにはこれが必要です! 実際、彼の「成功の秘 "」のほとんどは、利用可能な鉄の使用を最大限にすることです。 彼は「640Kbですべての人に十分」という哲学に向けられているわけではありませんが、まったく逆です。 可能な限り「ファッショナブルな」構成に従って、その機能を最大限に活用するよう努めています。
メモリは安くなりましたか? インデックス全体を拒否して押し込みます!
印象的なアクセス時間を備えた新しい派手なSSDは、本番環境でファッショナブルになりましたか? さて、プレイしてみて、おそらく内部の戦略とフォーマットをもう一度シェイクしてください。
さらに、これは「新しい明るいパーセントがあるため、これら3つのギグラインをBASICで記述されたスクリプトのバブルでソートする余裕がある」というタイプの浪費ではありませんが、まったく逆です。 経験豊富な(ex)gamedev開発者によって実装され、ベンチマークによって検証された合理的な最適化。
そして、あるケーブルから別のケーブルにバイトを転送する方法しかわからない、前代の「アンダーコンピューター」と干渉する場所はどこにあるのでしょうか? まあ、実際には、なぜですか?
もちろん、クロスコンパイルが暗示されています(一部は、ネイティブツールチェーンをルーター上で直接ビルドして実行できます-しかし、私はこのアプローチの準備ができていません)。 クロスコンパイルはオートツールの多くの内部テスト(スフィンクスはそれらによって構成されます)がサイドラインに残ることを意味するため、鉄片に搭載されているものをツールチェーンに何らかの形で伝える必要があります。
そのため、スフィンクスを小さな鉄片で動かすには、まずターゲットプラットフォームの「ミニチュア」に関連するいくつかのポイントを考慮する必要があります。
メモリ要件を最適化する
RAMに対するスフィンクスの速度(または「スケール比」)を満たす方法は? ここではすべてが非常に簡単です。 Sphinxは「そのような」リソースを消費しません。 彼の「大食い」は、インデックスのタスクとボリュームに直接依存します。 ほとんどの場合、記憶の中の場所を占めるのは彼です。 したがって、インデックスが小さいほど、必要なメモリが少なくなります。
辞書(.spiファイル)および属性blob(.spa、.sps、.spmファイル)がRAMにロードされます。 これらのファイルのサイズを見積もると、将来の「大食い」のかなり正確な予測を行うことができます。
完全にタイトな場合は、属性を削除して、ディスク上の辞書オプションを有効にすることができます。 そうすると、すべてが遅くて悲しくなりますが、完全にディスク上にあります。 ただし、何も無効にすることはできず、スワップパーティションを接続するだけです。 それはメモリに収まります-「飛びます」。 収まらない場合は、自動的にスワップに入り、「ゆっくりと悲しいことに動作します!」というオプションが表示されます。
インデックスタイプ?
私はいつものものを取りました。 キーワードディクショナリを使用します(crcのみが既に古くなっています)。 データ自体をリアルタイムで変更する必要がないという理由だけで、RTは必要ありません。 定期的にインデックスを再作成するだけで十分です(はい、必要に応じてrtが急上昇します)。 これは、searchdデーモンだけでは不十分であり、インデクサーも必要であることを意味します。
データソースへのリンク?
他に何? 適切なデータソース(この場合はmysql)のサポートが必要です。 最近まで、このサポートでは、スフィンクス自体のアーキテクチャに関連する特定の「レーキ」がありました。つまり、「メガバイト」のlibsphinxと、ダイレクトインデクサー、searchdなどのツールを実装する小さなソースで構成されています。 同時に、インデックスを操作するためのほとんどすべての機能(データソースからの作成を含む)はlibsphinxにあります。 ソースサポートの「レーキ」は、mysqlサポートでスフィンクスを収集した後、共通のメガリバを介したすべてのスフィンクスバイナリがlibmysqlclientに依存することです。 深刻なマシンではこれは問題ではありませんが、ルーターでは「そのように」リンクされているライブラリに依存していますが、作業には絶対に必要ありません。無駄です。 2つのオプションがあります。2つのアセンブリを作成します。 1つはmysqlをサポートし、2つ目はまったくインデックスを作成しません。 最初からインデクサー、2番目から-その他すべて。 2番目のオプションは最近登場しました-必要なすべての外部ライブラリを明示的に(dlopen経由で)ロードするだけです。 この場合、不要な依存関係を忘れることができます。インデクサーは必要なときにライブラリをロードします。 searchdは彼女にまったく触れません。
悪魔を始めるには?
古典的な方法は、スフィンクス自体に実装されています。 これはダブルフォークです-最初にアクティブターミナルからフックを解除し、次に新しい作業セッションを作成します-そして今はバックグラウンドで動作し、コンソールはなく、ターミナルでCtrl + Cを押しても応答しません。 pidファイルにpidを書き込みます-これで、本格的な悪魔になりました。 すべては大丈夫のようですが、すべての悪魔はこれをシステムに実装する必要があります。 オープンソースシステムでコードを複製する理由 賢い人は考えて、考えて、やって来ました-デーモンになるために「実験」プロセスを必要とせず、単にバックグラウンドでそれを維持し、pidファイルを共通の場所に格納し、同時にデーモンを再起動する「番犬」を実装します突然の落下の結果。 ちなみに、このために一時的には、スタートアップを通じてスフィンクスを起動する際に問題が発生しました-2つのあまりにもスマートなプログラムはまだ同意できませんでした。 その結果、upstartの下からの正しいオプションは、オプション '--nodetach'で実行し、実行中のプロセス(およびそのフォークではない)を監視することです。 同時に、スフィンクスは自分自身を悪魔とは見なさず、すべてのバックグラウンド管理は新興企業に委ねられます)。
ただし、組み込みの場合、optware、openwrtが従来のrc.dスクリプトを使用する限り、upstartに問題はありません。 つまり、特別なフラグは必要ありません。 スフィンクスは彼自身の人生を支配します。
ログを保存する場所は?
最初に、スフィンクスは、すべてのリクエストの個別のログと同様に、悪魔の共通のログ(fell-got-rotated)を保持します。 ルーターのフラッシュメモリに何かを書き込むことは、サイズを制御しなくても自殺のようになることは明らかです。 したがって、構成ファイルで「syslog」をログとして指定し、アセンブリの構成時に--with-syslogを追加することも忘れないでください(ただし、既定で既に有効になっています)。 その結果、すべての出力がシステムログに書き込まれます。これにより、ルーター自体のシステムレベルで既に操作が行われます。 そして、ファームウェアの機能に応じて、いくつかのオプションがあります。 一部の(非常に小さなフラッシュを備えた古いDIR-300など)では、ログをまったく保持しない方が簡単です。 その他の場合、ピースはメモリ内のリングバッファに直接格納され、logreadコマンドを使用してコンソールから読み取ることができます。 3つ目は、udpを介してLAN内のサーバーにリダイレクトされます。 しかし、いずれにせよ-これはもはやスフィンクスの問題ではありません!
構成可能および収集!
ルーター上のデーモンの動作に関するすべての質問は解決されたようです。 今が構築の時です!
チートオートツール
Sphinxはautotoolsを使用して構成されます。 ./configure-アセンブリの前に実行されるスクリプトは、アセンブリシステムを正直にアイロン掛けし、使用しているコンパイラ、サポートされている機能、アーキテクチャ、バイトオーダー(LSBまたはMSB)を見つけます。 問題は、これらのテストのほとんどすべてがターゲットルーターではなく、ツールチェーンを実行するシステムに影響することです。 したがって、1つの方法しかありません。構成の「正解」を促す方法です。 これは環境変数を使用して行われます。 たとえば、。/ configureがqsort関数の可用性をチェックする場合、。/ configureを実行する前にac_cv_func_qsort変数を定義することにより、必要な「ヒント」を与えることができます。 たとえば、アセンブルする前に
export ac_cv_func_qsort=no
実行すると、qsort関数がないと想定されます。 したがって、この方法で構成されたパッケージは、独自の実装を使用するか、アセンブリ中に破損することさえあります(ハハ!)。
埋め込みスフィンクスの「明示的なヒント」を作成するために必要なものはほとんどありません。 ここにあります...
- sphinx_cv_unaligned_ram_access (yes / no)-名前はそれ自身を表しています。 要するに、スフィンクスインデックスの内部形式は圧縮され、1バイトで整列されます。 そのようなファイル(メモリにロードされた)からDWORDを突然取得する必要があり、それが奇数アドレスにある場合-一部のアーキテクチャ(たとえば、sparc)では、これはクラッシュにつながります! ターゲットプラットフォームのデータシートを読むことで状況を認識できます。 または「科学的な突っ込み」の方法-可能なすべての(2つまで!)オプションを収集し、ターゲットシステムで実行しようとします。 (技術的な詳細:アライメントされていないアクセスが不可能な場合、希望するポインターからDWORDを取得する代わりに、memcpy呼び出しを使用して任意のアドレスから希望する4バイトをコピーします)。 実際には-私のミップ(el)で整列していない作品。
- sphinx_cv_interlocked (yes / no)-「レガシーi386」でのアセンブリコストのみ。 たとえば、dd-wrtのoptwareでは、「no」を設定する必要があります。そうしないと、アセンブリが失敗します。 より調整されたopenwrtアセンブリでは、同じフラグをチェックしないままにすることができます。 デフォルトの「yes」は完全に機能するバージョンを提供します。 (技術的な詳細:内部のフラグに応じて、アトミックロックフリー操作__sync_fetch_and_addが使用されるか、変数+ミューテックスからの構造体が同じ作業を行いますが、既にロックされています)
- ac_cv_c_bigendian (yes / no)は最も面白い変数です。 インデックスを「外部に」どこにも公開しない場合-この変数は無視できます。 悪魔がブロブを内部にどのように格納するか-関係ありません 主なことは、リクエストに正しく応答することです。 また、ネットワークを介した通信は、予想どおり、hton / ntoh呼び出しなどが提供されているため、エンディアンの影響を受けません。 ただし、たとえば、デスクトップにインデックスを作成し、「Schaub working」ルーターにドロップしようとすると、すぐに違いが現れます。 つまり、別のエンディアンでインデックスをロードすることは現在不可能です。 原則として、問題を修正することはできますが、あまり意味はありません(プラットフォーム間でインデックスをロードする「大勢のユーザー」がいない限り)。 インデックスの違いは、表示用に.sphファイルを開くことで簡単に確認できます(ダンプで直接、mcのF3)。 リトルエンディアンプラットフォームで作成されたインデックスのタイトルには、マジックシグネチャ「SPHX」が表示されます。 ビッグエンディアン-「XHPS」。
ターゲットの正しい値を見つける方法はいくつかあります。 第一に、すでに言及した「科学的タイク」。 実行時チェックはスフィンクスに組み込まれており、実際の機能がコンパイル時に指定された機能と一致しない場合、正しい値を丁寧に呪い、伝えます。 次に、fileコマンドを使用して、組み立てられたbinarの特性を確認できます(暗黙的に-ubuntuのmcのファイルでF3を押す)。 そこで「ELF 32ビットMSB実行可能ファイル」を見たことで、ビッグエンディアンを扱っていることがわかりました。 また、「ELF 32ビットLSB実行可能ファイル」はリトルエンディアンについて説明しています。 この場合、ラッキーです-デスクトップでインデックスを作成できます:)。 最後に、3番目の最も簡単な方法は、コンパイラの名前を調べることです。 「mips」はビッグエンディアン、「mipsel」はリトルエンディアンです。 aot lemmatizer(stemmer = lemmatize_aot_ru、lemmatize_aot_en、lemmatize_aot_deまたはすべて一緒に構成に含まれる)を使用する場合は、正しいエンディアネスが重要です。 Aot辞書Blobは、リトルエンディアンを備えた「通常の」PC上で作成されるため、「敵」アーキテクチャ上で変換する必要があります(起動時にオンザフライで行われますが、このエンディアネスは設定中に正しく設定する必要があります)。 - ac_cv_func_realloc_0_nonnull = yes
- ac_cv_func_malloc_0_nonnull = yes-完全を期すために言及します。 「Bzik」オートツールはスフィンクスでは使用されません。 しかし、それらがなければ、アセンブリはエラーを生成し、直接グーグルがそのような「プラグ」ソリューションにつながります。
はい、ところで-前述の変数(命名スタイル、「正しい答え」を促す方法)は、ご存じのとおり、スフィンクスの純粋な機能ではなく、オートツールのプロパティです。 autotoolsを使用して記述された他のソフトウェアを設定するときに、答えを「プロンプト」することができるのとまったく同じ方法です。
オプトウェアのスフィンクス
ターゲットプラットフォーム(私はddwrt用にビルドした)のフォルダーで、makeフォルダーに移動し、template.mkをsphinxsearch.mkにコピーします。 次に、ファイル自体の指示に従って、結果のコピーを編集します。 実際、これは、ソフトウェアをオプトウェアに追加するために必要な(そしてしばしば十分な)唯一のスクリプトです。 メインアセンブリを構成するこのスクリプトの重要な部分を次に示します。
(SPHINXSEARCH_BUILD_DIR)/.configured: sphinxsearch-source make/sphinxsearch.mk $(MAKE) libstdc++-stage $(MAKE) expat-stage $(MAKE) mysql5-stage rm -rf $(BUILD_DIR)/$(SPHINXSEARCH_DIR) $(@D) $(SPHINXSEARCH_UNZIP) $(DL_DIR)/$(SPHINXSEARCH_SOURCE) | tar -C $(BUILD_DIR) -xvf - $(LIBSTEMMER_UNZIP) $(DL_DIR)/$(LIBSTEMMER_SOURCE) | tar -C $(BUILD_DIR)/$(SPHINXSEARCH_DIR) -xvf - if test -n "$(SPHINXSEARCH_PATCHES)" ; \ then cat $(SPHINXSEARCH_PATCHES) | \ patch -d $(BUILD_DIR)/$(SPHINXSEARCH_DIR) -p0 ; \ fi if test "$(BUILD_DIR)/$(SPHINXSEARCH_DIR)" != "$(@D)" ; \ then mv $(BUILD_DIR)/$(SPHINXSEARCH_DIR) $(@D) ; \ fi (cd $(@D); \ export ac_cv_func_realloc_0_nonnull=yes; \ export ac_cv_func_malloc_0_nonnull=yes; \ export sphinx_cv_unaligned_ram_access=yes; \ export ac_cv_c_bigendian=no; \ export sphinx_cv_interlocked=no; \ $(TARGET_CONFIGURE_OPTS) \ CPPFLAGS="$(STAGING_CPPFLAGS) $(SPHINXSEARCH_CPPFLAGS)" \ LDFLAGS="$(STAGING_LDFLAGS) $(SPHINXSEARCH_LDFLAGS)" \ ./configure \ --build=$(GNU_HOST_NAME) \ --host=$(GNU_TARGET_NAME) \ --target=$(GNU_TARGET_NAME) \ --prefix=/opt \ --sysconfdir=/opt/etc/sphinxsearch \ --with-libstemmer \ --with-mysql=$(STAGING_PREFIX) \ --without-unixodbc \ --with-syslog \ --enable-dl \ ) touch $@
アセンブリの残りの部分は簡単です(メイク、ストリップ、パッケージング)。 スフィンクスのソースに加えて、libstemmerのソースも必要です(アセンブリ中にサイトから直接プルされます)。 また、コンパイルされたexpatとmysqlが必要です(依存している限り、これらは依存関係としてビルドされます)。 メインのメイクファイル(./makeにあります)に加えて、フォルダー./sources/sphinxsearchもoptwareソースのフォルダー構造で使用されます。 これには、デーモン用のinitスクリプトが含まれています。これはパッケージにパッケージ化され、インストール中は/opt/etc/init.dに格納されます。 アセンブリはルートフォルダーから実行され、特定のサフィックスがパッケージ名に追加されます。
- make sphinxsearch-クロスツールチェーンでスフィンクスを収集します。 デバッグに役立ちます。
- make sphinxsearch-ipk -sphinxを収集してから.ipkパッケージを作成します
- make sphinxsearch-clean-ガベージを削除します(アセンブリ後)。
接尾辞-ipkを使用したアセンブリの結果、「すぐに使用できる」パッケージsphinxsearch.ipkが取得されます。これは、ipkgを使用してoptwareにインストールします。 その後、すべてが通常通りです-設定を作成し、インデックスを作成します(dd-wrtがデフォルトのLSBである限り、デスクトップでインデックスを作成できます)-そして離陸します。 出来上がり! 必要に応じて、mysqlへの依存関係を削除できます(完全な構成のSPHINXSEARCH_DEPENDSディレクティブを参照)-デーモン自体を起動するためにこのライブラリが必要でない限り(そして、側でインデックスを作成する場合、ルーターではまったく必要ありません)。 上記のスクリプトのac_cv_ ...およびsphinx_cv_ ...変数をわずかに修正する必要がある場合があります。これらはdd-wrtのオプトウェアビルドに基づいています(これはミプセルアーキテクチャ、つまりリトルエンディアンであり、同時にチップ機能のセットはレガシーに縮小されます)
Openwrtのスフィンクス
ターゲットopenwrtがmips上にある場合、optwrwareはddwrtから起動できません(mipselがあります)。 mipselでもある場合は、optwareからsphinxを実行できますが、この場合、openwrtの完全なオープン性を使用して、ターゲットシステム専用のアセンブリを作成する方がはるかに正当化されます。これにより、従来の制限がなくなり、より最適なコードが取得されます。標準ライブラリの別の「わずかに異なる」インスタンスをメモリにロードしません。
Openwrtは、ビルドにmakeスクリプトも使用します。形式と場所のみが異なります。 必要なファイルは、アセンブリ環境のルートからパッケージツリーのどこかに作成された別のフォルダーに配置されます。 たとえば、パッケージ/ネットワーク/サービス/スフィンクスを選択しました。 Makefileは、指定されたフォルダーに最低限必要です。また、定義済みの名前を持つ他のファイルおよびフォルダーが存在する場合があります。 Makefileに加えて、Config.in(メインmenuconfigでサブメニューを作成します)、およびサンプルのconfigおよびinitスクリプトが置かれているファイル/フォルダーも使用します(ところで、optwareよりもはるかに短い)。 openwrtの構成の重要な部分は次のようになります。
CONFIGURE_VARS += \ ac_cv_func_realloc_0_nonnull=yes \ ac_cv_func_malloc_0_nunnul=yes \ ac_cv_c_bigendian=yes \ sphinx_cv_unaligned_ram_access=yes CONFIGURE_ARGS += \ --prefix=/ \ --sysconfdir=/etc/sphinx \ $(if $(CONFIG_SPHINX_MYSQL_SUPPORT),--with-mysql,--without-mysql) \ $(if $(CONFIG_SPHINX_PGSQL_SUPPORT),--with-pgsql,--without-pgsql) \ $(if $(CONFIG_SPHINX_UNIXODBC_SUPPORT),--with-unixodbc,--without-unixodbc) \ $(if $(CONFIG_SPHINX_EXPAT_SUPPORT),--with-libexpat,--without-libexpat) \ $(if $(CONFIG_SPHINX_DYNAMIC_LOAD),--enable-dl,,) \ --with-syslog \ --with-libstemmer
視覚的にもオプトウェアよりも短くなっています(スクリプト全体も大幅に短くなっています-84行のみで、そのほとんどがテンプレートです)。 これには、メニューから設定される変数が含まれます。 このバージョンでは、必要に応じてac_cv_c_bigendianを修正する必要がある場合があります(MIPS、つまりビッグエンディアンであるNetGear WNDR4300ルーターを構築しました)。 このバージョンでも、アセンブリ中にlibstemmerを個別にロードしませんでした。 代わりに、事前に自分でダウンロードして、ソースとともにtarballにパックする必要があります(そして、PKG_MD5SUMを受け取ったtarballが持つものに修正します)。
openwrtでのパッケージのビルドは2段階のプロセスです。 まず、ルートフォルダーでmenuconfigを実行し、ファームウェア全体を構成します。 そこで、ネットワーク/ Webサーバー/プロキシセクションに移動する必要があります-すでにそこにモジュール(M)としてsphinxを選択してください。 ここで、構成サブメニューに移動し、必要なデータソースをサポートするアセンブリを配置できます。 次に、menuconfigを終了し、変更を保存します。最後に、ファームウェア全体のアセンブリを開始します。
作るまたは1つだけのスフィンクス(当然、必要に応じて依存関係あり)
パッケージ化/ネットワーク/サービス/ sphinx /コンパイル受信したパッケージは、フォルダー./bin/ARCH/packages(私の場合は./bin/ar71xx/packages)に追加されます。 パッケージを検索してルーターにコピーする(そしてopkgを設定する)か、ローカルWebサーバーでアセンブリフォルダーを公開し、ルーターの/etc/opkg.confにパスを書き込んでからopkg updateすることで、パッケージを直接インストールできます。 opkg install sphinx。
ルーターでインデックスを作成するために、mysqlクライアントライブラリを個別にインストールする必要がある場合があります(必要なライブラリの動的ロードを使用する構成の場合、インストールによっては規定しませんでした)。 それでも-手動でシンボリックリンクを作成します(libがあるフォルダーでln -s libmysqlclient.so.16.0.0 libmysqlclient.soコマンドを使用)。 それ以外の場合は、すべてがそのまま使用できます。 私のアプリケーションはsphinxqlプロトコルに従ってスフィンクスを使用します(つまり、同じlibmysqlclientはsphinxがmysqlのインデックスを作成するためだけでなく、クライアントもスフィンクス自体と連携するために使用されます)クライアントアプリケーション)も非常に機能的です。
最後に-構成とスクリプト。
オプトウェアの場合:
アセンブリスクリプトsphinxsearch.mkファイルに配置され、optwareプラットフォームのmakeフォルダーに配置されます
########################################################### # # sphinxsearch # ########################################################### # You must replace "sphinxsearch" and "SPHINXSEARCH" with the lower case name and # upper case name of your new package. Some places below will say # "Do not change this" - that does not include this global change, # which must always be done to ensure we have unique names. # # SPHINXSEARCH_VERSION, SPHINXSEARCH_SITE and SPHINXSEARCH_SOURCE define # the upstream location of the source code for the package. # SPHINXSEARCH_DIR is the directory which is created when the source # archive is unpacked. # SPHINXSEARCH_UNZIP is the command used to unzip the source. # It is usually "zcat" (for .gz) or "bzcat" (for .bz2) # # You should change all these variables to suit your package. # Please make sure that you add a description, and that you # list all your packages' dependencies, seperated by commas. # # If you list yourself as MAINTAINER, please give a valid email # address, and indicate your irc nick if it cannot be easily deduced # from your name or email address. If you leave MAINTAINER set to # "NSLU2 Linux" other developers will feel free to edit. # http://sphinxsearch.com/files/sphinx-2.0.5-release.tar.gz #SPHINXSEARCH_SITE=http://sphinxsearch.com/files SPHINXSEARCH_SITE=http://192.168.1.5:65080/r/sphinxsearch SPHINXSEARCH_VERSION=2.2.2-4470 SPHINXSEARCH_SOURCE=sphinx-$(SPHINXSEARCH_VERSION).tar.gz SPHINXSEARCH_DIR=sphinx-$(SPHINXSEARCH_VERSION) SPHINXSEARCH_UNZIP=zcat SPHINXSEARCH_MAINTAINER=NSLU2 Linux <nslu2-linux@yahoogroups.com> SPHINXSEARCH_DESCRIPTION=Sphinx is free open-source SQL full-text search engine. SPHINXSEARCH_SECTION=misc SPHINXSEARCH_PRIORITY=optional SPHINXSEARCH_DEPENDS=libstdc++, expat, mysql5 SPHINXSEARCH_SUGGESTS= SPHINXSEARCH_CONFLICTS= LIBSTEMMER_SITE=http://snowball.tartarus.org/dist LIBSTEMMER_SOURCE=libstemmer_c.tgz LIBSTEMMER_UNZIP=zcat # # SPHINXSEARCH_IPK_VERSION should be incremented when the ipk changes. # SPHINXSEARCH_IPK_VERSION=2 # # SPHINXSEARCH_CONFFILES should be a list of user-editable files SPHINXSEARCH_CONFFILES=/opt/etc/sphinxsearch/sphinx.conf # # SPHINXSEARCH_PATCHES should list any patches, in the the order in # which they should be applied to the source code. # #SPHINXSEARCH_PATCHES=$(SPHINXSEARCH_SOURCE_DIR)/configure.patch SPHINXSEARCH_PATCHES= # # If the compilation of the package requires additional # compilation or linking flags, then list them here. # SPHINXSEARCH_CPPFLAGS= SPHINXSEARCH_LDFLAGS= # # SPHINXSEARCH_BUILD_DIR is the directory in which the build is done. # SPHINXSEARCH_SOURCE_DIR is the directory which holds all the # patches and ipkg control files. # SPHINXSEARCH_IPK_DIR is the directory in which the ipk is built. # SPHINXSEARCH_IPK is the name of the resulting ipk files. # # You should not change any of these variables. # SPHINXSEARCH_BUILD_DIR=$(BUILD_DIR)/sphinxsearch SPHINXSEARCH_SOURCE_DIR=$(SOURCE_DIR)/sphinxsearch SPHINXSEARCH_IPK_DIR=$(BUILD_DIR)/sphinxsearch-$(SPHINXSEARCH_VERSION)-ipk SPHINXSEARCH_IPK=$(BUILD_DIR)/sphinxsearch_$(SPHINXSEARCH_VERSION)-$(SPHINXSEARCH_IPK_VERSION)_$(TARGET_ARCH).ipk .PHONY: sphinxsearch-source sphinxsearch-unpack sphinxsearch sphinxsearch-stage sphinxsearch-ipk sphinxsearch-clean sphinxsearch-dirclean sphinxsearch-check # # This is the dependency on the source code. If the source is missing, # then it will be fetched from the site using wget. # $(DL_DIR)/$(SPHINXSEARCH_SOURCE): $(WGET) -P $(@D) $(SPHINXSEARCH_SITE)/$(@F) || \ $(WGET) -P $(@D) $(SOURCES_NLO_SITE)/$(@F) $(DL_DIR)/$(LIBSTEMMER_SOURCE): $(WGET) -P $(@D) $(LIBSTEMMER_SITE)/$(@F) || \ $(WGET) -P $(@D) $(SOURCES_NLO_SITE)/$(@F) # # The source code depends on it existing within the download directory. # This target will be called by the top level Makefile to download the # source code's archive (.tar.gz, .bz2, etc.) # sphinxsearch-source: $(DL_DIR)/$(SPHINXSEARCH_SOURCE) $(DL_DIR)/$(LIBSTEMMER_SOURCE) $(SPHINXSEARCH_PATCHES) # # This target unpacks the source code in the build directory. # If the source archive is not .tar.gz or .tar.bz2, then you will need # to change the commands here. Patches to the source code are also # applied in this target as required. # # This target also configures the build within the build directory. # Flags such as LDFLAGS and CPPFLAGS should be passed into configure # and NOT $(MAKE) below. Passing it to configure causes configure to # correctly BUILD the Makefile with the right paths, where passing it # to Make causes it to override the default search paths of the compiler. # # If the compilation of the package requires other packages to be staged # first, then do that first (eg "$(MAKE) <bar>-stage <baz>-stage"). # # If the package uses GNU libtool, you should invoke $(PATCH_LIBTOOL) as # shown below to make various patches to it. # $(SPHINXSEARCH_BUILD_DIR)/.configured: sphinxsearch-source make/sphinxsearch.mk $(MAKE) libstdc++-stage $(MAKE) expat-stage $(MAKE) mysql5-stage rm -rf $(BUILD_DIR)/$(SPHINXSEARCH_DIR) $(@D) $(SPHINXSEARCH_UNZIP) $(DL_DIR)/$(SPHINXSEARCH_SOURCE) | tar -C $(BUILD_DIR) -xvf - $(LIBSTEMMER_UNZIP) $(DL_DIR)/$(LIBSTEMMER_SOURCE) | tar -C $(BUILD_DIR)/$(SPHINXSEARCH_DIR) -xvf - if test -n "$(SPHINXSEARCH_PATCHES)" ; \ then cat $(SPHINXSEARCH_PATCHES) | \ patch -d $(BUILD_DIR)/$(SPHINXSEARCH_DIR) -p0 ; \ fi if test "$(BUILD_DIR)/$(SPHINXSEARCH_DIR)" != "$(@D)" ; \ then mv $(BUILD_DIR)/$(SPHINXSEARCH_DIR) $(@D) ; \ fi (cd $(@D); \ export ac_cv_func_realloc_0_nonnull=yes; \ export ac_cv_func_malloc_0_nonnull=yes; \ export sphinx_cv_unaligned_ram_access=yes; \ export sphinx_cv_interlocked=no; \ $(TARGET_CONFIGURE_OPTS) \ CPPFLAGS="$(STAGING_CPPFLAGS) $(SPHINXSEARCH_CPPFLAGS)" \ LDFLAGS="$(STAGING_LDFLAGS) $(SPHINXSEARCH_LDFLAGS)" \ ./configure \ --build=$(GNU_HOST_NAME) \ --host=$(GNU_TARGET_NAME) \ --target=$(GNU_TARGET_NAME) \ --prefix=/opt \ --sysconfdir=/opt/etc/sphinxsearch \ --with-libstemmer \ --with-mysql=$(STAGING_PREFIX) \ --without-unixodbc \ --with-syslog \ --enable-dl \ ) # $(PATCH_LIBTOOL) $(@D)/libtool touch $@ sphinxsearch-unpack: $(SPHINXSEARCH_BUILD_DIR)/.configured # # This builds the actual binary. # $(SPHINXSEARCH_BUILD_DIR)/.built: $(SPHINXSEARCH_BUILD_DIR)/.configured rm -f $@ $(MAKE) -C $(@D) touch $@ # # This is the build convenience target. # sphinxsearch: $(SPHINXSEARCH_BUILD_DIR)/.built # # If you are building a library, then you need to stage it too. # $(SPHINXSEARCH_BUILD_DIR)/.staged: $(SPHINXSEARCH_BUILD_DIR)/.built rm -f $@ $(MAKE) -C $(@D) DESTDIR=$(STAGING_DIR) install touch $@ sphinxsearch-stage: $(SPHINXSEARCH_BUILD_DIR)/.staged # # This rule creates a control file for ipkg. It is no longer # necessary to create a seperate control file under sources/sphinxsearch # $(SPHINXSEARCH_IPK_DIR)/CONTROL/control: @install -d $(@D) @rm -f $@ @echo "Package: sphinxsearch" >>$@ @echo "Architecture: $(TARGET_ARCH)" >>$@ @echo "Priority: $(SPHINXSEARCH_PRIORITY)" >>$@ @echo "Section: $(SPHINXSEARCH_SECTION)" >>$@ @echo "Version: $(SPHINXSEARCH_VERSION)-$(SPHINXSEARCH_IPK_VERSION)" >>$@ @echo "Maintainer: $(SPHINXSEARCH_MAINTAINER)" >>$@ @echo "Source: $(SPHINXSEARCH_SITE)/$(SPHINXSEARCH_SOURCE)" >>$@ @echo "Description: $(SPHINXSEARCH_DESCRIPTION)" >>$@ @echo "Depends: $(SPHINXSEARCH_DEPENDS)" >>$@ @echo "Suggests: $(SPHINXSEARCH_SUGGESTS)" >>$@ @echo "Conflicts: $(SPHINXSEARCH_CONFLICTS)" >>$@ # # This builds the IPK file. # # Binaries should be installed into $(SPHINXSEARCH_IPK_DIR)/opt/sbin or $(SPHINXSEARCH_IPK_DIR)/opt/bin # (use the location in a well-known Linux distro as a guide for choosing sbin or bin). # Libraries and include files should be installed into $(SPHINXSEARCH_IPK_DIR)/opt/{lib,include} # Configuration files should be installed in $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch/... # Documentation files should be installed in $(SPHINXSEARCH_IPK_DIR)/opt/doc/sphinxsearch/... # Daemon startup scripts should be installed in $(SPHINXSEARCH_IPK_DIR)/opt/etc/init.d/S??sphinxsearch # # You may need to patch your application to make it use these locations. # $(SPHINXSEARCH_IPK): $(SPHINXSEARCH_BUILD_DIR)/.built rm -rf $(SPHINXSEARCH_IPK_DIR) $(BUILD_DIR)/sphinxsearch_*_$(TARGET_ARCH).ipk $(MAKE) -C $(SPHINXSEARCH_BUILD_DIR) DESTDIR=$(SPHINXSEARCH_IPK_DIR) install-strip install -d $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch install -m 644 $(SPHINXSEARCH_BUILD_DIR)/sphinx-min.conf.dist $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch/sphinx.conf install -d $(SPHINXSEARCH_IPK_DIR)/opt/doc/sphinxsearch install -m 644 $(SPHINXSEARCH_BUILD_DIR)/doc/sphinx.txt $(SPHINXSEARCH_IPK_DIR)/opt/doc/sphinxsearch/sphinx.txt rm $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch/sphinx.conf.dist rm $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch/example.sql rm $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch/sphinx-min.conf.dist install -d $(SPHINXSEARCH_IPK_DIR)/opt/etc/init.d install -m 755 $(SPHINXSEARCH_SOURCE_DIR)/rc.sphinxsearch $(SPHINXSEARCH_IPK_DIR)/opt/etc/init.d/S90sphinxsearch ln -s S90sphinxsearch $(SPHINXSEARCH_IPK_DIR)/opt/etc/init.d/K70sphinxsearch # sed -i -e '/^#!/aOPTWARE_TARGET=${OPTWARE_TARGET}' $(SPHINXSEARCH_IPK_DIR)/opt/etc/init.d/SXXsphinxsearch $(MAKE) $(SPHINXSEARCH_IPK_DIR)/CONTROL/control # install -m 755 $(SPHINXSEARCH_SOURCE_DIR)/postinst $(SPHINXSEARCH_IPK_DIR)/CONTROL/postinst # sed -i -e '/^#!/aOPTWARE_TARGET=${OPTWARE_TARGET}' $(SPHINXSEARCH_IPK_DIR)/CONTROL/postinst # install -m 755 $(SPHINXSEARCH_SOURCE_DIR)/prerm $(SPHINXSEARCH_IPK_DIR)/CONTROL/prerm # sed -i -e '/^#!/aOPTWARE_TARGET=${OPTWARE_TARGET}' $(SPHINXSEARCH_IPK_DIR)/CONTROL/prerm # if test -n "$(UPD-ALT_PREFIX)"; then \ sed -i -e '/^[ ]*update-alternatives /s|update-alternatives|$(UPD-ALT_PREFIX)/bin/&|' \ $(SPHINXSEARCH_IPK_DIR)/CONTROL/postinst $(SPHINXSEARCH_IPK_DIR)/CONTROL/prerm; \ fi echo $(SPHINXSEARCH_CONFFILES) | sed -e 's/ /\n/g' > $(SPHINXSEARCH_IPK_DIR)/CONTROL/conffiles cd $(BUILD_DIR); $(IPKG_BUILD) $(SPHINXSEARCH_IPK_DIR) $(WHAT_TO_DO_WITH_IPK_DIR) $(SPHINXSEARCH_IPK_DIR) # # This is called from the top level makefile to create the IPK file. # sphinxsearch-ipk: $(SPHINXSEARCH_IPK) # # This is called from the top level makefile to clean all of the built files. # sphinxsearch-clean: rm -f $(SPHINXSEARCH_BUILD_DIR)/.built -$(MAKE) -C $(SPHINXSEARCH_BUILD_DIR) clean # # This is called from the top level makefile to clean all dynamically created # directories. # sphinxsearch-dirclean: rm -rf $(BUILD_DIR)/$(SPHINXSEARCH_DIR) $(SPHINXSEARCH_BUILD_DIR) $(SPHINXSEARCH_IPK_DIR) $(SPHINXSEARCH_IPK) # # # Some sanity check for the package. # sphinxsearch-check: $(SPHINXSEARCH_IPK) perl scripts/optware-check-package.pl --target=$(OPTWARE_TARGET) $^
初期化スクリプトrc.sphinxsearchファイルに配置され、optwareプラットフォームのsources / sphinxsearchフォルダーに配置されます(最初にフォルダーを作成する必要があります)。 アセンブリ時に、パッケージにコピーされます。
#!/bin/sh NAME=sphinxsearch DAEMON=searchd # only used for virgin run DATA_PART=/mnt [ -d /mnt/C ] && DATA_PART=/mnt/C prefix="/opt" export PATH=${prefix}/bin:${prefix}/sbin:/bin:/usr/bin:/sbin:/usr/sbin:${PATH} DAEMON=${prefix}/bin/${DAEMON} SCRIPT="`basename $0`" test -x $DAEMON || exit 0 if [ -z "$1" ] ; then case `echo "$0" | sed 's:^.*/\(.*\):\1:g'` in S??*) rc="start" ;; K??*) rc="stop" ;; *) rc="usage" ;; esac else rc="$1" fi case "$rc" in start) if [ -n "`pidof $DAEMON`" ]; then echo "$NAME is already running" else echo "Starting SphinxSearch daemon: $NAME" export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH pth=`pwd` $DAEMON cd "$pth" export LD_LIBRARY_PATH=$OLD_LIBRARY_PATH fi ;; stop) if [ -n "`pidof $DAEMON`" ]; then echo "Stopping SphinxSearch daemon: $NAME" pth=`pwd` n=1 while true; do $DAEMON --stop sleep 1 [ ! -n "`pidof $DAEMON`" ] && break sleep 5 [ $n -gt 3 ] && break let n+=1 done n=1 while true; do killall -9 $NAME 2>/dev/null sleep 1 [ ! -n "`pidof $DAEMON`" ] && break sleep 2 [ $n -gt 10 ] && break let n+=1 done if [ -n "`pidof $DAEMON`" ]; then echo "Termination of $NAME was not successful, it keeps running" sleep 1 fi cd "$pth" else echo "$NAME already stopped" fi ;; status) if [ -n "`pidof $DAEMON`" ]; then echo "$NAME is running" else echo "$NAME is not running" fi ;; restart) "$0" stop "$0" start ;; *) echo "Usage: $0 (start|stop|restart|usage)" ;; esac exit 0
openwrtの場合:アセンブリスクリプトMakefile package/network/services/sphinx ( ).
include $(TOPDIR)/rules.mk PKG_NAME:=sphinx PKG_VERSION:=2.2.2 PKG_REVISION:=4470 PKG_SUFFIX:=stemmer PKG_RELEASE:=2 #PKG_MD5SUM:=3119bbeafc9e32637339c6e95a3317ef PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_REVISION)-$(PKG_SUFFIX).tar.gz PKG_MAINTAINER:=Aleksey Vinogradov <klirichek@sphinxsearch.com> PKG_SOURCE_URL:=http://192.168.1.5:65080/r/sphinxsearch PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_REVISION)-$(PKG_SUFFIX) PKG_BUILD_PARALLEL:=1 PKG_DPNDS:= +SPHINX_MYSQL_SUPPORT:libmysqlclient +SPHINX_PGSQL_SUPPORT:libpq +SPHINX_UNIXODBC_SUPPORT:unixodbc +SPHINX_EXPAT_SUPPORT:libexpat ifeq ($(CONFIG_SPHINX_DYNAMIC_LOAD),y) PKG_BUILD_DEPENDS:= $(PKG_DEPENDS) endif include $(INCLUDE_DIR)/package.mk define Package/sphinx SECTION:=net CATEGORY:=Network SUBMENU:=Web Servers/Proxies TITLE:=sphinxsearch - fast FT search engine server DEPENDS:=+libstdcpp +librt +libpthread +zlib ifneq ($(CONFIG_SPHINX_DYNAMIC_LOAD),y) DEPENDS+= $(PKG_DPNDS) endif MENU:=1 endef define Package/sphinx/config source endef define Package/sphinx/conffiles /etc/sphinx/sphinx.conf endef # :) define Package/sphinx/description This is placeholder for sphinxsearch description endef CONFIGURE_VARS += \ ac_cv_func_realloc_0_nonnull=yes \ ac_cv_func_malloc_0_nunnul=yes \ ac_cv_c_bigendian=yes \ sphinx_cv_unaligned_ram_access=yes CONFIGURE_ARGS += \ --prefix=/ \ --sysconfdir=/etc/sphinx \ $(if $(CONFIG_SPHINX_MYSQL_SUPPORT),--with-mysql,--without-mysql) \ $(if $(CONFIG_SPHINX_PGSQL_SUPPORT),--with-pgsql,--without-pgsql) \ $(if $(CONFIG_SPHINX_UNIXODBC_SUPPORT),--with-unixodbc,--without-unixodbc) \ $(if $(CONFIG_SPHINX_EXPAT_SUPPORT),--with-libexpat,--without-libexpat) \ $(if $(CONFIG_SPHINX_DYNAMIC_LOAD),--enable-dl,,) \ --with-syslog \ --with-libstemmer define Package/sphinx/install $(INSTALL_DIR) $(1)/etc/sphinx $(INSTALL_DATA) ./files/sphinx.conf $(1)/etc/sphinx/sphinx.conf $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/sphinx.init $(1)/etc/init.d/sphinx $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/searchd $(1)/usr/sbin/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/indexer $(1)/usr/sbin/ # - . # $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/indextool $(1)/usr/sbin/ # $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/spelldump $(1)/usr/sbin/ endef $(eval $(call BuildPackage,sphinx))
メニュー構成Config.in Makefile package/network/services/sphinx
# sphinx config menu "Configuration" depends on PACKAGE_sphinx config SPHINX_DYNAMIC_LOAD bool "Load all client libs for accessing sources dynamically" default y help This will force the sphinx to load necessary db libs only when actually using db sources (otherwize they will be linked statically and will be dependencies for the sphinx package) config SPHINX_MYSQL_SUPPORT bool "Enable indexing of mysql databases" select PACKAGE_libmysqlclient default n help This will build the sphinx with supporting of mysql db indexing. It will allow to use source type=mysql, and also need libmysqlclient library in order to work. config SPHINX_PGSQL_SUPPORT bool "Enable indexing of posgresql databases" select PACKAGE_libpq default n help This will build the sphinx with supporting of posgresql db indexing. It will allow to use source type=pgsql, and also need libpq library in order to work. config SPHINX_UNIXODBC_SUPPORT bool "Enable indexing of odbc sources" select PACKAGE_unixodbc default n help This will build the sphinx with supporting of indexing odbc sources. It will allow to use source type=odbc, and also need unixodbc library in order to work. config SPHINX_EXPAT_SUPPORT bool "Enable indexing of xmlpipe sources" select PACKAGE_libexpat default n help This will build the sphinx with supporting of indexing xmlpipes. It will allow to use source type=xmlpipe2, and also need libexpat library in order to work. endmenu
初期化スクリプトsphinx.init package/network/services/sphinx/files ( )
#!/bin/sh /etc/rc.common # Copyright (C) 2010-2011 OpenWrt.org START=95 STOP=10 SERVICE_STOP_TIME=9 #PREFIX=/opt PREFIX="" error() { echo "${initscript}:" "$@" 1>&2 } start() { $PREFIX/usr/sbin/searchd } stop() { $PREFIX/usr/sbin/searchd --stop }
構成例sphinx.conf sphinx.init package/network/services/sphinx/files
; .
# # Sphinx index for library (clean, simple, functional) # source ltslibrary_src { type = mysql sql_host = 127.0.0.1 sql_user = #wiped sql_pass = #wiped sql_db = my_lib sql_query_pre = SET NAMES utf8 sql_query = SELECT * FROM sphinx_main_index sql_joined_field = title FROM QUERY; SELECT * FROM all_titles_sphinx_un sql_attr_timestamp = entered sql_attr_uint = pages sql_attr_float = price sql_attr_float = thickness sql_attr_uint = crcyear sql_attr_string = year } index ltslib { source = ltslibrary_src path = /mnt/sphinx/index/ltsidx preopen = 1 morphology = lemmatize_ru_all, lemmatize_en_all, lemmatize_de_all, libstemmer_fr expand_keywords = 1 index_exact_words = 1 min_prefix_len = 2 min_word_len = 2 dict = keywords stopwords = /mnt/sphinx/stopwords-en.txt wordforms = /mnt/bigstore/library/sphinx/wordforms.txt } indexer { mem_limit = 32M } common { lemmatizer_base = /mnt/sphinx/aot } searchd { listen = localhost:9306:mysql41 log = syslog query_log = syslog read_timeout = 5 max_children = 30 pid_file = /mnt/sphinx/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 0 unlink_old = 1 workers = threads # for RT to work binlog_path = subtree_docs_cache = 1M subtree_hits_cache = 1M }
さて、いくつかの既製のアセンブリ。dd-wrt、ミプセルプラットフォーム(LSB)のオプトウェア用sphinxsearch_2.2.2-4470-2_mipsel.ipk NetGear WNDR4300、mipsプラットフォーム(MSB)のopenwrtの下のsphinx_2.2.2-2_ar71xx.ipk。