Linuxカーネルでファイルシステム全体を管理する「ファイルシステム種別」と「スーパーブロック」について解説する
唐突ですが、図1はAndroidのファイルマネージャを使用している画像です。
図1上の画像は/system/app配下のapkファイルのリストを参照しているもので、図1下の画像は/sdcard配下の動画ファイルのリストを参照しているものです。どちらのディレクトリ上のファイルであっても、タップ操作などで簡単にファイルを操作できます。
しかし、/systemと/sdcardとでは、ファイルシステムの種類が違います。/systemの方は「ext2」で、/sdcardの方は「vfat」です。ファイルシステムの種類が違えば、メタデータの構造が違うので、根本的にファイルに対するアクセス方法はまったく異なります。ですが、わたしたちは、どのディレクトリでも同じ操作でファイルアクセスできますよね。これって不思議だと思いませんか?
このナゾを解き明かす仕組みがLinuxカーネルにあります。それが「仮想ファイルシステム(VFS)」というものです。
まず今回は、Linuxカーネルのファイルシステムの全体像を紹介し、VFS層で使用されているデータ構造の中でファイルシステム全体を管理する「ファイルシステム種別」と「スーパーブロック」について解説していきます。この際、前回「AndroidエミュレータでLinuxカーネルをデバッグ!!」で用いたデバッガを利用して、Androidエミュレータのカーネルデータを実際にのぞいてみたいと思います。
Linuxカーネルのファイルシステムの全体像を図2に示します。
アプリケーション(アプリ)は、ユーザー空間に存在しており、先ほどのファイルマネージャやAndroidアプリ、Dalvik VMなどもアプリに分類されます。
アプリがファイルにアクセスする場合、カーネル空間にあるデータにアクセスする必要があります。しかし、アプリのプログラムは、直接カーネル空間のデータにアクセスすることは許されていません。よって、アプリケーションプログラムとしては、カーネル空間への入り口であるシステムコールを呼び出し、CPUモードを特権モードに切り替え、間接的にファイルアクセス処理を実行することになります。
システムコールがファイルシステムに対するアクセスを行う場合は、必ずVFS層の処理を通ります。VFS層の処理概要は、連載第3回「ファイルシステムってそんなに簡単に作れるの」で簡単な例を挙げて説明していますが、ファイルシステムとして共通した処理やデータ構造をこの層で吸収しています。この層が存在するおかげで、多種類のファイルシステムが共通インターフェイスを通して共存できるようになります。そして、この共通インターフェイスこそが、すべてのファイルシステムに対するアクセスを統一するカギになります(注1)。
メタデータ操作などのファイルシステム固有の処理は、VFS層の共通インターフェイスで仮想化(関数ポインタ)されています。ローカルファイルシステム層では、このインターフェイスの仕様どおりに、ファイルシステム固有の処理が実装されています。
メタデータをHDDやフラッシュデバイスに書き出したり、読み込んだりする場合は、このデバイスドライバ層に対してI/O要求を行います。
VFS層では、多種多様なファイルシステムを共通のインターフェイスでアクセスできるようにする責務があります。そのため、さまざまなデータ構造が定義されていますが、今回は、その中でファイルシステム全体を管理するファイルシステム種別とスーパーブロックについて解説します。
Copyright © ITmedia, Inc. All Rights Reserved.