Dec 24, 2002 onlsbc1: コンパクトフラッシュ上のLinuxシステムの読み出し専用化 --- RAMディスク(その4) #7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/para-CAMAC/ Work/SBC-RAM7.html) 高エネルギー加速器研究機構 素粒子原子核研究所 物理、オンライングループ 井上 栄二 目的 並列CAMACで使用するSBC上のLinuxシステムを、コンパクトフラッシュ上に 構築した。 コンパクトフラッシュ上に、現在構築してあるLinuxシステムは 通常のシステムと同じで、システムはコンパクトフラッシュに対して読み 書きを行っている。 ここで注意すべきことは、コンパクトフラッシュには 構造上書き込み回数に限界があるという点である。 したがって、コンパク トフラッシュ上のシステムは、読み出し専用として構築するのが望ましい。 読み出し専用化システムの構築作業をするために、512MBのコンパクトフ ラッシュ上にRed Hat Linux 8.0 のシステムを構築した。 このコンパクト フラッシュを使って読み出し専用化システムを構築する。(その4) (1). 方針 (2). ルートファイルシステムの整備 (3). RAMディスク化の検討 (4). /etc/rc.d/rc.sysinit の調査 (5). /etc/rc.d/rc.sysinit の修正 (6). ブートテスト -------------------------------------------------------------------- (1). 方針 コンパクトフラッシュは書き込み回数に限界があるので読み出し専用として使用 するのが望ましい。 ここでは、コンパクトフラッシュを読み出し専用化する ために、/var、/tmp、/etcなどのRAMディスク化について検討する。 テストでは 512MBのコンパクトフラッシュ上に構築した Red Hat Linux 8.0 のシステムを 使う。 /etc/rc.d下のスクリプト、rc.sysinit を修正してRAMディスク化の作業 を行う。 (2). ルートファイルシステムの整備 (2-1). コンパクトフラッシュ上のファイル構成 システムインストール後の、現在の /ディレクトリ構成は次のとおり。 [root@onlsbc1 inoue]# df -k Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/hda5 505605 86900 392601 19% / /dev/hda1 101089 9166 86704 10% /boot /dev/hda2 10080520 75952 9492500 1% /home none 152188 0 152188 0% /dev/shm /dev/hda3 10080520 3968400 5600052 42% /usr /dev/hda6 1027768 153676 821884 16% /var /dev/hdc1 483886 432600 26290 95% /mnt [root@onlsbc1 inoue]# cd /mnt [root@onlsbc1 mnt]# ls -l 合計 147 drwxr-xr-x 2 root root 2048 12月 13 00:20 bin drwxr-xr-x 3 root root 1024 12月 13 00:20 boot drwxr-xr-x 20 root root 116736 12月 18 16:48 dev drwxr-xr-x 25 root root 2048 12月 18 16:49 etc drwxr-xr-x 5 root root 1024 12月 13 00:31 home drwxr-xr-x 2 root root 1024 6月 22 2001 initrd drwxr-xr-x 5 root root 3072 12月 13 00:21 lib drwx------ 2 root root 12288 12月 13 00:06 lost+found drwxr-xr-x 3 root root 1024 12月 12 15:52 mnt drwxr-xr-x 2 root root 1024 8月 24 1999 opt drwxr-xr-x 2 root root 1024 12月 13 00:06 proc drwxr-x--- 3 root root 1024 12月 17 16:08 root drwxr-xr-x 2 root root 3072 12月 13 00:20 sbin drwxrwxrwt 2 root root 1024 12月 17 17:12 tmp drwxr-xr-x 16 root root 1024 12月 18 08:52 usr drwxr-xr-x 17 root root 1024 12月 13 00:29 var [root@onlsbc1 mnt]# 現在立ち上がっているのは、2.5" IDE上のLinuxシステムである。 このシステ ムの /mnt に 512MBのコンパクトフラッシュのLinuxシステムをマウントして RAMディスク化の作業を進める。 (2-2). コンパクトフラッシュ上のファイル構成の変更 /etc/rc.d/rc.sysinitファイルの中で、RAMディスク構築の作業を行うので、 initrd実行後には /etc下のディレクトリ構造は存在していなければならない。 上記の項目(2-1)で示したディレクトリ構成を、図2の構成に変更する。 [root@onlsbc1 mnt]# pwd /mnt [root@onlsbc1 mnt]# ls -l 合計 147 drwxr-xr-x 2 root root 2048 12月 13 00:20 bin drwxr-xr-x 3 root root 1024 12月 13 00:20 boot drwxr-xr-x 20 root root 116736 12月 18 16:48 dev drwxr-xr-x 25 root root 2048 12月 18 16:49 etc drwxr-xr-x 5 root root 1024 12月 13 00:31 home drwxr-xr-x 2 root root 1024 6月 22 2001 initrd drwxr-xr-x 5 root root 3072 12月 13 00:21 lib drwx------ 2 root root 12288 12月 13 00:06 lost+found drwxr-xr-x 3 root root 1024 12月 12 15:52 mnt drwxr-xr-x 2 root root 1024 8月 24 1999 opt drwxr-xr-x 2 root root 1024 12月 13 00:06 proc drwxr-x--- 3 root root 1024 12月 17 16:08 root drwxr-xr-x 2 root root 3072 12月 13 00:20 sbin drwxrwxrwt 2 root root 1024 12月 17 17:12 tmp drwxr-xr-x 16 root root 1024 12月 18 08:52 usr drwxr-xr-x 17 root root 1024 12月 13 00:29 var [root@onlsbc1 mnt]# [root@onlsbc1 mnt]# mkdir ramfs [root@onlsbc1 mnt]# mv etc ramfs [root@onlsbc1 mnt]# mv tmp ramfs [root@onlsbc1 mnt]# mv var ramfs [root@onlsbc1 mnt]# /etc、/tmp、/var から ramfs の下にそれぞれシンボリックリンクを張る。 [root@onlsbc1 mnt]# ln -s ramfs/etc etc [root@onlsbc1 mnt]# ln -s ramfs/tmp tmp [root@onlsbc1 mnt]# ln -s ramfs/var var [root@onlsbc1 mnt]# [root@onlsbc1 mnt]# ls -l 合計 144 drwxr-xr-x 2 root root 2048 12月 13 00:20 bin drwxr-xr-x 3 root root 1024 12月 13 00:20 boot drwxr-xr-x 20 root root 116736 12月 18 16:48 dev lrwxrwxrwx 1 root root 9 12月 18 17:37 etc -> ramfs/etc drwxr-xr-x 5 root root 1024 12月 13 00:31 home drwxr-xr-x 2 root root 1024 6月 22 2001 initrd drwxr-xr-x 5 root root 3072 12月 13 00:21 lib drwx------ 2 root root 12288 12月 13 00:06 lost+found drwxr-xr-x 3 root root 1024 12月 12 15:52 mnt drwxr-xr-x 2 root root 1024 8月 24 1999 opt drwxr-xr-x 2 root root 1024 12月 13 00:06 proc drwxr-xr-x 5 root root 1024 12月 18 17:36 ramfs drwxr-x--- 3 root root 1024 12月 17 16:08 root drwxr-xr-x 2 root root 3072 12月 13 00:20 sbin lrwxrwxrwx 1 root root 9 12月 18 17:37 tmp -> ramfs/tmp drwxr-xr-x 16 root root 1024 12月 18 08:52 usr lrwxrwxrwx 1 root root 9 12月 18 17:37 var -> ramfs/var [root@onlsbc1 mnt]# [root@onlsbc1 mnt]# ls -l ramfs 合計 4 drwxr-xr-x 25 root root 2048 12月 18 16:49 etc drwxrwxrwt 2 root root 1024 12月 17 17:12 tmp drwxr-xr-x 17 root root 1024 12月 13 00:29 var [root@onlsbc1 mnt]# (2-3). /mnt/ramfs/etc の下のシンボリックリンクのチェック ルートファイルシステムの構成を変更した際にシンボリックリンクが壊れた 可能性がある。 シンボリックリンクを調べる。 [root@onlsbc1 etc]# pwd /mnt/etc [root@onlsbc1 etc]# ls -l grub.conf lrwxrwxrwx 1 root root 22 12月 13 00:31 grub.conf -> ../boot/gr ub/grub.conf [root@onlsbc1 etc]# ls -lL grub.conf ls: grub.conf: そのようなファイルやディレクトリはありません [root@onlsbc1 etc]# 以下のシンボリックリンクが切れてしまった。 /etc/grub.conf 張りなおす。 [root@onlsbc1 etc]# rm grub.conf rm: remove シンボリックリンク `grub.conf'? y [root@onlsbc1 etc]# ln -s ../../boot/grub/grub.conf grub.conf [root@onlsbc1 etc]# ls -lL grub.conf -rw------- 1 root root 582 12月 16 16:24 grub.conf [root@onlsbc1 etc]# (2-3-1). /mnt/ramfs/etc/httpd の下のシンボリックリンクのチェック [root@onlsbc1 etc]# pwd /mnt/etc [root@onlsbc1 etc]# ls -l httpd/modules lrwxrwxrwx 1 root root 27 12月 13 00:29 httpd/modules -> ../../ usr/lib/httpd/modules [root@onlsbc1 etc]# ls -lL httpd/modules ls: httpd/modules: そのようなファイルやディレクトリはありません [root@onlsbc1 etc]# 以下のシンボリックリンクが切れてしまった。 /etc/httpd/modules 張りなおす。 [root@onlsbc1 httpd]# pwd /mnt/etc/httpd [root@onlsbc1 httpd]# rm modules rm: remove シンボリックリンク `modules'? y [root@onlsbc1 httpd]# ln -s ../../../usr/lib/httpd/modules modules [root@onlsbc1 httpd]# ls -lL modules 合計 1053 -rwxr-xr-x 1 root root 10232 9月 5 06:23 mod_access.so -rwxr-xr-x 1 root root 8813 9月 5 06:23 mod_actions.so : : -rwxr-xr-x 1 root root 10981 9月 5 06:23 mod_vhost_alias.so [root@onlsbc1 httpd]# (2-3-2). /mnt/ramfs/etc/sysconfig/network-scripts の下のシンボリックリンク のチェック [root@onlsbc1 etc]# pwd /mnt/etc [root@onlsbc1 etc]# ls -l sysconfig/network-scripts/ifdown lrwxrwxrwx 1 root root 20 12月 13 00:12 sysconfig/network-scrip ts/ifdown -> ../../../sbin/ifdown [root@onlsbc1 etc]# ls -lL sysconfig/network-scripts/ifdown ls: sysconfig/network-scripts/ifdown: そのようなファイルやディレクトリはありませ ん [root@onlsbc1 etc]# ls -l sysconfig/network-scripts/ifup lrwxrwxrwx 1 root root 18 12月 13 00:12 sysconfig/network-scrip ts/ifup -> ../../../sbin/ifup [root@onlsbc1 etc]# ls -lL sysconfig/network-scripts/ifup ls: sysconfig/network-scripts/ifup: そのようなファイルやディレクトリはありません [root@onlsbc1 etc]# 以下のシンボリックリンクが切れてしまった。 /etc/sysconfig/network-scripts/ifdown /etc/sysconfig/network-scripts/ifup 張りなおす。 [root@onlsbc1 network-scripts]# pwd /mnt/etc/sysconfig/network-scripts [root@onlsbc1 network-scripts]# ls -l ifdown ifup lrwxrwxrwx 1 root root 20 12月 13 00:12 ifdown -> ../../../sbin /ifdown lrwxrwxrwx 1 root root 18 12月 13 00:12 ifup -> ../../../sbin/i fup [root@onlsbc1 network-scripts]# rm ifdown ifup rm: remove シンボリックリンク `ifdown'? y rm: remove シンボリックリンク `ifup'? y [root@onlsbc1 network-scripts]# ln -s ../../../../sbin/ifdown ifdown [root@onlsbc1 network-scripts]# ln -s ../../../../sbin/ifup ifup [root@onlsbc1 network-scripts]# ls -lL ifdown ifup -rwxr-xr-x 1 root root 3268 8月 28 07:03 ifdown -rwxr-xr-x 1 root root 9223 9月 5 02:03 ifup [root@onlsbc1 network-scripts]# (2-4). /mnt/ramfs/tmp の下のシンボリックリンクのチェック [root@onlsbc1 mnt]# pwd /mnt [root@onlsbc1 mnt]# ls -laLR tmp tmp: 合計 2 drwxrwxrwt 2 root root 1024 12月 17 17:12 . drwxr-xr-x 5 root root 1024 12月 18 17:36 .. [root@onlsbc1 mnt]# /mnt/tmp の下にはファイルは存在しない。 (2-5). /mnt/ramfs/var の下のシンボリックリンクのチェック /mnt/ramfs/var の下をチェックしたところシンボリックリンクが切れている ものはなかった。 (3). RAMディスク化の検討 (3-1). RAMディスク化のための操作手順 RAMディスク化のためのコマンドは /mnt/etc/rc.d/rc.sysinitファイルの中に 追記する。 ここで行う操作は、 (1). RAMディスクを初期化する。 (2). /mnt/ramfs下のファイルをRAMディスクにコピーする。 (3). RAMディスクを /ramfsにマウントする。 である。 (3-2). カーネルパラメータについてのチェック RAMディスク用に確保すべきサイズを調べる。 [root@onlsbc1 ramfs]# pwd /mnt/ramfs [root@onlsbc1 ramfs]# ls -l 合計 4 drwxr-xr-x 25 root root 2048 12月 19 10:49 etc drwxrwxrwt 2 root root 1024 12月 17 17:12 tmp drwxr-xr-x 17 root root 1024 12月 13 00:29 var [root@onlsbc1 ramfs]# du -k : : 265 ./var/www/icons 329 ./var/www 9066 ./var 11108 . [root@onlsbc1 ramfs]# ramfs下の etc、tmp、varを収めるRAMディスクのサイズは約 12MB必要である。 しかし、カーネルが作成できるRAMディスクの最大サイズは、標準では4MBで ある。 Red Hat Linux ディストリビューションで採用されているカーネル 組み込み型のドライバの場合は、カーネル起動時に "ramdisk_size=32" の ようにオプションを渡せば、最大サイズを変更できる。 以下の例では最大 サイズを 32MBに変更して作業を進めることにする。 チェック: 512MBのコンパクトフラッシュ上のLinuxシステムを、"ramdisk_size=32"の オプションで起動し直して、実際に使用できるRAMディスクのサイズを確かめて みる。 /boot/grub/grub.conf を以下のように、RAMディスクの拡張オプション を付加した項目を追加する。 (3-2-1). /mnt/boot/grub/grub.confファイルの修正 [root@onlsbc1 grub]# pwd /mnt/boot/grub [root@onlsbc1 grub]# ls device.map ffs_stage1_5 menu.lst splash.xpm.gz vstafs_stage1_5 e2fs_stage1_5 grub.conf minix_stage1_5 stage1 xfs_stage1_5 fat_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2 [root@onlsbc1 grub]# [root@onlsbc1 grub]# vi grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,0) # kernel /boot/vmlinuz-version ro root=/dev/hdc1 # initrd /boot/initrd-version.img #boot=/dev/hdc default=0 #timeout=10 timeout=0 splashimage=(hd0,0)/boot/grub/splash.xpm.gz title Red Hat Linux (2.4.18-14) root (hd0,0) # kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ ramdisk_size=32768 initrd /boot/initrd-2.4.18-14.img ~ "grub.conf" 18L, 650C 書込み [root@onlsbc1 grub]# 上で変更したのは、コンパクトフラッシュ上の grub.confファイルである。 現在のRAMディスク化のテストシステムでは、512MBのコンパクトフラッシュと 2.5"のIDEハードディスクが両方接続されている。 そして512MBのコンパクト フラッシュ上のLinuxシステムは、2.5"のIDEハードディスクのMBRの grubから 起動するようにしている。 したがって、上で行った変更と同じ変更を、2.5"の IDEハードディスクのMBRの grub.confファイルにも行っておく。 [root@onlsbc1 grub]# pwd /boot/grub [root@onlsbc1 grub]# ls device.map ffs_stage1_5 menu.lst splash.xpm.gz vstafs_stage1_5 e2fs_stage1_5 grub.conf minix_stage1_5 stage1 xfs_stage1_5 fat_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2 [root@onlsbc1 grub]# vi grub.conf # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/hda5 # initrd /initrd-version.img #boot=/dev/hda default=0 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz title Red Hat Linux (2.4.18-14) root (hd0,0) kernel /vmlinuz-2.4.18-14 ro root=LABEL=/1 initrd /initrd-2.4.18-14.img title Compact Flash: Red Hat Linux (2.4.18-14) root (hd1,0) # kernel /boot/vmlinuz-2.4.18-14 ro root=/dev/hdc1 kernel /boot/vmlinuz-2.4.18-14 ro root=/dev/hdc1 ramdisk_size=32768 initrd /boot/initrd-2.4.18-14.img title Compact Flash chain: Red Hat Linux (2.4.18-14) root (hd1,0) makeactive "grub.conf" 27L, 893C 書込み [root@onlsbc1 grub]# システムをリブートする。 [root@onlsbc1 grub]# reboot Broadcast message from root (pts/0) (Thu Dec 19 14:41:01 2002): The system is going down for reboot NOW! 512MB のコンパクトフラッシュ上のLinuxシステムが立ち上がった。 [inoue@onlpara inoue]$ ssh onlsbc1 The authenticity of host 'onlsbc1 (130.87.153.3)' can't be established. RSA key fingerprint is 81:28:f3:2a:7f:bf:12:d0:03:72:e7:8b:a6:b1:f6:9c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'onlsbc1,130.87.153.3' (RSA) to the list of known hos ts. inoue@onlsbc1's password: [inoue@onlsbc1 inoue]$ df -k Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/hdc1 483886 432666 26224 95% / none 152188 0 152188 0% /dev/shm [inoue@onlsbc1 inoue]$ (3-2-2). RAMディスクを作成する [root@onlsbc1 inoue]# /sbin/mke2fs /dev/ram0 32768 mke2fs 1.27 (8-Mar-2002) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 8192 inodes, 32768 blocks 1638 blocks (5.00%) reserved for the super user First data block=1 4 block groups 8192 blocks per group, 8192 fragments per group 2048 inodes per group Superblock backups stored on blocks: 8193, 24577 Writing inode tables: done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 39 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@onlsbc1 inoue]# ok. 32MB のRAMディスクを作ることができた。 (3-2-3). RAMディスクを一旦、/mnt にマウントして必要なファイルを書き込む [root@onlsbc1 inoue]# ls -l /mnt 合計 1 drwxr-xr-x 2 root root 1024 12月 12 15:52 floppy [root@onlsbc1 inoue]# mount -n -o rw /dev/ram0 /mnt [root@onlsbc1 inoue]# df -k Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/hdc1 483886 432666 26224 95% / none 152188 0 152188 0% /dev/shm [root@onlsbc1 inoue]# ls -l /mnt 合計 12 drwx------ 2 root root 12288 12月 19 14:49 lost+found [root@onlsbc1 inoue]# /ramfs 下のファイルを RAMディスクにコピーする。 [root@onlsbc1 /]# ls -l 合計 143 drwxr-xr-x 2 root root 2048 12月 13 00:20 bin drwxr-xr-x 3 root root 1024 12月 13 00:20 boot drwxr-xr-x 20 root root 116736 12月 19 14:43 dev lrwxrwxrwx 1 root root 9 12月 18 17:37 etc -> ramfs/etc drwxr-xr-x 5 root root 1024 12月 13 00:31 home drwxr-xr-x 2 root root 1024 6月 22 2001 initrd drwxr-xr-x 5 root root 3072 12月 13 00:21 lib drwx------ 2 root root 12288 12月 13 00:06 lost+found drwxr-xr-x 3 root root 1024 12月 19 14:49 mnt drwxr-xr-x 2 root root 1024 8月 24 1999 opt dr-xr-xr-x 39 root root 0 12月 19 2002 proc drwxr-xr-x 5 root root 1024 12月 18 17:36 ramfs drwxr-x--- 3 root root 1024 12月 17 16:08 root drwxr-xr-x 2 root root 3072 12月 13 00:20 sbin lrwxrwxrwx 1 root root 9 12月 18 17:37 tmp -> ramfs/tmp drwxr-xr-x 16 root root 1024 12月 18 08:52 usr lrwxrwxrwx 1 root root 9 12月 18 17:37 var -> ramfs/var [root@onlsbc1 /]# [root@onlsbc1 /]# cp -pdr ramfs/etc /mnt [root@onlsbc1 /]# cp -pdr ramfs/tmp /mnt [root@onlsbc1 /]# cp -pdr ramfs/var /mnt [root@onlsbc1 /]# [root@onlsbc1 /]# ls -l /mnt 合計 16 drwxr-xr-x 25 root root 2048 12月 19 14:42 etc drwx------ 2 root root 12288 12月 19 14:49 lost+found drwxrwxrwt 2 root root 1024 12月 17 17:12 tmp drwxr-xr-x 17 root root 1024 12月 13 00:29 var [root@onlsbc1 /]# [root@onlsbc1 /]# cd /mnt [root@onlsbc1 mnt]# du -k : : 329 ./var/www 9130 ./var 11184 . [root@onlsbc1 mnt]# /mntにマウントしてあるRAMディスクに、約12MBのファイルを書き込んだ。 (3-2-4). /mntをアンマウントして、/ramfs にマウントし直す /mnt にマウントしてあるRAMディスクをアンマウントして、/ramfs にマウント し直す。 [root@onlsbc1 /]# pwd / [root@onlsbc1 /]# umount /mnt [root@onlsbc1 /]# mount -n -o rw /dev/ram0 /ramfs [root@onlsbc1 /]# ls -l 合計 143 drwxr-xr-x 2 root root 2048 12月 13 00:20 bin drwxr-xr-x 3 root root 1024 12月 13 00:20 boot drwxr-xr-x 20 root root 116736 12月 19 14:43 dev lrwxrwxrwx 1 root root 9 12月 18 17:37 etc -> ramfs/etc drwxr-xr-x 5 root root 1024 12月 13 00:31 home drwxr-xr-x 2 root root 1024 6月 22 2001 initrd drwxr-xr-x 5 root root 3072 12月 13 00:21 lib drwx------ 2 root root 12288 12月 13 00:06 lost+found drwxr-xr-x 3 root root 1024 12月 12 15:52 mnt drwxr-xr-x 2 root root 1024 8月 24 1999 opt dr-xr-xr-x 39 root root 0 12月 19 2002 proc drwxr-xr-x 6 root root 1024 12月 19 15:26 ramfs drwxr-x--- 3 root root 1024 12月 17 16:08 root drwxr-xr-x 2 root root 3072 12月 13 00:20 sbin lrwxrwxrwx 1 root root 9 12月 18 17:37 tmp -> ramfs/tmp drwxr-xr-x 16 root root 1024 12月 18 08:52 usr lrwxrwxrwx 1 root root 9 12月 18 17:37 var -> ramfs/var [root@onlsbc1 /]# [root@onlsbc1 /]# df -k Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/hdc1 483886 432666 26224 95% / none 152188 0 152188 0% /dev/shm [root@onlsbc1 /]# ls -l /mnt 合計 1 drwxr-xr-x 2 root root 1024 12月 12 15:52 floppy [root@onlsbc1 /]# ls -l ramfs 合計 16 drwxr-xr-x 25 root root 2048 12月 19 14:42 etc drwx------ 2 root root 12288 12月 19 14:49 lost+found drwxrwxrwt 2 root root 1024 12月 17 17:12 tmp drwxr-xr-x 17 root root 1024 12月 13 00:29 var [root@onlsbc1 /]# ok. これで /ramfs の下はRAMディスクに置き換わった。 [root@onlsbc1 /]# pwd / [root@onlsbc1 /]# ls -lLR tmp tmp: 合計 0 [root@onlsbc1 /]# touch /tmp/test [root@onlsbc1 /]# ls -lLR /tmp /tmp: 合計 0 -rw-r--r-- 1 root root 0 12月 19 15:36 test [root@onlsbc1 /]# umount /ramfs [root@onlsbc1 /]# ls -lLR /tmp /tmp: 合計 0 [root@onlsbc1 /]# ok. コンパクトフラッシュには書き込みは行われていない。 上記でやったことをブート時のスクリプトに追記すれば、/etc、/tmp、/var の RAMディスク化は達成できる。 (4). /mnt1/etc/rc.d/rc.sysinit の調査 /mnt1/etc/rc.d/rc.sysinitファイルの内容をチェックする。 [root@onlsbc1 rc.d]# df -k Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/hdc1 483886 432666 26224 95% / none 152188 0 152188 0% /dev/shm [root@onlsbc1 rc.d]# pwd /etc/rc.d [root@onlsbc1 rc.d]# ls init.d rc.local rc0.d rc2.d rc4.d rc6.d rc rc.sysinit rc1.d rc3.d rc5.d [root@onlsbc1 rc.d]# [root@onlsbc1 rc.d]# vi rc.sysinit #!/bin/bash # # /etc/rc.sysinit - run once at boot time # # Taken in part from Miquel van Smoorenburg's bcheckrc. # : # Rerun ourselves through initlog : # If we're using devfs, start devfsd now - we need the old device names : # Print a banner. ;) : # Fix console loglevel : # Mount /proc (done here so volume labels can work with fsck) : # Unmount the initrd, if necessary : # Configure kernel parameters : # Set the system clock. : # Load system font : # Set the hostname. : # Initialize USB controller and HID devices : # Possibly update quotas if fsck was run on /. : # check for arguments passed from kernel : # Remount the root filesystem read-write. : # LVM initialization : # Start up swapping. : # Clear mtab : # Remove stale backups : # Enter root, /proc and (potentially) /proc/bus/usb and devfs into mtab. : # The root filesystem is now read-write, so we can now log via syslog() directly : # Our modutils don't support it anymore, so we might as well remove # the preferred link. : # tweak isapnp settings if needed. : # Load sound modules if they need persistent DMA buffers : # Load modules (for backward compatibility with VARs) : # Add raid devices : # LVM initialization, take 2 (it could be on top of RAID) : # Check filesystems : # Mount all other filesystems (except for NFS and /proc, which is already # mounted). Contrary to standard usage, # filesystems are NOT unmounted in single user mode. : # check remaining quotas other than root : # Configure machine if necessary. : # Reread in network configuration data. : # Reset the hostname. : # Clean out /etc. : # Do we need (w|u)tmpx files? We don't set them up, but the sysadmin might... : # Clean up /var # I'd use find, but /usr may not be mounted. : # Reset pam_console permissions : # Clean up utmp/wtmp : # Delete X locks : # Delete VNC & X locks : # Delete ICE locks : # Delete Postgres sockets : # Now turn on swap in case we swap to files. : # Initialize the serial ports. : # If a SCSI tape has been detected, load the st module unconditionally # since many SCSI tapes don't deal well with st being loaded and unloaded : # Load usb storage here, to match most other things : # Ooh, firewire too. : # If they asked for ide-scsi, load it : # Turn on harddisk optimization # There is only one file /etc/sysconfig/harddisks for all disks # after installing the hdparm-RPM. If you need different hdparm parameters # for each of your disks, copy /etc/sysconfig/harddisks to # /etc/sysconfig/harddiskhda (hdb, hdc...) and modify it. # Each disk which has no special parameters will use the defaults. # Each non-disk which has no special parameters will be ignored. # : # Boot time profiles. Yes, this should be somewhere else. : # Generate a header that defines the boot kernel. : # Adjust symlinks as necessary in /boot to keep system services from # spewing messages about mismatched System maps and so on. : # The special Red Hat kernel library symlink must point to the right library # We need to deal with cases where there is no library, and we need to # deal with any version numbers that show up. : # Now that we have all of our basic modules loaded and the kernel going, # let's dump the syslog ring somewhere so we can find it later : # Also keep kernel symbols around in case we need them for debugging : # create the crash indicator flag to warn on crashes, offer fsck with timeout : [inoue@onlsbc1 rc.d]$ (5). コンパクトフラッシュの /etc/rc.d/rc.sysinit の修正 (5-1). RAMディスク化のための変更 rc.sysinitファイルの記述の中の以下の部分に、RAMディスク化のためのコマン ドを追記する。 # Mount all other filesystems (except for NFS and /proc, which is already # mounted). Contrary to standard usage, # filesystems are NOT unmounted in single user mode. : <--- この部分にRAMディスク化のためのコマンドを追記 : # check remaining quotas other than root [root@onlsbc1 rc.d]# pwd /etc/rc.d [root@onlsbc1 rc.d]# ls -l 合計 35 drwxr-xr-x 2 root root 1024 12月 13 00:29 init.d -rwxr-xr-x 1 root root 2330 7月 14 15:12 rc -rwxr-xr-x 1 root root 220 7月 11 2001 rc.local -rwxr-xr-x 1 root root 22095 8月 23 06:10 rc.sysinit drwxr-xr-x 2 root root 1024 12月 13 00:29 rc0.d drwxr-xr-x 2 root root 1024 12月 13 00:29 rc1.d drwxr-xr-x 2 root root 1024 12月 13 00:29 rc2.d drwxr-xr-x 2 root root 1024 12月 13 00:29 rc3.d drwxr-xr-x 2 root root 1024 12月 13 00:29 rc4.d drwxr-xr-x 2 root root 1024 12月 13 00:29 rc5.d drwxr-xr-x 2 root root 1024 12月 13 00:29 rc6.d [root@onlsbc1 rc.d]# [root@onlsbc1 rc.d]# vi rc.sysinit : # Mount all other filesystems (except for NFS and /proc, which is already # mounted). Contrary to standard usage, # filesystems are NOT unmounted in single user mode. action $"Mounting local filesystems: " mount -a -t nonfs,smbfs,ncpfs -O no_netde v # <-- by E.Inoue : from here /sbin/mke2fs -q /dev/ram0 32768 mount -n -o rw /dev/ram0 /mnt cp -pdr ramfs/etc /mnt cp -pdr ramfs/tmp /mnt cp -pdr ramfs/var /mnt umount /mnt mount -n -o rw /dev/ram0 /ramfs # --> to here # check remaining quotas other than root if [ X"$_RUN_QUOTACHECK" = X1 -a -x /sbin/quotacheck ]; then : "rc.sysinit" 776L, 22314C written [root@onlsbc1 rc.d]# [root@onlsbc1 rc.d]# ls -l rc.sysinit -rwxr-xr-x 1 root root 22314 12月 19 16:47 rc.sysinit [root@onlsbc1 rc.d]# 注意. RAMディスク化したのは、システムが書き込む可能性があるディレクトリ のみである。 この他にもユーザおよびルートが書き込む可能性がある ディレクトリとして /home、/root がある。 ここは、他のマシンの ディレクトリをNFSマウントして使う等の処置をしてもらうことにする。 ここでは、この部分については何もしない。 (6). ブートテスト (6-1). コンパクトフラッシュ上のLinuxシステムを立ち上げる [root@onlsbc1 /]# reboot Broadcast message from root (pts/0) (Thu Dec 19 16:58:41 2002): The system is going down for reboot NOW! [root@onlsbc1 /]# MBR部のGRUBが起動し、以下のメニューが表示された。 | V Red Hat Linux (2.4.18-14) Compact Flash: Red Hat Linux (2.4.18-14) <-- この項目を選択 | V ブート処理は進んで、INITが実行されRAMディスク作成も正常に実行できた。 システムはシャットダウンした後、正常に立ち上がった。 [inoue@onlpara inoue]$ ssh onlsbc1 inoue@onlsbc1's password: [inoue@onlsbc1 inoue]$ df -k Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/hdc1 483886 432671 26219 95% / none 152188 0 152188 0% /dev/shm [inoue@onlsbc1 inoue]$ ls -l / 合計 143 drwxr-xr-x 2 root root 2048 12月 13 00:20 bin drwxr-xr-x 3 root root 1024 12月 13 00:20 boot drwxr-xr-x 20 root root 116736 12月 19 17:01 dev lrwxrwxrwx 1 root root 9 12月 18 17:37 etc -> ramfs/etc drwxr-xr-x 5 root root 1024 12月 13 00:31 home drwxr-xr-x 2 root root 1024 6月 22 2001 initrd drwxr-xr-x 5 root root 3072 12月 13 00:21 lib drwx------ 2 root root 12288 12月 13 00:06 lost+found drwxr-xr-x 3 root root 1024 12月 12 15:52 mnt drwxr-xr-x 2 root root 1024 8月 24 1999 opt dr-xr-xr-x 38 root root 0 12月 20 2002 proc drwxr-xr-x 6 root root 1024 12月 19 17:00 ramfs drwxr-x--- 3 root root 1024 12月 17 16:08 root drwxr-xr-x 2 root root 3072 12月 13 00:20 sbin lrwxrwxrwx 1 root root 9 12月 18 17:37 tmp -> ramfs/tmp drwxr-xr-x 16 root root 1024 12月 18 08:52 usr lrwxrwxrwx 1 root root 9 12月 18 17:37 var -> ramfs/var [inoue@onlsbc1 inoue]$ ls -l /ramfs 合計 16 drwxr-xr-x 25 root root 2048 12月 19 17:14 etc drwx------ 2 root root 12288 12月 19 17:00 lost+found drwxrwxrwt 2 root root 1024 12月 17 17:12 tmp drwxr-xr-x 17 root root 1024 12月 13 00:29 var [inoue@onlsbc1 inoue]$ ok. RAMディスクがマウントされている。 (6-2). リブートする [root@onlsbc1 inoue]# reboot Broadcast message from root (pts/0) (Thu Dec 19 17:17:48 2002): The system is going down for reboot NOW! [root@onlsbc1 inoue]# : : Stopping sshd: [ OK ] Saving random seed: [ OK ] Stopping portmapper: [ OK ] Shutting down kernel logger: [ OK ] Shutting down system logger: [ OK ] Shutting down interface eth0: [ OK ] Shutting down loopback interface: [ OK ] Starting killall: [ OK ] Sending all process TERM signal... [ OK ] Sending all process KILL signal... md: recovery thread got woken up... md: recovery thread finised: [ OK ] Syncing hardware clock to system time [ OK ] Unmounting file systems: umount2: Device or resource busy unmount: /ramfs: Illegal seek [ FAILED ] INIT: no more processes left in this runlevel ここで停止している。 /ramfs のアンマウントが考慮されてない。 シャットダウン時の /ramfs の アンマウントの処置が必要だ。 (6-3). シャットダウン時の手続きを調べる 512MBのコンパクトフラッシュ上のLinuxシステムを立ち上げて調べる。 Shutdownはinitプロセスにシグナルを送りランレベ ルの変更を依頼する。 o ランレベル0はシステムを停止する o ランレベル6はシステムをリブートす る o ランレベル1はシステムの管理業務が行なえる状態(シングルユーザモード) にする システムの停止又はリブート時にどのような動作がなされるかは、/etc/inittab ファイル中のそれぞれのランレベルの適切なエントリーを参照。 [root@onlsbc1 inoue]# cat /etc/inittab # # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg,# Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Things to run in every runlevel. ud::once:/sbin/update # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 # xdm is now a separate service x:5:respawn:/etc/X11/prefdm -nodaemon [root@onlsbc1 inoue]# halt および reboot 時の処理は rc0.d および rc6.d 下のスクリプトの中で やればよいことがわかる。 実際には、rc0.d および rc6.d 下のファイルは全て /etc/rc.d/init.d 下のファイルへのシンボリックリンクであるから、 /etc/rc.d/init.d 下のスクリプトを修正することになる。 (6-4). init.d 下のスクリプトのチェック 上記の項目(6-2)の実行結果の記録に注目。 : : Syncing hardware clock to system time [ OK ] Unmounting file systems: umount2: Device or resource busy unmount: /ramfs: Illegal seek [ FAILED ] INIT: no more processes left in this runlevel umount のエラーを表示している直前のメッセージを出力しているスクリプトを 確認する。 [root@onlsbc1 rc.d]# pwd /etc/rc.d [root@onlsbc1 rc.d]# grep Syncing */* init.d/halt:runcmd $"Syncing hardware clock to system time" /sbin/hwclock $CLOCK FLAGS rc0.d/S01halt:runcmd $"Syncing hardware clock to system time" /sbin/hwclock $CLO CKFLAGS rc6.d/S01reboot:runcmd $"Syncing hardware clock to system time" /sbin/hwclock $C LOCKFLAGS [root@onlsbc1 rc.d]# rc0.d/S01halt および rc6.d/S01reboot のスクリプトの中で、"Syncing hardware clock to system time" のメッセージを出力している。 [root@onlsbc1 rc.d]# pwd /etc/rc.d [root@onlsbc1 rc.d]# ls -l init.d/halt -rwxr-xr-x 1 root root 5075 8月 14 11:01 init.d/halt [root@onlsbc1 rc.d]# ls -l rc0.d/S01halt lrwxrwxrwx 1 root root 14 12月 19 17:26 rc0.d/S01halt -> ../ini t.d/halt [root@onlsbc1 rc.d]# ls -l rc6.d/S01reboot lrwxrwxrwx 1 root root 14 12月 19 17:26 rc6.d/S01reboot -> ../i nit.d/halt [root@onlsbc1 rc.d]# ls init.d rc.local rc0.d rc2.d rc4.d rc6.d rc rc.sysinit rc1.d rc3.d rc5.d [root@onlsbc1 rc.d]# つまり、/etc/rc.d/init.d/haltスクリプトが "Syncing hardware clock to system time" のメッセージを出力している。 この時点で /ramfsを umount しなくても何も問題ない。 /ramfsのumountはしないで、処理を先に進めるよう に変更しよう。 (6-5). /etc/rc.d/init.d/haltスクリプトの修正 現在、使用している onlsbc1 のLinuxシステムは、コンパクトフラッシュ上の ものである。 つまり、/etcディレクトリ等はRAMディスクになっているので /etc下のファイルを修正しても、システムを立ち上げ直すと修正した部分は 消えてしまい反映されない。 そこで、一旦、2.5"のIDEディスク上のLinuxシス テムを立ち上げてコンパクトフラッシュ上のファイルシステムをマウントして 修正することにする。 リブートする [root@onlsbc1 rc.d]# reboot Broadcast message from root (pts/0) (Fri Dec 20 16:20:14 2002): The system is going down for reboot NOW! [root@onlsbc1 rc.d]# 2.5"のIDEディスク上のLinuxシステムは立ち上がった。 [inoue@onlpara inoue]$ ssh onlsbc1 The authenticity of host 'onlsbc1 (130.87.153.3)' can't be established. RSA key fingerprint is a2:22:30:33:6c:fa:3e:76:02:09:a5:76:14:d9:14:53. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'onlsbc1,130.87.153.3' (RSA) to the list of known hos ts. inoue@onlsbc1's password: [inoue@onlsbc1 inoue]$ su Password: [root@onlsbc1 inoue]# mount -t ext3 /dev/hdc1 /mnt [root@onlsbc1 inoue]# df -k Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/hda5 505605 86903 392598 19% / /dev/hda1 101089 9166 86704 10% /boot /dev/hda2 10080520 75932 9492520 1% /home none 152188 0 152188 0% /dev/shm /dev/hda3 10080520 3968400 5600052 42% /usr /dev/hda6 1027768 154552 821008 16% /var /dev/hdc1 483886 432671 26219 95% /mnt [root@onlsbc1 inoue]# [root@onlsbc1 init.d]# pwd /mnt/etc/rc.d/init.d [root@onlsbc1 init.d]# ls functions httpd keytable kudzu network random saslauthd sshd halt kdcrotate killall netfs portmap rawdevices single syslog [root@onlsbc1 init.d]# mv halt BACK-halt [root@onlsbc1 init.d]# cp BACK-halt halt [root@onlsbc1 init.d]# ls -l 合計 58 -rwxr-xr-x 1 root root 5075 8月 14 11:01 BACK-halt -rwxr-xr-x 1 root root 10068 7月 14 15:39 functions -rwxr-xr-x 1 root root 5075 12月 20 16:32 halt -rwxr-xr-x 1 root root 2366 9月 5 06:23 httpd -rwxr-xr-x 1 root root 1084 8月 3 05:09 kdcrotate -rwxr-xr-x 1 root root 1347 9月 5 08:06 keytable -rwxr-xr-x 1 root root 481 7月 6 06:15 killall -rwxr-xr-x 1 root root 1919 9月 3 16:29 kudzu -rwxr-xr-x 1 root root 5024 6月 26 18:20 netfs -rwxr-xr-x 1 root root 6402 7月 10 17:26 network -rwxr-xr-x 1 root root 1901 8月 7 05:52 portmap -rwxr-xr-x 1 root root 1516 6月 26 18:20 random -rwxr-xr-x 1 root root 2211 6月 26 18:34 rawdevices -rwxr-xr-x 1 root root 1260 9月 3 08:48 saslauthd -rwxr-xr-x 1 root root 1175 7月 10 17:58 single -rwxr-xr-x 1 root root 2647 8月 14 13:08 sshd -rwxr-xr-x 1 root root 1369 6月 24 09:29 syslog [root@onlsbc1 init.d]# [root@onlsbc1 init.d]# vi halt : sig= retry=3 remaining=`halt_get_remaining | sort -r` # <-- by E.Inoue : from here if [ ${remaining:1:5} = ramfs ]; then ["$remaining" = /ramfs ] && $remaining < /dev/null else # --> to here while [ -n "$remaining" -a "$retry" -gt 0 ] do if [ "$retry" -lt 3 ]; then LANG=C runcmd $"Unmounting file systems (retry): " umount -f $r emaining else LANG=C runcmd $"Unmounting file systems: " umount -f $remaining fi sleep 2 remaining=`halt_get_remaining | sort -r` [ -z "$remaining" ] && break /sbin/fuser -k -m $sig $remaining >/dev/null sleep 5 retry=$(($retry-1)) sig=-9 done # <-- by E.Inoue : from here fi # --> to here [ -f /proc/bus/usb/devices ] && umount /proc/bus/usb # remove the crash indicator flag : lt" 214L, 5264C 書込み [root@onlsbc1 init.d]# 立ち上げ直す。 [root@onlsbc1 inoue]# reboot Broadcast message from root (pts/1) (Tue Dec 24 16:32:08 2002): The system is going down for reboot NOW! コンパクトフラッシュ上のシステムが立ち上がった。 コンパクトフラッシュ上のシステムを reboot する。 : Syncing hardware clock to system time [ OK ] /etc/rc.d/S01halt: line 156: [/ramfs: No such file or drectory Rebooting system... : ok. [FAILED] のメッセージを表示しないでリブートは実行された。 シャットダウンした場合について確認する。 ot@onlsbc1 init.d]# /sbin/shutdown -h now : Syncing hardware clock to system time [ OK ] /etc/rc.d/S01halt: line 156: [/ramfs: No such file or dirctory Halting system... md: stopping all md devices. flushing ide devices: hda hdc Power down. ok. 正常にシャットダウンできた。 これで、Red Hat Linux 8.0システムの 一部をRAMディスク化する作業は完了。 ---xxxx