Linuxでは、マウント対象となるファイルはHDDなどの「デバイスファイル(注5)」である必要があります。一方、tarファイルはデバイスファイルではない(通常ファイル)ので、そのままマウントできません。
Linuxには「ループバックデバイス(注6)」という特殊なデバイスファイルがあり、通常ファイルをあたかもデバイスファイルのように見せ掛けてくれるものが用意されています。つまり、このデバイスファイルを利用するとで、tarファイルをマウントできるようになるのです(便利ですねー)。
ループバックデバイスのセットアップには、「losetup(8)」というコマンドを使います。使い方は以下のとおりです。
(1)まず、使用可能なループバックデバイスを検索
$ losetup -f
(2)(1)で見つかったループバックデバイスと通常ファイルを関連付ける(注7)
$ losetup /dev/loop0 通常ファイル
これで、「/dev/loop0」というデバイスに対するアクセスは、関連付けられた通常ファイルへのアクセスへと変換されるようになります。
$ losetup /dev/loop0
それでは実際に、testDir.tarをセットアップしてみましょう(図4)。
これで、/dev/loop0は、testDir.tarとして関連付けられましたので、マウント用のデバイスファイルとして使うことができます。
連載第3回「ファイルシステムってそんなに簡単に作れるの?」のデモ動画を見て、以下の点に気付かれた方、とても鋭いです。
これまでの説明からすると、まず、圧縮された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点です。
以上をまとめると、mount.tarfsの処理の流れは以下のようになります。
読者の方は、もうtarfsのソースコードはお読みになられたでしょうか? ソースを見ていただければ分かると思いますが、mount.tarfsはシェルスクリプトで実装されています。ただし、(4)と(5)の処理は、mount(2)システムコール呼び出しや、/etc/mtab操作用Linuxのライブラリ(setmntent(3)、addmntent(3)、endmntent(3))を使用する必要があるため、「tarfsmount」コマンドとして、C言語で実装しました。両方あわせても約100ステップ程度のコードですので、ぜひ、読解されることをお勧めします。
今回で、tarfsのメタデータおよびマウントの処理の流れは一通り説明し終わりました。長い道のりでしたが、これでファイルシステムの“骨組み”部分の説明はできたことになります。次回からいよいよ、その“肉付け”に入ります。
いざ、Linuxカーネルの世界へ!(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.