2016年2月19日金曜日

VAIO C1 VRX/K の Linux kernel

数年前、何かを勘違いしたようで、新しいLinux kernel(3.13だったかな)では、PAEのON/OFF選択が無いと思っていた。
そのため、VAIO C1のKernelは、3.2系を使い続けていた。先日、何気なく3.13系のKernelのソースを取ってきて見ていたら、PAEの選択があるのに気がついた。
以前見たときは、疲れている深夜の短い時間に見たので見落としていたのだろう。また、Ubuntu12.04.5では、3.13 カーネルが使えるが、apt-getを使ったやり方でソースの入手がうまくできないので、あまり見ていなかったというのもある。さらにXubuntuやLubuntuでも対応していないので、あきらめていた。

しかし、よく考えてみたら、Linux自身はPCアーキテクチャ専用ではないので、Non-PAEも対象として残るだろう。

そうとなれば、試しに3.13 Kernelを、VAIO C1用にコンパイルしてみよう。
Ubuntuで使うので、UbuntuのKernelソースを入手する。

apt-getでは入手できないので、Ubuntu Packageのページから入手する。画面の右端の「ソースパッケージをダウンロード」と書かれた下にあるリンクから3つのファイルをダウンロードする。
以下に同じリンクを置く。
linux-lts-trusty_3.13.0-77.121~precise1.dsc
linux-lts-trusty_3.13.0.orig.tar.gz
linux-lts-trusty_3.13.0-77.121~precise1.diff.gz
これら3つのファイルを同じディレクトリにダウンロードして、ソースコードを展開する。以下参照。
mkdir linux-source
cd linux-source
wget http://archive.ubuntu.com/ubuntu/pool/main/l/linux-lts-trusty/linux-lts-trusty_3.13.0-77.121~precise1.dsc
wget http://archive.ubuntu.com/ubuntu/pool/main/l/linux-lts-trusty/linux-lts-trusty_3.13.0.orig.tar.gz
wget http://archive.ubuntu.com/ubuntu/pool/main/l/linux-lts-trusty/linux-lts-trusty_3.13.0-77.121~precise1.diff.
dpkg-source -x linux-lts-trusty_3.13.0-77.121~precise1.dsc
これで、サブディレクトリlinux-lts-trusty-3.13.0が作られ、ソースコードが展開される。
Linux 2.6.x や 3.x では、VAIO C1 VRX/Kのフレームバッファは、まともに動作しない。
動かすためには、この自家製パッチを当てる必要がある。
以下のように行う。
cd linux-lts-trusty-3.13.0
cat #ダウンロードしたパッチ# | patch -p1
make menuconfigで、Processor type and features 内の、"High Memory Support" と "Memory split" と "PAE (Physical Address Extension) Support"を以下のように書き換える。
私が使ったコンフィグは、ここからダウンロードできる。
これはProcessor familyにCrusoeを選択したり、いろいろいじっている。そのため、一般的なカーネルではない。
リスクがあるかもしれないので、注意せよ。使いたければ、ダウンロードして、.configを上書きせよ。

make menuconfig の後は、昔はmake depだったけど、今はやる必要はない。
以下のようにすることで、linux-imageとlinux-headersのバイナリパッケージが出来上がる。
CONCURRENCY_LEVEL=4 make-kpkg --rootcmd fakeroot --initrd --revision=$(date +"%Y%m%d") kernel_image kernel_headers
上記は4コアシステムでのコンパイルを想定している。
この前、購入したhpのPCでコンパイルしたら、2時間以下で終わった。

1つ上のディレクトリに、バイナリパッケージができているので、それをVAIOにコピーして、インストールする。
これでLinux 3.13.xがVAIOでも動作するようになる。

最新カーネルがVAIO C1 VRX/Kで動くとなれば、まだまだ現役として使える。最新Lubuntuをインストールしたくなる。
しかし、最新のLubuntuのInstallerは、Non-PAEを受け入れない。そのためInstallできない。

カーネルは用意できるのだから、なんとかならないかとAlternate Install CDの事を調べ始めた(VAIO C1 VRX/Kは、メモリが少なすぎるので通常のDesktop Install CDは使えない)。
AlternateCDをカスタマイズして、Non-PAEにインストールできるものを自力で作ろうと、 Alternate CD のカスタマイズに関するページを、先月末からちょびちょび読んでいた。

全部読み終わって、関連する技術の詳細を調べようと、いろいろ探していたら、なんとすでに作られていた。
Lubuntu fake-PAE の下の方、Ubuntu 14.04 LTS text non-pae 'Trusty-npae124-text.iso' に、それが書いてある。
まだ見てないので、動くかどうかはわからないが、これを使ってみよう。

