Net::Nslookup

#!/usr/bin/env perl
use strict;
use warnings;
use Net::Nslookup;

my $host  = "www.google.com";
my @addrs = nslookup $host;
                                                                                                                                    
print $host, " => ", @addrs, "\n";

my $ptr = nslookup( host => @addrs, type => "PTR" );

print @addrs, " => ", $ptr, "\n";

exit 0;

こんなスクリプトを書く.

www.google.com => 64.233.183.106
Use of uninitialized value $ptr in print at bug.pl line 13.
64.233.183.106 =>

動かない.

--- /usr/share/perl5/Net/Nslookup.pm.org        2009-10-22 20:39:24.000000000 +0900
+++ /usr/share/perl5/Net/Nslookup.pm    2011-06-11 15:34:35.000000000 +0900
@@ -169,7 +169,7 @@

     $query = $res->search($term, "PTR") || return;
     for $rr ($query->answer) {
-        if ($rr->can('ptrdname')) {
+        if ($rr->type eq 'PTR') {
             push @answers, $rr->ptrdname;
         }
     }

Net::Nslookup を上記のように変更してみる.

www.google.com => 64.233.183.105
64.233.183.105 => tz-in-f105.1e100.net

動いた.

しかし

% nslookup www.google.com
Server:         172.26.1.1
Address:        172.26.1.1#53

Non-authoritative answer:                                                                                                           
www.google.com  canonical name = www.l.google.com.
Name:   www.l.google.com
Address: 64.233.183.99
Name:   www.l.google.com
Address: 64.233.183.103
Name:   www.l.google.com
Address: 64.233.183.104
Name:   www.l.google.com
Address: 64.233.183.105
Name:   www.l.google.com
Address: 64.233.183.106
Name:   www.l.google.com
Address: 64.233.183.147

これだけ @addrs に返してくれないといけないはずなんだけど,一つしか返してこない.出来の悪いモジュールだな.

VAIO type P でメモリースティック Pro-HG Duo から Debian をブートできるようにした

昨日のVAIO type P で SD カードから Debian をブートできるようにした - 接続法第三式の続き…というより,昨日のは今日への布石.
SONY しか使っていないのではないかと思われるメモリースティックのスロットは,事実上デジカメや携帯電話拡張メモリの標準となった SD カードのスロットに比べ, type P 以外に SONY 製品を持っていない私にとって重要性が低い. Debian のために潰すなら,どちらかというと SD カードよりメモリースティックの方が嬉しい.というわけで, 8GB のメモリースティック MS-HX8A/K を秋葉原ark で購入. ¥2,240 だった.

まず,購入したメモリースティックを既に Debian 化されている VGN-P70H に刺して様子を見てみる.

bernstein % dmesg
...
[ 1574.788300] usb 1-7: new high speed USB device using ehci_hcd and address 5
[ 1574.968207] usb 1-7: New USB device found, idVendor=054c, idProduct=038b
[ 1574.968235] usb 1-7: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1574.968253] usb 1-7: Product: UMH-U10
[ 1574.968264] usb 1-7: Manufacturer: Sony
[ 1574.968274] usb 1-7: SerialNumber: 001DBABA1622
[ 1574.968800] usb 1-7: configuration #1 chosen from 1 choice
[ 1575.094330] Initializing USB Mass Storage driver...
[ 1575.094818] scsi2 : SCSI emulation for USB Mass Storage devices
[ 1575.095423] usbcore: registered new interface driver usb-storage
[ 1575.095441] USB Mass Storage support registered.
[ 1575.098304] usb-storage: device found at 5
[ 1575.098313] usb-storage: waiting for device to settle before scanning
[ 1580.101088] usb-storage: device scan complete
[ 1580.103047] scsi 2:0:0:0: Direct-Access     Sony     USB   HS-MS      1.75 PQ: 0 ANSI: 0
[ 1580.104810] scsi 2:0:0:1: Direct-Access     Sony     USB   HS-SD/MMC  1.75 PQ: 0 ANSI: 0
[ 1580.128901] sd 2:0:0:0: [sdb] 15802368 512-byte logical blocks: (8.09 GB/7.53 GiB)
[ 1580.131643] sd 2:0:0:0: [sdb] Write Protect is off
[ 1580.131661] sd 2:0:0:0: [sdb] Mode Sense: 87 20 00 00
[ 1580.131670] sd 2:0:0:0: [sdb] Assuming drive cache: write through
[ 1580.138537] sd 2:0:0:0: [sdb] Assuming drive cache: write through
[ 1580.138575]  sdb: sdb1
[ 1580.151917] sd 2:0:0:1: [sdc] Attached SCSI removable disk
[ 1580.156531] sd 2:0:0:0: [sdb] Assuming drive cache: write through
[ 1580.156549] sd 2:0:0:0: [sdb] Attached SCSI removable disk

bernstein % diff -u lsusb_before lsusb_after
--- lsusb_before        2011-05-09 17:32:32.000000000 +0900
+++ lsusb_after 2011-05-09 17:35:59.000000000 +0900
@@ -2,6 +2,7 @@
 Bus 003 Device 002: ID 044e:3017 Alps Electric Co., Ltd BCM2046 Bluetooth Device
 Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
 Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
+Bus 001 Device 005: ID 054c:038b Sony Corp.
 Bus 001 Device 004: ID 05ca:18b2 Ricoh Co., Ltd
 Bus 001 Device 002: ID 054c:0279 Sony Corp.
 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

bernstein % diff -u lsmod_before lsmod_after
--- lsmod_before        2011-05-09 17:32:05.000000000 +0900
+++ lsmod_after 2011-05-09 17:35:32.000000000 +0900
@@ -1,4 +1,5 @@
 Module                  Size  Used by
