2015年01月25日

[Yocto] Sato Mobile Desktopの日本語表示化 (1)

前記事では、Yocto LinuxのSato Mobile Desktop GUI環境へMidoriブラウザを組み込む方法について紹介しました。いまや一般用途向けの機器では、Webブラウザは必須のアプリケーションだと言えます。カラオケ端末機みたいな一般ユーザに操作してもらうことが前提の機器はハードの中身がPC互換機になっていて、DebianやUbuntuのようなPC向けのLinuxディストリビューションをカスタマイズして利用しているケースが結構あります。Webブラウザを組み込むことができるのなら、このような機器でYocto Linuxを利用してシステムを構築する道が拓けてくるんじゃないでしょうか。PC向けのLinuxディストリビューションと比較すると、組込みLinuxのメモリやディスク容量などのシステム動作条件はずっと低くなり、x86 PC互換機以外のARM、MIPS、PowerPCなどを搭載したハードを使って一般ユーザが操作する機器やコンシューマ向けの機器を開発することができます。いまさら言うまでもありませんが、実際にこのような機器では組込みLinuxが広く使われています。

ここ数年でSoCプロセッサの製造単価はさらに下がっていて、アマチュアの電子工作愛好家でさえ高性能なプロセッサを安価に入手できるようになっています。IntelもPCやタブレット用だけでになく組込み向けプロセッサの種類を増やしています。そのため、従来はマイコンを使っていたローエンド機器でも高性能なx86やARMコア・プロセッサへの切り換えがどんどん進んでいます。世の中ではIoT(Internet of Things)いうトレンド・ワードが持て囃されていますが、Rasberry PiやBeagleBone BlackようなLinuxやAndroidが動くボードが3〜8千円で買える時代なのに(これらの製造単価は販売価格の2/3〜4/5程度ではないかと想像できます)、マイコンやITRONを使ってIoTデバイスを開発するのはナンセンスだと思います。単機能なセンサやビーコン・デバイスならマイコンを使うのも有りだと思いますが、複合機能が要求されるIoTデバイスではLinuxを使わないと開発工数が大きくなってしまいます。IoTデバイスのデファクト・スタンダードOSはLinuxであると言い切っても良いんじゃないでしょうか。ITRONの基本構成要素はカーネルだけであり、TCP/IPプロトコル・スタックはユーザーが移植する必要があります。ファイルシステムやその他のミドルウェアもすべて同様です。LinuxならOSの移植が完了した時点でこれらがすべて揃っていて、市販のボードならメーカーが移植済みのLinuxやAndroidのBSPを必ず配布しています(LinuxやAndroidを移植しないと、ボードが売れないからですが)。アプリを開発するにしても、ITRONのシステムコールは美的センスの欠片もなく変梃りんで、C++やJavaなどのオブジェクト指向言語からITの世界に入ったプログラマとっては「なんじゃこりゃぁあ!」と叫びたくなるような世界です。Linuxならグローバル・スタンダードであるUnixの流儀でアプリを開発することができ、豊富なライブラリや上質のサンプルコードがインターネット経由でたくさん手に入ります。いま流行りのJavaScriptを使えば、アプリ開発の工数はさらに小さくなります。LinuxとITRONを比較すると、天と地ほどの差があることは一目瞭然です。私は5年前までITRON関連の開発に係わっていましたが、ここ3年ほど新規の製品開発プロジェクトでITRONが採用された例を聞いたことがありません。ローエンド組込みの世界から離脱して情報収集をしなくなったからかもしれませんが、ITRONが衰退に向かっていることには確信を持っています。

またしても話が大きく逸れてしまいました。IoTについては色々と思う所があるので別の記事でまた書きたいと思っています。話題をYocto Linuxの技術的な情報に戻します。

さて、いままでの記事にSato Mobile Desktop GUIのスクリーンショットを掲載してきましたが、それらには日本語が表示されているものが一つも存在していないことに気づいた方がいるんじゃないでしょうか。じつは、デフォルト状態のSato GUI環境は日本語表示に対応していません。日本語のフォントとロケール情報の両方がcore-image-satoイメージに組み込まれていないからです。このため、Desktopウィンドウを含むすべてのアプリにおいて日本語を表示することができません。例えば、Midoriによって日本語を含むページを開くと、下のように日本語の文字がすべて文字化けした状態で表示されてしまいます(こういう□だらけの表示を「トウフ状態表示」と呼ぶらしいです)。
UBShot_20150125_185320-Adding_TTF-Yocto_Sato_Desktop-QEMUx86_64-1026x797
Yocto Linuxを使い始めた当初から日本語に対応していないことには気づいていて、その対応方法をずっと探していました。やっとSato GUI環境の日本語化に成功したので、その成果を記事として公開します。ただし、本記事に書く内容は、Sato GUI環境を日本語表示に対応させる方法だけです。日本語入力の方はまだ組み込みに成功していません。じつは、本記事の結論に到達するのに試行錯誤を数回繰り返しているのですが、結論だけを読むと、Sato GUI環境の日本語表示への対応は容易に実現できることが判ります。これと比較して、日本語入力の方は結構難易度が高そうな感じです。日本語入力機能の実現方法についても調べいるのですが、まだ具体的な作業は行っていません。そのため、Sato GUI環境へ日本語入力機能を追加する方法について記事を投稿できるのは少し先になりそうです。

■ TrueTypeフォントの追加組込み


まずは、Sato GUI環境へTrueTypeフォントを追加する方法から紹介します。

じつは、Yocto Linuxの配布パッケージには以下の2種類のTrueTypeフォントしか収納されていません。
    liberation-fonts
ttf-bitstream-vera

このうち、デフォルト状態のSato GUI環境に組み込まれているのはliberation-fontsだけです。DesktopウィンドウのAppearanceアイコンを開くと、Sato GUIで利用可能なTrueTypeフォントの種類を確認できます。
UBShot_20150125_184746-Adding_TTF-Yocto_Sato_Desktop-QEMUx86_64-1026x797
UBShot_20150125_184811-Adding_TTF-Yocto_Sato_Desktop-QEMUx86_64-1026x797
上記の2つはいずれも英語文字のタイプフェースしか含まれていないフォントです。Midoriブラウザで日本語のページが文字化けしてしまう原因は、日本語のTrueTypeフォントがシステム上に存在していないからです。

それでは、Yocto Linuxで利用可能な日本語のTrueTypeフォントはどこに在るのかと言うと、じつは、OpenEmbeddedリポジトリの方に存在しています。OpenEmbeddedリポジトリに以下のTrueTypeフォントが収集されており、同リポジトリからパッケージレシピを取得すると、これらのフォントが利用できるようになります。
    ttf-arphic-uming
ttf-dejavu
ttf-droid
ttf-gentium
ttf-hunky
ttf-inconsolata
ttf-liberation
ttf-mplus
ttf-sazanami
ttf-ubuntu-font-family
ttf-wqy-zenhei

上のうち、ttf-droid, ttf-mplus, ttf-sazanamiの3つのフォントが日本語文字のタイプフェースを含んでいます。これらのフォントのいずれかをシステムへ組み込めば、Sato GUI環境で日本語の文字を表示できるようになります。以降に、その具体的な方法を説明していきます。

最初に、OpenEmbeddedリポジトリのパッケージレシピを利用可能にするために、bblayers.confに下ような変更を加えてください。
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "6"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-yocto \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-yocto-bsp \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-openembedded/meta-oe \
"
BBLAYERS_NON_REMOVABLE ?= " \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-yocto \
"

これは、OpenEmbeddedリポジトリから取得したパッケージレシピ群が~/Yocto/poky-daisy-11.0.2/meta-openembedded/に格納されていることを前提としています。

そして、さらにlocal.confへ以下のような設定定義を追加すると、ttf-bitstream-veraに加えてOpenEmbeddedリポジトリの全TrueTypeフォントをcore-sato-imageイメージへ組み込むことができます(フォントは必要に応じて選択すれば良いのですが、今回はあえて全部のフォントを組み込んでみました)。
#
# TrueType fonts to be installed to images
#
IMAGE_TTF_FONTS = "\
ttf-bitstream-vera \
ttf-arphic-uming \
ttf-dejavu-sans ttf-dejavu-sans-mono ttf-dejavu-sans-condensed ttf-dejavu-serif ttf-dejavu-serif-condensed ttf-dejavu-common \
ttf-droid-sans ttf-droid-sans-mono ttf-droid-sans-fallback ttf-droid-sans-japanese ttf-droid-serif \
ttf-gentium ttf-gentium-alt \
ttf-hunky-sans ttf-hunky-serif \
ttf-inconsolata \
ttf-liberation-mono ttf-liberation-sans ttf-liberation-serif \
ttf-mplus-1c-black ttf-mplus-1c-bold ttf-mplus-1c-heavy ttf-mplus-1c-light ttf-mplus-1c-medium ttf-mplus-1c-regular ttf-mplus-1c-thin \
ttf-mplus-1m-bold ttf-mplus-1m-light ttf-mplus-1m-medium ttf-mplus-1m-regular ttf-mplus-1m-thin \
ttf-mplus-1mn-bold ttf-mplus-1mn-light ttf-mplus-1mn-medium ttf-mplus-1mn-regular ttf-mplus-1mn-thin \
ttf-mplus-1p-black ttf-mplus-1p-bold ttf-mplus-1p-heavy ttf-mplus-1p-light ttf-mplus-1p-medium ttf-mplus-1p-regular ttf-mplus-1p-thin \
ttf-mplus-2c-black ttf-mplus-2c-bold ttf-mplus-2c-heavy ttf-mplus-2c-light ttf-mplus-2c-medium ttf-mplus-2c-regular ttf-mplus-2c-thin \
ttf-mplus-2m-bold ttf-mplus-2m-light ttf-mplus-2m-medium ttf-mplus-2m-regular ttf-mplus-2m-thin \
ttf-mplus-2p-black ttf-mplus-2p-bold ttf-mplus-2p-heavy ttf-mplus-2p-light ttf-mplus-2p-medium ttf-mplus-2p-regular ttf-mplus-2p-thin \
ttf-sazanami-gothic ttf-sazanami-mincho \
ttf-ubuntu-mono ttf-ubuntu-sans \
ttf-wqy-zenhei"

#
# Additional packages to be installed to the specific images
#
IMAGE_INSTALL_append_pn-core-image-sato = " \
${IMAGE_TTF_FONTS}"

ただし、このまま「bitbake core-image-sato」コマンドを実行すると、ttf-mplusのビルド時にエラーに遭遇します。これはttf-mplusのレシピの記述内容が不完全なために起きているエラーです。このエラーを解決するには、ttf-mplusのレシピに以下のような改造を加える必要があります。
require ttf.inc

SUMMARY = "MPlus font - TTF Edition"
HOMEPAGE = "http://dejavu.sourceforge.net/wiki/"
LICENSE = "${PN}"
LIC_FILES_CHKSUM = "file://LICENSE_E;md5=ac161e96eda00db9a3aec7870b5d9658 \
file://LICENSE_J;md5=a120ca8d7c8e4a475d5277c9aeb95221 \
"
PR = "r4"

SRC_URI = "http://osdn.dl.sourceforge.jp/mplus-fonts/6650/mplus-TESTFLIGHT-${PV}.tar.gz"
S = "${WORKDIR}/mplus-TESTFLIGHT-${PV}"

PACKAGESPLITFUNCS_prepend = "split_ttf_mplus_packages "

python split_ttf_mplus_packages() {
plugindir = d.expand('${datadir}/fonts/ttf-mplus/')
packages = do_split_packages(d, plugindir, '^(.*)\.ttf$', 'ttf-%s', 'TTF Font %s')
d.setVar('FONT_PACKAGES', ' '.join(packages))
}

do_install() {
install -d ${D}${datadir}/fonts/ttf-mplus
install -m 0644 *.ttf ${D}${datadir}/fonts/ttf-mplus/
}

SRC_URI[md5sum] = "d1400184b51b3871e8d2fca6c50e18ae"
SRC_URI[sha256sum] = "a20b9b9b03c2a6fb1e2137d29e8a6ce06406ba1e008906ea3c474dc048dc06a6"

TTF_FONTS = "\
ttf-mplus-1c-black ttf-mplus-1c-bold ttf-mplus-1c-heavy ttf-mplus-1c-light ttf-mplus-1c-medium ttf-mplus-1c-regular ttf-mplus-1c-thin \
ttf-mplus-1m-bold ttf-mplus-1m-light ttf-mplus-1m-medium ttf-mplus-1m-regular ttf-mplus-1m-thin \
ttf-mplus-1mn-bold ttf-mplus-1mn-light ttf-mplus-1mn-medium ttf-mplus-1mn-regular ttf-mplus-1mn-thin \
ttf-mplus-1p-black ttf-mplus-1p-bold ttf-mplus-1p-heavy ttf-mplus-1p-light ttf-mplus-1p-medium ttf-mplus-1p-regular ttf-mplus-1p-thin \
ttf-mplus-2c-black ttf-mplus-2c-bold ttf-mplus-2c-heavy ttf-mplus-2c-light ttf-mplus-2c-medium ttf-mplus-2c-regular ttf-mplus-2c-thin \
ttf-mplus-2m-bold ttf-mplus-2m-light ttf-mplus-2m-medium ttf-mplus-2m-regular ttf-mplus-2m-thin \
ttf-mplus-2p-black ttf-mplus-2p-bold ttf-mplus-2p-heavy ttf-mplus-2p-light ttf-mplus-2p-medium ttf-mplus-2p-regular ttf-mplus-2p-thin"

PACKAGES = "ttf-mplus ${TTF_FONTS}"

ALLOW_EMPTY_ttf-mplus = "1"

ここまでの変更が終わったら、あとは「bitbake core-image-sato」コマンドを実行すれば、上記の全TrueTypeフォントを追加したcore-image-satoイメージを生成できます。

このcore-image-satoイメージを起動すると、下のように、Sato GUIのDesktopウィンドウの表示フォントが変化していることに気づくでしょう(上に掲載したTrueTypeフォントを追加する前のDesktopウィンドウのスクリーンショットと比較してください)。
UBShot_20150125_230128-Adding_TTF-Yocto_Sato_Desktop-QEMUx86_64-1026x797
そして、Midoriを起動して日本語を含むページを開くと、日本語の文字が正常に表示されることが確認できるはずです。
UBShot_20150126_000156-Adding_TTF-Yocto_Sato_Desktop-QEMUx86_64-1026x797
なお、他のWebブラウザと同様に、Midoriでもデフォルトの表示フォントや文字エンコーディングを変更することができます。これらの設定を変更したい場合は、Midoriのページ・ウィンドウの右上の一番端に存在するToolsアイコンをクリックして[Preferences]というメニューを選択してください。
UBShot_20150126_000214-Adding_TTF-Yocto_Sato_Desktop-QEMUx86_64-1026x797
開いたウィンドウの[Fonts]タブを選ぶと、下のようなウィンドウに変わります。
UBShot_20150126_000237-Adding_TTF-Yocto_Sato_Desktop-QEMUx86_64-1026x797
Midoriのデフォルトの表示フォントと文字エンコーディングはこのウィンドウ内の項目を変更することで設定できます。同ウィンドウ内の[Proportional Font Family][Fixed-witdh Font Family]プルダウンメニューをクリックすると、選択可能なフォントの種類が増えていることが確認できます。
UBShot_20150126_000356-Adding_TTF-Yocto_Sato_Desktop-QEMUx86_64-1026x797
UBShot_20150126_000416-Adding_TTF-Yocto_Sato_Desktop-QEMUx86_64-1026x797
上側のスクリーンショットが[Proportional Font Family]プルダウンメニューに表示される項目で、下側が[Fixed-witdh Font Family]プルダウンメニューの項目です。

なお、インターネット経由で入手可能なフリーのTrueTypeフォントは他にもたくさん存在しており、私はこのようなフォントをMac OS Xで利用しています。Yocto LinuxのTrueTypeフォントのレシピを読むと、レシピ内に記述されているコードに一定のパターンが存在していて、それらに難しい部分は含まれていないように思えます。TrueTypeフォントのレシピを書くのは容易そうなので、そのうち他の日本語TrueTypeフォントをSato GUI環境へ組み込んでみようと思っています。この試みが成功したら、また記事として紹介するつもりです。

長くなってしまうので、Sato Mobile Desktopの日本語表示化に関する記事は2つに分けることにします。じつは、Sato GUI環境の日本語表示化を完全な形で実現するには、日本語のTrueTypeフォントを組み込むだけではダメで、他にもやらなくてはいけないことがあります。それはターゲットイメージに組み込まれるロケール情報のカスタマイズなのですが、その辺の説明は次の記事に書いていきます。


posted by とみやん at 10:06| Comment(0) | TrackBack(0) | Embedded Linux > Yocto Project

2015年01月16日

[Yocto] Sato Mobile DesktopへのMidoriブラウザの組込み

年末年始休暇もほとんど仕事関連の調査で潰してしまい、年が明けてからも多忙な日々が続いていましたが、本業の仕事もやっと終わりそうな状況になってきました。仕事だけにすべての時間を捧げる日々を過ごしていましたが、少し落ち着いてきたので、これからYocto Linux以外の研究テーマにも時間を割けるようになりそうです。とは言いながら、またしてもYocto Linuxの記事を書いてしまいます。他のネタも持ってはいるのですが、それらはまだ仕込中で、記事として公開できる状態まで練上がっていません。

ここのところハード&BSP系の情報やシステム寄りのパッケージの紹介などの所謂下周りの記事が続いたので、少し毛色を変えて、これからしばらくYocto LinuxのGUI環境のカスタマイズに関する記事を書こうと思います。組込み屋としては、デバイスドライバとかシステムの設定などをいじくり回す方が好きなのですが、GUIカスタマイズ、GUIアプリやWebサービスの導入方法や開発手法などの上周りの情報の方が需要が高いんじゃないでしょうか。Arduino、mbed、Rasberry Piなどのボードが流行っているのも、下周りをあまり弄らなくても、そこそこ高機能なシステムが構築できてしまうことが理由ではないかと思っています。Yocto Linuxの上周りの記事の第一段として、小ネタの情報になりますが、Sato Mobile Desktop環境へWebブラウザを組み込む方法について紹介しましょう。

Yocto Linuxの配布パッケージには、core-image-satoという名前のリファレンス的なイメージレシピが収納されています。いままでの記事にもスクリーンショットを掲載して紹介していますが、このcore-image-satoイメージレシピから生成できるのがYocto Linuxの標準GUI環境であるSato Mobile Desktopです。Sato Mobile Desktopはモバイル機器向けの軽量なGUI環境ですが、残念なことに、デフォルト状態ではcore-image-satoイメージにWebブラウザが組み込まれていません。しかし、WebブラウザのレシピはYocto Linuxの配布パッケージにちゃんと収納されています。Midoriという名前のWebブラウザがそれです。MidoriはレンダリングエンジンにWebKitを、ツールキットにGTK+2を使用している軽量なWebブラウザで、多くの組込みLinuxディストリビューションで採用されています。それではなぜデフォルト状態のcore-image-satoイメージにMidoriが組み込まれていないのかと言うと、これは想像になりますが、その理由はターゲットイメージのビルドに時間がかかってまうからだと思います。実際に作業をやってみて分かったのですが、core-image-satoイメージへMidoriを追加すると、クリーンビルドの時間がさらに1時間を伸びてしまいました(高性能なPCでも3時間以上、低性能なPCなら4〜6時間位かかるでしょう)。

core-image-satoレシピから生成されるイメージにMidoriを組み込む方法はすごく簡単です。以下のような変数定義をlocal.conf内に追加するだけです。
#
# Install the Midori web browser to Sato Desktop images. The WEB variable, which
# is defined in packagegroup-core-x11-sato.bb, is set to an empty value as default.
#
WEB = "midori"

たったこれだけで、core-image-satoイメージへMidoriを組み込むことができます。

Midoriを組み込むと、Sato GUI環境のDesktopウィンドウに下のようなアプリケーション・アイコンが追加されます。
UBShot_20150117_093041-Installing_Midori-Yocto_Sato_Desktop-1366x768
2つのアイコンが存在しますが、「Midori」の方が普通にWebブラウザを起動し、「Midori Private Browsing」の方はWebブラウザの起動後にURL履歴やCookie情報などを一切記録しません。この2つのアイコンをクリックした際のMidoriのスタートアップ画面を下に示します。
UBShot_20150117_093250-Installing_Midori-Yocto_Sato_Desktop-1366x768
UBShot_20150117_093317-Installing_Midori-Yocto_Sato_Desktop-1366x768
Midoriは組込みシステム向けの最低限の機能しか備えていないWebブラウザです。ChromeやSafariなどと比較すると、Midoriの操作性はとても良いとは言えません。レンダリング性能も低く、グラフィックや画像の多いページだと表示に結構時間がかかります。機能や性能が高いと、その分メモリやディスク容量を消費します。組込みシステムではメモリやディスクの容量に制限があるので、トレードオフの観点からするとこの辺は仕方がないことなのでしょう。まぁ、それでも普通にブラウジングはできます。

なお、上記のlocal.conf内に追加したWEBという変数は、packagegroup-core-x11-sato.bbというレシピファイルの中にそのデフォルト値が定義されています。その部分の抜粋を下に示します。
# pcmanfm doesn't work on mips
FILEMANAGER ?= "pcmanfm"
FILEMANAGER_mips ?= ""