無駄に勉強しちゃったけど、どこかで何かの役に立つだろう。


2017/12/10追記 <<<<注意>>>>: FrameBuffer設定も必要だ。後から書いたこれを参照せよ。 私のVAIO C1-VRX/Kはもうダメなので、放置していたが、最近になって、このページを見ている人が増えてきているので、注意書きを書いた。

2016年1月16日土曜日

久しぶりに新しいPCを買った

VAIO-C1 VRX/K を15年以上使っている。
Lubuntuを入れているが、メモリ不足からXは使い物にならない(動かないわけではないが)。
CUIでもいろいろできることがあるので、VRX/K自体が全く使えないわけではない。
しかし、Webコンテンツはどんどんリッチになっており、NHK世界猫歩きのページですらJavaScriptが必須だ。w3mでは番組チェックすらできないので、そういう場合は、スマホを使っている。


はっきり言ってスマホのほうが、処理速度もメモリ量も上だ。しかし画面が小さい。老眼の目では使いにくい。
もう少し画面の広いタブレットを買ってこようかと考えた。数年前のタブレットでも十分にC1-VRX/Kよりは良いだろう。
新品である必要はない。XPERIA-Z1を使っているが、その頃のもので十分だ。
Z2-Tabletなら、磁石の充電コネクタも使いまわせるだろう。

その辺の中古を見に、大宮のソフマップへ行った。
以前、Z2-Tabletを見かけていたのが、もうなくなっていた。
店頭デモだが、少しだけ触ったことがある。いい感じだった。人気があるのかもしれない。
発見した時に買っておけば良かった。

PCを買うつもりは無かった。USキーボードの中古なんて、ほぼ無いためだ。
C1-VRX/Kをしつこく使い続けているのは、USキーボードに換装しているためだ。新品でもUSキーボードのモデルは少なく、ましてや「欲しい」と感じられるものはなかなか見つからない。その結果15年の年月が流れていた(忙しすぎたというのもある)。

お店の中を色々物色しているうちに、「OSなし、USキーボート、海外モデル」と書かれたPCがあった。
HPのロゴマークがある。"Folio 13 2000"と書かれており、ネットで探すと国内では販売されていないHPのモデルのようだ。
CPU=Corei5@1.6GHz, DDR3-1600=4GB, SSD=128GB となかなかの性能。
薄型のわりに、有線LANのコネクタもある。SDXCスロット付き。WiFiも内蔵。光学ドライブは残念ながら無い。
そして何より、安かった。OSなし、海外モデルという事で、31,200円(税抜き)。
XPERIAやiPhoneが7万円することを考えると、PCとは思えない安さだ。
どうせOSは、Ubuntuを使う。そして、USキーボードこそ、私が欲しかったものだ。

これは出物だ。XERIAが買えずにガックリ来ていたので、即購入を決断。
持って帰ってきて、早速USB-Ubuntuを動かしてみた。完璧に動く。
SSDの中身を全部調べたが、先頭部分にShift_JISで以下のような文字列が入っているだけで、以降すべてnull。
******************************************************************************
結果 : データ消去はエラーなしで終了しました。
******************************************************************************
消去ディスク                                                    エラー数
 SATA DISK1 :  128035MB (SAMSUNG MZMPA128HMFU-000H1         ) -        0
                        (S/N S0TENEAC335532      )

消去パターン - [00          ]   1回書:00     読出チェック - [なし        ]
ログ記録 - [消去HD          ]   目視[有]   名前 - [                    ]
機種名[HP Folio 13 - 2000 Notebook PC ]S/N[CND22616KK         ]メモリ[4.0 ]GB
CPU[Intel(R) Core(TM) i5-2467M CPU @ 1.60GHz                             ]
開始時間 - [2015/11/23 17:19:16]    終了時間 - [2015/11/23 17:33:27]
******************************************************************************
CLEAR-DA CD Pro Version 3.50Sb (C)Hitachi KE Systems,Ltd.2001-2015
******************************************************************************
^ZQRA,CD,3.50Sb,SATA1,128035,SAMSUNG MZMPA128HMFU-000H1              ,S0TENEAC335532      ,OK,0,00,NO,,HP Folio 13 - 2000 Notebook PC,CND22616KK,Intel(R) Core(TM) i5-2467M CPU @ 1.60GHz,4.0 ,2015/11/23 17:19:16,2015/11/23 17:33:27,,,,""^Z
中古を販売するときに、丁寧に消しておくようだ。
すこし安心した。
内蔵SSDへUbuntuをinstallして使い始めた。

