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

なのでコンテナを一度停止してから再度稼働させるとデフォルトゲートウェイが設定されておらずハマった、という…。

Replaced Wi-Fi router

今まで使っていた無線LANルータが、最近頻繁に電源を入れなおさないと使えなくなることが増えたので、年明けに無線LANルータを買い替えました。買い替えたのは、NECの PA-WG1800HP/E です。以前は一台を家の中心にある和室に置いていたのですが、玄関側の部屋では電波が弱いこともあり、今回は2台購入し、両方共ブリッジモードで使うことにしました。

一台は玄関近くの洋室に縦置きに、もう一台はベランダ側のリビングに設置することにしたのですが、困ったのはリビング側。洋室の方はチャイルドゲートのおかげで娘が自由に行き来できないのですが、リビングだと確実にいたずらします。前の無線LANルータも娘のいたずらのせいでアンテナがもげてしまいました。なので購入時点で壁掛け設置にしようと決めていたのですが、購入して商品が届いてから気づいた失敗はこれ。

../../../_images/wifi0.png

自分でネジを用意しないとアカン、ということです。購入してからレビュー見てみたら、やはり同じように困っている人がいました。(持ち家ですが)壁に穴を開けるのは嫌なので、この説明書の写真を持って、ららぽーと横浜の東急ハンズで相談し、この ネジ

../../../_images/wifi1.png

と板を購入しました。推奨のネジとはちょっと形状が違いますが、これでも用は足りています。推奨ネジは大型店(新宿、渋谷など)しか置いていないようです。

次に悩んだのが設置場所。リビングには時計やカレンダーを掛けることのできるレールが元々設置されているので、それに掛けようかと思っていたら問題になったのは電源コードの長さ。天井近くから吊るすには電源コードは短すぎる上、このレールに引っ掛けたとしても電源コードと電源アダプター自体を娘が手の届かない家具の裏などに配置できない状態でした。

そこで、レールよりも少し下の位置にあり、ちょうど真下が家具になっている、和室用のエアコン用のダクトを利用することにしました。リビングのエアコンは大型のを設置していたこともあり、和室にはエアコンは必要なかったのでダクト自体は入居時のまま蓋をしていたのでした。

で、設置した結果がこんな感じです。

../../../_images/wifi2.png

正面

../../../_images/wifi3.png

ダクトにフックを通し、それを和室側に引っ掛け、

../../../_images/wifi6.png

Wi-Fiルータ自体はフックから針金で吊るし、針金はコードカバーをすることで目立たないようになりました。

../../../_images/wifi4.png

全体がこんな感じです。下に垂らしているのが電源コードですが、この下に家具があり、このコードと電源アダプターは娘の手には届かないという塩梅。ルータの右側にあるネズミのカレンダーが吊るしてあるのが前述のレールですね。

../../../_images/wifi5.png

How to create a Debian package of support to sysvinit, upstart, systemd

最近、サイボウズラボさんが開発した、yrmcdsというmemcached互換のKVSをDebianパッケージにして、main入りしました。 1 いつもパッケージスポンサーをお願いしている 岩松さん 、upstreamの 山本さん のご協力のおかげです。 特に問題なければ、Ubuntuの次のLTSにも取り込まれるのではないかと思います。 お二人には、この場を借りてお礼申し上げます。

Python以外で、また、デーモンのパッケージ化は今回初めて行いました。 2 sysvinitだけでなく、upstart, systemd対応も行ったので、デーモンのDebianパッケージを作成する場合のsysvinit, upstart, systemd対応の方法についてメモを残します。

sysvinit対応

sysvinitの対応は、dh_makeコマンドで生成されるテンプレートのdebian/init.dを使います。シングルバイナリパッケージの場合、ファイル名はdebian/init.dのままでも良いのですが、マルチバイナリパッケージの場合には、バイナリパッケージの名前をprefixにつけて、debian/<パッケージ名>.initのように変更します。yrmcdsのinit.dは sources.debian.net の次のURLで確認できます。 3

http://sources.debian.net/src/yrmcds/1.0.3-4/debian/yrmcds.init

check_for_upstart関数を定義し、/lib/lsb/init-functionsで定義されているinit_is_upstart関数を使って、upstartを使っている場合は、このスクリプト(つまり/etc/init.d/yrmcds)が実行されないようにしています。

upstart対応

upstartはテンプレートがありません。ファイル名は、debian/<パッケージ名>.upstartとして、upstart scriptを用意します。yrmcdsの場合、upstream側でetc/upstartが用意されています。upstreamのupstart scriptは、keepalivedの制御が入っていますが、Debianパッケージとしてはkeepalivedに依存するわけではないので、この部分はコメントアウトして、 debian/yrmcds.upstart としました。

systemd対応

