# 読み込み専用ルートファイルシステムイメージの構築マニュアル

Last modified: $Date: 2006-11-25 10:18:46 +0900 (Sat, 25 Nov 2006) $

TOMOYO Linux には、読み込み専用マウントされていることが原因でエラーとなったアクセスを表示する機能があります。この機能を利用して、 VMware 上で読み込み専用マウントが可能なルートファイルシステムを作成する手順について紹介します。

# １．前提

## 1.1 用意するもの

通常の TOMOYO Linux の手順で必要とするファイルの他に、以下のものが必要です。 VMware では ISO イメージファイルを CD の代わりに指定できるので、 CD に焼き付ける必要はありません。

- VMware Player （http://www.vmware.com/products/player/）
- KNOPPIX の ISO イメージファイル （http://unit.aist.go.jp/itri/knoppix/）
- VM環境用に割り当てるIPアドレスとホスト名

## 1.2 パーティション構成

運用環境では / は読み込み専用になるため、 /var や /tmp への書き込みが必要なアプリケーションのために書き込み可能なパーティションとして /data を割り当てます。ここでは、以下のパーティション構成で構築するものとします。

VM環境名 | ホスト名 | パーティション構成
コンパイル環境 | compile | /dev/sda1 ext3 /
イメージ構築環境 | build | /dev/sda1 ext3 /data /dev/sda2 ext3 /

「イメージ構築環境」の /data パーティションは / パーティションの２倍以上の大きさを割り当てておきます。

ホストOS側に、VM環境からホスト側OSへファイル転送を行う方法（scp や ftp 等）を用意しておきます。

# ２．準備

TOMOYO Linux導入手順（簡易版）の「ポリシーの作成準備」の直前までの操作を行います。
ただし、カーネルコンフィグにおいて、以下の項目をビルトインとして指定してください。 initrd-loop.img には insmod が含まれていないため、モジュールではなくビルトインにする必要があります。

カーネル 2.4 系の場合 Block devices ---> <*> Loopback device support Block devices ---> <*> RAM disk support Block devices ---> [*] Initial RAM disk (initrd) support File systems ---> <*> Ext3 journalling file system support File systems ---> <*> ISO 9660 CDROM file system support File systems ---> [*] SAKURA (Domain-Free Mandatory Access Control) support File systems ---> [*] Read-only filesystem error tracing support File systems ---> <*> SYAORAN (Tamper-Proof Device Filesystem) support SCSI support ---> <*> SCSI support SCSI support ---> <*> SCSI disk support SCSI support ---> <*> SCSI CD-ROM support SCSI support ---> <*> SCSI generic support SCSI support ---> SCSI low-level drivers ---> <*> BusLogic SCSI support Fusion MPT device support ---> <*> Fusion MPT (base + ScsiHost) drivers ATA/IDE/MFM/RLL support ---> <*> ATA/IDE/MFM/RLL support ATA/IDE/MFM/RLL support ---> IDE, ATA and ATAPI Block devices ---> <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support ATA/IDE/MFM/RLL support ---> IDE, ATA and ATAPI Block devices ---> <*> Include IDE/ATAPI CDROM support ATA/IDE/MFM/RLL support ---> IDE, ATA and ATAPI Block devices ---> <*> SCSI emulation support Network device support ---> [*] Network device support Network device support ---> Ethernet (10 or 100Mbit) ---> [*] Ethernet (10 or 100Mbit) Network device support ---> Ethernet (10 or 100Mbit) ---> [*] EISA, VLB, PCI and on board controllers Network device support ---> Ethernet (10 or 100Mbit) ---> <*> AMD PCnet32 PCI support
カーネル 2.6 系の場合 Device Drivers ---> Block devices ---> <*> Loopback device support Device Drivers ---> Block devices ---> <*> RAM disk support Device Drivers ---> Block devices ---> [*] Initial RAM disk (initrd) support File systems ---> <*> Ext3 journalling file system support File systems ---> CD-ROM/DVD Filesystems ---> <*> ISO 9660 CDROM file system support File systems ---> [*] SAKURA (Domain-Free Mandatory Access Control) support File systems ---> [*] Read-only filesystem error tracing support File systems ---> <*> SYAORAN (Tamper-Proof Device Filesystem) support Device Drivers ---> SCSI device support ---> <*> SCSI disk support Device Drivers ---> SCSI device support ---> <*> SCSI CDROM support Device Drivers ---> SCSI device support ---> <*> SCSI generic support Device Drivers ---> SCSI device support ---> SCSI low-level drivers ---> <*> BusLogic SCSI support (2.6.12 以前) Device Drivers ---> Fusion MPT device support ---> <*> Fusion MPT (base + ScsiHost) drivers (2.6.13 以降) Device Drivers ---> Fusion MPT device support ---> <*> Fusion MPT ScsiHost drivers for SPI Device Drivers ---> ATA/ATAPI/MFM/RLL support ---> <*> ATA/ATAPI/MFM/RLL support Device Drivers ---> ATA/ATAPI/MFM/RLL support ---> <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support Device Drivers ---> ATA/ATAPI/MFM/RLL support ---> <*> Include IDE/ATAPI CDROM support Device Drivers ---> ATA/ATAPI/MFM/RLL support ---> <*> SCSI emulation support Device Drivers ---> Network device support ---> [*] Network device support Device Drivers ---> Network device support ---> Ethernet (10 or 100Mbit) ---> [*] Ethernet (10 or 100Mbit) Device Drivers ---> Network device support ---> Ethernet (10 or 100Mbit) ---> [*] EISA, VLB, PCI and on board controllers Device Drivers ---> Network device support ---> Ethernet (10 or 100Mbit) ---> <*> AMD PCnet32 PCI support