このBlogもFolioで書いている。
起動も早いし、動作も安定している。いい買い物ができた。
また10年以上使うことになりそうだ。

2016年1月1日金曜日

Ubuntu12.04 で WDC-433DU2H

2021/01/29 追記
https://github.com/morrownr/8821auのドライバがいい。
Ubuntu forumsで紹介されており、他のRealtekのドライバもある。
詳しくはこの記事を参照。
2019/06/27 追記
abperiasamy/rtl8812AU_8821AU_linuxのドライバがいい。
こまめにメンテされており、新しいカーネルに追従している。
数年前から、改造しなくてもWDC-433DU2Hに対応している。
使っていると時々調子が悪くなることもあるけど、色々試してこれが一番良さそう。

最近、このページを見る人が何故か増えている。
このページの最後で、追記として上記 abperiasamy/rtl8812AU_8821AU_linux のことを書いていたが、多くの人が最後まで読まないかもしれないので、先頭にも書いた。

これはRealtekのチップであるが、別の会社、MediaTekのUSB Wi-Fi用ドライバが、Linux 4.19でメインに取り込まれた(去年の秋頃だったかな)。
残念なことにUbuntu 18.04(BionicBeaver)のカーネルのバージョンは、HWEでも4.18だが、8月には5.0.0(19.04 DiscoDingoのカーネル)になる予定だ。
私はDiscoに乗り換えずに、BionicのHWEカーネルが5.0.0になるのを待つつもりだが、Discoを使っている人は、MediaTekのやつを使ったほうがいい。
あるいは、若者は迷わずDiscoへGo!

以下は、2016年1月1日に書いた古い情報。
IEEE802.11ac を使いたかったので、近所でELECOM WDC-433DU2H を買ってきた。
比較的安く、立派なアンテナが付いているので、気に入って買ってきたが、Ubuntu12.04での11acのサポートは良くない。
こういう時のために、LTS Enablement Stakを使っていたのだが、それでもダメだ。
PCIeのドライバはあるがUSB用は見当たらない。
使用されているチップはRTL8811AUということで、ネット上からそれらのドライバを入手してみたがうまく行かなかった。

Windows用のドライバをLinux上で使う技があったことを思い出し、それを行うことにした。
ndiswrapperというらしい。apt-getで適当にinstallを試みるが、途中でエラーになってしまう。
何度やり直しても、うまく行かない。
モジュールをビルドしようとしてうまく行かないらしい。
ネット上で Ubuntu12.04 の ndiswrapper について調べてみると、パッチが見つかったが、それを当ててもだめ。
パッチや前後の記事から、kernelのディレクトリ構造が変化したための問題のようだ。
ndiswrapper-dkmsのソースコードを直接コンパイルしようとすると、構造体__devexitの定義が無いためにエラーになっていることがわかった。
kernelやheader内のコードを探してみても、定義はない。
自分はLTS Enablement Stackを使っている。記事ではSausyだが、自分はTrustyを使っている。もっとずれているはずだ。
ndiswrapperはカーネルモジュールなので、当然カーネルに強く依存している。
LTS Enablement Stackを使ってカーネルだけを更新してしまったために、Ubuntu12.04用のndiswrapperが使えなくなったのだ。

そこまでわかった。ではどうする?
ndiswrapperを使うために、kernelをDowngradeするか? ndiswrapperを何とかするか?

Ubuntu12.04 LTS Enablement Stack最新カーネルは 3.13系、Trustyのものだ。
Trustyのndiswrapperならつかえるかも。と思って調べる。
ここを見ると、依存は dkms (>= 2.1.0.0) だけだ。

Ubuntu12.04のdkmsを見ると、
$ dpkg -l dkms
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)維持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前         バージョ�� 説明
+++-==============-==============-============================================
ii  dkms           2.2.0.3-1ubunt Dynamic Kernel Module Support Framework
問題なし。

バイナリパッケージが入手できればそれだけでいいのかもしれないが、Trusty用をPreciseで使うので変な問題があるかもしれない。
ソースパッケージを入手して、Precise上でバイナリパッケージをビルドした。
dpkg-source -x ndiswrapper_1.59-2.dsc

dpkg-buildpackage -uc -us 

  (面倒なので詳細は省略。)
出来上がったバイナリパッケージ ndiswrapper-common_1.59-2_all.deb ndiswrapper-source_1.59-2_all.deb ndiswrapper-dkms_1.59-2_all.deb ndiswrapper-utils-1.9_1.59-2_i386.deb を全部まとめてインストールした。