WEB ?= ""
#WEB = "midori"

SUMMARY_${PN}-apps = "Sato desktop - applications"
RDEPENDS_${PN}-apps = "\
leafpad \
gaku \
x11vnc \
matchbox-terminal \
sato-screenshot \
${FILEMANAGER} \
${WEB} \
"

常にSato GUI環境にMidoriを入れておきたい場合は、上のWEB変数の設定定義を変更して、「WEB = "midori"」の方を有効にしておくと良いでしょう。その場合、local.conf側の定義は不要になります。

【2015/01/21 追記】

本記事に掲載したスクリーンショットは、XS36V4上で動いているYocto LinuxのSato Mobile Desktopから撮りました。

QEMUエミュレーション環境でもMidoriブラウザが動くのか興味があったので、試しにQEMU x86-64(64ビット版)ターゲット用にMidoriブラウザを組み込んだcore-image-satoイメージをビルドしてみました。下のスクリーンショットが、QEMU x86-64ターゲット上で動作しているSato GUIとMidoriブラウザの画面です。
UBShot_20150121_193732-Installing_Midori-Yocto_Sato_Desktop-QEMUx86_64-1026x797
UBShot_20150121_193812-Installing_Midori-Yocto_Sato_Desktop-QEMUx86_64-1026x797
試していませんが、QEMU x86(32ビット版)でもMidoriブラウザは問題なく動作するはずです。

ターゲット実機を持っていない人でも記事の内容を試せるので、Yocto LinuxのGUI環境カスタマイズに関する記事はQEMU x86-64をターゲットとして書いていきます。
posted by とみやん at 14:52| Comment(0) | TrackBack(0) | Embedded Linux > Yocto Project

2015年01月13日

[Yocto] XS36V4へのWi-Fi機能(RTL8188EEドライバ)追加

前記事に書いたとおり、Shuttle XS36V4でYocto Linuxを動かすことはトラブルに遭遇することもなくすんなりと成功してしまいました。Valley Island BSPに収納されているバイナリ・イメージと自分でビルドしたDE3815TYKHE用のイメージの2つを使いましたが、どちらでも特に問題なくXS36V4でYocto Linuxは動作しました。Valley Island BSPはデフォルト状態でRTL8168/8169/8111/8411ドライバが有効になっていたので、ドライバを組み込むことなくEthernetインターフェースも使えました。ただし、一つ大きな課題を見つけてしまいました。それは、Yocto LinuxがXS36V4の無線LANデバイスを認識していないことです。

前記事で使ったDE3815TYKHE用のcore-image-satoイメージは、カーネルレシピに主要な無線LANドライバをすべて組み込んた状態でビルドしたものです。〔2014/12/29の記事linux-yocto_3.10.bbappendを参照〕lspciコマンドの出力情報によって、XS36V4に搭載されている無線LANデバイスはRealtek RTL8188EEという物であることが判りました。しかし、dmesgコマンドのカーネル・ログを確認しても、RTL8188EE用ドライバはロードされていませんでした。Sato Mobile DesktopのGUI画面からconnman-gnomeを起動してみましが、下のとおり、やはりServicesリストに[Wireless Networks]というカテゴリ・エントリは存在していません。
UBShot_20150113_103340-YoctoLinux-Enabling_RTL8188EE_WLAN_Driver-1366x768
どうやらRTL8188EE用の無線LANドライバがカーネルへ組み込まれていないようです。

ググって調べてみると、カーネルソース・ツリーにRTL8188EE用ドライバは存在しており、これを有効にするにはCONFIG_RTL8188EEというコンフィグレーション設定項目を有効する必要があることが判りました。現状のカーネルのコンフィグレーション設定を確認すると、やはりこの項目は有効になっていませんでした。
# zcat /proc/config.gz | grep CONFIG_RTL8188EE
# CONFIG_RTL8188EE is not set

上記の情報に基いて、XS36V4のWi-Fi機能を利用可能にする作業を行ったので、その作業記録を本記事に書きます。

■ RTL8188EE無線LANドライバの組み込み


まずは、一時的にコンフィグレーション設定を変更して、カーネルへRTL8188EEドライバを組み込む作業を行いました。

bitbake linux-yocto -c menuconfig」コマンドによってカーネルのコンフィグレーション画面を開いて、以下のメニュー項目を有効にすれば、RTL8188EEドライバを組み込むことができます。〔2014/10/25の記事を参照〕
UBShot_20150113_115841-YoctoLinux-Enabling_RTL8188EE_WLAN_Driver-704x766
         Device Drivers  --->

[*] Nework device support --->

[*] Wireless LAN --->

<M> Realtek RTL8188EE Wireless Network Adapter

上の操作を行った後、以下のコマンドを実行して、RTL8188EEドライバを組み込んだcore-image-satoイメージを作成しました。
% bitbake linux-yocto -c compile -f
% bitbake linux-yocto -c deploy
% bitbake linux-yocto
% bitbake core-image-sato

core-image-satoのhddimgファイルからLive USBを作成して、このUSBメディアを使って、XS36V4でYocto Linuxを起動しました。そして、CONFIG_RTL8188EEが有効になっていることを確認しました。
# zcat /proc/config.gz | grep CONFIG_RTL8188EE
CONFIG_RTL8188EE=m

続いて、dmesgコマンドによってRTL8188EEドライバがロードされているかを確認しました。
# dmesg
.... ....
.... ....
.... ....
.... ....
[ 6.241182] cfg80211: Calling CRDA to update world regulatory domain
[ 6.375266] rtl8188ee 0000:01:00.0: enabling device (0000 -> 0003)
[ 6.383289] rtl8188ee: Using firmware rtlwifi/rtl8188efw.bin
[ 6.397905] ieee80211 phy0: Selected rate control algorithm 'rtl_rc'
[ 6.398161] rtlwifi: wireless switch is on
.... ....

connman-gnomeを起動してみると、Servicesリストにちゃんと[Wireless Networks]のエントリが追加されていました。
UBShot_20150113_123138-YoctoLinux-Enabling_RTL8188EE_WLAN_Driver-1366x768
Wi-Fiアクセスポイントへの接続を試してみると、こちらも問題なくできました。
UBShot_20150113_123405-YoctoLinux-Enabling_RTL8188EE_WLAN_Driver-1366x768

■ XS36V4用BSPの作成


上記のとおり、一時的にカーネルのコンフィグレーション設定を変更してRTL8188EEドライバを組み込めば、Yocto LinuxでXS36V4のWi-Fi機能を使えるようになることを確認できました。そこで、XS36V4用のBSPを作成して、この成果をそれに反映しました。

2014/10/25の記事にDE3815TYKHE用BSPの作成方法を書きましたが、これと同じ方法でXS36V4用のBSPを作成しました。今回作成したXS36V4 BSPのファイル構成を以下に示します。

  meta-xs36v4
|-- conf
| |-- machine
| | `-- xs36v4.conf
| `-- layer.conf
|-- recipes-bsp
| `-- formfactor
| |-- formfactor
| | `-- xs36v4
| | `-- machconfig
| `-- formfactor_0.0.bbappend
`-- recipes-kernel
`-- linux
|-- linux-yocto
| `-- add_driver-net_wlan_rtl8188ee.cfg
`-- linux-yocto_3.10.bbappend

また、以下にXS36V4 BSPのレイヤ定義ファイル、ターゲット定義ファイル、カーネルレシピの内容を示します。
#We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"

# We have a recipes directory, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "xs36v4"
BBFILE_PATTERN_xs36v4 := "^${LAYERDIR}/"
BBFILE_PRIORITY_xs36v4 = "6"

LAYERDEPENDS_xs36v4 = "intel"

LICENSE_PATH += "${LAYERDIR}/custom-licenses"

#@TYPE: Machine
#@NAME: Shuttle XS36V4

#@WEBTITLE: Intel Celeron J1900 Processor (XS36V4) 64-bit with Open Source Frame Buffer Graphics

#@DESCRIPTION: Machine configuration for XS36V4 64-bit systems, without Intel-proprietary graphics bits

PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
PREFERRED_VERSION_linux-yocto ?= "3.10%"

require conf/machine/include/intel-corei7-64-common.inc
require conf/machine/include/intel-common-pkgarch.inc
require conf/machine/include/meta-intel.inc

MACHINE_FEATURES += "pcbios efi"
MACHINE_FEATURES += "wifi"

MACHINE_EXTRA_RRECOMMENDS += "linux-firmware"

XSERVER ?= "${XSERVER_X86_BASE} \
${XSERVER_X86_EXT} \
${XSERVER_X86_FBDEV} \
${XSERVER_X86_I965} \
"

APPEND += "acpi_enforce_resources=lax video=efifb:off vga=0x318"

FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

#############################
# MACHINE = xs36v4 #
#############################
COMPATIBLE_MACHINE_xs36v4 = "xs36v4"
KMACHINE_xs36v4 = "valleyisland"
KBRANCH_xs36v4 = "standard/base"
KERNEL_FEATURES_xs36v4 = " features/valleyisland-io/valleyisland-io.scc \
features/valleyisland-io/valleyisland-io-pci.scc \
features/wifi/wifi-all.scc"

LINUX_VERSION_xs36v4 = "3.10.59"
SRCREV_machine_xs36v4 = "747e1cbd12b15db8bc2ae86e2359c1b113f120d6"
SRCREV_meta_xs36v4 = "8f05306a8e6f5ee422d50c3317acce0cf9e6aada"
SRCREV_valleyisland-io_xs36v4 = "0992d01f5f382f6da60004ef87f67ebd3ca13732"

SRC_URI_xs36v4 = "git://git.yoctoproject.org/linux-yocto-3.10.git;protocol=git;nocheckout=1;branch=${KBRANCH},${KMETA},valleyisland-io-3.0;name=machine,meta,valleyisland-io"

SRC_URI_xs36v4 += "file://add_driver-net_wlan_rtl8188ee.cfg"

module_autoload_i2c-dev = "i2c-dev"

上のファイルで定義しているのは64ビット版ターゲットだけです。今回32ビット版ターゲットの定義は省略しました。XS36V4で32ビット版Yocto Linuxを動かすことはまずないだろうと思ったからです。DE3815TYKHEでも、32ビット版ターゲット用にYocto Linuxをビルドしたことはいままで一度もありません。

カーネルレシピlinux-yocto_3.10.bbappend内で参照しているコンフィグレーションフラグメントは、以下のような内容です。
++ .config	2015-01-12 15:55:39.777257022 +0900
CONFIG_RTL8188EE=m

このファイルは、カーネルのコンフィグレーション・メニュー画面で「Realtek RTL8188EE Wireless Network Adapter」の設定項目を有効にし、メニュー画面を終了した直後に「bitbake linux-yocto -c diffconfig」コマンドを実行することで作成しました。

上記のXS36V4用BSPを作成した後、このBSPを使ってcore-image-satoイメージをビルドし、XS36V4でYocto Linuxが起動することを確認しました。Wi-Fi機能も問題なく動作していました。

なお、Shuttle XS36V4にはXS35V4という姉妹モデルが存在しますが、この2つの機種のハード仕様は同一だと思われます。未確認ですが、今回作成したBSPはXS35V4でも使えるはずです。〔本記事に掲載したXS36V4 BSPを利用してXS35V4で動作確認を行った方がいれば、その結果を報告していただけると有難いです〕

【2015/01/15 追記】

本記事に掲載したXS36V4 BSPを使うと、RTL8188EEドライバと一緒に主要な無線LANドライバもすべてカーネルに組み込まれてしまいます。無線LANカードを換装したときに設定を変える必要がないので、これはこれで便利なのですが、ターゲットに搭載されていないデバイスのためのドライバが入っている状態になっています。組込みシステムではこういう状態は好ましくありません。

RTL8188EE用以外の無線LANドライバを削除したい場合は、カーネルレシピlinux-yocto_3.10.bbappendとコンフィグレーションフラグメントの内容を以下のように変更すると良いでしょう。
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

#############################
# MACHINE = xs36v4 #
#############################
COMPATIBLE_MACHINE_xs36v4 = "xs36v4"
KMACHINE_xs36v4 = "valleyisland"
KBRANCH_xs36v4 = "standard/base"
KERNEL_FEATURES_xs36v4 = " features/valleyisland-io/valleyisland-io.scc \
features/valleyisland-io/valleyisland-io-pci.scc"

LINUX_VERSION_xs36v4 = "3.10.59"
SRCREV_machine_xs36v4 = "747e1cbd12b15db8bc2ae86e2359c1b113f120d6"
SRCREV_meta_xs36v4 = "8f05306a8e6f5ee422d50c3317acce0cf9e6aada"
SRCREV_valleyisland-io_xs36v4 = "0992d01f5f382f6da60004ef87f67ebd3ca13732"

SRC_URI_xs36v4 = "git://git.yoctoproject.org/linux-yocto-3.10.git;protocol=git;nocheckout=1;branch=${KBRANCH},${KMETA},valleyisland-io-3.0;name=machine,meta,valleyisland-io"

SRC_URI_xs36v4 += "file://add_config-wifi_rtl8188ee.cfg"

module_autoload_i2c-dev = "i2c-dev"

# Common Wifi Infrastructure
CONFIG_NET=y
CONFIG_WIRELESS=y
CONFIG_WIRELESS_EXT=y
CONFIG_NETDEVICES=y
CONFIG_WLAN=y

CONFIG_CFG80211=m
CONFIG_CFG80211_DEFAULT_PS=y
CONFIG_CFG80211_WEXT=y

CONFIG_MAC80211=m
CONFIG_MAC80211_RC_PID=y
CONFIG_MAC80211_RC_MINSTREL=y
CONFIG_MAC80211_RC_MINSTREL_HT=y
CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
CONFIG_MAC80211_MESH=y
CONFIG_MAC80211_LEDS=y

CONFIG_AVERAGE=y

# Realtek RTL8188EE Wireless Driver
CONFIG_RTLWIFI=m
CONFIG_RTL8188EE=m

上のカーネルレシピでは、「KERNEL_FEATURES_xs36v4 = " ... features/wifi/wifi-all.scc"」という設定記述を削除しています。上のコンフィグレーションフラグメントで定義しているのは、このファイル内のカーネル・コンフィグレーション設定項目の一部です。
posted by とみやん at 10:59| Comment(0) | TrackBack(0) | Embedded Linux > Yocto Project

2015年01月11日

[Yocto] Shuttle XS36V4でYocto Linuxを動かす

皆様、新年明けましておめでとうございます。年が明けてもう10日も経ってしまったので、遅らせばながらの挨拶ですね。皆様どのように正月を過ごされましたか。

私の方は年末年始もずっと研究活動の調べ事をやったり、その内容をブログ記事に書いたりして過ごしていました。完全休養日は大晦日と正月一日の2日間だけで、その他の日はずっと仕事をしていたような感じです。おかげで、穏やかな正月という訳にはいかず、ぜんぜん休んだ気がしません。一応本業の仕事は休みだったですが、どうしても本業の仕事に関連した技術的な調査をやらざるをえない状況だったので、結局自主的に年末年始休暇をほぼ全部つぶして研究活動の作業をやっていました。

さて、ずっとYocto Projectの記事が続いていますが、またしても同研究テーマに関連した記事を書きます。

Yocto Linux用の新しいターゲット機を入手しました。Shuttle XS36V4という奴で、DE3815TYHKEと同様に一般向けのベアボーンPCです。
ANIMG_20150110_153042-Shuttle_XS36V4-Unboxing_ProductViews.jpg
ANIMG_20150110_153710-Shuttle_XS36V4-Unboxing_ProductViews.jpg
ANIMG_20150110_154337-Shuttle_XS36V4-Unboxing_ProductViews.jpg
ANIMG_20150110_154846-Shuttle_XS36V4-Unboxing_ProductViews.jpg
ANIMG_20150110_155413-Shuttle_XS36V4-Unboxing_ProductViews.jpg
この機種に搭載されているプロセッサはIntel J1900という奴です。J1750/1800/1900(Bay Trail-D)はE38xx(Bay Trail-I)よりは若干消費電力が高いですが、それでもTDPは10Wと十分に優れた性能です。J1900搭載PCを使ってメディア・サーバーを一台組みたいと思っていたのですが、結局組込みLinuxのターゲットとして使うことを優先して、このXS36V4を選択してしまいました。J1800/1900を搭載したベアボーンPCやMini-ITXボードは結構多くの種類の製品が販売されています。その中からXS36V4を選んだのは、この機種に外部シリアル・コネクタが搭載されていたからです(この機種にはXS35V4という姉妹モデルもあり、そちらはシリアルは無くCD/DVDドライブを搭載しています)。最近のPCには珍しく、XS36V4にはシリアルが2個も搭載されています。組込みLinuxのターゲット機はモニタやタッチパネルなしで運用することが良くあります。こういう機器でも大抵はシリアルだけは活かしておいて、メンテナンス用に使ったりします。マイコン搭載機器でもそうですが、組込み用ターゲットではシリアルはいまだに必須のインターフェースです。これはマイコンが登場した頃からずっと続いており、これからも変わらないでしょう。

■ XS36V4の組み立て


XS36V4に部品を追加してPCとして組み上げたので、その作業の様子を紹介します。DE3815TYKHEと同様にXS36V4のCPUもオンボードの直付けです。したがって、追加部品として必要なのはメモリとSATAディスクだけです。以下の2つ部品を用意しました。
  • Transcend PC3L-12800(DDR3L-1600)1.35V TS1GSK64W6H
  • Intel 320 Series SSD 120GB

ANIMG_20150110_160123-Shuttle_XS36V4-AddtionalParts_Building.jpg
ANIMG_20150110_160159-Shuttle_XS36V4-AddtionalParts_Building.jpg
SO-DIMMメモリはXS36V4と一緒にAmazonから購入し、SSDの方はオークション落札で中古品を入手しました。メモリは4GBと8GBのどちらにするか迷いましたが、今回は奮発して8GBを選びました。これは後日4GBに差し替えるかもしれません。Windowsならメモリは8GBないと苦しいですが、Linuxなら4GBもあれば十分だからです。このXS36V4でメディア・サーバーを組み上げる場合も、OSはUbuntuかCentOSを使って構築するつもりです。

部品を組み込むために、まずはXS36V4本体のケースを開けてみました。XS36V4は両面のケース・カバーがそれぞれ開くようになっています。
ANIMG_20150110_160952-Shuttle_XS36V4-AddtionalParts_Building.jpg

マザーボードが見える方の面の真中辺りにDIMMスロットが在ります。同面の右上部にはMini-PCIeスロットが在りますが、ここには無線LANカードが取り付け済みでした。この無線LANカードはRealtek製のようです。Realtekの無線LANチップはあまりの評判が良くないので、近いうちにこれはIntel製の無線LANカードに取り替えようと思っています。

メモリとSSDの取り付け作業はいずれも難しくありませんでした。メモリはDIMMスロットに挿し込むだけです。
ANIMG_20150110_161206-Shuttle_XS36V4-AddtionalParts_Building.jpg
SSDの方は専用の金具にネジ止めしてから、裏面の所定の場所に金具ごとネジで固定するだけです。
ANIMG_20150110_161408-Shuttle_XS36V4-AddtionalParts_Building.jpg
ANIMG_20150110_162349-Shuttle_XS36V4-AddtionalParts_Building.jpg
ANIMG_20150110_163508-Shuttle_XS36V4-AddtionalParts_Building.jpg
メモリとSSDを取り付けたら、両面のカバーを閉めれば組み立て作業は終わりです。XS36V4本体のカバーの開け方だけちょっとコツが要りますが、その辺の情報は製品に同梱されている組立説明書に書いてあります。一度でもベアボーンPCを組み立てたことのある人なら誰でもできるほど容易な作業だと思いますが、あらかじめ組立説明書は読んでおいた方が良いでしょう。

組み立て作業が終わったので、モニタ、キーボード、マウスを接続して、さっそくXS36V4の電源を入れてみました。すると、下のようなEFI Shellの起動画面がモニタに表示されました。
ANIMG_20150111_164357-Shuttle_XS36V4-Booting_EFIShell_Screen.jpg
XS36V4に搭載されているBIOSはAMI製のUEFIベースの物です。SSDにOSが入っていない状態なので、EFI Shellが起動したようです。「exit」というコマンドをタイプすると、EFI Shellから抜けて、BIOSの画面へ戻ることができます。
ANIMG_20150111_164532-Shuttle_XS36V4_Booting_AMIBIOS_Screen..jpg
一部のUEFI BIOSはEFI Shellを起動しないように設定できるですが、XS36V4のBIOSはできないようです。EFI Shellからできることも色々あるのですが、一般人がEFI Shellを使う必要性はまずないでしよう。一度HDD/SSDへOSをインストールしてしまうと、EFI Shellは邪魔なだけです。BIOSのデフォルト設定でEFI Shellは起動しないようになっている方が、一般人にとっては親切ではないかと思います。

■ XS36V4によるYocto Linuxの動作確認


XS36V4を入手した本来の目的は、こいつでメディア・サーバーを組み立てることだったのですが、本業の仕事が忙しすぎて、近々にはその作業やる時間を取れそうもありません。他にも優先してやりたい研究テーマもあるので、メディア・サーバーの構築はずっと先になりそうです。せっかく入手したのに全然使わないのはもったいないので、取りあえず、XS36V4でYocto Linuxを動かしてみました。

