以下、図面を参照しながら実施形態に係る情報処理装置について詳細に説明する。本実施形態に係る情報処理装置は、仮想ファイルシステムの管理情報およびデータ情報のキャッシュを、再起動後に利用可能とすることを目的としている。
(第1の実施形態)
図1は、第1の実施形態に係る情報処理装置10のハードウェアの構成を示す図である。情報処理装置10は、プロセッサ21と、不揮発性メモリ22と、ネットワークインタフェース23と、少なくとも1つのストレージデバイス24とを備える。
プロセッサ21は、CPU(Central Processing Unit)等の演算制御ユニットである。プロセッサ21は、プログラムを実行する。プロセッサ21は、プログラムを実行することにより、不揮発性メモリ22を主記憶装置として用いて、演算処理および制御処理等をする。
プロセッサ21は、MMU(メモリ管理ユニット)を含む。MMUは、アドレス変換機能、メモリ保護機能およびキャッシュ制御機能を有する。アドレス変換機能は、仮想アドレスを物理アドレスに変換する機能である。メモリ保護機能は、特定のアドレスへのアクセスを禁止し、禁止したアドレスへのアクセスが発生した場合には例外を発生させる機能である。キャッシュ制御機能は、ストレージデバイス24から読み出したデータおよびストレージデバイス24に書き込んだデータを、主記憶装置にキャッシュさせる機能である。
不揮発性メモリ22は、電源が遮断されても情報を記憶し続ける記憶装置である。不揮発性メモリ22は、プロセッサ21からバイト単位でアクセスされ、プロセッサ21の主記憶装置として機能する。不揮発性メモリ22は、一例として、DIMM(Dual Inline Memory Module)スロット等のメモリスロットに装着され、メモリバス25を介してプロセッサ21のMMUと接続される。
不揮発性メモリ22は、一例として、スピン注入メモリ(STT−RAM)、相変化メモリ(PCM)、抵抗変化メモリ(ReRAM)またはバッテリーバックアップDIMM等である。バッテリーバックアップDIMMは、DRAM(Dynamic Random Access Memory)と、スーパーキャパシタと、NANDフラッシュメモリとを含む。バッテリーバックアップDIMMは、電源遮断およびフリーズ等の障害発生時において、スーパーキャパシタに蓄えられた電力によりDRAMに記憶された内容をNANDフラッシュメモリに書き出し、復旧時においてNANDフラッシュメモリの内容をDRAMに書き戻す。これにより、バッテリーバックアップDIMMは、障害発生直前にDRAMに記憶されていたデータを、再起動後に復旧させることができる。不揮発性メモリ22は、このようなデバイスに限らず、プロセッサ21からメモリバス25を介してアクセス可能であり、障害発生直前に記憶していたデータを再起動後に復旧できるデバイスであれば、どのようなデバイスであってもよい。
ネットワークインタフェース23は、プロセッサ21からの制御に従って、ネットワークを介して他の情報処理装置と通信する。ネットワークインタフェース23は、PCI Express等のI/Oバス26を介してプロセッサ21と接続される。ネットワークインタフェース23は、イーサーネット等のプロトコルで他の情報処理装置と通信する。
それぞれのストレージデバイス24は、電源が遮断されても情報を記憶し続ける記憶装置である。ストレージデバイス24は、一例として、不揮発性メモリ22よりも大容量であり、低速なデバイスである。ストレージデバイス24は、NANDフラッシュメモリで構成されるSSD(Solid State Drive)またはHDD(Hard Disk Drive)等である。ストレージデバイス24は、RAID(Redundant Arrays of Inexpensive Disks/Redundant Arrays of Independent Disks)コントローラ等を用いて、複数のデバイスを仮想的に1つのデバイスとみなした装置であってもよい。
それぞれのストレージデバイス24は、PCI Express等のI/Oバス26を介してプロセッサ21と接続される。ストレージデバイス24は、例えば、NVM Express等のプロトコルによりプロセッサ21からアクセスされる。ストレージデバイス24は、一例として、バイト単位より大きいセクタと呼ばれるデータ単位(例えば、512バイト)で、プロセッサ21からアクセスされる。
図2は、第1の実施形態に係る情報処理装置10の機能ブロックの構成を示す図である。情報処理装置10は、不揮発記憶部31と、揮発記憶部32と、少なくとも1つのストレージ部33と、通信部34と、アプリケーション35と、オペレーティングシステム36とを備える。
不揮発記憶部31は、不揮発性メモリ22により実現される。不揮発記憶部31は、電源が遮断されても情報を記憶し続けるメモリ領域である。揮発記憶部32は、不揮発性メモリ22により実現される。揮発記憶部32は、電源が遮断された後において情報を復元しないメモリ領域である。不揮発記憶部31および揮発記憶部32は、プロセッサ21の主記憶領域として機能する。不揮発記憶部31および揮発記憶部32は、不揮発性メモリ22のアドレスで領域が分けられてもよいし、プロセッサ21の制御により設定されて、状況に応じて領域が変更されてもよい。
それぞれのストレージ部33は、何れかのストレージデバイス24により実現される。ストレージ部33は、電源が遮断されても情報を記憶し続けるストレージ領域、すなわち補助記憶装置の領域である。
それぞれのストレージ部33は、記憶しているデータが、ファイルシステムにより管理される。ファイルシステムは、ストレージ部33に記憶されているデータを、ファイルと呼ばれる単位で管理する。それぞれのストレージ部33は、フォーマット時において、例えばユーザによりファイルシステムが設定され、設定されたファイルシステムに応じた管理情報等が書き込まれる。
なお、ストレージデバイス24が複数のパーティションに分割されている場合には、それぞれのパーティションが1つのストレージ部33として機能する。また、ストレージデバイス24がパーティションに分割されていない場合には、記憶領域全体が1つのストレージ部33として機能する。なお、パーティションに分割した場合、ストレージデバイス24には、パーティションテーブルと呼ばれる情報が書き込まれる。パーティションテーブルには、それぞれのパーティションの先頭位置、終端位置およびパーティションのタイプ等が格納される。
通信部34は、ネットワークインタフェース23により実現される。通信部34は、ネットワークを介して他の情報処理装置と通信する。
アプリケーション35は、プロセッサ21がアプリケーションプログラムを実行することにより実現される機能ブロックである。本実施形態においては、アプリケーション35は、本装置をデータベースとして機能させる。すなわち、アプリケーション35は、他の情報処理装置または他のアプリケーションから要求されたデータをストレージ部33から読み出して返信したり、他の情報処理装置または他のアプリケーションから送信されたデータをストレージ部33に書き込んだりする。なお、データベースは一例であり、アプリケーション35は、何であってもよい。
オペレーティングシステム36は、プロセッサ21がオペレーティングシステムプログラムを実行することにより実現される機能ブロックである。オペレーティングシステム36は、本装置を制御および管理するための基本的な機能を担う。オペレーティングシステム36は、一例として、ユーザに対してユーザインタフェースを提供する。また、オペレーティングシステム36は、一例として、アプリケーション35に対して、ハードウェアへのアクセスのためのインタフェースを提供する。
オペレーティングシステム36は、通信制御部41と、プロトコル処理部42と、ストレージ制御部43と、少なくとも1つの個別管理部44と、仮想管理部45と、不揮発記憶管理部46と、揮発記憶管理部47とを有する。
通信制御部41は、通信部34を制御する。プロトコル処理部42は、通信制御部41を介してデータを送受信するためのプロトコルに従った処理をする。プロトコル処理部42は、一例として、TCP/IPのプロトコルに従った処理をする。
ストレージ制御部43は、それぞれのストレージ部33を制御する。ストレージ制御部43は、ストレージデバイス24を制御するためのソフトウェアプログラムであるデバイスドライバを、オペレーティングシステム36に組み込むことにより実現される。
ストレージ制御部43は、ストレージデバイス24に搭載されているコントローラおよびバスの種類に応じて固有の処理を行う。ストレージ制御部43は、個別管理部44または仮想管理部45等から、データの読み出しまたはデータの書き込みのリクエストを受ける。ストレージ制御部43は、受け付けたリクエストに応じて、ストレージデバイス24に対してアクセスをする。
ストレージデバイス24は、レジスタインタフェースおよび割り込みインタフェースを有し、プロセッサ21の主記憶装置(本実施形態では、不揮発性メモリ22)にアクセスすることができる。ストレージ制御部43は、初期化時において、揮発記憶部32にディスクリプタの領域を確保し、ディスクリプタの領域のアドレスおよび長さをストレージデバイス24にレジスタインタフェースで通知する。データの書き込みまたは読み出しのリクエストを受けると、ストレージ制御部43は、ディスクリプタに、読み出しまたは書き込みの種別、ストレージ部33上のデータの位置、主記憶装置である不揮発性メモリ22上のデータの位置を含め、ストレージデバイス24に転送を指示する。ストレージデバイス24は、ストレージ制御部43から転送の指示を受けると、ディスクリプタにアクセスして内容を読み出し、その内容に従って、ストレージ部33から主記憶装置へ、または、主記憶装置からストレージ部33へデータをDMA(Direct Memory Access)転送する。そして、ストレージデバイス24は、DMA転送が完了すると、ストレージ制御部43に処理の完了を割り込みにより通知する。
ストレージデバイス24は、セクタと呼ばれる例えば512バイト単位で、データを読み出しまたは書き込む。このため、ストレージ制御部43は、ストレージ部33に記憶されたデータをバイト単位で書き換える場合、ストレージ部33から512バイト単位のデータを主記憶装置に読み出し、主記憶装置上でデータをバイト単位で書き換え、書き換え後の512バイト単位のデータをストレージ部33に書き戻す。
それぞれの個別管理部44は、対応するファイルシステムに基づき、対応するストレージ部33に記憶されるデータをファイル単位で管理する。ストレージ部33に記憶されるファイルの管理方法は、それぞれのストレージ部33に適用されたファイルシステムによって異なる。
それぞれの個別管理部44は、一例として、FAT、NTFS、ext2、ext3、ext4、XFS、JFS、RAMFS、NFSまたはproc疑似ファイルシステム等のファイルシステムによって、対応するストレージ部33のデータを管理する。なお、個別管理部44は、これら以外のファイルシステムに基づきデータを管理してもよい。
なお、ファイルシステムは、例えば4KBなどのブロックと呼ばれる単位でデータを管理したり、エクステントと呼ばれる開始位置と長さとのセットでデータを管理したりする。
また、ファイルシステムは、全体管理情報(本実施形態においては、スーパーブロック情報)、ファイル管理情報(本実施形態においては、iノード情報)およびデータ情報等を管理する。全体管理情報(スーパーブロック情報)は、ファイルシステムの全体を管理するための情報である。ファイル管理情報(iノード情報)は、ファイルシステムの属するファイル毎に設けられ、対応するファイルを管理するための情報である。データ情報は、ファイルの実体データを含む情報である。
仮想管理部45は、異なるファイルシステムに属する複数のファイルを、共通化した仮想ファイルシステムにより管理する。仮想ファイルシステムは、複数のファイルシステムを共通して扱うためのフレームワークである。すなわち、仮想管理部45は、複数のストレージ部33上に記憶されるデータを、ファイル単位で共通化して管理する。これにより、仮想管理部45は、複数のファイルシステムを扱うことができるように抽象化されたインタフェースを、アプリケーション35に提供することができる。従って、アプリケーション35は、どのファイルシステムを利用しているかを認識することなく、同一の方法でそれぞれのファイルにアクセスすることができる。
例えば、仮想管理部45は、アプリケーション35に対して、ファイル操作を行うAPI(Application Programming Interface)を提供する。仮想管理部45は、一例として、openシステムコール、readシステムコール、writeシステムコール、lseekシステムコール、fsyncシステムコール、mmapシステムコール、munmapシステムコール、msyncシステムコールおよびcloseシステムコールを提供する。
openシステムコールは、ファイルを開いて、ファイルを操作するためのファイルディスクリプタを取得するためのシステムコールである。readシステムコールは、指定したデータを読み出すためのシステムコールである。writeシステムコールは、指定したデータを書き込むためのシステムコールである。lseekシステムコールは、ファイル位置を移動するためのシステムコールである。fsyncシステムコールは、ファイルキャッシュの同期を指示するためのシステムコールである。mmapシステムコールは、ファイルのデータ情報を主記憶装置にマッピングするためのシステムコールである。munmapシステムコールは、mmapシステムコールによるマッピングを解除するためのシステムコールである。msyncシステムコールは、mmapシステムコールでマッピングした領域のファイルキャッシュの同期を指示するためのシステムコールである。closeシステムコールは、openシステムコールで取得したファイルディスクリプタを解放するためのシステムコールである。
また、仮想管理部45は、APIを通じたアクセスに応じて、それぞれの個別管理部44に対して指示を行う。仮想管理部45は、一例として、iノード情報の確保と解放、iノード情報のストレージ部33からの読み出しと書き込み、および、スーパーブロック情報のストレージ部33への書き込み等をそれぞれの個別管理部44に対して指示する。仮想管理部45は、インタフェースも抽象化して統一されたインタフェースを用いて、それぞれの個別管理部44との間でやり取りする。
また、仮想管理部45は、仮想ファイルシステムの管理情報およびデータ情報を、主記憶領域である不揮発記憶部31にキャッシュする。これにより、仮想管理部45は、ストレージ部33に毎回アクセスしなくてよく、データへのアクセスを高速化することができる。より具体的には、仮想管理部45は、仮想ファイルシステムの管理情報として、スーパーブロック情報(全体管理情報)およびiノード情報(ファイル管理情報)を、不揮発記憶部31にキャッシュさせる。
また、仮想管理部45は、仮想ファイルシステムの管理情報として、抽象化した管理情報と、ファイルシステム固有の管理情報に分離して、それぞれを管理する。具体的には、仮想管理部45は、共通の形式で表したファイルシステム共通のスーパーブロック情報およびファイルシステム共通のiノード情報と、それぞれのファイルシステム固有の形式で表したファイルシステム固有のスーパーブロック情報およびファイルシステム固有のiノード情報とを管理する。
また、仮想管理部45は、ファイルのデータ情報を、通常の主記憶領域のデータの管理単位であるページサイズでキャッシュさせる。この単位は、ページキャッシュと呼ばれる場合もある。ページサイズは、アーキテクチャ毎に異なるが、一般的には4KBである。
不揮発記憶管理部46および揮発記憶管理部47は、不揮発性メモリ22の記憶領域を管理する。具体的には、不揮発記憶管理部46は、仮想管理部45またはアプリケーション35等からの要求に応じて、不揮発記憶部31に使用領域を確保し、または、使用領域を解放する。また、揮発記憶管理部47は、仮想管理部45またはアプリケーション35等からの要求に応じて、揮発記憶部32に使用領域を確保し、または、使用領域を解放する。なお、不揮発記憶管理部46および揮発記憶管理部47は、一例として、不揮発記憶部31が不揮発性メモリ22の前半領域を使用し、揮発記憶部32が後半領域を使用するといったように、アドレスにより使用領域を分けてもよいし、互いに連携して使用領域を分けてもよい。
ここで、不揮発記憶管理部46は、不揮発記憶部31に、仮想ファイルシステムの管理情報(スーパーブロック情報およびiノード情報)およびデータ情報を、再起動後に読み出し可能にキャッシュさせる。より具体的には、不揮発記憶管理部46は、不揮発記憶部31に、仮想ファイルシステムの管理情報およびファイルのデータ情報を、予め定められたアドレスに記憶されたデータから辿ることができるようにキャッシュさせる。
これにより、不揮発記憶管理部46は、障害発生等により情報処理装置10が再起動した場合において、不揮発記憶部31の予め定められたアドレスからデータを読み出すことにより、異なるファイルシステムにより管理される複数のファイルのキャッシュデータを効率良く復旧することができる。
図3は、ストレージ部33に記憶されるデータの配置の一例を示す図である。図3に示す例では、ストレージ部33は、ブロック単位でデータを管理するファイルシステムにより管理されている。
ストレージ部33には、先頭にブートブロックが配置される。ストレージ部33には、ブートブロックに続いて、複数のブロックグループが順次に配置される。ブートブロックは、ブートセクタとも呼ばれる。ブートブロックには、オペレーティングシステム36を起動させるためのプログラムが格納される。
それぞれのグループブロックは、スーパーブロック、グループディスクリプタ、ブロックビットマップ、iノードビットマップ、iノードテーブル、および、データブロックを含む。スーパーブロックには、スーパーブロック情報が格納される。スーパーブロック情報は、ファイルシステム全体のiノードの数、フォーマット時に指定されたファイルシステムのブロックのサイズ、ファイルシステム全体のサイズ、未使用ブロック、未使用のiノードの数、並びに、ブロックグループあたりのブロック数およびiノード数等の情報を含む。なお、スーパーブロック情報は、全てのグループブロックに含まれる。しかし、通常、先頭のブロックグループのスーパーブロック情報のみが使用される。
グループディスクリプタには、ブロックグループに関する情報が格納される。具体的には、グループディスクリプタには、ブロックグループ内のブロックビットマップ、iノードビットマップ、iノードテーブル、データブロックのファイルシステムの先頭から数えたブロック番号、未使用iノード数および未使用データブロック数等が格納される。
ブロックビットマップには、データブロックの使用または未使用を管理するための情報が格納される。iノードビットマップには、iノードテーブルの使用または未使用を管理するための情報が格納される。
iノードテーブルには、それぞれのファイルのiノード情報を含む配列が格納される。iノード情報は、対応するファイルを管理するための情報である。iノード情報は、一例として、ファイルの長さ、ファイルの所有のユーザID、最終更新時および最終参照時、データブロック番号の配列等を含む。データブロックは、ファイルのデータ情報を格納する。データブロックは、iノードテーブルのデータブロック番号の配列から参照される。なお、ストレージ部33は、他のファイルシステムに従って管理される場合には、他の配置でデータを記憶する。
図4は、不揮発記憶部31に記憶される情報の配置を示す図である。不揮発記憶管理部46は、再起動後に不揮発記憶部31に記憶されたデータを読み出し可能なように、不揮発記憶部31の使用領域を管理する。
不揮発記憶管理部46は、不揮発記憶部31の予め定められたアドレス(例えば、先頭アドレス等の特定番地)から、所定の長さの不揮発オブジェクト識別情報を書き込む。不揮発オブジェクト識別情報は、本装置(情報処理装置10)が保有する固有識別情報である。不揮発オブジェクト識別情報は、情報処理装置10の製造番号の情報またはネットワークインタフェースのMAC(Media Control Access)アドレスであってもよいし、これらの値を用いてハッシュ関数などにより生成した値であってもよい。不揮発記憶部31の予め定められたアドレスに不揮発オブジェクト識別情報を書き込むことにより、不揮発記憶管理部46は、再起動時に、外部からアドレスの指定を受けずに、不揮発オブジェクト識別情報を読み出すことができる。
不揮発記憶管理部46は、不揮発オブジェクト識別情報に続く領域に、不揮発オブジェクトグループテーブルを書き込む。また、不揮発記憶管理部46は、不揮発オブジェクトグループテーブルに続く領域に、複数の不揮発オブジェクトグループを書き込む。不揮発オブジェクトグループは、不揮発オブジェクトが格納される領域である。
ここで、不揮発オブジェクトとは、不揮発記憶部31に記憶される情報である。より具体的には、不揮発オブジェクトは、スーパーブロック情報、iノード情報、および、ファイルのデータ情報等である。
不揮発オブジェクトは、タイプ毎に、グループ化して不揮発記憶部31に記憶される。1つの不揮発オブジェクトグループには、予め定められた個数の、同一タイプの不揮発オブジェクトが格納される。なお、1つの不揮発オブジェクトグループに予め定められた個数の不揮発オブジェクトが格納された後には、以後の同一タイプの不揮発オブジェクトは、他の新たな不揮発オブジェクトグループに格納される。
不揮発オブジェクトグループテーブルは、それぞれの不揮発オブジェクトグループに対応したグループ情報を格納する。グループ情報は、対応する不揮発オブジェクトグループに関する情報を含む。より具体的には、グループ情報は、不揮発オブジェクトグループに含まれる不揮発オブジェクトのタイプと、不揮発オブジェクトグループのサイズと、不揮発オブジェクトグループの開始位置とを含む。
不揮発オブジェクトのタイプには、ファイルシステム共通のスーパーブロック情報等を識別する情報が格納される。不揮発オブジェクトグループのサイズには、例えば、4096バイトといった情報が格納される。不揮発オブジェクトグループの開始位置は、例えば、102400番地といった情報が格納される。
なお、グループ情報は、さらに、不揮発オブジェクトのサイズを含んでもよい。ただし、不揮発オブジェクトのサイズは、不揮発オブジェクトのタイプから一義的に定まる。例えば、ファイルシステム共通のスーパーブロック情報のサイズは、例えば512バイトである。
不揮発記憶管理部46は、十分な数の不揮発オブジェクトグループが生成されることを前提として、不揮発記憶部31における不揮発オブジェクトグループテーブルの記録領域を予め確保してもよい。また、不揮発記憶管理部46は、不揮発オブジェクトグループの数が初期設定した数を超えた場合には、不揮発記憶部31上の他の領域を連結リスト構造で拡張して、不揮発オブジェクトグループテーブルの記憶領域としてもよい。
不揮発オブジェクトグループは、不揮発オブジェクトビットマップと、不揮発オブジェクトデータ領域とを含む。不揮発オブジェクトデータ領域には、予め定められた個数の使用領域(エントリ)が形成されている。それぞれの使用領域には、不揮発オブジェクトが格納される。
不揮発オブジェクトビットマップは、不揮発オブジェクトデータ領域のそれぞれの使用領域について、使用中であるかまたは未使用であるかを示す。例えば、不揮発オブジェクトビットマップは、それぞれの使用領域に対応する複数のビットを含む。それぞれのビットは、一例として、対応する使用領域を不揮発オブジェクトが使用中である(不揮発オブジェクトが格納されている)場合には1を示し、対応する使用領域を不揮発オブジェクトが使用していない(不揮発オブジェクトが格納されていない)場合には0を示す。
図5は、確保処理を示すフローチャートである。不揮発記憶管理部46は、不揮発記憶部31に不揮発オブジェクトを記憶させる場合、その不揮発オブジェクトを格納する使用領域を不揮発記憶部31に確保する。確保の指示を受けた場合、不揮発記憶管理部46は、図5に示す手順で確保処理を実行する。
まず、不揮発記憶管理部46は、不揮発オブジェクト識別情報が有効であるか否かを判断する(S111)。具体的には、不揮発記憶管理部46は、不揮発記憶部31の予め定められたアドレスに記憶された不揮発オブジェクト識別情報を読み出す。なお、不揮発オブジェクト識別情報は、不揮発性メモリ22が最初に使用される場合には、例えば0のような取り得ない値に初期化されている。また、不揮発オブジェクト識別情報は、不揮発性メモリ22が本装置により使用されていた場合には、本装置が保有する固有識別情報が設定されている。そして、不揮発記憶管理部46は、読み出した不揮発オブジェクト識別情報と、本装置である情報処理装置10が保有する固有識別情報とが一致するか否かを判断する。不揮発記憶管理部46は、一致する場合には不揮発オブジェクト識別情報が有効、一致しない場合には不揮発オブジェクト識別情報が有効ではないと判断する。
不揮発オブジェクト識別情報が有効ではない場合(固有識別情報と一致しない場合)(S111のNo)、不揮発記憶管理部46は、不揮発オブジェクトグループテーブルを初期化する(S112)。具体的には、不揮発記憶管理部46は、不揮発オブジェクトグループテーブルのそれぞれの不揮発オブジェクトグループのタイプを、未使用を示す値とする。続いて、不揮発記憶管理部46は、不揮発記憶部31に記憶された不揮発オブジェクト識別情報を、本装置が保有する固有識別情報に設定する(S113)。そして、不揮発記憶管理部46は、ステップS113の処理を終えると、処理をステップS116に進める。
不揮発オブジェクト識別情報が有効である場合(固有識別情報と一致した場合)(S111のYes)、不揮発記憶管理部46は、不揮発オブジェクトグループテーブルを読み出し、不揮発オブジェクトグループテーブルの中に、確保しようとしている不揮発オブジェクトと一致するタイプの不揮発オブジェクトグループが存在するか否かを判断する(S114)。
確保しようとしている不揮発オブジェクトと一致するタイプの不揮発オブジェクトグループが存在する場合(S114のYes)、不揮発記憶管理部46は、その不揮発オブジェクトグループの中の不揮発オブジェクトビットマップを読み出す。そして、不揮発記憶管理部46は、不揮発オブジェクトビットマップの中に、未使用の使用領域を示すビットが存在するか否かを判断する(S115)。
確保しようとしている不揮発オブジェクトと一致するタイプの不揮発オブジェクトグループが存在しない場合(S114のNo)、または、不揮発オブジェクトビットマップの中に未使用の使用領域を示すビットが存在しない場合(S115のNo)、不揮発記憶管理部46は、処理をステップS116に進める。また、確保しようとしている不揮発オブジェクトと一致するタイプの不揮発オブジェクトビットマップの中に未使用の使用領域を示すビットが存在する場合には(S115のYes)、不揮発記憶管理部46は、その不揮発オブジェクトグループを確保して、処理をステップS117に進める。
ステップS116において、不揮発記憶管理部46は、不揮発オブジェクトグループテーブルのグループ情報における不揮発オブジェクトのタイプが未使用となっている何れかの不揮発オブジェクトグループを、確保指示を受けた不揮発オブジェクトを格納するための不揮発オブジェクトグループとして確保する。さらに、不揮発記憶管理部46は、不揮発オブジェクトグループテーブルに、確保した不揮発オブジェクトグループに関するグループ情報(不揮発オブジェクトのタイプ、不揮発オブジェクトグループのサイズおよび不揮発オブジェクトグループの開始位置)を設定する(S116)。不揮発記憶管理部46は、ステップS116の処理を終えると、処理をステップS117に進める。
ステップS117において、不揮発記憶管理部46は、確保した不揮発オブジェクトグループにおける未使用領域の何れかを、確保指示を受けた不揮発オブジェクトを格納する使用領域として確保する。さらに、不揮発記憶管理部46は、確保した不揮発オブジェクトグループに含まれる不揮発オブジェクトビットマップを操作して、確保した使用領域のビットを未使用から使用中に書き換える(S117)。そして、不揮発記憶管理部46は、ステップS117を終えると、本フローを終了する。
以上のように、不揮発記憶管理部46は、不揮発記憶部31に記憶された固有識別情報と本装置が保有する固有識別情報とが一致することを条件として、不揮発オブジェクト(仮想ファイルシステムの管理情報およびデータ情報等)を不揮発記憶部31から読み出す。反対に、不揮発記憶管理部46は、不揮発記憶部31に記憶された固有識別情報と本装置が保有する固有識別情報とが一致しない場合には、不揮発記憶部31を初期化する。これにより、不揮発記憶管理部46は、不揮発性メモリ22が一度も使用されていない場合、不揮発性メモリ22が他の情報処理装置で使用された場合または不揮発性メモリ22の内容が破壊されている場合等に、不揮発性メモリ22に記憶されている無効なデータが読み出されることを防止することができる。
なお、不揮発記憶管理部46は、ステップS112およびステップS113の処理において、不揮発オブジェクト識別情報を書き換えた後に不揮発オブジェクトグループテーブルを初期化するのではなく、不揮発オブジェクトグループテーブルを初期化した後に不揮発オブジェクト識別情報を書き換える。これにより、不揮発記憶管理部46は、不揮発オブジェクト識別情報を書き換えた直後に電源等が遮断された場合に無効なデータが読み出されてしまうことを回避することができる。
また、不揮発記憶管理部46は、ステップS111の処理において、不揮発オブジェクトの確保指示を受ける毎に不揮発オブジェクト識別情報が有効であるか否かを判断せず、例えば起動後の最初に確保指示を受けた場合に判断をしてもよい。また、不揮発記憶管理部46は、判定結果が有効であった場合には、判定結果を所定期間保存しておいてもよい。
図6は、解放処理を示すフローチャートである。不揮発記憶管理部46は、不揮発記憶部31に記憶された不揮発オブジェクトを無効化する場合等、その不揮発オブジェクトを格納している使用領域を解放する。解放指示を受けた場合、不揮発記憶管理部46は、図6に示す手順で解放処理を実行する。
まず、不揮発記憶管理部46は、不揮発オブジェクトグループテーブルを走査して、解放指示を受けた不揮発オブジェクトのために確保された使用領域を含む不揮発オブジェクトグループを検出する(S121)。続いて、不揮発記憶管理部46は、検出した不揮発オブジェクトグループの不揮発オブジェクトビットマップにおける対応するビットを、使用中を示す値から未使用を示す値に書き換える(S122)。これにより、不揮発記憶管理部46は、揮発オブジェクトデータ領域における、解放指示を受けた不揮発オブジェクトの使用領域を解放することができる。
続いて、不揮発記憶管理部46は、対応するビットを使用中を示す値から未使用を示す値に書き換えた結果、その不揮発オブジェクトビットマップの全てのビットが、未使用を示す値となったか否かを判断する(S123)。何れかのビットが使用中を示す値である場合(S123のNo)、不揮発記憶管理部46は、本フローを終了する。
全てのビットが未使用を示す値となった場合(S123のYes)、不揮発記憶管理部46は、不揮発オブジェクトグループテーブルの該当するエントリの不揮発オブジェクトのタイプを、未使用を示す値に変更する(S124)。そして、不揮発記憶管理部46は、ステップS124の処理を終了すると、本フローを終了する。
図7は、ストレージデバイス24のフォーマット時の処理を示すフローチャートである。例えば、ストレージデバイス24が接続された時等において、情報処理装置10は、図7に示す手順で処理を実行する。
オペレーティングシステム36は、ストレージデバイス24が接続された場合、ストレージデバイス24がフォーマット済みか否かを判断する(S128)。フォーマットされていない場合(S128のNo)、オペレーティングシステム36は、ストレージデバイス24を指定されたファイルシステムでフォーマットする(S129)。この場合において、オペレーティングシステム36は、ストレージデバイス24をユーザの指定に従って複数のパーティションに分割し、それぞれのパーティションを、指定されたファイルシステムでフォーマットしてもよい。
フォーマットがされると、ストレージデバイス24には、ストレージ部33が形成され、オペレーティングシステム36により認識が可能な状態となる。また、フォーマット後のストレージ部33のスーパーブロック情報には、ファイルシステムを識別するためのファイルシステム識別情報が格納される。例えば、スーパーブロック情報には、RFC4122で定義される方式で生成されたファイルシステムのUUID(Universally Unique Identifier)が格納される。
フォーマット済みである場合(S128のYes)またはステップS129でフォーマットが完了した場合、オペレーティングシステム36は、処理を終了する。
図8は、情報処理装置10の起動時の処理を示すフローチャートである。起動時において、情報処理装置10は、図8に示す手順で処理を実行する。
まず、不揮発記憶管理部46は、不揮発オブジェクト識別情報が有効であるか否かを判断する(S131)。具体的には、不揮発記憶管理部46は、不揮発記憶部31の予め定められたアドレスに記憶された不揮発オブジェクト識別情報を読み出す。そして、不揮発記憶管理部46は、読み出した不揮発オブジェクト識別情報と、本装置である情報処理装置10が保有する固有識別情報とが一致するか否かを判断する。不揮発記憶管理部46は、一致する場合には不揮発オブジェクト識別情報が有効、一致しない場合には不揮発オブジェクト識別情報が有効ではないと判断する。
不揮発オブジェクト識別情報が有効ではない場合(S131のNo)、不揮発記憶管理部46は、不揮発オブジェクトグループテーブルを初期化する(S132)。続いて、不揮発記憶管理部46は、不揮発記憶部31に記憶された不揮発オブジェクト識別情報を、本装置が保有する装置固有の識別情報に設定する(S133)。
不揮発オブジェクト識別情報が有効であった場合(S131のYes)またはステップS133の処理が完了した場合、オペレーティングシステム36は、SSDまたはHDD等のストレージデバイス24を認識して、ストレージ部33をマウントする(S134)。ストレージ部33をマウントする場合、オペレーティングシステム36は、ユーザの指示等に従って、ターゲットデバイス、マウントポイントおよびマウントオプションを設定する。
オペレーティングシステム36は、ターゲットデバイスとして、ストレージ部33のパーティション等を特定する。オペレーティングシステム36は、マウントオプションで、不揮発キャッシュモード、リカバーモードおよびライトバックモードの設定を受け付ける。
不揮発キャッシュモードは、仮想ファイルシステムの管理情報(共通のスーパーブロック情報および共通のiノード情報)およびデータ情報を不揮発記憶部31にキャッシュさせるモードである。不揮発キャッシュモードに設定されている場合、仮想管理部45は、仮想ファイルシステムの管理情報およびデータ情報を、再起動後に読み出し可能に不揮発記憶部31にキャッシュさせる。また、不揮発キャッシュモードに設定されていない場合、不揮発記憶管理部46は機能せず、揮発記憶管理部47が仮想ファイルシステムの管理情報およびデータ情報を揮発記憶部32にキャッシュさせる。
リカバーモードは、不揮発記憶部31に記憶された仮想ファイルシステムの管理情報およびデータ情報を再使用するモードである。リカバーモードに設定されている場合、仮想管理部45は、ストレージ部33のマウント時において、不揮発記憶部31に記憶された仮想ファイルシステムの管理情報およびデータ情報を、マウントされたストレージ部33に記憶されたファイルを管理するために使用する。また、リカバーモードに設定されていない場合、仮想管理部45は、ストレージ部33のマウント時において、不揮発記憶部31に記憶された仮想ファイルシステムの管理情報およびデータ情報を解放して無効化する。そして、仮想管理部45は、マウントされたストレージ部33に記憶された仮想ファイルシステムの管理情報およびデータ情報を、不揮発記憶部31に新たにキャッシュさせる。
ライトバックモードは、仮想ファイルシステムの管理情報およびデータ情報をストレージ部33に書き戻すモードである。不揮発記憶管理部46は、ライトバックモードに設定されている場合、ストレージ部33のアンマウント時において、不揮発記憶部31に記憶されている仮想ファイルシステムの管理情報およびデータ情報をストレージ部33に書き戻す。そして、不揮発記憶管理部46は、不揮発記憶部31に記憶されている仮想ファイルシステムの管理情報およびデータ情報を解放して無効化する。また、ライトバックモードに設定されていない場合、不揮発記憶管理部46は、ストレージ部33のアンマウント時において、書き戻しは行わずに、不揮発記憶部31に記憶されている仮想ファイルシステムの管理情報およびデータ情報を有効にした状態とする。
なお、本実施形態においては、特段説明をしない場合には、情報処理装置10は、不揮発キャッシュモード、および、リカバーモードが設定されており、ライトバックモードは設定されていない。
そして、マウント時において、仮想管理部45は、指定されたターゲットデバイスであるストレージ部33のスーパーブロック情報を読み出す。仮想管理部45は、読み出したスーパーブロック情報から、フォーマット時に設定したファイルシステム識別情報を読み出す。
そして、仮想管理部45は、ストレージ部33に記憶されたファイルシステム識別情報と、不揮発記憶部31に記憶されたスーパーブロック情報に含まれるファイルシステム識別情報とを比較する。不揮発記憶管理部46は、ストレージ部33に記憶されたファイルシステム識別情報と、不揮発記憶部31に記憶されたスーパーブロック情報に含まれるファイルシステム識別情報とが一致することを条件として、不揮発記憶部31に記憶された情報を、マウントされたストレージ部33に記憶されたファイルを管理するために使用可能とする。情報処理装置10は、ステップS134の処理を終了すると、本フローを終了してマウントされたストレージ部33へのアクセスを可能とする。
図9は、仮想ファイルシステムの主記憶装置に保持するデータ構造を示す図である。仮想管理部45は、複数の異なるファイルシステムを共通して扱うためのフレームワークである仮想ファイルシステムにより、複数のストレージ部33に記憶されるデータをファイル単位で管理する。
具体的には、仮想管理部45は、図9に示されるような、vfs_mnt_start、vfs_mnt_list、vfs_mnt、vfs_sb、vfs_inode、data_memを、不揮発オブジェクトとして不揮発記憶部31に記憶させることにより、データを管理する。vfs_sb、vfs_inode、data_memは、ストレージ部33のキャッシュの情報を含んでいる。
vfs_mnt_startは、スタートポイントである。vfs_mnt_listは、マウント情報リストである。vfs_mntは、マウント情報である。仮想管理部45は、本装置にマウントされたストレージ部33毎にvfs_mntを設定する。すなわち、仮想管理部45は、仮想ファイルシステムが共通して管理するファイルシステム毎にvfs_mntを設定する。
仮想管理部45は、1つのvfs_mnt_startを設定する。仮想管理部45は、vfs_mntのそれぞれに対応してvfs_mnt_listを設定する。vfs_mnt_listは、対応するvfs_mntへのポインタを含む。なお、ポインタとは、他の不揮発オブジェクトのアドレス、または、指し示す不揮発オブジェクトが存在しないことを示す情報である。
それぞれのvfs_mnt_listは、vfs_mnt_startから直列にポインタにより辿られるリストを構成する。すなわち、vfs_mnt_startおよびvfs_mnt_listは、vfs_mntを探索するための情報として機能する。具体的には、vfs_mnt_startは、最初のvfs_mnt_listへのポインタを含む。それぞれのvfs_mnt_listは、次のvfs_mnt_listへのポインタを含む。最後のvfs_mnt_listは、次が存在しないことを表す値(例えば、0を指すポインタであるNULL)を示すポインタを含む。これにより、仮想管理部45は、vfs_mnt_startからvfs_mnt_listを順次に辿って、不揮発記憶部31に記憶された不揮発オブジェクトの中から、目的のvfs_mntを迅速に見つけ出すことができる。
vfs_mntは、マウント識別情報、および、vfs_sbへのポインタを含む。マウント識別情報は、ストレージ部33を識別する情報であり、ターゲットデバイスおよびマウントポイント等の情報を含む。
vfs_sbは、ファイルシステム共通のスーパーブロック情報構造体である。仮想管理部45は、基本的に1つのマウント情報vfs_mntに対応して、1つのvfs_sbを設定する。ただし、同じストレージ部33を複数個所にマウントする場合、複数のvfs_mntから1つのvfs_sbを指すように設定してもよい。
vfs_sbは、ファイルシステム識別情報、iノードリスト構造体、および、ファイルシステム共通のスーパーブロック情報(全体管理情報)を含む。ファイルシステム識別情報は、ファイルシステム識別情報等を格納する。iノードリスト構造体は、ファイルシステム共通のiノード情報を探索させるための情報である。ファイルシステム共通のスーパーブロック情報は、異なるファイルシステムで共通の方式で記述された情報であって、対応するファイルシステムの全体を管理するための情報である。
vfs_inodeは、ファイルシステム共通のiノード情報構造体である。仮想管理部45は、対応するファイルシステムに属するファイル毎に、vfs_inodeを設定する。
vfs_inodeは、iノードリスト構造体、ファイルシステム共通のiノード情報(ファイル管理情報)、およびdata_memへのポインタの配列を含む。ファイルシステム共通のiノード情報は、異なるファイルシステムで共通の方式で記述された情報であって、対応するファイルを管理するための情報である。data_memへのポインタの配列には、1または複数のdata_memへポインタを含む。
vfs_sbおよびそれぞれのvfs_inodeに含まれるiノードリスト構造体は、vfs_sbから直列にポインタにより辿られるリストを構成する。すなわち、iノードリスト構造体は、目的のvfs_inodeを探索するための情報として機能する。具体的には、iノードリスト構造体は、次のvfs_inodeへのポインタ(next)および前のvfs_sbまたはvfs_inodeへのポインタ(prev)を含む。vfs_sbに含まれる前へのポインタ(prev)、および、最後のvfs_inodeに含まれる次へのポインタ(next)は、前または次が存在しないことを表す値(例えば、0を指すポインタであるNULL)を示す。これにより、仮想管理部45は、iノードリスト構造体を前後に辿って、不揮発記憶部31に記憶された不揮発オブジェクトの中から、目的のvfs_inodeを迅速に見つけ出すことができる。
data_memは、対応するファイルのデータ情報を格納する構造体である。data_memは、ファイルのデータ情報をページ単位で格納する。仮想管理部45は、1つのファイルに対して、複数のdata_memを設けてもよい。
仮想管理部45は、このような構成の不揮発オブジェクトを不揮発記憶部31に記憶させることにより、全てのストレージ部33上に記憶されるファイルのデータ情報を読み出すことができる。また、スタートポイントは、不揮発記憶部31の予め定められたアドレスから読み出される不揮発オブジェクトグループテーブルから読み出すことができる。また、仮想管理部45は、マウント情報から下位に不揮発オブジェクトを探索することにより、対応するストレージ部33を管理するファイルシステムに属する、スーパーブロック情報、iノード情報およびデータ情報を探索することができる。
以上のように、仮想管理部45は、スタートポイントから順にポインタおよびリストを辿ることにより、ファイルシステム共通のスーパーブロック情報(全体管理情報)、ファイルシステム共通のiノード情報(ファイル管理情報)およびデータ情報を、不揮発記憶部31における予め定められたアドレスに記憶されたデータから辿って読み出すことができる。
図10は、不揮発記憶部31、揮発記憶部32およびストレージ部33に記憶される情報の関係を示す図である。仮想管理部45は、vfs_mnt_start、vfs_mnt_list、vfs_mnt、vfs_sb、fs_sb_mem、vfs_inode、fs_inode_mem、data_memを、不揮発オブジェクトとして不揮発記憶部31に記憶させる。
fs_sb_memは、vfs_sbと対応付けて不揮発記憶部31に記憶される。fs_sb_memは、対応するストレージ部33に記憶されたファイルを管理するためのファイルシステム固有のスーパーブロック情報を含む構造体である。fs_inode_memは、ファイルシステム固有のiノード情報およびファイルシステム共通のiノード情報(vfs_inode)とを含む構造体である。
また、仮想管理部45は、それぞれのストレージ部33に、fs_sb_str、fs_inode_str、data_strを記憶させる。fs_sb_strは、ファイルシステム固有のスーパーブロック情報およびファイルシステム共通のスーパーブロック情報を含む構造体である。fs_inode_strは、ファイルシステム固有のiノード情報およびファイルシステム共通のiノード情報を含む構造体である。data_strは、ファイルのデータ情報を含む構造体である。
ここで、仮想管理部45は、ストレージ部33に記憶されたfs_sb_strと、不揮発記憶部31に記憶されたキャッシュであるvfs_sbおよびfs_sb_memとを対応付けてして管理する。また、仮想管理部45は、ストレージ部33に記憶されたfs_inode_strと、不揮発記憶部31に記憶されたキャッシュであるfs_inode_memとを対応付けてして管理する。また、仮想管理部45は、ストレージ部33に記憶されたdata_strと、不揮発記憶部31に記憶されたキャッシュであるdata_memとを対応付けてして管理する。
なお、仮想管理部45は、不揮発記憶部31に不揮発オブジェクトを記憶させる場合、不揮発記憶管理部46を用いて、図5に示した手順で対応する不揮発オブジェクトの使用領域を確保する。これにより、仮想管理部45は、以後、ストレージ部33にアクセスせずに、対応する不揮発オブジェクトを不揮発記憶部31から読み出すことができる。また、仮想管理部45は、不揮発オブジェクトを無効化する場合、不揮発記憶管理部46を用いて、図6に示した手順で対応する不揮発オブジェクトの使用領域を解放する。
また、仮想管理部45は、ストレージ部33のマウント時において、vfs_mnt_start、vfs_mnt_listおよびvfs_mntの使用領域を確保して記憶させる。なお、仮想管理部45は、vfs_mnt_startについては、他の何れかのストレージ部33が既にマウントされている場合には、既に存在するvfs_mnt_listから、今回確保したvfs_mnt_listへのポインタを設定する。
また、仮想管理部45は、ストレージ部33のアンマウント時において、vfs_mnt_listおよびvfs_mntの使用領域を解放する。また、全てのストレージ部33がアンマウントされる場合には、仮想管理部45は、vfs_mnt_startの使用領域も解放してもよい。
また、仮想管理部45は、揮発記憶管理部47を用いて、揮発記憶部32に、vfs_mnt_hashを記憶させる。vfs_mnt_hashは、ファイルのパス名の探索を行うために用いられるハッシュリストである。仮想管理部45は、ストレージ部33をマウントした場合、対応するマウント情報vfs_mntへのポインタ等をハッシュリストに含めることにより、マウント情報vfs_mntをハッシュリストvfs_mnt_hashに接続する。これにより、仮想管理部45は、マウント情報vfs_mntから辿ることができる各ストレージ部33のファイルシステムに属する不揮発オブジェクトを、読み出し可能とすることができる。
図11は、不揮発記憶部31に記憶されるスーパーブロック情報と、ストレージ部33に記憶されるスーパーブロック情報の関係を示す図である。
不揮発記憶部31には、vfs_sbとfs_sb_memとが記憶される。vfs_sbは、ファイルシステム共通のスーパーブロック情報を含む構造体である。fs_sb_memは、ファイルシステム固有のスーパーブロック情報を含む構造体である。vfs_sbは、fs_sb_memへのポインタを含む。fs_sb_memへのポインタは、vfs_sbとfs_sb_memとを対応付けることができる。
仮想管理部45は、マウント時において、ストレージ部33上のfs_sb_strから共通および固有のスーパーブロック情報のそれぞれを読み出し、vfs_sbおよびfs_sb_memの使用領域を確保し、読み出した共通および固有のスーパーブロック情報のそれぞれを不揮発記憶部31にキャッシュさせる。仮想管理部45は、vfs_sbとfs_sb_memとを別々の使用領域として確保する。これにより、仮想管理部45は、fs_sb_memを独自の大きさに定義することができる。
仮想管理部45は、このように不揮発記憶部31にスーパーブロック情報をキャッシュさせることにより、ストレージ部33に毎回アクセスをすることなくスーパーブロック情報を更新することができる。この結果、仮想管理部45は、スーパーブロック情報に対するアクセスを高速化することができる。
図12は、不揮発記憶部31に記憶されるiノード情報と、ストレージ部33に記憶されるiノード情報の関係を示す図である。
不揮発記憶部31には、fs_inode_memが記憶される。また、fs_inode_memには、vfs_inodeが含まれる。fs_inode_memは、ファイルシステム固有のiノード情報を含む構造体である。vfs_inodeは、ファイルシステム共通のiノード情報を含む構造体である。vfs_inodeは、vfs_sbへのポインタを含んでもよい。これにより、仮想管理部45は、iノード情報からスーパーブロック情報を参照することができる。
仮想管理部45は、ファイルの参照時等に、既にキャッシュされていなければ、ストレージ部33上のfs_inode_strから共通および固有のiノード情報のそれぞれを読み出し、fs_inode_memおよびvfs_inodeの使用領域を確保し、読み出した共通および固有のiノード情報のそれぞれを不揮発記憶部31にキャッシュさせる。
また、ファイルが存在しない場合で新規にファイルを作成する場合には、仮想管理部45は、fs_inode_memおよびvfs_inodeの使用領域を確保して、共通および固有のiノード情報のそれぞれを不揮発記憶部31に書き込む。この時、スーパーブロックの情報から空いているiノードの情報を探索し、fs_inodeの場所を決定する。
仮想管理部45は、このように不揮発記憶部31にiノード情報をキャッシュさせることにより、ストレージ部33に毎回アクセスをすることなくiノード情報を更新することができる。この結果、仮想管理部45は、iノード情報に対するアクセスを高速化することができる。
図13は、不揮発記憶部31に記憶されるiノード情報と、ストレージ部33に記憶されるiノード情報の関係の他の例を示す図である。
不揮発記憶部31には、vfs_inodeがfs_inode_mem内に含まれるのではなく、vfs_inodeがfs_inode_memとは別個に記憶されてもよい。この場合、vfs_inodeには、fs_inode_memへのポインタを含む。
データ情報であるdata_memとdata_strは、不揮発記憶部31にdata_mem、ストレージ部33にdata_strが記憶される。data_strは、ストレージ部33のデータブロックにあたる。data_memは、対応するdata_strを迅速に得るために、data_strの位置に関する情報を記憶してもよい。
図14は、アプリケーション35とオペレーティングシステム36との関係を示す図である。
データベース機能を実現するアプリケーション35は、他の情報処理装置からネットワークを介してデータの読み出しまたはデータの書き込みのリクエストを受けると、ファイルにデータを読み出しまたは書き込む。そして、アプリケーション35は、読み出しまたは書き込みの結果をレスポンスに含めて、他の情報処理装置にネットワークを介して返す。なお、アプリケーション35は、他の情報処理装置に代えて、本装置内で動作する他のアプリケーションから読み出しまたはデータの書き込みのリクエストを受けてもよい。
アプリケーション35は、このようなファイルの操作等をオペレーティングシステム36が提供するAPIを介して行う。ストレージ部33におけるデータベースが記憶されている位置は、設定ファイル等にファイルのパス名等で記述されている。アプリケーション35は、起動時に設定ファイルを読み込み、データベースが記憶されているファイルのパスを取得する。
アプリケーション35は、ファイルのパスと、アクセスモード(読み出しのみ可能、書き込みのみ可能、読み書き可能等)を指定し、openシステムコールでファイルを開く。この場合、まず、仮想管理部45は、不揮発記憶部31にキャッシュされているスーパーブロック情報から該当するiノード情報を探索する。
不揮発記憶部31のキャッシュに該当するiノード情報が存在しない場合、仮想管理部45は、ストレージ部33からiノード情報を読み出し、読み出したiノード情報を不揮発記憶管理部46を介して不揮発記憶部31にキャッシュさせる。該当するiノード情報が不揮発記憶部31にキャッシュされると、仮想管理部45は、揮発記憶管理部47を介して揮発記憶部32にファイルディスクリプタと呼ばれる、アプリケーション35の識別情報の領域を確保する。このファイルディスクリプタは、openシステムコールの戻り値として、アプリケーション35に渡される。アプリケーション35は、以降このファイルディスクリプタを用いて、該当するファイルに対する操作を行う。
また、アプリケーション35は、readシステムコール、writeシステムコールまたはmmapシステムコールを用いてファイルにアクセスすることもできる。
アプリケーション35は、readシステムコールでファイルからデータ情報を読み出すことができる。ファイルからデータ情報を読み出す場合、アプリケーション35は、ファイルディスクリプタと、読み出し先バッファのアドレスおよび長さとを引数に指定して、readシステムコールを呼び出す。readシステムコールを受けた場合、仮想管理部45は、該当するファイルのiノード情報のデータ情報へのポインタ配列を参照して、読み出そうとしたデータ情報が不揮発記憶部31にキャッシュされているかを調べる。
キャッシュされている場合、仮想管理部45は、不揮発記憶部31にキャッシュされていたデータ情報をアプリケーション35が指定した読み出し先バッファの位置に指定された長さ分コピーする。キャッシュされていない場合、仮想管理部45は、ストレージ部33からデータ情報を読み出し、読み出したデータ情報を不揮発記憶部31にキャッシュしてから、アプリケーション35が指定した読み出し先バッファの位置に指定された長さ分コピーする。なお、不揮発記憶管理部46は、データ情報をページ単位で不揮発記憶部31にキャッシュさせる。
また、アプリケーション35は、writeシステムコールでファイルにデータ情報を書き込むことができる。ファイルにデータ情報を書き込む場合、アプリケーション35は、ファイルディスクリプタと、書き込み対象のデータ情報を格納したバッファのアドレスおよび長さとを引数にしてwriteシステムコールを呼び出す。writeシステムコールを受けた場合、仮想管理部45は、該当するファイルのiノード情報のデータ情報へのポインタ配列を参照して、書き込もうとしているデータ情報が不揮発記憶部31にキャッシュされているかを調べる。
キャッシュされている場合、仮想管理部45は、不揮発記憶部31にキャッシュされていたデータ情報の位置に、アプリケーション35が指定したバッファの位置から指定された長さ分コピーする。キャッシュされていない場合、仮想管理部45は、ストレージ部33からデータ情報を読み出し、読み出したデータ情報を不揮発記憶部31にキャッシュしてから、読み出したデータ情報の位置に、アプリケーション35が指定したバッファの位置から指定された長さ分コピーする。なお、不揮発記憶管理部46は、データ情報をページ単位で不揮発記憶部31にキャッシュさせる。
また、アプリケーション35は、mmapシステムコールでファイルのデータ情報にアクセスすることもできる。mmapシステムコールでファイルのデータ情報にアクセスする場合、アプリケーション35は、メモリマップするデータ情報のアドレスおよび長さと、メモリ保護の種別と、フラグとを引数にしてmmapシステムコールを呼び出す。アプリケーション35は、メモリ保護の種別により、マッピングのメモリ保護をどのように行うかを指定する。アプリケーション35は、一例として、実行可能、読み書き可能、書き込み可能等を組み合わせた情報をメモリ保護の種別として指定する。アプリケーション35は、フラグにより、マッピングしたデータ情報を共有するか等を指定する。
mmapシステムコールを受けた場合、仮想管理部45では、マッピングされたアドレスにアクセスがあった場合にページフォルトが発生するように、MMUを設定する。ページフォルトのハンドラには、対応するデータ情報をストレージ部33からページ単位で読み出し、読み出したデータ情報をキャッシュするように設定されている。例えば、マッピングされたアドレスからデータ情報を読み出したり、マッピングされたアドレスにデータ情報を書き込んだりすると、対応するデータ情報がキャッシュされていない場合、MMUは、ページフォルトを発生する。そして、データ情報をキャッシュした後に、MMUは、キャッシュしたデータ情報に対して読み出しまたは書き込みを実行する。対応するデータ情報がキャッシュされている場合、MMUは、キャッシュされているデータ情報に対して読み出しまたは書き込みを実行する。
なお、本実施形態においては、オペレーティングシステム36は、ストレージ部33へのデータの同期を実行するfsyncシステムコールおよびmsyncシステムコールをサポートしている。しかし、オペレーティングシステム36は、fsyncシステムコールおよびmsyncシステムコールが呼び出されても、ストレージ部33への書き戻しは行わず、プロセッサ21から不揮発性メモリ22のデータを順番通りに書き出す処理を行う。
例えばサービスを計画的に停止する場合等において、ユーザは、データベースの機能を提供しているアプリケーション35を停止する。アプリケーション35が停止されると、オペレーティングシステム36は、openシステムコールでアプリケーション35が参照している全てのファイルについて、closeシステムコールが呼び出された場合と同等の処理を実行する。そして、マウントしていたストレージ部33のファイルを参照していたアプリケーション35が全て無くなると、ユーザは、そのストレージ部33をアンマウントすることができる。
図15は、ストレージ部33のアンマウント時の処理を示すフローチャートである。アンマウント時において、仮想管理部45は、図15に示す手順で処理を実行する。
まず、仮想管理部45は、不揮発キャッシュモードに設定されているか否かを判断する(S151)。不揮発キャッシュモードに設定されていない場合(S151のNo)、仮想管理部45は、処理をステップS153に進める。不揮発キャッシュモードに設定されている場合(S151のYes)、仮想管理部45は、さらに、ライトバックモードに設定されているか否かを判断する(S152)。ライトバックモードに設定されている場合(S152のYes)、仮想管理部45は、処理をステップS153に進める。
不揮発キャッシュモードが設定されていない場合(S151のNo)、または、ライトバックモードに設定されている場合(S152のYes)、ステップS153において、仮想管理部45は、不揮発記憶部31にキャッシュされている仮想ファイルシステムの管理情報およびデータ情報をストレージ部33に書き戻す(S153)。すなわち、仮想管理部45は、不揮発記憶部31に記憶されているスーパーブロック情報、iノード情報およびデータ情報を、ストレージ部33に書き戻す。そして、仮想管理部45は、不揮発記憶管理部46を用いてこれらの使用領域を解放し、処理を終了する。これにより、情報処理装置10は、不揮発性メモリ22を例えば取り外すことができる。
一方、不揮発キャッシュモードが設定されていて、かつ、ライトバックモードに設定されていない場合(S152のNo)、仮想管理部45は、不揮発記憶部31にキャッシュされているデータを書き戻しせず、不揮発記憶部31にキャッシュされているデータをそのまま残存させる。これにより、情報処理装置10は、アンマウント時の処理時間を短縮することができる。また、情報処理装置10は、ストレージ部33を再度マウントする場合における処理時間も短縮することができる。
図16は、ストレージ部33のマウント時の処理を示すフローチャートである。マウント時において、仮想管理部45は、図16に示す手順で処理を実行する。
まず、仮想管理部45は、不揮発キャッシュモードが設定されているか否かを判断する(S161)。不揮発キャッシュモードが設定されていない場合(S161のNo)、仮想管理部45は、マウント情報、スーパーブロック情報、iノード情報およびデータ情報等を、揮発記憶管理部47を用いて揮発記憶部32にキャッシュするように設定する(S162)。続いて、仮想管理部45は、マウント情報およびスーパーブロック情報等の使用領域を揮発記憶管理部47を用いて揮発記憶部32に確保し(S163)、本フローを終了する。このように不揮発キャッシュモードが設定されていない場合、仮想管理部45は、再起動後に復元できないように、スーパーブロック情報等およびデータ情報をキャッシュさせることができる。
不揮発キャッシュモードが設定されている場合(S161のYes)、仮想管理部45は、マウント情報、スーパーブロック情報、iノード情報およびデータ情報等を、不揮発記憶管理部46を用いて、不揮発記憶部31にキャッシュするように設定する(S164)。このように不揮発キャッシュモードが設定されている場合、仮想管理部45は、再起動後に復元可能なようにスーパーブロック情報等およびデータ情報をキャッシュさせることができる。
S164に続いて、仮想管理部45は、マウントしたストレージ部33に記憶されているスーパーブロック情報に含まれるファイルシステム識別情報(UUID)と、不揮発記憶部31に記憶されているスーパーブロック情報に含まれるファイルシステム識別情報とを読み出す。そして、仮想管理部45は、マウントしたストレージ部33上のファイルシステム識別情報と、不揮発記憶部31上のファイルシステム識別情報とが一致するか否かを判断する(S165)。
なお、不揮発記憶部31に複数のファイルシステムに属するスーパーブロック情報が記憶されている場合、仮想管理部45は、マウント情報のリストを辿り、全てのファイルシステムに属するスーパーブロック情報から、ファイルシステム識別情報を読み出す。そして、仮想管理部45はストレージ部33上のファイルシステム識別情報と、不揮発記憶部31上の何れかのファイルシステム識別情報とが一致するか否かを判断する。
判断の結果、ファイルシステム識別情報が一致する場合、不揮発記憶部31には、マウントしたストレージ部33のファイルシステムに属するスーパーブロック情報等およびデータ情報が既にキャッシュされている。一方、判断の結果、ファイルシステム識別情報が一致しない場合、不揮発記憶部31には、マウントしたストレージ部33のファイルシステムに属するスーパーブロック情報等およびデータ情報が、未だキャッシュされていない。
何れのファイルシステム識別情報も一致しない場合(S165のNo)、仮想管理部45は、処理をステップS168に進める。ファイルシステム識別情報が一致する場合(S165のYes)、仮想管理部45は、さらに、リカバーモードが設定されているか否かを判断する(S166)。そして、リカバーモードが設定されている場合(S166のYes)、仮想管理部45は、処理をステップS167に進める。リカバーモードが設定されていない場合(S166のNo)、仮想管理部45は、処理をステップS169に進める。
ステップS167において、仮想管理部45は、ファイルシステム識別情報が一致したスーパーブロック情報に対応するマウント情報を、揮発記憶部32に記憶されているハッシュリストに接続する。これにより、仮想管理部45は、このスーパーブロック情報を読み出し可能とすることができる。さらに、仮想管理部45は、このスーパーブロック情報から辿ることができるiノード情報およびデータ情報も読み出し可能とすることができる。
すなわち、仮想管理部45は、不揮発記憶部31に既にキャッシュされている、マウントしたストレージ部33のファイルシステムに属するスーパーブロック情報、iノード情報およびデータ情報等を有効にすることができる。これにより、仮想管理部45は、不揮発記憶部31に記憶されたスーパーブロック情報、iノード情報およびデータ情報を、マウントされたストレージ部33に記憶されたファイルを管理するために使用することができる。
ステップS168において、仮想管理部45は、不揮発記憶管理部46を用いて、マウント情報リスト、マウント情報およびスーパーブロック情報の使用領域を、不揮発記憶部31に確保する(S168)。なお、仮想管理部45は、スタートポイントの使用領域が未だ確保されていない場合には、スタートポイントも確保する。
これにより、仮想管理部45は、マウントしたストレージ部33のファイルシステムに属するスーパーブロック情報等が未だ不揮発記憶部31にキャッシュされていない場合に、マウントしたストレージ部33上のスーパーブロック情報等を不揮発記憶部31上に新たにキャッシュさせることができる。さらに、仮想管理部45は、マウントしたストレージ部33上のスーパーブロック情報を不揮発記憶部31上にキャッシュさせることにより、ストレージ部33のスーパーブロック情報に含まれるファイルシステム識別情報と、不揮発記憶部31の何れかのファイルシステム共通のスーパーブロック情報とを一致させることができる。
仮想管理部45は、ステップS168の処理の後に、ステップS167に処理を進める。そして、ステップS167において、仮想管理部45は、マウント情報とハッシュリストとを接続し、不揮発記憶部31上に新たにキャッシュさせたスーパーブロック情報等を有効にする。
また、ステップS169において、仮想管理部45は、不揮発記憶部31上の、マウントしたストレージ部33のファイルシステムに属するスーパーブロック情報、iノード情報およびデータ情報等を全て無効化する(S169)。具体的には、仮想管理部45は、マウントしたストレージ部33のファイルシステム識別情報と一致するファイルシステム識別情報を含むスーパーブロック情報から、ポインタおよびリストを辿り、スーパーブロック情報、iノード情報およびデータ情報を検出する。そして、仮想管理部45は、検出したこれらの情報の使用領域を解放する。
ステップS169に続いて、仮想管理部45は、不揮発記憶管理部46を用いて、スーパーブロック情報等の使用領域を不揮発記憶部31に新たに確保する(S170)。なお、仮想管理部45は、スタートポイント、マウント情報リストおよびマウント情報については、過去に記憶されていた使用領域を再利用してもよいし、過去に記憶されていた使用領域を解放してから再度確保してもよい。そして、仮想管理部45は、ステップS170の処理の後に、ステップS167に処理を進める。そして、ステップS167において、仮想管理部45は、マウント情報とハッシュリストとを接続し、不揮発記憶部31上に新たにキャッシュさせたスーパーブロック情報等を有効にする。
仮想管理部45は、ステップS167の処理を終了すると、本フローを終了する。
以上のように、仮想管理部45は、マウント時において、ストレージ部33上のファイルシステム識別情報と不揮発記憶部31上のファイルシステム識別情報とが一致することを条件として、不揮発記憶部31にキャッシュされていたスーパーブロック情報等およびデータ情報を、マウントしたストレージ部33のファイルの管理のために有効にする。これにより、仮想管理部45は、マウントしたストレージ部33のためにキャッシュされていたデータを適切に有効にすることができる。
なお、電源遮断、ソフトウェアのフリーズ、ハードウェアのエラー等の障害が発生した場合、仮想管理部45は、再起動後にマウント処理を行う。この場合、障害が発生する直前までストレージ部33が正常にマウントされていたので、不揮発記憶部31には、ストレージ部33に記憶されているファイルシステム識別情報と一致するファイルシステム識別情報を含むスーパーブロック情報が、残っている。従って、この場合には、不揮発キャッシュモードおよびリカバーモードを設定することにより、仮想管理部45は、仮想ファイルシステムのキャッシュを障害直前の状態にまで復旧することができる。
また、仮想管理部45は、マウント時において、iノード情報およびデータ情報を辿り、壊れている情報が存在するか否かをチェックしてもよい。そして、仮想管理部45は、壊れている情報を無効化してもよい。これにより、仮想管理部45は、壊れていない情報のみを不揮発記憶部31にキャッシュさせた状態とすることができる。
また、情報処理装置10のオペレーティングシステム36は、不揮発オブジェクトを削除する専用の削除処理部を有してもよい。削除処理部は、不揮発記憶部31に記憶されているスーパーブロック情報からファイルシステム識別情報を読み出して一覧を表示し、何れかのファイルシステムをユーザに選択させる。削除処理部は、選択されたファイルシステムに属する不揮発オブジェクト(マウント情報リスト、マウント情報、スーパーブロック情報、iノード情報、データ情報等)をポインタおよびリスト等を辿って検出し、不揮発記憶管理部46を用いて検出した不揮発オブジェクトの使用領域を解放する。これにより、削除処理部は、マウントする予定のないストレージ部33を管理するファイルシステムに属する不揮発オブジェクトを削除することができる。
なお、仮想管理部45は、不揮発記憶部31にキャッシュされた情報が一定量を超えると、一部の情報をストレージ部33に書き戻す。これにより、仮想管理部45は、不揮発記憶部31をオーバーフローさせずに使用することができる。仮想管理部45は、一例として、LRU(Least Recently Used)と呼ばれる方式を用いて、何れの情報を書き戻すかを判断してもよい。LRUでは、最近使用されていないエントリをアクセスタイミングおよびフラグ等を用いて判断し、最近使用されていないエントリをストレージ部33に書き戻す方式である。
また、本実施形態においては、仮想管理部45は、ハッシュリストvfs_mnt_hashを揮発記憶管理部47を用いて揮発記憶部32に記憶させている。これに代えて、仮想管理部45は、ハッシュリストvfs_mnt_hashを不揮発記憶管理部46を用いて不揮発記憶部31に記憶させてもよい。この場合、図17に示すように、仮想管理部45は、スタートポイントvfs_mnt_startおよびマウント情報リストvfs_mnt_listを設定しなくてもよい。ただし、この場合、仮想管理部45は、起動時にハッシュリストvfs_mnt_hashが確保された時点において、ハッシュリストに接続されているマウント情報からストレージ部33を特定し、ファイルシステム識別情報が一致するか否かを確認しなければならない。
以上のように、第1の実施形態に係る情報処理装置10によれば、仮想ファイルシステムの管理情報およびデータ情報を不揮発記憶部31に再起動後も読み出し可能にキャッシュすることにより、障害が発生した場合にも障害直前の状態まで、異なる複数のファイルシステムにより管理されるファイルを復元することができる。
また、第1の実施形態に係る情報処理装置10によれば、不揮発記憶部31の占有領域を、それぞれのストレージ部33へのアクセス頻度に応じて動的に変更することができる。例えば、図18に示すように、情報処理装置10は、第1のストレージデバイス24−1および第2のストレージデバイス24−2を有するとする。
また、第1のストレージデバイス24−1は、2つのパーティションに分けて使用され、第1のストレージ部33−1および第2のストレージ部33−2として機能するとする。また、第2のストレージデバイス24−2は、2つのパーティションに分けて使用され、第3のストレージ部33−3および第4のストレージ部33−4として機能するとする。また、第2のストレージ部33−2は、データベースのデータを記憶し、第1のストレージ部33−1、第3のストレージ部33−3および第4のストレージ部33−4は、設定ファイル、プログラムおよびログ等を記憶するとする。
このような場合において、仮想管理部45は、仮想ファイルシステムの管理情報およびデータ情報におけるアクセス頻度の低いデータから順に不揮発記憶部31から削除し、アクセス頻度が高いデータを不揮発記憶部31に優先的にキャッシュさせる。従って、仮想管理部45は、データベースへのアクセスが頻繁にあると、図18に示すように、アクセス頻度の高い第2のストレージ部33−2に記憶されているデータを、アクセス頻度の低い他のストレージ部33に記憶されているデータよりも優先してキャッシュさせることができる。
上述の実施形態においては、ストレージ部33において、スーパーブロック情報にファイルシステムの識別情報を記憶したが、これはストレージ部33のパーティション情報に記憶してもよい。
上記の実施形態においては、不揮発オブジェクト識別情報とファイルシステム識別情報の2つを用いた例を示したが、不揮発オブジェクト識別情報をファイルシステム識別情報に統合して、ファイルシステム識別情報だけを用いてもよい。
(第2の実施形態)
図19は、第2の実施形態に係る情報処理装置10のハードウェアの構成を示す図である。なお、第2の実施形態は、第1の実施形態と略同一の機能および構成を有するので、第1の実施形態と略同一の機能および構成を有する部材に同一の符号を付けて、相違点を除き詳細な説明を省略する。
本実施形態に係る情報処理装置10は、第1の実施形態の構成要素に加えて、揮発性メモリ51をさらに備える。揮発性メモリ51は、プロセッサ21とメモリバス25で接続され、電源が遮断されると情報を消去する。揮発性メモリ51は、一例として、DRAMである。
図20は、第2の実施形態に係る情報処理装置10の機能ブロックの構成を示す図である。本実施形態において、揮発記憶部32は、揮発性メモリ51により実現される。
図21は、第2の実施形態における、不揮発記憶部31、揮発記憶部32およびストレージ部33に記憶される情報の関係を示す図である。
第2の実施形態において、揮発記憶部32は、アプリケーション35のデータ、仮想ファイルシステム以外のオペレーティングシステム(OS)のデータを記憶する。また、仮想管理部45は、仮想ファイルシステムの管理情報のうちの、ファイルの探索を高速化するための情報等の不揮発性が必要ない情報を、揮発記憶管理部47を用いて揮発記憶部32に記憶させてもよい。例えば、仮想管理部45は、ディレクトリエントリおよびファイルディスクリプタに関する情報等を、揮発記憶管理部47を用いて揮発記憶部32に記憶させてもよい。
揮発性メモリ51は、一般に、不揮発性メモリ22よりもビット単価が低く、応答速度も速い。従って、第2の実施形態に係る情報処理装置10によれば、コストを低くし、さらに、処理速度を速くしつつ、第1の実施形態と同様の効果を得ることができる。
第2の実施形態において、例えばデータの書き込みが少ないストレージ部33などにおいて、マウント時のオプションとして不揮発キャッシュモードを設定して、揮発メモリにキャッシュすることで、コストの高い不揮発性メモリ22を他の必要な領域に効率的に使用することができる。
(第3の実施形態)
図22は、第3の実施形態に係る情報処理装置10の機能ブロックの構成を示す図である。なお、第3の実施形態は、第2の実施形態と略同一の機能および構成を有するので、第2の実施形態と略同一の機能および構成を有する部材に同一の符号を付けて、相違点を除き詳細な説明を省略する。
本実施形態に係る情報処理装置10は、第2の実施形態の機能構成に加えて、ブロックデバイス制御部61をさらに備える。
ブロックデバイス制御部61は、ストレージ部33に対して新たな論理アドレスを構築し、仮想的な1つのログ構造のブロックデバイスを構成する。ブロックデバイス制御部61は、ブロックデバイスに記憶されるデータをブロック単位で管理する。ブロックデバイス制御部61は、個別管理部44または仮想管理部45等から、ブロックデバイスに対するブロック単位のデータの書き込みまたはブロック単位のデータの読み出しのリクエストを受ける。ブロックデバイス制御部61は、受け付けたリクエストに応じて、ブロックデバイスに対してアクセスをする。ブロックデバイス制御部61は、このようなブロックデバイスを制御するためのソフトウェアプログラムであるデバイスドライバを、オペレーティングシステム36に組み込むことにより実現される。
SSDまたはHDD等は、一般的に、ランダムアクセスで書き込むよりもシーケンシャルアクセスで書き込む方が高い性能を発揮する。例えば、SSDまたはHDD等は、一般的なページサイズである4KB単位でデータが書き込まれるよりも、128ページ分まとめた512KB単位でデータが書き込まれる方が、高速に処理することができる。ブロックデバイス制御部61は、このようにデータをまとめてストレージ部33に書き込む機能を実現し、ストレージ部33へのアクセスを高速化する。また、SSDにおいては、シーケンシャルアクセスで書き込む方が、NANDフラッシュメモリの書き換え回数を減らし、SSDの寿命を延ばすことができる。
また、ブロックデバイス制御部61は、ファイルシステムよりも下層で動作するので、様々なファイルシステムにより管理されるデータをストレージ部33に高速に書き込むことができる。また、ブロックデバイス制御部61は、データを更新する場合には、ストレージ部33のデータを上書きするのではなく、ストレージ部33の別の新たな領域にデータを書き込む。これにより、ブロックデバイス制御部61は、常時、シーケンシャルにデータを書き込むことができる。
図23は、第3の実施形態に係る情報処理装置10の書き込み処理を説明するための図である。図24は、状態ビットマップの一例を示す図である。図25は、LBA変換テーブルの一例を示す図である。
個別管理部44は、ブロックデバイス制御部61に対して、ファイルシステムにおけるデータの管理単位であるブロック単位でデータの書き込みのリクエストを送信する。ブロックは、例えば1KB、2KBまたは4KB等のファイルシステムのフォーマット時にユーザによって設定されたデータサイズである。本実施形態においては、ブロックは、一例として、4KBである。
ブロックデバイス制御部61は、一定数の書き込みのリクエストを受け取るまで、書き込み処理を待機する。ブロックデバイス制御部61は、一例として、4KBのブロックの書き込みのリクエストが、128個揃うまで待機する。まとまった一定数のブロックをブロックセットと呼ぶ。本実施形態においては、まとまった128個のブロックをブロックセットと呼ぶ。ブロックデバイス制御部61は、ブロックセットの単位でストレージ部33にデータを書き込む。
ブロックデバイス制御部61は、状態ビットマップと、LBA変換テーブル(アドレス変換テーブル)とを用いて、ストレージ部33への書き込みおよび読み出しを制御する。状態ビットマップは、揮発記憶部32に記憶される。LBA変換テーブルは、不揮発記憶部31に記憶される。
状態ビットマップは、図24に示すように、それぞれのブロックセットに含まれるそれぞれのブロックが使用中であるか未使用であるかを示すマップである。ストレージ部33は、全体をブロックセットのサイズの領域に分割して管理され、分割されたそれぞれの領域にユニークなブロックセット番号が割り当てられている。状態ビットマップは、ブロックセット番号により、ブロックセットの位置を特定する。また、状態ビットマップは、それぞれのブロックセット番号に対応したエントリを有する。それぞれのエントリは、1つのブロックセットに含まれるブロックの個数分のビットを有する。それぞれのビットは、ブロックセット内のブロックの位置に対応している。それぞれのビットは、例えば値が1である場合には対応するブロックが使用中であり、値が0である場合には対応するブロックが未使用であることを表す。
ブロックデバイスを最初に作成する時に、ブロックデバイス制御部61は、状態ビットマップ内の全てのエントリの全てのビットを、未使用を表す0に初期化する。ブロックデバイス制御部61は、ブロックセットを書き込む場合、全てのビットが未使用を表す0であるエントリを探し、全てのビットが0であるエントリに対応するブロックセット番号の位置に、ブロックセットを書き込む。ブロックセットを書き込んだ場合、ブロックデバイス制御部61は、対応するブロックセット番号のエントリに含まれる全てのビットを使用中を表す1に書き換える。
LBA変換テーブルは、図25に示すように、ブロック単位で、ブロックデバイスで使用する論理ブロックアドレスと、ストレージ部33の論理ブロックアドレスとを対応付けている。LBA変換テーブルを用いることにより、ブロックデバイス制御部61は、ブロックデバイスにおける特定の論理ブロックアドレスのブロックが、ストレージ部33のどの位置に記憶されているかを管理することができる。なお、ブロックデバイス制御部61は、LBA変換テーブルで用いるブロックの単位を、ファイルシステムとは独立に設定してもよい。本実施形態においては、LBA変換テーブルで用いるブロックの単位は、一例として、ファイルシステムのブロック単位と同じ4KBである。
ブロックデバイスにおける指定された論理ブロックアドレスからデータを読み出す場合、ブロックデバイス制御部61は、LBA変換テーブルを参照してブロックデバイスの指定された論理ブロックアドレスに対応するストレージ部33の論理ブロックアドレスを特定する。そして、ブロックデバイス制御部61は、ストレージ部33における特定した位置からデータを読み出す。
ブロックデバイスにおける指定された論理ブロックアドレスにデータを書き込む場合、ブロックデバイス制御部61は、状態ビットマップを参照してストレージ部33上における何れのデータも書き込まれていない新たな領域を特定し、データを書き込む。そして、ブロックデバイス制御部61は、LBA変換テーブルにおける、ブロックデバイスの指定された論理ブロックアドレスに対応するストレージ部33の論理ブロックアドレスの内容を、実際にデータを書き込んだ新たな領域の論理ブロックアドレスに書き換える。
このように、ブロックデバイス制御部61は、ストレージ部33のデータを書き換える場合、上書きせずに新たな領域にデータを書き込む。これにより、ブロックデバイス制御部61は、シーケンシャルにデータを書き込むことができる。
また、ブロックデバイス制御部61は、所定のタイミングで、ガベージコレクションを実行する。ガベージコレクションでは、ブロックデバイス制御部61は、状態ビットマップを走査し、使用中のブロックが少ないブロックセットを再利用する。具体的には、ブロックデバイス制御部61は、使用中のブロックが1個であるエントリ、使用中のブロックが2個であるエントリ、…といったように使用中のブロックが少ない順にブロックセットを探索し、探索されたブロックセットの中の使用中のブロックを検出していく。そして、ブロックデバイス制御部61は、使用中のブロックの数が1ブロックセット分(例えば128ブロック分)検出されたところで、検出されたブロックを1つのブロックセットにまとめる。
このようなガベージコレクションを実行することにより、ブロックデバイス制御部61は、ストレージ部33における新たに書き込みが可能な領域(全てのブロックが未使用のブロックセット)を形成することができる。ブロックデバイス制御部61は、このようなガベージコレクションを、例えば全てのブロックセットのうち未使用ブロックセットの数が一定割合以下(例えば、4分の1以下)となった場合に実行してもよい。また、ブロックデバイス制御部61は、状態ビットマップを更新した結果使用中のブロックが少ないブロックセットが発生した場合に、このブロックセットを、近隣の他のブロックセットと合成してもよい。
つぎに、ブロックデバイス制御部61が書き込み要求を受けた場合の具体的な処理例について説明する。
例えば、図23に示すように、仮想管理部45は、個別管理部44に対して、仮想ファイルシステムの管理情報およびデータ情報等のストレージ部33への書き込みを指示する。また、これを受けた個別管理部44は、ブロックデバイス制御部61に対して、ブロックデバイスの先頭から数えた番号でBlock #4、Block #391、Block #21、…、Block #275、…というように書き込み要求をしたとする。
この場合、ブロックデバイス制御部61は、128ブロック分の書き込みの要求を受け取るまで、これらの書き込み要求を保持する。ブロックデバイス制御部61は、128ブロック分の書き込み要求を受け取ると、これらを1つのブロックセットとしてまとめてストレージ部33に書き込む。この場合、ブロックデバイス制御部61は、状態ビットマップを参照して書き込み位置を決定する。ブロックデバイス制御部61は、状態ビットマップのブロックセット番号0から全てのビットが0であるエントリを探す。図24の例の場合、ブロックセット番号5が全て0である。従って、ブロックデバイス制御部61は、ブロックセット番号5の位置にブロックセットを書き込むことを決定する。ブロックデバイス制御部61は、状態ビットマップにおけるブロックセット番号5の全ビットを使用中を示す1に書き換え、ストレージ部33におけるブロックセット番号5の位置にブロックセットを書き込む。なお、ブロックのサイズが4KBであるので、ブロックセット番号5の位置は、先頭から数えると768ブロック目となる。
ブロックデバイス制御部61は、ストレージ部33への書き込みが完了すると、LBA変換テーブルを更新する。書き込んだブロックの先頭のブロックは、ブロックデバイスの論理ブロックアドレスが4である。ブロックデバイス制御部61は、LBA変換テーブルの、ブロックデバイスの論理ブロックアドレスが4のエントリのストレージ部33の論理ブロックアドレスを、過去に書き込まれていた257から今回書き込んだ位置である768に書き換える。
そして、ブロックデバイス制御部61は、参照されなくなったストレージ部33の257番目のブロックについて状態ビットマップを更新する。257番目のブロックはブロックセット番号2の0ビット目に該当する。従って、ブロックデバイス制御部61は、ブロックセット番号2の0ビット目のビットを1から0に更新する。ブロックデバイス制御部61は、391番目のブロック、21番目のブロック、…、275番目のブロックに対しても、同様に処理を行う。
一方、ブロックデバイス制御部61が読み出し要求を受けた場合は、具体的には次のように処理がされる。
個別管理部44は、ブロックデバイス制御部61に対して、ブロックデバイスの論理アドレス4096(論理ブロックアドレス1)の読み出し要求を与えたとする。この場合、ブロックデバイス制御部61は、LBA変換テーブルを参照して、ブロックデバイスの論理ブロックアドレス1をストレージ部33の論理ブロックアドレス998に変換する。ストレージ部33の論理ブロックアドレス998に対応する論理アドレスは、998×4096=4087808となる。従って、ブロックデバイス制御部61は、ストレージ制御部43に対して、論理アドレス4087808を指定して読み出しリクエストを与える。
図26は、第3の実施形態に係る不揮発記憶部31に記憶されるブロックデバイスに関連するブロックデバイス情報の関係を示す図である。不揮発記憶管理部46は、ブロックデバイス情報を再起動後も復元可能なよう不揮発記憶部31に記憶させる。具体的には、不揮発記憶管理部46は、ブロックデバイス情報に含まれる各情報が、スタートポイントから辿ることが可能に不揮発記憶部31に記憶される。
ブロックデバイス情報は、blkdev_startと、blkdev_listと、blkdevとを含む。blkdev_startは、ブロックデバイス情報のスタートポイント構造体である。blkdev_listは、ブロックデバイス情報リスト構造体である。blkdevは、ブロックデバイス識別情報構造体である。ブロックデバイス情報は、作成されたブロックデバイス毎にblkdevを含む。また、ブロックデバイス情報は、それぞれのblkdevに対応してblkdev_listを含む。
blkdev_startは、最初のblkdev_listへのポインタを含む。blkdev_listは、次のエントリのblkdev_listへのポインタと、対応するblkdevへのポインタを含む。blkdevは、ブロックデバイス識別情報とLBA変換テーブルとを含む。
ブロックデバイス情報は、不揮発記憶部31のLBA変換テーブルと、ストレージ部33との対応を判断するために用いられる情報である。ブロックデバイス識別情報は、一例として、ブロックデバイスの作成時に生成したUUIDである。UUIDは、ストレージ部33の先頭と、blkdevとに格納される。ブロックデバイス制御部61は、ストレージ部33の先頭のUUIDとblkdevのUUIDとが一致することを条件として、不揮発記憶部31に記憶されているブロックデバイス情報を有効にする。これにより、ブロックデバイス制御部61は、異なるブロックデバイス情報に基づきブロックデバイスを管理することを防ぐことができる。
図27は、ブロックデバイスの作成時の処理を示すフローチャートである。ブロックデバイスの作成指示をユーザ等から受け取った場合、ブロックデバイス制御部61は、図27に示す処理を実行する。
まず、ブロックデバイス制御部61は、指定されたストレージ部33からブロックデバイス識別情報(例えばUUID)を取得する。また、ブロックデバイス制御部61は、不揮発記憶管理部46を介して不揮発記憶部31にアクセスして、blkdev_startからblkdev_listを辿り、blkdevのブロックデバイス識別情報に格納されているUUIDを取得して、ストレージ部33上のブロックデバイス識別情報と比較する(ステップS181)。
ブロックデバイス識別情報が一致しない場合(ステップS181のNo)、ブロックデバイス制御部61は、不揮発記憶管理部46を介して、不揮発記憶部31に、blkdev_start、blkdev_list、blkdevの領域を確保する。そして、ブロックデバイス制御部61は、blkdevのLBA変換テーブルを、例えばブロックデバイスの論理ブロックアドレスとストレージ部33の論理ブロックアドレスとが同一の値となるように初期化する(S182)。さらに、ブロックデバイス制御部61は、ブロックデバイス識別情報を生成して、ストレージ部33の先頭と、blkdevとに記憶させて、blkdev_start、blkdev_list、blkdevの間のポインタを接続する。
ブロックデバイス識別情報が一致した場合(ステップS181のYes)、ブロックデバイス制御部61は、作成したブロックデバイスが、ブロックデバイス識別情報が一致したblkdevを参照するように設定する(S183)。これにより、ブロックデバイス制御部61は、ブロックデバイス識別情報が一致したblkdevのLBA変換テーブルを用いて、ブロックデバイスを実現することができる。
S183に続いて、ブロックデバイス制御部61は、状態ビットマップを復元する(S184)。ブロックデバイス制御部61は、最初に状態ビットマップを全て0に初期化し、不揮発記憶部31に記憶されているLBA変換テーブルを先頭から走査していき、ストレージ部33の論理ブロックアドレスに対応するブロックが使用されているか否かを調査する。ブロックデバイス制御部61は、ブロックが使用されていれば、対応するビットを1に設定する。このような処理をすることにより、ブロックデバイス制御部61は、状態ビットマップの状態を復元することができる。
ブロックデバイス制御部61は、ステップS182またはステップS184の処理を終えると、本フローを終了する。
なお、本実施形態において、状態ビットマップは、揮発記憶部32に記憶される。しかし、状態ビットマップは、不揮発記憶部31に、再起動後も復元可能なように記憶されてもよい。これにより、ブロックデバイス制御部61は、再度、ブロックデバイスが作成された場合に、LBA変換テーブルを走査することなく状態ビットマップを復元することができる。
また、ブロックデバイス制御部61は、例えば複数のストレージデバイス24または複数のパーティションを組み合わせて新たな論理アドレスを構築し、仮想的な1つのブロックデバイスを構成してもよい。また、情報処理装置10は、複数のブロックデバイス制御部61を有して、複数のブロックデバイスを併行に動作させてもよい。例えば、一方がログ構造書き込みをするブロックデバイスであり、他方が複数のストレージデバイス24を仮想的に1つにしたブロックデバイスであってもよい。また、この場合、複数のブロックデバイスを併行に動作させる場合、ストレージ制御部43は、それぞれのブロックデバイス制御部61からリクエストを受けてストレージデバイス24にアクセスする。
また、本実施形態においては、ブロックデバイスの作成時にLBA変換テーブルを不揮発記憶部31に記憶させて、以後、ブロックデバイスが解放されても、不揮発記憶部31にLBA変換テーブルを記憶させ続ける例を示した。これに代えて、ブロックデバイス制御部61は、ブロックデバイスを解放するときに、LBA変換テーブルをストレージ部33に書き戻してもよい。これにより、ブロックデバイスを作成しない場合、不揮発記憶部31のブロックデバイス情報が記憶されていた領域に他の情報を記憶させることができる。本実施形態においては、ブロックデバイス制御部61は、不揮発記憶管理部46を介して不揮発記憶部31にアクセスしていたが、ストレージ制御部43から不揮発記憶管理部46を介して不揮発記憶部31にアクセスしてもよい。
以上のように、第3の実施形態に係る情報処理装置10によれば、不揮発記憶部31にLBA変換テーブルを記憶し、ログ構造で高速な書き込みが可能なブロックデバイスを実現することができる。これにより、第3の実施形態に係る情報処理装置10によれば、仮想ファイルシステムの管理情報およびデータ情報等をキャッシュして不揮発記憶部31の空き容量が少なくなった場合も、ストレージ部33に高速にデータを書き戻して、不揮発記憶部31の空き容量を増やすことができる。
なお、以上のような情報処理装置10は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用いることでも実現することが可能である。すなわち、ストレージ制御部43、個別管理部44、仮想管理部45、不揮発記憶管理部46および揮発記憶管理部47は、コンピュータ装置に搭載されたプロセッサ21にプログラムを実行させることにより実現することができる。このとき、情報処理装置10は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、CD−ROMなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、請求の範囲に記載された発明とその均等の範囲に含まれる。