+usb_storage            30833  0
 psb                   115469  2
 acpi_cpufreq            4951  0
 drm_psb               122582  3 psb
@@ -94,7 +95,7 @@
 uhci_hcd               16057  0
 thermal_sys             9378  3 video,processor,thermal
 ehci_hcd               28681  0
-scsi_mod              101429  2 sd_mod,libata
+scsi_mod              101429  3 usb_storage,sd_mod,libata
 sky2                   34040  0
-usbcore                98733  5 btusb,uvcvideo,uhci_hcd,ehci_hcd
+usbcore                98733  6 usb_storage,btusb,uvcvideo,uhci_hcd,ehci_hcd
 nls_base                4541  1 usbcore

bernstein % lsusb -vvv
...
Bus 001 Device 005: ID 054c:038b Sony Corp.
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x054c Sony Corp.
  idProduct          0x038b
  bcdDevice            1.75
  iManufacturer           1 Sony
  iProduct                2 UMH-U10
  iSerial                 3 001DBABA1622
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower               96mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk (Zip)
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)

モジュールとして usb_storage が必要なようだ.いまどきは必ず組み込まれている.

bernstein % cat ./boot/config-2.6.32 | grep USB_STORAGE
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
# also be needed; see USB_STORAGE Help for more info
CONFIG_USB_STORAGE=m
# CONFIG_USB_STORAGE_DEBUG is not set
CONFIG_USB_STORAGE_DATAFAB=m
CONFIG_USB_STORAGE_FREECOM=m
CONFIG_USB_STORAGE_ISD200=m
CONFIG_USB_STORAGE_USBAT=m
CONFIG_USB_STORAGE_SDDR09=m
CONFIG_USB_STORAGE_SDDR55=m
CONFIG_USB_STORAGE_JUMPSHOT=m
CONFIG_USB_STORAGE_ALAUDA=m
CONFIG_USB_STORAGE_ONETOUCH=m
CONFIG_USB_STORAGE_KARMA=m
CONFIG_USB_STORAGE_CYPRESS_ATACB=m

昨日使った SD スロットも USB 機器として見えていたようだから,昨日再構築したカーネルはそのまま使えるはず.
昨日の手続きを踏襲し, SD カードの代わりにメモリースティックにインストールを行う. hostname は jade にしておく.

SCSI4 (0,0,0) (sdb) - 8.1 GB Sony USB HS-MS
   >     #1    primary       7.7 GB     B    f   ext2     /
   >     #5    logical     381.7 MB          f   swap     swap

dmesg でも見えたが,メモリースティックスロットと SD/MMC スロットはカードを挿入すると対で認識され,それぞれ sdb, sdc が割り当てられる模様.
昨日同様 grub はスキップし, Debian の導入を終えた MS Pro-HG を VGN-P70H に刺して UUID を調べる.

bernstein % sudo blkid
/dev/sda1: UUID="7beb28a6-dc04-4462-a622-faa90a9519ac" TYPE="ext3"
/dev/sda5: UUID="5bfd9134-baa7-4de1-acd3-c45df224ddbf" TYPE="swap"
/dev/sdb1: UUID="b82efa8b-749d-4bcc-861f-c786fa2c512e" TYPE="ext2"
/dev/sdb5: UUID="04c04b19-ec4b-4021-9381-a3091eec5bde" TYPE="swap"

VGN-P61S の C:\kernel.pam を以下のように書き換える.

/InstantON/vmlinuz-2.6.32 root=UUID=b82efa8b-749d-4bcc-861f-c786fa2c512e rw vga=0x368

続いて,昨日再構築したカーネルを導入する. VGN-P70H から chroot して行う.

bernstein % sudo mkdir /mnt/ms1
bernstein % sudo mount /dev/sdb1 /mnt/ms1
bernstein % ls /mnt/ms1
bin   dev  home        lib         media  opt   root  selinux  sys  usr  vmlinuz
boot  etc  initrd.img  lost+found  mnt    proc  sbin  srv      tmp  var
bernstein % cp linux-image-2.6.32_custom.0.2_i386.deb /mnt/ms1/tmp/
bernstein % cd /mnt/ms1/

bernstein % sudo mount --bind /proc /mnt/ms1/proc
bernstein % sudo mount --bind /dev  /mnt/ms1/dev
bernstein % sudo chroot /mnt/ms1 /usr/bin/env -i HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
            PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash --login +h
root@bernstein:/# dpkg -i /tmp/linux-image-2.6.32_custom.0.2_i386.deb
root@bernstein:/# ^D
bernstein % cd ~
bernstein % sudo umount /mnt/ms1/proc /mnt/ms1/dev /mnt/ms1

MS Pro-HG を VGN-P70H から VGN-P61S に戻し, XMB ボタンを押す.

無事起動した.

VAIO type P で SD カードから Debian をブートできるようにした

恩師に頂いた VAIO type P 二台のうち,直ちに Debian を入れて常用の端末となった Vista モデル (VGN-P70H) ではなく, XP だし残しておいたら何かと便利ではないかと放っておいたら便利屋さんとして確固たる地位を築いて消すに消せなくなってしまった XP モデル (VGN-P61S) の方を,さらにもう一段階便利屋さんとして深化させるべく, Debian とのデュアルブートにしてみた.
Debian 自体のコンフィギュレーションは前回書いたとおりなので,今回は起動までを目指して,省略.

導入

先日 RC2 の導入でうまくウィザードが動くことはわかっていたので, debian-6.0.1a-i386-DVD-1.iso を適当なミラーからダウンロードして DVD-R に焼き,適当な USB 接続の DVD ドライブからブートした. DVD ドライブとの相性が悪かったのか,「起動直後」は F11 を叩いてもブートメニューには入れず,いったん F2 で BIOS の設定画面を見てから,そこから再起動した後 F11 を叩く必要があった.
使用した SD カードは Transcend の 8GB (Class 6) のもの.インストール先のディスクを選ぶ画面では,