Intelのサイトに掲載されているJ1800/1900とE38xxのプロセッサ仕様情報を比較して、この2つは類似性の高いコアではないかと思っていました。そのため、Valley Island BSPからビルドしたイメージを使えば、多分XS36V4でもそのままYocto Linuxが動くじゃないかと予測していました。そこで、最初にValley Island BSPに収納されているhddimgファイルからLive USBを作成して、そのUSBメディアからYocto Linuxを起動してみました。Valley Island(Intel E38xx)用のLive USBメディアは以下のコマンドによって作成できます。
% cd ~/Yocto
% cd poky-daisy-11.0.2
% cd meta-intel/binary
% umount /dev/sdc
% sudo dd if=core-image-sato-valleyisland-64.hddimg of=/dev/sdc
% sync

上記の方法によって、特に問題なくXS36V4でYocto Linuxが起動して、Sato Mobile Desktopの画面がモニタに表示されました(予想どおりだったとは言え、ちょっと拍子抜けです)。下の写真がその様子です。
ANIMG_20150111_160012-Shuttle_XS36V4-Running_YoctoLinux.jpg
ちなみに、上の写真に写っている液晶モニタはGechic On-Lap1302という物です。このモニタの特長はUSBから電源が取れることで、PCのUSBポートから電源を供給できます。最近このメーカーの製品の再整備品が秋葉原のPCショップや通販ショップなどで広く出回っています。去年の年末に秋葉原に行ったときに、TWOTOP FreeT(BUY MORE秋葉原本店)で特価販売されているのを見つけて一台買ってしまいました。

Valley Island BSPに収納されているイメージによってYocto Linuxが正常に起動することが確認できたので、次に自分でビルドしたイメージを使ってみました。2014/12/29の記事でクリーンビルドしたDE3815TYHKE用のcore-image-satoイメージからLive USBを作成して、そのUSBメディアを使って、XS36V4の内蔵SATAへYocto Linuxをインストールしました。そして、XS36V4の内蔵SATAからYocto Linuxを起動してみましたが、こちらも特に問題なく起動できました。J1900はE38xxと同じBay Trail系コアのx86プロセッサでなので、これは当然の結果ですが、どうやらXS36V4でYocto Linuxを使うのは問題なくできるようです。

予想どおりの結果だったので一安心ですが、ここで組込み屋として気になるのは、やはりXS36V4のハードウェアの詳細仕様です。そこで、いくつかのコマンドを使ってXS36V4のハード情報を取得してみました。まずは、プロセッサ情報の確認から始めました。
# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 55
model name : Intel(R) Celeron(R) CPU J1900 @ 1.99GHz
stepping : 3
microcode : 0x320
cpu MHz : 1328.000
cache size : 1024 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm
sse4_1 sse4_2 movbe popcnt tsc_deadline_timer rdrand lahf_lm 3dnowprefetch ida arat epb dtherm tpr_shadow vnmi flexpriority ept vpid tsc_adjust smep erms
bogomips : 4000.16
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 55
model name : Intel(R) Celeron(R) CPU J1900 @ 1.99GHz
stepping : 3
microcode : 0x320
cpu MHz : 1328.000
cache size : 1024 KB
physical id : 0
siblings : 4
core id : 1
cpu cores : 4
apicid : 2
initial apicid : 2
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm
sse4_1 sse4_2 movbe popcnt tsc_deadline_timer rdrand lahf_lm 3dnowprefetch ida arat epb dtherm tpr_shadow vnmi flexpriority ept vpid tsc_adjust smep erms
bogomips : 4000.16
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

processor : 2
vendor_id : GenuineIntel
cpu family : 6
model : 55
model name : Intel(R) Celeron(R) CPU J1900 @ 1.99GHz
stepping : 3
microcode : 0x320
cpu MHz : 1328.000
cache size : 1024 KB
physical id : 0
siblings : 4
core id : 2
cpu cores : 4
apicid : 4
initial apicid : 4
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm
sse4_1 sse4_2 movbe popcnt tsc_deadline_timer rdrand lahf_lm 3dnowprefetch ida arat epb dtherm tpr_shadow vnmi flexpriority ept vpid tsc_adjust smep erms
bogomips : 4000.16
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 55
model name : Intel(R) Celeron(R) CPU J1900 @ 1.99GHz
stepping : 3
microcode : 0x320
cpu MHz : 1328.000
cache size : 1024 KB
physical id : 0
siblings : 4
core id : 3
cpu cores : 4
apicid : 6
initial apicid : 6
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm
sse4_1 sse4_2 movbe popcnt tsc_deadline_timer rdrand lahf_lm 3dnowprefetch ida arat epb dtherm tpr_shadow vnmi flexpriority ept vpid tsc_adjust smep erms
bogomips : 4000.16
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:


プロセッサ情報が4つも表示されるのは壮観ですね。J1900が4コアのプロセッサであるメリットは、これからXS36V4を使っていくうちにきっと実感できるでしょう。

最近AES-NIの性能評価記事を続けて書いているので、じつは、一番気になっていたのはJ1900にAES-NIが搭載されているかどうかでした。上の/proc/cpuinfoの「flags」情報の中に「aes」の文字列は存在していません。IntelのJ1900のプロセッサ仕様情報にも「AES-NI: No」と掲載されているので、やはりJ1900はAES-NIを内蔵していないようです。AES-NIが内蔵されていることを期待していたので、これはかなり残念です。本件に関連してIntelのプロセッサ仕様情報を調べまわったのですが、Bay Trail系プロセッサの中でAES-NIが搭載されているのはZ374x/377xとE38xxだけのようです。

cpuinfo情報に続いて、lspciコマンドを使ってPCI-Eの情報を取得してみました。
# lspci
00:00.0 Host bridge: Intel Corporation ValleyView SSA-CUnit (rev 0c)
00:02.0 VGA compatible controller: Intel Corporation ValleyView Gen7 (rev 0c)
00:13.0 SATA controller: Intel Corporation ValleyView 6-Port SATA AHCI Controller (rev 0c)
00:14.0 USB controller: Intel Corporation ValleyView USB xHCI Host Controller (rev 0c)
00:1a.0 Encryption controller: Intel Corporation ValleyView SEC (rev 0c)
00:1b.0 Audio device: Intel Corporation ValleyView High Definition Audio Controller (rev 0c)
00:1c.0 PCI bridge: Intel Corporation ValleyView PCI Express Root Port (rev 0c)
00:1c.1 PCI bridge: Intel Corporation ValleyView PCI Express Root Port (rev 0c)
00:1c.2 PCI bridge: Intel Corporation ValleyView PCI Express Root Port (rev 0c)
00:1c.3 PCI bridge: Intel Corporation ValleyView PCI Express Root Port (rev 0c)
00:1f.0 ISA bridge: Intel Corporation ValleyView Power Control Unit (rev 0c)
00:1f.3 SMBus: Intel Corporation ValleyView SMBus Controller (rev 0c)
01:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8188EE Wireless Network Adapter (rev 01)
02:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. Device 5289 (rev 01)
02:00.2 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0a)

上のlspciコマンドの出力情報から、Ethernetと無線LANデバイスはいずれもRealtek製であることが判ります。

Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. Device 5289 (rev 01)」というのは一体何なのか気になったので、ググって調べてみました。どうやらこれはRealtek製のCard Reader Controllerのようです。XS36V4の前面にSDカード・スロットが搭載されているので、これを制御しているデバイスなのでしょう。このコントローラ用のドライバも存在しているようなので、そのうちYocto Linuxに組み込んでみようと思っています。

