<< < 1 2 > >>

今更ながらlibataを導入した

久々に我が家のデスクトップ Gentoo マシンをいじったので、メモしときます。
我が家のデスクトップは Raid1 構成の IDE ハードディスクをくっつけてます。
マザーボードは Albatron PX915G。
Raidコントローラーは IT8212 です。

で、新しいkernelを再構築して起動すると、ハードディスクへのアクセスが恐ろしく遅くなってしまいました。
dmesg の出力を見ると、"dma not selected" と出ています。
dmaが無効になってしまっているようです。
ちなみにmake menuconfigでkernelの再構築時にコンパイルしたドライバーは以下の通りです。
 Device Drivers  --->
   ATA/ATAPI/MFM/RLL support  --->
         IT821X IDE support

同じような事で悩んでいる人もいるようで、kernelのメーリングリストでも数年前に話題になっていたようです。
Re: IT821x: no DMA since 2.6.21

上記で組み込んだドライバーはメンテナンスされていないのでlibataを使うのが良いとか書いてあります。
libataはSerialなハードディスクだけの話かと思っていたのですが、parallelなハードディスクでも利用できるんですね。

make menuconfigで上記のドライバーをはずして、下記のドライバーを組み込みます。
 Device Drivers  --->  
  Serial ATA (prod) and Parallel ATA (experimental) drivers
    IT8211/2 PATA support   

我が家のPCでは IT8212経由のハードディスクは hde として認識されていました。
libataを使うことで、sda に変わったことが今回の変更の副作用です。
長らくハードディスクデバイスと言えばhd〜だったので、暫く違和感がありそう。
(OpenBSDのwd〜も暫く慣れなかったけど)

ハードディスクデバイスが /dev/sda に変わったので /boot/grub/grub.conf と /etc/fstab も忘れずに変更しましょう。

OpenBSD を PxeBoot でインストール

久々の更新になっちゃいました。
ノートPCが手に入ったのでOpenBSDをインストールすることにしました。
もらってから発覚したのですが、CDROMが壊れているマシンでした。インストールCDからインストールできない訳です。
それならと言うことで、以前から興味のあったPxeBootでインストールしてみることにしました。
構成としてはGentooマシンでdhcpdとtftpをホストしました。

やってみた感想としては、インストールするのにISOを焼く作業がなくなるし、設定もそんなに難しくないのでおすすめです。
インストール作業なんかはそんなに頻繁に行う作業ではないでしょうが、OpenBSDは半年に一回Updateがありますし。

参考にさせてもらったのは以下のドキュメント。
The Gentoo Linux alternative installation method HOWTO
OpenBSD FAQ 6.10 How do I boot using PXE? (i386, amd64)

ハマった所は、dhcpd.confで next-server を指定しないといけなかった所と、
PxeBoot環境では Grub は OpenBSD をうまく起動できない所でした。
dhcpdについてですが、設定ファイルでnext-serverを指定しないとサーバ機のIPアドレスを認識してくれませんでした。
また、OpenBSDをpxegrubで起動しようとしたのですが、起動時に下記のようなエラーがでて先に進めませんでした。
 panic: /boot too old: upgrade!
Grubの設定を下記のようにすればよいとの情報があったのですが、現状には当てはまらないようです。
 title=Diskless OpenBSD
 root (nd)
 kernel --type=openbsd /bsd.rd

うまくいった手順についてですが、まずはGentoo機にdhcpdとtftpをインストールします。
 $ sudo emerge dhcp
 $ sudo emerge tftp-hpa

Bootファイル設置用のディレクトリを作成します。
 $ sudo mkdir -p /diskless
まず bsd.rd を取得して、 /diskless 配下に置きます。
次に pxeboot を取得して、 /diskless 配下に置きます。

