月別アーカイブ: 2017年9月

GPD Pocket

Cloud Funding の “Indiegogo” で募集され 3,182,160 USD も集めた “GPD Pocket” ですが、やはり気になる機種ということで出資してたところ、無事出荷され入手できました。

Ubuntu 版は同価格ながら Windows ライセンスが付属しないのであまり選択する旨味はないのですが、BIOS update と OS の自力入れ替えが必要でハマると文鎮ループのリスクも考えられるので、敢えてこちらを選択したのでした。

想像以上に高級感のあるパッケージです。

同梱物は本体、説明書、USB type-C – ACアダプタ、USB type-C ケーブル、イヤフォンで全てです。初期ロットのみですが液晶保護フィルムが付いてきました。さらにオプションの Hub 付きを選択していると別途付属されます(後述)。

99% 充電された状態だったので早速電源ボタン長押しで起動。GPD のロゴの後、Linux の console が表示され、Ubuntu の初期画面になります。例によってキーボード・言語・タイムゾーン・ユーザアカウントなどを設定して処理が終わるのを待ちます。

そして起動した画面は…なんと縦画面。これは LCD デバイスが7インチタブレットに供給されたモデルを調達したらこうなりますね。確かに 7インチ横画面の需要は皆無なのはまぁ仕方ないところ。思考を 90度回転しつつ[Setting]>[Display] を開いて “Rotation” を “Clockwise” に設定してようやくまともな画面に。

起動して気になるのはファン音。静かにしてるとこの筐体からの音が気になります。CPU は Atom 第4世代の x7-Z8750 1.59GHz、Atom とはいえかなり高パフォーマンスなため強制空冷が必要なレベルということでしょう。CPU  governor は powersave なので、OS 制御にかかわらず常時回ってそうです。

RAM は LowPower DDR3-1600 8GB、Storage は eMMC 128GB とこのクラスで使うには十分です。

キーボードはなかなかの変態配列です。記号が上と下の列に飛ばされてたり、Tab・Caps・BS が狭いのは後々厳しそうな予感がします。トラックポイントは Space を分断して確保するという面白い配置です。

外部インタフェースは USB type-C、micro HDMI、イヤフォンジャック、USB 3.0(type-B) とシンプルです。USB type-C は所有端末では初搭載なので規格についてはこれから要調査ですが、「USB Power Delivery (PD)」と「DisplayPort Alternate mode」に対応しているとのことです。USB の横に DisplayPort のロゴが見えます。

USB Power Delivery とは、従来以上の電力を給電する規格で、機器間のnegotiation が行われるので、対応する AC アダプタやケーブルが必要になります。一部では仕様と異なる情報を出すアダプタがあるようなので、付属品以外の物を使う場合には注意が必要です。

DisplayPort Alternate mode とは USB type-C で DisplayPort 信号を通す規格で、対応機器に接続すれば USB type-C だけで映像出力が可能になります。

説明書は中文・英語・日本語の各部名称・仕様諸元・内容物・保証書の記載のみです。よく見ると 4K と書いてますが、LCD の解像度は 1920×1200 です(Webでの Spec Sheet は合ってる)。

Contribution は「GPD Pocket Ubuntu+Type-C Hub」だったのですが、Hub なしとの差が 10 USD なのでまともな Hub は期待してなかったのですが、まさかの type-C 対応 SD カードリーダでした。まぁこれはネタということで。

これまで薄い PC は発売されてきたものの、このサイズの PC は使いにくさやトラブルが付き物で一般ウケしないこともあってメーカーからは絶版状態だったのですが、Libretto に始まり VAIO type P 以来の久しぶりの mini PC 導入ということでいろいろ使い込んでいきたいと思います。

参考: Indiegogo: GPD Pocket: 7.0′ UMPC-Laptop ‘Ubuntu or WIN 10 OS’

[Linux] kernel version string

Linux kernel の version 表記がどのようにして生成されているのかよく分からなかったので調べてみました。

kernel version の文字列

kernel version は major version, patchlevel, sublevel (開発バージョンはさらに extraversion) から成り、それぞれ linux/Makefile に記載されています。”make kernelversion” でそれらを表示します。

$ head -5 Makefile
VERSION = 4
PATCHLEVEL = 13
SUBLEVEL = 0
EXTRAVERSION = -rc7
NAME = Fearless Coyote
$ make kernelversion
4.13.0-rc7

kernel release version の文字列はどうやって決まる?

release version は kernel version に加えてビルド時のリポジトリ情報を追加したもので、 “make releaseversion” で表示します。config 情報を使うので、先に config を実行しておく必要があります。