インストール時に、ndiswrapperモジュールのビルドも行われる。
エラーにならずに成功した。

成功したのはいいが、どうやって使うんだろう?
起動は?
Classic Gnome だと、アプリケーション、システムツール、システム管理、Windows用無線LANドライバで、GUIアプリを動作させる。
ndiswrapperを使うには、Winodws用ドライバも入手しなければならない。
ELECOMのここから入手できる。
WDC-433DU2HBK_Windows_20140120.zip をunzipしてみると、いろいろなドライバが入っている。
一言でWindowsと言っても様々だ。

$ find ./ -iname "*.inf"
./WDC-433DU2HBK Windows 20140120/IM/WINXP/64/TWOPORT/XPTWOPORT.INF
./WDC-433DU2HBK Windows 20140120/IM/WINXP/64/TWOPORT/XPTWOPORT_MP.INF
./WDC-433DU2HBK Windows 20140120/IM/WINXP/32/TWOPORT/XPTWOPORT.INF
./WDC-433DU2HBK Windows 20140120/IM/WINXP/32/TWOPORT/XPTWOPORT_MP.INF
./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/Win81X64/netrtwlanu.inf
./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/WinX64/netrtwlanu.inf
./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/Win7X86/netrtwlanu.inf
./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/Win8X86/netrtwlanu.inf
./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/VistaX64/netrtwlanu.inf
./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/Win8X64/netrtwlanu.inf
./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/Win81X86/netrtwlanu.inf
./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/Win7X64/netrtwlanu.inf
./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/WinXP/netrtwlanu.inf
./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/VistaX86/netrtwlanu.inf

32bit Ubuntuなので、WinXP用なら問題ないだろうと思って、./WDC-433DU2HBK Windows 20140120/RTWLANU_Driver/WinXP/netrtwlanu.infを使った。

Windows用無線LANドライバの画面で、「新しいドライバのインストール」ボタンを押して、そのファイルを選択する。
しばらく待つと、インストールが終わる。
その後、WDC-433DU2Hを接続すると、認識され動き始めた。

以降の操作は、普通。
network-appletでパスワード等を設定すれば、11acが使える。
2016/1/17 追記。
遅くて、使い物にならない。数十KB/sしか出ない。
11acの特徴の一つは、速度だ。つながれば良いという訳ではない。
また時々切れてしまう。

USB-Linuxでは、H/W依存度を下げるためにそのまま使うが、普通の目的では使えない。
C1-VRX/Kは、非PAEカーネルなので、3.2.xまでしか上げられず、今のところ他に選択肢がない。


2016/03/18 追記。
3.13系ならabperiasamy/rtl8812AU_8821AU_linuxのドライバが使える。
これはネイティブのLinuxドライバなので、ndis-wrapperは要らない。
ndis-wrapperからWDC-433DU2Hを削除して、このドライバを使ったほうがいい。
結局VAIOも3.13系に移行したので、VAIOでもネイティブドライバを使うようになった。

2015年12月11日金曜日

チキンカツ丼

カツ丼をチキンカツで作ってみようと思った。

自宅でカツを揚げるのは手間なので、買ってきたほうがいい。
ウチの近所の「ニュー・クイック」なら、チキンカツは150円だ。
大きめで、ロースカツと見分けがつきにくい。これなら、少なくとも見た目は、バッチリだ。
カツさえ入手できれば、カツ丼を作るのはそんなに手間はかからない。
追加で用意するものは、たまご、玉ねぎ、麺つゆ、砂糖だ。
特に砂糖は欠かせない。コーヒーを飲むとき使わなかったグラニュー糖でも何でもいいので、とにかく用意する。
それと、専用の鍋も用意したほうがいい。作業性が全く違う。

用意ができたら、作っていこう。
まずは、ご飯を炊いておく。また、買ってきたカツは、軽くチンしておくといい。

玉ねぎ1/4を千切りにして、鍋に並べ、砂糖、麺つゆを適量入れて火にかける。
すぐに煮え立つ。
この上に適当な幅に切ったチキンカツを載せて、たまごをざっくり混ぜて、上からまんべんなくかける。
たまごを混ぜすぎると、白と黄色の模様にならない。ざっくりと混ぜるのがいい。
蓋をして、中火ぐらいで1分ぐらい待つと、たまごが固まっている。
どうだろう?これがチキンカツに見えるか?。
そして、どんぶりご飯の上にサッと載せれば、おいしいチキンカツ丼の出来上がり。