続いて、dmesgコマンドを実行しました。長くなりますが、同コマンドの全出力情報を以下に示します(Linux関連の仕事をしている人にとって、こういう情報が役に立つこともあります)。
# dmesg
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.10.59-ltsi-yocto-standard (yuhri@hestia-vm1) (gcc version 4.8.2 (GCC) ) #1 SMP PREEMPT Sun Jan 11 13:43:17 JST 2015
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz root=/dev/sda2 rw quiet acpi_enforce_resources=lax video=efifb:off vga=0x318
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000008efff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000008f000-0x000000000008ffff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x0000000000090000-0x000000000009ffff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000001effffff] usable
[ 0.000000] BIOS-e820: [mem 0x000000001f000000-0x00000000200fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000020100000-0x00000000b711bfff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000b711c000-0x00000000b714bfff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000b714c000-0x00000000b715bfff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x00000000b715c000-0x00000000b78e2fff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x00000000b78e3000-0x00000000b7bb2fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000b7bb3000-0x00000000b7bb3fff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000b7bb4000-0x00000000b7bf5fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000b7bf6000-0x00000000b7d64fff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000b7d65000-0x00000000b7ff9fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000b7ffa000-0x00000000b7ffffff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000e00f8000-0x00000000e00f8fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fed01000-0x00000000fed01fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000ffb00000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000023fffffff] usable
[ 0.000000] NX (Execute Disable) protection: active
[ 0.000000] efi: EFI v2.31 by American Megatrends
[ 0.000000] efi: ACPI=0xb7153000 ACPI 2.0=0xb7153000 SMBIOS=0xf04d0 MPS=0xfd4c0
[ 0.000000] efi: mem00: type=3, attr=0xf, range=[0x0000000000000000-0x0000000000008000) (0MB)
[ 0.000000] efi: mem01: type=7, attr=0xf, range=[0x0000000000008000-0x000000000002f000) (0MB)
[ 0.000000] efi: mem02: type=3, attr=0xf, range=[0x000000000002f000-0x000000000008f000) (0MB)
[ 0.000000] efi: mem03: type=10, attr=0xf, range=[0x000000000008f000-0x0000000000090000) (0MB)
[ 0.000000] efi: mem04: type=7, attr=0xf, range=[0x0000000000090000-0x000000000009f000) (0MB)
[ 0.000000] efi: mem05: type=4, attr=0xf, range=[0x000000000009f000-0x00000000000a0000) (0MB)
[ 0.000000] efi: mem06: type=2, attr=0xf, range=[0x0000000000100000-0x0000000001310000) (18MB)
[ 0.000000] efi: mem07: type=7, attr=0xf, range=[0x0000000001310000-0x0000000002000000) (12MB)
[ 0.000000] efi: mem08: type=2, attr=0xf, range=[0x0000000002000000-0x0000000003210000) (18MB)
[ 0.000000] efi: mem09: type=7, attr=0xf, range=[0x0000000003210000-0x000000001f000000) (445MB)
[ 0.000000] efi: mem10: type=0, attr=0xf, range=[0x000000001f000000-0x0000000020100000) (17MB)
[ 0.000000] efi: mem11: type=7, attr=0xf, range=[0x0000000020100000-0x000000006e11b000) (1248MB)
[ 0.000000] efi: mem12: type=2, attr=0xf, range=[0x000000006e11b000-0x0000000098000000) (670MB)
[ 0.000000] efi: mem13: type=4, attr=0xf, range=[0x0000000098000000-0x0000000098020000) (0MB)
[ 0.000000] efi: mem14: type=7, attr=0xf, range=[0x0000000098020000-0x00000000a8a58000) (266MB)
[ 0.000000] efi: mem15: type=1, attr=0xf, range=[0x00000000a8a58000-0x00000000a8ae6000) (0MB)
[ 0.000000] efi: mem16: type=4, attr=0xf, range=[0x00000000a8ae6000-0x00000000b6b1c000) (224MB)
[ 0.000000] efi: mem17: type=7, attr=0xf, range=[0x00000000b6b1c000-0x00000000b6e76000) (3MB)
[ 0.000000] efi: mem18: type=2, attr=0xf, range=[0x00000000b6e76000-0x00000000b6e7f000) (0MB)
[ 0.000000] efi: mem19: type=3, attr=0xf, range=[0x00000000b6e7f000-0x00000000b711c000) (2MB)
[ 0.000000] efi: mem20: type=0, attr=0xf, range=[0x00000000b711c000-0x00000000b714c000) (0MB)
[ 0.000000] efi: mem21: type=9, attr=0xf, range=[0x00000000b714c000-0x00000000b715c000) (0MB)
[ 0.000000] efi: mem22: type=10, attr=0xf, range=[0x00000000b715c000-0x00000000b78e3000) (7MB)
[ 0.000000] efi: mem23: type=6, attr=0x800000000000000f, range=[0x00000000b78e3000-0x00000000b7b68000) (2MB)
[ 0.000000] efi: mem24: type=5, attr=0x800000000000000f, range=[0x00000000b7b68000-0x00000000b7bb3000) (0MB)
[ 0.000000] efi: mem25: type=4, attr=0xf, range=[0x00000000b7bb3000-0x00000000b7bb4000) (0MB)
[ 0.000000] efi: mem26: type=6, attr=0x800000000000000f, range=[0x00000000b7bb4000-0x00000000b7bf6000) (0MB)
[ 0.000000] efi: mem27: type=4, attr=0xf, range=[0x00000000b7bf6000-0x00000000b7d65000) (1MB)
[ 0.000000] efi: mem28: type=6, attr=0x800000000000000f, range=[0x00000000b7d65000-0x00000000b7ffa000) (2MB)
[ 0.000000] efi: mem29: type=4, attr=0xf, range=[0x00000000b7ffa000-0x00000000b8000000) (0MB)
[ 0.000000] efi: mem30: type=7, attr=0xf, range=[0x0000000100000000-0x0000000240000000) (5120MB)
[ 0.000000] efi: mem31: type=11, attr=0x8000000000000000, range=[0x00000000e00f8000-0x00000000e00f9000) (0MB)
[ 0.000000] efi: mem32: type=11, attr=0x8000000000000000, range=[0x00000000fed01000-0x00000000fed02000) (0MB)
[ 0.000000] efi: mem33: type=11, attr=0x8000000000000000, range=[0x00000000ffb00000-0x0000000100000000) (5MB)
[ 0.000000] SMBIOS 2.8 present.
[ 0.000000] DMI: Shuttle Inc. XS36V4/FS36V4, BIOS 1.10 x64 04/18/2014
[ 0.000000] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[ 0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable
[ 0.000000] No AGP bridge found
[ 0.000000] e820: last_pfn = 0x240000 max_arch_pfn = 0x400000000
[ 0.000000] MTRR default type: uncachable
[ 0.000000] MTRR fixed ranges enabled:
[ 0.000000] 00000-9FFFF write-back
[ 0.000000] A0000-BFFFF uncachable
[ 0.000000] C0000-E7FFF write-through
[ 0.000000] E8000-FFFFF write-protect
[ 0.000000] MTRR variable ranges enabled:
[ 0.000000] 0 base 000000000 mask F80000000 write-back
[ 0.000000] 1 base 080000000 mask FC0000000 write-back
[ 0.000000] 2 base 0B8000000 mask FF8000000 uncachable
[ 0.000000] 3 base 100000000 mask F00000000 write-back
[ 0.000000] 4 base 200000000 mask F00000000 write-back
[ 0.000000] 5 disabled
[ 0.000000] 6 disabled
[ 0.000000] 7 disabled
[ 0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
[ 0.000000] e820: update [mem 0xb8000000-0xffffffff] usable ==> reserved
[ 0.000000] e820: last_pfn = 0xb8000 max_arch_pfn = 0x400000000
[ 0.000000] found SMP MP-table at [mem 0x000fd6c0-0x000fd6cf] mapped at [ffff8800000fd6c0]
[ 0.000000] Scanning 1 areas for low memory corruption
[ 0.000000] Base memory trampoline at [ffff880000087000] 87000 size 24576
[ 0.000000] init_memory_mapping: [mem 0x00000000-0x000fffff]
[ 0.000000] [mem 0x00000000-0x000fffff] page 4k
[ 0.000000] BRK [0x02f02000, 0x02f02fff] PGTABLE
[ 0.000000] BRK [0x02f03000, 0x02f03fff] PGTABLE
[ 0.000000] BRK [0x02f04000, 0x02f04fff] PGTABLE
[ 0.000000] init_memory_mapping: [mem 0x23fe00000-0x23fffffff]
[ 0.000000] [mem 0x23fe00000-0x23fffffff] page 2M
[ 0.000000] BRK [0x02f05000, 0x02f05fff] PGTABLE
[ 0.000000] init_memory_mapping: [mem 0x23c000000-0x23fdfffff]
[ 0.000000] [mem 0x23c000000-0x23fdfffff] page 2M
[ 0.000000] init_memory_mapping: [mem 0x200000000-0x23bffffff]
[ 0.000000] [mem 0x200000000-0x23bffffff] page 2M
[ 0.000000] init_memory_mapping: [mem 0x00100000-0x1effffff]
[ 0.000000] [mem 0x00100000-0x001fffff] page 4k
[ 0.000000] [mem 0x00200000-0x1effffff] page 2M
[ 0.000000] init_memory_mapping: [mem 0x20100000-0xb711bfff]
[ 0.000000] [mem 0x20100000-0x201fffff] page 4k
[ 0.000000] [mem 0x20200000-0xb6ffffff] page 2M
[ 0.000000] [mem 0xb7000000-0xb711bfff] page 4k
[ 0.000000] BRK [0x02f06000, 0x02f06fff] PGTABLE
[ 0.000000] BRK [0x02f07000, 0x02f07fff] PGTABLE
[ 0.000000] init_memory_mapping: [mem 0xb7bb3000-0xb7bb3fff]
[ 0.000000] [mem 0xb7bb3000-0xb7bb3fff] page 4k
[ 0.000000] init_memory_mapping: [mem 0xb7bf6000-0xb7d64fff]
[ 0.000000] [mem 0xb7bf6000-0xb7d64fff] page 4k
[ 0.000000] init_memory_mapping: [mem 0xb7ffa000-0xb7ffffff]
[ 0.000000] [mem 0xb7ffa000-0xb7ffffff] page 4k
[ 0.000000] init_memory_mapping: [mem 0x100000000-0x1ffffffff]
[ 0.000000] [mem 0x100000000-0x1ffffffff] page 2M
[ 0.000000] ACPI: RSDP 00000000b7153000 00024 (v02 Shuttl)
[ 0.000000] ACPI: XSDT 00000000b7153080 0007C (v01 Shuttl Shuttle 01072009 AMI 00010013)
[ 0.000000] ACPI: FACP 00000000b715a708 0010C (v05 Shuttl Shuttle 01072009 AMI 00010013)
[ 0.000000] ACPI: DSDT 00000000b7153188 0757F (v02 XS36V4 XS36V400 01072009 INTL 20120913)
[ 0.000000] ACPI: FACS 00000000b78e2f80 00040
[ 0.000000] ACPI: APIC 00000000b715a818 00084 (v03 Shuttl Shuttle 01072009 AMI 00010013)
[ 0.000000] ACPI: FPDT 00000000b715a8a0 00044 (v01 Shuttl Shuttle 01072009 AMI 00010013)
[ 0.000000] ACPI: MCFG 00000000b715a8e8 0003C (v01 Shuttl Shuttle 01072009 MSFT 00000097)
[ 0.000000] ACPI: LPIT 00000000b715a928 00104 (v01 Shuttl Shuttle 00000003 VLV2 0100000D)
[ 0.000000] ACPI: SLIC 00000000b715aa30 00176 (v01 Shuttl Shuttle 01072009 AMI 00010013)
[ 0.000000] ACPI: HPET 00000000b715aba8 00038 (v01 Shuttl Shuttle 01072009 AMI. 00000005)
[ 0.000000] ACPI: SSDT 00000000b715abe0 00763 (v01 PmRef CpuPm 00003000 INTL 20061109)
[ 0.000000] ACPI: SSDT 00000000b715b348 00290 (v01 PmRef Cpu0Tst 00003000 INTL 20061109)
[ 0.000000] ACPI: SSDT 00000000b715b5d8 0017A (v01 PmRef ApTst 00003000 INTL 20061109)
[ 0.000000] ACPI: UEFI 00000000b715b758 00042 (v01 Shuttl Shuttle 00000000 00000000)
[ 0.000000] ACPI: Local APIC address 0xfee00000
[ 0.000000] [ffffea0000000000-ffffea0008ffffff] PMD -> [ffff880237800000-ffff88023f5fffff] on node 0
[ 0.000000] Zone ranges:
[ 0.000000] DMA [mem 0x00001000-0x00ffffff]
[ 0.000000] DMA32 [mem 0x01000000-0xffffffff]
[ 0.000000] Normal [mem 0x100000000-0x23fffffff]
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x00001000-0x0008efff]
[ 0.000000] node 0: [mem 0x00090000-0x0009ffff]
[ 0.000000] node 0: [mem 0x00100000-0x1effffff]
[ 0.000000] node 0: [mem 0x20100000-0xb711bfff]
[ 0.000000] node 0: [mem 0xb7bb3000-0xb7bb3fff]
[ 0.000000] node 0: [mem 0xb7bf6000-0xb7d64fff]
[ 0.000000] node 0: [mem 0xb7ffa000-0xb7ffffff]
[ 0.000000] node 0: [mem 0x100000000-0x23fffffff]
[ 0.000000] On node 0 totalpages: 2056496
[ 0.000000] DMA zone: 64 pages used for memmap
[ 0.000000] DMA zone: 40 pages reserved
[ 0.000000] DMA zone: 3998 pages, LIFO batch:0
[ 0.000000] DMA32 zone: 11591 pages used for memmap
[ 0.000000] DMA32 zone: 741778 pages, LIFO batch:31
[ 0.000000] Normal zone: 20480 pages used for memmap
[ 0.000000] Normal zone: 1310720 pages, LIFO batch:31
[ 0.000000] ACPI: PM-Timer IO Port: 0x408
[ 0.000000] ACPI: Local APIC address 0xfee00000
[ 0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)
[ 0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] enabled)
[ 0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x04] enabled)
[ 0.000000] ACPI: LAPIC (acpi_id[0x04] lapic_id[0x06] enabled)
[ 0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] dfl dfl lint[0x0])
[ 0.000000] ACPI: NMI not connected to LINT 1!
[ 0.000000] ACPI: LAPIC_NMI (acpi_id[0x02] dfl dfl lint[0x0])
[ 0.000000] ACPI: NMI not connected to LINT 1!
[ 0.000000] ACPI: LAPIC_NMI (acpi_id[0x03] dfl dfl lint[0x0])
[ 0.000000] ACPI: NMI not connected to LINT 1!
[ 0.000000] ACPI: LAPIC_NMI (acpi_id[0x04] dfl dfl lint[0x0])
[ 0.000000] ACPI: NMI not connected to LINT 1!
[ 0.000000] ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])
[ 0.000000] IOAPIC[0]: apic_id 1, version 32, address 0xfec00000, GSI 0-86
[ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[ 0.000000] ACPI: IRQ0 used by override.
[ 0.000000] ACPI: IRQ2 used by override.
[ 0.000000] ACPI: IRQ9 used by override.
[ 0.000000] Using ACPI (MADT) for SMP configuration information
[ 0.000000] ACPI: HPET id: 0x8086a201 base: 0xfed00000
[ 0.000000] smpboot: Allowing 4 CPUs, 0 hotplug CPUs
[ 0.000000] nr_irqs_gsi: 103
[ 0.000000] e820: [mem 0xb8000000-0xe00f7fff] available for PCI devices
[ 0.000000] setup_percpu: NR_CPUS:64 nr_cpumask_bits:64 nr_cpu_ids:4 nr_node_ids:1
[ 0.000000] PERCPU: Embedded 27 pages/cpu @ffff88023fc00000 s80192 r8192 d22208 u524288
[ 0.000000] pcpu-alloc: s80192 r8192 d22208 u524288 alloc=1*2097152
[ 0.000000] pcpu-alloc: [0] 0 1 2 3
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 2024321
[ 0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz root=/dev/sda2 rw quiet acpi_enforce_resources=lax video=efifb:off vga=0x318
[ 0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
[ 0.000000] Dentry cache hash table entries: 1048576 (order: 11, 8388608 bytes)
[ 0.000000] Inode-cache hash table entries: 524288 (order: 10, 4194304 bytes)
[ 0.000000] Checking aperture...
[ 0.000000] No AGP bridge found
[ 0.000000] Memory: 7768552k/9437184k available (7985k kernel code, 1211200k absent, 457432k reserved, 5076k data, 1120k init)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[ 0.000000] Preemptible hierarchical RCU implementation.
[ 0.000000] RCU restricting CPUs from NR_CPUS=64 to nr_cpu_ids=4.
[ 0.000000] NR_IRQS:4352 nr_irqs:1024 16
[ 0.000000] Console: colour dummy device 80x25
[ 0.000000] console [tty0] enabled
[ 0.000000] allocated 33030144 bytes of page_cgroup
[ 0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
[ 0.000000] hpet clockevent registered
[ 0.000000] tsc: Fast TSC calibration using PIT
[ 0.001000] tsc: Detected 2000.082 MHz processor
[ 0.000004] Calibrating delay loop (skipped), value calculated using timer frequency.. 4000.16 BogoMIPS (lpj=2000082)
[ 0.000009] pid_max: default: 32768 minimum: 301
[ 0.000039] init_memory_mapping: [mem 0xb78e3000-0xb7b67fff]
[ 0.000043] [mem 0xb78e3000-0xb7b67fff] page 4k
[ 0.000065] init_memory_mapping: [mem 0xb7b68000-0xb7bb2fff]
[ 0.000068] [mem 0xb7b68000-0xb7bb2fff] page 4k
[ 0.000079] init_memory_mapping: [mem 0xb7bb4000-0xb7bf5fff]
[ 0.000082] [mem 0xb7bb4000-0xb7bf5fff] page 4k
[ 0.000092] init_memory_mapping: [mem 0xb7d65000-0xb7ff9fff]
[ 0.000095] [mem 0xb7d65000-0xb7ff9fff] page 4k
[ 0.001287] Security Framework initialized
[ 0.001360] Mount-cache hash table entries: 256
[ 0.001633] Initializing cgroup subsys debug
[ 0.001638] Initializing cgroup subsys memory
[ 0.001652] Initializing cgroup subsys devices
[ 0.001656] Initializing cgroup subsys freezer
[ 0.001660] Initializing cgroup subsys net_cls
[ 0.001663] Initializing cgroup subsys blkio
[ 0.001689] CPU: Physical Processor ID: 0
[ 0.001692] CPU: Processor Core ID: 0
[ 0.001697] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
[ 0.001697] ENERGY_PERF_BIAS: View and update with x86_energy_perf_policy(8)
[ 0.006509] mce: CPU supports 6 MCE banks
[ 0.006520] CPU0: Thermal monitoring enabled (TM1)
[ 0.006529] Last level iTLB entries: 4KB 0, 2MB 0, 4MB 0
[ 0.006529] Last level dTLB entries: 4KB 128, 2MB 0, 4MB 0
[ 0.006529] tlb_flushall_shift: 6
[ 0.006655] Freeing SMP alternatives: 32k freed
[ 0.006671] ACPI: Core revision 20130328
[ 0.018164] ACPI: All ACPI Tables successfully acquired
[ 0.032372] ftrace: allocating 29322 entries in 115 pages
[ 0.051108] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=0 pin2=0
[ 0.061117] smpboot: CPU0: Intel(R) Celeron(R) CPU J1900 @ 1.99GHz (fam: 06, model: 37, stepping: 03)
[ 0.061131] TSC deadline timer enabled
[ 0.061149] Performance Events: no PEBS fmt2+, generic architected perfmon, Intel PMU driver.
[ 0.061159] ... version: 3
[ 0.061162] ... bit width: 40
[ 0.061164] ... generic registers: 2
[ 0.061167] ... value mask: 000000ffffffffff
[ 0.061169] ... max period: 000000007fffffff
[ 0.061171] ... fixed-purpose events: 3
[ 0.061173] ... event mask: 0000000700000003
[ 0.068273] smpboot: Booting Node 0, Processors #1 #2 #3 OK
[ 0.126075] Brought up 4 CPUs
[ 0.126081] smpboot: Total of 4 processors activated (16000.65 BogoMIPS)
[ 0.126936] devtmpfs: initialized
[ 0.127354] PM: Registering ACPI NVS region [mem 0x0008f000-0x0008ffff] (4096 bytes)
[ 0.127359] PM: Registering ACPI NVS region [mem 0xb715c000-0xb78e2fff] (7892992 bytes)
[ 0.129228] xor: measuring software checksum speed
[ 0.139079] prefetch64-sse: 6648.000 MB/sec
[ 0.149100] generic_sse: 5960.000 MB/sec
[ 0.149103] xor: using function: prefetch64-sse (6648.000 MB/sec)
[ 0.149109] pinctrl core: initialized pinctrl subsystem
[ 0.149221] NET: Registered protocol family 16
[ 0.149490] ACPI FADT declares the system doesn't support PCIe ASPM, so disable it
[ 0.149495] ACPI: bus type PCI registered
[ 0.149579] PCI: Using configuration type 1 for base access
[ 0.152040] bio: create slab <bio-0> at 0
[ 0.169260] raid6: sse2x1 582 MB/s
[ 0.186240] raid6: sse2x2 660 MB/s
[ 0.203258] raid6: sse2x4 1136 MB/s
[ 0.203261] raid6: using algorithm sse2x4 (1136 MB/s)
[ 0.203264] raid6: using ssse3x2 recovery algorithm
[ 0.203362] ACPI: Added _OSI(Module Device)
[ 0.203367] ACPI: Added _OSI(Processor Device)
[ 0.203370] ACPI: Added _OSI(3.0 _SCP Extensions)
[ 0.203373] ACPI: Added _OSI(Processor Aggregator Device)
[ 0.206540] ACPI: EC: Look up EC in DSDT
[ 0.221204] ACPI: SSDT 00000000b7144c18 003BC (v01 PmRef Cpu0Ist 00003000 INTL 20061109)
[ 0.221995] ACPI: Dynamic OEM Table Load:
[ 0.222001] ACPI: SSDT (null) 003BC (v01 PmRef Cpu0Ist 00003000 INTL 20061109)
[ 0.222214] ACPI: SSDT 00000000b7143918 00433 (v01 PmRef Cpu0Cst 00003001 INTL 20061109)
[ 0.222989] ACPI: Dynamic OEM Table Load:
[ 0.222994] ACPI: SSDT (null) 00433 (v01 PmRef Cpu0Cst 00003001 INTL 20061109)
[ 0.228833] ACPI: SSDT 00000000b7145e18 0015F (v01 PmRef ApIst 00003000 INTL 20061109)
[ 0.229658] ACPI: Dynamic OEM Table Load:
[ 0.229663] ACPI: SSDT (null) 0015F (v01 PmRef ApIst 00003000 INTL 20061109)
[ 0.232507] ACPI: SSDT 00000000b7146f18 0008D (v01 PmRef ApCst 00003000 INTL 20061109)
[ 0.233282] ACPI: Dynamic OEM Table Load:
[ 0.233287] ACPI: SSDT (null) 0008D (v01 PmRef ApCst 00003000 INTL 20061109)
[ 0.236655] ACPI: Interpreter enabled
[ 0.236667] ACPI Exception: AE_NOT_FOUND, While evaluating Sleep State [\_S1_] (20130328/hwxface-568)
[ 0.236677] ACPI Exception: AE_NOT_FOUND, While evaluating Sleep State [\_S2_] (20130328/hwxface-568)
[ 0.236699] ACPI: (supports S0 S3 S5)
[ 0.236703] ACPI: Using IOAPIC for interrupt routing
[ 0.236762] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[ 0.849396] ACPI: Power Resource [USBC] (on)
[ 0.849831] ACPI: Power Resource [FN00] (off)
[ 0.850958] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[ 0.851863] PCI host bridge to bus 0000:00
[ 0.851870] pci_bus 0000:00: root bus resource [bus 00-ff]
[ 0.851875] pci_bus 0000:00: root bus resource [io 0x0000-0x006f]
[ 0.851879] pci_bus 0000:00: root bus resource [io 0x0078-0x0cf7]
[ 0.851883] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff]
[ 0.851888] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff]
[ 0.851892] pci_bus 0000:00: root bus resource [mem 0x000c0000-0x000dffff]
[ 0.851896] pci_bus 0000:00: root bus resource [mem 0x000e0000-0x000fffff]
[ 0.851900] pci_bus 0000:00: root bus resource [mem 0xc0000000-0xd0816fff]
[ 0.851913] pci 0000:00:00.0: [8086:0f00] type 00 class 0x060000
[ 0.852106] pci 0000:00:02.0: [8086:0f31] type 00 class 0x030000
[ 0.852123] pci 0000:00:02.0: reg 10: [mem 0xd0000000-0xd03fffff]
[ 0.852137] pci 0000:00:02.0: reg 18: [mem 0xc0000000-0xcfffffff pref]
[ 0.852150] pci 0000:00:02.0: reg 20: [io 0xf080-0xf087]
[ 0.852361] pci 0000:00:13.0: [8086:0f23] type 00 class 0x010601
[ 0.852385] pci 0000:00:13.0: reg 10: [io 0xf070-0xf077]
[ 0.852396] pci 0000:00:13.0: reg 14: [io 0xf060-0xf063]
[ 0.852408] pci 0000:00:13.0: reg 18: [io 0xf050-0xf057]
[ 0.852419] pci 0000:00:13.0: reg 1c: [io 0xf040-0xf043]
[ 0.852430] pci 0000:00:13.0: reg 20: [io 0xf020-0xf03f]
[ 0.852442] pci 0000:00:13.0: reg 24: [mem 0xd0816000-0xd08167ff]
[ 0.852493] pci 0000:00:13.0: PME# supported from D3hot
[ 0.852676] pci 0000:00:14.0: [8086:0f35] type 00 class 0x0c0330
[ 0.852699] pci 0000:00:14.0: reg 10: [mem 0xd0800000-0xd080ffff 64bit]
[ 0.852763] pci 0000:00:14.0: PME# supported from D3hot D3cold
[ 0.852914] pci 0000:00:14.0: System wakeup disabled by ACPI
[ 0.852985] pci 0000:00:1a.0: [8086:0f18] type 00 class 0x108000
[ 0.853015] pci 0000:00:1a.0: reg 10: [mem 0xd0500000-0xd05fffff]
[ 0.853030] pci 0000:00:1a.0: reg 14: [mem 0xd0400000-0xd04fffff]
[ 0.853139] pci 0000:00:1a.0: PME# supported from D0 D3hot
[ 0.853315] pci 0000:00:1b.0: [8086:0f04] type 00 class 0x040300
[ 0.853342] pci 0000:00:1b.0: reg 10: [mem 0xd0810000-0xd0813fff 64bit]
[ 0.853418] pci 0000:00:1b.0: PME# supported from D0 D3hot D3cold
[ 0.853585] pci 0000:00:1c.0: [8086:0f48] type 01 class 0x060400
[ 0.853658] pci 0000:00:1c.0: PME# supported from D0 D3hot D3cold
[ 0.853827] pci 0000:00:1c.1: [8086:0f4a] type 01 class 0x060400
[ 0.853892] pci 0000:00:1c.1: PME# supported from D0 D3hot D3cold
[ 0.854059] pci 0000:00:1c.2: [8086:0f4c] type 01 class 0x060400
[ 0.854125] pci 0000:00:1c.2: PME# supported from D0 D3hot D3cold
[ 0.854292] pci 0000:00:1c.3: [8086:0f4e] type 01 class 0x060400
[ 0.854358] pci 0000:00:1c.3: PME# supported from D0 D3hot D3cold
[ 0.854535] pci 0000:00:1f.0: [8086:0f1c] type 00 class 0x060100
[ 0.854780] pci 0000:00:1f.3: [8086:0f12] type 00 class 0x0c0500
[ 0.854819] pci 0000:00:1f.3: reg 10: [mem 0xd0814000-0xd081401f]
[ 0.854893] pci 0000:00:1f.3: reg 20: [io 0xf000-0xf01f]
[ 0.855217] pci 0000:01:00.0: [10ec:8179] type 00 class 0x028000
[ 0.855238] pci 0000:01:00.0: reg 10: [io 0xe000-0xe0ff]
[ 0.855273] pci 0000:01:00.0: reg 18: [mem 0xd0700000-0xd0703fff 64bit]
[ 0.855373] pci 0000:01:00.0: supports D1 D2
[ 0.855377] pci 0000:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[ 0.855423] pci 0000:01:00.0: System wakeup disabled by ACPI
[ 0.856629] pci 0000:00:1c.0: PCI bridge to [bus 01]
[ 0.856636] pci 0000:00:1c.0: bridge window [io 0xe000-0xefff]
[ 0.856642] pci 0000:00:1c.0: bridge window [mem 0xd0700000-0xd07fffff]
[ 0.856730] pci 0000:02:00.0: [10ec:5289] type 00 class 0xff0000
[ 0.856750] pci 0000:02:00.0: reg 10: [mem 0xd0600000-0xd060ffff]
[ 0.856878] pci 0000:02:00.0: supports D1 D2
[ 0.856882] pci 0000:02:00.0: PME# supported from D1 D2 D3hot D3cold
[ 0.856934] pci 0000:02:00.0: System wakeup disabled by ACPI
[ 0.857012] pci 0000:02:00.2: [10ec:8168] type 00 class 0x020000
[ 0.857032] pci 0000:02:00.2: reg 10: [io 0xd000-0xd0ff]
[ 0.857063] pci 0000:02:00.2: reg 18: [mem 0xd0614000-0xd0614fff 64bit pref]
[ 0.857083] pci 0000:02:00.2: reg 20: [mem 0xd0610000-0xd0613fff 64bit pref]
[ 0.857161] pci 0000:02:00.2: supports D1 D2
[ 0.857166] pci 0000:02:00.2: PME# supported from D0 D1 D2 D3hot D3cold
[ 0.857221] pci 0000:02:00.2: System wakeup disabled by ACPI
[ 0.858636] pci 0000:00:1c.1: PCI bridge to [bus 02]
[ 0.858643] pci 0000:00:1c.1: bridge window [io 0xd000-0xdfff]
[ 0.858649] pci 0000:00:1c.1: bridge window [mem 0xd0600000-0xd06fffff]
[ 0.858717] pci 0000:00:1c.2: PCI bridge to [bus 03]
[ 0.858786] pci 0000:00:1c.3: PCI bridge to [bus 04]
[ 0.858811] pci_bus 0000:00: on NUMA node 0
[ 0.859024] acpi PNP0A08:00: Unable to request _OSC control (_OSC support mask: 0x1e)
[ 1.060595] ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 10 *11 12 14 15)
[ 1.060738] ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 6 *10 11 12 14 15)
[ 1.060882] ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 *5 6 10 11 12 14 15)
[ 1.061033] ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 6 *10 11 12 14 15)
[ 1.061174] ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 *5 6 10 11 12 14 15)
[ 1.061314] ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 6 10 11 12 14 15) *0, disabled.
[ 1.061456] ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 10 *11 12 14 15)
[ 1.061597] ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 6 10 *11 12 14 15)
[ 1.062268] ACPI: Enabled 6 GPEs in block 00 to 3F
[ 1.062284] acpi root: \_SB_.PCI0 notify handler is installed
[ 1.062391] Found 1 acpi root devices
[ 1.062575] vgaarb: device added: PCI:0000:00:02.0,decodes=io+mem,owns=io+mem,locks=none
[ 1.062582] vgaarb: loaded
[ 1.062584] vgaarb: bridge control possible 0000:00:02.0
[ 1.062688] SCSI subsystem initialized
[ 1.062693] ACPI: bus type ATA registered
[ 1.062786] libata version 3.00 loaded.
[ 1.062827] ACPI: bus type USB registered
[ 1.062863] usbcore: registered new interface driver usbfs
[ 1.062880] usbcore: registered new interface driver hub
[ 1.062925] usbcore: registered new device driver usb
[ 1.062977] pps_core: LinuxPPS API ver. 1 registered
[ 1.062980] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[ 1.062988] PTP clock support registered
[ 1.063147] Advanced Linux Sound Architecture Driver Initialized.
[ 1.063151] PCI: Using ACPI for IRQ routing
[ 1.063156] PCI: pci_cache_line_size set to 64 bytes
[ 1.063208] e820: reserve RAM buffer [mem 0x0008f000-0x0008ffff]
[ 1.063212] e820: reserve RAM buffer [mem 0x1f000000-0x1fffffff]
[ 1.063215] e820: reserve RAM buffer [mem 0xb711c000-0xb7ffffff]
[ 1.063219] e820: reserve RAM buffer [mem 0xb7bb4000-0xb7ffffff]
[ 1.063222] e820: reserve RAM buffer [mem 0xb7d65000-0xb7ffffff]
[ 1.063504] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0
[ 1.063513] hpet0: 3 comparators, 64-bit 14.318180 MHz counter
[ 1.065540] Switching to clocksource hpet
[ 1.075332] pnp: PnP ACPI init
[ 1.075358] ACPI: bus type PNP registered
[ 1.075439] pnp 00:00: Plug and Play ACPI device, IDs PNP0b00 (active)
[ 1.075554] pnp 00:01: Plug and Play ACPI device, IDs PNP0103 (active)
[ 1.075740] pnp 00:02: Plug and Play ACPI device, IDs INT0800 (active)
[ 1.075827] system 00:03: [io 0x0680-0x069f] has been reserved
[ 1.075833] system 00:03: [io 0x0400-0x047f] has been reserved
[ 1.075838] system 00:03: [io 0x0500-0x05fe] has been reserved
[ 1.075843] system 00:03: [io 0x0600-0x061f] has been reserved
[ 1.075849] system 00:03: Plug and Play ACPI device, IDs PNP0c02 (active)
[ 1.076171] system 00:04: [io 0x0a00-0x0a2f] has been reserved
[ 1.076177] system 00:04: [io 0x0a30-0x0a3f] has been reserved
[ 1.076181] system 00:04: [io 0x0a40-0x0a4f] has been reserved
[ 1.076187] system 00:04: Plug and Play ACPI device, IDs PNP0c02 (active)
[ 1.076725] pnp 00:05: [dma 0 disabled]
[ 1.076821] pnp 00:05: Plug and Play ACPI device, IDs PNP0501 (active)
[ 1.077330] pnp 00:06: [dma 0 disabled]
[ 1.077423] pnp 00:06: Plug and Play ACPI device, IDs PNP0501 (active)
[ 1.277023] system 00:07: [mem 0xe0000000-0xefffffff] could not be reserved
[ 1.277029] system 00:07: [mem 0xfed01000-0xfed01fff] has been reserved
[ 1.277034] system 00:07: [mem 0xfed03000-0xfed03fff] has been reserved
[ 1.277038] system 00:07: [mem 0xfed04000-0xfed04fff] has been reserved
[ 1.277043] system 00:07: [mem 0xfed0c000-0xfed0ffff] has been reserved
[ 1.277048] system 00:07: [mem 0xfed08000-0xfed08fff] has been reserved
[ 1.277052] system 00:07: [mem 0xfed1c000-0xfed1cfff] has been reserved
[ 1.277057] system 00:07: [mem 0xfee00000-0xfeefffff] has been reserved
[ 1.277061] system 00:07: [mem 0xfef00000-0xfeffffff] has been reserved
[ 1.277068] system 00:07: Plug and Play ACPI device, IDs PNP0c02 (active)
[ 1.277450] pnp: PnP ACPI: found 8 devices
[ 1.277454] ACPI: bus type PNP unregistered
[ 1.286344] pci 0000:00:1c.0: bridge window [mem 0x00100000-0x000fffff 64bit pref] to [bus 01] add_size 200000
[ 1.286357] pci 0000:00:1c.1: bridge window [mem 0x00100000-0x000fffff 64bit pref] to [bus 02] add_size 200000
[ 1.286368] pci 0000:00:1c.2: bridge window [io 0x1000-0x0fff] to [bus 03] add_size 1000
[ 1.286373] pci 0000:00:1c.2: bridge window [mem 0x00100000-0x000fffff 64bit pref] to [bus 03] add_size 200000
[ 1.286378] pci 0000:00:1c.2: bridge window [mem 0x00100000-0x000fffff] to [bus 03] add_size 200000
[ 1.286388] pci 0000:00:1c.3: bridge window [io 0x1000-0x0fff] to [bus 04] add_size 1000
[ 1.286393] pci 0000:00:1c.3: bridge window [mem 0x00100000-0x000fffff 64bit pref] to [bus 04] add_size 200000
[ 1.286398] pci 0000:00:1c.3: bridge window [mem 0x00100000-0x000fffff] to [bus 04] add_size 200000
[ 1.286409] pci 0000:00:1c.0: res[9]=[mem 0x00100000-0x000fffff 64bit pref] get_res_add_size add_size 200000
[ 1.286414] pci 0000:00:1c.1: res[9]=[mem 0x00100000-0x000fffff 64bit pref] get_res_add_size add_size 200000
[ 1.286418] pci 0000:00:1c.2: res[8]=[mem 0x00100000-0x000fffff] get_res_add_size add_size 200000
[ 1.286423] pci 0000:00:1c.2: res[9]=[mem 0x00100000-0x000fffff 64bit pref] get_res_add_size add_size 200000
[ 1.286427] pci 0000:00:1c.3: res[8]=[mem 0x00100000-0x000fffff] get_res_add_size add_size 200000
[ 1.286432] pci 0000:00:1c.3: res[9]=[mem 0x00100000-0x000fffff 64bit pref] get_res_add_size add_size 200000
[ 1.286436] pci 0000:00:1c.2: res[7]=[io 0x1000-0x0fff] get_res_add_size add_size 1000
[ 1.286441] pci 0000:00:1c.3: res[7]=[io 0x1000-0x0fff] get_res_add_size add_size 1000
[ 1.286450] pci 0000:00:1c.0: BAR 9: can't assign mem pref (size 0x200000)
[ 1.286457] pci 0000:00:1c.1: BAR 9: can't assign mem pref (size 0x200000)
[ 1.286463] pci 0000:00:1c.2: BAR 8: can't assign mem (size 0x200000)
[ 1.286469] pci 0000:00:1c.2: BAR 9: can't assign mem pref (size 0x200000)
[ 1.286474] pci 0000:00:1c.3: BAR 8: can't assign mem (size 0x200000)
[ 1.286480] pci 0000:00:1c.3: BAR 9: can't assign mem pref (size 0x200000)
[ 1.286487] pci 0000:00:1c.2: BAR 7: assigned [io 0x1000-0x1fff]
[ 1.286492] pci 0000:00:1c.3: BAR 7: assigned [io 0x2000-0x2fff]
[ 1.286500] pci 0000:00:1c.3: BAR 8: can't assign mem (size 0x200000)
[ 1.286506] pci 0000:00:1c.3: BAR 9: can't assign mem pref (size 0x200000)
[ 1.286512] pci 0000:00:1c.2: BAR 8: can't assign mem (size 0x200000)
[ 1.286518] pci 0000:00:1c.2: BAR 9: can't assign mem pref (size 0x200000)
[ 1.286524] pci 0000:00:1c.1: BAR 9: can't assign mem pref (size 0x200000)
[ 1.286530] pci 0000:00:1c.0: BAR 9: can't assign mem pref (size 0x200000)
[ 1.286535] pci 0000:00:1c.0: PCI bridge to [bus 01]
[ 1.286540] pci 0000:00:1c.0: bridge window [io 0xe000-0xefff]
[ 1.286547] pci 0000:00:1c.0: bridge window [mem 0xd0700000-0xd07fffff]
[ 1.286557] pci 0000:00:1c.1: PCI bridge to [bus 02]
[ 1.286573] pci 0000:00:1c.1: bridge window [io 0xd000-0xdfff]
[ 1.286580] pci 0000:00:1c.1: bridge window [mem 0xd0600000-0xd06fffff]
[ 1.286589] pci 0000:00:1c.2: PCI bridge to [bus 03]
[ 1.286593] pci 0000:00:1c.2: bridge window [io 0x1000-0x1fff]
[ 1.286605] pci 0000:00:1c.3: PCI bridge to [bus 04]
[ 1.286609] pci 0000:00:1c.3: bridge window [io 0x2000-0x2fff]
[ 1.287114] pci_bus 0000:00: resource 4 [io 0x0000-0x006f]
[ 1.287120] pci_bus 0000:00: resource 5 [io 0x0078-0x0cf7]
[ 1.287124] pci_bus 0000:00: resource 6 [io 0x0d00-0xffff]
[ 1.287128] pci_bus 0000:00: resource 7 [mem 0x000a0000-0x000bffff]
[ 1.287132] pci_bus 0000:00: resource 8 [mem 0x000c0000-0x000dffff]
[ 1.287136] pci_bus 0000:00: resource 9 [mem 0x000e0000-0x000fffff]
[ 1.287140] pci_bus 0000:00: resource 10 [mem 0xc0000000-0xd0816fff]
[ 1.287145] pci_bus 0000:01: resource 0 [io 0xe000-0xefff]
[ 1.287149] pci_bus 0000:01: resource 1 [mem 0xd0700000-0xd07fffff]
[ 1.287153] pci_bus 0000:02: resource 0 [io 0xd000-0xdfff]
[ 1.287157] pci_bus 0000:02: resource 1 [mem 0xd0600000-0xd06fffff]
[ 1.287161] pci_bus 0000:03: resource 0 [io 0x1000-0x1fff]
[ 1.287165] pci_bus 0000:04: resource 0 [io 0x2000-0x2fff]
[ 1.287217] NET: Registered protocol family 2
[ 1.287555] TCP established hash table entries: 65536 (order: 8, 1048576 bytes)
[ 1.287898] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
[ 1.288231] TCP: Hash tables configured (established 65536 bind 65536)
[ 1.288295] TCP: reno registered
[ 1.288306] UDP hash table entries: 4096 (order: 5, 131072 bytes)
[ 1.288368] UDP-Lite hash table entries: 4096 (order: 5, 131072 bytes)
[ 1.288545] NET: Registered protocol family 1
[ 1.288740] RPC: Registered named UNIX socket transport module.
[ 1.288744] RPC: Registered udp transport module.
[ 1.288746] RPC: Registered tcp transport module.
[ 1.288749] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 1.288765] pci 0000:00:02.0: Boot video device
[ 1.289102] PCI: CLS 64 bytes, default 64
[ 1.289182] PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
[ 1.289188] software IO TLB [mem 0xa4ae6000-0xa8ae6000] (64MB) mapped at [ffff8800a4ae6000-ffff8800a8ae5fff]
[ 1.289471] Scanning for low memory corruption every 60 seconds
[ 1.289627] Uptime: system uptime restrictions enabled
[ 1.337796] NFS: Registering the id_resolver key type
[ 1.337824] Key type id_resolver registered
[ 1.337827] Key type id_legacy registered
[ 1.338135] bio: create slab <bio-1> at 1
[ 1.338342] Btrfs loaded
[ 1.338486] aufs 3.10-20130819
[ 1.338495] msgmni has been set to 15629
[ 1.339059] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[ 1.339064] io scheduler noop registered
[ 1.339067] io scheduler deadline registered
[ 1.339077] io scheduler cfq registered (default)
[ 1.339347] byt_gpio byt_gpio.2: GPIO interrupt error, pins misconfigured
[ 1.339507] byt_gpio byt_gpio.2: Gpio 1 interrupt flood, disabling
[ 1.339668] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
[ 1.339719] intel_idle: does not run on family 6 model 55
[ 1.339838] input: Power Button as /devices/LNXSYSTM:00/device:00/PNP0C0C:00/input/input0
[ 1.339847] ACPI: Power Button [PWRB]
[ 1.339915] input: Sleep Button as /devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input1
[ 1.339921] ACPI: Sleep Button [SLPB]
[ 1.339984] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input2
[ 1.339989] ACPI: Power Button [PWRF]
[ 1.340115] ACPI: Fan [FAN0] (off)
[ 1.340227] ACPI: Requesting acpi_cpufreq
[ 1.343233] Monitor-Mwait will be used to enter C-1 state
[ 1.343262] Monitor-Mwait will be used to enter C-2 state
[ 1.343317] ACPI: acpi_idle registered with cpuidle
[ 1.550964] thermal LNXTHERM:00: registered as thermal_zone0
[ 1.550970] ACPI: Thermal Zone [TZ01] (27 C)
[ 1.575624] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[ 1.596370] 00:05: ttyS0 at I/O 0x3f8 (irq = 3) is a 16550A
[ 1.617140] 00:06: ttyS1 at I/O 0x2f8 (irq = 4) is a 16550A
[ 1.617787] Linux agpgart interface v0.103
[ 1.617834] [drm] Initialized drm 1.1.0 20060810
[ 1.618422] [drm] Memory usable by graphics device = 2048M
[ 1.618433] i915 0000:00:02.0: setting latency timer to 64
[ 1.623040] i915 0000:00:02.0: irq 103 for MSI/MSI-X
[ 1.623058] [drm] Supports vblank timestamp caching Rev 1 (10.10.2010).
[ 1.623061] [drm] Driver supports precise vblank timestamp query.
[ 1.623156] vgaarb: device changed decodes: PCI:0000:00:02.0,olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 1.641576] [drm] failed to retrieve link info, disabling eDP
[ 1.738888] fbcon: inteldrmfb (fb0) is primary device
[ 1.985947] Console: switching to colour frame buffer device 170x48
[ 1.993260] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
[ 1.993264] i915 0000:00:02.0: registered panic notifier
[ 2.000617] acpi device:0a: registered as cooling_device5
[ 2.000659] ACPI: Video Device [GFX0] (multi-head: yes rom: no post: no)
[ 2.000723] input: Video Bus as /devices/LNXSYSTM:00/device:00/PNP0A08:00/LNXVIDEO:00/input/input3
[ 2.000754] [drm] Initialized i915 1.6.0 20080730 for 0000:00:02.0 on minor 0
[ 2.003145] brd: module loaded
[ 2.004417] loop: module loaded
[ 2.004510] ahci 0000:00:13.0: version 3.0
[ 2.004720] ahci 0000:00:13.0: irq 104 for MSI/MSI-X
[ 2.015593] ahci 0000:00:13.0: AHCI 0001.0300 32 slots 2 ports 3 Gbps 0x1 impl SATA mode
[ 2.015600] ahci 0000:00:13.0: flags: 64bit ncq pm led clo pio slum part deso sadm apst
[ 2.015607] ahci 0000:00:13.0: setting latency timer to 64
[ 2.015994] scsi0 : ahci
[ 2.016126] scsi1 : ahci
[ 2.016195] ata1: SATA max UDMA/133 abar m2048@0xd0816000 port 0xd0816100 irq 104
[ 2.016199] ata2: DUMMY
[ 2.016306] pcnet32: pcnet32.c:v1.35 21.Apr.2008 tsbogend@alpha.franken.de
[ 2.016344] e100: Intel(R) PRO/100 Network Driver, 3.5.24-k2-NAPI
[ 2.016347] e100: Copyright(c) 1999-2006 Intel Corporation
[ 2.016369] e1000: Intel(R) PRO/1000 Network Driver - version 7.3.21-k8-NAPI
[ 2.016371] e1000: Copyright (c) 1999-2006 Intel Corporation.
[ 2.016392] e1000e: Intel(R) PRO/1000 Network Driver - 2.3.2-k
[ 2.016394] e1000e: Copyright(c) 1999 - 2013 Intel Corporation.
[ 2.016467] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 2.016470] ehci-pci: EHCI PCI platform driver
[ 2.016660] xhci_hcd 0000:00:14.0: setting latency timer to 64
[ 2.016666] xhci_hcd 0000:00:14.0: xHCI Host Controller
[ 2.016676] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 1
[ 2.017076] xhci_hcd 0000:00:14.0: cache line size of 64 is not supported
[ 2.017106] xhci_hcd 0000:00:14.0: irq 105 for MSI/MSI-X
[ 2.017328] xHCI xhci_add_endpoint called for root hub
[ 2.017332] xHCI xhci_check_bandwidth called for root hub
[ 2.017380] hub 1-0:1.0: USB hub found
[ 2.017394] hub 1-0:1.0: 6 ports detected
[ 2.018178] xhci_hcd 0000:00:14.0: xHCI Host Controller
[ 2.018186] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 2
[ 2.018343] xHCI xhci_add_endpoint called for root hub
[ 2.018346] xHCI xhci_check_bandwidth called for root hub
[ 2.018392] hub 2-0:1.0: USB hub found
[ 2.018401] hub 2-0:1.0: 1 port detected
[ 2.025634] usbcore: registered new interface driver usb-storage
[ 2.025685] i8042: PNP: No PS/2 controller found. Probing ports directly.
[ 2.291593] tsc: Refined TSC clocksource calibration: 1999.999 MHz
[ 2.291600] Switching to clocksource tsc
[ 2.546595] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[ 2.546899] ata1.00: ATA-8: INTEL SSDSA2CW120G3, 4PC10362, max UDMA/133
[ 2.546905] ata1.00: 234441648 sectors, multi 16: LBA48 NCQ (depth 31/32)
[ 2.547226] ata1.00: configured for UDMA/133
[ 2.547383] scsi 0:0:0:0: Direct-Access ATA INTEL SSDSA2CW12 4PC1 PQ: 0 ANSI: 5
[ 2.547619] sd 0:0:0:0: Attached scsi generic sg0 type 0
[ 2.547745] sd 0:0:0:0: [sda] 234441648 512-byte logical blocks: (120 GB/111 GiB)
[ 2.547899] sd 0:0:0:0: [sda] Write Protect is off
[ 2.547905] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
[ 2.547955] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 2.550750] sda: sda1 sda2 sda3
[ 2.551305] sd 0:0:0:0: [sda] Attached SCSI disk
[ 2.799581] usb 1-3: new full-speed USB device number 2 using xhci_hcd
[ 2.811010] usb 1-3: ep 0x81 - rounding interval to 1024 microframes, ep desc says 2040 microframes
[ 2.811237] hub 1-3:1.0: USB hub found
[ 2.811337] hub 1-3:1.0: 4 ports detected
[ 2.964581] usb 1-4: new high-speed USB device number 3 using xhci_hcd
[ 2.977246] hub 1-4:1.0: USB hub found
[ 2.977486] hub 1-4:1.0: 4 ports detected
[ 3.068301] i8042: No controller found
[ 3.068488] mousedev: PS/2 mouse device common for all mice
[ 3.069013] ACPI Warning: 0x000000000000f000-0x000000000000f01f SystemIO conflicts with Region \_SB_.PCI0.SBUS.SMBI 1 (20130328/utaddress-251)
[ 3.069023] ACPI: This conflict may cause random problems and system instability
[ 3.069026] ACPI: If an ACPI driver is available for this device, you should use it instead of the native driver
[ 3.069078] i801_smbus 0000:00:1f.3: SMBus using PCI Interrupt
[ 3.069149] md: linear personality registered for level -1
[ 3.069153] md: raid0 personality registered for level 0
[ 3.069156] md: raid1 personality registered for level 1
[ 3.069158] md: raid10 personality registered for level 10
[ 3.069161] md: multipath personality registered for level -4
[ 3.069164] md: faulty personality registered for level -5
[ 3.069333] device-mapper: ioctl: 4.24.0-ioctl (2013-01-15) initialised: dm-devel@redhat.com
[ 3.069468] cpuidle: using governor ladder
[ 3.069622] cpuidle: using governor menu
[ 3.069639] sdhci: Secure Digital Host Controller Interface driver
[ 3.069642] sdhci: Copyright(c) Pierre Ossman
[ 3.069729] usbcore: registered new interface driver usbhid
[ 3.069732] usbhid: USB HID core driver
[ 3.070009] snd_hda_intel 0000:00:1b.0: irq 106 for MSI/MSI-X
[ 3.070052] snd_hda_intel 0000:00:1b.0: setting latency timer to 64
[ 3.073621] usb 1-3.1: new full-speed USB device number 4 using xhci_hcd
[ 3.116694] usb 1-3.1: ep 0x81 - rounding interval to 64 microframes, ep desc says 80 microframes
[ 3.116703] usb 1-3.1: ep 0x82 - rounding interval to 64 microframes, ep desc says 80 microframes
[ 3.116709] usb 1-3.1: ep 0x83 - rounding interval to 32 microframes, ep desc says 40 microframes
[ 3.125105] oprofile: using NMI interrupt.
[ 3.125210] u32 classifier
[ 3.125214] Actions configured
[ 3.125320] TCP: cubic registered
[ 3.125511] NET: Registered protocol family 10
[ 3.125776] sit: IPv6 over IPv4 tunneling driver
[ 3.125954] NET: Registered protocol family 17
[ 3.125993] Key type dns_resolver registered
[ 3.127092] input: Chicony USB Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.1/1-3.1:1.0/input/input4
[ 3.127179] hid-generic 0003:04F2:0402.0001: input: USB HID v1.11 Keyboard [Chicony USB Keyboard] on usb-0000:00:14.0-3.1/input0
[ 3.127234] console [netcon0] enabled
[ 3.127238] netconsole: network logging started
[ 3.128375] ALSA device list:
[ 3.128379] #0: HDA Intel PCH at 0xd0810000 irq 106
[ 3.168416] input: Chicony USB Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.1/1-3.1:1.1/input/input5
[ 3.168617] hid-generic 0003:04F2:0402.0002: input: USB HID v1.11 Device [Chicony USB Keyboard] on usb-0000:00:14.0-3.1/input1
[ 3.176644] input: Chicony USB Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.1/1-3.1:1.2/input/input6
[ 3.177442] hid-generic 0003:04F2:0402.0003: input: USB HID v1.10 Mouse [Chicony USB Keyboard] on usb-0000:00:14.0-3.1/input2
[ 3.177646] md: Waiting for all devices to be available before autodetect
[ 3.177655] md: If you don't use raid, use raid=noautodetect
[ 3.178069] md: Autodetecting RAID arrays.
[ 3.178075] md: Scanned 0 and added 0 devices.
[ 3.178078] md: autorun ...
[ 3.178081] md: ... autorun DONE.
[ 3.181129] kjournald starting. Commit interval 5 seconds
[ 3.181349] EXT3-fs (sda2): using internal journal
[ 3.181356] EXT3-fs (sda2): mounted filesystem with ordered data mode
[ 3.181377] VFS: Mounted root (ext3 filesystem) on device 8:2.
[ 3.181884] devtmpfs: mounted
[ 3.184335] Freeing unused kernel memory: 1120k freed
[ 3.184748] Write protecting the kernel read-only data: 12288k
[ 3.186869] Freeing unused kernel memory: 200k freed
[ 3.190950] Freeing unused kernel memory: 744k freed
[ 3.262544] Adding 5860348k swap on /dev/sda3. Priority:-1 extents:1 across:5860348k SS
[ 3.298956] udevd[96]: starting version 182
[ 3.411175] r8169 Gigabit Ethernet driver 2.3LK-NAPI loaded
[ 3.411492] r8169 0000:02:00.2: irq 107 for MSI/MSI-X
[ 3.411794] r8169 0000:02:00.2 eth0: RTL8411 at 0xffffc90000022000, xx:xx:xx:xx:xx:xx, XID 08800800 IRQ 107
[ 3.411799] r8169 0000:02:00.2 eth0: jumbo features [frames: 9200 bytes, tx checksumming: ko]
[ 3.629823] i2c /dev entries driver
[ 3.647364] cfg80211: Calling CRDA to update world regulatory domain
[ 3.650624] Intel(R) Wireless WiFi driver for Linux, in-tree:
[ 3.650630] Copyright(c) 2003-2013 Intel Corporation
[ 6.547853] r8169 0000:02:00.2 eth0: link down
[ 6.547865] r8169 0000:02:00.2 eth0: link down
[ 6.547912] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 8.180496] r8169 0000:02:00.2 eth0: link up
[ 8.180514] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 10.283515] r8169 0000:02:00.2 eth0: link down
[ 10.283525] r8169 0000:02:00.2 eth0: link down
[ 10.283573] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 11.906696] r8169 0000:02:00.2 eth0: link up
[ 11.906725] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