SCSI4 (0,0,1) (sdc) - 8.0 GB Sony USB HS-SD/MMC
   >     #1    primary       7.6 GB    B  K   ext2   /
   >     #5    logical     379.6 MB       F   swap   swap

このように sdc として見えていた SD カードを選択.ガイドは上のような比率で切ってくれたので,ファイルシステムext2 に,マウントオプションとして noatime をつけておいた. ext3 でもジャーナリングの設定を変えればアクセスを抑制できるそうだが,面倒くさかったのでこのような設定にした.そもそもこの手のチューニングに意味があるのかどうか甚だ疑問ではある.
あとは適当に手続きを進める. grub を /dev/sda に入れてしまうと Windows が残念なことになるので,そこだけ注意する.私は /dev/sdc に導入したが,後述するようにどうせうまく動かないので, /dev/sda にさえ入れなければどうしてもよい.いや,もしかすると, /dev/sda に入れればそれで何も問題なく幸せになれたのかもしれないが,あまり自信がなかったので私はそうしなかった.

起動…失敗

Windows が起動する. BIOS で External Device からの起動を優先させる設定が行えるが,これは USB 接続のデバイスのことらしく, SD カードは読みに行ってくれない模様.ブートローダを導入した USB メモリを刺せば起動できそうだが,それでは刺しっぱなしでも邪魔にならない SD カードに格納した意味がなくなってしまうのでパス.

XMB をハックする

VAIO type P にはクロスメディアバーボタンという小さなボタンがある.電源ボタンの代わりにこれを押すと,十秒ほどでインスタントモードという AV 機器っぽい機能を集めた小さな OS が起動する.この実体は Linux で, Windowsパーティション内 C:\InstantON\ 以下にそのイメージが格納され, C:\{initrd,kernel}.pam で具体的な Kernel と initrd が指定されている.これらを先に導入した Debian のものに置き換えてしまえば,いちいちブートローダの心配をせずとも,電源ボタンを Windows の, XMB ボタンを Debian の起動スイッチとして働かせることが出来そうだ.

カーネルを弄る

ところが面倒なことに, initrd 以外のイメージは ext2 そのままなのだが, initrd だけはよくわからない形式で保存されており,これを標準的な方法でこしらえた initrd に置換してもちゃんと展開してくれない.インスタントモードは C:\initrd.pam が何も指していなくても異常終了することはない仕様のようなので, initramfs の仕組みを使って rootfs をカーネルに組み込んでみる.
${TEMPDIR} を作業ディレクトリ,カーネルのバージョンを 2.6.xx とする.以下の作業は,適当な Debian 系 OS で行うと簡単でよい.私はたまたま Xeon E5540 を二つとメモリを 8GB も積んだ計算機の root を持っていたので,手元の Debian で debootstrap した minimum Debian をコピー, chroot してその中で作業を行った.カーネルのビルドは一晩かかる印象があったので, CONCURRENCY_LEVEL=16 並列とはいえわずか数分で終わってしまって隔世の感が.

% cd ${TEMPDIR}
% sudo apt-get build-dep linux-source-2.6
% sudo apt-get source linux-source-2.6
% cd linux-2.6-2.6.xx/
% sudo make menuconfig

コンフィギュレーションで気をつけるべきことは,

  • ext2 のサポートを有効にする
  • MMC/SD のサポートを有効にする

の二点だろう.後は好みで.

% sudo make-kpkg --revision=custom.0.1 --initrd kernel_image
% sudo dpkg -i ../linux-image-2.6.xx_custom.0.1_i386.deb

initrd のイメージは dpkg -i の際に mkinitrd で生成されるようなので,いったんビルドしたカーネルをインストールした後,生成された initrd を組み込んだ形でカーネルを再びビルドする.

% mkdir ../initrd/
% cd ../initrd/
% gunzip -c /boot/initrd.img-2.6.xx | cpio -i
% cd ../linux-2.6-2.6.xx/
% sudo dpkg -r linux-image-2.6.xx
% sudo sed -e 's:CONFIG_INITRAMFS_SOURCE="":CONFIG_INITRAMFS_SOURCE="${TEMPDIR}/initrd/":' -i .config
% sudo make-kpkg --revision=custom.0.2 --initrd kernel_image

% dpkg-deb --fsys-tarfile ../linux-image-2.6.xx_custom.0.2_i386.deb | tar xf - ./boot/vmlinuz-2.6.xx
% cp ./boot/vmlinuz-2.6.xx ${InstantON_DIR}

できあがった Kernel を,どこでもよいのだが,わかりやすく C:\InstantON\vmlinuz-2.6.xx に置く. C:\initrd.pam は空, C:\kernel.pam は

/InstantON/vmlinuz-2.6.xx root=UUID=********-****-****-****-************ rw vga=0x368

などとしておく. UUID は blkid などで調べることができる. root=/dev/sdc1 といった古い指定の方法でもよいが,現在は UUID が推奨されているらしいので,こちらの方がいいだろう. USB メモリなどを刺した状態で起動すると認識順の関係で名前が変わることは実際問題大いにあり得る.

というわけで

電源ボタンを押すと Windows XP (@HDD) が, XMB ボタンを押すと Debian squeeze (@SD) が起動するデュアルブートVAIO type P ができあがった.基本的には Windows XP を使い,必要なときは XP を休止状態にして Debian に切り替えシンクライアントとして使用できるという,いかにもよく遊びに行く誰かに貸すに適した仕様になったと言えよう.

chroot into SLC5 with X on Debian Squeeze