もはや普通のカツ丼にしか見えない。
さらに、食べてもカツ丼と思ってしまう。人間の脳は騙されやすい。
鶏肉と豚肉の区別がつかないわけがないと思うだろうが、まず見た目があまりにもカツ丼だ。
そして、おそらくこのチキンカツは、普通のロースカツと同じ油で揚げられている。
多くの美味しいとんかつは、ラードで揚げられている。
説明するまでもないが、ラードは豚の脂でできている。そのため、チキンカツには豚の味がつくのだ。
この点でも、チキンカツはお店で買ってきたほうがいい。

全部で250円ぐらい。それでも確かな満足。金がないときに、カツ丼を食べたければ、これが一番だ。
今日のニュースで、加工食品も軽減税率対象になるらしいことを言っていた。少し心配だったが、よかった。

2015年10月10日土曜日

秋の恵み

秋になった。
先月後半頃から、天気が良くなれば、近所の公園をぶらぶらしている。
彩湖公園や秋ヶ瀬公園など巨大公園には、豊かな森があり、木の実がたくさんなっている。それらをまとめてupしておく。

スダシイ(食べられる)

コナラ(食べられない)

クヌギ(食べられない)

カラタチ(食べられない)

他にもいろいろあるのだが、いくつか食べられるものを拾ってきた。
スダシイとクルミ

マテバシイ


マテバシイは埼玉ではマイナーな存在だが、最近では街路樹などで時々見かける。
たとえば、戸田のAEON STYLE(旧AEON MALL)脇の外観外環自動車道の脇の街路樹はマテバシイだ。
マテバシイは、帽子が普通のどんぐりのようで、区別がつきにくいが、色と大きさが随分違う。
上がマテバシイ、下がスダシイ。

クルミも処理をして、カラを割って、中身を取り出した。

シイの実はたくさん拾えるが、クルミは少ない。
数年前は結構落ちていたのだが、最近ではおばさん集団がごっそり持って行ってしまう。
たぶん、クルミはアンチエージングに良いという話がTVで放送されたためだろう。
目立つ場所のクルミはほとんどおばさんにやられているが、一部わかりにくい場所はそのまま残っていた。そこで収集した。

処理は手間がかかるが、季節を味わう楽しみがある。
日本人として、四季の変化を楽しもう。

井田で潜ってきた

先週10/04、井田へ行ってきた。
当日、波は穏やかだったが、数日前の爆弾低気圧の通過の影響で、波止場にも岩や砂が上がってきていた。
海の様子もだいぶ違う。水中生物も流されたり移動したりで、どこに何がいるかわからない。

とりあえず何枚か写真を取ったが、どれも見栄えがしない。
今年は黒潮の当たりがあったので、死滅回遊魚も多い。

2015年10月1日木曜日

武蔵野線の地下区間でauがつながる?

武蔵野線の西のほう、府中本町駅〜新秋津駅は半分地下鉄のような感じだ。
ガラ携の頃から、この地下区間は圏外だった。
ずーっと地下ならいいが、地上と地下が混ざっているため、着信後に地下に入って切れたりとかするので、電話をしてきた人には感じの悪いことになる。

「今武蔵野線だから…」と言っても、武蔵野線の東側しかしらない人は、頻繁に地下に入るというのを理解出来なかったりして、面倒なことになる。実際に船橋付近に住む姉から緊急の電話があった時、携帯が切れまくって「なんで切るんだよ!」みたいに切れられたことがあった。
「武蔵野線の西側は半分地下鉄みたいなもんなんだよ」と説明しても、実際に理解されなかった。

今日、帰ってくるときに携帯を操作していたら、西国分寺〜新小平、新小平〜新秋津の2ヶ所で、いつまでも電波が切れず、ネットをアクセスできた。
ちなみに、キャリアは au(KDDI)。 厳密には時々アンテナの本数が0になっている時もあったが、数秒で復活した。ニュース記事をみたり、チャットしたりするには十分な感じだった。
少なくとも数日前は、地下に入ると切れていたと記憶している。

いつの間にそんなことになっていたんだろうと思い、ネットでニュースを検索するが、それらしい記事は見つからない。
まだ実験段階なのか?
武蔵野線の地下区間で携帯がつながるとしたら、便利になる。
是非とも、しっかりとつながるようになってほしい。
ガンバレau。

2015年9月18日金曜日

圧縮イメージをマウントする

2017/12/15 追記: Ubuntu16.04では、Lubuntu 16.04 でxz圧縮イメージをマウントする を参照せよ。
CFカードやSDカードにデータを記録する装置を作って、もう15年以上。
Flashメモリは寿命のあるデバイスである。CFカードもSDカードも中身はFlashメモリなので、装置運用時にカードが壊れてしまうことがある。
お客さんからそのようなカードが持ち込まれ、できる限りデータを回収して欲しいと依頼されることもある。
その装置で記録するデータの構造は比較的単純なので、イメージさえ入手できれば比較的簡単に取り出せる。

