のぴぴのメモ

自分用のLinuxとかの技術メモ

Fedora5/RHEL4 cloopでLinux圧縮ファイルシステムを作る

1.はじめに

 cloopは、Debian系の1CD Linuxとして有名なKNOPPIXのルートファイルシステムとして利用されていることで有名であるが、redhatカーネルでの動作事例はインターネット上にあまりなく、あっても多くが古い情報である。
 今回、FedoraCore5とRHEL4にcloopしたので、その導入手順を纏める。(手順はFedoraCore5ベースで記述するが、RHEL4でもほとんど手順は同じである。)

※cloopは、読み込み専用のファイルシステム

2.手順(cloopデバイスの組み込み)

(1)前提のパッケージ

(i) カーネルソースコード

  適用するカーネルソースコードを用意する。
   ※ディストリビューションによっては、
    カーネルのヘッダファイルが標準でインストール
    されている。(/usr/src/kenelの下など)その場合は、
    別途ソースコードをインストールする必要はない。(2007.7.21追記)

(ii) zlib-devel(zlib開発用ライブラリ)

  zlib-develがインストールされてなければインストールする。
    ・zlib-develの確認

# rpm -q zlib-devel
    ・zlib-develがなければインストール
# yum install zlib-devel

(2)cloopソースコードの入手

 cloopのREADMEには、KNOPPIXの公式サイトの記載があるが、最新のソースコードは見当たらない。探したところ、Debianのunstableパッケージから入手が可能である。
 最新版は、"cloop-2.05~20060829"(2007.3.2現在)

(i)Debian公式サイトへ行く
(ii)下記順番でクリックする

  ・「Debian パッケージ」
  ・「不安定版 (unstable) ディストリビューションのパッケージを見る」
  ・「Miscellaneous」
  ・「cloop-src」パッケージを選択

(iii)記事執筆時点の最新版(と思われる)「cloop_2.05~20060829-1.tar.gz」をダウンロード

(3)cloopのソースの展開とコンパイル&インストール

(i)ソースコードの展開

  任意の場所(手順では/tmp)にtarのデータを展開する。

$ cd /tmp
$ tar -zxvf cloop_2.05~20060829-1.tar.gz 
$ cd cloop-2.05~20060829/
(ii)【RHEL4のみ】RHEL用にソースコードを修正

  RHELの場合、そのままではコンパイルが通らないため一部のソースを修正する。

$ vi compressed_loop.c

29行目の"REDHAT_KERNEL"のdefineのコメントをはずす。

before: 29: /* #define REDHAT_KERNEL */
after: 29: #define REDHAT_KERNEL
(iii)【任意】cloopデバイス最大数の変更

  必要に応じて、cloopデバイスの最大数を変更する。デフォルトは、8。

$ vi compressed_loop.c

26行目の"CLOOP_MAX"の値を必要に応じ変更する。

before: 26 #define CLOOP_MAX 8
after: 26 #define CLOOP_MAX 16
(vi)コンパイル
# make KERNEL_DIR=/usr/src/redhat/BUILD/kernel-2.6.19/linux-2.6.19.i686/
       ※KERNEL_DIR:カーネルソースコードディレクト
(v)モジュールのインストール

   kernel2.6系の場合cloop.koを使用する。
   cloop.koをカーネルライブラリのディレクトリにコピーし、
   モジュールの依存関係をチェックするする。

# mkdir -p /lib/modules/`uname -r`/misc && \
   cp cloop.ko /lib/modules/`uname -r`/misc;
# depmod -a

(4)cloopモジュールの組み込みテスト

 正常にcloopが組み込めるか確認する。

(i)モジュール情報の確認

   cloopのモジュール情報が出力されることを確認

# modinfo cloop
filename: /lib/modules/2.6.19-1.2288.2.1.fc5/misc/cloop.ko
description: Transparently decompressing loopback block device
author: Klaus Knopper (Kernel 2.4 and up, Knoppix version), Paul Russel (initial version)
<以下略>
(ii)モジュールの組み込みテスト

   モジュールの組み込み可否を確認する。

# modprobe cloop
# lsmod|grep cloop
cloop 15264 0 <-表示されることを確認
(iii)cloopデバイスの確認。

    udev機能により、cloopモジュール組み込みときcloopデバイスが自動的に生成される。
    cloopデバイスの有無を確認する。

# ls /dev/cloop*
/dev/cloop0 ・・・ <-表示されることを確認

(5)cloop関連コマンドのコピー

 create_compressed_fsとextract_compressed_fs(cloopソースコード内に梱包)をコピーする。

# install -m0755 create_compressed_fs /usr/local/bin/
# install -m0755 extract_compressed_fs /usr/local/bin/

3.手順(cloopファイルの作成とマウント)

(1)cloopファイルシステムの作成

 下記コマンドで、cloopのファイルシステムにしたいデータがあるディレクトリをcloopのフォーマットに変換する。

# mkisofs -r datadir | \
create_compressed_fs - 65536 > datadir.iso.compressed ;

datadir : 対象データのディレクトリ名
datadir.iso.compressed : cloopフォーマットのファイル名

(2)ファイルシステムのマウント

(i) cloopファイルをcloopデバイスにバインドする

   下記コマンドで、生成したcloopファイルとcloopのデバイスをくくりつける。<例:cloop0デバイスに、iso.compressedファイルを括り付ける>

# losetup /dev/cloop0 /tmp/datadir.iso.compressed
(ii) cloopをマウントする

   ファイルシステムをマウントする。

# mount -o ro -t whatever /dev/cloop0 /mnt/compressed

※OS起動停止時のcloopファイルシステムの自動マウント・アンマウントシェル(rcシェル)はこちらを参照→ 【Fedora/RHEL】cloop自動マウント用rcスクリプト