# ３．デバイスファイルの保護

/dev ディレクトリが読み込み専用だとシステムが正しく動作できないので、 SYAORAN ファイルシステムをマウントします。 devfs や udev でも構いませんが、その場合はデバイスファイルの改ざんを防止できなくなります。

以下の操作を行い、/.syaoranというスクリプトを作成します。

echo '#! /bin/sh' > /.syaoran echo 'mount -n -t syaoran -o accept=/root/security/syaoran.conf none /dev' >> /.syaoran echo 'exec /sbin/init "$@"' >> /.syaoran chmod 700 /.syaoran

/sbin/init を起動する直前にマウントされるようにするために、 TOMOYO Linux カーネルの起動時に init=/.syaoran というパラメータを追加してください。毎回指定するのは面倒なので、ブートローダの設定ファイルで指定しておくことを推奨します。

以下の操作を行い、全てのエントリを含んだ初期状態の /root/security/syaoran.conf を作成します。

mkdir -p /root/security /root/ccstools/makesyaoranconf > /root/security/syaoran.conf

なお、 /dataパーティション以外へのアクセスを禁止するために、 /root/security/syaoran.conf から /dev/sda1 以外の /dev/sda* を除外しておいてください。

とりあえずこれだけでも動作します。 /root/security/syaoran.conf に含まれる不要なエントリを削除したい場合は、「デバイスファイルの保護（任意）」を参照してください。

# ４．読み込み専用化のための修正

/etc/mtab は読み込み専用になるので、 /proc/mounts を参照するように変更します。

ln -sf /proc/mounts /etc/mtab

/etc/adjtime も読み込み専用になるので、 /dev/null を参照するように変更します。

ln -sf /dev/null /etc/adjtime

起動時に自動実行されるスクリプトで / を読み書きモードで再マウントされないようにします。

以下は RedHat Linux 9 および Fedora Core 3 における例です。

sed -i 's:mount -n -o remount,rw /:/root/ccstools/remount_rootfs:' /etc/rc.d/rc.sysinit

以下は Debian Sarge における例です。

sed -i 's:#.*Remount.*:&\ngrep -q readonly /proc/cmdline \&\& rootmode=ro' /etc/init.d/checkroot.sh

起動時に自動実行されるスクリプトで / の fsck が実行されないようにします。

以下は RedHat Linux 9 における例です。

sed -i 's:initlog -c "fsck -T -a $fsckoptions /":echo "Skipped":' /etc/rc.d/rc.sysinit

以下は Fedora Core 3 における例です。

sed -i 's:fsck -T -a $rootdev $fsckoptions:echo Skipped:' /etc/rc.d/rc.sysinit

Debian Sarge の場合は /etc/fstab で <mount point> が / となっている行の <pass> を 0 にします。

カーネルを起動するときに readonly というオプションを指定した場合、 remount_rootfs は / を読み書きモードで再マウントしないようになります。これにより、 / が読み込み専用マウントされた状態で起動します。ただし、何の準備もせずに / を読み込み専用で起動しようとすると、途中でハングアップしてしまう場合があります。そのため、書き込みが発生するファイルを見つけ出して、書き込み可能なパーティションへ移動させるという手順が必要になります。