三月まで世話になったところでは猫も杓子も Ubuntu という感じだったが,四月から世話になるところでは猫も杓子も Scientific Linux らしい.曰く SL は必要になるパッケージがよく整備されていると. RHEL 系には物心ついてからはさわった記憶がないので,いい経験だと思って使ってみることにした.
とは言っても, Scientific Linux の入った PC を用意したところで,場所を取るだけの SSH のクライアントに成り下がるのは目に見えているので,普段使っている Debian から chroot する対象として用意する.
本家の HP に iso のイメージしか見あたらないところからして, Debian でいうところの debootstrap のようなものが用意されている気配はない.ちょっと調べてみると rpmstrap というそれっぽいツールを開発していたプロジェクトがあったようだが,現在は死んでいるらしく,今は rinse というツールが事実上唯一の選択肢の様子.その rinse も Fedora 10 を最後に更新が止まっているので,これも時間の問題かもしれない.まあともかく, SLC5 に対応させるパッチと組み合わせてみる.
SL (Scientific Linux) と SLC (Scientific Linux CERN) の違いについては Linux @ CERN: /linux/scientific.shtml を参照.

% sudo aptitude install rinse yum
% wget http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg887097/rinse-slc5.tar.gz
% tar xvf rinse-slc5.tar.gz
% cd rinse-contrib/

手続きは同梱されているシェルスクリプトにまとまっているので, README に従っていくつかのコマンドを実行するだけで簡単に最小の SLC ができあがる.そのままでは chroot すべき環境が ${OLDPWD}/rinse-contrib/slc5-{amd64,i386} に作られるので,これを /var/chroot/slc5-{amd64,i386} に変更しておく.

% vi build-slc5.sh
% diff -u build-slc5.sh.org build-slc5.sh
--- build-slc5.sh.org   2011-03-28 23:19:07.000000000 +0900
+++ build-slc5.sh       2011-04-03 03:24:49.000000000 +0900
@@ -5,7 +5,7 @@
 #  03/2011, marcus.freudeberg@cern.ch


-BASEDIR=.
+BASEDIR=/var/chroot
 DISTRI=slc5


% mkdir /var/chroot
% sudo ./setup.sh
% sudo ./build-slc5.sh
% sudo ./ch-root.sh /var/chroot/slc5-i386
bash-3.2# uname -a
Linux bernstein 2.6.32-5-686 #1 SMP Tue Mar 8 21:36:00 UTC 2011 i686 i686 i386 GNU/Linux
bash-3.2# cat /etc/issue.net
Scientific Linux CERN SLC release 5.6 (Boron)
Kernel \r on an \m

簡単に動いた.しかしこのままではさすがに実用的であるとは言い難いので,適当に設定してやる.
まずはタイムゾーンの設定. CERN のくせに,どういう訳か東部夏時間になっているので,日本標準時にしておく.

bash-3.2# date
Sun Apr  3 02:56:43 EDT 2011
bash-3.2# mv /etc/localtime /etc/localtime.org
bash-3.2# cp -a /usr/share/zoneinfo/Japan /etc/localtime
bash-3.2# date
Sun Apr  3 15:58:26 JST 2011

M. F. 氏による最小構成は man すら入っていないというストイックぶりで,これではさすがに厳しいのでいろいろと入れておく.せっかくなので X も試してみる.

bash-3.2# yum install man screen sudo vim
bash-3.2# visudo
bash-3.2# yum groupinstall "X Window System"

/etc/hosts, /etc/hostname, /etc/passwd, /etc/group などは,ホスト側と同期しておいた方が何かと都合がよい.

% sudo ln /etc/hosts /var/chroot/slc5-i386/etc/hosts
% sudo ln /etc/hostname /var/chroot/slc5-i386/etc/hostname
% cat /etc/passwd | grep ${LOGNAME} | sudo tee -a /var/chroot/slc5-i386/etc/passwd
% cat /etc/group | grep ${LOGNAME} | sudo tee -a /var/chroot/slc5-i386/etc/group

bash-3.2# pwconv
bash-3.2# passwd
bash-3.2# passwd ${SUDO_USER}

特別なディレクトリおよびホームディレクトリは mount -o bind でホスト側のそれをそのまま流用するように設定しておく.

% sudo vi /etc/fstab
% sudo mount -a
# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>

...

# chroot /var/chroot/slc5-i386
/proc           /var/chroot/slc5-i386/proc      none    bind            0       0
/dev            /var/chroot/slc5-i386/dev       none    bind            0       0
/tmp            /var/chroot/slc5-i386/tmp       none    bind            0       0
/home           /var/chroot/slc5-i386/home      none    bind            0       0
devpts-chroot   /var/chroot/slc5-i386/dev/pts   devpts  defaults        0       0

Debian は tty1--6 に端末を, tty7 に X Window を割り当てている. chroot 用に tty8,9 を使うのが慣用らしい.

% echo "8:23:respawn:/usr/sbin/chroot /var/chroot/slc5-i386 \
  /sbin/agetty 38400 tty8" | sudo tee -a /etc/inittab
% sudo init q

Ctrl + Alt + F8 で tty8 に切り替えて,

Scientific Linux CERN SLC release 5.6 (Boron)
Kernel 2.6.32-5-686 on an i686

bernstein login: _

こんな画面が出てくれば成功.立て続けに X の設定を行う.

$ sudo X :1 -configure
$ sudo cp -a ~/xorg.conf.new /etc/X11/xorg.conf
$ sudo vi /etc/X11/xorg.conf

/etc/X11/xorg.conf の設定は,自分の環境に合わせて.私の VAIO type P (VGN-P70H) では, Driver を vesa ではなく fbdev に, DefaultDepth を 24 に設定したところ,崩れず美しく表示された.
あとは, X を起動する適当なスクリプトを用意しておく.

% vi startx_slc5.sh
% chmod +x startx_slc5.sh
#!/bin/sh
export XAUTHORITY=${HOME}/.Xauthority_slc5
export DISPLAY=:1.0