最終的な /etc/dhcp/dhcpd.conf の内容は以下のようになりました。
 ddns-update-style none ;
 option routers 192.168.1.10;
 option subnet-mask 255.255.255.0;
 option broadcast-address 192.168.1.255;
 option domain-name-servers 218.176.253.97;
 next-server 192.168.1.12;
 
 default-lease-time 120;
 max-lease-time 120;
 
 subnet 192.168.1.0 netmask 255.255.255.0 {
     # クライアントにロードさせるブートファイルを指定
     filename "pxeboot";
     range 192.168.1.36 192.168.1.250;
 }
tftpの起動オプションは以下のようになります。
/etc/conf.d/in.tftp
 INTFTPD_PATH="/diskless"
 INTFTPD_USER="nobody"
 INTFTPD_OPTS="-u ${INTFTPD_USER} -l -vvvvvv -p -c -s ${INTFTPD_PATH}"

クライアントをネットワークブートし、起動後に boot> プロンプトが表示されるので、 bsd.rd と入力します。
後は通常のインストールと変わりません。

Linuxでデジカメの活線を検知


デジカメをUSB経由で接続したときに、スクリプトを流すようにしたくて設定してみました。
Writing udev rules を参考に調べてみましたが、細かい所で古い部分(?)があるみたいでしたので、メモを残しときます。
どの辺が古そうかと言うと、私の環境では Writing udev rules に説明のあった、udevtestやudevcontrolコマンドがありませんでした。
代わりにudevadmを使うみたいです。
なお、デジカメは IXY DIGITAL 800IS で、接続先は Gentoo マシン。udev-124-r1。

デバイスの認識は最近のLinuxではほとんど苦労することもなくなりました。
USB経由でデジカメを接続したときには、裏方では udev が動いていて、デバイスノードの作成やパーミッションの変更をしてくれているようです。
今回は、この udev を利用して、デジカメ接続時にスクリプトを呼ぶように設定してみました。

この設定を行うためには udev のルールと言われるものを作成します。既存のルールは /etc/udev/rules.d/ 配下にあります。
このフォルダに新たに設定ファイル 99-local.rules を追加しました。

ルールの記述方法は、条件を == や != で記述し、条件に合致したときのアクションを RUN+="スクリプト" の書式で記述します。
例えば、今回作成したルールはこんな感じ。SUBSYSTEMやACTION、ベンダーや機種の条件が合致したときにスクリプトが流れるように設定しています。
SUBSYSTEM=="usb|usb_device", ACTION=="add",ATTRS{idVendor}=="04a9", ATTRS{idProduct}=="3119",RUN+="/usr/bin/hoge"

ATTRS{idVendor}=="04a9"や ATTRS{idProduct}=="3119"の部分は、udevinfo コマンドで調査することができます。
デジカメを接続した状態で下記の様に実行します。(1.23の部分は接続する度にかわります。dmesg等の出力で調べられます。)
$ udevinfo -a -p /sys/class/usb_device/usbdev1.23
さて、新たに書いたルールを読み込ますには、
$ udevadm control reload_rules
デバックをするには、
$ udevadm test /class/usb_device/usbdev1.23
syslogに詳細なログを出すには、
$ udevadm control log_priority="debug"
これらを駆使すれば、認識しているデバイスに関しては何とかなると思います。


Gentoo の起動時間測定と高速化


今月のGentoo Monthly NewsletterのTips and Tricksで起動時間の高速化と測定についての話題がありました。
PCはつけっぱなしの事が多いけど、興味があったので試してみました。

起動時間の測定ってのは思ったより簡単で、以下の手順でできちゃいます。
1.Bootchartのインストール
2./etc/conf.d/rcの編集
3.bootchartコマンドで解析
手順2は他のディストリビューションではgrub.confをいじらないといけないみたい。

まず起動時間を測定するには Bootchart をインストールする必要があります。
emerge bootchart

Bootchartで起動時間の測定を行うには/etc/conf.d/rc を編集します。
RC_USE_BOOTCHART="yes"
これで起動を行うと /var/log/bootchart.tgz が作成されます。
このファイルをbootchartコマンドで解析します。
bootchart
カレントディレクトリにイメージファイル、bootchart.pngが作成されます。
測定結果は下のイメージのようになりました。


