今年 2月から使っている Linode (VPS, 仮想サーバ) は、 月額 $19.95 の最小プラン Linode 360 だと RAM 360MB なので WordPress を動かす (Apache+PHP+MySQL) には若干足らない (稀に スラッシング 状態に陥って無反応になる)。 もちろん、 一つ上のプラン Linode 540 (RAM 540MB) にすればいいのであるが、 これだと月額 $29.95 でちょっと高い (私の感覚だと月額 $20 あたりに心理的な壁がある)。
prgmr.com ならば、 RAM 512MB, ディスク 12GB が月額 $12 (年一括払いなら $115.2) で済むので乗り換えてみた。 Linode のようなユーザフレンドリーな Web ユーザインタフェースは無いし、 時々新規申込みの受付を中止したりする (今も RAM 1024MB 以上のプランは受付けていない) が、 逆に言えば Web インタフェースが不要な人 (含む私) にとっては prgmr.com のシンプルさがむしろ望ましく、 レスキュー用のブートイメージなど必要最低限のものは揃っているので、 不便と感じることはない。 また、 いったん申込みが完了してしまえば受付の一時停止は関係ないわけで、 むしろサーバリソースに見合ったユーザ数しか受付けない姿勢は好感が持てる。
Web から Signup すると、 以下のようなメールが届く。
you ordered a xen vps, 512MiB ram, 12GiB Disk 80 GiB transfer Xen VPS, $12/month username sengoku Before I can set you up, I need to know what distro you would like and an OpenSSH format public key (on a *NIX, run ssh-keygen and send me either the id_dsa.pub or id_rsa.pub file in an attachment) on putty/windows, see http://www.unixwiz.net/techtips/putty-openssh.html#keypair and scroll down to the screen shot where it says 'openssh format public key for pasting into authorized_keys' - that is what I need. thanks.
OpenSSH の公開鍵くらい Web から登録させればいいのにと思いつつ、 「I need to know what distro you would like」 などと聞いてくるということは多少の融通は聞くのかと思い、 パーティションの切り方をついでにリクエストしてみた (6/4 15:46)。 つまり、 自分で作った Linux distro (配布していないから 「distribution」 と呼ぶのは正確性に欠けるのだが、 それなら何て呼んだらいいのだろう?) をインストールしたいから、 最小のパーティション (例えば 2GB) に ubuntu をインストールしておいてもらえるか? などとリクエストしてみた:
Hi, At Fri, 04 Jun 2010 05:48:05 +0000, support@prgmr.com wrote: > Before I can set you up, I need to know what distro you would like and > an OpenSSH format public key (on a *NIX, run ssh-keygen and send me > either the id_dsa.pub or id_rsa.pub file in an attachment) I'd like to use my own linux-based image that is running on fremont.gcd.org (linode) now. Is it possible to make two partitions (plus swap partition) ? One is for a normal ubuntu, and the other is for my own image. I'd like to switch these two OSs by pv-grub. Please minimize the ubuntu partition in order to maximize my own image. For example, 2GiB for ubuntu, 1GiB for swap, and 9GiB for me. I've attached my public key id_dsa.pub at the end of this mail. #9860. https://www.gcd.org/sengoku/ Hiroaki Sengoku <sengoku@gcd.org>
すると、 4日後の 6/8 09:03 に返事が来た。 リクエストはあっさり無視されて、 ディスク一杯に ubuntu をインストールした状態の VPS が提供されただけ。 個別対応しないのであれば、 自動化したほうがいいような。
Your vps is setup now, your host server is whetstone.prgmr.com. Login with your username and ssh key and follow the instructions at http://book.xen.prgmr.com/mediawiki/index.php/Quickstart For more information about repartitioning, see http://book.xen.prgmr.com/mediawiki/index.php/Repartition The default root password for the vps is password, and you should receive a bill soon by email. If you have any questions please email support@prgmr.com. Thanks very much. Nick Schmalenberger
言われた通り ssh でログインしてみる:
senri:/home/sengoku % ssh whetstone.prgmr.com The authenticity of host 'whetstone.prgmr.com (65.49.73.105)' can't be established. RSA key fingerprint is 97:52:07:d4:52:8d:c0:cc:13:c7:fb:5d:5d:1b:ab:b4. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'whetstone.prgmr.com,65.49.73.105' (RSA) to the list of known hosts. Name ID Mem VCPUs State Time(s) sengoku xxx 512 1 -b---- 11.5 Options for sengoku 1. console 2. create/start 3. shutdown 4. destroy/hard shutdown 5. reboot 6. swap i386/amd64 bootloaders (pvgrub) 7. exit press the number>
「6. swap i386/amd64 bootloaders (pvgrub)」 が目を引くが、 PV-GRUB は DomainU 側で実行されるので、 PV-GRUB にて 32bit/64bit の両方のカーネルを立ち上げることができず、 PV-GRUB を実行する前にどちらか一方に決めておく必要がある、 ということのようだ。 デフォルトは (残念なことに) 32bit になっていて、 セットアップしてもらった ubuntu も 32bit 版だった。
「1」 を入力して VPS のコンソールを表示させてみる:
press the number> 1 Ubuntu 10.04 LTS sengoku.xen.prgmr.com hvc0 sengoku.xen.prgmr.com login: root Password: Last login: Mon May 31 23:51:42 UTC 2010 on hvc0 Linux sengoku.xen.prgmr.com 2.6.32-22-generic-pae #33-Ubuntu SMP Wed Apr 28 14:57:29 UTC 2010 i686 GNU/Linux Ubuntu 10.04 LTS Welcome to Ubuntu! * Documentation: https://help.ubuntu.com/ root@sengoku:~# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/xvda1 11812024 1068124 10143876 10% / none 249488 136 249352 1% /dev none 253744 0 253744 0% /dev/shm none 253744 28 253716 1% /var/run none 253744 0 253744 0% /var/lock none 253744 0 253744 0% /lib/init/rw none 11812024 1068124 10143876 10% /var/lib/ureadahead/debugfs root@sengoku:~#
前掲のメールに書いてあった通り、 ユーザ 「root」 パスワード 「password」 でログインできた。 初めてログインしたのに 「Last login: Mon May 31 23:51:42 UTC 2010 on hvc0」 などと出ているが、 この ubuntu イメージを作ったとき試しに root でログインしたのが残ってしまったのだと思われる。 新規ユーザのセットアップのたびに、 5/31 に作ったイメージを使いまわしているのだろう。
ディスク 12GB のプランのはずなのに 1GB ほど足りないのは swap パーティションがあるから?と思い、 fdisk で確認してみる:
root@sengoku:~# fdisk -l /dev/xvda Disk /dev/xvda: 12.8 GB, 12884901888 bytes 255 heads, 63 sectors/track, 1566 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/xvda1 1 1494 12000523+ 83 Linux root@sengoku:~#
シリンダの最大値は 1566 なので、 72 (=1566-1494) シリンダが使われずに余っている。 試しにパーティションを割当ててみたら普通に使えた。
自前 distro 10GB, swap 1GB, ubuntu 1GB といった切り分けかたにするため、 レスキュー用のカーネル 「CentOS 5.5 rescue」 をブートしてみる:
GNU GRUB version 0.97 (65536K lower / 0K upper memory) +-------------------------------------------------------------------------+ | user bootloader configuration | | CentOS 5.5 rescue (2.6.18-194.3.1.el5xen) | | CentOS 5.5 installer | | NetBSD 5.0.2 installer | | Ubuntu 10.04 LTS installer | | | | | | | | | | | | | | | +-------------------------------------------------------------------------+ Use the ^ and v keys to select which entry is highlighted. Press enter to boot the selected OS, 'e' to edit the commands before booting, or 'c' for a command-line.
二行目の 「CentOS 5.5 rescue (2.6.18-194.3.1.el5xen)」 を選択してブート。 root でログイン (パスワードは無し) して fdisk を使ってパーティションを切り直した。 せっかくセットアップしてもらった Ubuntu も、 3分と使わずにお別れ。
CentOS release 5.5 (Final) Kernel 2.6.18-194.3.1.el5xen on an x86_64 sengoku.xen.prgmr.com login: root [root@sengoku ~]# ... [root@sengoku ~]# fdisk -l /dev/xvda Disk /dev/xvda: 12.8 GB, 12884901888 bytes 255 heads, 63 sectors/track, 1566 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/xvda1 1 1306 10490413+ 83 Linux /dev/xvda2 1307 1438 1060290 82 Linux swap / Solaris /dev/xvda3 1439 1566 1028160 83 Linux [root@sengoku ~]# mount /dev/xvda1 /mnt [root@sengoku ~]#
私は個人で管理している Linux マシン (自宅と職場と VPS 合わせて十数台, もちろん商用サービスを行なっているサーバではない) のディスクの内容を、 コマンド一発で同一に保てるようにしている (つまりマスタで変更/追加/削除したファイルを各マシンへコピー/各マシンで削除)。
もちろん、 各マシンの性能や 32bit/64bit などの CPU 種別、 ディスクの容量に応じて違う部分もあるわけで、 この同期コマンドは同期先の各マシンに合わせてコピーしないファイルのリストを生成した上で rsync を実行している。 なので、 新しくマシンを増やすときもマスタ上で同期コマンドを実行するだけで、 インストールが完了するはずだが...
senri.gcd.org:/ # mirror -v -r /mnt 'core64[sengoku.xen.prgmr.com]' BEGIN core64[sengoku.xen.prgmr.com] Tue Jun 8 13:59:14 JST 2010 type: core64 target: sengoku.xen.prgmr.com rsync --relative -a --numeric-ids --delete -v /bin /etc /lib /sbin /boot /lib64 /usr32 sengoku.xen.prgmr.com:/mnt/ bash: rsync: command not found rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: remote command not found (code 127) at io.c(600) [sender=3.0.6] senri.gcd.org:/ #
ありゃ、レスキュー用のディスクには rsync がインストールされていないのか...
レスキュー用のディスクは (当然) 書き込みができないので、 rsync をインストールするのも (tmpfs をマウントすれば可能だが) 面倒。 そこで先に /dev/xvda3 パーティション (1GB) に ubuntu をインストールすることにする。 幸い /dev/xvdf で CentOS, Debian, Ubuntu, NetBSD それぞれのディスクを tar+gzip で固めたもの (tar ball) が提供されているので、 64bit 版 ubuntu と思われる ubuntu64.tar.gz を /dev/xvda3 へ展開:
[root@sengoku ~]# mkdir /tmp/xvdf [root@sengoku ~]# mount /dev/xvdf /tmp/xvdf mount: block device /dev/xvdf is write-protected, mounting read-only [root@sengoku ~]# ls -ln /tmp/xvdf total 1295052 -rw-r--r-- 1 500 500 242130294 May 17 18:10 centos32.tar.gz -rw-r--r-- 1 500 500 264319597 May 17 16:25 centos64.tar.gz -rw-r--r-- 1 0 0 184512292 Jun 3 23:30 debian32.tar.gz -rw-r--r-- 1 0 0 185773340 Jun 3 11:35 debian64.tar.gz drwx------ 2 0 0 16384 May 24 04:08 lost+found -rw-r--r-- 1 500 500 4999925 Feb 28 00:46 netbsd64.tar.gz -rw-r--r-- 1 0 0 219621325 Jun 3 11:30 ubuntu32.tar.gz -rw-r--r-- 1 0 0 223411583 Jun 3 11:30 ubuntu64.tar.gz [root@sengoku ~]# mkdir /tmp/xvda3 [root@sengoku ~]# mount /dev/xvda3 /tmp/xvda3 [root@sengoku ~]# tar xzf /tmp/xvdf/ubuntu64.tar.gz -C /tmp/xvda3 [root@sengoku ~]# vi /tmp/xvda3/boot/grub/menu.lst
この tar ball は /dev/xvda1 に展開することを想定しているらしく、 /boot/grub/menu.lst に (hd0,0) と書いてあるので全て (hd0,2) に置換。 /dev/xvda1 にも /boot/grub/menu.lst を置いて以下の行を追加し、 /dev/xvda3 の menu.lst も起動できるようにしておく。
title Ubuntu root (hd0,2) configfile /boot/grub/menu.lst
前述した 「swap i386/amd64 bootloaders (pvgrub)」 を選択して PV-GRUB を 64bit に切り替えておいて、 このインストールしたばかりの Ubuntu を立ち上げる。 そして前述した mirror コマンドをマスタで実行すれば、 /dev/xvda1 への自前 distro のインストールが完了する。
もちろん、 ホスト名などの設定ファイルや /etc/fstab など各マシンで固有のファイル、 /var/log, /tmp などのディレクトリは mirror コマンドではコピー対象外だが、 これらのファイルやディレクトリが存在しない場合は、 ブートスクリプトにおいて勝手に生成する仕掛けになっている。
Using a kernel.org kernel under xen に書かれているように、 Linux カーネルを Xen のゲスト OS として動かすには Paravirtualized guest support (CONFIG_PARAVIRT_GUEST) を有効にしておく必要がある。
また、xen_blkfront.ko (CONFIG_XEN_BLKDEV_FRONTEND) と xen_netfront.ko (CONFIG_XEN_NETDEV_FRONTEND) の両モジュールも必要。 もちろんカーネルに組み込んでおいてもいいが、 私は実サーバと仮想サーバの両方で同じカーネルを使いたいので、 モジュールにしている。
これで /dev/xvda1 からブートすれば、 使いなれた自前 distro 環境が立ち上がるはず...
root (hd0,0) Filesystem type is ext2fs, partition type 0x83 kernel /boot/linuz-2.6.31.13-x86_64 root=/dev/xvda1 initrd /boot/initz-2.6.31.13-x86_64 ERROR Invalid kernel: xc_dom_probe_bzimage_kernel unable to LZMA decompress kernel xc_dom_bzimageloader.c:393: panic: xc_dom_probe_bzimage_kernel unable to LZMA decompress kernel ERROR Invalid kernel: xc_dom_find_loader: no loader found xc_dom_core.c:517: panic: xc_dom_find_loader: no loader found xc_dom_parse_image returned -1 Error 9: Unknown boot failure Press any key to continue...
うっ、 LZMA 圧縮したカーネル (CONFIG_KERNEL_LZMA) には対応していないのか。 Linode の場合は非圧縮のカーネルのみブートできたのだが、 prgmr.com の場合は gzip 圧縮したカーネル (CONFIG_KERNEL_GZIP) のみブートできるようだ。 VPS ごとに起動できるカーネルの種類が異なっていて面倒。
gzip 圧縮したカーネル 「linuz-2.6.31.13-gz-x86_64」 を用意して再度挑戦:
root (hd0,0) Filesystem type is ext2fs, partition type 0x83 kernel /boot/linuz-2.6.31.13-gz-x86_64 root=/dev/xvda1 initrd /boot/initz-2.6.31.13-x86_64 close blk: backend at /local/domain/0/backend/vbd/xxx/51712 close blk: backend at /local/domain/0/backend/vbd/xxx/51776 close blk: backend at /local/domain/0/backend/vbd/xxx/51792 [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 2.6.31.13-x86_64 (sengoku@senri.gcd.org) (gcc version 4.3.4 (GCC) ) #1 SMP Tue Apr 13 17:48:44 JST 2010 [ 0.000000] Command line: root=/dev/xvda1 ... [ 0.003333] installing Xen timer for CPU 0 [ 0.003333] Calibrating delay loop (skipped), value calculated using timer frequency.. 4003.20 BogoMIPS (lpj=6669120) ... Welcome to Linux 2.6.31.13-x86_64. none.gcd.org login:
無事ブートした。
あとは Linode の時と同様に、 自宅サーバ gw.gcd.org との間にトンネルを設置したり、 gw.gcd.org 上の MySQL から VPS 上の MySQL に対してレプリケーションを行なうようにしたり、 MyDNS を動かしたり、 ns4.gcd.org を 65.49.73.116 へ向けたり、 等々...
最後に、 www.gcd.org の IP アドレスとして VPS の IP アドレス 65.49.73.116 を追加した。
すなわち、 いま読者の皆さんが読んでるこのページは、 1/2 の確率で prgmr.com の VPS が送信したページということになる。 すでに一週間近くこの状態を続けているが、 Linode 360 のときよりはメモリに余裕がある:
prgmr:/home/sengoku % free total used free shared buffers cached Mem: 534796 501456 33340 0 35568 114452 -/+ buffers/cache: 351436 183360 Swap: 1060280 556 1059724
つい昨日ですがlinode360というのは無くなりました。
http://blog.linode.com/2010/06/16/linode-turns-7-big-ram-increase/
Comment by 名無し — 2010年6月18日 @ 11:30
う、「乗り換えました」ブログを書いたその日に (お値段そのままで) RAM が 512MB になるとは… 驚きました。
Linode で借りている VPS を速攻で再起動したら、
無事 512MB になってます!
さて、Linode と prgmr のどちらを解約すべきか、迷うなぁ…
Comment by hiroaki_sengoku — 2010年6月18日 @ 15:42
Linode と prgmr のどちらをメインにすべきか迷っていたら、今日の昼ごろから prgmr がアクセスしにくくなりました。VPS 自体は正常に見えますが、prgmr のサーバがある EGIHosting 内部でトラブル(ルーティング異常?)が起きて通信が途絶したようです。
いま現在は復旧しているようですが、今日の午後 1時間以上の通信途絶が何度も起きていて、(prgmr に非は無いのかもしれませんが)こんな品質では prgmr をメインにするのは到底無理と判断し、Linode の年間契約(10%割引)を申し込みました(Support Ticket)。
そうしたら、わずか10分後に年間契約に切り替えたとの返事が返ってきました。驚いたことに、現在の月間契約の残りにも日割で10%割引が適用されていました。さすが Linode クオリティ。
Comment by hiroaki_sengoku — 2010年6月20日 @ 23:00