startx -- :1

tty8 からログインして

$ ./startx_slc5.sh

と叩くと, tty9 に X Window System が起動する.
本当は DISPLAY=:0.0 を共有したかったのだが,やり方がわからなかったので今回はパス.誰か教えてください.

LS-XHLにDebian squeezeを入れた

以前 Debian lenny を入れた LS-XHL に,先日リリースされた Debian squeeze を入れたので,その作業メモを.

lennyからのアップグレード(失敗)

第4章 Debian 5.0 (lenny) からのアップグレードを頼りに dist-upgrade を試みる. squeeze のインストールは, lenny からのアップグレードはもちろんクリーンインストールも一度やっているので,どうにかなるだろうと楽観的に.

この節で % は LS-XHL の通常権限でのコマンド, # は LS-XHL の特権でのコマンド.

前準備

バックアップは毎日勝手に行われているので,一部だけやっておく.

% sudo dpkg --get-selections "*" > dpkg_getselections_all_`date +%Y%m%d`.log

あと, crontab のコメントアウト,自分で追加したデーモンの init スクリプト無効化,バックアップ用の外付け HDD の切り離しなどを済ませておく.で,いったんリブートして確認.
続いて,リリースノートの指示に従ってパッケージの衝突確認や apt-pinning の解除などをする.色々ぐしゃぐしゃにした自覚はあったが,とりあえずおかしなことにはなっていなかった模様.

% sudo apt-get purge splashy

% sudo dpkg --audit

% sudo mv /etc/apt/preferences /etc/apt/preferences.`date +%Y%m%d`
% sudo mv /etc/apt/sources.list /etc/apt/sources.list.`date +%Y%m%d`
% echo<<EOF | sudo tee /etc/apt/sources.list
deb http://ftp.jp.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp.jp.debian.org/debian/ squeeze main contrib non-free
EOF

% mount
/dev/sda2 on / type xfs (rw,noatime)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sda1 on /boot type ext3 (rw,noatime)
/dev/sda6 on /home type xfs (rw,noatime)

すべて rw でマウントされているので問題なさそう.
石橋をたたき割る勢いで, tmux のセッションをすべて閉じて GNU screen に切り替え, script で記録を保存しておく.

# script -t 2>~/upgrade-squeeze.time -a ~/upgrade-squeeze.script
# apt-get update
# apt-get -o APT::Get::Trivial-Only=true dist-upgrade
...
574 upgraded, 206 newly installed, 13 to remove and 0 not upgraded.
Need to get 484MB of archives.
After this operation, 707MB of additional disk space will be used.
E: Trivial Only specified but this is not a trivial operation.

# df -Thl
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2      xfs    4.8G  3.3G  1.5G  69% /
tmpfs        tmpfs    124M     0  124M   0% /lib/init/rw
udev         tmpfs     10M  596K  9.5M   6% /dev
tmpfs        tmpfs    124M     0  124M   0% /dev/shm
/dev/sda1     ext3    969M  225M  744M  24% /boot
/dev/sda6      xfs    1.4T  553G  830G  40% /home

大丈夫そうだ.
さて, squeeze が採用している最近の udev (>=150) は, CONFIG_SYSFS_DEPRECATED のサポートを打ち切っていて,このフラグが立ってるとまずいらしい.私の LS-XHL には現在LS-XHL用のカーネルをコンパイルする話の手続きにちょっとおまけをつけてコンパイルした Kernel 2.6.31.1 が入っているのだが,これは

CONFIG_SYSFS_DEPRECATED=n
CONFIG_SYSFS_DEPRECATED_V2=n
CONFIG_INOTIFY_USER=y
CONFIG_SIGNALFD=y
version>=2.6.26

の条件を満たしているので,そのまま使い回せる.最初,よく説明を見ずに squeeze デフォルトの 2.6.32 を用意しなければいけないと勘違いして,無駄骨を折ってしまった.
なお, /boot/config-2.6.31.1 を見ても CONFIG_SYSFS_DEPRECATED に関して何も書かれていないので心配になるが, make menuconfig 時に

General Settings ->
  [ ] remove sysfs features which may confuse old userspace tools

のオプションに触っていなければ,つまり指示通り作業していれば問題は無い.

upgrade

環境は整ったのでアップグレードを行う.

% sudo apt-get update
% sudo apt-get upgrade
...
Preparing to replace fuse-utils 2.7.4-1.1+lenny1 (using .../fuse-utils_2.8.4-1.1_armel.deb) ...

暫く放っておいたらディスクアクセス音がしなくなったので,見てみると fuse-utils の設定で止まっている.

% vmstat 10
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  1    688  26100     12 153484    0    0    99   271   84  147 10  3 32 55
 0  1    688  26116     12 153484    0    0     0     0   20   35  0  0  0 100
 0  1    688  26116     12 153484    0    0     0     2   19   36  0  0  0 100
 0  1    688  26124     12 153484    0    0     0     3   21   38  0  0  0 100
 0  1    688  26124     12 153484    0    0     0     0   18   33  0  0  0 100
 0  1    688  26124     12 153484    0    0     0     0   18   33  0  0  0 100
 0  1    688  26124     12 153484    0    0     0     0   18   33  0  0  0 100
% ps ax | grep fuse
16517 pts/6    Ss+    0:00 /usr/bin/dpkg --status-fd 11 --unpack --auto-deconfigure /var/cache/apt/archives/fuse-utils_2.8.4-1.1_armel.deb /var/cache/apt/archives/libfuse2_2.8.4-1.1_armel.deb
16524 pts/6    S+     0:00 /bin/sh /var/lib/dpkg/info/fuse-utils.prerm upgrade 2.8.4-1.1
16527 pts/6    S+     0:00 /bin/sh /usr/sbin/invoke-rc.d fuse stop
16543 pts/6    S+     0:00 /bin/sh /etc/init.d/fuse stop
16548 pts/6    D+     0:00 umount -at fuseblk