さて、次は高速化の手順です。高速化を行うために今回は以下の設定を行います。
  • サービスの起動を並列化
  • 起動時のkernelのメッセージを抑止

サービスの起動を並列化を行うために/etc/conf.d/rc を編集します。
RC_PARALLEL_STARTUP="yes"
次に起動時のkernelのメッセージを抑止するために/boot/grub/grub.confを編集します。
kernel (hd1,0)/boot/bzImage-fb root=/dev/hdb3 video=radeonfb:1024x748 quiet

これらの設定で起動時間が43秒から40秒になりました。たった3秒。。。。。
いままで「ベンチマーク」ってのはあまりとったことがなかったけど(前職でベンチマークみたいな事ばっかりやってたからその反動か?)、
測定して検証する理系の実験みたいなアプローチはなかなか楽しかった。
結局劇的な高速化は実現できなかったけどね。

SSHを使いこなせてません - keychainを使ってみよう


ssh(1)を使い倒す
sshを使いこなしていないひとを見るとイラっとする。パスワード認証大好き(もう21世紀ですよ)、
パスフレーズ入れるのが面倒(keychain使えよ)、放っといたssh接続が切れて「また切れた!」(screen使えよ)とか。
すいません、使いこなせてませんでした。
3台のサーバにSSHで接続したり、そもそもこのBlogはEmacsのTrampでssh接続して書いているというのに。

どう使いこなせていなかったかというと、ssh-agentとkeychainを導入してませんでした。
毎回パスフレーズをいれてたわけですな。
よく調べもせずに、セキュリティ的に大丈夫なのか不安だったので導入していませんでした。
マシンが一台増え、cron + rsync + sshでバックアップをとることにしたんで、良い機会なんで調べてみました。

まずはssh-agent と keychainがどういう物なのかから。
1.ssh-agentは一度パスフレーズを入力したら、ログインしている間はパスフレーズの入力が省略できる機能。
2.keychainは一度パスフレーズを入力したら、システムが再起動するまでパスフレーズの入力が省略できる機能。
と理解しました。

「keychainはアカウントをとられたら終わり?」という疑問から敬遠してましたが、
IBMの資料にある --clear オプションで不安もやわらぎました。
--clear オプションは新たなログインがあった時に、キャッシュをクリアするオプションです。
例えば SSH経由のrsync によるバックアップを毎晩cronに仕込んで置いた場合、
cronはログインはしないので、キャッシュされたSSH接続を使うことができます。
アカウントを奪われログインされた場合は、ログインした瞬間にSSH接続がクリアされるので、
他のマシンへパスフレーズの入力なしで接続される事はありません。

というわけで、keychainをインストールして、下記の内容を~/.bash_profileに追加。
 #!/bin/bash
 #on this next line, we start keychain and point it to the private keys that
 #we'd like it to cache
 /usr/bin/keychain ~/.ssh/id_rsa ~/.ssh/id_dsa
 source ~/.keychain/example.com-sh

これで一度ログインしてパスフレーズを入力しておけば、cronからもパスフレーズなしでSSH接続出きるようになります。
後は再起動時に忘れずにログインするような仕組みを作ればOK。
この仕組みはみんなどうやって実現してるのかな?

Linuxで省電力モード(スタンバイモード)に挑戦


最近はついついデスクトップPCの電源をつけっぱなしにしてしまってます。
emerge仕掛けて出勤したり、嫁がちょこちょこmixiとかやってるみたいなんで。
電源を切るってのはなかなかめんどくさいので、せめて休止モードを試してみる事に。

一言で休止モードといっても、色々あるみたい
  • Standby (S1)
  • Sleep (S3) suspend to ram
  • Hibernate (S4) suspend to disk

まず、BIOSがサポートしているかを確認したところ、Standby (S1) しかサポートしていない模様。
我が家のマザーボード(ECSの748-A)は2003年に購入したものなんですが、古いってことか。。。
作業内容をメモリやディスクに保存してCPUの電源を切れるS3,S4に比べてS1は省電力は劣るけど、
ないよりはましという事で、設定してみた。

