Fedora5/RHEL4 cloopでLinux圧縮ファイルシステムを作る
- 1.はじめに
- 2.手順(cloopデバイスの組み込み)
- 3.手順(cloopファイルの作成とマウント)
1.はじめに
cloopは、Debian系の1CD Linuxとして有名なKNOPPIXのルートファイルシステムとして利用されていることで有名であるが、redhat系カーネルでの動作事例はインターネット上にあまりなく、あっても多くが古い情報である。
今回、FedoraCore5とRHEL4にcloopしたので、その導入手順を纏める。(手順はFedoraCore5ベースで記述するが、RHEL4でもほとんど手順は同じである。)
※cloopは、読み込み専用のファイルシステム。
2.手順(cloopデバイスの組み込み)
(1)前提のパッケージ
(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
(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) <以下略>
(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スクリプト
Fedora/RHEL cloop自動マウント用rcスクリプト
OS起動停止時に、cloopモジュールロード・アンロードとcloopファイルシステムのマウント・アンマウントを行うrcシェルを作る。
cloopモジュールの実装は → こちらを参照
1.cloop用シェル
サンプルシェル(cloop)を以下に示す。
#!/bin/sh # script to start and stop cloop devices # and mount and umount cloop filesystems # # chkconfig: 35 60 20 # description: Starts, stops cloop modules # # set the maximum number of cloop device # refer to the MAX_CLOOP in compressed_loop.c MAX_CLOOP=8 CLOOP_DEV[0]=/dev/cloop0 CLOOP_FIL[0]=/tmp/a.cloop CLOOP_DIR[0]=/tmp/a #CLOOP_DEV[1]=/dev/cloop1 #CLOOP_FIL[1]=/dummy1 #CLOOP_DIR[1]=/dummy1 #CLOOP_DEV[2]=/dev/cloop2 #CLOOP_FIL[2]=/dummyr2 #CLOOP_DIR[2]=/dummy2 #CLOOP_DEV[3]=/dev/cloop3 #CLOOP_FIL[3]=/dummy3 #CLOOP_DIR[3]=/dummy3 # Source function library. . /etc/init.d/functions function abend(){ echo ERROR: $@ failure exit 1 } function load_cloop_module(){ lsmod |grep cloop > /dev/null [ $? -eq 0 ] && (echo "cloop has already been loaded.";return ) modprobe cloop [ $? -ne 0 ] && abend can not load the cloop module. i=0; FLAG=FALSE while [ $i -lt 10 ] do sleep 1 if [ -b "/dev/cloop`expr $MAX_CLOOP - 1`" ] then FLAG=TRUE; break fi i=`expr $i + 1` done [ "$FLAG" != TRUE ] && abend not found the maximum cloop device. } function bind_and_mount(){ # check a cloop device [ -b $1 ] || abend $1 is a invalid cloop device. # check a cloop file [ -f $2 ] || abend not found $2 file. head -3 $2 | grep cloop 2>&1 > /dev/null [ $? -eq 0 ] || abend $2 is a invalid cloop file. # check mount directory [ -d $3 ] || abend $3 is not directory. losetup $1 $2 || abend can not bind $2 file to $1 device. mount -r -t iso9660 $1 $3 || abend can not mount $1 on $3. } function start(){ load_cloop_module i=0 while [ -n "${CLOOP_DEV[$i]}" -a \ -n "${CLOOP_FIL[$i]}" -a \ -n "${CLOOP_DIR[$i]}" ] do bind_and_mount ${CLOOP_DEV[$i]} ${CLOOP_FIL[$i]} ${CLOOP_DIR[$i]} i=`expr $i + 1` done success touch /var/lock/subsys/cloop } function stop(){ i=0 while [ -n "${CLOOP_DEV[$i]}" -a \ -n "${CLOOP_FIL[$i]}" -a \ -n "${CLOOP_DIR[$i]}" ] do umount ${CLOOP_DIR[$i]} losetup -d ${CLOOP_DEV[$i]} i=`expr $i + 1` done modprobe -r cloop success rm -f /var/lock/subsys/cloop } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart|reload) stop start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit 0
※備考
環境に応じて、下記パラメータを設定する。
(a)MAX_CLOOP=8
→cloopデバイスの最大数。compressed_loop.cの"#define CLOOP_MAX"の値を設定する。
2.シェルの組み込み
(1)上記のサンプルシェルを/etc/init.dに配置する。
# vi /etc/init.d/cloop # chown root:root /etc/init.d/cloop # chmod 755 /etc/init.d/cloop