udev 169-1でデバイスを認識できない問題。

昨夜いつもどおりapt-get update, upgradeしてshutdownしたのですが、今朝MacBookを起動してみたらメンテナンスモードになってしまいました。

/ファイルシステムマウント後、fsckが実行される前に、udevが他のファイルシステムのデバイスを認識できていないようで、/etc/fstabにはUUID指定でデバイスを設定しているので、それが指しているデバイスが見つからず、結果として他のファイルシステムをマウントできず、メンテナンスモードになってしまう、という現象ですね。

昨夜のアップデートで、昨夜のudevがアップデートされていたのを思いだしたので、/var/cache/apt/archivesの下に、udev, libudev0, libgudev-1.0.0がそれぞれ169-1と168-2があるのを確認し、一度shutdown。

インストールCDから”rescue maxcpus=1”でCD-ROMブートし 1

/dev/sda3を/bootでマウント、

# mount /dev/sda3 /boot

先ほどの3つの168-2の方のdebパッケージをインストール、

# cd /var/cache/apt/archives
# dpkg -i libgudev-1.0-0_168-2_amd64.deb libudev0_168-2_amd64.deb udev_168-2_amd64.deb

念のためinitramfsをアップデートし直し、

# update-initramfs -u -k 2.6.38

update-grub2で/boot/grub/grub.cfgを更新 2

# update-grub2

で、再起動したら無事、起動できましたよ、と。

とりあえず、 同じような現象にあっている人いなさそうな感じ ですねぇ…。自分だけなんだろうか…。

1

これは以前からのエントリにも記述しているが、MacBook 5,2だけの問題で、コア1個しか認識できず、これかnosmpなどを指定しないとブート途中で止まってしまうため。

2

ちなみにCD-ROMブートではなくメンテナンスモードでそのままやると、/bootファイルシステムをマウントしてないのでここでコケる。

DebianとWindowsの異種環境間でSphinxのドキュメントをGitで管理する。

結論、めんどいです。

もちろん、Windowsが、ですがね。

6月末までのプロジェクトでのドキュメントはSphinxで作ってGitで管理しようぜ、ということになったのです。なったというよりしたってのが正しいのですが。ワシはDebian Sidを、他の二人はWindowsを使っているのですが、いやぁWindowsって改めて面倒だなと思いました 1

まぁ、このエントリは早い話がWindows環境を単にdisっているだけです。(わら

Gitでめんどい

WindowsでGitを使うのに、一人はmsysgit、もう一人はTortoiseGitを使っています。リモートリポジトリにはgitosisを使っています。ここでめんどいことが二つありました。

SSHの公開鍵のフォーマットが異なる

二人共、SSHの公開鍵はPuTTYで鍵生成を行ったので、公開鍵はDebianでOpenSSHのフォーマットに変換した後、gitosisに登録しました。ここまでは良いですね。

さて、何が問題かと言うと、msysgitのコマンドラインツールではOpenSSHの形式のprivate keyでないと読み込めません。なので、msysgitのコマンドでコンバートしようとしたところ、改行コードが違うだかUTF-8じゃないだったかで失敗しました。結局こっちはmsysgitに同梱されているssh-keygenで再作成してもらいました。

一方、TortoiseGitのGUIの方はPuTTY形式のprivate keyでないと読み込めません 2 。なので問題なかったのですが、これとは別の問題がありました。

日本語パスが通らない

別の問題というのは、TortoiseGitで使用するprivate keyの配置場所のフルパスに日本語が使われている場合です。この時private keyを読み込み、パスフレーズを入力しようとするとファイルが見つからない、という問題が発生するのです。また、private keyの置き場を変えて、git cloneが正常に完了した場合でも、リポジトリ自体のフルパスに日本語が含まれていると、その後の操作で同じようにコケる、という問題が発生します。

日本語をファイル名に使う文化はまったくもって滅ぼしたいですね。 3

sphinxcontrib-blockdiagでめんどい

二人のうち、一人はコマンドラインを使わないので、バッチファイルの実行だけでビルドできるようにしました。

make.bat html

と記述したバッチファイルを用意し、これをダブルクリックすることで手元でビルドできるようにしていたのです。が、途中からblockdiagも使い始めたのでした。ここでもまた二つメンドイことがありました。

日本語フォントのパスを複数指定する

sphinxcontrib-blockdiagで日本語を使うには、conf.pyの中でblockdiag_fontpathにフォントのパスを指定しないといけません。しかし、DebianとWindowsとでは当然パスが異なります。ですので、Debian環境をベースにして、Windows用のconf.pyを用意してやりました。make.bat htmlを実行する際は、次のようなバッチファイル(make-html.bat)を用意します。

copy /Y conf.py.win conf.py
make.bat html
git checkout conf.py

make-html.batを実行すると、git checkout conf.pyで元に戻るようにしたのですが、実際にgit statusで見るとconf.pyは変更されたままでした。make.batをの中をみたところ、htmlを作成後、goto文でendラベルに飛んで、そのまま終了していたため、git checkoutが実行される前にバッチが終了していたのでした。なので、make-html.batではなく、make.batの最後にgit checkoutを実行するようにしたところ、ちゃんと実行されるようになりましたよ、と。

diff --git a/make-html.bat b/make-html.bat
index 32253f6..e046708 100644
--- a/make-html.bat
+++ b/make-html.bat
@@ -1,3 +1,4 @@
+@echo
+
 copy /Y conf.py.win conf.py
 make.bat html
-copy /Y conf.py.org conf.py
\ No newline at end of file
diff --git a/make.bat b/make.bat
index 75fff34..0b129b4 100644
--- a/make.bat
+++ b/make.bat
@@ -168,3 +168,4 @@ results in %BUILDDIR%/doctest/output.txt.
 )

 :end
