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