何らかの理由で umount が凍ってプロセスが進まなくなっていたようなのだが,あまり考えもなしに apt から呼ばれているプロセスをいったん殺し, apt-get -f install, apt-get install fuse-utils などして,謎の umount -at fuseblk をまた積み重ねてしまった.そして気づいたら生きている端末が一つだけという状態になり,焦って reboot を試みたものの, umount 出来ずに止まっているのだから当然 reboot も出来ず,仕方なく電源断.祈りつつ電源を入れるも,青 LED 点滅 -> 青 LED 点灯 -> 直後に再起動の無限ループに陥ってしまい,アップデートは失敗.

debootstrap で一から

この節で % は VGN-P70H の通常権限でのコマンド, $ は LS-XHL の通常権限でのコマンド, # は LS-XHL の HDD へ VGN-P70H へ chroot した上でのコマンド.ただし一部コメントの接頭辞だったりグループの接頭辞だったり紛らわしい.
こんなこともあろうかと,パーティション構成は弄らず,デフォルトでついてきたカーネルとシステムはバックアップを取っていたので,それをコピーするだけでシステムは簡単に工場出荷時の状態に戻る.ただ,そこから同じことを繰り返すのも不毛なので,直接 squeeze のクリーンなシステムを作ることを試みる.マニュアルは,D.3. Unix/Linux システムからの Debian GNU/Linux のインストール
LS-XHL のパーティション

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>                       <dump> <pass>
proc            /proc           proc    defaults                        0 0
sys             /sys            sysfs   defaults                        0 0
/dev/sda1       /boot           ext3    defaults,noatime                0 1
/dev/sda2       /               xfs     defaults,noatime                0 0
/dev/sda5       swap            swap    defaults                        0 0
/dev/sda6       /home           xfs     defaults,noatime                0 2

このようになっている. /dev/sda2 は高々 5GB なので,丸ごと /dev/sda6 にバックアップした上で, /dev/sda2 に最小のシステムを構成する.
HDD を LS-XHL から取り出し USB/SATA 変換ケーブルで VGN-P70H に接続する.

% dmesg
...
[273146.748969] usb-storage: device scan complete
[273146.750284] scsi 7:0:0:0: Direct-Access     SAMSUNG  HD154UI          1118 PQ: 0 ANSI: 2 CCS
[273146.757494] sd 7:0:0:0: [sdb] 2930277168 512-byte logical blocks: (1.50 TB/1.36 TiB)
[273146.758349] sd 7:0:0:0: [sdb] Write Protect is off
[273146.758376] sd 7:0:0:0: [sdb] Mode Sense: 00 38 00 00
[273146.758391] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[273146.760626] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[273146.760657]  sdb: sdb1 sdb2 sdb3 sdb4 sdb5 sdb6
[273146.817469] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[273146.817496] sd 7:0:0:0: [sdb] Attached SCSI disk

sdb として認識されたので,適当にマウントポイントを作成してマウント.バックアップを行う.

% sudo mkdir /mnt/lsxhl2 /mnt/lsxhl6
% sudo mount /dev/sdb2 /mnt/lsxhl2
% sudo mount /dev/sdb6 /mnt/lsxhl6
% cd /mnt/lsxhl2/
% ls
backup  boot  etc   initrd      initrd.img.old  _ls-xhl_1.10  mnt  proc  sbin     srv  tmp  var      vmlinuz.old
bin     dev   home  initrd.img  lib             media         opt  root  selinux  sys  usr  vmlinuz
% sudo tar cvf /mnt/lsxhl6/lenny_root_20110307.tar .

正しくバックアップ出来たか確かめていたところ,急に /mnt/lsxhl6 にアクセスできなくなった.

% dmesg
...
[274512.811201] XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1629 of file /build/buildd-linux-2.6_2.6.32-30-i386-UYhWt7/linux-2.6-2.6.32/debian/build/source_i386_none/fs/xfs/xfs_alloc.c.  Caller 0xf8f1cb68
[274512.811232] Pid: 31, comm: kswapd0 Tainted: G        W  2.6.32-5-686 #1
[274512.811243] Call Trace:
[274512.811317]  [<f8f1b1a2>] ? xfs_free_ag_extent+0x163/0x5e3 [xfs]
[274512.811424]  [<f8f1cb68>] ? xfs_free_extent+0xa2/0xbf [xfs]
[274512.811506]  [<f8f1cb68>] ? xfs_free_extent+0xa2/0xbf [xfs]
[274512.811595]  [<f8f28faf>] ? xfs_bmap_finish+0xe6/0x154 [xfs]
[274512.811693]  [<f8f42f52>] ? xfs_itruncate_finish+0x1e8/0x2fb [xfs]
[274512.811795]  [<f8f57c42>] ? xfs_free_eofblocks+0x21d/0x262 [xfs]
[274512.811880]  [<f8f5821b>] ? xfs_inactive+0x101/0x3bb [xfs]
[274512.811958]  [<f8f629c3>] ? __xfs_inode_set_reclaim_tag+0x29/0x2f [xfs]
[274512.812028]  [<f8f62a12>] ? xfs_inode_set_reclaim_tag+0x49/0x64 [xfs]
[274512.812196]  [<c10c1f1e>] ? clear_inode+0x6a/0xb6
[274512.812217]  [<c10c2137>] ? dispose_list+0x48/0xd0
[274512.812238]  [<c10c2365>] ? shrink_icache_memory+0x1a6/0x1d3
[274512.812260]  [<c10903d2>] ? shrink_slab+0xe6/0x13f
[274512.812280]  [<c1090803>] ? kswapd+0x3d8/0x54f
[274512.812302]  [<c108e831>] ? isolate_pages_global+0x0/0x1bc
[274512.812326]  [<c1043cc6>] ? autoremove_wake_function+0x0/0x2d
[274512.812347]  [<c109042b>] ? kswapd+0x0/0x54f
[274512.812366]  [<c1043a94>] ? kthread+0x61/0x66
[274512.812385]  [<c1043a33>] ? kthread+0x0/0x66
[274512.812408]  [<c1003d47>] ? kernel_thread_helper+0x7/0x10
[274512.812444] xfs_force_shutdown(sdb6,0x8) called from line 4341 of file /build/buildd-linux-2.6_2.6.32-30-i386-UYhWt7/linux-2.6-2.6.32/debian/build/source_i386_none/fs/xfs/xfs_bmap.c.  Return address = 0xf8f28fe3
[274512.816189] Filesystem "sdb6": Corruption of in-memory data detected.  Shutting down filesystem: sdb6
[274512.816215] Please umount the filesystem, and rectify the problem(s)
[274528.712076] Filesystem "sdb6": xfs_log_force: error 5 returned.
[274564.712182] Filesystem "sdb6": xfs_log_force: error 5 returned.

