DM200を購入する「最後の一押し」となった「DM200 on Linux」をためしてみる。
本家 @ichinomoto さん
Linux on Pomera DM200 人柱版 - EKESETE.net blog
Linux on Pomera DM200 人柱版 その2 - EKESETE.net blog
解説を書かれた moyashi(@hitoriblog)さん
KING JIM ポメラDM200でEmacs、Vim、Ruby、Pythonが動くなんて素敵すぎる! - ひとりぶろぐ
今回記載する内容は、ほぼ、本家とひとりぶろぐさんの両方に書かれている内容のトレース・つまみぐい・いいとこどりなので、あまり詳細に書くつもりはない。そもそも書き切れないし。
また、自分の基本スタンスは「コンソールが使えればOK」と考えているのでX等のGUI環境の設定は行っていない。
お約束
もうお約束すぎてアレだが一応。
この記事を参照にしたことでPOMERAが文鎮化したりSDカードが飛んだとしても一切の責任は負いません。
また、この記事の内容を行ったことでキングジムから修理などのサポートを受けられなくなる可能性があります。
バックアップしたファームウェアのイメージは大切に保管しましょう。
導入
DM200 on Linuxはデュアルブートの形をとる。以下、通常起動した標準の方を「POMERA側」、Debianで起動したOSを「Linux側」と表記する。
先に挙げた3つの記事を参照。というか、導入にあたってちょっとで不安があるなら、ウチのこの記事を即座に閉じて本家とひとりぶろぐさんを読んだほうがいいですマジで。
今回導入したのは「人柱版 その2 (Debian 9.0 (stretch) )」である。(自分はstretch未経験)
◯手順
本家から「DM200 eMMC NAND バックアップ/リストア ツール」および「DM200 Debian インストーラー v0.2」をダウンロード。
- ファームウェアのバックアップ
- ツール付属のreadme.txtを参照。
- 本体データのバックアップ
- インストールイメージをSDカードに展開
- SDカードは16GB
- MacOS上でEtcharを使用(これ、お手軽でいいな。今度からこれ使おう)
- SDカードを挿して、クラムシェルを開けた状態で電源ボタン長押しでシャットダウン。
- [左Alt] + [右Shift] + [電源ボタン]長押しでインストーラが起動。
- (念のため起動後にUSB挿して給電しておく)
今回バックアップにつかったSDカードをそのままインストーラに使いまわした。
LinuxのディスクイメージはSDカード上で完結しているため、構築されたLinux環境をバックアップする場合はSDカードのDDを行うだけでOK。すごくRPi的。
インストール後のコンソール、ログインプロンプトでは「root」か「dm200」ユーザが用意されているのでこれでログインする。
この時点でこのディストリビューションでは
- コンソール上で日本語環境(uim-fep + Mozc)セットアップ済み(Ctrl + SpaceでON/OFF)。
- vim, screenなど一通りのパッケージが導入済み。
- Debianなので当然aptもあるのでなんでもできる。
自分にはXは必要ないから、もうほとんどこのままで使えちゃうじゃないの!
設定
POMERA特有の設定とパッケージの導入。
基本的にrootにはならず、dm200ユーザからsudoを経由して行っているが、これは自分の習慣なので。
○Caps → Ctrl設定
とりあえずこれはやっとかねば。
sudo vi /etc/default/keyboard
「XKBOPTIONS="ctrl:nocaps"」を有効化。
自分はキー配列もPOMERA標準のJISのまま。
○SDカード上のvfatのマウント
WiFi設定のために/mnt/vfatをマウントする。インストールが完了した時点で16GBのSDカードのうち2GBがvfat領域として確保されている。これはPOMERA側からは通常のSDカードとして認識されるため、POMERA側とLinux側の共有領域として使える。16GBからするとかなり少なめに見えるが、基本はテキストファイルとスクリーンショットのBMPぐらいなので2GBあったら十分だろう。必要があればパーティション編集すればいい。
$ sudo mount /mnt/vfat
○WiFi設定
まずWiFiがONになることを確認
$ sudo /opt/bin/wifi-switch on
AP
WiFI設定ファイルはvfat領域の下に格納する。本体側に置くこともできるが、一通り設定し終わるまではvfat領域に置いといて、通常使うアクセスポイントの設定が一通り終わったら、バックアップをとった後本体に移動する予定。
$ sudo vi /mnt/vfat/settings/wpa_supplicant.conf
設定を追加した後、wifi-switch off ⇒ wifi-switch onしてもつながってくれないことがあるので、基本的には自分は毎回リブートしている。
とりあえず自室APとスマフォのティザリング、職場の自分のAPを設定。あと実家に戻った時にAPの設定もしとかないと。
○導入パッケージ
デフォルトで「screen」や「wget」などよく使うコマンドは入っているため、追加したパッケージは本当に少ない。「screen」が使えるなら大体の事はコンソールで収まる。
$ sudo apt-get update
$ sudo apt-get install aptitude
以下、aptitudeを使って導入。
iconvよりnkfが好き*1。w3mあったら、まぁ大体のことは事足りる、的な。
gawk, php, perlなどスクリプト言語などは思いついたときに導入する予定。javaは気が向いたら。
ともかくaptなりaptitudeなりでいつも通りパッケージ導入できるのでここでは深く考えない。
○/mnt/vfatの自動マウント(保留)
/etc/fstabの中身
/dev/mmcblk1p1 /mnt/vfat vfat user,noauto,rw,sync,dirsync,noatime,utf8 0 0
「noauto」を「auto」にすれば自動マウントされるはずと思ったけど、できなかったので戻す。
/dev/mmcblk1p1が認識されるタイミングの問題か。絶対に毎回マウントする必要性は感じないのでとりあえず保留。
○その他細々とした環境
/sbin/reboot をdm200ユーザからキックできるよう権限変更
sudo chmod u+s /sbin/reboot
環境を終了するときは大体POMERA側に戻してしまうので「halt」は不要という判断。別に「sudo shutdown -r now」でもいいんだけど。
PATHを ~/.bashrc
PATH=/sbin:/opt/bin:$PATH
「/opt/bin/wifi-switch」を補完で引っ張りたいがために追加。
そのほか、aliasや.vimrcなど普段使いの設定を追加。思いついたところから順次追加予定。
デュアルブート環境における時刻ズレについて
※詳細解説(moyashi (@hitoriblog)さん)で対処方法が触れられていたのに途中で気が付いたのだけど、せっかくなのでちょっと詳細に書いておくとともに、やめた設定についても後から忘れないように経過を残しておく。
POMERA側を起動して時刻が大幅に狂っていたのに気がついた。
POMERA側で設定した時刻を「13:00」とすると、Linux側での時刻は「22:00 JST」となる。WiFi接続を下地点でLinux側の時刻は「13:00 JST」と設定されるが、この状態でPOMERA側に切り替えると「04:00」になる。その差は9時間で世界標準時(UTC)と日本標準時(JST)差に一致する。
なんどか再起動しなおして試してみたが、どうやらLinux側でWifi接続すると、自動でNTPで時刻合わせをしてしまうため、これが影響しているようだ。
Linuxはタイムゾーンの概念があり、ハードウェアクロックをUTC(世界標準時)としたうえで、設定されたタイムゾーン(日本なので「Asia/Tokyo」)の時差9時間を加えたものをローカル使用する。
しかし、POMERA側にはタイムゾーンの概念が無いらしく、ハードウェアクロックをそのまま現在時刻として使っているようで、Linux側で時刻同期したハードウェアクロックのUTCをそのまま表示してしまう。
同じようなことはMacのBootcampでWindows VistaとデュアルブートでMacOSと使い分けているときに発生していた。VistaがPOMERA側、MacがLinux側だが、PC上でVista・Linuxのデュアルブートでも同じだった。。
OS(この場合POMERA)にタイムゾーンの概念がないっぽいので、POMERA側では、これはもうどうしようもないかと思う。かっちりやるならPOMERA側の改造が必要になりそう。
POMERAで時刻がきっちり合っていないと使えない機能は無いが、時刻を直し忘れるとテキストファイル保存時のタイムスタンプがずれてしまう。自分の使い方ではメインはあくまでPOMERAなので、POMERA側を「メイン」として使いたい。なので、あくまで「サブ」であるLinux側で対処する。
ともかく、この問題は「どっちかが妥協して合わせる」しかない。
○暫定対応(※最終的にこれは取り止め)
Linux側でWiFi接続時に時刻同期されてしまうので、POMERA側で起動したときに毎回時刻合わせをする必要が出てくる。なので、NTP同期自体を停止してしまうことにした。
プロセスリストで「ntp」という名前のプロセスは見つからないが、
/lib/systemd/systemd-timesyncd
というそれっぽいデーモンが起動している。調べるとやはりネットワーク接続時にNTP時刻同期を行うデーモンだった。
参考:Arch Linuxで時刻同期 | NTP, systemd-timesyncd | 普段使いのArch Linux
このデーモンを無効化する。上記サイトで「true」で有効化するとあるので、「false」で無効化のはずだ。
$ sudo timedatectl set-ntp false
プロセスリスト上から「systemd-timesyncd」が落ちていることを確認。再起動してネットワーク接続し時刻が変わらないことを確認。これでネットワーク接続をしても時刻同期されることはなくなった。
さて、Linuxの表示上で+9時間されていしまうのはデフォルトタイムゾーンのAsia/Tokyoを使っている以上どうしようもないが、とりあえず現在時間を見たときに混乱しそうなので、Linux側のタイムゾーンをUTCに変更して見た目だけでもマシになるようお茶を濁す。
$ sudo dpkg-reconfigure tzdata
表示された設定画面で[その他]-[UTC]を選択。
$ date 2017年 7月 29日 土曜日 14:14:30 UTC
「UTC」が出てしまうし、本来の使い方と違ってちょっと気持ち悪いが、まぁ仕方が無い。
(Systemd使い慣れてねぇなぁ)
○暫定対応(こちらのほうがより真っ当なやり方っぽい)
ひとりぶろぐさんの記事に「時刻のズレ解消」の部分があったのに気が付いた(見てなかったw)
NTPでの時刻同期を有効にしたままPOMERA側の時刻もずれないのでこちらの方がいい。
$ sudo dpkg-reconfigure tzdata
表示された設定画面で[アジア]-[東京]を選択。
systemdの「systemd-timesyncd」を復帰させる。
$ sudo timedatectl set-ntp true
これでデフォルトの状態に戻った。
次に以下のコマンドを実行
$ sudo touch /etc/adjtime
$ sudo timedatectl set-local-rtc 1
この状態でリブートしWifiに再接続しても時刻がPOMERA側とずれないことを確認した。
ロケールも「Asia/Tokyo」のままでロケール固有表記も自然なのでやっぱりこちらの方がいい。
「timedatectl set-local-rtc 1」ではハードウェアクロックをローカルタイムとして使う設定っぽい。
(勉強になるな・・・というかまじめにsystemd調べた方がよさげな気がする)
ということで
一通りの設定はこれでOK。
あとは開発環境を整備するもXを設定するもなんなりと、なのだけど、先に書いたようにあくまでDM200は「POMERA」として使うことをメインで考えているのでLinux側は「PC開くのも面倒だけどちょっとコンソール開いて自室のRPiに繋いで確認したい」とか「出先だけど急ぎでsshで繋ぐ必要がある」みたいな用途で使うつもり。
だが、これが非常にお手軽でいい感じ。必要があればapt(aptitude)でどんどん追加してしまえるのも気楽。
それに、コンソールをDM200のしっかりしたキーボードで打てるのは結構気持ちいい。空き時間に「頭の体操がてらスクリプト書く」的なことができるので、それこそPOMERA感覚でできそうで夢が広がる。結構ちゃんとしたコーディングもできてしまいそうだ。
ちなみに、この記事の下書きはやはりPOMERAで打ち込んで、必要な時だけLinux側と行ったり来たりしながら書いた。面倒かと思っていたが起動が速いので案外なんとかなるもんだな。というかどんどんPC使わない生活が進む・・・。
謝辞
「DM200 on Linux」を整備された@ichinomoto さん、解説をまとめられたmoyashi(@hitoriblog) さんに感謝!