2013年1月29日火曜日

OpenBlocksの動作モードについて

こんにちは。OpenBlocksファミリの開発・技術担当の木村です。

私は開発・技術担当ではありますが、お客様との直接お会いして製品の紹介をする機会も多くあり、よく説明を求められる内容として、RAMディスクモードとストレージ併用モードというOpenBlocks独自の仕組みがあります。今回はこの内容について、解説を行わせていただきたいと思います。

OpenBlocksでは、Debian GNU/Linuxを標準搭載するOpenBlocks 600D(販売終了済み)、A6、AX3において、RAMディスクモードとストレージ併用モードの二つの動作モードを用意しており、用途や要件に応じて使い分けが可能です。補足説明が必要と思われる用語については、本稿末尾に用意した用語解説や、以下サイトにて公開しているユーザーズガイドも併せてご参照下さい。

http://openblocks.plathome.co.jp/support/guide/


◆ RAMディスクモード

実行プログラムや設定が少量で済むインフラ系のサービスや静的なHTTPサービスを稼働させる場合に最適です。もとより高堅牢なハードウェアとなっているOpenBlocksですが、SSDのようなストレージを使用しないことでさらに故障要因を減らすことが出来ます。なお後述するとおりRAMディスクモードでで構築済みの環境を保存するには、容量の制限を考慮する必要がありますので、大容量の領域を必要とする用途にはストレージ併用モードがお勧めです。

RAMディスクモードでは、名称の通り起動後のユーザーランドをRAMディスクに構築して動作します。電源ONしFlashROMからロードしたファームウェアが実行されると、ファームウェアに含まれるinitrdのイメージのために128MB、稼働中の追加ソフトウェアやデータの置き場として384MBのtmpfs領域(/.rw)を確保してDebian GNU/Linuxの動作が始まります。





RAMディスクは高速なアクセスが可能であるため、書き換えが頻繁なテンポラリ領域として利用される事が多くありますが、不揮発性のメインメモリを利用しているという都合により、一度電源OFFしてしまうとデータが全て消えてしまうという特性があります。

通常ここに各種ソフトウェアを追加して、サービス提供するシステムを構築しようと考える方はあまりいらっしゃらないのでは無いかと思いますが、壊れにくさの追求を掲げているOpenBlocksでは、このRAMディスクを利用してシステムを構築可能にすることで、SSD等のストレージデバイスを利用しない、より高堅牢なシステムを実現できると考え、標準の機能として盛り込んでいます。

RAMディスクモードでは、initrd、tmpfsとこれらをunionfsで統合した3つのファイルシステムが大きな役割を果たしています。以下図を見ると一見複雑に見えると思いますが、unionfsによって複雑さは隠されており、利用する上では特に気になることは無いかと思います。



initrdには動作に必要な最小限のプログラムやライブラリなどの一式(debootstrapで構築した内容+α程度)が納められており、起動の度に同じ内容が展開されます。この環境には、たとえばless等の一般的なツールであっても、起動に不要なものはファームウェアサイズ削減のために含まれておりません。initrdの内容だけではサーバとして利用するためのソフトウェアが不足しておりますので、用途に合わせたソフトウェアの追加が必要となります。このための領域としてtmpfsが確保されており、利用者にはunionfsによって統合された姿が見えています。

利用者がDebian GNU/Linuxの一般的な操作で、ソフトウェアの追加や設定変更を行っていくと、tmpfsの領域にinitrdが提供するファイルシステムに対する変更差分(追加、変更、削除)が蓄積されていきます。

環境の保存

unionfsの存在によって、内部の仕組みは意識すること無く利用する事が出来ますが、変更差分が蓄積されたまま何も対処をせずに電源OFFすれば、せっかくセットアップした内容も次回起動時には消えてしまいます。

