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 を走らせることが出来ない.最小構成には telnet も ssh も含まれていないようなので,明示的に 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の組み合わせによると, QEMU で chroot するときは,動的にリンクされた 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 40That 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 も同様だった.