hideden.hatenablog.com

はてなぶろぐー。URLなげー。

Sakura VPS980のCentOSを再起動一回でGentooに変身させる方法

sakuraのVPS980がとっても快適ですばらしい。調子に乗って自宅サーバーを廃止しNASに置き換え、DNS/mailなんかはすべてVPSにした。部屋も静かで涼しくなって、しかもasahi-netの固定IPもろもろを解約したので月コストもだいぶ下がりいい事だらけ。

ただ、標準で入ってるCentOSが会社と同じでなんとなくつまらない。幸いなことにOS変えてる人がちらほら居る&勝手に変えても(多分)怒られないようなので、もう1インスタンス借りて実験的にGentooにしてみた。

調べてみたらgrub2経由でSystemRescueCdを起動してごにょごにょも出来るらしい。ただ、Web上のシリアルコンソール経由でやるのはちょっとしんどいのでSysRescCd経由はあきらめ、CentOSの中身をごそっと全部入れ替えてGentooにする方法を採用してみた。こういう行為をあまり悩まずに気軽に出来るようになったのはGentoo様のおかげですね。さすがドM仕様。

準備

とりあえず、ここから契約して、root passが書いてあるメール(多分2通目?)がくるまでおとなしく待つ。そのあと、管理画面からVPSを起動してSSH接続。このあと、しばらく新規でSSH接続が確立できなくなるので(理由は後述)、Terminalを2つ起動して念のため予備で2つ接続しとくといい。

つないだら、GentooのInstall用にあらかじめmirror一覧から日本のmirrorを選んでamd64のstage3とportageのsnapshotを/tmpに落としておく。ここでやっておかないとCentOS関連ファイル除去後には落とせなくなるので注意。

[root@wwwXXXXu /]# cd /tmp
[root@wwwXXXXu tmp]# wget http://ftp.iij.ad.jp/pub/linux/gentoo/releases/amd64/current-stage3/stage3-amd64-20100902.tar.bz2
[root@wwwXXXXu tmp]# wget http://ftp.iij.ad.jp/pub/linux/gentoo/snapshots/portage-latest.tar.bz2

CentOSのシステムを掃除する

とりあえず、初期状態のsakuraVPSのCentOSはこんな感じになってます。

[root@wwwXXXXu ~]# ls -F /
bin/   etc/   lib64/       misc/  proc/  selinux/  tmp/
boot/  home/  lost+found/  mnt/   root/  srv/      usr/
dev/   lib/   media/       opt/   sbin/  sys/      var/
[root@wwwXXXXu ~]# mount | grep /dev/hd
/dev/hda2 on / type ext3 (rw)
/dev/hda1 on /boot type ext3 (rw) 

ここから要らないもの(bin, etc, home, lib, lib64 ....など)をまずすべて削除!

・・・と行きたいところだが、いきなり削除するとmvコマンドなんかも使えなくなって詰む。なので、まずbusyboxで現在のCentOSから切り離した形で最低限のコマンド実行が出来るようにする。

busyboxの公式ページから最新版を/tmpなどに落としてstaticでmakeするだけ。busyboxのmenuconfigをするためにncursesのヘッダ類が必要なので、まずそれをyumで入れる。(どうせこの後消えるので細かい事は気にしなくてOK)

[root@wwwXXXXu tmp]# yum install ncurses-devel
[root@wwwXXXXu tmp]# wget http://busybox.net/downloads/busybox-1.17.2.tar.bz2
[root@wwwXXXXu tmp]# tar jxf busybox-1.17.2.tar.bz2
[root@wwwXXXXu tmp]# cd busybox-1.17.2
[root@wwwXXXXu busybox-1.17.2]# make menuconfig

busyboxのメニューが出たら、static linkでbuildするようにと、コンパイルエラーが出るのでiplink moduleのbuildをしない設定だけしてexit。

Busybox Settings  --->
    Build Options  --->
        [*] Build BusyBox as a static binary (no shared libs)

Networking Utilities  --->
    [ ]   Use ip applet (NEW)  ←チェックをはずす 
    [ ]   ip link              ←チェックをはずす

あとは make && make install でめでたくbusyboxを展開したディレクトリ直下の_installにsymlink集が出来上がるので、ここにPATHを通す。

[root@wwwXXXXu /]# export PATH=/tmp/busybox-1.17.2/_install/sbin:
/tmp/busybox-1.17.2/_install/bin:/tmp/busybox-1.17.2/_install/usr/sbin:
/tmp/busybox-1.17.2/_install/usr/bin:$PATH

これで主要なコマンドはCentOSのものではなく、busyboxが優先されるようになるはず。早速、CentOS除去作業を再開。とりあえずいきなり消すのも怖いので、/oldを作ってそこにすべてmvする。(bootは別partitionなので中身だけ移動する)

[root@wwwXXXXu /]# mkdir /old
[root@wwwXXXXu /]# mv bin etc home lib lib64 media misc mnt opt root sbin selinux srv usr var old/
[root@wwwXXXXu /]# mkdir /old/boot
[root@wwwXXXXu /]# mv /boot/* /old/boot/
[root@wwwXXXXu /]# ls -F
boot/       lost+found/ proc/       tmp/
dev/        old/        sys/

dev, lost+found, proc, sys, tmp(busyboxが入ってる) は除外。これでCentOSの痕跡は今起動してるkernelだけに。これ以降、新規でSSHコネクションは張れないので絶対にSSHを切断しないように注意する。切断しちゃった場合は・・・最初からやり直し。VPSって再インストール楽でほんといいね。

Gentooを入れる

ここから先はinstall-minimalで起動してからやるGentooのインストールとさほど変わらない。