次回起動時にも変更差分を残しておくために、tmpfsの内容をFlashROMに保存するためのコマンド(/usr/sbin/flashcfg)を用意してあります。これを実行することで、tmpfsの内容(/.rw以下)を tar + gz で圧縮保存したデータをFlashROMの専用のエリアに保存します。OpenBlocks AX3は、約48MBの領域がありますが、圧縮の効果を考慮するとおよそ2~3倍程度のデータ量を保存することが出来ます。(AX3での構築例: lighttpd + php5によるWEBサーバやDNS/DHCP等の各種インフラ系サーバ)

なお構築した環境がFlashROMに収まるかどうかは、実際にtar+gzで圧縮保存してみないと分かりません。保存に失敗した場合は、保存対象のデータが削減出来ないかを精査して、再度保存を実行してみて下さい。

保存の内容を独自に調整したい場合は、/usr/sbin/flashcfg コマンドをカスタマイズして自分専用の保存コマンドを作成することも出来ます。bashスクリプトになっておりますので、カスタマイズは比較的手軽かと思います。(カスタマイズする場合でも、フォーマットはtar+gzにしておく必要があります)

環境の復元

flashcfgコマンドで保存したデータは、起動の度に自動的にtmpfs領域に展開されるため、利用する上で特に気にかける必要はありません。実際の処理は/etc/init.d/openblocks-setupが行っておりますので、興味がある方は一度ご覧下さい。

/.rwに変更差分が集約されることのメリット

バックアップと環境の復元が容易に行えます。ファームウェアによって、ベースとなるユーザランド(initrd)が提供され、それに対する変更差分は/.rwに集約されていますので、ファームウェアバージョンをそろえ、/.rwの内容をバックアップ・リストアすることで手軽に構築済み環境のコピーを作ることができます。

前述のflashcfgコマンドには、FlashROMへの保存の他にバックアップを実行する機能を備えており、USBメモリなどのストレージを用意して次のようなコマンドを実行するだけでバックアップが可能です。
    # mkfs -t ext3 -L DEB_CONFIG /dev/sdb1
    # flashcfg -B
ここで重要なのは、ボリュームラベルに「DEB_CONFIG」と設定することです。これによってバックアップ用のメディアを探し出して、変更差分を保存します。

RAMディスクモードでのリストアを想定している場合、次のように実行します。
    # mkfs -t ext3 -L DEB_CONFIG /dev/sdb1
    # flashcfg -B
    # mount LABEL=DEB_CONFIG /mnt
    # touch /mnt/FORCE
    # umount /mnt
リストア先として用意したOpenBlocksに、バックアップメディアを接続し、電源ONすればOKです。「touch /mnt/FORCE」の操作によって、FlashROMからの展開処理はスキップされ、バックアップメディアに保存されている変更差分を展開し環境を復元します。起動後はflashcfgコマンドによって、バックアップメディアから展開された変更差分をFlashROMに保存することで、構築済み環境をコピーしたことになります。バックアップの展開の他、init.shやpost-init.shというshスクリプトを用意すると、展開の前後で実行されますので、ファームウェアの書き換えなどの処理を追加することも出来ます。

RAMディスク領域を増やしたい

OpenBlocksファミリの中でもAX3の4ポート版はSO-DIMMソケットがあるため、大容量のメインメモリを活かすために、tmpfsの領域を増やしたいと問い合わせを時々受けます。あまりスマートな方法ではありませんが、次のよな操作で設定することが出来ます。
    # vi /etc/rc.local
    ~ コメント部 省略 ~
   
    mount -oremount,size=512m /.rw
   
    exit 0
   
    # sh /etc/rc.local
    (動作確認のため)
ただtmpfs領域が増えても、FlashROMのサイズは固定ですので、flashcfgで保存できる容量が増えるわけではありません。テンポラリ領域を増やすことが目的であれば/tmpだけをtmpfsにする方法も有用ですので、その場合は/etc/fstabにあるサンプル設定を基にお試し下さい。RAMディスク上で動作させたいプログラムを増やしたい場合には、FlashROMで収まらないものをSSDやその他ストレージから起動時に一度だけ読み出して展開する等のカスタマイズも考えられます。


 
◆ ストレージ併用モード

