最近はやりの低価格省スペースPC、スティックPCをUbuntu化する話。
Intel ComputeStickとかが定番で、国内では1万円付近でドスパラのDiginosStickが買えるのでそれをUbuntu化した。
基本知識。
CPUは大抵Atom Z3700シリーズで、主記憶1~2GB、メインストレージはeMMCで16~64GB、8インチWindowsタブレット端末からディスプレイとセンサー、バッテリー周りを取っ払ってHDMIに直挿し出来るようにした端末。 タブレットレベルなのでファンレスか、極低速ファンが付いているだけ。
省エネ省スペース低価格を実現している一方で、普通のPCとはちょいちょい違ってハードルが高い。
まず、BIOSモードは付いていない物が多い。 UEFI限定、その上、32bitUEFI限定(BIOS互換モード無し) UEFIのPCでも昔のOSが起動するけど、あれはUEFIのBIOS互換モジュールで動作しているだけなので、それが無いこのマシンでは大抵のレガシーなOSがブートできない。
ストレージが一般的なsdじゃなく、mmcblkデバイスになっていて、組み込みLinux的な部分もある。 インストール出来るOSはWindows8/10の32bitと、一手間加えたLinux位の物である。
この端末にLinuxを入れる場合、一番簡単なのはFedelet(Fedora + tablet)で検索すると出てくる、Fedoraをカスタムしたイメージ。 こいつなら特に手間を加えること無く導入できる。
しかし、管理の都合でUbuntuが利用したいので今回はUbuntu 14.04.03LTSを導入した。
Server版をインストールしたいところだが、ネットワークインタフェイス周りに難があり、Server版はインストールの難易度が異常に高い(Server版の導入は、USBスティックから導入する場合、ネットワーク接続が有効じゃ無いと途中で止まってしまうのだが、こいつはUSBしかNICを入れる場所が無いのでお金がかかる上にかなり面倒) Desktop版であれば割と素直に導入できる(ネットワーク接続無し導入可能、その上Serverでは認識しないCDC Etherデバイスが認識される)ため、今回はデスクトップ版で導入してX周りを無効化するという手順で基本導入を実施した。
材料
・Diginnos Stick DG-STK1B
・セルフパワー USBハブ
・USB NIC PLANEX USB-LAN100R
・LittleFAN40U
・USBメモリ 2GB以上
・USBキーボード
・USBマウス
初期作業。
Ubuntuをダウンロードする。 必ず64bit(amd64)をダウンロードする。 主記憶容量として2GBなので32bitの方が適切に思えるが、EFIブート機構が64bit版じゃ無いと動かない。
bootia32.efi(32bitEFI用のローダー)を作成するか入手する。 今回はこちらから頂いた。
インストール用USBメモリを作成する。 Windows環境なら、UUIを利用。
ダウンロードしたファイルを実行し、ディストリビューション選択でUbuntuを選び、ダウンロードしたISOを選択し、USBメモリのドライブを選んで実行。
完了したら、USBメモリの/BOOT/EFI/に、bootia32.efiを投げ込む。
これでとりあえず準備完了、次にDiginosの方を準備する。
ディスプレイ接続など一般の初期作業は全部完了済みとする。
Diginosにバスパワーでデバイスを接続するとインストールに転けることがあるので、必ずバスパワーハブを接続して給電した状態で行う。 ハブに、USBメモリ・キーボード・マウス・NICを接続する。
Secure bootを無効化する。 キーボードのDELキーを押しっぱなしで電源ボタンを押してEFIの管理画面に入り、SecurityのSecure bootをDisableにする。 併せてBootの優先順位でUSBメモリの順位を上げておく。
ついでにCPUメニューにある電源管理をEnergy EfficiencyからCustomに切り替えてTurboboostを有効化しておくと動作クロックが一気に上がって幸せになれるが、この場合は材料一覧にあるファンのような物を取り付けておかないとサーマルスロット動作で結局すぐ遅くなるのでほぼ無意味。 設定が済んだらSave&Exit
Grubメニューが出ればココまでの手順は成功。 出なければ何かが間違っているのでやり直す。
GrubメニューでInstallを選択。 Thinkのトラックポイントキーボードだと操作できなかった(キーボードとマウスが独立したデバイスが必要)
UbuntuGUIが起動するまで待つ。 USBハブがパスパワーの場合など、途中で止まることがあるので数分動かなかったらおとなしくセルフパワーハブを買いに行こう;(これで数時間はまった)
UbuntuGUIが起動すれば普通にインストールしていくのだが、途中で/dev/mmcblk0rpmbのアクセスエラーと言う警告が出ることがある。 この領域は普通のIO手段でアクセスできない領域だが、書き換える必要は無いのでIgnoreで飛ばす。 領域の設定をカスタムで行うとインストールに失敗することがある。 ダメならとりあえずUbuntu任せにパーティショニングして導入後に何とかしよう。
導入が完了した後、Grubを書き換える必要がある。 最新のリポジトリではパッケージで提供されているため、インストール時にネットワークから最新リポジトリを選択して、grub-efi-ia32パッケージを入れられれば入れる(内蔵の無線LANは動作しないので、材料に書いてあるUSB NICを入れておくと便利。 こいつは標準のCDC_Etherで動作するデバイスなのでUSB NICの中では一番使いやすい系統)
インストール時にgrubパッケージを入れられなかった場合は、インストール完了後の再起動時に再度USBメモリから起動してGrubメニューでコマンドラインに入り(メニューでc)、インストールしたUbuntuをロードしてやった上でgrub-efi-ia32を導入する。
ロードパラメータはUbuntu任せにパーティショニングした場合
1 2 |
linux (hd1,gpt2)/boot/vmlinuz~ root=/dev/mmcblk0p2 reboot=pci,force initrd (hd1,gpt2)/boot/initrd~ |
※~部分は導入した物により異なるので、前部分を打ち込んでTabキーで保管させるのが手っ取り早い
パラメータを設定したらboot
無事に内蔵ストレージからUbuntu GUIが立ち上がったら、Terminalを出して、
1 2 |
sudo apt-get update sudo apt-get install grub-efi-ia32 |
を実行してシャットダウン。
USBメモリを外して再起動してUbuntuが無事に立ち上がればOK。
最後にサーバ利用のためにXを止める場合は、/etc/default/grubを編集して、GRUB_CMDLINE_LINUX_DEFAULTの項目にtextを追加してやって、grub-set-default を実行して再起動してやればXが無い状態で起動してくる。
デフォルトで占有メモリ200MB程度で空きが1.7GBくらいあり、/パーティションも22GBくらい開いているのでBBBやRPi2サーバよりは遙かに快適、ML110G7には遠く及ばない程度の使用感になる。
内蔵のMicroSDスロットについては、起動時にSDカードを挿しておけば、/dev/mmcblk1デバイスとして認識するため、sambaを入れてちょっとしたファイル置き場などとして使うとか、バックアップ用に使うことも出来る。
PLANEXのUSB NICについては、GbE対応版の1000RもCDCデバイスなので、そちらを複数挿してやればそこそこ性能のルータにすることも出来るし、色々遊べるだろう。
追加
・起動時にEFIシェルが表示される場合(黄色文字が所々あるシェル)
>EFIブートの登録がうまくいっていない。
EFIシェルで
1 2 |
fs0: EFI\ubuntu\grubia32.efi |
を実行すればとりあえずGrubメニューまで行けるはず。 このファイルが無いとか言われる場合は、grub-efi-ia32の導入に失敗しているので、インストール時にGrubパッケージを入れられなかった場合の手順を実行する。
この手順で起動できた場合は、EFIにブート情報を登録すれば次回からは自動起動できるようになる。
登録するにはUbuntu上で
1 |
efibootmgr -c -g -d /dev/mmcblk0 -p 1 -L "Ubuntu 14.04LTS efi32" -w -l \\EFI\\ubuntu\\grubia32.efi |
を実行する。
-c:BOOT情報の作成
-g:DISK情報を強制的にGPTに
-d:ブートデバイス
-p:パーティション番号(このパーティション番号は、EFIファイルが入っている領域のパーティション番号であって、Linux本体パーティションではない)
-L:ラベル設定
-w:署名書き込み
-l:ローダーのパス(デバイス:パーティション上のパスで、EFIではDOSタイプのパス形式なので/ではなく\を使う。 コマンドラインで\がエスケープされるから二重\\)
このコマンドを実行するとEFI管理画面BOOTタブのBOOT一覧にUbuntu 14.04LTS efi32が登録されて自動起動できるようになる。
・動作中に応答停止する:dmesgを取っている場合 mmcblk0 の-110エラーが記録される。
>eMMCの高速モードで異常が発生している。
ハードウェア・ファームウェア上のエラーなのか、Linuxの実装上のエラーなのかわからないが、Windows上ではエラーにならないので相性。
EFI>Advanced>LPSS>eMMC DDR50/HS200を無効化すると改善する。
それでもダメなら、カーネルパラメータにintel_idle.max_cstate = 0を設定する(CPUのCステート切り替わり時に不安定になる)
UnixBenchを取ってみた
5.1.3の4コアモード、左がPi2のリザルト、右がDiginosのリザルト、右端はDiginosをPi2で割った値。
全項目で2倍以上、項目によっては3倍を超えて全体で2.83倍と言うことで快適度は桁違い。
Pi2 | Stick | Pi2:Stick | |
Dhrystone 2 using register variables |
11802735.6 | 31554190.6 | 2.67 |
Double-Precision Whetstone |
1988.5 | 5351.2 | 2.69 |
Execl Throughput |
1359.5 | 4435.9 | 3.26 |
File Copy 1024 bufsize 2000 maxblocks |
115667.5 | 320332.9 | 2.77 |
File Copy 256 bufsize 500 maxblocks |
32669 | 86472.9 | 2.65 |
File Copy 4096 bufsize 8000 maxblocks |
313050.3 | 910785.4 | 2.91 |
Pipe Throughput |
698307.4 | 2217670.5 | 3.18 |
Pipe-based Context Switching |
122975.8 | 275185.9 | 2.24 |
Process Creation |
2890.8 | 9634.7 | 3.33 |
Shell Scripts (1 concurrent) |
2536.4 | 7885.2 | 3.11 |
Shell Scripts (8 concurrent) |
333.3 | 1069 | 3.21 |
System Call Overhead |
1579952.2 | 3515266.5 | 2.22 |
438 | 1239.2 | 2.83 |
※Windows10に戻す場合
普通にWindows10 32bitのUSBメモリを挿して電源ON、UEFIの設定画面でBOOTオーダーをUSBメモリ優先にしてやれば何も気にせず導入できます。
ドライバ類については、基本ドライバはComputeStickの物を導入、WLANやBTについてはChuwi Hi8の物を入れてやれば動きました。
ACPI\BCM27E4にBluetooth、02D0\A9A6\FN_1にWiFi SDIO、02D0\A9A6\FN_2にbcfn2を当ててやればOK
(9755)