Debian 6 (squeeze) から 7 (wheezy)へ更新 ======================================== ◎ 準備(バックアップ) 念のためシングルユーザモードでバックアップ drake# telinit 1 drake# dump -0 -f squeeze.boot.dump /dev/sda1 DUMP: Date of this level 0 dump: Sat Jun 8 15:14:41 2013 DUMP: Dumping /dev/sda1 (/boot) to squeeze.boot.dump DUMP: Label: boot . . . DUMP: DUMP IS DONE drake# dump -0 -f squeeze.root.dump /dev/sda5 . . . drake# telinit 2 ※ バックアップをとるなら、保険として、 別パーティションに展開して grub から起動できるようにしておけばよかった。 ○ sources.list を更新 drake% dpkg --get-selections | grep 'hold$' で hold 状態のパッケージがないことを確認。 /etc/apt/**/*.list 中の squeeze を wheezy に変更。 proposed-updates を扱う行を(一時的に)コメントアウト その他、 wheezy 用パッケージ情報が取得出来なかった deb 行(backports)もコメントアウト ※ squeeze 用 deb 行は残したままで wheezy を追加し、 更新完了後に squeeze 用の行を消す方がいいかもしれない。 ○ upgrade drake# apt-get -d upgrade で最小アップグレードに必要なパッケージを先にローカルに取得しておいた。 aptitude safe-upgrade すると依存関係の検査に何分もかかって なかなか終わりそうになかったので中断して、 公式ページの指示通り apt-get に切り替えた。 drake# script -t 2> ~/upgrade-wheezy.1 -a ~/upgrade-wheezy.script Script started, file is /home/izumi/upgrade-wheezy.script 535パッケージを更新すると出たので個別の更新は諦めて一括で更新。 注意点(教訓) ・ 一時的に openbsd-inetd が停止された。 停止時間を最小にしたいならパッケージを少しずつ更新するのがよさそう。 ・ 設定ファイルの更新について聞かれたのは updatedb.conf, dwww.conf, cxref/config, sudoers ・ Stopping ISC DHCP server: dhcpd が失敗したが 起動しないように設定しておいたせいか? ・ python-support のトリガを処理しています ... で Compiling /usr/lib/pymodules/python2.5/gquilt_pkg/config.py ... File "/usr/lib/pymodules/python2.5/gquilt_pkg/config.py", line 72 os.mkdir(GQUILT_D_NAME, 0o775) ^ SyntaxError: invalid syntax . . . その他のエラー . . . というエラーが発生した。 gquilt_pkg が python 2.6 以上の構文を使っているのに 2.5 用の モジュールに入ってしまっている様子。 影響なさそうなので放置。 設定の更新 cxref, dwww については実質の変更がなかったので新版に置き換えた。 sudoers については includedir /etc/sudoers.d を使うように言われたので ほぼ手引書通りに対応。 drake# mv -i /etc/sudoers /etc/sudoers.d/mychanges drake# mv -i /etc/sudoers.dpkg-dist /etc/sudoers 重複するエントリ(#includedir /etc/sudoers.d など)は mychanges から削除した。 drake# gvim -d /etc/sudoers{,.d/mychanges} drake# visudo drake# visudo -f /etc/sudoers.d/mychanges updatedb.conf PRUNEFS に curlftpfs というのが追加されていたので反映。 ○ 個別パッケージの更新 残りのパッケージ全部を一括で更新するのは時間もかかるし恐ろしい。 膨大な apt-listchanges を前に途方に暮れるだろうから 無難そうなパッケージから順次更新(apt-get install)。 ただしこれをすると autoremove 対象でなくなるかもしれないことに注意。 フォント関係は fonts-xxx の名前に統一されたか? ttf-* や otf-* が不要になる場合も多い。 drake# apt-get install ttf-mplus で fonts-mplus が入る。 ttf-mplus はダミーなので消してよい。 dpkg -l | eg dummy で Transitional dummy package を探して apt-get remove --purge しておいた drake# apt-get remove --purge ttf-mplus ... フォントの論理名変更の影響が出るかもしれない。 実行中の iceweasel の日本語表示に一部文字化けが生じた。 これは iceweasel の再起動で解消。 libssl, python2.6 のインストールは何も問題なく受け入れられた drake# apt-get install libssl-dev libssl1.0.0 ○ 要所 パッケージ別の注意点 ・ sgml-base /etc/sgml/catalog が /var/lib/sgml-base/supercatalog への シンボリックリンクに変更。 apt-listchanges の通知に従って手動での編集が必要そう。 ・ nfs-common を更新すると portmap を削除されるが portmap は rpcbind コマンドで代用することになるらしい。 ・ console-setup を更新すると console-terminus が削除されるが 多分不要なので実行。 ・ grub /etc/default/grub の変更があるがコメント部しか関係しなかった。 新しい設定(grub.ucf-dist)を参考にして #GRUB_DISABLE_LINUX_RECOVERY="true" を #GRUB_DISABLE_RECOVERY="true" に変更した。 前回と同じ選択肢で次回も起動するように記憶させるには、 GRUB_DEFAULT=saved の設定が必要。 記憶対象となる menuentry には savedefault の1行を含める。 自動生成される選択肢に savedefault を付けたい場合は /etc/default/grub で GRUB_SAVEDEFAULT=true を設定する。 update-grub した後、生成された /boot/grub/grub.cfg 等を見て savedefault が入っていることを確認する。 /boot/grub/grubenv (事実上のテキストファイル)に 起動した選択肢の名前が記録される。 ・ cmap-adobe-japan1 cmap-adobe-japan2 gs-cjk-resource が消されるのは多分 poppler-data のおかげなので気にしない。 ・ procps top コマンドの rc ファイルの互換性がなくなった。 top を実行すると top: incompatible rcfile, you should delete '/home/USER/.toprc' と言われる。 ・ cyrus-sasl2, tmux, ca-certificates{,-java}, unixodbc あたりにも 変更点の注意事項があったが自分には関係なさそうだったので無視。 目ぼしいパッケージを入れたら drake# apt-get upgrade で残りのパッケージも更新。 samba, stunnel についての listchanges があった。 この時点で Gnome は 2 のまま。 /etc/debian_version は 7.1 になっていた。 一部の Gtk アプリケーションが warning を吐くようになったが、 最終的に dist-upgrade 完了時にはなくなっていた。 ◎ カーネルの更新と再起動 linux-image-amd64 を入れると 3.2 が入った。 再起動し、 grub メニューで 3.2 を選んでも無事に起動した。 2.6.32 だと Gnome が起動しなかった。 ibus での日本語入力ができなくなっていた(変換キーに対して何の反応もない)。 これは Gdm からログインする際に System default ではなく GNOME を選ぶと入力できるようになった。 また Gnome パネルのシステムメニューが変更されて一部の設定項目が消えていた。 ◎ dist-upgrade これ以上の更新には gnome-keyring がネックになっている。 libc6 を更新しようとすると libc6-dev や gcc などに影響し、 結果として gnome-keyring の更新を迫られる。 gnome-core が gnome-keyring に依存している。 こうなると gnome, xorg 関連パッケージも更新する必要があり、 大掛かりな更新となる。 xorg, python2.7, perl, texlive, gcc, libreoffice 等の大物を 一括で入れることになる。 apt-get dist-upgrade -s を見ると 70+ パッケージが削除となっていた。 削除見込みの一覧を見て、使っていない totem-coherence x-ttcidfont-conf xserver-xorg-video-nv vfdata-morisawa5 を手作業で削除した。 ptex-jisfonts を消すと okumura-clsfiles も一緒に消えた。 この時いくつかのパッケージが autoremove 可能になったので それも消しておいた(texlive-lang-cjk が提供する)。 残った削除対象パッケージは gcc 4.3, 4.4 関連 openoffice.org など で大きな問題はなさそうに思えたので drake# apt-get dist-upgrade -d でパッケージを取ってきて、覚悟を決めて drake# apt-get dist-upgrade を実行したところ E: Could not perform immediate configuration on 'default-jre'. Please see man 5 apt.conf under APT::Immediate-Configure for details. (2) と言われたので drake# apt-get dist-upgrade -o APT::Immediate-Configure=0 しばらく待つとたくさんの apt-listchanges が表示された。 実際のインストールには概ね1時間(人間の入力も含めて65分)かかった。 apt-listchanges 以外に数回人間の応答が必要な場面があった。 ○ 後始末 あと、 drake# apt-get autoremove --purge しておいた。 dpkg -l から dummy package を見つけて消しておいた。 ただし libgconf2-4:amd64 と module-init-tools は 消すと必要なパッケージまで巻き添えになるので注意。 そしてなぜか Gnome のパネルに要再起動の表示が出ていた。 シングルユーザモードに落としてからランレベル2に戻しても 表示は消えかったので素直に再起動しておいた。 この再起動の前に下のルートデバイスのパス名の対処をするべき。 /run というマウントポイント(tmpfs)ができていて、 /var/run, /var/lock はそこへのシンボリックリンクになっている。 / が rootfs としても(二重に)マウントされている。 /boot, /home などは /dev/sda1 のようなパス名だが / だけ /dev/disk/by-uuid/a16... としてマウントされていて df の出力がとても見づらい。 これは initramfs の問題らしい。 を参考にして initramfs を再作成した(要再起動)。 ※ /etc/default/grub で GRUB_DISABLE_LINUX_UUID=true を設定して update-grub すれば カーネルのコマンド行に UUID が渡されなくなるので UUID 指定なしで問題ないならこれだけで済んだもしれない。 ◎ Gnome3 との格闘 Gdm からシステムデフォルトでログインすると まともに Gnome が使えない状態となった。 これは ~/.xsession が 使われるせいに思える。 ~/.xsession を消すと、デフォルトでログインしても Gnome 3 が起動した。 ○ 操作 Gnome 3 は 2 と大幅に異なる操作体系になっていた。 従来の(上部)パネルのメニューが無くなっている。 ・オーバービュー 上部パネル左の「アクティビティ」をクリックすると ウインドウ操作用の画面(オーバービュー)に切り替わる。 その時に出現する「アプリケーション」メニューをクリックすると メニューに切り替わる。 左上隅にマウスポインタを移動するか 左 System (Super/Windows)キーを押すことでもオーバービューに切り替わる。 オーバービューの右側に出るのがワークスペース。 これを操作することでワークスペースを扱える。 また左上にウインドウ/アプリケーションの選択肢が出る。 アプリケーションをクリックするとアプリケーションのメニューが現れる。 ・ダッシュ オーバービュー中のメニューの各項目は左側のダッシュ(ボード)に追加できる。 起動中のアプリケーションのアイコンを左クリックしても新規には起動しない。 中クリックだと別のワークスペースに起動する。 ・その他 DBus での通知(notify-send 等)の表示時間が固定値になっている。 無指定なら期限なしだが、指定すると時間に関係なく5秒程度でポップダウンする。 ポップダウンしても通知メッセージは残っていて、 ポインタを画面右下隅に持って行くと、通知の一覧が得られる。 アイコンが並ぶのでクリックすればメッセージを確認できる。 タイムアウトに関係なく個別に消す必要がある。 右クリックのメニューの「開く」「削除」どちらを選んでも削除される。 ○ 設定 右上のアカウント情報をクリックするとシステム設定のメニューが現れるので 選んで設定する。 ・地域と言語 ~/.dmrc を見ないようなので、言語は新たに指定する。 ・キーボード ショートカットキーはここで設定する。 システム設定では余り融通がきかない。 コマンド行から gnome-tweak-tool を起動していくつか設定を更新した。 ウインドウのタイトルバーの扱いなどはここで設定した。 GNOME Shell 拡張の Alternative Status Menu 拡張機能 Applications Menu 拡張機能 を On に指定した。 Alternative Status Menu 拡張を使うと ログアウトのメニューにハイバネートが追加された。 Applications Menu 拡張機能は、パネルに Gnome メニューを追加する。 そのメニューの「システムツール」から 高度な設定(gnome-tweak-tool)、設定エディター(gconf-editor)、 メインメニュー(alacarte), dconf Editor などが選べた(システムメニューと統合なので古いメニューに依存するはず)。 メニューの項目は ~/.local/share/applications/ に配置される。 メニュー自体は ~/.config/menus/gnome-applications.menu ハイバネートから復帰するとパスワードを聞かれるという障害に遭遇した。 dconf Editor を起動して org.gnome.desktop.lockdown の disable-lock-screen にチェックを入れてみた。 これで右上クリックで出るメニューから「画面のロック」の選択肢が消えた。 「画面の明るさとロック」でもロックを指定できなくなった。 実際に設定変更の効果が現れるには 一旦 Gnome セッションを終わる必要があるかも。 dconf editor を起動する代わりにコマンド行でも指定できた。 drake% gsettings set org.gnome.desktop.lockdown disable-lock-screen true 設定エディター(gconf-editor)の /desktop/gnome/lockdown/disable_lock_screen も true にしておいた。 ウインドウが上部パネルに接すると勝手に最大化される苦悩は、 drake% gsettings set org.gnome.shell.overrides edge-tiling false で解消できた。 副作用の予感もする。 ○ 問題 ワークスペースを切り替えた直後だと ibus で gnome-terminal に入力できない (mozc, anthy どちらでも切り替えキーを押しても切り替わらないことが多い) という問題に遭遇した。 一旦別のタブに切り替えると使えるようになる。 新たに gnome-terminal を起動すると解消した。 1ヶ月ほど続けて使っているとウインドウのフォーカス切り替えが遅くなる。 CPU 負荷等は増えていないようだが切り替えに1,2秒かかるようになる。 これは gnome-shell の問題のよう。 Alt-F2 で r コマンドを実行すると gnome-shell が再初期化されるようで、フォーカス切り替えが速くなった (プロセスはそのままなので再起動はしていないと思う)。 ◎ GUI以外の設定 ○ TeX 日本語に関しては texlive-lang-cjk パッケージを入れておけばよさそう。 TeX の処理中に呼び出しを許可する外部コマンドに bibtexu pbibtex upbibtex biber mendex texindy pmpost epspdf extractbb あたりを追加するように世間で推奨されている。 これらのコマンドを使う場合は、 /usr/share/texmf/web2c/texmf.cnf の shell_escape_commands 変数に追加設定すればよいらしい。 ○ pdumpfs pdumpfs は ruby1.9 では動かなかった(require 'ftools' が失敗する)。 ruby1.8 パッケージを入れて、明示的に ruby1.8 /usr/bin/pdumpfs のように起動するなどの対処が必要。 スクリプトを修正するなら多分 ftools の代わりに fileutils を require し、 File.xxx? を FileTest.xxx? で(xxx は exist, directory, symlink, readable など)、 File.mkpath を FileUtils.mkpath で置き換える。 ○ iceweasal 3.5 から一気に 17.0 に上がった。 クッキーを引き継がないようだったので手動で入れなおした。 % sqlite3 ~/.mozilla/firefox/*.default/cookies.sqlite を更新前のバックアップと比べると moz_cookies 表の形式が変更されていた。 baseDomain (TEXT), creationTime (INTEGER) というカラムが追加され、 name, host, path の組に対して一意制約が追加されていた。 バックアップの DB を CSV に変換して perl で加工して新しい DB に流し込んだ。 ・CSV ファイル(cookies.csv)の生成 sqlite> .mode csv sqlite> .output cookies.csv sqlite> select * from moz_cookies; ・新レコード用SQL(1件分) baseDomain は host 冒頭の . を除いた値を使い、 creationTime も適当にでっち上げた。 一意制約確保のために DELETE 文を入れた(つまり重複レコードはあと勝ち)。 エスケープが必要そうな妙な値は捨てた。 レコードは全部消すことにして id は1から振り直した。 DELETE FROM "moz_cookies" WHERE name="Name" AND host=".example.com" AND path="/"; INSERT INTO "moz_cookies" VALUES(6, 'example.com', 'name', 'cookie-value', '.example.com', '/', 1648883898, 1370643323328401, 1370643323328401, 0, 0); ・全レコード削除と SQL ファイル(cookies.sql)の取り込み sqlite> DELETE FROM moz_cookies; sqlite> .read cookies.sql ただ、復旧しても iceweasal 実行中に消されることも多い。 一意制約に違反するなど何らかの問題があると cookies.sqlite ごと消される感じ。 必要なクッキーだけを移行することで消される頻度は減らせた。 特定のサイトにアクセスすると消されるようで、 削除の契機になったサイトのクッキーを眺めたところ、 baseDomain が host よりも広いレコードで問題が生じるよう。 後から調べれば select * from moz_cookies where not ('.' || baseDomain = host); に該当するレコードが考慮の対象 バックアップを取っておいて消えていれば復旧するなどの対処療法で運用。 cookies.sqlite.bak, cookies.sqlite.bak-rebuild というファイルが 残されていたりする。 *-rebuild はスキーマのみで空っぽ? moz_cookies 表にレコードが残っている場合は .restore で読み直すだけで復旧できるかもしれない。 ○ 32ビット環境の用意 ・Multiarch Multiarch 対応ということで、 ia32-libs などのパッケージが 移行用パッケージに変わっている。 実行可能ファイルは複数アーキテクチャを同時にインストールはできないが ライブラリやヘッダファイルはアーキテクチャ毎にサブディレクトリを設けて インストールされ、共存する様子。 それを使うダイナミックリンカーやコンパイラーにも手が入っているのか。 実行可能ファイルも共存できるようにするには プログラム中に埋め込まれたパスなどにも手を入れる必要があるだろう。 i386 アーキテクチャも使えるようにするため、 drake# dpkg --add-architecture i386 動かしたい 32 ビット版実行形式に必要なライブラリを ldd で調べ、 drake# apt-get install libgtk2.0-0:i386 のように :i386 をつけてインストールする。 旧 ia32-libs と同じライブラリがある場合、 multiarch でインストールしたライブラリを優先して使うようだ。 古い gflashplayer (32 ビット版)を動かしたところ、 Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text() というメッセージが出て日本語の文字が化けていた。 実行中に libasound_module_conf_pulse.so が開けないという警告も出たので libasound2-plugins:i386 を入れたらその警告は出なくなったものの 却って音が出なくなった(たまに出る)。 それに mmap() failed: Cannot allocate memory というメッセージも大量に出る。 他には特段問題はなく動かせた。 この状況で apt-get remove ia32-libs したところ、 ia32-libs-gtk-i386(:i386) というパッケージがインストールされ、 その道連れに他のライブラリ類(:i386)が大量にインストールされた。 ※ 個別に i386 用パッケージをインストールしなくても ia32-libs{,-gtk} パッケージを更新するだけで ia32-libs* の置き換えは済んだ可能性が高い。 ia32-libs*-i386 パッケージは :i386 をつけずにインストールできた。 複数アーキテクチャのパッケージが入っていると dpkg コマンドなどで一々 :amd64 をつける必要が合ったりする。 drake% dpkg -s libc6 dpkg-query: error: --status needs a valid package name but 'libc6' is not: ambiguous package name 'libc6' with more than one installed instance . . . drake% dpkg -s libc6:amd64 Package: libc6 Status: install ok installed . . . ・schroot の更新 schroot の設定ファイルに変更が予定されている。 W: line 19 [deb32]: Deprecated key ‘script-config’ used I: This option will be removed in the future; please update your configuration と言われたので schroot.conf (5) を見て /etc/schroot/schroot.conf の19行目辺りを確認。 script-config=drake/config-32 という行に基づいて deb32/config から ../drake/config-32 へシンボリックリンクを作成し、 profile=deb32 に変更した(/config を付けず、ディレクトリ名だけを指定する)。 schroot を使って同じ i386 の gflashplayer を lenny 環境で動かすと何の問題もなく動作した。 ○ postgresql データの移行 postgresql-8.4 パッケージに追加して apt-get install postgresql で 9.1 版を入れた。 この時点で両版のサーバが動いている。 meld /etc/postgresql/?.? で新旧の設定を見比べた。 元々ほとんど手を加えていないし難しいことはしていないので、 ポート番号以外は特に編集すべき箇所が見当たらなかった。 drake# su - postgres drake$ umask 077 drake$ mkdir /var/tmp/pgup drake$ cd /var/tmp/pgup drake$ pg_dumpall >pg8.4.dump 200 KB もないデータなのでつつがなく終わる。 文字コードがデフォルトで UTF-8 になるようなので EUC-JP のダンプを UTF-8 に変換 drake$ nkf -w pg8.4.dump > oldpg-u8.dump 新しいサーバーはポート番号 5433 で動いているので drake$ psql -p 5433 でつなぐと、 psql (8.4.17, server 9.1.9) WARNING: psql version 8.4, server version 9.1. Some psql features might not work. という警告が出る。 /usr/lib/postgresql/9.1/bin/psql だとこの警告は出ないのでそれを使って drake$ /usr/lib/postgresql/9.1/bin/psql -p 5433 -f oldpg-u8.dump template1 で戻した。 ERROR: ライブラリ"/usr/lib/postgresql/8.4/lib/plpgsql.so"をロードできませんでした: /usr/lib/postgresql/8.4/lib/plpgsql.so: undefined symbol: pg_parse_string_token というようなメッセージがいくつか出た。 8.4 の psql でも同様だったし、文字コード変換しなくても同様だった。 深追いせずに放置。 /etc/postgresql/9.1/main/postgresql.conf の port = 5433 を 5432 に変更し、 drake# apt-get remove postgresql-client-8.4 で古いサーバー、クライアントを削除。 ポート番号 5432 で起動し直す。 drake# /etc/init.d/postgresql restart 古いデータはどうやって purge すべき? ◎ その他 ブリッジ制御の brctl コマンドが /usr/sbin から /sbin に昇格している。 ハイバネートから復帰する時間が大幅に短縮された気がする。 ◎ 問題 ○ restore のエラーメッセージ restore が restore: : ftruncate: Bad file descriptor という警告を吐くことがある。 verbose モードで restore し、この警告が出た前後のファイルについて 元のファイルと cmp で比較しても違いはなかった。 Debian 6 (squeeze) の dump なら出ない? ソースコードを見ると、 ファイル末尾にホールがあるファイルを ftruncate() で 本来の大きさにする処理があり、 それに失敗した時に出るようだが、詳細は不明。 実害はなさそうにも思える。 ○ NFSv4 ロックアップ NFS 上で bzr status を実行するとプロセスが(必ず)ハングアップする問題があった。 D (Uninterruptible sleep), D+ 状態に入り、 kill -KILL でも停止しない。 NFS サーバーから返事がないのかどうかは未確認。 しばらく経つとカーネルのログには ...:1764 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message とトレース情報が出る。 NFS のデバイス番号に対応する flush プロセスが 100% 近い CPU を使うようになる (spin lock?)。 少し調べたところ、 bzr status が .bzr/checkrout/dirstate を READ ロックする契機で発生するようだった。 /proc/locks を元に推測するとロック後、解除前の状態になっている。 ローカルの HDD 上では発生しない。 たちの悪いことに、この状態に陥ると 対象ファイルを lstat するだけでそのプロセスもハングアップしてしまう。 このため、現象を調査しようとすると次々とプロセスが巻き添えを食らう。 ファイルシステムのアンマウントもできない。 そのまま放置していてもファイルに関係しない部分は特に問題なく使える。 カーネルを 2.6 や 3.9 に変更しても同じ現象だった。 NFS サーバー側の情報もログも不明だが、NFSv4 でマウントしていたので NFSv3 を使うようにマウントオプション(nfsver=3)を変更すると発生しなくなった。