試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

読み取るだけのファイルやディレクトリを圧縮しつつ、無圧縮時と同様に扱う(圧縮とマウント)

昨日の記事の続きとして、読み取り専用圧縮ファイルシステムの作成(圧縮)と、そのマウントに関してを扱う。

Squashfsファイルシステムを作成(圧縮)

squashfs-tools」というパッケージがGentoo,Debian,Ubuntuには用意されている。この中のmksquashfsコマンドでファイルやディレクトリをSquashfsのファイルに圧縮する。

$ mksquashfs [ファイルやディレクトリ...] [出力ファイル]

もし、全てのファイルやディレクトリの所有者をrootにしたいのであれば

$ mksquashfs [ファイルやディレクトリ...] [出力ファイル] -all-root

とする。オプションは最後に付けるという点に注意。

Cromfsのファイルシステムを作成(圧縮)

Cromfsのファイルシステムに圧縮するにはmkcromfsコマンドを使用する。圧縮には非常に時間がかかるので注意。

一時ディレクトリの指定

mkcromfsは、環境変数TEMPの値に指定したディレクトリの中に一時ファイルを生成し、省略時には/tmp/以下を使用するため、もし/tmpをtmpfs*1でマウントしていて、巨大なファイルを圧縮するのであれば、この指定をしないとスワップがひどくなることがあり、ただでさえLZMAの圧縮が遅いのに、更に時間が余計にかかってしまう。

圧縮時にディスク領域を多めに使うことで圧縮を高速化

--decompresslookups(-e)オプションを付けると、ディスク領域を多少多めに使うが、圧縮処理を高速化してくれるので、使用を推奨。-r 100000(数字は例だが、大きい値を指定する)というオプションも同様に、圧縮時にディスク領域を多少多めに使い、圧縮処理を高速化する効果がある。

圧縮率を下げて、圧縮時間を短縮

--lzmafastbytesオプションで、圧縮率を指定できる。有効な範囲は5から273で、デフォルトは最大の273になっていて、これを下げることで、圧縮時間を短くでき、動作も多少軽くなる。手元での実験の結果では、圧縮率重視の場合でも、40より少ない値で十分そうだった(圧縮の対象によっては適した値が変わる可能性がある)。

端末への出力を抑制

-qオプションを付けると、出力が抑制される。-qqqと、3つ付けると、最も単純な出力となる。

その他オプション

本家ドキュメントの「To improve mkcromfs speed」を参考にする。マルチコアCPUでの--threadsなど、他にも圧縮を高速化する手段について書かれている。

圧縮の実際

引数にファイルは指定できず、あらかじめファイルシステムの一番上の階層として使用するディレクトリを用意し、その中にファイルやディレクトリを入れておく必要がある。用意したディレクトリの場所を引数にしてmkcromfsコマンドを実行。

$ TEMP=[空き容量の十分なパーティションの中のディレクトリ] mkcromfs -e -r 100000 --lzmafastbytes [圧縮率(5-273)] [ディレクトリ] [出力ファイル名]

Squashfsのマウントとマウント解除

CDイメージをマウントするのと同様、ループバックマウント*2を行う。これで、マウントポイントのディレクトリ以下を通じて、圧縮されたファイルに対してアクセスできるようになる。

$ sudo mount -t squashfs -o loop [Squashfsのファイル] [マウントポイント]
$ sudo umount [マウントポイント]

起動時に自動でマウントせず、一般ユーザ権限での手動マウントを可能にするためには、(管理者権限で)/etc/fstabに記述を追加し、オプションに「loop」「users」「noauto」を指定する必要がある。

[Squashfsファイルの場所] [マウントポイント] squashfs loop,users,noauto 0 0

これで、一般ユーザ権限でも

$ mount [マウントポイント]
$ umount [マウントポイント]

のようにしてマウントとマウント解除ができるようになる。
起動時に自動でマウントするようにしたい場合、「noauto」は付けず、一般ユーザでのマウントとマウント解除ができないようにするには「users」を付けないようにする。

Cromfsのマウントとマウント解除

一般ユーザが書き込めるマウントポイントをホームディレクトリの中などに作成する。書き込み権限のないところをマウントポイントに指定すると

fusermount: user has no write access to mountpoint [書き込めないマウントポイント]

となり、マウントに失敗するが、その場所が使いたいのなら、sudoを使用してroot権限でマウントとマウント解除をする。
下の例では、${HOME}/mnt/というディレクトリを事前に作成しておく必要がある。

$ cromfs-driver [Cromfsファイルの場所] ~/mnt

マウント解除は

$ fusermount -u ~/mnt

のようにして行う。
(2007/9/3)sudoを使用してroot権限でマウントする場合、

$ sudo cromfs-driver /path/to/OOo-2.2.1.cromfs /usr/lib32/openoffice -o nonempty -o allow_other

のように、-o allow_otherオプションを付けないと、root以外でアクセスできない。-o nonemptyは、空でないディレクトリをマウントポイントに指定するために使用しているが、空のディレクトリにマウントする場合は付けなくてよい(上の例は実験のために空でない/usr/lib32/openofficeにマウントしている)

関連記事:

*1:メモリの一部を一時的なファイルシステムとして使用するもので、読み書きが非常に高速

*2:既にマウントされているファイルシステム内の、あるファイル(ファイルという形のファイルシステムデータ)に対して、それをファイルシステムとして、どこかのディレクトリにマウントすること