玄箱PRO Debian lenny HDDのスピンダウン part.2
HDDをスピンダウンさせ、静音化しようと思いましたがスピンダウン後すぐにまた回り始めどうしても、長時間のスピンダウンが実現できませんでした。
そのため、ブートデバイスをUSBメモリに切り替え、ログ等がHDDに書き込まれないようにした上で再度HDDのスピンダウンに挑戦します。
1.開発環境のインストールを行います。
# aptitude install gcc make libc-dev libc6-dev
# aptitude install patch
initrd.buffaloを再構築するにはU-boot付属のmkimageが必要となります。
(lenny付属のものではありません)
玄箱PRO付属のCDからU-bootのソースをコピーし、mkimageをビルドしておいてください。
エレキジャックさんに詳細な方法が載っています。
http://www.eleki-jack.com/Kurobox-pro2/2007/06/13-image.html
2.USBメモリ上にルートファイルシステムを作成します。今回はHDD環境をまるごとコピーしました。エレキジャックさんの下記ページが参考になります。
http://www.eleki-jack.com/Kurobox-pro2/2008/01/usbhdd.html
3.USBメモリからのブートにはinitrdの編集が必要なので、/bootからinitrd.buffaloをコピーしておきます。
# cp /boot/initrd.buffalo /tmp
4.initrd.buffaloの展開をします。
# dd if=initrd.buffalo of=initrd.gz bs=64 skip=1
33970+1 records in
33970+1 records out
2174126 bytes (2.2 MB) copied, 2.40114 s, 905 kB/s
# ls
initrd.buffalo initrd.gz
# gzip -d initrd.gz
# ls
initrd.buffalo initrd
# file initrd
initrd: ASCII cpio archive (SVR4 with no CRC)
# cpio -i < initrd
8735 blocks
# ls
bin conf etc init initrd lib sbin scripts
# rm initrd
rm: remove 通常ファイル `initrd'? y
# ls
bin conf etc init lib sbin scripts
※zcat initrd.gz |cpio -iでgz形式から一発解凍もできます。
5.USBメモリに関する部分の修正
内蔵SATAを使用している場合sdaがHDD、sdbがUSBメモリとなります。
まずは、起動時にルートファイルシステムとしてsdaを指定している部分を確認します。
# grep -rn sda ./
バイナリー・ファイル./lib/libc.so.6は一致しました
./conf/param.conf:1:ROOT="/dev/sda2"
./conf/conf.d/resume:1:RESUME=/dev/sda5
sda2は/以下のルートファイルシステム、sda5はスワップ領域となっています。
修正しなければいけないファイルはparam.confとresumeですので、この二つをsdbの対応する番号へ変更します。
変更後念のため確認
# grep -rn sda ./
バイナリー・ファイル./lib/libc.so.6は一致しました
# grep -rn sdb ./
バイナリー・ファイル./lib/modules/2.6.26-2-orion5x/kernel/drivers/scsi/scsi_mod.koは一致しました
./conf/param.conf:1:ROOT="/dev/sda2"
./conf/conf.d/resume:1:RESUME=/dev/sda5
6.USBドライバの追加をします。
まず、もとからHDDにあるUSB関連のドライバをすべて、lib/modules/にコピーしておきます。
# cp -a /lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/ lib/modules/2.6.26-2-orion5x/kernel/drivers/
USBメモリを読み込む際に必要なドライバは、
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/host
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/host/ohci-hcd.ko
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/host/uhci-hcd.ko
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/host/ehci-hcd.ko
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/storage
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/storage/usb-storage.ko
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/core
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/core/usbcore.ko
ですので、それ以外は全て削除します。
なお、scsi関連のドライバも必要となります。今回はinitrdに元々含まれていたので追加作業はありませんでした。
lib/modules/2.6.26-2-orion5x/kernel/drivers/scsi/
lib/modules/2.6.26-2-orion5x/kernel/drivers/scsi/sd_mod.ko
lib/modules/2.6.26-2-orion5x/kernel/drivers/scsi/scsi_mod.ko
7.initrd.buffalo形式に戻します。
# find | cpio --quiet -o -H newc > initrd.cpio
cpio: File ./initrd.cpio grew, 3335680 new bytes not copied
# gzip -9 initrd.cpio > initrd.cpio.gz
gzip: initrd.cpio.gz already exists; do you wish to overwrite (y or n)? y
# ls
bin conf etc initrd.cpio.gz init lib sbin scripts
# mkimage -A ARM -O Linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initrd -d ./initrd.cpio.gz ./initrd.buffalo
※find ./ | cpio --quiet -o -H newc | gzip -c9 > initrd.gzでも戻せますが、何故かgz形式のサイズに差が出ました。
作成後のinitrd.buffaloが4MB以上では、起動時にうまく読み込みがされませんでした。
どこかでサイズ指定をされているか、最大サイズが決まっているのかもしれません。
8./boot以下へファイルをコピーします。
もとからあったHDD起動用のinitrd.buffaloは名前を変えておきます。
# cd /boot
# mv initrd.buffalo initrd.buffalo.hdd
こうすることで、USBメモリからの起動に失敗をしても、U-Boot上で環境変数名を変更するだけでもとに戻せます。
※起動に失敗したら
=> setenv initrd initrd.buffalo.hdd
=> boot
# cp initrd.buffalo /boot/
9.再起動後USBメモリに対しルートファイルシステムをマウントするようになります。
# reboot
これで、前回設定した時間を待つとHDDが回転を止めるようになりました。
kjournaldの5秒間隔での呼び出しも、USBメモリから行うためHDDへのアクセスが発生することもなくなりました。
また、cronで1日1回ファイルのインデックスを作成するmlocateというのがあったのでこれを1週間に1回実行するように変更を行いました。
USBメモリはHDDに対し、寿命が短いように思いますのでルートファイルシステムをtarで固めてHDD上にバックアップをとっておくとよいでしょう。
そのため、ブートデバイスをUSBメモリに切り替え、ログ等がHDDに書き込まれないようにした上で再度HDDのスピンダウンに挑戦します。
1.開発環境のインストールを行います。
# aptitude install gcc make libc-dev libc6-dev
# aptitude install patch
initrd.buffaloを再構築するにはU-boot付属のmkimageが必要となります。
(lenny付属のものではありません)
玄箱PRO付属のCDからU-bootのソースをコピーし、mkimageをビルドしておいてください。
エレキジャックさんに詳細な方法が載っています。
http://www.eleki-jack.com/Kurobox-pro2/2007/06/13-image.html
2.USBメモリ上にルートファイルシステムを作成します。今回はHDD環境をまるごとコピーしました。エレキジャックさんの下記ページが参考になります。
http://www.eleki-jack.com/Kurobox-pro2/2008/01/usbhdd.html
3.USBメモリからのブートにはinitrdの編集が必要なので、/bootからinitrd.buffaloをコピーしておきます。
# cp /boot/initrd.buffalo /tmp
4.initrd.buffaloの展開をします。
# dd if=initrd.buffalo of=initrd.gz bs=64 skip=1
33970+1 records in
33970+1 records out
2174126 bytes (2.2 MB) copied, 2.40114 s, 905 kB/s
# ls
initrd.buffalo initrd.gz
# gzip -d initrd.gz
# ls
initrd.buffalo initrd
# file initrd
initrd: ASCII cpio archive (SVR4 with no CRC)
# cpio -i < initrd
8735 blocks
# ls
bin conf etc init initrd lib sbin scripts
# rm initrd
rm: remove 通常ファイル `initrd'? y
# ls
bin conf etc init lib sbin scripts
※zcat initrd.gz |cpio -iでgz形式から一発解凍もできます。
5.USBメモリに関する部分の修正
内蔵SATAを使用している場合sdaがHDD、sdbがUSBメモリとなります。
まずは、起動時にルートファイルシステムとしてsdaを指定している部分を確認します。
# grep -rn sda ./
バイナリー・ファイル./lib/libc.so.6は一致しました
./conf/param.conf:1:ROOT="/dev/sda2"
./conf/conf.d/resume:1:RESUME=/dev/sda5
sda2は/以下のルートファイルシステム、sda5はスワップ領域となっています。
修正しなければいけないファイルはparam.confとresumeですので、この二つをsdbの対応する番号へ変更します。
変更後念のため確認
# grep -rn sda ./
バイナリー・ファイル./lib/libc.so.6は一致しました
# grep -rn sdb ./
バイナリー・ファイル./lib/modules/2.6.26-2-orion5x/kernel/drivers/scsi/scsi_mod.koは一致しました
./conf/param.conf:1:ROOT="/dev/sda2"
./conf/conf.d/resume:1:RESUME=/dev/sda5
6.USBドライバの追加をします。
まず、もとからHDDにあるUSB関連のドライバをすべて、lib/modules/にコピーしておきます。
# cp -a /lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/ lib/modules/2.6.26-2-orion5x/kernel/drivers/
USBメモリを読み込む際に必要なドライバは、
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/host
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/host/ohci-hcd.ko
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/host/uhci-hcd.ko
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/host/ehci-hcd.ko
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/storage
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/storage/usb-storage.ko
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/core
lib/modules/2.6.26-2-orion5x/kernel/drivers/usb/core/usbcore.ko
ですので、それ以外は全て削除します。
なお、scsi関連のドライバも必要となります。今回はinitrdに元々含まれていたので追加作業はありませんでした。
lib/modules/2.6.26-2-orion5x/kernel/drivers/scsi/
lib/modules/2.6.26-2-orion5x/kernel/drivers/scsi/sd_mod.ko
lib/modules/2.6.26-2-orion5x/kernel/drivers/scsi/scsi_mod.ko
7.initrd.buffalo形式に戻します。
# find | cpio --quiet -o -H newc > initrd.cpio
cpio: File ./initrd.cpio grew, 3335680 new bytes not copied
# gzip -9 initrd.cpio > initrd.cpio.gz
gzip: initrd.cpio.gz already exists; do you wish to overwrite (y or n)? y
# ls
bin conf etc initrd.cpio.gz init lib sbin scripts
# mkimage -A ARM -O Linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initrd -d ./initrd.cpio.gz ./initrd.buffalo
※find ./ | cpio --quiet -o -H newc | gzip -c9 > initrd.gzでも戻せますが、何故かgz形式のサイズに差が出ました。
作成後のinitrd.buffaloが4MB以上では、起動時にうまく読み込みがされませんでした。
どこかでサイズ指定をされているか、最大サイズが決まっているのかもしれません。
8./boot以下へファイルをコピーします。
もとからあったHDD起動用のinitrd.buffaloは名前を変えておきます。
# cd /boot
# mv initrd.buffalo initrd.buffalo.hdd
こうすることで、USBメモリからの起動に失敗をしても、U-Boot上で環境変数名を変更するだけでもとに戻せます。
※起動に失敗したら
=> setenv initrd initrd.buffalo.hdd
=> boot
# cp initrd.buffalo /boot/
9.再起動後USBメモリに対しルートファイルシステムをマウントするようになります。
# reboot
これで、前回設定した時間を待つとHDDが回転を止めるようになりました。
kjournaldの5秒間隔での呼び出しも、USBメモリから行うためHDDへのアクセスが発生することもなくなりました。
また、cronで1日1回ファイルのインデックスを作成するmlocateというのがあったのでこれを1週間に1回実行するように変更を行いました。
USBメモリはHDDに対し、寿命が短いように思いますのでルートファイルシステムをtarで固めてHDD上にバックアップをとっておくとよいでしょう。