2015年12月21日月曜日

btrfsでsnapshotを使わず消してしまったファイル復活

ext4だとextundeleteとか使うけどbtrfsはそれそのものの機能でなんとかなる(ことがある)
メモ.

まず,
# btrfs-find-root /dev/sdXY
これで大量にリストが出てくるうちの,
Well block 25240 seems great, but generation doesn't match, have=1000, want=1001
とかseems greatと書いてある行が出てきたらラッキー.
このWell blockのうしろにある数字(bytenr)を覚えておいて,
たとえばデスクトップ上のpngファイルを復活させたいなら,
# btrfs restore -t 25240 -v --path-regex '^/(|home(|/username(|/Desktop(|/.*\.png))))$' /dev/sdXY /tmp/restore
とすれば,btrfsでフォーマットされた/dev/sdXYから,btrfsのツリーのうちbtrfs-find-rootで見つけた25240という木の中の,--path-regexに渡した 正規表現にマッチするファイルを/tmp/restoreにダンプする事になる.

また,この一連の操作を行なうbtrfs-undeleteというシェルスクリプトがGPLv2で公開されている.
http://comments.gmane.org/gmane.comp.file-systems.btrfs/22560

以上

P.S.
やっぱりbtrfsは便利だし安心安定高機能,みなさん使うべきですね

2015年12月20日日曜日

Chinachuを/じゃなくてサブディレクトリの下で公開したかった

DTV AdventCalender 19日目の記事です

2016/04/09ページ末尾に追記

私事なのだけども,ChinachuにNginxをかまして運用している.
また,いろいろあってドメインのルートではなくディレクトリの下で動かしたかった.

そのためにやったいくつかのメモです.

まず,Nginxの設定.一部抜粋.

httpsで公開している.
locationのところでChinachuを公開するようにして,別のホストのサーバーに
プロキシしている.
proxy_set_headerでUpgradeとConnectionを設定してるのはWebSocketのため.
それとこれだと認証がないので,実際の運用ではNginxで認証かけてます.

最初はNginxのdigest認証モジュールを使おうとおもったのだけど,
http://tokcs.com/archives/1810
にあるように規格違反なバグが存在している.
他にもalgorithm=MD5とすべきを"MD5"としていたり,RFCに記述されてるEBNFをちゃんと読み取れてない事に起因するバグを複数みつけてしまい,VLCのdigest認証が予想以上に厳格だったのでつらくなった.

AURにdigestモジュールのNginxがなかったこともあって,
先のURLにあったパッチと手元で作ったパッチを適用するAURパッケージを作っておいた
https://aur.archlinux.org/packages/nginx-http-auth-digest/
が,Chromeなどでは使えるが未だにVLCに認証エラーで弾かれるのでまだバグがあるのだと思う.だれかNginxでdigest認証プラグインを運用してる人,教えてください.

次にChinachuの改変.
Chinachuはべつに特に設定する事なくちゃんと動いてくれるのだが,
Chinachuから動画を見ようとするとChinachuのAPIが返すjsonのパスがChinachuがルートで動いてる前提になっていて見れなかったりする.
次のパッチで解決.

以上で,Chinachuをドメインのサブディレクトリ以下で公開する事ができた.
まああんまりこういうことしてる人っていないと思うので,誰の役に立つかはわからないが,メモでした.

追記:
2015年11月のコミットで既に対応していたのに気がつきませんでした……

commit 5de01b3dfbe79ed33109b24bf91e2d8c985d69c4
author: takaakis62 <takaakis62@users.noreply.github.com>

WUI/Client: リバースプロキシ使用時に再生できない問題を修正

とのことでした.
アップデートは頻繁にやりましょう……

2015年12月17日木曜日

Nginxとアタック

さいきんこっそりNginxを使いはじめた.
すると,アクセスログをみるといろいろなお客さんが居ることに気がついてちょっと面白かったのでメモ.

ひとつめ.ひたすら/admin/phpmyadmin/...とかにアクセスしようとするヤツ.
アクセス元のIPアドレスは中国からだった.
どうやらMorfeus F*cking ScannerとかいうPHPの脆弱性スキャナがあるらしい.
他にも同様のスキャナにZmEuとかもあるようだ.

ふたつめ./cgi-bin/env.cgiに対してGETをしようとして,リクエストの中身がperlを叩きに行こうとしてたりあからさまにOSコマンドインジェクション狙ってそうなやつ.
これはTrojan.Perl.Shellbot-2というトロイウィルスらしい.
http://psychoid.usというURLにwgetをして更なるウィルスのDLを目論んでいたようだ.
アクセス元はオランダ.

どちらも,私の環境だと不発で終わりなので問題はナシ.

GeoIPで特定のお国を弾くとか,UAで弾くとか,やれる事はありそうだけど,
UA偽装されてるとつらいしIPで特定の国を弾くとかやりすぎると閲覧できる人が限られてしまって苦しいところ.今は個人的にしか使ってないからIPで国をJPだけにとかで何も困ってないけど,ブログとかのコンテンツを置くようになったらどうするべきなんでしょ.

BFQスケジューラ

私事ですが,この前買ったVAIO Pro 13 | mk2のカーネルをZENパッチセットを適用したlinux-zenにしました.
ArchLinuxではなぜか公式レポジトリ入りしてるのでバイナリが降ってきます.
それ以前はlinux-drm-intel-nightlyから自分でビルドした4.4rcのカーネルを一瞬使ってましたが,このマシンで発生しているチラつきや不安定な挙動の解決に有効ではなかったようなのでやめました.

閑話休題

pfパッチセットやZENパッチセットではI/OスケジューラにBFQが採用されています.
ckパッチセットではデフォルトではないもののBFQが使えるようです.
さて,そこでBFQスケジューラについて調べ,まとめました.

BFQスケジューラとは

  • BFQ = Budget Fair Queueing
  • インタラクティブなアプリのための低遅延なsched
  • マルチメディアのようなsoft real timeなアプリのための低遅延なsched
  • 高スループット(CFQに比べHDDで30%高速)
  • 強い公平性
などがメリットとして上げられています.
Manjaro,OpenMandriva,ArchLinux ARMのデフォルトI/Oスケジューラになっている模様です.(ManjaroはCPUスケジューラにBFS,I/OスケジューラにBFQをつかってるみたいですね.)
ホントかよ?と思いますが,ここに挙げられているテスト結果を引用すると[1]