stage3, portage-snapshotを入れる

あらかじめdownloadしておいたのを展開して/に移動する。その後、portage snapshotも展開。

[root@wwwXXXXu /]# mkdir /tmp/gentoo
[root@wwwXXXXu /]# cd /tmp/gentoo/
[root@wwwXXXXu gentoo]# tar jxpf ../stage3-amd64-20100902.tar.bz2
[root@wwwXXXXu gentoo]# ls
bin    dev    home   lib32  mnt    proc   sbin   tmp    var
boot   etc    lib    lib64  opt    root   sys    usr
[root@wwwXXXXu gentoo]# mv bin etc home lib lib32 lib64 mnt opt root sbin usr var /
[root@wwwXXXXu gentoo]# cd /usr
[root@wwwXXXXu usr]# tar jxf /tmp/portage-latest.tar.bz2

/devはそのままではCentOSのものがmountされていて書けない。mount -o bindで別のpathにbindしてからdevにコピーする。

[root@wwwXXXXu /]# mkdir /mnt/root
[root@wwwXXXXu /]# mount -o bind / /mnt/root
[root@wwwXXXXu /]# cp -a /tmp/gentoo/dev/* /mnt/root/dev/
[root@wwwXXXXu /]# umount /mnt/root

一時的に使ってたbusyboxとおさらばする。

[root@wwwXXXXu /]# source /etc/profile
[root@wwwXXXXu /]# env-update
[root@wwwXXXXu /]# rm -rf /tmp/busybox*

これでほぼ中身がGentooに。

各種設定をする

Gentooユーザーにとってはこの辺はいつもどおり。お約束な感じの設定をする。

### /etc/make.conf  (USEフラグとかお好みで)
CHOST="x86_64-pc-linux-gnu"
CFLAGS="-march=core2 -O2 -pipe"
CXXFLAGS="${CFLAGS}"

MAKEOPTS="-j3"
GENTOO_MIRRORS="http://ftp.iij.ad.jp/pub/linux/gentoo/"
SYNC="rsync://rsync.jp.gentoo.org/gentoo-portage"

USE="unicode cjk nls userlocales nptl nptlonly bash-completion emacs perl ruby pcre -samba mmx sse sse2 ssl zlib bzip2 jpeg png sqlite -ipv6 -kde -gtk -gnome -qt -qt3 -qt4 -X -xorg"
LINGUAS="ja"

ネットワークにつなげるようにするために、resolv.confはCentOSのものをコピる。zoneinfoもコピる。locale.genもいじりたければいじる。ついでに忘れないうちにrootのpasswordも設定しておく。

[root@wwwXXXXu /]# cp /old/etc/resolv.conf /etc/
[root@wwwXXXXu /]# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
cp: overwrite '/etc/localtime'? y
[root@wwwXXXXu /]# passwd
Changing password for root

で、emerge --syncの後、必要なもの(kernel, genkernel, grub, syslog, cron)あたりを入れる。kernelはとりあえず面倒なのでgenkernelで作る。

[root@wwwXXXXu /]# emerge --sync
[root@wwwXXXXu /]# emerge gentoo-sources genkernel grub syslog-ng vixie-cron
[root@wwwXXXXu /]# genkernel all    ←結構時間がかかる

VPSシリアルコンソールの設定、grubの設定、fstabの編集を行う。やらずに再起動しちゃうとこれまた最初からやり直しに。シリアルコンソールの設定はここのとおりにする。

### /boot/grub/grub.conf
default 0
timeout 5
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1    ←これ
terminal --timeout=10 serial console                            ←これ
hiddenmenu

title Gentoo Linux 2.6.34-r6
root (hd0,0)
kernel /kernel-genkernel-x86_64-2.6.34-gentoo-r6 root=/dev/ram0 real_root=/dev/hda2 console=tty0 console=ttyS0,115200n8r ←これ
initrd /initramfs-genkernel-x86_64-2.6.34-gentoo-r6


### /etc/inittab
co:12345:respawn:/sbin/agetty -h 115200 ttyS0 vt100  (最下行に追加)


### /etc/fstab
/dev/hda1               /boot           ext2            noauto,noatime  1 2
/dev/hda2               /               ext3            noatime         0 1
/dev/hda3               none            swap            sw              0 0
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0


### grubをinstall
[root@wwwXXXXu /]# grub-install --no-floppy /dev/hda

ネットワーク設定をCentOSからコピーする。DHCPにすると割り当てられたIPじゃないIPを貰えるが、多分まずいので素直に。CentOSGentooで設定ファイルと書式が違うので手で変換する。

[root@wwwXXXXu /]# cat /old/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
IPADDR=59.XXX.YYY.ZZZ
NETMASK=255.255.254.0
GATEWAY=59.XXX.YYY.1
ONBOOT=yes


###/etc/conf.d/net
config_eth0=( "59.XXX.YYY.ZZZ netmask 255.255.254.0 brd 59.XXX.YYY.255" )
routes_eth0=( "default via 59.XXX.YYY.1" )

udevとsshdとnet.eth0の起動設定をする。

[root@wwwXXXXu /]# rc-update add udev boot
 * udev added to runlevel boot
[root@wwwXXXXu /]# rc-update add net.eth0 boot
 * net.eth0 added to runlevel boot
[root@wwwXXXXu /]# rc-update add sshd default
 * sshd added to runlevel default

これで再起動する準備が整った・・・はず。勇気を出して再起動する。うまくいけばしばらくするとSSHが起動するはず。あとは/oldを削除すればGentooへの切り替え完了。

CPUが案外速くてかなり安いので、複数契約してdistccとかも楽しそう。