基本的な仕組みはRAMディスクモードと全く同じですが、tmpfsの代わりにラベルにDEBIANを設定したext4/ext3のストレージを利用して動作します。この条件のストレージを搭載して電源ONすることで、自動的にストレージ併用モードとして動き始めます。

RAMディスクモードとは違って、専用のコマンド(flashcfg)による保存操作が不要ですので、旧来のサーバになれている方にとっては、こちらの動作モードで触り始めていただくと戸惑いも無く触っていただけるかと思います。この動作モードでは、特別な操作をしなくてもデータは再起動後も残っていますので、ログの蓄積やDBサーバのように多量のデータをため込むような用途が向いています。

RAMディスクモードとの違いを以下にまとめます。

  • ソフトウェア追加の際に容量を気にする必要がありません
    特に小容量のSSDを搭載した場合を除き、通常の利用であれば容量を気にする必要は殆ど無くなるかと思います
     
  • メモリの空き領域を全てアプリケーション実行に利用する事が出来ます
    ただしinitrdが提供する128MBのRAMディスク領域は、ストレージ併用モードでも利用済みです
     
     
  • flashcfgコマンドによるFlashROMへの保存が不要です
    RAMディスクモードで唯一必要だった特別な操作が無くなり、IAサーバと変わらぬ操作で利用する事が出来ます 保存操作が不要になりますので、起動時に復元をすることも無くなります。RAMディスクモードでは、データベースのようにデータを蓄積するタイプの用途は不向きでしたが、ストレージ併用モードではこういった用途でも問題なく対応出来ます。


◆ まとめ

今回はRAMディスクモードを中心に、動作の仕組みを解説させていただきました。本記事が皆様のご理解の助けになれば幸いと思っています。今後もOBDNマガジンやマニュアルへの加筆等で情報公開を実施していきたいと思っておりますので、ご不明な点やさらに解説を希望される内容等、ご希望がございましたら是非OBDNマガジンへのコメント等でご連絡いただければ幸いです。




◆ 用語解説

  • ファームウェア
    Linuxカーネルとinitrdを結合したものです。出荷時からFlashROMに格納されており、更新バージョンがリリースされた場合は、apt-get upgradeによってファームウェアを含むDebianパッケージがダウンロードされ、FlashROMへの反映が行われます。
  • initrd
    Initial Ramdiskの略称です。従来は各種Linuxディスリビューションのインストーラで利用されており、カーネルを書き込んだFDとinitrdを書き込んだFDとして利用されたり、起動時にSCSI等のストレージデバイスのモジュールをロードする仕組みなどで利用されたいました。現在はinitramfsという別の手法が利用されており、initrdはあまり使われていないようです。
  • tmpfs
    Linuxで利用可能なファイルシステムの一種です。initrdはブロックデバイスとして扱われるため使うまでに初期化(mkfs)して使いたいファイルシステムの作成が必要ですが、tmpfsはオプションでメモリサイズを指定するだけで即座にファイルシステムとしてマウントできます。また指定したメモリサイズは、即座に割り当てがかかるわけではなく、実際に消費された分した割り当てされないため無駄なく利用出来ます。
  • unionfs
    複数のファイルシステムを透過的に重ねて、統合した結果を1つのファイルシステムとして見せることが出来ます。NFSにルートファイルシステムを構築して、ホームディレクトリのみをローカルストレージに保存する場合や、Live DVD等でユーザーデータをUSBメモリに保存する場合など、テンプレート化されリードオンリーで提供される共通のユーザーランドを、リードオンリーであることを意識させずに利用させるといった用途で利用されています。

0 件のコメント:

コメントを投稿