systemdの場合は、debhelperのadd onとして、dh-systemdが用意されています。 ですので、まず、 debian/control のBuild-Dependsに、dh-systemdを追記します。

Build-Depends: debhelper (>= 8.0.0), (snip), dh-systemd (>= 1.5), (snip)

次に、 debian/rules の%ターゲットのdhコマンドのオプションとして、systemdを追記します。

%:
     dh $@ --with quilt,systemd

systemd用の設定ファイルは、upstartと同様テンプレートは用意されていません。debian/<パッケージ名>.serviceとして用意します。debian/yrmcds.service として作成します。

上記のみで、あとはdh-systemdが良きように設定してくれるのですが、これだけではpurge(apt-get purge)の時に残骸が残ります。 ですので、 postrm で下記のファイルを削除します。

  • /etc/systemd/system/yrmcds.service

  • /etc/systemd/system/multi-user.target.wants/yrmcds.service

  • /var/lib/systemd/deb-systemd-helper-enabled/yrmcds.service.dsh-also

  • /var/lib/systemd/deb-systemd-helper-enabled/multi-user.target.wants/yrmcds.service

  • /var/lib/systemd/deb-systemd-helper-masked/yrmcds.service

initの切替

debuildして作成したパッケージは、最小構成で作っておいたSidのVMを使ってテストを行います。パッケージ側ではsysvinit, upstart, systemdの切替の際に特に設定をすることはありません。 Debianはデフォルトではsysvinitになっているので、sysvinitからの切替が必要になります。upstartの場合は、upstartパッケージをインストールするだけで、sysvinitから自動的に切り替わります。 一方、systemdの場合は、systemdパッケージをインストールするだけでは、切り替わりません。今はブートローダーにGRUBを使っていることがほとんどだと思いますが、/etc/default/grubの GRUB_CMDLINE_LINUX_DEFAULTinit=/lib/systemd/systemd を追記し、 update-grub を実行する必要があります。 4

Footnotes

1

2014/01/30現在のバージョンは 1.0.3-4 で、対応アーキテクチャは、linux-anyです。

2

某所のローカルアーカイブ用には、FlaskやDjangoアプリ用にsysvinit対応のパッケージは作成していましたが、公式パッケージとしては初めてです。

3

現状ではテンプレートの不要な処理をコメントアウトしただけの箇所が多いので、次のアップデートの時に削除する予定です。

4

https://wiki.debian.org/systemd#Issue_.231:_sysvinit_vs._systemd-sysv

Upgrade OS X 10.7 Lion to 10.9 Maveicks

The model of my MacBook Pro is 15-inch, Early 2011. I am usually using Debian GNU/Linux Sid on VirtualBox for OS X with full screen. The virtualBox-guest-{dkms,utils,x11} packages were upgraded 4.2.16 to 4.3.2 at last December. So I tried to OS X as host OS of VirtualBox.

  1. Upgraded VirtualBox for OS X 4.2.16 to 4.3.2.

  2. Upgraded virtualbox-guest-* packages of Sid, and rebuild virtualbox-guest-dkms.

  3. Exported virtual appliance of Sid to NAS 1.

  4. Upgraded OS X Lion to Maverikcs.

I was worried about the following link, but there has not yet been occured troubles my MacBook Pro now.

http://veadardiary.blog29.fc2.com/blog-entry-4884.html

Footnotes

1

Firstly, I tried to backup with the Time Machine, but I gave up because this method was very very slow.

Review the 2013 and aspiration of the 2014

娘の寝かしつけが終わり、あと30分で2013年も終わりのところで振り返りをしてみました。が、やはり書き終わらなかったので、今回も2013年の振り返りと2014年の抱負として書きました。

当初、「健康第一」を2013年の抱負としていました(A happy new year 2013) が、2013年を振り返ってみると、結局、私の体調が年中通して良くなかった一年でした。また3月に父が亡くなったのが、昨年一番大きな出来事でした。(My father was passed away)

昨年の主なトピック