たとえばSeagateのHDDにおいてスループットのテスト(上図,高いほど良い)やxtermの起動時間テスト(下図,小さいほど良い)でとても良い結果を出していますが,
この図のようにOpenOffice Writerの起動時間テストでは他のスケジューラに大きく差を付けて悪い結果を出してしまっていたり, また,PLEXTORのSSDにおいて,
スループットが他のスケジュールとほぼ差がなかったり(やや負けている)しています. ただ,PLEXTORのSSDでのxtermの起動時間とOpenOffice Writerの起動時間は,

けっこう良いみたいですね. ほかにもサイトにはToshibaの1.8" HDDやTranscendのmicroSDHC,SamSungのeMMCなどのテスト結果が掲載されています. OpenOffice WriterがHDDで起動がかなり遅い問題については,複合的要因によるらしく,その要因として考えられる事項がサイトにて挙げられています.

BFQのアルゴリズム

テクニカルペーパーより[2]

モデルと用語の定義

ストレージデバイスNコのアプリケーション集合,そしてその間にBFQスケジューラがあるという構成のストレージシステムを考える. ストレージデバイスは連続的なシーケンス,固定長セクタ,そして各シーケンス中の位置が識別されるものとする.
ストレージデバイスは2つのI/Oリクエストを受ける. 連続的なセクタに対しての読み込みと書き込みである. リクエストはシーケンシャルかランダムで,これは最初のセクタへのリクエストは,他のリクエストの最後のセクタへのリクエストの直後に位置するかしないかという事になる.
リクエストはNコのアプリケーションにより発行される. このアプリケーションは実システム上でストレージアクセスの終了を競合する,たとえばプロセスやスレッドを指す. ここで,アプリケーションの保留されているリクエストを,アプリケーションのバックログと定義する. バックログが空でないアプリケーションは,バックログしているアプリケーションと言う. バックログしていない状態をアイドルと言う.
まとめると,アプリケーションのシーケンシャル/ランダムのリクエストは以前のリクエストに関連して発行される場合がほとんどである.また,リクエストが完了した場合のみに次のリクエストを発行する時は同期的なアプリケーションで,そうでない場合は非同期的である. ストレージデバイスがリクエストを受けているとき,そのリクエストを発行したアプリケーションはストレージデバイスよりサービスを受けていると言う.

アルゴリズム

図1. BFQの論理スキーム
add_request()によりリクエストがキューイングされる. 各アプリケーションはリクエストキュー(request queue)を持っており,このキューはバックログである.つまり,空である場合アイドル,空でない場合にバックログされていると言う.
一度にストレージデバイスにアクセス可能なのは一つのアプリケーションのみであり,このアクセスしているアプリケーションをサービス中のアプリケーションという.各アプリケーションはサービスにアサインされるための予算(Budget)を持っており,予算の尺度はセクタ数である. アプリケーションがサービスに入った場合,予算が尽きるかバックログが空になるまで排他的にサービスを受け,アイドルになる. そしてBFQは次のサービスを受けるアプリンを選び出す.つまり,予算が尽きるかバックログが空になるという2つのイベントが発生するまでプリエンプティブではない. BFQがバックログされているアプリケーションを持たない状態から最低1つ持つ状態に変更するのはapplication service loopが行なう.このループは次のような順の処理を行う.
  1. 次のサービスを受けるアプリケーションの選択
    B-WF²Q+という公平なキューイングスケジューラが次のバックログされているアプリケーションを選択
  2. リクエストのディスパッチ
    ループはOSによるdispatch()を待つ.これが発行された時,次が発生する.
    a ) C-LOOKアルゴリズムによるローカルなスケジューラがアプリケーションのキューからリクエストを取り出す
    b) ディスパッチされたリクエストのサイズだけ予算を減らす
    c) 予算が尽きたかバックログが空になるまでステップ2を繰り返す.どちらかが発生したら次のステップへ
  3. アプリケーションのサービスを停止し,予算を再計算する
このループの中で,このスケジューラが一番利益を出すために最も負担になる部分は,B-WF²Q+が予算のサイズにかかわらず(断片的な)スループットを保証するためにアプリケーションをアサインする所である. これは直感的で,大きな予算が割り当てられたアプリケーションはその分長くデバイスを使えるため,B-WF²Q+のアプリケーションの選択が全体と各々のスループットのバランスを左右する.

おわりに

ほぼ公式ページをそのままうつしただけになってしまった上に,肝心のB-WF²Q+についてまで論文を読む時間と気力がなかった.B-WF²Q+はどうやらINFOCOM'96で発表された,パケット等のスケジューリングに使われるWF²Qがベースっぽい[3].もっとちゃんと調べておこうと思う.C-LOOKアルゴリズムも調べておきたい[4]

参考文献

^[1]: Budget Fair Queueing (BFQ) Storage-I/O Scheduler - Test result http://algo.ing.unimo.it/people/paolo/disk_sched/results.php
^[2]: Paolo Valente and Arianna Avenzini ``Evolution of the BFQ Storage-I/O Scheduler'' Techinical Paper, http://algo.ing.unimo.it/people/paolo/disk_sched/mst-2015.pdf
^[3]: John C.R. Bennett and Hui Zhang ``WF²Q: Worst-case Fair Weighted Fair Queueing'' INFOCOM'96 24-28 Mar 1996, 1, 120-128, link
^[4]: Tobey J. Teorey and Tad B. Pinkerton ``A comparative analysis of disk scheduling policies'' Communication of the ACM Mar 1972, 15, 3, 177-184 link

2015年12月7日月曜日

VAIO Pro 13 | mk2 を購入 + Linuxインストールした

2014年春にThinkPad Edge E145を購入し,使用してましたが,


などが発生しており,コアもA4-5000なので動画再生は良いけどビルドの時とかが微妙だなあって考えるようになった.

ので,VAIO Pro 13 | mk2をタッチパネルモデルで購入しました.
いろいろ妥協して,Core i5 + 8GB DDR3 Memory + SATA SSD(256GB)

今日初めて自分以外でVAIO Pro 13 | mk2でLinuxを使ってる人を観測できたので,私も忘れないうちにハマりポイントとレビューを残しておきます.

画像多めです

レビュー



開封直後からWindows 10 Threshold 2のアップデートがw
受けとったその直後からカーネルVMキャンプ第二回参加のために一夜車に乗り谷川岳へ
谷川岳はヤマノススメの,ひなたとあおいの約束の山なのですが,ロープウェイ乗り場にヤマノススメが4巻(谷川岳登山)から以下続刊が置いてありおもしろかった.

(谷川岳のふもと,水上の古民家)