% sudo umount /dev/sdb6
% sudo mount /dev/sdb6 /mnt/lsxhl6
mount: Structure needs cleaning

% sudo xfs_check /dev/sdb6
ERROR: The filesystem has valuable metadata changes in a log which needs to
be replayed.  Mount the filesystem to replay the log, and unmount it before
re-running xfs_check.  If you are unable to mount the filesystem, then use
the xfs_repair -L option to destroy the log and attempt a repair.
Note that destroying the log may cause corruption -- please attempt a mount
of the filesystem before doing this.

% sudo xfs_repair -L /dev/sdb6
...
Phase 7 - verify and correct link counts...
done

% sudo mount /dev/sdb6 /mnt/lsxhl6

% dmesg
...
[275492.624711] XFS mounting filesystem sdb6
[275492.750146] Ending clean XFS mount for filesystem: sdb6

% ls -lha /mnt/lsxhl6/lost+found
total 412K
drwxr-xr-x  2 root     root       17 Mar  7 08:00 .
drwxrwxrwx 19 root     root     4.0K Mar  7 07:31 ..
-rw-------  1 ludobile ludobile 405K Mar  7 06:10 8562

前日のバックアップがあるので恐れることもないのだけど,心臓によろしくない.この 8562 とか言うファイルは ~/.zsh_history のようだった.
では, /mnt/lsxhl2 に debootstrap を使って基本システムを導入する.やってみればわかるのだが,ある種のシステムコールQEMU でサポートされていないらしく, chroot 下で dpkg を走らせることが出来ない.最小構成には telnetssh も含まれていないようなので,明示的に ssh などを入れてあげないと,外から全くアクセスできないただの箱ができあがるので注意.

% sudo aptitude install debootstrap
% sudo debootstrap --foreign --arch=armel --include=locales,ssh,sudo,udev --verbose squeeze /mnt/lsxhl2
...
I: Extracting zlib1g...