上のカーネル・ログには、DE3815TYKHEと比較していくつか気になる点も存在するのですが、カーネルの動作に影響を及ぼすようなエラーはないようです。

ちなみに、EthernetデバイスはRTL8411という型番のようですね。Realtekのサイトで確認すると、このデバイスはEthernet ControllerとCard Reader Controllerの統合チップのようです。上のdmesgコマンドの出力情報によると、r8169ドライバのロードと初期化処理が実行されていることが判ります。ifconfigコマンドで確認すると、やはりeth0インターフェースが生成されていました。Valley Island BSP Dasiy 1.6.2にはRTL8168/8169/8111ドライバが組み込まれていますが、このドライバはRTL8411にも対応しているのでしょう。

じつは、上記の各コマンドはシリアル端末からYocto Linuxへログインした状態で実行しました。Valley Island BSPからビルドしたイメージの/etc/inittab内には、シリアル・デバイス/dev/ttyS0(COM1に相当)に対するgetty起動設定が存在しています。そのため、シリアル経由で接続したPC側で端末ソフトを起動していれば、カーネルのブート後にログイン・プロンプトが表示されます。こういう環境を欲しかったことがXS36V4を入手した最大の目的でした。どうしてもネットワークが使えない現場が稀に存在しますが、こういう現場でも、XS36V4ならシリアル経由でコントロールすることができます。