しゅううせんせー(@syuu1228)に借りたVAIO Pro 11(左)とVAIO Pro 13 | mk2
VAIO ProやVAIO ZはAMIのAptioの改造を使ってたようですが,UEFIのBoot Entryがちゃんと見えない上に
VAIOレスキューモード(UEFI設定に入る前に独自UEFI Appがhookして起動するぽい)を起動した瞬間Boot EntryをWindowsだけに初期化してくれやがる仕様だったのが,
mk2からPhoenixのSecure Coreになりタッチ対応,Boot Entryもグラフィカルに設定できるように.

方々のリリースで"VAIO Pro 13 | mk2はほぼフルモデルチェンジ"とのことでしたがそれはファームウェアもモデルチェンジのようで,UEFIであそぶことのある私には嬉しい誤算でした.

充実のインターフェイス.左から,SDスロット,3.5mmφミニヘッドフォンジャック,充電対応USB端子(雷マーク付き,USB 3.0),HDMI,Ether,VGA

反対側にも左側にもUSB 3.0端子が2つ. USB端子の色が全部黒でおどろきでした(規格とかどうなってるんだろ)



手持ちの録画データ(蒼き鋼のアルペジオ)をThinkPad Edge E145と同時に再生して比較

いやあ,さすがにsRGB面積比93%カバーらしいIPS液晶は違いますね.
ThinkPadがそもそも青めのTN液晶なので比較相手が悪いのはありますが……
おなじThinkPadならIPSなX250のFullHDとかと比較したいですね.

いままで右の青いやつに慣れきってたので,こんな青いものみてたんだという
純粋な驚愕がありました.

スピーカーはここ,ディスプレイに反射させて正面の人間に届く,と.
これはすごいなあってびっくりしました.それに音もわりと悪くない.音量も.
クソ耳なので信用できない感想ですが.

公式サイトにあったようにペン挟んでもまったく無傷,剛性も安心ですね.
なんか煽られてつい試してしまったけどこれで壊れたら私どうするつもりだったのだろう.


Linuxで使う

さて,私はLinuxユーザーなのでLinuxを使います.
Windows 10大好きなので,UEFIでデュアルブートです.
ブートローダーはrEFIndがお好き.

いつもはXfceだったり,KDE5だったりですが,今回はタッチパネルとの親和性を考えて
GNOME3.GNOME3は3.4とかのときにGentooでhard maskされてるのを使って,
いろいろとハマったのでちょっと怖かったのですが,結論から言うととてもよかった
ArchLinuxなのでかなり新しいGNOMEですが.


ちょっとまえはFaenzaアイコンとGleybird themeとか,KDEだとBreezeで揃えるとかしてましたが,いまGTK3で他のタブレットやPCのOSとFeel&Look近いフラットな感じにしようとするとNumixみたい.

だいたいアイコンとテーマはArchLinuxのAURのvote数で多いやつを上からいくつかまとめて入れて,それぞれつかってみて決めてるけど,ここ半年ぐらいは何も考えずNumixです.

ところでひさびさにLinuxのLANGをen_US.UTF-8ではなくja_JP.UTF-8にしてみました.特に理由はないけどなんとなく.

ほぼGNOME3を入れてそのままで何も困らなかったのですが,2点困ったところをメモ
(上記画像はいくつかextension入れてますがこれは困っていれてる,というより便利だから入れてみたものですね)

まず1点.suspend/resumeの後にキーボードとタッチパッドが使えない.

そもそもVAIO Pro 13 | mk2は日本でしか出てないモデルなのも手伝ってかVAIO Pro 13 | mk2でLinuxという情報が皆無です.唯一見つけたのはDebianのMLの,
https://lists.debian.org/debian-boot/2015/08/msg00381.html
そのキーボードとタッチパッドがresumeしたら死ぬという報告1つに留まるのみ.
いや,もうひとつフランス語(なぜ……?)の同様の報告をみつけたが,
的外れな回答が付くのみで解決となっていない
http://www.generation-nt.com/reponses/clavier-qui-se-blo-entraide-4261319.html
(Google翻訳で英語にして読んだので,読み間違えてるかもしれない)

これについて解決法を発見した.どうやら,キーボードコントローラマイコン(i8042)が勝手に取り外してるように思える.(コードは読んでないのでそうじゃないかもしれない)
が,とりあえず次のコマンドで再接続させる事で使えるようになる.
# echo -n reconnect > /sys/devices/platform/i8042/serio0/drvctl
# echo -n reconnect > /sys/devices/platform/i8042/serio2/drvctl
1行目がキーボード,2行目がタッチパッド.0とか2の数字はもしかしたらハードによって違うかもしれないのでdmesgなどで要確認

しかし,これをresume毎にオンスクリーンキーボードで入力するのはとてもじゃないがやってられない(タッチパネルは使えるのだ!)
ので,次のスクリプトを/usr/lib/systemd/system-sleep/に実行属性を付け配置し,systemdのsystemd-sleepのhookをする
これで,もうsuspend/resumeが怖くない.

2点目,Intel HD Graphicsドライバの不安定さ

たまにチラつくぐらいならいいけど,数時間使ってると突如画面がまっくらになる事がある. 温度が関係しているのかもしれないけど,すこしわからない.
2Dアクセラレータをsnaからglamorにしてみたり,uxaにしてみたりするけどあんまり変わらない気がするけど,結局いまはデフォルトに加えてTearFreeだけonにして使ってる.
そういえば最近画面落ちないな.X11ドライバの問題かi915ドライバの問題かまだよくわかってない.
そもそも,Windows 10にしたところでIntel HD Graphicsドライバが頻繁にクラッシュするのでどうしようもない気持ちになる.コードちゃんと目を通すべきだろうけどできてません.

やったことといえばプラットフォーム固有のACPIカーネルドライバであるsony_laptop.koを自動起動するようにしただけだが,/sys/devices/platform/sony-laptopが見えないためキーボードライトの制御とファンの制御と充電の制御ができない.おかしいな?

まあ最近あまり困ってないし,画面が落ちても1度電源ボタンかlidイベントつかってsuspend/resumeすれば復活するのがわかったので気にしない事にした.
suspend/resumeにまつわる問題も解消したし.


その他,設定と感想

とりあえずTLPをいれてある.設定の変更はしてなく,デフォルト.Windowsのバッテリー優先モードぐらい保ってくれるかなあ?
GNOME Shell ExtensionはArchLinuxのgnome-extrasパッケージグループで入ってくるやつと,Freon, Caffein, MediaPlayer, Weather, Skype integrationをAURからいれてる.

ついでに,WQHDやQHD+ほどじゃないけどいちおうHiDPIでWindows 10は125%表示にしてるので,GNOME Tweak Toolsで字のサイズを1.15倍ぐらいにしてみてる.けっこう良い.

