連載
» 2010年06月03日 00時00分 公開

tarファイルに魔法をかけてみよう! その2 = マウントの仕組み =作りながら理解するファイルシステムの仕組み(5)(2/2 ページ)

[森 崇 株式会社 永和システムマネジメント,@IT MONOist]
前のページへ 1|2       

2.メタデータを作成したtarファイルをデバイスファイルに変換する

 Linuxでは、マウント対象となるファイルはHDDなどの「デバイスファイル(注5)」である必要があります。一方、tarファイルはデバイスファイルではない(通常ファイル)ので、そのままマウントできません。

 Linuxには「ループバックデバイス(注6)」という特殊なデバイスファイルがあり、通常ファイルをあたかもデバイスファイルのように見せ掛けてくれるものが用意されています。つまり、このデバイスファイルを利用するとで、tarファイルをマウントできるようになるのです(便利ですねー)。

 ループバックデバイスのセットアップには、「losetup(8)」というコマンドを使います。使い方は以下のとおりです。

(1)まず、使用可能なループバックデバイスを検索

    $ losetup -f 
※ このコマンドを実行すると、使用可能なループバックデバイスが出力されます。例えば、“/dev/loop0”と出力されます

(2)(1)で見つかったループバックデバイスと通常ファイルを関連付ける(注7)

    $ losetup /dev/loop0 通常ファイル 

 これで、「/dev/loop0」というデバイスに対するアクセスは、関連付けられた通常ファイルへのアクセスへと変換されるようになります。

※注5:
/dev配下に配置されているファイルのことで、ブロックデバイスの場合は、「/dev/hda」や「/dev/sda」などです。


※注6:
主にCDイメージファイルをマウントするときに使われます。


※注7:
この確認として、以下のコマンドを実行すると、関連付けられた通常ファイルのパスが出力されます。

$ losetup /dev/loop0




 それでは実際に、testDir.tarをセットアップしてみましょう(図4)。

ループバックデバイスの作成 図4 ループバックデバイスの作成

 これで、/dev/loop0は、testDir.tarとして関連付けられましたので、マウント用のデバイスファイルとして使うことができます。

3.マウントする

 連載第3回「ファイルシステムってそんなに簡単に作れるの?」のデモ動画を見て、以下の点に気付かれた方、とても鋭いです。

(1)tarfsのマウントでは、mkfs.tarfsを実行していない
(2)マウントコマンドには、ループバックデバイスを渡していない
(3)対象となるtarファイルは圧縮(gzip)されている

 これまでの説明からすると、まず、圧縮されたtarファイルは解凍しなければなりませんよね。そして、mkfs.tarfsで、そのtarファイルにメタデータを構築する必要があります。その後、そのtarファイルをループバックデバイスと関連付けて、ようやくマウントできるようになるのですが、これでは、やらないといけないことが多過ぎます。とっても不便ですよね。

 ここでご紹介するLinuxのマウントの仕組みは、このようなことを解決するための方法です。

 まず、Linuxのマウントコマンドのマニュアルを参照してみると、「引数で指定されたファイルシステムタイプ(vfstype)に対して、/sbin/mount.vfstypeの存在確認を行い、あればそのコマンドを実行する」とあります。

 これはつまり、マウントコマンドの「vfstype」にtarfsを指定すると、tarfs専用のマウントコマンド(mount.tarfs)を実行してくれるということであり、ここにtarfsの魔法を仕掛ける余地があるというわけです。つまり、(1)(2)(3)の一連の処理を「mount.tarfs」で実行するのです!

 ただし、注意しないといけないこととして、mount.tarfsはマウントコマンドの代わりとなるわけですから、マウントコマンドが実行する処理を引き受ける必要も出てきます。それは何かというと、以下の2点です。

  1. Linuxカーネルへのマウント要求(mount(2))
  2. /etc/mtab(注8)へのマウント情報登録

 以上をまとめると、mount.tarfsの処理の流れは以下のようになります。

(1)tarファイルが圧縮されている場合は解凍
(2)tarファイルに対して、mkfs.tarfsを実行(注9)
(3)tarファイルをループバックデバイスと関連付ける
(4)mount(2)システムコールを発行
(5)/etc/mtabに、マウント情報を追加登録

 読者の方は、もうtarfsのソースコードはお読みになられたでしょうか? ソースを見ていただければ分かると思いますが、mount.tarfsはシェルスクリプトで実装されています。ただし、(4)(5)の処理は、mount(2)システムコール呼び出しや、/etc/mtab操作用Linuxのライブラリ(setmntent(3)、addmntent(3)、endmntent(3))を使用する必要があるため、「tarfsmount」コマンドとして、C言語で実装しました。両方あわせても約100ステップ程度のコードですので、ぜひ、読解されることをお勧めします。

※注8:
/etc/mtabには、現在マウントされているファイルシステムの一覧が登録されており、「mount」コマンドが引数なしで実行された場合には、このリストが表示されます。また、「df」コマンドも引数なしで実行された場合には、このリストを基にファイルシステム使用状況を表示します。このため、/etc/mtabにtarfsのマウント情報が登録されないと、これらのオペレーションでtarfsが表示されなくなり、困ったことになります。


※注9:
2回目以降のマウントでは、mkfs.tarfsでのメタデータ作成は不要であるため、最初にメタデータの存在確認を行い、あれば何もしません。



 今回で、tarfsのメタデータおよびマウントの処理の流れは一通り説明し終わりました。長い道のりでしたが、これでファイルシステムの“骨組み”部分の説明はできたことになります。次回からいよいよ、その“肉付け”に入ります。

 いざ、Linuxカーネルの世界へ!(次回に続く)


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.