+git checkout conf.py

なお、この環境に合わせてconf.pyを置き換えるやり方は、 @tk0miya さんが複数パスを指定できるようされるそうです。とてもありがたいですね。

http://twitter.com/tk0miya/status/71246908374523907:

@mkouhei はい。conf.py に blockdiag_fontpath = ['..../VL-PGothic-Regular.ttf', '.../MSGothic.ttf'] と設定すると先頭から順に探索して見つかったものを使います。less than a minute ago

バイナリエディタで編集って…

他のもう一つの問題は バイナリエディタで_imagingft.pydを編集しないといけない という問題が。上記のリンク先の手順どおりにやったらちゃんとビルドできるようになりましたよ、と。

結論

いやぁ、Windowsって本当にめんどいデスねwww。大事なことなので何回も(ry

1

自分では使いたくないですね。

2

コマンドラインだとやはりOpenSSH形式である必要がありますが。

3

ちなみにmsysgitでも日本語パスはダメです。

コマンドラインのWebDAVクライアントcadaver。

SVNからファイルを取得するとき、どうしてますか。普通はgit svn cloneすれば良いんじゃねJK。という話ですが 1 、ちょっとファイルがほしいだけならWebブラウザでよいですね。でも複数ファイルをちょっと取ってきたい場合は、ブラウザでちまちま(リンククリック→保存)*の繰り返しなんてやってられません。そんなときに、cadaverですよ。

大したことはありません。たまに使うときに、よくコマンド名と書式を忘れるので単なる備忘録です。

DebianならcadaverパッケージをインストールすればOKです。

$ sudo apt-get install cadaver

ftpクライアントとかsmbclientみたいな使い勝手ですね。

$ cadaver http://xxx.xxx.xxx.xxx/svn/repos/trunk/
Authentication required for Subversion on server `xxx.xxx.xxx.xxx':
Username: mkouhei
Password:
dav:/svn/repos/trunk/> ls
Listing collection `/svn/repos/trunk/':
 succeeded.
      > 日本語もOK.txt          467456   5月 11 18:17
      > hoge.txt               1846784   5月 11 13:11

cadavarは日本語のパスをURIに指定しても、パーセントエンコードしていれば大丈夫です。ファイル名に日本語を使っているファイルでもちゃんとやりとりできます。コマンドラインで入力するのはめんどいですけどね。

1

svn coって何ですかw

Genius Bar初体験。

MacBook 5,2のタッチパッドのボタンの戻りが悪いので、なんだろうなぁと思ったら、

https://twitter.com/#!/hasegaw/status/69775757341241346:

@mkouhei バッテリ膨張ですか? ゚+.(つд⊂)゚+.゚less than a minute ago

@hasegaw さんに教えて頂き、

https://twitter.com/#!/hasegaw/status/69778360452124672:

@mkouhei ぐぐると、食い下がれば無償交換に応じられたりするみたいですね。 ゚+.(つд⊂)゚+.゚less than a minute ago

https://twitter.com/#!/hasegaw/status/69788968161513472:

@mkouhei togetter 見る限り初回は今回だけといって交換してもらえる可能性がありそうですね http://bit.ly/9bG8aN

と、交渉次第で無償で交換できるかもしれないという情報も教えていただいたので、AppleStore銀座店で昨日の19時で予約して行ってきました。3階までしか行ったことが無かったので4階があるとは思いませんでした。19時に予約したのですが、実際に担当の人が応対してくれたのは15分くらいかかりました。かなり混んでましたね。

さて結果としては、バッテリー交換でかかった費用は9,030円で、さすがに無償ではありませんでした。

が、 普通に買うと15,800円 で、togetterで見た交換費用は10,920円。

https://twitter.com/#!/Guttyo/status/20139066973:

そういや、MacBook(Late2006)の膨らんだバッテリーを交換してきた。修理と称したバッテリー交換で税込10920円なり。バッテリーを単品で買うと1万5千円位する不思議。less than a minute ago via YoruFukurou

それを考えると予想外に安かったのでお徳でした。

一応、ダメ元で「ネットでは無償で交換してもらえる事もあるようですが」と聞いてみたところ、初期保証期間中か、保証期間が切れた直後くらいの場合は無償で交換するが、基本的にバッテリーの膨張はリチウムイオンバッテリー自体の特性なので有償だそうです。しかし、バッテリーの膨張によって他のパーツが壊れてしまった場合には、そのパーツの修理は無償で行う、とのことでした。

なお、今回はバッテリーを交換したら、タッチパッドのボタンの戻りが悪くなる現象は直りました 1

余談。

MacBookのバッテリーに充電回数が記録されているなんてのや、 「このMacについて」のウィンドウでバージョンテキストをクリックするとシリアル番号を確認できる なんてのは今日の対応をしてくれる人が操作しているのを見て初めて知りましたよ。

1

正確にはバッテリーを外した段階で直りました。

lxcを久々に使うことに。on さくらのVPS 512

一昨日契約したさくらのVPSはメモリが512MBもあって、Core 2 Duoと普段の鯖環境から考えるとものすごい贅沢 1 です。VM1台だけで使うのももったいないので、久々にlxcを使ってみることにしました。

以前遊んでいたとき はまだLennyリリースされて一年経っておらず、lxcのユーザランドも0.6.5頃までしか遊んで無いので、一緒に情報のアップデートも行おうと思います。

Squeezeでのlxcは0.7.2 2 で、SqueezeのLinuxカーネル 3 のconfigに対してlxc-checkconfigでチェックすると、以前遊んでいたときと同じように、必要なカーネルオプションが無効になったままです。なので、2.6.38.6でカーネルビルドすることにしました。

ビルド後、lxc-checkconfigを実行した結果が以下。

$ lxc-checkconfig
Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-2.6.38.6
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup namespace: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: missing

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

File capabilitiesのみがmissingになってます。/usr/bin/lxc-checkconfigはシェルスクリプトなので、どのカーネルオプションなのかは中を見れば分かります。

(snip)
is_enabled() {
    mandatory=$2

    is_set $1
    RES=$?

    if [ $RES -eq 0 ]; then
        $SETCOLOR_SUCCESS && echo -e "enabled" && $SETCOLOR_NORMAL
    else
        if [ ! -z "$mandatory" -a "$mandatory" = yes ]; then
            $SETCOLOR_FAILURE && echo -e "required" && $SETCOLOR_NORMAL
        else
            $SETCOLOR_WARNING && echo -e "missing" && $SETCOLOR_NORMAL
        fi
    fi
}
(snip)
    KVER="`uname -r`"
(snip)
KVER_MINOR=$($GREP '^# Linux kernel version:' $CONFIG | \
    sed -r 's/.*2.6.([0-9]{2}).*/\1/')
[[ ${KVER_MINOR} < 33 ]] && echo -n "File capabilities: " && is_enabled \
    CONFIG_SECURITY_FILE_CAPABILITIES

うーむ、これが原因ですね。カーネルのマイナーバージョンが33未満、つまり2.6.33未満の場合はこのオプションが有効になりますが、今回のカーネルは2.6.38.6だとSecurity Optionsにこのオプションは既に存在しません。 lxcのリポジトリのmasterブランチのHEAD を見ると、

KVER_MINOR=$($GREP '^# Linux' $CONFIG | \
    sed -r 's/.*2.6.([0-9]{2}).*/\1/')
echo -n "File capabilities: " &&
    [[ ${KVER_MINOR} < 33 ]] && is_enabled CONFIG_SECURITY_FILE_CAPABILITIES ||
    [[ ${KVER_MINOR} > 32 ]] &&  $SETCOLOR_SUCCESS && echo -e "enabled" &&
    $SETCOLOR_NORMAL

この問題も修正されています 4 。これをみると、2.6.33以上であればそもそも問題ないようです。

なので、/etc/fstabに下記の設定をして、/var/local/cgroupディレクトリを作成すればcgroupファイルシステムを正常にマウントできます。

cgroup  /var/local/cgroup  cgroup  defaults  0  0

後日に続く。

さくらのVPS 512でのカーネルビルドの所用時間

CONCURRENCY_LEVEL=2 MAKEFLAGS=”CC=ccachegcc”をつけて、defconfigでビルドしたら約15分くらいでした。かなり速いですね。

1

普段はOpenBlockS 266でメモリ64MBなので。

2

ちなみにWheezy/Sidは0.7.3

3

linux-image-2.6.37.1

4

なお、Sidのlxc 0.7.3ではまだこの変更は反映されていません。