時系列で追ってみてわかったのですが、家庭、仕事、Debian、どれかが原因、ではなく、いろいろな事象が自分の体調に影響していました。

  • 2月

    • 新データセンターをリリース

      • 2012年11月からこの頃まで大体終電続き

    • 父の見舞いに、金曜の晩に職場から、あるいは週末に実家に帰っていた

    • 右足に痛みが出始める

  • 3月

    • 父他界

      • 父の葬儀後、働いていた方が気が休まると思い、そのまま仕事再開

      • この時にリフレッシュ休暇を取っておけば違っていたのかもしれない

    • 8月ごろまで法事で父の実家の神戸に行ったり、最近も遺産相続手続きで実家にちょくちょく帰ったり

  • 4月

    • 接骨院に通い始める

      • 歩き方が原因だったらしく、その後、右足の痛みは治った

    • しかし、その後の体調不良が重なったり、娘を抱っこした際に腰痛になったりして10月まで通う

  • 5月

    • 上部消化管内視鏡検査で、逆流性食道炎が見つかる

      • 胸のあたりに違和感があったので検査をしてもらったところ逆流性食道炎になっていた

      • 投薬治療始める

    • 妻、別件で通院始める

  • 6月

    • 大統一Debian勉強会2013開催

      • 二回目の開催。スタッフとして再度参加

      • スポンサー募集も行ったので、お金の管理が必要ということで会計を担当

      • 運営内部では結構いろいろあった

  • 7月

    • 仕事でGrizzly版のKeyStoneの検証と、要件に合わせた修正(=魔改造)を始める

      • これも後述の体調不良のストレスの要因の一つだったのだろう

  • 8月

    • 黒色の便が出始める

      • 二回目の上部消化管内視鏡検査を行うも、異常見つからず

      • 逆流性食道炎は快癒

    • 娘と外で遊んでいるときに、肘内障にさせてしまう

    • Django関係など、仕事で使うソフトウェアのDebianパッケージのメンテナンス始める

      • それまでは仕事よりも、プライベートでの用途が主な動機

      • Django REST framework を仕事メインで使い始めたのがきっかけ

      • 自分で作ったツール (backup2swift, swiftsc)もDebianパッケージに。

  • 9月

    • 大腸内視鏡検査

      • この頃、下痢も伴ったので、実際には黒ではなく、黒緑色だったことが判明

      • 念の為の検査であったのでやはり異常見つからず

    • 仕事では、KeyStoneの修正(魔改造)プロジェクトを断念

  • 10月

    • 新チーム体制でプロジェクトをリセット

    • ピタッと便の異常止まる

      • その後、家庭の事情のストレスなどがあった時に再発したので、ストレスが原因であったことが判明

    • 娘が二回目の肘内障

  • 11月

    • 娘が熱痙攣を起こし、救急外来に

      • 初めての経験でかなり大変だった

    • 娘が三回目の肘内障

  • 12月

    • 諸事情により、自動車を買い換え

    • 妻が食事、トイレ、風呂以外安静にしなくてはいけなくなり、兼業主夫を再開&母親代わりの一人三役生活を始める

    • 娘が風邪を引き、それを自分も伝染ってしまったため、妻を自宅に置いて、娘と二人で実家に一週間疎開

総括

2013年は娘の生まれた2012年以上にいろいろありすぎたこと、また自分で思っているよりもしっかり休みを取らないと体調を崩すようになったのを実感した年でした。ストレス要因で体調悪化していただけでなく、年末に風邪をひいて体調崩したのも、結局は自分では大丈夫だ、と思って一人三役を頑張り過ぎた結果によるものでした。

新年を迎えて

今年の抱負は、昨年の達成できなかった「健康第一」としました。また昨年の反省から「休むときにしっかり休む」「人に頼る」「無理をしない」を念頭に置きたいと思います。

諸事情により妻の状態については触れませんが、現在の一人三役の生活はまだ2,3ヶ月ほど続きます。妻の両親、実家の家族の協力や、職場の上司や同僚の理解を得られてはじめて成り立っています。大変感謝しております。

動きたくても動いてはいけない妻には娘や私の様子に心配をさせてしまい、娘には母親に甘えたくても甘えさせられず、さらに急に保育園に通わせるようになったり、妻の実家に数日預けたりと、突然の環境の変化に一番辛い目に合わせてしまっていますが、2,3ヶ月後に今の状態を無事に終えるようにすることが、目下の目標であり、夫、父親、家計の主としての責務です。

勉強会関係は、娘が産まれてから基本Debian関係しか参加していませんが、Debian勉強会への参加もおそらく4月以降でないと難しい状況です。今の状況が落ち着いたら勉強会への参加を再開したいと思っています。また、Debianパッケージのメンテナンスももう一歩ステップアップしたいと考えています。

ブログは一昨年から勉強を兼ねて英語で書くようにしていますが、今年も継続しようと思っています。が、新年最初のエントリーは年末のDebian/Ubuntu Advent Calendar 2013の流れでそのまま日本語にしてしまいました。

プログラミングは専らPythonで時間取れたときにはそこそこやっていたのですが、最近はなかなか時間が作れなくなってしまい、めっきりです。

../../../_images/github-contributions-2013.png

昨年、 @miurahr さんから伺った朝の30分コードハックの習慣をつけようと思います。最近、ようやく起床から娘のトイレの世話、朝食の用意&片付け、洗濯、保育園への送りなどが、すこし要領よくできるようになってきたこともあるので。

各所、当面いろいろご迷惑をお掛けすると思いますが、どうぞよろしくお願いします。