書き込みが発生するファイルやディレクトリを知るために、 /root/security/profile0.txt に TRACE_READONLY=1 という行を追加することができます。この行を追加して TOMOYO Linux カーネルで再起動すると、読み込み専用ファイルシステムであることが原因でエラーになった書き込みアクセスが行われたファイルやディレクトリ名が syslog に送られます。 /var/log/messages の ReadOnly: を含む行を抽出し、どのファイルやディレクトリを移動させる必要があるかを判断してください。移動先は /data パーティションとし、シンボリックリンクで参照させます。なお、読み込み専用ファイルシステムが原因のエラーを全て検知できるわけではないので注意してください。

以下は書き込み可能なパーティションへ移動させるべきファイルやディレクトリの例です。ディストリビューションやインストールされているアプリケーションによって異なります。

- /tmp/
- /var/run/
- /var/lock/
- /var/log/
- /var/tmp/
- /var/spool/mail/
- /var/lib/random-seed

この時点で、必要な操作がエラー無く行えることを確認してください。

# ５．ブートローダの設定

「コンパイル環境」で使用中のディストリビューションに ISO イメージ用のブートローダである stage2_eltorito が含まれていない場合は grub のパッケージから抽出してください。以下は FedoraCore 3 用の grub パッケージから抽出する例です。ディストリビューションに付属している場合はそれを「コンパイル環境」の /boot/grub/ にコピーしてください。

cd /tmp wget ftp://rpmfind.net/linux/fedora/core/3/i386/os/Fedora/RPMS/grub-0.95-3.i386.rpm rpm2cpio < grub-0.95-3.i386.rpm | cpio -idm '*/stage2_eltorito' mv usr/share/grub/i386-redhat/stage2_eltorito /boot/grub/

KNOPPIX の ISO イメージファイルを「イメージ構築環境」のＣＤイメージとして指定し、「イメージ構築環境」を起動します。

「コンパイル環境」から ISO イメージ用のブートローダである stage2_eltorito を /mnt/sda1/IMAGE/boot/grub/ にコピーします。また、カーネルと initrd-loop.img もコピーしてください。なお、 vmlinuz-2.4.32-ccs の部分は使用しているカーネルのバージョンに合わせて読み替えてください。

mount /dev/sda1 /mnt/sda1 mkdir -p /mnt/sda1/IMAGE/boot/grub scp -p compile:/boot/grub/stage2_eltorito /mnt/sda1/IMAGE/boot/grub/ scp -p compile:/boot/grub/splash.xpm.gz /mnt/sda1/IMAGE/boot/grub/ scp -p compile:/boot/vmlinuz-2.4.32-ccs /mnt/sda1/IMAGE/vmlinuz scp -p compile:/root/ccstools/initrd-loop.img /mnt/sda1/IMAGE/ cat > /mnt/sda1/IMAGE/boot/grub/grub.conf << EOF default=0 timeout=10 splashimage=/boot/grub/splash.xpm.gz title SAKURA Linux kernel /vmlinuz fastboot init=/.syaoran root=/dev/scd0 hdc=ide-scsi initrd /initrd-loop.img EOF ln -s grub.conf /mnt/sda1/IMAGE/boot/grub/menu.lst

# ６．イメージの作成

KNOPPIX の ISO イメージファイルを「イメージ構築環境」のＣＤイメージとして指定し、「イメージ構築環境」を起動します。

ループバックマウントイメージファイルを作成して / パーティションの内容をコピーします。イメージファイルの大きさは df /dev/sda2 の情報を参考にして決めます。以下の例では６４０ＭＢのイメージを作成します。

mount /dev/sda1 /mnt/sda1 mount -o ro /dev/sda2 /mnt/sda2 touch /mnt/sda1/IMAGE/rootimg mke2fs -j -F -m 0 -b 1024 /mnt/sda1/IMAGE/rootimg 655360 mount -o loop /mnt/sda1/IMAGE/rootimg /mnt/sda1/ cp -a /mnt/sda2/* /mnt/sda1/ sync umount -d /mnt/sda1/ e2fsck -f /mnt/sda1/IMAGE/rootimg

正常にコピーできたら ISOイメージファイルに変換します。

cd /mnt/sda1/IMAGE/ mkisofs -R -o /mnt/sda1/image.iso -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table .

/mnt/sda1/image.iso をホストOS側に転送します。転送後は /data パーティションから削除するのを忘れないように注意してください。

目次へ戻る