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日目の記事です

私事なのだけども,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年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がつかえます.

以上でした.