Linux
で使う
P8210
★Linux
インストールはあっさり過ぎるほど簡単
Vine
Linux3.2をインストールしたら、あっさりと成功。今回買ったマシンはHDは60Gを搭載していて、30Gずつにわかれていて、D:ドライブは空な
ので、これをつぶしてそこにVine Linuxを入れた。
デフォルトどうりのLilo起動でちゃんとWindowsXPとデュアルブートできた。
一番悩んだのは、CD-RW/DVDコンボドライブがどうしてもブートCDを読んでくれなかった時だ。
原因は「使用するときには取り除いてください」と書いてある厚紙(ヘッダ
部の輸送中の防護のた
めに入れてあった)をつけたままだったからだった。
つまり、そういう人災(原因はおまえだ>わし)がない限り、インストールはスムースに終了してしまうのである。
今のところファイルの使用状況はこんな感じ。
fdiskによるパーティションテーブル
Disk /dev/hda: 60.0 GB, 60011642880 bytes
255 heads, 63 sectors/track, 7296 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス ブート 始点 終点 ブロック ID システム
/dev/hda1 * 1 3648 29302528+ 7 HPFS/NTFS
/dev/hda2 3649 3681 265072+ 83 Linux
/dev/hda3 3682 3812 1052257+ 83 Linux
/dev/hda4 3813 7296 27985230 f Win95 拡張領域 (LBA)
/dev/hda5 3813 4073 2096451 82 Linux スワップ
/dev/hda6 4074 5117 8385898+ 83 Linux
/dev/hda7 5118 6161 8385898+ 83 Linux
/dev/hda8 6162 7296 9116856 b Win95 FAT32
dfの出力
ファイルシステム 1k-ブロック 使用中 空き 使用% マウント場所
/dev/hda3 1035692 619432 363648 64% /
/dev/hda2 256665 10745 232667 5% /boot
/dev/hda7 8254240 3968676 3866272 51% /home
none 122876 0 122876 0% /dev/shm
/dev/hda6 8254240 1577752 6257196 21% /usr
/dev/hda8 9107944 857200 8250744 10% /dos2
/dev/hda1 29302528 3796984 25505544 13% /dos
mountの出力
/dev/hda3 on / type ext3 (rw)
none on /proc type proc (rw)
none on /proc/bus/usb type usbfs (rw)
/dev/hda2 on /boot type ext3 (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda7 on /home type ext3 (rw)
none on /dev/shm type tmpfs (rw)
/dev/hda6 on /usr type ext3 (rw)
/dev/hda8 on /dos2 type vfat (rw,uid=500,gid=500)
/dev/hda1 on /dos type ntfs (ro,uid=500,gid=500)
/dev/hda1は最初からあったntfsでフォーマットされたWindows領域。
あまったところ(/dev/hda8)をFAT32でフォーマットして、windowsでもlinuxでも使える領域にしたんだけど、もうすこしここの
容量増やしておいた方がよかったかな。
いきなり/homeが4G使われているが、これはこれまで使ってきたLOOXのホームディレクトリをコピーしてきたから。
P8210は1024x600という変な解像度なので、はたしてX-Windowは大丈夫?というのが心配だったのだが、Vineの
インストーラ
はディスプレイの選択のメニューに、ちゃんと「LCD
1024x600」を含んでいた。で、とりあえず無事に動いている。目玉であるタッチスクリーンについては下を
見よ。
★ソフトウェアサスペンド
Vine
Linux3.2付属のカーネルは、ACPIによるソフトウェアサスペンドに対応していて、ちゃんと/etc/lilo.confに
append=" resume2=swap:/dev/hda5"
を追加してくれている(ここにはスワップに使っているデバイスが入る)。
で、後はsoftware
suspend2のダウンロードページから、サスペンドに入るためのスクリプトを手に入れるだけ。これで、
/usr/sbin/hibernate
をルート権限で実行すればサスペンドに入り、次の電源ONで元に復帰する。電源ボタンでサスペンドさせるには、
/etc/acpi/events/powerというテキストファイルを作って、
event=button/power.*
action=/usr/sbin/hibernate
と書けばよい。
また、液晶を閉じた時にサスペンドに入るようにするには、/etc/acpi/events/lidというテキストファイルを作って、
event=button/lid.*
action=/etc/acpi/actions/lid
と書く。/etc/acpi/actions/lidの方には、
if
grep -q closed /proc/acpi/button/lid/LID/state ; then
/usr/sbin/hibernate
fi
と書く。
★なお、2.6系カーネルをコンパイルする時は
上も書いたsoftware
suspend2のダウンロードページから、カーネルのパッチをダウンロードして適用しとくとよい。Vine付属のカーネル同様のソ
フトウェアサ
スペンドができるようになる。
★自動ソフトウェアサスペンド?
バッテリが少なくなったら自動でサスペンド状態に入って欲しいものだが、どうやらそこまでやってくれないらしい。「cat
/proc/acpi/battery/CMB1/state」すると、
present: yes
capacity state: ok
charging state: discharging
present rate: 921 mA
remaining capacity: 2380 mAh
present voltage: 11982 mV
とか出てくる。「cat /proc/acpi/battery/CMB1/info」すると、
present: yes
design capacity: 2600 mAh
last full capacity: 2448 mAh
battery technology: rechargeable
design voltage: 10800 mV
design capacity warning: 322 mAh
design capacity low: 36 mAh
capacity granularity 1: 1 mAh
capacity granularity 2: 1 mAh
model number: CP229721
serial number: 1
battery type: LION
OEM info: Fujitsu
だそうな。で、これみるとcapacityが322mAh以下になったらwarningでも出してくれるか、あるいはstateの「capacity
state: ok」が「capacity state:
warning」に変わったりするのかな、と思って、とりあえずACアダプタ外してcapacityが下がるのを仕事しながら待っていたが、変わらなかっ
た(;_;)。
36mAh以下になると、「capacity state: critical」に変わった。しかし、ACPIのイベントは飛んでこなかった。
しょうがないので、、、、、
★colortimer
というつまんないスクリプトを作ってみる。どういうスクリプトかというと、ACPIでバッテリの状態をチェックして、「あと6分でバッテリが切れる」と
いう状況
だとわかったらカラータイマーを鳴らす(と言っても音だけ。音がぴこんぴこんぴこんとなる)。
少しずつ音のテンポが遅くなりつつ、20回鳴らし終わって状況が変化してなかったら/usr/sbin/hibernateする。途中でACアダプタが
つながれたと判断したらそのまま復帰する。
ただ、これだけのもの。これを/usr/local/bin/colortimer.shとしてインストールしておいて、rootで
「crontab -e」して
0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57
* * * /usr/local/bin/colortimer.sh
と入力しておくと、3分ごとにこいつが起動される。
前にはここでC++の恥ずかしいソースファイルが公開してあった(一応、今もここに残すだけ
残しておく)のだが、それはもうやめて、今後はbashスクリプト版を公開することにする。も
しかして「俺も使ってみよ」という奇特な方がおられたとしても、bashスクリプトの方が移植しやすかろう。
それぞれの環境向けに変更すべきところを書いておくと、まず最後の方の、
if [ $i -lt 10 ]; then
j=$(( $i+2 ))
/usr/bin/play -v$j /dos2/Waves/PikonPikon.wav
2>/dev/null
else
j=$(( 30000- 1000*$i ))
/usr/bin/play -v3 -r$j /dos2/Waves/PikonPikon.wav
2>/dev/null
fi
fi
isdischarging
if
[ $isdischarge -eq 0 ]; then
wall AC Power is recoverd.
exit
fi
i=$(( $i+1 ))
done
/usr/sbin/hibernate
fi
の赤字の部分。/dos2/Waves/PikonPikon.wavな
んてファイル名があるが、ここを「いかにも電池が切れかけてますよと知らせているような音」に変えましょう。
あと、その少し上に
if
[ -f /proc/acpi/video/GFX0/LCD/brightness ]; then
if [ $charging
-eq 0 ]; then
if [ -f /etc/colortimer/blightness ]; then
echo `cat /etc/colortimer/blightness` > /proc/acpi/video/GFX0/LCD/br
ightness
else
echo 5 >
/proc/acpi/video/GFX0/LCD/brightness
fi
else
echo 8 >
/proc/acpi/video/GFX0/LCD/brightness
fi
fi
という部分があります。ここでは、ACアダプタがつながれていたら液晶画面の明るさを8(最大)に、つながれてなかったら明るさを5に、もしくは
/etc/colortimer/blightnessというファイルの内容(「3」とか「7」とか、適当な数字一文字が書き込まれたファイルを作ってく
ださい)にしてます。この辺りもお好みで書き換えてみてください。
なお、/etc/colortimer/blightnessをrootでなくても書き換えられるようにしておくと、その時の状況で明るい暗いの調整が
(sudoしなくても)できるので楽です。
★
液晶の明るさを変える
液晶の明るさを変えるボタン(Fn+F6,Fn+F7)はLinuxでは効きません。
echo 8 > /proc/acpi/video/GFX0/LCD/brightness
とやると最大の明るさになります(カーネルがちゃんとACPI対応してれば)。
数を減らせばその分暗くなります。新しいcolortimer.shはAC
アダプタが接続さ
れているかどうかを判断して変えるようにしました。
★ペンが使えるようになり
ました
何人かの方に教えてもらいつつもなかなか成功してなかったんですが、やっとペンが使えるようになりました。
最終的に、以下のような情報を大内さんという方からいただいた。
1. Touchscreenの有効化
まず http://www.conan.de/touchscreen/p-series.html
のサイトから最新のバイナリをもらってきます。
http://stz-softwaretechnik.com/~ke/touchscreen/fujitouch-0.6.3.tar.gz
展開するとfujitsu_drv.oがありますので、/usr/lib/xorg/modules/inputにコ
ピーします。
それから同梱のstylusスクリプトを/etc/init.dにコピーしておきます。
ここが重要なのですが、最近のLinuxは高速起動なる機能がついていて
/etc/rc.localに書かれたスクリプトはXの起動後に呼ばれるようです。
そこで、Xの起動前に呼ばれる /etc/rc.sysinitの最後に
/sbin/service stylus start
という行を追加します。
(わしはXは起動後にstartxで立ち上げているので、このあ
たりの作業はいらな
かった。/etc/rc.localに
/etc/rc.d/init.d/stylus start
を書いておいた)。
あとは/etc/X11/xorg.confの"ServerLayout"セクションに
InputDevice "touchscreen" "CorePointer"
を追加、別の場所に
"InputDevice"セクションとして
Section "InputDevice"
Identifier "touchscreen"
Driver "fujitsu"
Option "Device" "/dev/ttyS0"
Option "DeviceName" "touchscreen"
Option "MinX" "82"
Option "MinY" "146"
Option "MaxX" "4036"
Option "MaxY" "3999"
EndSection
を追加してシステムを再起動したら使えるようになりました。
うちの
マシンの場合、MaxXは4006ぐらいが適当だった。個体差?それともWindowsでの調整が生きている??
2. LCD解像度の変更
ついでと言ってはなんですが、こいつはLCD画面が1024x600と変則的ですので、
855resolutionというツールでVIDEO BIOSの設定を書き換える必要がありました。
http://perso.wanadoo.fr/apoirier/
実際のコマンドとしては、こんな感じ…
/usr/local/sbin/855resolution 54 1024 600
このコマンドも/etc/rc.sysinitに書く必要があります。
わしは↑これやってないけど、ちゃんと動いて
いるからまぁいいや。
あとは、/etc/X11/xorg.confの"Screen"セクションにモードを追加するだけです。
Modes "1024x600" "800x600" "640x480"
以上です。
なお、同様の情報は前にももらったことがあったし、御紹介いただいたページも読みに行ってはいたのだが、成功しなかったので報告しなかった。今回自分の
これまでの悪戦苦闘の後をいったん消去して上の通りにやりなおしてみたら成功した。
どうも/etc/X11/xorg.confに余計なことを書いていたんではないかと思う。
とりあえず、なんとかなってよかった。もっとも、最近Linuxを使わずCoLinuxばかり使っていたので、久々に使うととまどうことばかり
(^_^;)。
★ヴォリュームボタン
P8210にはファンクションキーの部分には[Fn]キーと同時押しすることで音声ミュートしたり、トラックポイントのマウス機能を殺したり、画面を明
るくしたり暗くしたり、音量を上げたり下げたりするボタンになるキーが並んでいる。ところが、Linuxからはこのボタンのキーのうち、ミュート、音量上
下、画面の明度上下のボタンが効かない。xevで調べてみると、(たぶん、カーネルにイベントドライバが組み込んでいれば)ミュートと音量上下については
ちゃんとXのキー押しとキー離しのイベントが飛んでくる。というわけで、/etc/X11/xinit/Xmodmap.jpと、
/etc/X11/xinit/Xmodmapに、
keycode 176 = XF86AudioRaiseVolume ←音量アップボタン(aumix -w +10)
keycode 174 = XF86AudioLowerVolume ←音量ダウンボタン(aumix -w -10)
keycode 160 = XF86AudioMute ←ミュートボタン (aumix -w 0)
を追加。これで、例えば音量アップボタンが押されると「XF86AudioRaiseVolumuが押されたよ」とXに連絡が行くようになる。後は、ウィ
ンドウマネージャーの設定(わしの場合、WindowMakerを使っているのでwmakerconf)で、上の最後の括弧にあるコマンドを実行するよう
にショートカットキーを設定する。
ミュートがトグルになってないのが残念だが、ミュート復帰するためには、ミュートする前にどんな音量だったかをどっかに覚えておかないといけないみたい
だ。
残念なのは画面の明暗調整ボタンはevent飛んでこないんだよな。これはどうすればいいのやら。
★Linuxと
Windowsで安全にサスペンドするために
LinuxとWindows両方にサスペンド機能があるわけだが、どっちもファイルをキャッシュしてたりするので、
Linuxでサスペンド→Windowsを起動してファイルをごにょごにょ→Windowsサスペンド&
rarr;Linux復帰
なんてことをやると、悲惨なことになりそうである(つーか、昔なったことがある)。
そうならないためには、Linuxで起動してサスペンドに入った時にはデフォルトでLinuxが起動し、そうでない時はデフォルトでWindowsが起
動するようにしておいた方がよい。そこで、
/etc/rc.localに
/sbin/lilo -D linux
と書いておく。これで、Linuxで起動した時にはLinuxがデフォルトになる。
一方、/etc/rc.d/init.d/haltの最初の方に
/sbin/lilo -D windows
と書いておくと、シャットダウンする時にデフォルトをWindowsにしてくれる。どっちの場合も、プロンプトが出ている時に選べばデフォルト以外を起動
することも可能(当然、/etc/lilo.confにwindowsとlinuxというラベルをもったエントリがあること)。
★無線LAN
我が家の無線LANアクセスポイントではWPA-PSK(TKIP)を使ってます。この状態で無線LANを動かすには、
・madwifiをインストールする。
・wpa_supplicantをインストールする。
の二つが必要らしいです。P8210の無線LANチップはAtherosのもので、これに対応した無線LANソフトがmadwifi。http://snapshots.madwifi.org/か
ら、madwifi-ng-current.tar.gzを取ってきて展開してmake、make
install。これで無線LAN用のモジュールが/lib/module/2.x.x/net/以下に作られます(以下のモジュール)。
ath_hal.ko
wlan.ko
wlan_scan_ap.ko
wlan_wep.ko
ath_pci.ko
wlan_acl.ko wlan_scan_sta.ko wlan_xauth.ko
ath_rate_sample.ko wlan_ccmp.ko wlan_tkip.ko
次にwpa_supplicantのインストール。http://hostap.epitest.fi/wpa_supplicant/に
行ってwpa_supplicantのソースを取ってきます(私はwpa_supplicant-0.4.9.tar.gzを使用)。
これを展開してmakeしますが、make前に.configの
#CFLAGS += -I../madwifi/wpa
の行の#を取って、
CFLAGS +=
-I../madwifi-ng-r1647-20060619/
などのように、
さっきコンパイルしたmadwifiのソースディレクトリを刺すように(取ってきたmadwifiのバージョンによってディレクトリ名は違うはず)書き換
えます。あとはmake, make installでおっけい。
wpa_supplicantのインストールが終わったら、
wpa_passphrase essid
passphrase
とやる(essidとpassphraseはアクセスポイントに設定したものと同じものにする)と、
network={
ssid="essid"
#psk="passphrase"
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
のように出力されます。これをメモって(カット&ペーストでいい)おき、/etc/wpa_supplicant.confに、
network={
scan_ssid=0
proto=WPA
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP
TKIP WEP104 WEP40
ssid="essid"
#psk="passphrase"
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
と書きます(xxxxxの部分にはもちろん、上で出力された内容をコピーする)。
あと、/etc/sysconfig/network-scripts/ifcfg-ath0に、
DEVICE=ath0
BOOTPROTO=none
BROADCAST=192.168.0.255
IPADDR=192.168.0.41
NETMASK=255.255.255.0
NETWORK=192.168.0.0
GATEWAY=192.168.0.1
ONBOOT=no
ESSID="essid"
MODE="Managed"
USERCTL=no
TYPE=Wireless
PEERDNS=yes
CHANNEL=2
WPA=yes
IWPRIV="mode 3"
と書いた(うちではlocalのIPアドレスは固定でやっている。192.168.0.1は外へつながるゲートウェイ)。
これで準備は終わったので、
#!/bin/bash
wpaid=`/sbin/pidof
wpa_supplicant`
until [ -z "$wpaid"
]; do
kill -9
$wpaid
wpaid=`/sbin/pidof
wpa_supplicant`
done
/sbin/modprobe
wlan_wep
/sbin/modprobe ath_pci
/sbin/modprobe
wlan_tkip
/sbin/modprobe
wlan_scan_ap
/sbin/ifdown ath0
/sbin/ifup ath0
COUNTER=6
until [ $COUNTER -lt
0 ]; do
apex=`iwlist
ath0 ap | grep
xx:xx:xx:xx:xx:xx`
if [ -n
"$apex" ];
then
wall
connect to my home
WLAN!!
/usr/local/sbin/wpa_supplicant -Dmadwifi -iath0
-c/etc/wpa_supplicant.conf -B
exit
fi
apex=`iwlist
ath0 ap | grep
XX:XX:XX:XX:XX:XX`
if [ -n
"$apex" ];
then
wall
connect to my labo
WLAN!!
/usr/local/sbin/wpa_supplicant -Dmadwifi -iath0
-c/etc/wpa_supplicant.conf2 -B
exit
fi
let
COUNTER-=1
sleep 10
done
というスクリプトを用意しました。無線LANを使いたい時にこのスクリプトを実行します。まず、
wpaid=`/sbin/pidof
wpa_supplicant`
until [ -z "$wpaid"
]; do
kill -9
$wpaid
wpaid=`/sbin/pidof
wpa_supplicant`
done
の部分で、今動いているwpa_supplicantを(動いている奴全部)殺してます。
/sbin/modprobe
wlan_wep
/sbin/modprobe ath_pci
/sbin/modprobe
wlan_tkip
/sbin/modprobe
wlan_scan_ap
/sbin/ifdown ath0
/sbin/ifup ath0
の部分では必要なモジュールをロードした後、
apex=`iwlist
ath0 ap | grep xx:xx:xx:xx:xx:xx`
if [ -n
"$apex" ];
then
wall
connect to my home
WLAN!!
/usr/local/sbin/wpa_supplicant -Dmadwifi -iath0
-c/etc/wpa_supplicant.conf -B
exit
fi
の部分で、IDがxx:xx:xx:xx:xx:xxなアクセスポイントがあるかどうかを判定し、もしあったらwpa_supplicantを実行しま
す。次の部分では別のIDのアクセスポイントがあるかどうか判定し、存在しているアクセスポイントに対応したconfファイルで
wpa_supplicantを起動するように書いてます。
私はこれを/usr/local/sbin/wlansetupとしてchmod
+xしたものをおいて置いて、無線LANが使いたい時に実行するようにしてます。あるいは、/etc/hibernate/common.confに、
OnResume
20 /usr/local/sbin/wlansetup
と書いておくと、レジュームするなりこれを実行してくれます。なお、レジュームした時に近所にアクセスポイントがないと、探し回る分だけXWindowの
レジュームが遅れますが、そういう時はctl+ALT+F7でXの仮想コンソールに戻ることができます。
サスペンド・レジュームする時は無線LANを一端止めた方がよさそうなので、
/etc/hibernate/hibernate.conf
に、
UnloadAllModules yes
と書いておきます(これでサスペンド時に全てのモジュールをunloadする)。これは、UnloadModules ath_pci
だけでもよかったかも。
これで、無線LANの使える場所(この場合自宅なんですが)にきたら/usr/local/sbin/wlansetupを実行すると無線LANが使え
ます。
★W-ZERO3をモデムとして使う
カーネル2.6.19(どのバージョンからサポートされているのかは調査してないので、これより
古くても大丈夫かも)のmenuconfigで、Device drivers -> USB
support -> USB Serial Converter support -> USB PocketPC
PDA Driver をONにしておいてカーネル構築します。そうしておいて、W-ZERO3の方の設定 -> 接続
-> USB接続 で「モデムとして使う」を選んでおいてから差し込むと、dmesgに
usb
2-1: configuration #1 chosen from 1 choice
ipaq 2-1:1.0: PocketPC PDA converter detected
usb 2-1: PocketPC PDA converter now attached to ttyUSB0
というメッセージが現れます。
これでデバイス名はttyUSB0だとわかったので、kpppのモデムデバイスに/dev/ttyUSB0を設定すればよし。kpppの「モデムの調
査」で調査すると、ちゃんと「RX410IN」と、W-SIMの機種名が返ってきます。
なお、「モデムコマンド」の一番下の「ボリューム オフ/小/大」が「M0L0」「M1L1」「M2L2」のようにL*がついていてたら、外しておきま
しょう。このコマンドのせいでエラーになります。
なお、モデムとして使った後、ZERO3の方の設定を「PCと同期する」の方に戻そうとすると、グレーになって戻せないという現象が発生しましたが
(^_^;)、ソフトウェアリセットしたら戻すことが可能になりました。
★SDカードを使う
これもW-ZERO3を買ったからなんだけど、SDカードがLinuxからも使えると便利だな、と思ったのでやってみました。やはりカーネル
2.6.19のDevice drivers -> MMC/SD Card support ->Secure Digital
Host Controller Interface support をONにしてカーネル構築。
これでSDカードを刺した後、
mount /dev/mmcblk0p1 -t vfat /mnt/SD
とかすると/mnt/SD(このディレクトリは適当に自分で作る)にSDカードがマウントされます。
/etc/fstabに、
/dev/mmcblk0p1
/mnt/SD
vfat defaults,uid=500,gid=5000 0
とか書いておくと、uidが500のユーザ(わしの場合、わし本人)からも読み書き自由になるはず。