少しはトラブルに遭遇るんじゃないかと想像していたのですが、XS36V4でYocto Linuxを動かすというゴールにすんなりと到達してしまいました。じつは、今回XS36V4を入手した目的はもう一つあります。それは、この機種でTizenを動かしてみることです。Yocto Linuxの魅力にハマってからですが、私はTizenにも注目するようになりました。その理由は、Tizenプロジェクトを主導しているのがIntelだからです。Intelが主導しているプロジェクトなら技術的に得られるものが大きいので、研究テーマとして本格的に取り組む価値が十分にあると考えています。Tizenのターゲットには、Intel E38xxを搭載した産業用PCがいくつか含まれています。Yocto Linuxと同じように、E38xxで動くならJ1800/1900でもきっとTizenが動くはずです。近いうちに、XS36V4でTizenを動かすことに挑戦するつもりです。乞うご期待ください。






posted by とみやん at 08:11| Comment(0) | TrackBack(0) | Embedded Linux > Yocto Project

2015年01月05日

[Yocto] cryptsetup AES-NI対応機能の有効化

01/02の記事で、Linux用の暗号化ファイルシステムLUKSというものを紹介しました。この記事の中で、LUKSファイルシステムの読み書き速度の性能評価をやりましたが、その計測値が期待していたよりかなり低かったことから、cryptsetupの暗号処理でAES-NIが使われていないのではないかという疑惑が生まれました。

Yocto LinuxのcryptsetupのレシピやValley Island BSPのカーネル・コンフィグレーション設定などを調べていくうちに、やはりこの疑惑が正しいことが判りました。そして、cryptsetupのAES-NI対応機能を有効する方法も見つけました。

結論を先に書くと、DE3815TYKHE BSPのカーネルレシピを以下のように変更すると、cryptsetupのAES-NI対応機能が有効になります(Valley Island BSPも同様)。
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

#############################
# MACHINE = de3815tybe-32 #
#############################
COMPATIBLE_MACHINE_de3815tybe-32 = "de3815tybe-32"
KMACHINE_de3815tybe-32 = "valleyisland-32"
KBRANCH_de3815tybe-32 = "standard/base"
KERNEL_FEATURES_de3815tybe-32 = " features/valleyisland-io/valleyisland-io.scc \
features/valleyisland-io/valleyisland-io-pci.scc \
features/ciphers/ciphers.scc \
features/wifi/wifi-all.scc"

LINUX_VERSION_de3815tybe-32 = "3.10.59"
SRCREV_machine_de3815tybe-32 = "747e1cbd12b15db8bc2ae86e2359c1b113f120d6"
SRCREV_meta_de3815tybe-32 = "8f05306a8e6f5ee422d50c3317acce0cf9e6aada"
SRCREV_valleyisland-io_de3815tybe-32 = "0992d01f5f382f6da60004ef87f67ebd3ca13732"

SRC_URI_de3815tybe-32 = "git://git.yoctoproject.org/linux-yocto-3.10.git;protocol=git;nocheckout=1;branch=${KBRANCH},${KMETA},valleyisland-io-3.0;name=machine,meta,valleyisland-io"

#############################
# MACHINE = de3815tybe-64 #
#############################
COMPATIBLE_MACHINE_de3815tybe-64 = "de3815tybe-64"
KMACHINE_de3815tybe-64 = "valleyisland"
KBRANCH_de3815tybe-64 = "standard/base"
KERNEL_FEATURES_de3815tybe-64 = " features/valleyisland-io/valleyisland-io.scc \
features/valleyisland-io/valleyisland-io-pci.scc \
features/ciphers/ciphers.scc \
features/wifi/wifi-all.scc"

LINUX_VERSION_de3815tybe-64 = "3.10.59"
SRCREV_machine_de3815tybe-64 = "747e1cbd12b15db8bc2ae86e2359c1b113f120d6"
SRCREV_meta_de3815tybe-64 = "8f05306a8e6f5ee422d50c3317acce0cf9e6aada"
SRCREV_valleyisland-io_de3815tybe-64 = "0992d01f5f382f6da60004ef87f67ebd3ca13732"

SRC_URI_de3815tybe-64 = "git://git.yoctoproject.org/linux-yocto-3.10.git;protocol=git;nocheckout=1;branch=${KBRANCH},${KMETA},valleyisland-io-3.0;name=machine,meta,valleyisland-io"

module_autoload_i2c-dev = "i2c-dev"

linux-yocto_3.10.bbappendに上記のような変更を加えると、カーネルの以下のコンフィグレーション設定項目が有効になります。
CONFIG_CRYPTO_AES_NI_INTEL

-*- Cryptographic API --->
*** Ciphers ***
<*> AES cipher algorithms (AES-NI)


■ LUKSファイルシステムAES-NI対応機能の性能評価


cryptsetupには暗号処理のベンチマーク機能が搭載されています。「cryptsetup benchmark」というコマンドによって、その機能を動かすことができます。

01/02の記事の追記にすでに掲載済みですが、AES-NIが無効な場合のcryptsetup自身による暗号処理のベンチマーク計測値を改めて示します。
# cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 377729 iterations per second
PBKDF2-sha256 236165 iterations per second
PBKDF2-sha512 186712 iterations per second
PBKDF2-ripemd160 298229 iterations per second
PBKDF2-whirlpool 109044 iterations per second
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 48.0 MiB/s 57.4 MiB/s
serpent-cbc 128b 23.3 MiB/s 24.7 MiB/s
twofish-cbc 128b 45.1 MiB/s 53.9 MiB/s
aes-cbc 256b 38.6 MiB/s 43.8 MiB/s
serpent-cbc 256b 23.3 MiB/s 24.8 MiB/s
twofish-cbc 256b 45.1 MiB/s 53.9 MiB/s
aes-xts 256b 57.6 MiB/s 58.5 MiB/s
serpent-xts 256b 25.3 MiB/s 25.0 MiB/s
twofish-xts 256b 53.4 MiB/s 54.8 MiB/s
aes-xts 512b 44.4 MiB/s 44.4 MiB/s
serpent-xts 512b 25.3 MiB/s 25.0 MiB/s
twofish-xts 512b 53.4 MiB/s 54.8 MiB/s

比較のために、AES-NIが有効な場合の同コマンドの実行結果を以下に示します。
# cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 379369 iterations per second
PBKDF2-sha256 236592 iterations per second
PBKDF2-sha512 186712 iterations per second
PBKDF2-ripemd160 298569 iterations per second
PBKDF2-whirlpool 109409 iterations per second
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 203.3 MiB/s 284.3 MiB/s
serpent-cbc 128b 23.4 MiB/s 24.9 MiB/s
twofish-cbc 128b 45.2 MiB/s 54.2 MiB/s
aes-cbc 256b 159.4 MiB/s 226.1 MiB/s
serpent-cbc 256b 23.4 MiB/s 25.0 MiB/s
twofish-cbc 256b 45.3 MiB/s 54.1 MiB/s
aes-xts 256b 256.0 MiB/s 257.1 MiB/s
serpent-xts 256b 25.3 MiB/s 25.0 MiB/s
twofish-xts 256b 53.8 MiB/s 55.0 MiB/s
aes-xts 512b 204.3 MiB/s 205.7 MiB/s
serpent-xts 512b 25.4 MiB/s 25.0 MiB/s
twofish-xts 512b 53.7 MiB/s 54.9 MiB/s

上の2つのケースの計測値を比較すると、aes-cbcとaes-xtsの性能に4〜5倍の差が出ています。OpenSSLによる性能差より少し低いですが、暗号処理エンジンとしてのAES-NIの性能は相当優秀であることがこの結果から判ります。

cryptsetupのAES-NI対応機能を有効した状態で、LUKSファイルシステムの読み書き速度の性能評価を改めてやってみました。01/02の記事と同じ方法を使って計測を行いました。以下に、LUKSファイルシステムの読み書き速度の計測結果を示します。

ファイルシステム読み込み速度(MB/sec)比率書き込み速度(MB/sec)比率
素のext3263.3694.96
LUKS ext3 AES-NI無効41.120.1542.400.44
LUKS ext3 AES-NI有効95.490.3690.720.95

AES-NIが有効な場合の計測値は期待していたほど向上していませんでした。もしかすると読み込み速度は200MB/sec位いくんじゃないかと予測していたんですが、さすがにそこまでは届いていません。それでも、AES-NIが無効な場合の計測値と比較すると、2倍強の性能差が出ています。AES-NIの効果はやはり大きいと言えます。

cryptsetup benchmark」コマンドのベンチマーク計測処理はメモリ上でのみ実行されるのに対して、上表はディスクの読み書き処理を伴った計測値です。AES-NIの性能がいかに優れていても、ディスクのI/O性能に引きずられることでこのような結果になるのかもしれません。DE3815TYKHEに組み込んでいるSATAディスクはIntel 320 Series 80GB SSDですが、これは3世代位前のSSDで、シーケンシャル・リード270MB/s、シーケンシャル・ライト90MB/sという性能です。最新の高性能なSSDを使えば、もう少し優秀な計測結果が得られるのではないかと思います。また、DE3815TYKHEに搭載されているE3815はシングルコアのプロセッサです。2コアのE3826/3827や4コアのE3845なら、ディスク読み書きや暗号処理がマルチスレッドで実行されるので、さらに性能は向上するはずです。

【2015/01/06 追記】

本記事の作業は、Poky + Valley Island BSP Daisy 1.6.2を使ってビルドしたcore-image-satoイメージを使っています。ターゲットはいつものとおりDE3815TYKHEです(いまのところ、E38xxx搭載ターゲットはこれしか持っていません)。上記の計測に使用したDE3815TYKHEの基本スペックを示しておきます。
  • CPU Intel(R) Atom(TM) Processor E3815 (512K Cache,1.46 GHz,1コア)
  • メモリ PC3L-12800(DDR3L-1600)2GB
  • ディスク Intel 320 Series 80GB SSD SATA 3Gb/s(シーケンシャル・リード270MB/s,シーケンシャル・ライト90MB/s)

本記事ではcryptsetupのAES-NI対応機能を有効にするための方法だけを記していますが、この解決方法に辿り着くまでの経緯も書いておきます。

じつは、カーネルのコンフィグレーション設定項目CONFIG_CRYPTO_AES_NI_INTELの存在は随分前から知っていました。それでも、cryptsetupのためにこの設定項目を有効にする必要はないと思っていました。その理由は、cryptsetupのレシピが以下のような内容であることを確認済みだったからです。
SUMMARY = "Manage plain dm-crypt and LUKS encrypted volumes"
DESCRIPTION = "Cryptsetup is used to conveniently setup dm-crypt managed \
device-mapper mappings. These include plain dm-crypt volumes and \
LUKS volumes. The difference is that LUKS uses a metadata header \
and can hence offer more features than plain dm-crypt. On the other \
hand, the header is visible and vulnerable to damage."
HOMEPAGE = "http://code.google.com/p/cryptsetup/"
SECTION = "console"
LICENSE = "GPL-2.0-with-OpenSSL-exception"
LIC_FILES_CHKSUM = "file://COPYING;md5=32107dd283b1dfeb66c9b3e6be312326"

DEPENDS = "util-linux lvm2 popt libgcrypt"

SRC_URI = "http://cryptsetup.googlecode.com/files/cryptsetup-${PV}.tar.bz2"
SRC_URI[md5sum] = "cd834da49fbe92dd66df02cc5c61280f"
SRC_URI[sha256sum] = "15723f0198303d4bcb99d480b7a773918e2d319f0348457988c063bdd03e109a"

inherit autotools gettext

# Use openssl because libgcrypt drops root privileges
# if libgcrypt is linked with libcap support
PACKAGECONFIG ??= "openssl"
PACKAGECONFIG[openssl] = "--with-crypto_backend=openssl,,openssl"
PACKAGECONFIG[gcrypt] = "--with-crypto_backend=gcrypt,,libgcrypt"

RRECOMMENDS_${PN} = "kernel-module-aes-generic \
kernel-module-dm-crypt \
kernel-module-md5 \
kernel-module-cbc \
kernel-module-sha256-generic \
"

EXTRA_OECONF = "--enable-static"

ハイライト表示の行に注目してください。この記述によって、cryptsetupをデフォルト状態でビルドすると、そのコンフィグレーション設定に「--with-crypto_backend=openssl」というオプションが適用されます。

このオプションはcryptsetup 1.3.0から追加されたもので、cryptsetupの配布元サイトの以下のページに説明が掲載されています。

 Cryptsetup130 - cryptsetup - Cryptsetup 1.3.0 Release Notes - Setup virtual encryption devices under dm-crypt Linux - Google Project Hosting

cryptsetupは自身では暗号処理機能を持っておらず、その機能は外部のライブラリに依存しています。「--with-crypto_backend=openssl」オプションによって、cryptsetupはOpenSSLの暗号処理機能を利用する形でビルドされます。

12/30の記事に記載したとおり、CONFIG_CRYPTO_AES_NI_INTELを有効にしなくても、OpenSSLのAES-NI対応機能はちゃんと動作していることを確認済みです。そのため、OpenSSLのライブラリに依存しているcryptsetupの暗号処理もAES-NI対応機能は有効なはずだと思い込んでいました。

ところが、実際にcryptsetupの暗号処理の性能を計測すると、AES-NI対応機能が有効になっているとは思えない計測値が得られました。もしかすると、上記のオプションが適用されていない状態でcryptsetupがビルドされているんじゃないかという疑いも持ちましたが、以下のコマンドの実行結果により、その疑惑は否定されました。
# cryptsetup benchmark --debug
# cryptsetup 1.6.2 processing "cryptsetup benchmark --debug"
# Running command benchmark.
# Installing SIGINT/SIGTERM handler.
# Unblocking interruption on signal.
# Tests are approximate using memory only (no storage IO).
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
# KDF pbkdf2, hash sha1: 378820 iterations per second.
PBKDF2-sha1 378820 iterations per second
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
# KDF pbkdf2, hash sha256: 235317 iterations per second.
PBKDF2-sha256 235317 iterations per second
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
# KDF pbkdf2, hash sha512: 186712 iterations per second.
PBKDF2-sha512 186712 iterations per second
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
# KDF pbkdf2, hash ripemd160: 298229 iterations per second.
PBKDF2-ripemd160 298229 iterations per second
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
# KDF pbkdf2, hash whirlpool: 109226 iterations per second.
PBKDF2-whirlpool 109226 iterations per second
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 47.9 MiB/s 57.5 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
serpent-cbc 128b 23.2 MiB/s 24.7 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
twofish-cbc 128b 45.0 MiB/s 53.7 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
aes-cbc 256b 38.6 MiB/s 43.8 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
serpent-cbc 256b 23.3 MiB/s 24.8 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
twofish-cbc 256b 45.0 MiB/s 53.8 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
aes-xts 256b 57.5 MiB/s 58.5 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
serpent-xts 256b 25.2 MiB/s 25.0 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
twofish-xts 256b 53.4 MiB/s 54.8 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
aes-xts 512b 44.5 MiB/s 44.4 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
serpent-xts 512b 25.3 MiB/s 25.0 MiB/s
# Crypto backend (OpenSSL 1.0.1j 15 Oct 2014) initialized.
twofish-xts 512b 53.4 MiB/s 54.7 MiB/s
Command successful.

--debug」というオプションはcryptsetupのすべての機能に対して働き、cryptsetupの動作時にデバッグ情報を出力してくれます。上のデバッグ情報から、AES暗号処理の実行時にちゃんとOpenSSLの初期化が行われている(多分OpenSSL側のライブラリ・ルーチンの呼び出しも行われている)ということが判ります。

それでは、なぜcryptsetupのAES-NI対応機能は有効に働かないのか。いまだにその原因は判っていませんが、次のような仮説なら立てられるじゃないかと思っています。
  • cryptsetupからのAES暗号処理の呼び出し形式がOpenSSL側のライブラリ・ルーチンと互換性が取れていないため、その処理がエラーになっている。仕方なくcryptsetupはカーネルのAES暗号処理を利用している。

この仮説が正しいかどうかは自信がありません。また、本仮説の証明方法もいまのところ思いつきません。cryptsetupのAES暗号処理のソースコードを解読するしかありませんが、さすがにそこまでする時間はいまは取れません。

ただし、いつかは本問題の原因を究明したいと思っています。上記のcryptsetupのページに "Note that kernel userspace backend is very slow for this type of operation." という記述が存在しています。cryptsetupから呼び出しているOpenSSL側のAES暗号処理がちゅんと有効に働けば、cryptsetupの性能はいまよりさらに向上するのではないかと思えるからです。
posted by とみやん at 17:33| Comment(0) | TrackBack(0) | Embedded Linux > Yocto Project

2015年01月03日

[Yocto] smartmontoolsによるディスク自己診断情報の取得

最近のハードディスクやSSDは自己診断情報を持っていて、一定のアクセス方法に従うと、CPUからこの情報を取得することができます。S.M.A.R.T.(Self-Monitoring, Analysis and Reporting Technology)と呼ばれているものがそれです。

PCに搭載されている最近のBIOSは、起動時のPOST処理実行中にHDD/SSDからS.M.A.R.T. 情報を取得して、問題を検知したらエラーメッセージを表示する機能を備えています。マザーボード・メーカーもHDD診断ソフトを作成して製品の添付CDに収納したりしていますし、フリーのWindows用HDD診断ソフトもいくつか存在します。たとえマイナーな機能のソフトであっても、Windows用が在れば必ずと言って良いほどLinuxでも同種のソフトが存在します(Linux用はオープンソース・ソフトウェアですが)。smartmontoolsというものが在り、これがS.M.A.R.T. 情報を利用したLinux用のHDD診断ソフトとして有名です。

Yocto Linuxにもsmartmontoolsのレシピが存在するので、試しにDE3815TYKHEで使ってみました。bblayers.conflocal.confに以下のような変更を加えれば、core-image-satoイメージにsmartmontoolsを組み込むことができます。
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "6"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-yocto \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-yocto-bsp \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-openembedded/meta-oe \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-intel \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-intel/meta-tlk \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-de3815tybe \
"
BBLAYERS_NON_REMOVABLE ?= " \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-yocto \
"

#
# Additional packages to be installed to the specific images
#
IMAGE_INSTALL_append_pn-core-image-sato = " \
parted \
hdparm \
cryptsetup \
smartmontools"

ただし、前記事で紹介したcryptsetupと同様に、smartmontoolsのレシピはmeta-openembeddedリポジトリの方に収集されているので、あらかじめ同リポジトリのパッケージレシピを取得しておく必要があります。〔2014/12/14の記事を参照

HDD/SSDのS.M.A.R.T. 情報を調べるには、smartmontoolsパッケージに含まれる「smartctl」というコマンドを使います。

最初にディスクを検索したければ、「--scan」オプションを使ってできるようです。
# smartctl --scan
/dev/sda -d scsi # /dev/sda, SCSI device

「-i」オプションによって、指定したデバイスがS.M.A.R.T.に対応しているかどうかを確認できます。
# smartctl -i /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.59-ltsi-yocto-standard] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Intel 320 Series SSDs
Device Model: INTEL SSDSA2CW080G3
Serial Number: CVPR13710AME080BGN
LU WWN Device Id: 5 001517 9596a5d21
Firmware Version: 4PC10362
User Capacity: 80,026,361,856 bytes [80.0 GB]
Sector Size: 512 bytes logical/physical
Rotation Rate: Solid State Device
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS T13/1699-D revision 4
SATA Version is: SATA 2.6, 3.0 Gb/s
Local Time is: Sun Jan 4 00:58:30 2015 UTC
SMART support is: Available - device has SMART capability.
SMART support is: Enabled