Flashメモリの寿命が原因ではなく不具合が原因かもしれず、それは調べてみなければわからない。
また、開発時の動作確認時や長期連続試験をしているときに、カードの記録データが壊れてしまうことがある。
特に長期に渡る試験のとき、事故発生前はカードがどういう状態だったのかを知りたいことがある。時間を遡ることはできないので、時々イメージをbackupしておく。
自分で作った装置なので責任もあるし、壊れ方から原因を理解したり、回復方法の習得にもなる。

と、いうことで調査のためカードのイメージをとっておく。
(お客さんのデータは、お客さんのものなので、早期に破棄する)
イメージをとっておけば、linuxならloopデバイスを使ってマウントでき、後から過去の状態を参照できる。

CFカードやSDカードとは言っても、最近は大容量なので、ストレージ領域を消費する。
もったいないので、圧縮しておきたいが、圧縮イメージは普通にはマウントできない。
read-onlyでいいからマウントできればいいのだが、gzipやbzip2はランダムアクセスのためのデータ構造を持っていないので、ランダムアクセスするためには全体を展開する必要がある。
近年のSDカードは巨大で数十GiBもあり、展開する時間も記憶域容量も馬鹿にならない。

gzipを拡張したdictzipというものがあり、ランダムアクセスのためのテーブルを持っている。しかし、そのテーブルをファイルの先頭に配置するため、パイプで処理できないという欠点がある。bzip2は、開発時にランダムアクセスの仕組みを入れるかどうかという議論があったが、やめたそうだ。ブロックをスキップしながらアクセスする方法もあるのだが、1つずつブロックをスキップしなければならないため、効果が低い。

数年前からxzという圧縮ツールがある。
圧縮ファイル内をblockと呼ばれる単位に分けることができ、そのblockのインデックス情報も持っている。
インデックス情報を参照することでblockの粒度でランダムアクセスができる。
dictzipに似るが、インデックス情報は、ファイルの末尾付近にある。
そのため、データの圧縮が終わった後で、インデックス情報を構築し末尾に格納することができ、パイプで処理できる。

ファイルの末尾にインデックス情報があると、インデックス情報を読むためには、全体を読まないといけないような気がするかもしれないが、そんなことはない。seekして、最後の方だけ読めばいい。
ランダムアクセスを行おうとしているのなら、ファイルのseekができるはずで、seekができるならファイルの末尾にインデックスがあっても全く問題ない。

