未来避行


 LinuxとAndroidと、同人サークルの話

玄箱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上にバックアップをとっておくとよいでしょう。

玄箱PRO Debian lenny HDDのスピンダウン

玄箱PROでSATAHDDのスピンダウンを行い、静音化と省電力化をしたいと思います。

1.まずは、hdparamで速度を測定しました。
# hdparm -Tt /dev/sda

/dev/sda:
Timing cached reads: 180 MB in 2.01 seconds = 89.54 MB/sec
Timing buffered disk reads: 112 MB in 3.00 seconds = 37.27 MB/sec

2.sambaで更新を必要とするファイルをRAM上に移すため/etc/fstabに以下を追加する。
tmpfs /var/cache/samba tmpfs defaults 0 0
tmpfs /var/log/samba tmpfs defaults 0 0
tmpfs /var/run/samba tmpfs defaults 0 0

2./etc/crontab の以下の行をコメントアウトする。
17 * * * * root cd / && run-parts --report /etc/cron.hourly

3.hdparmの自動設定ファイルを編集します。単位は5秒単位となります。
5×12 = 1分
/etc/default/hdparmに、
harddisks="/dev/sda /dev/sdb"
hdparm_opts="-S 12"

# vi /etc/hdparm.conf

/dev/hda {
spindown_time = 12
}

5.pdflushの感覚を変更
http://lets-ubuntu.yui.at/tips/tips_hdparm.html#para
# vi /etc/sysctl.conf

vm.dirty_background_ratio = 30
vm.dirty_ratio = 60
vm.dirty_expire_centisecs = 500000
vm.dirty_writeback_centisecs = 600000

設定を反映
# /sbin/sysctl -p
再起動

6.pdflush の更新間隔を長くしても、相変わらず 5 秒間隔でアクセスしているのでさらに調べた結果、ext3 の場合はジャーナルを kjournald というデーモンで定期的に HDD に書き出しているらしいです。そのデフォルト間隔が 5 秒。@ITの記事が ext3 のトランザクション処理について、分かりやすく説明してくれいてます。詳しくは http://www.atmarkit.co.jp/flinux/rensai/fs04/fs04b.html を参照。

kjournald のトランザクションコミット間隔を長くする
ってことで、kjournald のトランザクションコミット間隔を長くする。

現在のトランザクションコミット間隔は dmesg | grep "kjournald" とかすれば分かります。


# dmesg |grep "kjournald"
[42949380.220000] kjournald starting. Commit interval 5 seconds
[42949410.190000] kjournald starting. Commit interval 5 seconds

ext3 のファイルシステムのマウント時に出力されているメッセージらしいです。

kjournald のコミット間隔は、マウント時のパラメータで指定します。

commit=秒数 を /etc/fstab に追記。

・・・うーん、まだHDDがうまく止まってくれません。
# hdparm -y /dev/sdb
の実行で停止はしますが、すぐに動き出してしまいます。
# hdparm -S 1 /dev/hda
を実行すると動的に停止時間を書き換えられますが、5秒で停止にしても止まりません。

別の方法を考えるか。。。

玄箱PRO Debian lenny プリンタサーバー化

玄箱PROにUSB経由でプリンタをつなぎ、Windowsと共有してみたいと思います。
私が持っているプリンタは2007年モデルのEPSON PM-G860ですので、
同じメーカーかつ2007年近辺の機種であれば同じようにインストールが出来ると思います。


1.プリンタをUSBで接続後電源を入れ、dmesg、lsusbで接続したプリンタが見えるか確認をします。

2.# aptitude install cupsでcupsをインストールします。

3./etc/cups/cupsd.confに以下の修正を加えます。
# Only listen for connections from the local machine.
Listen localhost:631
Listen 192.168.xxx.xxx:631
Listen /var/run/cups/cups.sock

# Restrict access to the server...

Order allow,deny
Allow localhost
Allow 192.168.xxx.xxx/24


# Restrict access to the admin pages...

Order allow,deny
Allow localhost
Allow 192.168.xxx.xxx/24


# Restrict access to configuration files...

