Upgraded Squeeze to Wheezy LXC host and containers

長らくSqueezeで動かしていた、さくらのVPSのLXCのホスト&コンテナをWheezyにアップグレードしたので、その時のメモです。

うちのLXCは、Lennyの時のユーザランド管理ツールが 0.6.5 頃から使っている (lxcを導入してみた。) 秘伝のタレみたいなやつ [1] なので、安定稼働して当たり前で、最近の事情はあまり知らないのですが、最近、LXC流行っているみたいですね。 [2]

今回の味付け変更のトピック

で秘伝のタレはDebianのバージョンアップのタイミングで味付けが変わるのですが、LennyからSqueezeの時はそんなに大きな違いはなかったのですが、今回のSqueezeからWheezyに変わったタイミングで、地味ですが一つ嬉しい変更がありました。 [3] それは、コンテナのconfigに、”lxc.network.ipv4.gateway”を追加すると、default gatewayが自動設定されるということです。 [4] これ、使い始めた当時(2009年ごろ)欲しかった機能の一つでした。 [5] 便利になったものですね。

今回のアップグレードのまとめ

では、今回やったアップグレードのメモを残しておきます。 テスト自体は、さくらのVPSで稼働中のVMイメージを、さくらのクラウドにアーカイブし、そのアーカイブからさくらのクラウドで起動し、そのイメージでアップグレードテストを行いました。

共通

  • apt-get update && apt-get upgrade後、apt lineを変更してapt-get upgrade && apt-get dist-upgrade
  • sysstatのデータは互換性がないので削除し、debconfの設定はメンテナバージョンを使用
  • /etc/sudoersはメンテナバージョンを使用し、普段管理用に使用しているユーザをあとでsudoグループに追加
  • /etc/logrotate.d/rsyslog は現状のままにしておき、あとで下記を変更
-               invoke-rc.d rsyslog reload > /dev/null
+               invoke-rc.d rsyslog rotate > /dev/null
  • /etc/rsyslog.conf も現状のままにし、あとで下記を変更
-*.emerg
+*.emerg                                :omusrmsg:*

ホスト

  • lxc が 0.7.2-1 から 0.8.0~rc1-8+deb7u2 にアップグレード
  • Squeezeではカーネルオプションを変更してビルドした Linux Kernel 2.6.39.4を使っていたので、パッケージのアップデート完了後、再起動前に linux-image-3.2.0-4-amd64 をインストールし、それをGRUB_DEFAULTで指定、update-grubを実行
  • ネットワーク関連の設定は、post-upでシェルスクリプトでブリッジの設定をやっていたのですが、それをやめ、interfacesを下記のように変更。
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug br0
iface br0 inet static
    bridge_ports eth0
    bridge_fd 0
    address 192.0.2.100
    netmask 255.255.255.0
    gateway 192.0.2.1

nginx用のコンテナ

  • /etc/logrotate.d/nginx をメンテナバージョンを使用するようにし、後ほど、rotate回数を 52から 365に変更
  • 他は無し

CouchDB用のコンテナ

  • CouchDBはもともと1.2.0-1のバックポートを使用していたので、アップグレードのタイミングで、backports.debian.orgのAPT lineをコメントアウトしただけ。
  • /etc/login.defsをメンテナバージョンを使用するように変更

redmine用のコンテナ

  • mysql

    • /etc/mysql/my.cnfはメンテナバージョンを使用
    • debconfでrootのパスワードは変更しない
  • dist-upgradeでpostfixのアップグレードが失敗したので、再度upgrade実行することで正常にアップグレード

  • RubyGemでインストールしたredmine 1.2.1が稼働しており、DBにはMySQLを使用していましたが、Wheezyにするとこれは動かなくなる。

    • なので、これをDebianパッケージ( 1.4.4+dfsg1-2+deb7u1 ) に変更

    • redmine, redmine-mysqlパッケージをインストール

      • debconfの設定ではredmine/instances/defaultのDBをdbconfig-commonで設定
      • DBにはmysqlを選択
      • 既存のredmine用の管理権限ユーザのパスワードを設定
    • これだけでは実はだめなので、インストール完了後に、dpkg-reconfigure -plow redmineを実行

      • 管理者名をrootからredmineに変更
      • DB名をredmine_defaultからredmineに変更
      • /opt/redmineが/opt/redmine-1.2.1へのsymlinkになっているので、これをDebianパッケージの/usr/share/redmineへのsymlinkに変更
      • apache2を再起動すればアップグレード完了

Rails用のコンテナ

  • Apacheの設定が変更になり、/etc/apache/httpd.confが削除されたため、/etc/apache/apache2.confの207行目のInclude httpd.confを削除
  • アップグレード時に/var/wwwのowner, groupが変更されてしまうため、Passenger用のowner, groupに変更する

余談

コンテナを止めずにホストのアップグレードをしてしまったので、稼働中のカーネルではlxcのwheezyのバージョンに対応しておらず、ホストのカーネル再起動のときにコンテナも一緒に(自動的に)停止する、ということになってしまったですが、ホスト再起動後、前述のlxc.network.ipv4.gatewayを設定していなかったのにも関わらず、コンテナを起動してもなぜかdefault gatewayが設定される、という現象が発生しました。 [6] アップグレード前に正常停止させなかったから停止前の状態が残っていたのかもしれません。

ちなみに、このブログの冒頭の話をFaebookに書いたら、ITエンジニアではない方から「宇宙語?」と突っ込まれたのが本日のトピックです。w

追記

アップグレード後に新たにコンテナを追加したら、

lxc.cap.drop = sys_module mac_admin mac_override sys_time

が追加されていたので、既存のコンテナにも追加しました。日本語でのCapability関連は tenforward さんの メモ が詳しいです。

Footnotes

[1]ちなみに、Lennyの時は当然さくらのVPSではありませんでしたが、さくらのVPSに移行するときには、Lennyで使っていたLXC関連の設定とコンテナのrootfsはそのままそっくり移行しました。
[2]というかDockerですかね。
[3]まぁ、今までと挙動が変わったでハマった原因でもあります。
[4]裏を返せば、秘伝のタレの我が家のコンテナは、/etc/network/interfacesにgateway設定していたのだから(ry
[5]当時は、debootstrapでrootfsを作ったあと、コンテナ起動前に/path/to/container/rootfs/etc/network/interfaces を変更する、ということをやっていた訳です。
[6]なのでコンテナを一度停止してから再度稼働させるとデフォルトゲートウェイが設定されておらずハマった、という…。