% sudo chroot /mnt/lsxhl2 /bin/bash
chroot: failed to run command `/bin/bash': Exec format error

ホスト側(VGN-P70H)は i386 ,ターゲット側(LS-XHL)は armel とアーキテクチャが異なるで,そのまま chroot しようとしても出来ない.玄箱など armel の動いているマシンを引っ張り出してきて後半の手続きをしても良いのだが,せっかくなので QEMU を使って armel のエミュレートをしてみる.

% sudo aptitude install qemu qemu-user-static

% sudo update-binfmts --display qemu-arm
qemu-arm (enabled):
     package = qemu-user-static
        type = magic
      offset = 0
       magic = \x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00
        mask = \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
 interpreter = /usr/bin/qemu-arm-static
    detector =

% sudo cp -a /usr/bin/qemu-arm-static /mnt/lsxhl2/usr/bin/

KMC Staff Blog:QEMUのもうひとつの使い方: ユーザーモードエミュレーションとbinfmtとchrootの組み合わせによると, QEMUchroot するときは,動的にリンクされた qemu では問題が発生するらしいので,静的にリンクされたものを使う.
で,改めて chroot

% sudo chroot /mnt/lsxhl2 /bin/bash
I have no name!@bernstein:/# uname -a
Linux bernstein 2.6.32-5-686 #1 SMP Wed Jan 12 04:01:41 UTC 2011 armv5tel GNU/Linux

成功.続いて debootstrap の続きと,基本的な設定を行う.

# /debootstrap/debootstrap --second-stage

# vi /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>                       <dump> <pass>
proc            /proc           proc    defaults                        0 0
sys             /sys            sysfs   defaults                        0 0
/dev/sda1       /boot           ext3    defaults,noatime                0 1
/dev/sda2       /               xfs     defaults,noatime                0 0
/dev/sda5       swap            swap    defaults                        0 0
/dev/sda6       /home           xfs     defaults,noatime                0 2
#/dev/sdb        /backup         ext3    defaults,noatime,noexec         0 3

# dpkg-reconfigure tzdata
'Asia/Tokyo'

# vi /etc/network/interfaces
# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or
# /usr/share/doc/ifupdown/examples for more information.
# We always want the loopback interface.
#
auto lo
iface lo inet loopback
# To use dhcp:
#
auto eth1
iface eth1 inet dhcp
auto eth2
iface eth2 inet dhcp

# vi /etc/resolv.conf
nameserver 192.168.0.1

# vi /etc/hostname
lunasa

# vi /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
fe00::0         ip6-localnet
ff00::0         ip6-mcastprefix
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
#IP           routerId           vernacularId     MAC               comments
# last modified 2011-03-05 22:54
...

# vi /etc/apt/sources.list
deb http://ftp.jp.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp.jp.debian.org/debian/ squeeze main contrib non-free
deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main

# adduser ludobile

# visudo
%adm ALL=(ALL) ALL

# adduser ludobile adm

注意すべきは /etc/network/interfaces で,元々 LS-XHL はイーサネットアダプタが 1-origin という奇妙な仕様なのに加えて,後々わかることだが新しい udev が何故かこれをさらにリネームしてカウントアップしてくれる.何なんだろうか.
あとは, ssh のホスト鍵を以前のものに置き換え,モジュールをコピーし, HDD をアンマウントして LS-XHL にセットして起動する.アンマウントするとき, mount -t proc proc /proc などしていると, device is busy などと言われて失敗する.そのときは lazy オプション -l をつければうまくいく.

% cd /mnt/lsxhl2/etc/ssh/
% sudo rm *
% cd /mnt/lsxhl2/
% sudo tar xvf /mnt/lsxhl6/lenny_root_20110307.tar etc/ssh

% sudo tar xvf /mnt/lsxhl6/lenny_root_20110307.tar lib/modules/2.6.31.1

% sudo umount /dev/sdb2 /dev/sdb6

% ssh lunasa
Linux lunasa 2.6.31.1 #1 PREEMPT Thu Dec 30 03:01:24 JST 2010 armv5tel

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
ludobile@lunasa:~$ cat /etc/issue.net
Debian GNU/Linux 6.0

Debian squeeze が動いた.最低限の設定だけしておく.

$ sudo dpkg-reconfigure locales
$ sudo date --set="Mon Mar  7 12:31:53 JST 2011"
$ sudo aptitude update && sudo aptitude full-upgrade

このあと雑多なパッケージの導入作業中に man-db が壊れて, VGN-P70H からのアクセスでは読めるし badblocks -vn もパスするものの LS-XHL からは読めないという謎のブロックが発生して,仕方なく /dev/sdb2 をフォーマットしてまた最初からやり直したりしたけれど,それはあまりにどうでもいいので省略.

rxvt-unicode 9.09でshading(transparency)を設定する

私は今まで以下のように urxvt の透過設定をしていた.

% cat .Xdefaults
...
URxvt.shading: 30
...

% cat .xsession
...
xpmroot ~/wallpapers/06407122_s.xpm &
...
urxvt &

が,先日 9.07 から 9.09 にバージョンを上げたところ,透過設定が正しく働かなくなってしまった.事情は知らないが,互換性を保つためのコードを 9.09 で削除したらしい.老婆心から IE サポートしてデスマっちゃう俺かっけー,みたいなのの対極を行く感じで好感が持てる.
公式の FAQ によると,そもそも透過はサポートしていないらしい.胸にきゅんきゅんくる感じに書かれていたので引用しておく.こういう FAQ いいよね.

I can't get transparency working, what am I doing wrong?
First of all, transparency isn't officially supported in rxvt-unicode, so you are mostly on your own. Do not bug the author about it (but you may bug everybody else). Also, if you can't get it working consider it a rite of passage: ... and you failed.

Here are four ways to get transparency. Do read the manpage and option descriptions for the programs mentioned and rxvt-unicode. Really, do it!

1. Use transparent mode:

Esetroot wallpaper.jpg
urxvt -tr -tint red -sh 40

That works. If you think it doesn't, you lack transparency and tinting support, or you are unable to read. This method requires that the background-setting program sets the _XROOTPMAP_ID or ESETROOT_PMAP_ID property. Compatible programs are Esetroot, hsetroot and feh.
...

http://pod.tst.eu/http://cvs.schmorp.de/rxvt-unicode/doc/rxvt.7.pod

もし使いたいなら, Esetroot か hsetrott, あるいは feh を使えと.名前が短くて気に入ったので feh を使ってみる.

% sudo aptitude install feh
% feh --bg-fill ~/wallpapers/06407122_s.xpm

としたところ,ちゃんと透過してくれるようになったので, ~/.xsession の xpmroot を使っていた部分を

feh --bg-fill ~/wallpapers/06407122_s.xpm

と書き換えて問題解決.

skyped 0.81-0.2で非ASCIIなSkype表示名の人とチャットするために

Skype plugin for BitlBeeを使ってみた - 接続法第三式の続き.
会話文のほうは encode が意識されているものの,表示名の方は適当だったらしく,話しかけられると Skype を巻き込んで落ちる. Python は知らないのでパッチは適当.

--- /usr/bin/skyped.org 2010-08-25 06:10:05.000000000 +0900
+++ /usr/bin/skyped     2011-03-05 03:45:53.000000000 +0900
@@ -52,7 +52,7 @@
        global options
        if options.buf:
                for i in options.buf:
-                       skype.send(i.strip())
+                       skype.send(i.encode('utf-8').strip())
                options.buf = None
        else:
                try:
@@ -62,7 +62,7 @@
                        fd.close()
                        return False
                for i in input.split("\n"):
-                       skype.send(i.strip())
+                       skype.send(i.encode('utf-8').strip())
                return True

あと, sys.defaultencoding を 'utf-8' にするために, /usr/lib/python2.*/site.py を書き換えた.

--- /usr/lib/python2.5/site.py.org      2010-01-25 02:07:45.000000000 +0900
+++ /usr/lib/python2.5/site.py  2011-03-05 03:35:03.000000000 +0900
@@ -363,7 +363,7 @@
     """Set the string encoding used by the Unicode implementation.  The
     default is 'ascii', but if you're willing to experiment, you can
     change this."""
-    encoding = "ascii" # Default value set by _PyUnicode_Init()
+    encoding = "utf-8" # Default value set by _PyUnicode_Init()
     if 0:
         # Enable to support locale aware default string encodings.
         import locale

2.6 も同様だった.