対象デバイスの自己診断情報を取得するには、「-a」まはた「-x」オプションを使います。前者がS.M.A.R.T.から取得可能な全情報を、後者はS.M.A.R.T.以外の情報も表示します。
# smartctl -a /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.59-ltsi-yocto-standard] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Intel 320 Series SSDs
Device Model: INTEL SSDSA2CW080G3
Serial Number: CVPR13710AME080BGN
LU WWN Device Id: 5 001517 9596a5d21
Firmware Version: 4PC10362
User Capacity: 80,026,361,856 bytes [80.0 GB]
Sector Size: 512 bytes logical/physical
Rotation Rate: Solid State Device
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS T13/1699-D revision 4
SATA Version is: SATA 2.6, 3.0 Gb/s
Local Time is: Sun Jan 4 00:13:09 2015 UTC
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status: (0x00) Offline data collection activity
was never started.
Auto Offline Data Collection: Disabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 1) seconds.
Offline data collection
capabilities: (0x75) SMART execute Offline immediate.
No Auto Offline data collection support.
Abort Offline collection upon new
command.
No Offline surface scan supported.
Self-test supported.
Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities: (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: ( 1) minutes.
Extended self-test routine
recommended polling time: ( 1) minutes.
Conveyance self-test routine
recommended polling time: ( 1) minutes.
SCT capabilities: (0x003d) SCT Status supported.
SCT Error Recovery Control supported.
SCT Feature Control supported.
SCT Data Table supported.

SMART Attributes Data Structure revision number: 5
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
3 Spin_Up_Time 0x0020 100 100 000 Old_age Offline - 0
4 Start_Stop_Count 0x0030 100 100 000 Old_age Offline - 0
5 Reallocated_Sector_Ct 0x0032 100 100 000 Old_age Always - 0
9 Power_On_Hours 0x0032 100 100 000 Old_age Always - 917
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 1164
170 Reserve_Block_Count 0x0033 100 100 010 Pre-fail Always - 0
171 Program_Fail_Count 0x0032 100 100 000 Old_age Always - 0
172 Erase_Fail_Count 0x0032 100 100 000 Old_age Always - 0
183 Runtime_Bad_Block 0x0030 100 100 000 Old_age Offline - 7522
184 End-to-End_Error 0x0032 100 100 090 Old_age Always - 0
187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0
192 Unsafe_Shutdown_Count 0x0032 100 100 000 Old_age Always - 120
199 UDMA_CRC_Error_Count 0x0030 100 100 000 Old_age Offline - 0
225 Host_Writes_32MiB 0x0032 100 100 000 Old_age Always - 136685
226 Workld_Media_Wear_Indic 0x0032 100 100 000 Old_age Always - 1515
227 Workld_Host_Reads_Perc 0x0032 100 100 000 Old_age Always - 77
228 Workload_Minutes 0x0032 100 100 000 Old_age Always - 55045
232 Available_Reservd_Space 0x0033 100 100 010 Pre-fail Always - 0
233 Media_Wearout_Indicator 0x0032 099 099 000 Old_age Always - 0
241 Host_Writes_32MiB 0x0032 100 100 000 Old_age Always - 136685
242 Host_Reads_32MiB 0x0032 100 100 000 Old_age Always - 459867

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Vendor (0xeb) Completed without error 00% 917 -

SMART Selective self-test log data structure revision number 0
Note: revision number not 1 implies that no selective self-test has ever been run
SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS
1 0 0 Not_testing
2 0 0 Not_testing
3 0 0 Not_testing
4 0 0 Not_testing
5 0 0 Not_testing
Selective self-test flags (0x0):
After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.


# smartctl -x /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.59-ltsi-yocto-standard] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Intel 320 Series SSDs
Device Model: INTEL SSDSA2CW080G3
Serial Number: CVPR13710AME080BGN
LU WWN Device Id: 5 001517 9596a5d21
Firmware Version: 4PC10362
User Capacity: 80,026,361,856 bytes [80.0 GB]
Sector Size: 512 bytes logical/physical
Rotation Rate: Solid State Device
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS T13/1699-D revision 4
SATA Version is: SATA 2.6, 3.0 Gb/s
Local Time is: Sun Jan 4 00:13:13 2015 UTC
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
AAM feature is: Unavailable
APM feature is: Unavailable
Rd look-ahead is: Enabled
Write cache is: Enabled
ATA Security is: Disabled, frozen [SEC2]
Unexpected SCT status 0x0002 (action_code=4, function_code=2)
Wt Cache Reorder: N/A

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status: (0x00) Offline data collection activity
was never started.
Auto Offline Data Collection: Disabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 1) seconds.
Offline data collection
capabilities: (0x75) SMART execute Offline immediate.
No Auto Offline data collection support.
Abort Offline collection upon new
command.
No Offline surface scan supported.
Self-test supported.
Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities: (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: ( 1) minutes.
Extended self-test routine
recommended polling time: ( 1) minutes.
Conveyance self-test routine
recommended polling time: ( 1) minutes.
SCT capabilities: (0x003d) SCT Status supported.
SCT Error Recovery Control supported.
SCT Feature Control supported.
SCT Data Table supported.

SMART Attributes Data Structure revision number: 5
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAGS VALUE WORST THRESH FAIL RAW_VALUE
3 Spin_Up_Time -----K 100 100 000 - 0
4 Start_Stop_Count ----CK 100 100 000 - 0
5 Reallocated_Sector_Ct -O--CK 100 100 000 - 0
9 Power_On_Hours -O--CK 100 100 000 - 917
12 Power_Cycle_Count -O--CK 100 100 000 - 1164
170 Reserve_Block_Count PO--CK 100 100 010 - 0
171 Program_Fail_Count -O--CK 100 100 000 - 0
172 Erase_Fail_Count -O--CK 100 100 000 - 0
183 Runtime_Bad_Block ----CK 100 100 000 - 7522
184 End-to-End_Error -O--CK 100 100 090 - 0
187 Reported_Uncorrect -O--CK 100 100 000 - 0
192 Unsafe_Shutdown_Count -O--CK 100 100 000 - 120
199 UDMA_CRC_Error_Count ----CK 100 100 000 - 0
225 Host_Writes_32MiB -O--CK 100 100 000 - 136685
226 Workld_Media_Wear_Indic -O--CK 100 100 000 - 1515
227 Workld_Host_Reads_Perc -O--CK 100 100 000 - 77
228 Workload_Minutes -O--CK 100 100 000 - 55045
232 Available_Reservd_Space PO--CK 100 100 010 - 0
233 Media_Wearout_Indicator -O--CK 099 099 000 - 0
241 Host_Writes_32MiB -O--CK 100 100 000 - 136685
242 Host_Reads_32MiB -O--CK 100 100 000 - 459867
||||||_ K auto-keep
|||||__ C event count
||||___ R error rate
|||____ S speed/performance
||_____ O updated online
|______ P prefailure warning

Log Directories not read due to '-F nologdir' option

SMART Extended Comprehensive Error Log Version: 1 (2 sectors)
No Errors Logged

SMART Extended Self-test Log Version: 1 (2 sectors)
Invalid Self-test Log index = 0x00eb (reserved = 0x00)
SMART Selective self-test log data structure revision number 0
Note: revision number not 1 implies that no selective self-test has ever been run
SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS
1 0 0 Not_testing
2 0 0 Not_testing
3 0 0 Not_testing
4 0 0 Not_testing
5 0 0 Not_testing
Selective self-test flags (0x0):
After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

Read SCT Data Table failed: scsi error aborted command
Read SCT Temperature History failed

SCT Error Recovery Control:
Read: Disabled
Write: Disabled

Device Statistics (GP Log 0x04)
Page Offset Size Value Description
1 ===== = = == General Statistics (rev 2) ==
1 0x008 4 1164 Lifetime Power-On Resets
1 0x010 4 917 Power-on Hours
1 0x018 6 8957811011 Logical Sectors Written
1 0x020 6 162155053 Number of Write Commands
1 0x028 6 30137881911 Logical Sectors Read
1 0x030 6 780175533 Number of Read Commands
4 ===== = = == General Errors Statistics (rev 1) ==
4 0x008 4 0 Number of Reported Uncorrectable Errors
4 0x010 4 0 Resets Between Cmd Acceptance and Completion
6 ===== = = == Transport Statistics (rev 1) ==
6 0x008 4 4433 Number of Hardware Resets
6 0x010 4 16383291 Number of ASR Events
6 0x018 4 0 Number of Interface CRC Errors
7 ===== = = == Solid State Device Statistics (rev 1) ==
7 0x008 1 1 Percentage Used Endurance Indicator

SATA Phy Event Counters (GP Log 0x11)
ID Size Value Description
0x0001 4 0 Command failed due to ICRC error
0x0004 4 0 R_ERR response for host-to-device data FIS
0x0007 4 0 R_ERR response for host-to-device non-data FIS
0x0008 4 0 Device-to-host non-data FIS retries
0x0009 4 5 Transition from drive PhyRdy to drive PhyNRdy
0x000a 4 6 Device-to-host register FISes sent due to a COMRESET
0x000b 4 0 CRC errors within host-to-device FIS
0x000d 4 0 Non-CRC errors within host-to-device FIS
0x000f 4 0 R_ERR response for host-to-device data FIS, CRC
0x0010 4 0 R_ERR response for host-to-device data FIS, non-CRC
0x0012 4 0 R_ERR response for host-to-device non-data FIS, CRC
0x0013 4 0 R_ERR response for host-to-device non-data FIS, non-CRC


どちらも難しそうな単語と数値の羅列ですね。S.M.A.R.T.情報はハードディスクの構造や動作に直結している低レベルなデータなので、これらのデータからHDD/SSDの状態を把握するのはかなり困難だと思います。

【参考ページ】

 FreeBSDでsmartmontoolsのインストール | Nobwak's Lair
 SMART:smartmontoolsでハードディスク診断
 S.M.A.R.T. (日本語) - ArchWiki
posted by とみやん at 23:05| Comment(0) | TrackBack(0) | Embedded Linux > Yocto Project

2015年01月02日

[Yocto] 暗号化ファイルシステムLUKSを使ってみた

企業内では、PCにディスク暗号化ソフトを導入して、内蔵ディスクや外付メディア全体に暗号処理を施した状態で使うことが良くあります。セキュリティ上の観点から、PC本体や外付メディアが盗難に遭っても、それらの中に格納されているファイルを読めなくすることが目的です。また、社員がUSBメディアなどを外に持ち出したときに紛失するケースなども想定しているのでしょう。いままで私が働いたことがある会社でも、暗号化ソフトを導入せずにPCを使うことを禁止している所がいくつかありました。こういう堅苦しいルールを設けているのは大抵は日本国内の大手企業だけです。外資系やベンチャー企業にはこういうルールはまずありません。暗号化ソフトを導入すると当然ディスク性能が低下し、アプリの起動やファイルの読み書きに時間がかかるようになるので作業効率が低下します。日本の大手企業は作業効率よりセキュリティを優先するのに対して、ベンチャー企業はセキュリティより作業効率を優先する所が多いです。私は外資系やベンチャー企業でも働いたことがありますが、これらの企業でPCへ暗号化ソフトを導入することを義務化している所は一つもありませんでした。現状企業内のPCから情報が漏洩するケースはインターネット経由がほとんどです。社員の故意または過失によるケースもあるでしょうが、ディスク暗号化ソフトが有益なのは、社員の過失によってディスクメディアが第三者の手に渡ったときだけです(故意の情報漏洩を企む社員なら、ディスク暗号化ソフトを回避するために、持ち込みのディスクを用意したり、スクリプトや常駐ソフトを使ってインターネット経由でデータを漏洩させるなどの方法を取るはずです)。PCの盗難によって情報が漏洩したというケースはあまり聞いたことがありません。結局ディスク暗号化ソフトをPCへ導入することは企業側の自己満足であって、実際にこれが情報漏洩を防ぐようなケースはほとんど存在しないんじゃないかと私は思っています。社員が使う全PCにディスク暗号化ソフトを導入することと、社内のサーバーやゲートウェイなどにセキュリティ対策を施することを比較すると、後者の費用対効果の方が圧倒的に優れています。改めて言いますが、現状企業からの情報漏洩で一番多いケースはインターネット経由です。外資系やベンチャー企業も当然セキュリティを重視していますが、これらの会社は費用対効果を考慮して、現実的なセキュリティ対策を選択している所が多いのが実情です。

冒頭から話が大きく逸れてしまったので元に戻しましょう。日本国内の企業での需要が高いからかWindows用ディスク暗号化ソフトは多くの種類が存在しているようですが、Linuxにも同様のオープンソース・ソフトウェアがいくつか存在します。Linux用の暗号化ファイルシステムとしてもっとも有名なのはLUKS(Linux Unified Key Setup。発音は「ラックス」)というものです。ターゲットシステム上にLUKS暗号化ファイルシステムを作成するには、cryptsetupというパッケージを利用します。本記事に書く内容は、Yocto Linuxのcryptsetupレシピを使ったLUKS暗号化ファイルシステムの評価作業の記録です。

ターゲットとして使ったのはDE3815TYKHEです。DE3815TYKHE用のbblayers.conflocal.confに以下のような変更を加えると、core-image-satoイメージにcryptsetupを組み込むことができます。
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "6"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-yocto \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-yocto-bsp \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-openembedded/meta-oe \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-intel \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-intel/meta-tlk \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-de3815tybe \
"
BBLAYERS_NON_REMOVABLE ?= " \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta \
/home/yuhri/Yocto/poky-daisy-11.0.2/meta-yocto \
"

#
# Additional packages to be installed to the specific images
#
IMAGE_INSTALL_append_pn-core-image-sato = " \
parted \
hdparm \
cryptsetup"

cryptsetupのレシピは、openembedded-coreではなくmeta-openembeddedリポジトリの方に収集されています。そのため、Yocto Linuxの配布パッケージにcryptsetupのレシピは収納されていません。cryptsetupのレシピを利用したい場合は、meta-openembeddedリポジトリのパッケージレシピをgitコマンドで取得しておく必要があります。〔2014/12/14の記事を参照

また、上ではpartedとhdparmパッケージもcore-image-satoイメージへ追加しています。partedは、DE3815TYKHEの内蔵SATAディスク上にLUKSファイルシステム用のパーティションを作成するために使います。hdparmの方は、これを使ってLUKSファイルシステムの読み込み速度の計測を行う目的で組み込んでいます。

■ LUKS用パーティションの確保(Intel E38xx Yocto Linux固有)


bitbakeコマンドによって、partedとcryptsetupを追加したcore-image-satoイメージのhddimgファイルを生成し、そのファイルからYocto LinxのLive USBメディアを作成しました。これはDE3815TYKHEへYocto Linuxをインストールする前のお決まりの手順ですが、その後に、GPartedのLive USBメディアも作成しました。このGPartedとpartedの両方を使って、DE3815TYKHEの内蔵SATA上にLUKSファイルシステム用のパーティション領域を確保します。GPartedとpartedはディスク・パーティションを操作する同種のソフトウェアです。partedが存在するのになぜGPartedが必要になるかというと、Yocto Linxのpartedではなぜか「resize」コマンド(パーティションのサイズを変更するコマンド)が使えないからです。GPartedの方で既存のパーティションをリサイズして空き領域を確保した上で、partedの方でその空き領域上にLUKS用パーティションを作成するというテクニックを使います。DE3815TYKHEの内蔵SATAディスク上にLUKS用パーティションを作成するための具体的な手順を以下に示します。
  1. 上で作成したYocto LinuxのLive USBメディアをUSBポートに挿した状態で、DE3815TYKHEの電源をONにします。

  2. 起動時に表示されるGRUBのメニューから「install」を選択して、DE3815TYKHEの内蔵SATAへYocto Linuxをインストールします。Yocto Linuxのインストールが済んだら(インストール完了時の「Remove your installation media, and press ENTER」というメッセージが表示されたら)、Powerボタンを長押しして、DE3815TYKHEの電源をOFFにします。

  3. USBポートのメディアをGParted Live USBに差し替えてから、DE3815TYKHEの電源をONにします。

  4. GPartedが起動したら、DE3815TYKHEの内蔵SATA上の既存のext3パーティション(/dev/sda2)のサイズを10GB縮小します(同パーティションの後方に10240MiBの空き領域を確保します。空き領域のサイズは任意です)。
    GParted_Live-Resizing_Yocto_ext3_Partition_on_SATA-775x500
    この操作が済んだら、GPartedを終了して、シャットダウンします。

  5. USBポートのメディアをYocto LinuxのLive USBに差し替えてから、DE3815TYKHEの電源をONにします。

  6. 起動時に表示されるGRUBのメニューから「boot」を選択して、Live USBメディアからYocto Linuxを起動します。

  7. ターミナルの画面を開いて、以下の手順を実行します。
    # df
    Filesystem 1K-blocks Used Available Use% Mounted on
    none 964692 4 964688 0% /dev
    /dev/sda1 18378 6410 11968 35% /media/sda1
    /dev/sda2 62736324 411152 59138280 1% /media/sda2
    /dev/sdb 350192 344648 5544 98% /media/sdb
    /dev/loop0 320464 216362 87555 71% /
    tmpfs 40 0 40 0% /mnt/.psplash
    tmpfs 969256 260 968996 0% /run
    tmpfs 969256 168 969088 0% /var/volatile
    # umount /media/sda1
    # umount /media/sda2
    # parted /dev/sda
    GNU Parted 3.1
    Using /dev/sda
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) print free
    Model: ATA INTEL SSDSA2CW08 (scsi)
    Disk /dev/sda: 80.0GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags:

    Number Start End Size File system Name Flags
    17.4kB 1049kB 1031kB Free Space
    1 1049kB 19.9MB 18.9MB fat16 primary boot
    2 19.9MB 65.3GB 65.3GB ext3 primary
    65.3GB 76.0GB 10.7GB Free Space
    3 76.0GB 80.0GB 4001MB linux-swap(v1) primary
    80.0GB 80.0GB 73.2kB Free Space

    (parted) rm 3
    (parted) mkpart primary ext2 65.3GB 76.0GB
    (parted) mkpart primary linux-swap 76.0GB 100%
    (parted) print free
    Model: ATA INTEL SSDSA2CW08 (scsi)
    Disk /dev/sda: 80.0GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags:

    Number Start End Size File system Name Flags
    17.4kB 1049kB 1031kB Free Space
    1 1049kB 19.9MB 18.9MB fat16 primary boot
    2 19.9MB 65.3GB 65.3GB ext3 primary
    3 65.3GB 76.0GB 10.7GB primary
    4 76.0GB 80.0GB 4027MB primary
    80.0GB 80.0GB 73.2kB Free Space

    (parted) quit
    Information: You may need to update /etc/fstab.

    # mkswap /dev/sda4
    Setting up swapspace version 1, size = 4026527744 bytes
    # mount /dev/sda2 /mnt
    # cat /mnt/etc/fstab
    # stock fstab - you probably want to override this with a machine specific one

    /dev/root / auto defaults 1 1
    proc /proc proc defaults 0 0
    devpts /dev/pts devpts mode=0620,gid=5 0 0
    usbdevfs /proc/bus/usb usbdevfs noauto 0 0
    tmpfs /run tmpfs mode=0755,nodev,nosuid,strictatime 0 0
    tmpfs /var/volatile tmpfs defaults 0 0

    # uncomment this if your device has a SD/MMC/Transflash slot
    #/dev/mmcblk0p1 /media/card auto defaults,sync,noauto 0 0

    /dev/sda3 swap swap defaults 0 0
    # sed -i "s@/dev/sda3@/dev/sda4@" /mnt/etc/fstab
    # cat /mnt/etc/fstab
    # stock fstab - you probably want to override this with a machine specific one

    /dev/root / auto defaults 1 1
    proc /proc proc defaults 0 0
    devpts /dev/pts devpts mode=0620,gid=5 0 0
    usbdevfs /proc/bus/usb usbdevfs noauto 0 0
    tmpfs /run tmpfs mode=0755,nodev,nosuid,strictatime 0 0
    tmpfs /var/volatile tmpfs defaults 0 0

    # uncomment this if your device has a SD/MMC/Transflash slot
    #/dev/mmcblk0p1 /media/card auto defaults,sync,noauto 0 0

    /dev/sda4 swap swap defaults 0 0
    # umount /mnt
    # sync

DE3815TYKHEのマザーボード上にはSATAコネクタが1つしか存在しておらず、これは内蔵SATAディスクで使われています。複数のSATAコネクタが在れば、2台目のSATAディスクを接続して、そちらにLUKS用パーティションを作成できるのですが、DE3815TYKHEではそれができません。そのため、上のようなテクニックを使って内蔵SATAディスク上にLUKS用パーティションを確保している訳です。もちろんUSBメディア上にLUKS用パーティションを作成することも可能です。しかし、その場合、LUKSファイルシステムの読み書き速度はUSBメディアの性能に大きく依存してしまいます。USBメディアの読み書き速度はメーカーによって結構バラツキがあるので、比較的読み書き速度のバラツキが小さくより高速なSATAディスクを使いたかったのです。LUKSファイルシステムの読み書き速度の計測をやってみたかったことが、USBメディアではなくSATAディスクを選んだ理由です。