$ make ARCH=arm64 defconfig
$ make ARCH=arm64 kernelrelease
4.13.0-rc7-01000-gXXXXXXX-dirty

これは linux/scripts/setlocalversion の実行結果で、config の内容とリポジトリの情報を反映しています。影響する config は CONFIG_LOCALVERSION_AUTO と CONFIG_LOCALVERSION です。

CONFIG_LOCALVERSION_AUTO によって大きく動作が異なるため、それぞれについて説明します。”make menuconfig” では以下で設定します。

"General setup   --->
  [*] Automatically append version information to the version string
CONFIG_LOCALVERSION_AUTO=y の場合

次の文字列を連結したものが localversion 文字列になります。

  • linux/localversion* のファイルがあればその文字列
  • CONFIG_LOCALVERSION で定義された文字列
  • 環境変数 LOCALVERSION で定義された文字列
  • リポジトリ情報
  • ローカル変更があった場合の “-dirty”

linux/localversion* ファイルは自分で作成したものです。ファイル名は linux/localversion-hoge でも何でもよいですが、ワイルドカードの評価順に文字列が続きます。

$ cat localversion
-localv1.0
$ cat localversion-foo
-FOO
$ cat localversion-bar
-BAR
$ cat localversion-hoge
-HOGE
$ make ARCH=arm64 kernelrelease
4.13.0-rc7-localv1.0-BAR-FOO-HOGE-01000-gXXXXXXX-dirty

CONFIG_LOCALVERSION は .config で定義される文字列です。”make menuconfig” では以下で設定します。

"General setup   --->
  () Local version - append to kernel release

環境変数 LOCALVERSION は make 実行時に定義されていたものが有効になります。

$ LOCALVERSION=-TMP make ARCH=arm64 kernelrelease
4.13.0-rc7-TMP-01000-gXXXXXXX-dirty

リポジトリ情報は、”git describe –dirty” の結果が適用されます。

annotated tag の付いた commit (通常 kernel version の更新ポイント) から commit の適用数(5桁)と、現在の commit ID が文字列となります。

“-01000-gXXXXXXX” の場合、kernel version から 1000 個の commit が適用され、現在 commit ID が XXXXXXX のリポジトリを使っていることになります。

ソースは変更されているがリポジトリに反映されていない場合、最後に “-dirty” が付きます。

これらを全部適用すると以下のようになります(長い…)。

$ grep LOCALVERSION .config
CONFIG_LOCALVERSION="-TEST"
CONFIG_LOCALVERSION_AUTO=y
$ cat localversion
-localv1.0
$ cat localversion-foo
-FOO
$ cat localversion-bar
-BAR
$ cat localversion-hoge
-HOGE
$ LOCALVERSION=-TMP make ARCH=arm64 kernelrelease
4.13.0-rc7-localv1.0-BAR-FOO-HOGE-TEST-TMP-01000-gXXXXXXX-dirty

linux/scripts/setlocalversion を都度適用する代わりに、予め linux/scripts/setlocalversion  の結果を保存した文字列を適用することもできます。
以下を実行すると linux/.scmversion に保存され、この文字列が常に適用されます。

$ ./script/setlocalversion --save-scmversion .
CONFIG_LOCALVERSION_AUTO is not set の場合

次の文字列を連結したものが localversion 文字列になります。上の3つは “CONFIG_LOCALVERSION=y” と同じです。

  • linux/localversion* のファイルがあればその文字列
  • CONFIG_LOCALVERSION で定義された文字列
  • 環境変数 LOCALVERSION で定義された文字列
  • (LOCALVERSION がない場合) リポジトリ更新を示す “+”

環境変数 LOCALVERSION が定義されていなければ、リポジトリが kernel version から更新されているかを示す “+” が付きます。

環境変数 LOCALVERSION が定義されていればその文字列だけが付きます。LOCALVERSION を空定義すると何も付かないことになります。

$ make ARCH=arm64 kernelrelease
4.13.0-rc7+
$ LOCALVERSION=-TMP make ARCH=arm64 kernelrelease
4.13.0-rc7-TMP
$ LOCALVERSION= make ARCH=arm64 kernelrelease
4.13.0-rc7

release version と kernel module

kernel module は install directory に release version が付く(/lib/modules/<release-version>) ため、気づかないうちに version 文字列が変わっててトラブルの原因になることがあります。そのため、module 開発者はどの文字列が kernel の何の設定で付与されているのかを正しく理解しておく必要があります。