普段使わないので困ってはないが,実はuvcvideoドライバがVAIO Pro 13 | mk2に搭載されてる新しいWebカメラに非対応らしく(uvcvideoプロジェクトページの対応デバイス一覧になかった) GNOME3のWebカメラツール,Cheezeは起動すると一瞬画像を表示してからクラッシュする.しかし今Skypeを試したら普通にWebカメラが使えていたのでよくわからない……

基本的にシャキシャキ動いてくれるし,画面キレイだし,タッチパネルはトラックポイント使えなくなった変わりにとても便利に使えてくれる.

11.6" WXGAで暮らしてたとこから13.3" FHDは夢みたいな世界だった.

そして起動が速い.Windows10もLinuxも体感的にほぼ同じぐらいの速度だ.
systemd-analyzeによると6秒ぐらいって言われた.Extensionいろいろ入れたから少しその6秒から遅くなってるかもしれないが,十分だ.いままでHDDのマシンしか所有したことがなかった.NVMe SSDだともっとすごいのだろうな……

基本的に性能やデザイン,剛性などどれも気にいっており,電池がすこし心許ない事以外は概ね満足している.これで進捗増えると,いいなあ.
ところでタッチパネルだとコンテンツをタッチしてスクロールさせたいので,mikutterのGTK3対応が望まれる.

追記