AuthType Default
Require user @SYSTEM
Order allow,deny
Allow localhost
Allow 192.168.xxx.xxx/24


4.ブラウザ等で、http://192.168.xxx.xxx:631/を呼び出します。
このときうまく表示がされない場合は、上記設定を見直してください。

5.管理タブで新しいプリンタの検索を行う。ここで、現在接続されているプリンタが表示されます
検索後追加したいプリンタを選び、プリンタの追加ボタンを押す。名前や場所の確認をし、よければ続けるを押します。

5.デバイスドライバの選択を行います。EPSONのプリンタは海外ではstylusという名称なため、
PMG-860相当の"Epson Stylus Color Series, 1.3(......)を選択しました。
(Photoはサンプルページの印刷ができず、New Stylusは印刷が異様に遅かったため)

正しく追加されましたと表示されればOKです。

6.プリンタの追加後管理画面が出ます。また、プリンタタブからテストページの印刷ができるようになっています。

7.Windows側でプリンタの設定をします。
コントロールパネル→プリンタ→プリンタの追加でプリンタの追加ウィザードを立ち上げます。
ネットワークプリンタを選択し、指定したプリンタとしてCUPSのプリンターURLを指定します。
例:http://192.168.xxx.xxx:631/printers/EPSON_PM-G860_USB_1
プリンタドライバをメーカーサイトからダウンロードし、該当の.INFファイルを指定しインストールを行います。

8.印刷ができるか確認をします。

以上です。割と簡単に共有設定ができてよかったです。

玄箱PRO Debian lenny化 part.3

今回から、sambaやらcupsなどのインストール・設定を行っていきます。

1.アップデート
debian:~#apt-get update
・・・・・
・・・・・
debian:~#apt-get upgrade

2.ホスト名の変更
debian:~# vi /etc/hostname
# reboot

3.fw_printenvのインストール
# apt-get install uboot-envtools
# cp /usr/share/doc/uboot-envtools/examples/kurobox_pro.config /etc/fw_env.config

4.samba, swatのインストール
# apt-get install samba smbclient swat
WorkgroupはWindows環境下で使っているものを指定します。
Modify smb.conf to use WINS settings from DHCP? はNoを選択しました。
今回はLinuxのユーザーホームディレクトリをそのまま使う方法で設定してみました。

PCのブラウザにてhttp://192.168.xxx.xxx:901/ (IPアドレスは玄箱のアドレス)にアクセスし、ID、パスワードを聞かれればOK。ID、パスワードはrootのものを使用します。
"Welcome to SWAT!"と表示されれば成功です。

6.IPアドレスを固定にします。
debian:~# vim /etc/network/interfaces
iface eth0 inet static
address 192.168.xxx.xxx
netmask 255.255.255.0
network 192.168.xxx.xxx
broadcast 192.168.xxx.255
gateway 192.168.xxx.1

共有ディレクトリも必要であれば作成
(設定はgoogle先生参照)
# mkdir share
# chmod -R g+w share/
# chgrp staff share/

# cp -p /etc/samba/smb.conf /etc/samba/smb.conf.default