■ LUKSファイルシステムの作成


これでLUKSファイルシステムを使うための準備が整ったので、 さっそくcryptsetupコマンドを使ってLUKSファイルシステムを作成してみましょう。なお、以降の操作は、Yocto LinuxをDE3815TYKHEの内蔵SATAディスクから起動した状態で行っています。

最初に、cryptsetupコマンド のヘルプ情報を表示させてみました。
# cryptsetup --help
cryptsetup 1.6.2
Usage: cryptsetup [OPTION...] <action> <action-specific>
--version Print package version
-v, --verbose Shows more detailed error messages
--debug Show debug messages
-c, --cipher=STRING The cipher used to encrypt the disk (see /proc/crypto)
-h, --hash=STRING The hash used to create the encryption key from the passphrase
-y, --verify-passphrase Verifies the passphrase by asking for it twice
-d, --key-file=STRING Read the key from a file.
--master-key-file=STRING Read the volume (master) key from file.
--dump-master-key Dump volume (master) key instead of keyslots info.
-s, --key-size=BITS The size of the encryption key
-l, --keyfile-size=bytes Limits the read from keyfile
--keyfile-offset=bytes Number of bytes to skip in keyfile
--new-keyfile-size=bytes Limits the read from newly added keyfile
--new-keyfile-offset=bytes Number of bytes to skip in newly added keyfile
-S, --key-slot=INT Slot number for new key (default is first free)
-b, --size=SECTORS The size of the device
-o, --offset=SECTORS The start offset in the backend device
-p, --skip=SECTORS How many sectors of the encrypted data to skip at the beginning
-r, --readonly Create a readonly mapping
-i, --iter-time=msecs PBKDF2 iteration time for LUKS (in ms)
-q, --batch-mode Do not ask for confirmation
-t, --timeout=secs Timeout for interactive passphrase prompt (in seconds)
-T, --tries=INT How often the input of the passphrase can be retried
--align-payload=SECTORS Align payload at <n> sector boundaries - for luksFormat
--header-backup-file=STRING File with LUKS header and keyslots backup.
--use-random Use /dev/random for generating volume key.
--use-urandom Use /dev/urandom for generating volume key.
--shared Share device with another non-overlapping crypt segment.
--uuid=STRING UUID for device to use.
--allow-discards Allow discards (aka TRIM) requests for device.
--header=STRING Device or file with separated LUKS header.
--test-passphrase Do not activate device, just check passphrase.
--tcrypt-hidden Use hidden header (hidden TCRYPT device).
--tcrypt-system Device is system TCRYPT drive (with bootloader).
-M, --type=STRING Type of device metadata: luks, plain, loopaes, tcrypt.
--force-password Disable password quality check (if enabled).

Help options:
-?, --help Show this help message
--usage Display brief usage

<action> is one of:
open <device> [--type <type>] [<name>] - open device as mapping <name>
close <name> - close device (remove mapping)
resize <name> - resize active device
status <name> - show device status
benchmark <name> - benchmark cipher
repair <device> - try to repair on-disk metadata
luksFormat <device> [<new key file>] - formats a LUKS device
luksAddKey <device> [<new key file>] - add key to LUKS device
luksRemoveKey <device> [<key file>] - removes supplied key or key file from LUKS device
luksChangeKey <device> [<key file>] - changes supplied key or key file of LUKS device
luksKillSlot <device> <key slot> - wipes key with number <key slot> from LUKS device
luksUUID <device> - print UUID of LUKS device
isLuks <device> - tests <device> for LUKS partition header
luksDump <device> - dump LUKS partition information
tcryptDump <device> - dump TCRYPT device information
luksSuspend <device> - Suspend LUKS device and wipe key (all IOs are frozen).
luksResume <device> - Resume suspended LUKS device.
luksHeaderBackup <device> - Backup LUKS device header and keyslots
luksHeaderRestore <device> - Restore LUKS device header and keyslots

You can also use old <action> syntax aliases:
open: create (plainOpen), luksOpen, loopaesOpen, tcryptOpen
close: remove (plainClose), luksClose, loopaesClose, tcryptClose

<name> is the device to create under /dev/mapper
<device> is the encrypted device
<key slot> is the LUKS key slot number to modify
<key file> optional key file for the new key for luksAddKey action

Default compiled-in key and passphrase parameters:
Maximum keyfile size: 8192kB, Maximum interactive passphrase length 512 (characters)
Default PBKDF2 iteration time for LUKS: 1000 (ms)

Default compiled-in device cipher parameters:
loop-AES: aes, Key 256 bits
plain: aes-cbc-essiv:sha256, Key: 256 bits, Password hashing: ripemd160
LUKS1: aes-xts-plain64, Key: 256 bits, LUKS header hashing: sha1, RNG: /dev/urandom

親切なヘルプ情報なので、cryptsetupコマンドのほとんどの操作はこのヘルプ情報を見ながらできるんじゃないかと思います。なお、ググれば、cryptsetupコマンドの詳細情報は結構見つかります。

それでは、前述の操作によって確保したパーティション/dev/sda3をLUKSパーティションに設定してみましょう。以下のコマンドによって、それができます。
# parted /dev/sda print free
Model: ATA INTEL SSDSA2CW08 (scsi)
Disk /dev/sda: 80.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
17.4kB 1049kB 1031kB Free Space
1 1049kB 19.9MB 18.9MB fat16 primary boot
2 19.9MB 65.3GB 65.3GB ext3 primary
3 65.3GB 76.0GB 10.7GB primary
4 76.0GB 80.0GB 4027MB linux-swap(v1) primary
80.0GB 80.0GB 73.2kB Free Space

# cryptsetup luksFormat /dev/sda3

WARNING!
========
This will overwrite data on /dev/sda3 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase: 〔← 任意のパスフレーズを入力する〕
Verify passphrase: 〔← 上と同じパスフレーズを入力する〕

上の「cryptsetup luksFormat」コマンドに「-c」や「-s」オプションを付加すると、暗号化の方式や鍵のビット長などを変更することができます。luksFormatに適用されるこれらのデフォルト設定値は、cryptsetupコマンドのヘルプ情報の「Default compiled-in key and passphrase parameters: ... LUKS1: ...」という部分に表示されています。

上で作成したLUKS用パーティションをファイルシステムとしてフォーマットするには、以下のようなコマンドを使います。
# cryptsetup luksOpen /dev/sda3 luks
Enter passphrase for /dev/sda3: 〔← LUKSパーティション設定時のパスフレーズを入力する〕
# ls -l /dev/mapper
crw------- 1 root root 10, 236 Jan 2 16:14 control
brw------- 1 root root 253, 0 Jan 2 16:21 luks
# mkfs.ext3 /dev/mapper/luks
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
654080 inodes, 2614784 blocks
130739 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2680160256
80 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

# mkdir /mnt/encrypted
# mount -t ext3 /dev/mapper/luks /mnt/encrypted

最初の「cryptsetup luksOpen」はLUKSパーティションをオープンするために必要なコマンドです。このコマンドを実行すると、/dev/mapperディレクトリの中にLUKSのデバイスファイルが作成されます。LUKSのデバイスファイルが作成されれば、それ以降は普通のパーティションと同様に、このデバイスファイルを使ってmkfs.*コマンドによってLUKSパーティション上にファイルシステムを作成したり、mountコマンドによってマウントすることができます。

そして、LUKSデバイスのマウント後は、ファイルの読み書きも普通にできます。
# cd /mnt/encrypted
# ls -l
drwx------ 2 root root 16384 Jan 2 16:22 lost+found
# echo hello > hello.txt
# ls -l
-rw-r--r-- 1 root root 6 Jan 2 16:23 hello.txt
drwx------ 2 root root 16384 Jan 2 16:22 lost+found
# cat hello.txt
hello

LUKSパーティションをアンマウントしたい場合は、以下の手順を実行します。
# cd
# umount /mnt/encrypted
# cryptsetup luksClose luks
# ls -l /dev/mapper
crw------- 1 root root 10, 236 Jan 2 16:14 control

cryptsetup luksClose 」はLUKSパーティションをクローズするために必要なコマンドです。このコマンドを実行すると、/dev/mapperディレクトリの下のLUKSデバイスファイルは削除されます。

■ LUKSパーティションの鍵操作


LUKSパーティションはヘッダ情報というものを持っています。LUKSパーティションのヘッダ情報は、下のコマンドによって確認できます。
# cryptsetup luksDump /dev/sda3
LUKS header information for /dev/sda3

Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: 74 cf a9 e4 33 dd b0 f8 3e d7 4f 0f cd e8 44 e4 83 59 59 54
MK salt: d9 b5 02 90 27 4f 74 b0 f6 fa fd 83 d8 d0 98 dc
18 b0 18 bb af 81 62 90 df 20 ca cf d2 af 69 2e
MK iterations: 46250
UUID: 9d42429a-7ca0-4557-891e-9e3529fda5b8

Key Slot 0: ENABLED
Iterations: 186045
Salt: b8 b3 0a 73 ca 4e 81 39 fe 47 b1 20 ef 61 2b 17
a5 08 f4 5c 62 da 63 07 17 87 b6 53 ad 90 09 7b
Key material offset: 8
AF stripes: 4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

LUKSパーティションの設定時に入力したパスフレーズは、ヘッダ情報内のKey Slot 0に保存されています。

LUKSパーティションのパスフレーズは複数登録できます。新たに登録したパスフレーズは、ヘッダ情報内の最初の空きスロットへ保存されます。
# cryptsetup luksAddKey /dev/sda3
Enter any existing passphrase: 〔← 登録済みのいずれかのパスフレーズを入力する〕
Enter new passphrase for key slot: 〔← 新しいパスフレーズを入力する〕
# cryptsetup luksDump /dev/sda3
LUKS header information for /dev/sda3

Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: 74 cf a9 e4 33 dd b0 f8 3e d7 4f 0f cd e8 44 e4 83 59 59 54
MK salt: d9 b5 02 90 27 4f 74 b0 f6 fa fd 83 d8 d0 98 dc
18 b0 18 bb af 81 62 90 df 20 ca cf d2 af 69 2e
MK iterations: 46250
UUID: 9d42429a-7ca0-4557-891e-9e3529fda5b8

Key Slot 0: ENABLED
Iterations: 186045
Salt: b8 b3 0a 73 ca 4e 81 39 fe 47 b1 20 ef 61 2b 17
a5 08 f4 5c 62 da 63 07 17 87 b6 53 ad 90 09 7b
Key material offset: 8
AF stripes: 4000
Key Slot 1: ENABLED
Iterations: 183118
Salt: 1e c2 93 20 66 5d eb 40 d6 00 db 7a 32 bb 61 56
71 10 1f e5 37 c3 ee 70 d9 26 8b 34 cf 93 fd 21
Key material offset: 264
AF stripes: 4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

設定済みのパスフレーズを削除することもできます。
# cryptsetup luksKillSlot /dev/sda3 1
Enter any remaining passphrase: 〔← 削除対象スロット以外のいずれかのパスフレーズを入力する〕
# cryptsetup luksDump /dev/sda3
LUKS header information for /dev/sda3

Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: 74 cf a9 e4 33 dd b0 f8 3e d7 4f 0f cd e8 44 e4 83 59 59 54
MK salt: d9 b5 02 90 27 4f 74 b0 f6 fa fd 83 d8 d0 98 dc
18 b0 18 bb af 81 62 90 df 20 ca cf d2 af 69 2e
MK iterations: 46250
UUID: 9d42429a-7ca0-4557-891e-9e3529fda5b8

Key Slot 0: ENABLED
Iterations: 186045
Salt: b8 b3 0a 73 ca 4e 81 39 fe 47 b1 20 ef 61 2b 17
a5 08 f4 5c 62 da 63 07 17 87 b6 53 ad 90 09 7b
Key material offset: 8
AF stripes: 4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

また、キー・ファイルを作成して、それをLUKSパーティションのパスフレーズの代わりに登録することができます。
# dd if=/dev/urandom of=/etc/luks_key bs=1 count=1024
1024+0 records in
1024+0 records out
# cryptsetup luksAddKey /dev/sda3 /etc/luks_key
Enter any passphrase: 〔← 登録済みのいずれかのパスフレーズを入力する〕
# cryptsetup luksDump /dev/sda3
LUKS header information for /dev/sda3

Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: 74 cf a9 e4 33 dd b0 f8 3e d7 4f 0f cd e8 44 e4 83 59 59 54
MK salt: d9 b5 02 90 27 4f 74 b0 f6 fa fd 83 d8 d0 98 dc
18 b0 18 bb af 81 62 90 df 20 ca cf d2 af 69 2e
MK iterations: 46250
UUID: 9d42429a-7ca0-4557-891e-9e3529fda5b8

Key Slot 0: ENABLED
Iterations: 186045
Salt: b8 b3 0a 73 ca 4e 81 39 fe 47 b1 20 ef 61 2b 17
a5 08 f4 5c 62 da 63 07 17 87 b6 53 ad 90 09 7b
Key material offset: 8
AF stripes: 4000
Key Slot 1: ENABLED
Iterations: 183118
Salt: a5 64 bf dd 2a 0d 09 b6 41 c2 42 1e 6c 1d 23 a2
c3 bd 47 e8 da fb fa b8 70 fb b0 70 87 bc d0 46
Key material offset: 264
AF stripes: 4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

キー・ファイルを登録した場合は、そのキー・ファイルを指定してLUKSパーティションをオープンできます。
# cryptsetup luksOpen /dev/sda3 luks --key-file=/etc/luks_key
# mount -t ext3 /dev/mapper/luks /mnt/encrypted
# ls -l /mnt/encrypted
-rw-r--r-- 1 root root 6 Jan 2 16:23 hello.txt
drwx------ 2 root root 16384 Jan 2 16:22 lost+found
# cat /mnt/encrypted/hello.txt
hello

この場合、パスフレーズの入力は求められません。キー・ファイルがパスフレーズとして扱われるからです。

■ LUKSファイルシステムの性能評価


実際にcryptsetupでLUKS暗号化ファイルシステムを使ってみた感想ですが、非常に良く出来ている優れ物のソフトウェアだと思います。ググってみると、cryptsetupとLUKSに関する多くの情報がヒットするので、これらはかなり広く使われているのでしょう。このように普及しているソフトウェアだと、どれ位の性能を持っているのかがすごく気になります。そこで、LUKSファイルシステムの読み書き速度の計測をやってみました。

LUKSファイルシステムの読み込み速度の計測は、次のコマンドを使って行いました。
# hdparm -t /dev/mapper/luks

書き込み速度の方は、次のコマンドを使って計測しました。
# sync;time bash -c "(dd if=/dev/zero of=/mnt/encrypted/bf bs=8k count=500000; sync)"

このコマンドの実行後に、 毎回Ctrl+c と 「rm /mnt/encrypted/bf」を実行しています。

LUKSファイルシステムの読み書き速度の計測結果は以下のようになりました。上記のコマンドによる計測をそれぞれ3回ずつ行って、もっとも良い値を採用しました。

ファイルシステム読み込み速度(MB/sec)比率書き込み速度(MB/sec)比率
素のext3263.3694.96
LUKS ext341.120.1542.400.44

比較のために、LUKSを設定せず通常のext3でフォーマットしたファイルシステムを使ったケースの計測値も示しています。

上表の2種類の計測値の差がちょっと大きすぎる気がします。Intel E38xxxにはAES-NIが搭載されているので、もっと高い性能が出るはずだと予測していました。ググってみると、AES-NIが有効なケースで、LUKSファイルシステムでも100〜200MB/sec程度の読み込み速度計測値が掲載されているページがいくつか見つかりました。もしかすると、cryptsetupの暗号処理でAES-NIが使われていないのかもしれません。本件については現在調査中です。

【2015/01/05 追記】

Yocto Linux(正確には、OpenEmbeddedリポジトリですが)のcryptsetupに関する重要なTips情報を書くのを忘れていました。

デフォルト状態のValley Island BSPを使ってビルドしたイメージにcryptsetupを組み込むと、「cryptsetup luksFormat <device>」コマンドの実行時に以下のようなエラーに遭遇します。
# cryptsetup luksFormat /dev/sda3

WARNING!
========
This will overwrite data on /dev/sda3 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:
device-mapper: reload ioctl on failed: No such file or directory
Failed to open temporary keystore device.
device-mapper: remove ioctl on temporary-cryptsetup-664 failed: No such device or address
device-mapper: reload ioctl on temporary-cryptsetup-664 failed: No such device or address
device-mapper: remove ioctl on temporary-cryptsetup-664 failed: No such device or address
device-mapper: remove ioctl on temporary-cryptsetup-664 failed: No such device or address
device-mapper: remove ioctl on temporary-cryptsetup-664 failed: No such device or address
device-mapper: remove ioctl on temporary-cryptsetup-664 failed: No such device or address

このエラーを解決するには、カーネルの以下の2つのコンフィグレーション設定項目を有効にしてください。
CONFIG_CRYPTO_XTS

-*- Cryptographic API --->
*** Block modes ***
<M> XTS support

CONFIG_CRYPTO_USER_API_SKCIPHER

-*- Cryptographic API --->
*** Random Number Generation ***
<M> User-space interface for symmetric key cipher algorithms

どちらもカーネルがサポートしている暗号処理機能ですが、Valley Island BSPのカーネル設定ではいずれもデフォルト状態で無効になっています。

「cryptsetup benchmark」というコマンドを利用して、上記のカーネルのコンフィグレーション設定項目が有効になっているかどうかを確認することもできます。どちらの設定項目も有効な場合、本コマンドの実行結果は以下のようになります。
# cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 377729 iterations per second
PBKDF2-sha256 236165 iterations per second
PBKDF2-sha512 186712 iterations per second
PBKDF2-ripemd160 298229 iterations per second
PBKDF2-whirlpool 109044 iterations per second
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 48.0 MiB/s 57.4 MiB/s
serpent-cbc 128b 23.3 MiB/s 24.7 MiB/s
twofish-cbc 128b 45.1 MiB/s 53.9 MiB/s
aes-cbc 256b 38.6 MiB/s 43.8 MiB/s
serpent-cbc 256b 23.3 MiB/s 24.8 MiB/s
twofish-cbc 256b 45.1 MiB/s 53.9 MiB/s
aes-xts 256b 57.6 MiB/s 58.5 MiB/s
serpent-xts 256b 25.3 MiB/s 25.0 MiB/s
twofish-xts 256b 53.4 MiB/s 54.8 MiB/s
aes-xts 512b 44.4 MiB/s 44.4 MiB/s
serpent-xts 512b 25.3 MiB/s 25.0 MiB/s
twofish-xts 512b 53.4 MiB/s 54.8 MiB/s

上記の両方の設定項目が無効な場合、「cryptsetup benchmark」コマンドの実行結果は以下のようになります。
# cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 378274 iterations per second
PBKDF2-sha256 236592 iterations per second
PBKDF2-sha512 185129 iterations per second
PBKDF2-ripemd160 297215 iterations per second
PBKDF2-whirlpool 109226 iterations per second
Required kernel crypto interface not available.
Ensure you have algif_skcipher kernel module loaded.

CONFIG_CRYPTO_USER_API_SKCIPHERがcryptsetupの*-cbcで、CONFIG_CRYPTO_XTSの方が*-xtsで使われる暗号処理機能です。cryptsetupのluksFormatに適用されるデフォルトの暗号パラメータは「aes-xts-plain64, Key: 256 bits」になっています。本エラーが発生する原因は、CONFIG_CRYPTO_XTSによって有効になる暗号処理機能がカーネル側に存在していないからです。

本エラーを解決するにあたって、共通鍵暗号処理について少し調べてみました(数学知識を持たない素人の理解なので、以降の内容が正確どうかは保証しません)。共通鍵暗号処理というのは、暗号化アルゴリズムとブロック操作モードの2つの大きな構成要素によって成り立っているらしいです。上記の件に関連して言うと、AESが暗号化アルゴリズムに、CBC(Cipher-block chaining)やXTS(XEX-based tweaked-codebook mode with ciphertext stealing)がブロック操作モードに相当します(ブロック操作モードはこの2つ以外にもいくつか種類が存在します)。以下のWikipediaページに共通鍵暗号処理のブロック操作モードに関する説明が掲載されているので、詳細が知りたければこれらのページの情報を参照してください。

 Block cipher mode of operation - Wikipedia, the free encyclopedia
 Disk encryption theory - Wikipedia, the free encyclopedia

暗号化ディスクボリュームにおいて使われる共通鍵暗号処理のブロック操作モードを比較すると、CBCよりXTSの方が圧倒的に強度が高いそうです。cryptsetupのluksFormatのデフォルト暗号化パラメータが「aes-xts-plain64, Key: 256 bits」になっているのは、この理由によるのだと思われます。

【参考ページ】

 LUKS(Linux Unified Key Setup)を使ってみる - think-t の晴耕雨読
 (Linux)LUKSでファイルシステムを暗号化してみた : 3流プログラマのメモ書き
 lost and found ( for me ? ): cryptsetup で暗号化ファイルシステムの作成
 dm-crypt/Device encryption - ArchWiki
 hdparm (日本語) - ArchWiki
posted by とみやん at 16:01| Comment(0) | TrackBack(0) | Embedded Linux > Yocto Project