まずはKernelの再構築から
Power management options  --->
 [*] Suspend to RAM and standby
standbyモードに移行するには下記のコマンドを打つ
 echo -n "standby" > /sys/power/state

acpidが動いていると、うまく復帰できなかった。原因は調査中です。

OpenNTPDでローカルNTPDサーバ構築


我が家にはPCが4台あるけど、きちんと時刻合わせしてませんでした。
時刻合わせは、いつ、何が起きたかを知る上で重要な作業なんですが、ついついサボってました。反省。
そこで、今頃って感じですが、NTPサーバで時刻合わせをすることにしました。
それぞれが外部のNTPDサーバに個別にアクセスしていては、ネットワークに優しいとは言えないので、
ローカルNTPDサーバを建てることに決定。
以前、ファイルサーバーをどうしようか悩んでいたOpenBSD4.2マシン、
こいつにNTPDサーバとしても働いてもらうことにしました。

OpenBSDをインストールすれば、OpenNTPDも一緒にインストールされます。
OpenNTPDは精度こそそこそこだけども、シンプルでセキュアなNTPサーバ&クライアントです。

インストールはされているので、設定を行います。
/etc/ntpd.confを編集します。
このファイルにはntpクライアントとしての設定とntpサーバとしての設定を一つのファイルで兼ねてます。
クライアントとして同期を行うサーバと、サーバとして公開するネットワークを設定します。
# ntpdサーバとして公開
listen on *

# 同期を行う外部のntpdサーバを設定。YahooBBと近場の大学をチョイス
servers ntp.bbtec.net
servers ns.kobe-u.ac.jp
ntpdを起動
 $ sudo /usr/sbin/ntpd
再起動時にもntpdが起動するように/etc/rc.conf.localに下記を追加
 /ntpd_flags=""
/var/log/daemonに吐かれるログに、"clock is now synced"とでれば同期完了です。

続いてクライアントの設定をしましょう。
クライアントがOpenBSDなら、上記の設定とほぼ同じで、サーバとしての設定を抜けばよいだけ。
クライアントがGentoo Linuxならopenntpdは下記でインストール完了です。
 $ sudo emerge openntpd
/etc/ntpd.confを編集します。ローカルNTPサーバを192.168.100.10とすると
servers 192.168.100.10
ntpdを起動
 $ sudo /etc/init.d/ntpd start
再起動時にもntpdが起動するように/etc/rc.conf.localに下記を追加
 $ sudo rc-update add ntpd default

これでローカルマシンの時刻が正確に同期できます。

Gentoo翻訳作業に便利なXSLTプロセッサーgorg

知らなかったっす、gorg。

ほとんどの設定ファイルがXMLなJavaをやってるのに、XML系の技術には全くうといもんで、
なんか初めてXMLが便利な技術と感じました。

差分翻訳の場合以下の手順で作業をすることにしました。
まず、gorgをインストールします。
#~x86キーワードを追加
$ echo "www-servers/gorg ~x86" >> /etc/portage/package.keywords
#gorgをインストール
$ emerge gorg
ドキュメントを入手します。
#ドキュメントをCVSからチェックアウト
$ cvs -d :pserver:anonymous@anoncvs.gentoo.org/var/cvsroot co gentoo/xml
差分翻訳の場合、このままチェックアウトしたファイルを直接編集します。

編集したファイルをチェックするには、まずxmllintを使います。
まず /etc/xml/catalogを編集
<rewriteURI uriStartString="/dtd/" rewritePrefix="/usr/portage/metadata/dtd/"/>
xmllintでチェック
 $ xmllint --valid --noout hb-install-stage.xml 
続いてgorgでブラウザでの見た目をチェックします。
まずgorgの設定をします。/etc/gorg/gorg.conf.sampleを元に、/etc/gorg/gorg.confを作成し、
gorgのドキュメントルートをチェックアウトしたドキュメントに設定します。
root = "/home/tma/gentoo/xml/htdocs"
gorgを起動
$ gorg
http://localhost:8008/doc/ja/handbook/index.xml にアクセスすれば、handbookのトップページが見れます。