SWATによる設定(http://IPアドレス:901/ にアクセスしrootでログインする)
GLOBALSタブを開きAdvancedに設定をし、下記項目を変更する。
dos charset = CP932
unix charset = eucJP-ms
display charset = CP932

UTF-8を使用する場合は
dos charset = CP932
unix charset = utf-8
display charset = utf-8


SWAT → PASSWORDで新規ユーザーを追加
linuxユーザーとwindowsユーザーのマッピングするために
/etc/samba/smbusersというファイルを新しく追加。

 (例)
  john = "John Doe"
smb.confの修正
 [Globals]セクションに、
  username map = /etc/samba/smbusers
 という行を追加

sambaを再起動後、smbusersで指定したWindowsユーザーと同じ名前のディレクトリが見えると思います。(ちょっとうろ覚え)

この後必要な方は、ホームディレクトリをさらに掘ったり、ゴミ箱の追加等を行ってください。(google参照)

玄箱PRO Debian lenny化 part.2

前回Debian化に失敗し、telnet,ssh,pingすべてに応答しなくなり沈黙の箱と化した玄箱PROですが、再起をかけ公式シリアルコンソールキット"SCON-KIT/PRO"購入&取り付けしました。

7年ぶり?くらいに握る半田ごてで手は震えるわ、半田がぜんぜん流れないわで散々でしたが、何とか作業は終了しシリアルコンソールで状況を確認できるようになりました。
(ちなみに、これで保障は切れました・・・ コネクタ一つくらい最初からつけておいてよ(´Д⊂ヽ)

さて、応答しなくなった原因ですがどうやら起動時にext2の読み出しに失敗し、tftpで永遠とイメージを取りに行っていたためだったようです。
パーティションを切る際に/bootをext2にしたはずなので、おそらくファイルシステムの作成に失敗、もしくは種類の指定が間違っていたのでしょう。
で、カーネルを探しにtftpを使っていたせいで応答もなく、またU-Bootでループしていたのでネットワーク経由だとアクセスができなかったと。
まぁ、シリアルコンソールをつけないとどうにもならない事態でした。


シリアルコンソールからU-Bootの環境変数を書き換えることで、フラッシュ(NAND)から組込みのカーネルをロードするように戻すことができます。

デフォルトOS復帰後、エレキジャックさんのlenny化キットを調べてみましたが、どうやらext2で作成したインストール用パーティションがうまくマウントできていなかったようです。
スクリプトを書き換え数回やり直してみましてが、どうにも上手くいかなかったため手動インストールに切り替えてみました。(暇があればスクリプトを調べてみたいですが・・・)


1.玄箱Proは、通常DNSを引かない設定になっているようですので、/etc/nsswitch.confにhosts: files ndsと記述してあげます。

/etc # echo "hosts: files dns" > /etc/nsswitch.conf

2.時計合わせが必要なようなので、dateコマンドであわせます。
/etc # date 112913302009
/etc # hwclock -w

3.インストール用のパーティションを切ります。
/etc # fdisk /dev/sda
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
The number of cylinders for this disk is set to 121601.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-121601, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-121601, default 121601): +256M
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
/etc # mkfs.ext2 /dev/sda1
mke2fs 1.27 (8-Mar-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
64256 inodes, 257008 blocks
12850 blocks (5.00%) reserved for the super user
First data block=1
32 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
/etc # mount -t ext2 /dev/sda1 /mnt/disk1

4.インストールパッケージを3で作成した"/mnt/disk1"へダウンロードしておきます。
ここはもしかしたら、前回のインストールパッケージのものを使用してもよかったかもしれません。
/etc # cd /mnt/disk1
/mnt/disk1 # wget http://ftp.nl.debian.org/debian/dists/lenny/main/installer-armel/current/images/orion5x/netboot/buffalo/kuroboxpro/config-debian
Connecting to ftp.nl.debian.org[130.89.149.21]:80
config-debian 100% |***********************************************| 1535 00:00 ETA
/mnt/disk1 # wget http://ftp.nl.debian.org/debian/dists/lenny/main/installer-armel/current/images/orion5x/netboot/buffalo/kuroboxpro/initrd.buffalo
Connecting to ftp.nl.debian.org[130.89.149.21]:80
initrd.buffalo 100% |***********************************************| 3837 KB 00:00 ETA
/mnt/disk1 # wget http://ftp.nl.debian.org/debian/dists/lenny/main/installer-armel/current/images/orion5x/netboot/buffalo/kuroboxpro/uImage.buffalo
Connecting to ftp.nl.debian.org[130.89.149.21]:80
uImage.buffalo 100% |***********************************************| 1350 KB 00:00 ETA
/mnt/disk1 #


5.最後にシェルを実行します。前回のインストールパッケージはここまで自動化で行ってくれていたようです。
/mnt/disk1 # sh config-debian

この後に関しては、エレキジャックさん等で紹介されている通りにインストールを続けていきました。ネットワーク経由ではちょっと怖かったのでシリアルコンソールでインストールは行いました。


さぁ、次はsambaやらプリントサーバーやらです・・・

続く...