xzは比較的新しい圧縮方法だが、LinuxのLiveCDで使われるsquashfsでもサポートされるなど、様々なシーンで利用されており、実績も徐々に上がってきている。
Ubuntu12.04のxz-utils(xzのバイナリパッケージ)のchangelogをみても、
$ apt-get changelog xz-utils | head -n 30
取得:1 xz-utils (http://changelogs.ubuntu.com/changelogs/pool/main/x/xz-utils/xz-utils_5.1.1alpha+20110809-3/changelog) の変更履歴 [25.5 kB]
xz-utils (5.1.1alpha+20110809-3) unstable; urgency=low

  * liblzma: Match upstream ABI.
    - Remove the lzma_chunk_size() function.
    - A few ABI tweaks to reserved space in structures.
    - Enable ELF symbol versioning.
    - Bump soname to 5.
    - Continue to leave out threading support, since the relevant
      interfaces in liblzma are not yet stable.
  * xz-utils/README.Debian: Remove note on ABI differences.
  * Remove liblzma/README.Debian.
  * liblzma: Introduce a lzma_code@Base compatibility symbol to ensure
    programs linked against unversioned symbols from liblzma2 can
    share a process image with liblzma5 without breaking.
  * debian/symbols: XZ_5.0 symbols come from liblzma5.  Build-Depends:
    dpkg-dev (>= 1.15.6); thanks to Jakub Wilk for a reminder.
  * debian/symbols: The lzma_code@Base symbol is not guaranteed to
    continue to exist in the future, so tell dpkg-shlibdeps to produce
    an error if some package manages to use it.

 -- Jonathan Nieder   Thu, 20 Oct 2011 21:31:31 -0500

xz-utils (5.1.1alpha+20110809-2) unstable; urgency=low

  * debian/rules build-arch: Do not trigger an infinite "make"
    recursion loop when DEB_BUILD_OPTIONS=nocheck.  Closes: #638071.
    Thanks to Thorsten Glaser.

 -- Jonathan Nieder   Tue, 16 Aug 2011 18:11:47 -0500
という感じで、最後の変更は2011年10月20日だ。利用されているのに変更や更新はない。バージョンに"alpha"の文字が見られるものの、安定していると言える。
最新のwilyでも"5.1.1alpha+20120614-2ubuntu2"で、更新がほぼ無い(alphaのままだ)。

実は、このxzで圧縮したイメージをマウントする方法がある。
圧縮イメージを、NBD(Network Block Device)経由で、ブロックデバイスにしてマウントするのだ。
この場合、書き込みはできないのだが、CFカードやSDカードのイメージを壊したくはないので、むしろ都合がいい。

必要なものを入手する

NBDを動かすには、nbd-server, nbd-client が必要だ。
xz圧縮イメージをNBDで扱うには、nbdkit も必要だ。
しかしながら、Ubuntu12.04(NautilusでCompactが使えるので未だに使い続けている)の場合、nbdkitのパッケージが無い。
そのため .debは諦めて .tar.gz を入手して、自分でビルドしてインストールする。
ただし、これをビルドするには、libmodule-build-perl と libperl-dev パッケージが必要になる。

まずは、必要な.debパッケージをapt-getで入手する。
$ sudo apt-get install nbd-server nbd-client libmodule-build-perl libperl-dev
nbdkitの .tar.gz を入手する。 このページの下の方のTarBallsへのリンクから、nbdkit-1.1.10.tar.gzを得る。 wgetで入手するなら、
$ wget http://libguestfs.org/download/nbdkit/nbdkit-1.1.10.tar.gz

nbdkitのビルドとインストール

適当なディレクトリを作って、ビルドする。
$ mkdir xxxx
$ cd xxxx
$ tar -zxvf ../nbdkit-1.1.10.tar.gz
      (サブディレクトリnbdkit-1.1.10ができる)
$ cd nbdkit-1.1.10
$ ./configure
    (いろいろ表示される)
$ make
    (いろいろ表示される)
$ make check
  : (省略)
============================================================================
Testsuite summary for nbdkit 1.1.10
============================================================================
# TOTAL: 8
# PASS:  8
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================
  : (省略)
    (全部パスしたようだ)
$ sudo make install
    (いろいろ表示される)

xz圧縮イメージの用意

xz圧縮イメージなら、何でもいいというわけではない。
block単位でしかseekできないという事を忘れてはいけない。xzはデフォルトではデータ全体を1つのブロックとして圧縮してしまう。この場合、全体を展開しないといけないので、本末転倒だ。
小さなブロックに分けるのが良い。
ネット上を検索すると、プリセットレベル -9 ブロックサイズ16MiBで行う例がよく見られるが、これには疑問を感じる。
まず、xz の man page上で以下のような書き込みがある。
          : (省略)
   -0 ... -9
      Select a compression preset level.  The default is -6.  If  mul‐
      tiple  preset  levels  are specified, the last one takes effect.
      If a custom filter chain was already specified, setting  a  com‐
      pression preset level clears the custom filter chain.

      The  differences  between  the presets are more significant than
      with gzip(1) and bzip2(1).  The  selected  compression  settings
      determine  the  memory  requirements  of  the decompressor, thus
      using a too high preset level might make it  painful  to  decom‐
      press  the file on an old system with little RAM.  Specifically,
      it's not a good idea to blindly use -9 for  everything  like  it
      often is with gzip(1) and bzip2(1).
          : (省略)
自分なりに訳してみると、
          : (省略)
   -0 ... -9
      圧縮プリセットレベルを選択。デフォルトは-6だ。複数のプリセット
      レベルが指定されたら、最後の1つが効果をもつ。カスタムフィルタ
      チェーンがすでに指定されていたら、圧縮プリセットレベルの設定は
      カスタムフィルタチェーンをクリアする。

      プリセット間の違いは、gzip(1)やbzip2(1)でのよりも意味深い。
      選択された圧縮設定はデコンプレッサのメモリ要求を決定し、そのため
      高すぎるプリセットレベルは、少ないRAMの古いシステムで、その
      ファイルを展開するのに痛みをともなわせることになるだろう。特に
      gzip(1)やbzip2(1)でしばしば見られるように、なんにでも盲目的に
      -9を使うのは良い考えではない。
          : (省略)
また、ブロックサイズは辞書サイズの3倍ぐらいが良いとどこかに書いてあった。
(すっかり忘れっぽくなったものだ。)
特に辞書サイズよりもブロックサイズが小さいと、辞書のために確保したメモリが無駄になってしまうためだ。
プリセットレベル -9 の辞書サイズは 64MiBであり、16MiBとは完全に逆転している。
という訳で、プリセットレベルが -9 で、ブロックサイズが16MiBがおかしいのは解ってもらえたと思う。

じゃ、どのへんが良いだろうか?
私はこの古いVAIOも使っている。これでもそこそこ使えないと困る。
このマシンはメモリが極めて少なく非力でもあるので、プリセットレベル -0 ブロックサイズ 1,048,576(1MiB)とする。

具体的な圧縮方法が決まったので、以下のようにしてxz圧縮する:
$ zcat sd64GB.img.gz | xz -0 --block-size=1048576 > sd64GB.img.xz
上記は元データがgzipで圧縮されていた場合の例だ。

NBDの提供

圧縮ファイルの用意ができたら、圧縮ファイルをNBD(Network Block Device)として提供しよう。
提供するには、nbdkitを使う。
$ sudo nbdkit --user xxx --group xxx -i 127.0.0.1 xz file=sd64GB.img.xz
xxxはユーザ名だ。 子プロセスが起動し、バックグラウンドでndbサーバが動作する。
デフォルトではポート番号は10809になる。-pで任意のポート番号を指定することもできる。
後で止めるには、psで、nbdkitを探してkillせよ。

デバイスノードを作る

サーバが動き出したので、ndb-clientでデバイスノードを作る。
$ sudo nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork
これで/dev/nbd0でブロックデバイスが見えるようになる。
パーティションが/dev/nbd0p1で参照できる。

マウントする

デバイスノードができたらマウントだ。
$ mkdir sd64GB
$ sudo mount /dev/nbd0p1 sd64GB -o ro,uid=xxx,-gid=xxx 
xxxはユーザ名だ。適切なユーザ名を指定せよ。 FATならこれでいいのだが、ジャーナリング機能をもつext3やext4では、イメージが汚れている場合マウントできない。
read-onlyなので、ジャーナルをリプレイできないため、汚れをきれいにできないのだ。
この場合、noloadオプションを使って、マウント時のジャーナルの再生を抑制する。
$ sudo mount /dev/nbd0p1 sd64GB -o ro,noload 

これで、圧縮イメージ内を参照できるようになる。
ext3やext4のマウント方法も書いたが、これらの内容を圧縮したいなら、ブロックデバイスイメージを圧縮するよりも、squashfs等を使ったほうがいいだろう。

私は職業柄、問題調査のためFATフォーマットされたCFカードやSDカードのイメージを、未割り当て領域も含めて保存し、後から参照したいので、このような手段を使っている。

2015/09/19 一部訂正。

2015年9月5日土曜日

今日のケーニッヒ

中心付近の葉っぱは、13枚目の葉っぱ。
先週出てきた。次の芽が続かない。


12枚目の葉っぱが、虎模様のようになってる。
急に大きくなったからか?今度は何だろう。

2015年9月1日火曜日

2週連続ダイビング

先週に続いて、今週もお泊りダイビングに行ってきた。

当初の予定では、IOP(伊豆海洋公園)と井田の予定だったが、天気がイマイチだったので、大瀬崎と井田になった。
大瀬崎は先週も潜っていたが、先週の2日目は二日酔いで2本目をキャンセルしていたので、消化不良気味だったので、ちょうど良かった。

潜ってみると、先週よりも水温と透明度が上がり、いい感じになっていた。
さらに、先週は「大瀬崎・先端」が遊泳禁止だったが、今週は潜れるようになっていた。

ツノダシ


ミジンベニハゼ

先端では、キンギョハナダイやスズメダイが元気だったが、ちょこまか動くのでうまく撮影できなかった。
それにしても、動画の手ブレがひどい。
こういうのは、カメラを固定して撮らないとダメかも。

結局、大瀬崎では4本潜った。
その後、井田の天野荘へ移動して、一泊。

次の日、起きると外は雨。しかし、海を見ると、波も少なく良さそう。
潜ってみると、ぶち抜け。下の方は、透明度20mぐらい。
鉄パイプの枠組みから、下の二股の木がはっきり見える。すごい透明度なのに水温が高い。
おそらく、黒潮が来たのだろう。何度も井田で潜っているが、こんなにすごいのは初めてだ。

透明度が高いので、中層の群れがすごくいい。
しかし、もともと井田の群れはすごいので、動画で撮影しようとしてもうまく撮影出来なかった。

失敗覚悟で、ピンナップを色々撮った。

キンギョハナダイ

ソラスズメダイ

ナガサキスズメダイ

ネンブツダイ

ハタタテ

透明で暖かく、楽しいダイビングだった。