前回ThinkPad Edge E145を購入したときはその前の初ラップトップであるThinkPad X121eの中身をtar backupしたものをそのまま展開し,少々設定を変えるだけにした(どちらもAMDのAPUな11.6"モデルでわりと近いモデルのため)ので,ひさびさにイチからラップトップにインストールする事となった.
X121eのときから引きずって消しそびれたけど消していいかわからなくなってるドットファイル(ディレクトリ)群とか全部なくなって丁度良かったかな.

2015年12月6日日曜日

ねこ

いつもの駅に行く道すがら,女の子が何人か何かを囲んでたのでふと見てみると,
古い町の電気屋の前でノラネコがいた.


ちょっと小生意気な顔した,野良で強く生きてんだゼ感出してるように見えてかわいい

なんとなくラップトップのアカウント画像にしてます.
GNOME3案外便利だった.

2015年11月20日金曜日

Linuxとbluetooth

Prime MusicがAmazonから提供されるようになったので意味もなく
ブルースとかレゲエとかヘヴィメタルとか聴いてます

閑話休題

ブルースではなくbluezです
私のラップトップはThinkPad Edge E145なのですが,これのwifiが
Broadcomの43228 + 20702A1 comboです.
43228(pci)のほうは,Linuxカーネルのリバースエンジニアリングドライバ(メインライン)なりプロプライエタリのwlドライバなりが存在します.
なので,無線LANには困りません.
もう片方,207021A(vid:0a5c, pid:21f3)のほうが問題でした.
btusbドライバがカーネルにはあるので,ちゃんとデバイスは読めるのですが,
バイナリブロブ(ファームウェア)は存在しません.
なので,このbluetoothインターフェイスは使えませんでした.


しかし,これの解決方法を知ったので以下に

1. 公式のWindowsドライバをDownload

ThinkPadならば,普通に公式サイトからダウンロードしてください
他のマシンでも同様です.
または,http://catalog.update.microsoft.com/v7/site/ScopedViewRedirect.aspx?updateid=87a7756f-1451-45da-ba8a-55f8aa29dfee
から.cabのパッケージをダウンロードする手もあります

2. 解凍

普通にexeをダウンロードしたらならば,wineかWindowsで起動して中身を取り出します
setupに必要なファイル群が解凍されたらsetupそのものは実行しないようにすれば良いです
cabをダウンロードしたならばcabextractコマンドをインストールして使いましょう

3. インストール

まず,lsusbコマンドで自分のマシンのbroadcomなbluetoothデバイスのIDを控えましょう
ID 0a5c:21f3となっていれば,0a5cがvid(ベンダーID)で21f3がpid(製品ID)です

解凍先のWin32とかWin64とかのディレクトリをを見にいきましょう(32か64はどっちでも良いです).
cabextractでcabから取り出したならばならコマンドを実行したディレクトリにファイル群が展開されます.
*.hexというファイルが,Windowsのbroadcomなbluetoothドライバファームウェアです.*.hexは大量にあるので,まず,
bcbtums-win8x64-brcm.inf
とかそんな感じのファイルを探して,開きます.

このファイルをlessとかで開いて,先に控えたpidで検索します.
おそらく,
%BRCM20702A1.DeviceDesc=%BlueRAMUSB21F3, USB\VID_0A5C&PID_21F3 ...
みたいな行がまず見つかります.
この行の一番右の列に自分のマシンの名前(たとえばこのThinkPad Edge E145なら,Lenovo Edge 43228 + 20702A1 comoboとありました)があるでしょうか?

それが確認できたら次は,BlueRAMUSB21F3 というinfのセクションを検索します.
すると,そのセクションの中に,*.hexのファイル名が書いてあるのを見つける事ができるかと思います.

たとえば43228 + 20702A1 comoboならばBCM20702A1_001.002.014.1443.1448.hexです

最後に,bluez-utilsに入っているhex2hcdコマンドをつかって,
$ hex2hcd BCM20702A1_001.002.014.1443.1448.hex
# mv BCM20702A1_001.002.014.1443.1448.hcd /usr/lib/firmware/brcm/BCM2070A1-0a5c-21f3.hcd
としてください.これで,rebootするかbtusbドライバをmodprobeなどで一度rmmodしてからinsmodをしてやるなどすると,bluetoothデバイスがつかえるようになります.

/usr/lib/firmware/brcmに移動してやる時のファイル名は,BCM2070A1-(VID)-(PID).hcdになっています.このファイル名はdmesgでファームウェアのロードに失敗している箇所でも確認可能です.

また,infにかかれているファームウェアファイルがかかれたセクションは一般にBlueRAMUSB(PID)になってると思われます.

なお,同様の手段でDell XPS13 (2015含む)などでもbluetoothがつかえます.

以上でした.

2015年11月14日土曜日

解決方法募集中! K-9 Mailで受信に失敗

表題の通り.
Outlook.comのメールをAndroidのK-9 Mailで受信しようとしたところ,
Username or password incorrect.
(Command: AUTHENTICATE PLAIN; response: #2# [NO, AUTHENTICATE failed.])
というエラーで失敗.
しかし,まったく同じuserとpassでsmtpの認証は通っている他,
このメールは独自ドメインのメールだが同じドメインのOutlook.comのアカウント
複数あるものはどれも受信が問題なく行う事ができる.

また,先月末までは何も問題なく受信できていました.

他の問題ないアカウントとこのアカウントの差異といったら,
このアカウントがOutlookメール(プレビュー版)になっているところ.

もしかしてプレビュー版だと認証とか少し変わったのだろうか.

だれか詳しい人,あるいは同じ症状の人,情報お願いします.

切実.

足りないカーネルモジュールを知る

カーネルを自前ビルドしてると,いざという時にいくつか機能が足りなくて頭を抱える事がままある.

怒られたやつつっこんでビルドしてリブートするもまだ足りなくて……
みたいなのはもうやめたいと考えていたが,良い方法を知ったので以下紹介



これを/tmp/modprobeに配置
それから,
$ chmod a+x /tmp/modprobe
最後に
$ echo /tmp/modprobe | sudo tee /proc/sys/kernel/modprobe
これでカーネルが機能が足りないとき,modprobeをしようとして/tmp/modprobeを呼ぶ.
すると,modprobeしようとしている内容が/tmp/modprobe.logに出るわけだ.
あとはそのモジュールについて,カーネルコンフィグしてリビルドすれば良い

2015年11月12日木曜日

SSL/TLS証明書を買いました

最近宅内のファイルサーバーと録画サーバーを内側セグメントにまとめてしまい,
DMZのRPiはファイルサーバーではなくNginxでリバースプロキシにしてしまった.

Chinachuを導入したついでにTLSのDV証明書を購入したという話.

べつにオレオレでも良いけど,今丁度さくらのSSL代理購入がキャンペーンで
ラピッドSSLを1年目タダで売ってて,まあさくらのアカウントもってたのでものの序でです.

http://ssl.sakura.ad.jp/

ついでのついでに,そのうちWebページをそのドメインで公開してブログもひっこすかも.
これはあくまで予定で,しばらく着手してる暇はなさそうです.

2015年10月9日金曜日

セント・カノッサ学園支部





今日読んだ












これ知らなかったのですが





最後に




おまけ


わたしのせいで感染者増えた


2015年5月14日木曜日

SecureBootとLinux

みなさんUEFIしてますか(挨拶)

UEFIではSecureBootという機能があり,Windows以外が起動できないかもしれない云々という話はみなさんの記憶に新しいかと思います.

将来の話はともかく,現状でもSecureBootが有効だとLinuxが起動できないという誤解も一部蔓延してるようなので本記事を執筆するものであります.

本記事はSecureBootを有効にしてLinuxを起動しようとしてたけどイマイチ方法わからなかったという人にも有効かと思われます.

2015年3月26日木曜日

Google Container Engineでハマったところ

Google Container Engine (GKE)はKubernetesのクラスタを作り,Dockerコンテナを大量に上げるまで自動でやってくれたりするサービス.
VMコンテナ自体はGCEと同様に管理できます.

で,クラスタなんかもGoogle Cloud SDKのgcloudコマンドで色々と手元からCLIでできるのですが,ハマりました.

ハマりポイント

gcloud preview container kubectl create -f sample.json --cluster="<CLUSTER NAME>"
これでsample.jsonにswagger形式で記述したクラスタが上がる……はずなのですが
なぜか手元ではタイムアウト.次のようなメッセージが飛びます
ERROR: F0326 10:43:53.728513    5117 get.go:166] Get https://130.211.179.83/api/v1beta1/pods?namespace=default: dial tcp 130.211.179.83:443: i/o timeout
kubectl get podsなど,他のkubectlのコマンドも同様にタイムアウトしてハマってました.

これは,一度作ったクラスタを削除して,また同じ名前でクラスタを作成した後の操作でした.
実はこれがハマったところのポイントで,
$HOME/.config/gcloud/kubernetes/<PROJECT>.<ZONE>.<CLUSTER NAME>/
に配置されている,cluster.jsonに,
{
    "endpoint": "130.211.179.83"
}
のような形式でgcloudコマンドを通してそのプロジェクトへkubectlをする時のエンドポイントのIPアドレスがキャッシュされてました.
なので,以前同じ名前でクラスタを作って,gcloudコマンドを使った事がある場合,その前の時のIPアドレスをつかってkubectlを発行するため,タイムアウトしてしまうというオチでした.

このcluster.jsonを削除してしまえば解決します.

2015年3月24日火曜日

EdgeRouterLite-3をGentooで運用しはじめました+IPv6導入(本篇)

前提

  • これまでのネットワークは,BaffaoのBBR-4MGをブロードバンドルータにしてた
  • 100Mなネットワークで,IPv6未対応だったので,IPv6+GbEにしたい
  • 既存ネットワークのトポロジは下図の通り.
  • ただし,これからの記事でアドレスについてはxxxxで伏せさせていただきます
ファイアウォールはBBルーターとパーソナルファイアウォール任せな感じの,よくある一般的なネットワークっぽい.APは諸事情によりRaspberryPiにやらせてて,RaspberryPiにはUSB HDDが接続してありLAN内のファイルサーバとなっている.

これを,次のようにした.

いままで市販のBBルーター任せであんまり考えてなかったファイアウォールルールをイチから見直した事と, 外から自宅にアクセスするために外部にもBBルータの機能で静的ポートフォワードしていたRaspberryPiを, サブネットで分離してちゃんとDMZとして機能するようにさせたところがポイント.とはいえDMZは全部フォワードしてるわけじゃなくて,結局静的ポートフォワードでやってます.

図に書き忘れましたが,IPv4 PPPoEの出口がppp0,IPv6 PPPoEの出口がppp1になってます.

IPv6だと,NATが必要ないのでちょっと設定に戸惑いました.むしろNATとか頭から追い出してちゃんと考えればIPv6のほうがラクっぽいかも.

ネットワーク図がアレゲなのは勘弁してください……
あと,セキュリティの事を言うとまだまだ足りないとこが沢山ある気がしますね.
本当はルーターに色々やらせすぎなんだとおもいますが,ウチは負荷がかかるネットワークではないのでそこは良いかな.

なお,フレッツ系のプロバイダで,IPoEなIPv6が使えない環境だったので,
PPPoEを2セッション張る事にしています.

実際どのようにしたか,以下に記します.
参考: Home Router - Gentoo Wiki

設定(IPv4)

このように設定して,
# cd /etc/init.d && ln -s net.lo /etc/init.d/net.ppp0
# rc-update add net.ppp0
# rc-update start net.ppp0
これでIPv4のPPPoEは自動起動します.
ユーザーネーム,パスワード,dnsサーバーはISPから通知されたものを記入しておきます.

次にこれはdnsmasqの設定です.DHCPサーバーと,簡易DNSキャッシュサーバーをやってくれます.他にも色々機能はありますが……
とりあえずこのようにeth1とeth2にDHCPを振っておきました.
他にもDMZのRaspberryPiと内部ネットワークのPS3にもMACアドレスに対して固定IPを振ってます.

最後に,iptables.

これでNATが有効になり,パケットがフォワーディングされます.
ここで,RaspberryPiに接続したHDDに録画データを溜めてるのですが,
これをDLNAでPS3から再生したかったので,minidlnaを導入してます.
そしてサブネット越えのため,igmpproxyも導入しました.

参考にしたGentoo WikiはLAN側のサブネットは1つである前提であるため,2つのサブネットのルーターの設定に最初悩みました.特に,dnsmasqのタグ機能に最初気がつかなかったところと,iptablesのフォワードのルール.

設定(IPv6)

まず最初に,IPv6の場合のPPPoEについて調べました.

図はNTT東日本の次世代ネットワークに関する方法のページより,NGN IPv6 ISP接続<トンネル方式> UNI仕様書から拝借.

フレッツ系のISPでIPv6 PPPoE接続の場合,対向サーバーとPPPoEクライアントはリンクローカルアドレスで通信が確立されますが,グローバルアドレスがまだ払われません.
IPv4ではIPCPでアドレスが払われますが,IPv6CPではプレフィクスが払われる直前まででシーケンスが終わってるためです.

なので,ここでDHCPv6-PDにより,プレフィクスを上位より払い出してもらう必要があります.フレッツの場合,/56のプレフィクスが払い出されます.下位64bitは自分で決めて,PPPのインターフェイスにそれを設定する必要があります.

まず,PPPoEの設定について.IPv4の時のコンフィグファイルに次を追記.
更に
# cd /etc/init.d && ln -s net.lo /etc/init.d/net.ppp1
# rc-update add net.ppp1
# rc-update start net.ppp1
次にDHCPv6クライアント.

私は,Gentooのportage treeにあったのでdibblerをつかいました.
dhcpcdISC dhcpだとpppのインターフェイスに対しては使えないので,別の物を使う必要があります.KAMEプロジェクトのWIDE DHCPv6でも良いとおもいます.

dibblerの場合,デーモン起動すると/var/lib/dibbler/以下にxmlでプレフィクス情報等が吐き出されるので,それを使って自分で設定します.
24xx:xxxx:xxxx:xxxx/56が払われたとして,ppp1の下位64bitは0000:0000:0000:0001を割り振るとします.
# ip -6 addr add 24xx:xxxx:xxxx:xxxx::1 dev ppp1
# ip -6 route add dev ppp1

これでルーターからはping6コマンド等で外との疎通を確認できるはずです.

さて,LANのノードにもプレフィクスを教えてやらねばなりません.
そのためには,DHCPv6でステートフルに設定するか,SLAACでステートレスに設定するかの二通りがありますが,私は後者を使いました.

SLAACはRA(Router Advertisation,ルーター広告)を使います.
LAN側にルーターがRAを流せば,LAN側のノードは受け取ったプレフィクスと,自分のイーサネットインターフェイスのMACアドレスを組み合わせて,自動にグローバルアドレスを生成するので楽です.

また,SLAACでグローバルアドレスを設定すると,デフォルトゲートウェイは自動的にRAを流したノードに設定されます.

DNS情報だけは別の手段で(たとえばdnsmasq)教えなければならない……という過去があったようですが,今はRAでDNSも通知できるそうです.

RA通知にはradvdを使いました.radvdのコンフィグは以下です.
これでLANに向けてプレフィクスが広告されます.
よって,IPv4とちがい特にiptablesを設定したりしなくても,個々のノードにIPv6のグローバルアドレスが振られるため通信が可能となります.
しかし,フィルタリングをしないとIPv4+NATよりも脆弱な状況です.

なので最後にIPv6のiptablesを設定しました.

ICMPv6はICMPと違い,ARPの代わりに近隣探索等も熟すので,許可してあります.
が,もうちょっと本当は絞れる気がするので今は試行錯誤しています.

補足

本来,起動スクリプトで,IPv6 PPPoE → dibbler → dibblerが/var/lib/dibblerに出力したxmlをパースしてpppインターフェイスへグローバルアドレス割り当て,ルーティング設定 → さらにそのプレフィクス情報を使ってradvd.confを自動生成 → radvd起動
という風にすべきだとおもいます.
しかし,ISPから払い出されるプレフィクスは半固定で,滅多な事がないと変化がないようなので,プレフィクス部分を決め打ちにするコンフィグファイルで対応してしまいました.

また,上記設定について,説明を端折りましたが,rc-updateコマンドでそれぞれのデーモンは登録する必要がありますね.

EdgeRouterLite-3をGentooで運用しはじめました+IPv6導入(OS環境構築篇)

先日,@syuu1228先生からEdgeRouterLite-3を頂く機会があったので,
自宅のネットワークを全面的に直しました.

EdgeRouterLiteとは

RJ45ポートは左から,コンソール,eth0,eth1,eth2.右横にUSBポート.

Ubiquiti社の製品,EdgeRouterシリーズの下位モデル.EdgeRouterLite-3はギガビットポートを3つ持つルーターで,この3つの使い道は特に限定されてません.
2ポートをブリッジしてWAN+LANなよくあるBBルーターでも良し,1WAN2LANなルーターでも良いし,2WANにしてロードバランスとか冗長化するのも良いかもしれません.

性能としては,OCTEONのMIPS64 500MHzのデュアルコアに,DDR2メモリが512MBと,
結構高性能です.ハードウェアスペックだけを見れば,定価10万円くらいのYAMAHA RTX1200以上の性能が出ると噂です.ポートが少ないですが…….価格はUS$100とかなりお手軽,ただし日本だと代理店が無いので
楽天から買うと2万円ぐらいになるかもしれません.

詳しくはInternetWatchのこのレビューがわかりやすいでしょう.
どっちでAzureにつなぐか? Ubiquiti Networks「EdgeRouter LITE(ERLite-3)」を試す

個人的には公式のプロダクトのページのCiscoに喧嘩売りにいってるプロモーションビデオが素敵で好きです.

環境構築

EdgeRouterLiteにGentoo入れました.
IPv6をどうしたか,が気になるかたはつづきの記事を読んで,この記事の残りはすっ飛ばして良いです.

参考リンク: MIPS/ERLite-3 Gentoo Wiki

EdgeRouterLiteはu-bootが収められてるNORメモリと,OSが収められてるUSBフラッシュメモリなストレージデバイスの2つの記憶領域を持っています.
後者はデフォルトだと2GBのものがボード上のUSBポートに挿してあり,EdgeOSというVytta,VyOSベースのOSがインストールされています.

これを別の,Gentooをインストールした大容量のUSBフラッシュメモリに挿し替えました.


私はこれを買いましたが,べつにこれでなくとも良いと思います.
Gentoo Wikiにて,いくつか動作確認済みのUSBメモリが記載されています.
が,スペースが限られるので,あんまり適当なのだと挿さらない可能性が高いです.

それでは肝心の構築の手順です.

ストレージ環境構築

まず,このフラッシュメモリデバイスはいきなりERLiteに挿さず,なにかしらのLinuxマシンに挿して,作業を行ないます.
まずはフォーマット.

fdiskをするまえに,Gentoo Wikiの情報によると元のディスクの先頭2048ブロックはバイナリが書き込んであるようなので,元のディスクから,
# dd if=/dev/sdb of=/dev/sdc bs=2048 count=1
とその部分を新たなディスクにコピーします.
本当は,先頭80ブロックに8086バイナリが入ってて,その後0x01BEからパーティションテーブルが始まってて,パーティションテーブルの後ろはzero fillされてるだけなので,よくわからないです.が,u-bootが決め打ちで最初のパーティションのアドレス読みに行く可能性高いですし,ここは何も考えず元のディスク通りにする事に.

先頭80ブロックのバイナリは http://www2.onlinedisassembler.com/odaweb/CfbHic/0#view/tab-assembly/offset/00000000 で,RaspberryPiのSDにもこれが書き込まれるようですのでもし興味ある方居れば調べると良いかも.

後にfdiskを行ないます.今回は元ディスクのパーティション構成をそのまま参考に,/bootと/を作ります.また,それに追加してswapも作成しました.swapを作らねばgccのemergeに失敗します.
1K-blocksで表記して,順番に,

/dev/sda1     140805 blocks (/boot)
/dev/sda2 28441604 blocks (/)
/dev/sda3                     残り (swap)

という風にパーティションを切り,/bootをext2,/をext4にしました.
/bootは,u-bootが読めるのがfat32かext2なので注意./については,カーネルにFSのモジュールが組み込んであればなんでも良いです.
私はbtrfsにしようとしたところ,なぜかマウントできなくなったりする現象が発生したので,止めました.

Stage3 tarball

フォーマットが終わったら,/にするパーティションを,/mnt/ERLiteにmountしたものとして作業を進めます.
http://distfiles.gentoo.org/experimental/mips/stages/mips64r2/2014/stage3-mips64r2_multilib-20140904.tar.bz2
からstage3のtarballと,
http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2
からportage treeのtarballをDLし,どちらもを/mnt/ERLiteに展開します.
# tar xvf stage3*.tar.bz2 -C /mnt/ERLite
# tar xvf portage-latest.tar.bz2 -C /mnt/ERLite/usr

Linux kernel

仕上げにカーネルを準備します./bootにするパーティションを/mnt/ERLite-kernelにmountしたもとのします.
まず,MIPS64のクロスコンパイラを用意しましょう.mips*elと,末尾にelが付くものはリトルエンディアン用なので使えません.Gentoo Linuxなら,
# emerge crossdev && crosdev -t mips64-unknow-linux-gnu
とするだけです.
ArchLinuxならば,
$ yaourt -S cross-mips64-linux-gnu-gcc
とすればインストールできます.(できるようになりました)
Archのほうはこれでインストールできなかったら私ががんばってPKGBUILD修正します.

次にビルド.
https://github.com/xypron/kernel-edgerouter/tree/master/config 
こちらにERLite用にコンフィグを作っている方が居られるので,これをそのまま使わせてもらいましょう.
つまり,
# wget https://raw.githubusercontent.com/xypron/kernel-edgerouter/master/config/config-3.18
# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.9.tar.xz
# tar xvf linux-3.18.9.tar.xz
# cp config-3.18 linux-3.18.9/.config
# cd linux-3.18.9
# ARCH=mips CROSS_COMPILE=mips64-unknown-linux-gnu- make
# ARCH=mips CROSS_COMPILE=mips64-unknown-linux-gnu- make modules_install INSTALL_MOD_PATH=/mnt/ERLite-kernel
# cp vmlinux /mnt/ERLite-kernel/vmlinux.64
# md5sum vmlinux > /mnt/ERLite-kernel/vmlinux.64.md5
これでインストール完了です. ArchLinuxで,上記のようにyaourtでgccを作成していた場合は,CROSS_COMPILEにmips64-unknown-linux-gnu-ではなく,mips64-linux-gnu-を指定する必要があります.

ただし,GCCとカーネルの準備はやや面倒です.
そこで,私の環境で使ってるビルド済みのカーネル(3.18.9)をここに置いておきます.
https://drive.google.com/file/d/0BwiUnMv7MhiJQ0lBRklXRktndEE/view?usp=sharing
これを,/にするパーティションを/mnt/ERLiteに,/bootにするパーティションを/mnt/ERLite/bootにmountした上で,
# tar xvf erlite-3-kernel.tar.bz2 -C /mnt/ERLite
とすればカーネル導入のための一切が省略できるかとおもいます.

システムコンフィグ

Gentoo Wikiには記載ありませんが,stage3を展開した後に,/etc/fstabを自分のパーティションに合わせたり,/etc/conf.d/以下に自分の好みでキーマップや環境変数を変更するといった,若干のシステムコンフィグをしておきましょう.
/etc/inittabでシリアルコンソールの設定もしておきましょう.

ブートローダー

ではブートローダーです.u-bootの設定を変更するために,RJ45な端子を持つシリアルコンソールケーブルが必要です.


既にUSB to RS-232Cなケーブルを持ってる人は,ノーブランドで300円ぐらいのRJ45 to RS-232CもAmazonにありますが,私はそれをポチったらシンガポールからの発送になり一ヶ月くらい待つハメになりました.オススメしません.
そして,これをPCに接続し,minicom等を用いてシリアルコンソールを開きます.
ERLite-3からUSBフラッシュメモリは外して置いてください.

シリアルの設定は,ボーレートが115200,データが8bit,ストップビットが1bit,パリティビットは無し.フロー制御もソフトウェア/ハードウェアどちらも無し.

そして電源を入れるとシリアルにu-bootのプロンプトが表示されるので,
> setenv bootcmd "ext2load usb 0 $loadaddr vmlinux.64;bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rootdelay=15 rw mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom) net.ifnames=0 console=ttyS0,115200 panic=5"
> saveenv
としましょう.u-bootの操作はうっかりするとERLite-3が文鎮化する可能性があるのでお気をつけ下さい.
また,このbootcmdの最初に指定されてるext2loadは,/bootがfat32ならfatloadに,ext2ならext2loadにしましょう.ただ,体感的にはfatloadのほうが動作が速く感じました.

OS環境構築終了

ひとまずこれでGentoo環境は構築完了です.あとは,nano以外を使う方は好みのエディタをインストールしたりすると良いでしょう.また,とりあえずsshdを入れて適当にIPアドレスの設定だけはしておくとコンソールケーブルに繋げなくて良くなるので便利です.ここから,ルーターを構築します.

つづき

2015年3月5日木曜日

Intel Memory Protection Extensions (MPX)

つい先日,Linusが,次のような苦言を呈しました.
Why would I want to enable this in my kernel when there are no actual CPU's out yet that support it?
「どうして実際にCPUがまだサポートしてない機能をボクのカーネルで有効にしたいと思えるんだ? 」
このような苦言にも関わらず,これは3.19へとマージされました.
これはMemory Protection Extensions (MPX)という機能のサポートについてでした.
ところで,MPXとはいったいなんでしょうか?


MPXとは

MPXとは,Intelのtick-tackのtick,次の新アーキテクチャであるSkylakeにて実装予定の新機能です.
これは,具体的には配列の境界チェックをハードウェアでサポートする事でexploitを防ぐ機能となります.

Intel CPUの命令リファレンス[PDF]の第9章がまるまるその機能に割かれています.

MPXのため,BNDレジスタが4本追加され,このBNDレジスタは1本128bitです.
このレジスタは上位と下位でそれぞれアクセス可能で,64bitが2つという事になります.
BNDレジスタの上位はUB(UpperBound),下位はLB(LowerBound)と名付けられており,
勘が良い方は気がつかれたかもしれませんが,配列の上界のアドレスと下界のアドレスをそれぞれ格納します(そのため64bitが2つなんですね)

また,設定レジスタがユーザーモードのためにBNDCFGU,スーパーバイザーモードのためにIA32_BNDCFGS,状態レジスタとしてBNDSTATUSが追加されています.

レジスタ構成

拡張レジスタ



BNDCFGU,BNDCFGS

BNDSTATUS

命令

BNDMK b, m: BNDレジスタbにLowerBound(LB)とUpperBound(UB)を作成
BNDCL b, r/m: メモリ参照かレジスタにあるアドレスについて,LBをチェック
BNDCU b, r/m: メモリ参照かレジスタにあるアドレスについて,UBをチェック (1の補数表現)
BNDCNb, r/m: メモリ参照かレジスタにあるアドレスについて,UBをチェック (1の補数表現の否定)
BNDMOV b, b/m: BNDレジスタかメモリから,LBとUBをコピー/ロード
BNDMOV b/m, b: BNDレジスタかメモリに,BNDレジスタのLBとUBをストア
BNDLDX b, mib: 境界値のロード( SIB:Scale Index Baseアドレッシングを使う )
BNDSTX mib, b: 境界値のストア( BNDLDX同様SIBつかう )

実際に使う

Intelが提供するSDE( Software Development Emulator)を使う事で,実際に試す事ができます.SDEを用いると他にもAVX,AVX-512といったものも試せるので,対応プロセッサを持っていない人に良いのではないでしょうか.

使い方は https://code.google.com/p/address-sanitizer/wiki/IntelMemoryProtectionExtensions に記述されてますが,情報が古いです.
ので以下に補足含めて説明.
環境がLinuxであることを前提で話を進めます.

準備1:ダウンロード

まず,https://software.intel.com/en-us/protected-download/267266/144917
よりライセンスの同意にチェックを入れた後に,
sde-external-*-lin.tar.bz2と*-mpx-runtime-external-lin.tar.bz2をダウンロード.
*のところは日時,バージョンが入りますが,新しいものを選べば良いです.
次に,https://software.intel.com/en-us/articles/intel-software-development-emulator#gcc
よりgcc_install_5.0.0-mpx-*.tar.gzとbinutils-gdb_install_*.tar.gzをダウンロード
こちらも*のところはリビジョンやバージョン,日時が入りますが新しいものを選びましょう.

準備2:解凍,パス設定

では,準備を進めましょう.解凍時のディレクトリ名は自分の環境に合わせて変更してください.
$ mkdir $HOME/mpx_test
$ export MPX_HOME="$HOME/mpx_test"
$ cd $MPX_HOME
$ tar xvf ../sde-external-6.22.0-2014-03-06-lin.tar.bz2
$ tar xvf ../2014-02-13-mpx-runtime-external-lin.tar.bz2
$ tar xvf ../binutils-gdb_install_2.24.51.20140422.tar.gz
$ tar xvf ../gcc_install_5.0.0-mpx-r214719.tar.gz
$ export SDE_KIT=$MPX_HOME/sde-external-6.22.0-2014-03-06-lin
$ export MPX_RUNTIME_LIB=$MPX_HOME/2014-02-13-mpx-runtime-external-lin
$ export MPX_BINUTILS=$MPX_HOME/binutils-gdb_install_2.24.51.20140422
$ export MPX_GCC=$MPX_HOME/gcc_install_5.0.0-mpx-r214719
これで,準備は完了です.上記のサイトではGCCは自分でビルドするようにありますが,
いまは配布されているバイナリで動作します.

コンパイル

サンプルコードはこの通り.そして,これを次のようにコンパイルします.
$MPX_GCC/bin/gcc -fcheck-pointer-bounds -mmpx -L$MPX_RUNTIME_LIB -B$MPX_BINUTILS/bin -lmpx-runtime64 -Wl,-rpath,$MPX_RUNTIME_LIB global_buffer_overflow.c
参考サイトでは-fcheck-pointersというオプションでしたが,これは-fcheck-pointer-boundsに変更されているので注意を.
ここで,
$ CHKP_RT_MODE=count $SDE_KIT/sde -mpx-mode -- ./a.out
と実行すると……
g: 0x600bc0 0x600be8
Bound violation detected,status 0x1 at 0x400695
finishing
はい,ちゃんと境界をチェックできてますね.
なお,SDEでこれを試すのに,カーネルでセキュリティモジュールのYamaが有効な場合,ptrace_scopeを無効にする必要があります.
$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
また,上記サンプルコードを-S -O0でアセンブリコードに出力したものは以下になります.
ちゃんとbnd*な命令が使われていることが確認できます.

2015年2月26日木曜日

ハッピーバースデイ,僕 〜そして恐怖のシュールストレミング〜

2/7は私の誕生日でした.
GSoCとか,今させてもらってるバイトとか,色々と学ぶところが多く,
これからの一年も色々と学んでいきたいなあと思う所存.

誕生日は色々と頂いてしまいました ...