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 をフォーマットしてまた最初からやり直したりしたけれど,それはあまりにどうでもいいので省略.