MLに投稿するdiffはcvsのdiffで取得します。
$ cvs diff -u  hb-install-stage.xml > ~/hb-install-stage.diff

cvsを使わずにドキュメントを入手したり、翻訳アップロードサイトでブラウザでの見た目をチェックしてたのに比べると、随分楽になりました。
まとめると、
1.cvsで最新のドキュメントを入手
2.チェックアウトしたファイルを編集
3.xmllintでXMLをチェック
4.gorgを起動して、ブラウザでチェック
5.cvs diff でdiffを作成
6.投稿

日本のユーザーグループが熱い Wicke-ja誕生 GentooJp-Doc再始動

仕事の方でてんやわんやしているうちに、
自分に取って熱い技術の日本ユーザグループが誕生&再始動してる。
まずはGentooJP-docs。
ハンドブックのを皮切りに、翻訳作業を再開するそうです。
英語は洋書や海外サイト等を読んでいたけど、翻訳作業はほとんどやってなかった。
ちょっとブランクが長いけど、仕事が一段落したら参加させてもらおう。

そして、このお手製のBlogソフトでも使ってるJava Webアプリケーションフレームワーク、
Wicketの普及と貢献を目指す Wicket-jaが始まったそうです。
普及だけでなく、貢献に重きを置いているようで、
ちまちまやってるWicketのソースコードリーディングや、
今読んでるWicket In Actionの知識が生かせればと思ってます。

何はともあれ、今のプロジェクトを早いとこ落ち着かせないとな。

CapsLockとCtrlを入換よう (キーボードを新調した Elecom TK-P05F)

キーボードがぶっ壊れた。
ここ1,2ヶ月くらい、"v"と"5"が打ちにくくて、(しばらく押しっ放しにしたら直る)
そろそろ買い替えかなと思ってたけど、ついにCtrlボタンが効かなくなって買い替えを決断。
CtrlボタンなんてEmacs使ってたら致命傷ですわ。

今回ぶっ壊れたのはHappy Hacking Lite2。Hackerに憧れて使ってたけど、
打鍵音が大きかったり、テンキーがなくて嫁に不評だったりしたので、
静音、テンキー付きをテーマにキーボードを物色。
そんな中見つけたのがElecomのTK-P05F。
難点はスペースボタンが打ちにくい所だけど、それ以外はコンパクトだし、打鍵音も静かだし概ね満足。

jp106のキーボードの一番の難点はCtrlボタンの位置。
Hppy Hacking Keyboardは、Ctrlボタンがjp106キーボードで言うCapsの位置にあったので、
問題なかったけど、今回はソフト的に設定してやらないといけない。
切替器でつながってる全てのマシンを設定するんで、1台じゃ済まなかった。
以下、各マシンの設定内容。

Gentoo Desktop機
主にXで使用するデスクトップマシン。Xwindowの場合は、/etc/X11/xorg.conf を編集する。
InputDeviceに Option "XkbOptions" "ctrl:swapcaps" を追加
Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
       Option "XkbOptions" "ctrl:swapcaps"

Windows Desktop機
Gentoo Desktop機とのデュアルブートで使ってるWindows機。
窓使いの憂鬱をダウンロードして、~/.mayuを設定。
# CapsLockをCtrlに
mod control += 英数     # 英数を Control に
key *英数 = *LControl   #    〃

Gentoo Server機
Xは使わずコンソールが主な用途のマシン。コンソールの場合は、 /etc/conf.d/keymaps を編集
EXTENDED_KEYMAPS="ctrl"
keymapサービスを再起動
$ /etc/init.d/keymap restart

OpenBSD Server機
こちらもXは使わずコンソールが主な用途。
以下のコマンドでCapsLockとCtrlの切り替えが可能。
$ wsconsctl -w keyboard.map+="keysym Caps_Lock = Control_L"
再起動後も有効にしたければ、/etc/wsconsctl.confに設定を追加。
$ keyboard.map+="keysym Caps_Lock = Control_L"