Perlとかmemoとか日記とか。 このページをアンテナに追加 RSSフィード

2010-09-22

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を貰えるが、多分まずいので素直に。CentOSとGentooで設定ファイルと書式が違うので手で変換する。

[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とかも楽しそう。

2007-09-27

2.6.22-gentoo-r8でALSA更新。

*gentoo-sources-2.6.22-r8 (26 Sep 2007)

26 Sep 2007; Daniel Drake <dsd@gentoo.org>
+gentoo-sources-2.6.22-r8.ebuild:
Update to Linux 2.6.22.9, includes ALSA security fix. Add sound support
(HDA) on ThinkPad T61. usb-storage capacity fix for Nikon D200 camera.

T61って書いてあるけど、X61も同じなのでKernel添付ドライバのみで普通に音がなるように。

 Device Drivers  --->
  Sound  --->
   <*> Sound card support
       Advanced Linux Sound Architecture  --->
         <*>   OSS Mixer API
         <*>   OSS PCM (digital audio) API
         [*]   Support old ALSA API
         PCI devices  ---> 
           <*> Intel HD Audio

とかで。ちゃんと鳴った。emerge -C alsa-driverしてしばらくKernelのでやってみる。

2007-08-28

distccを入れたliveCD/USB作成してお手軽に分散コンパイル!

コンパイル遅いからなんとか速くしたい。distccで分散コンパイルすれば速くなるはず。だけど、それだけの為にまわりのPCにLinuxを入れるのも・・・。ってことで、distccを入れたliveCDを作ってみた。

コンパイルだけしてくれればいいので、なるべくコンパクトなものをベースにしたい。Gentooのinstall-x86-minimal-2007.0-r1.isoが58MBとかなりコンパクトなのでこれをベースに使う。emergeが便利なので作業もGentooLinux上で。

$ cd /tmp
  // 適当なmirrorからISOを落とす
$ wget ftp://ftp.ecc.u-tokyo.ac.jp/GENTOO/releases/x86/2007.0/installcd/install-x86-minimal-2007.0-r1.iso
# mount -t iso9660 -o loop /tmp/install-x86-minimal-2007.0-r1.iso /mnt/cdrom
# ls -lh /mnt/cdrom/
合計 51M
-rw-r--r-- 1 root    root   22K 2007-05-08 05:24 Getting_Online.txt
-rw-r--r-- 1 root    root  6.1K 2007-05-08 05:24 README.txt
-rw-r--r-- 1 root    root  6.7M 2007-05-08 05:26 gentoo.efimg
-rwx------ 1 root    root   44M 2007-05-08 05:26 image.squashfs
drwxr-xr-x 2 hideden users 4.0K 2007-05-08 05:24 isolinux
-rw-r--r-- 1 root    root     0 2007-05-08 05:24 livecd

image.squashfsがrootfs。これをカスタマイズするためにまず解凍する。

  // squashfsを作成・解凍するツールをinstall
# emerge squashfs-tools
# cp /mnt/cdrom/image.squashfs /tmp/
# unsquashfs -d /tmp/squashfs-root image.squashfs
# du -h --max-depth 1
 123M    ./squashfs-root

解凍できた。install-minimalにはgcc等のツールが無いので、導入する。ROOTでsquashfsを展開したディレクトリを指定し、そこ以下にInstallされるようにする。CFLAGSやUSEは妙なのが入らないようにまっさらに。(適当)

# CFLAGS="-O2 -pipe" CXXFLAGS="${CFLAGS}" USE="-*" ROOT=/tmp/squashfs-root/ \
   emerge --oneshot --nodeps gcc gcc-config binutils distcc
 // コンパイル終わるまで1〜2時間放置。

 // distcc自動起動設定
# chroot /tmp/squashfs-root/ /bin/bash
# adduser -u 240 -g 2 -d /dev/null -s /bin/false distcc
# rc-update add distccd default
# nano /etc/conf.d/distccd
  DISTCCD_OPTS="${DISTCCD_OPTS} --allow 0.0.0.0/0"
  // どこからでも接続を許可する設定

# exit
  // chroot環境から抜ける

追加をimage.squashfsに反映する。

# mksquashfs /tmp/squashfs-root/ /tmp/image.squashfs -noappend

これで完成。image.squashfsを置き換えてISOを生成すればいいはず。

  // mkisofsをinstall
# emerge cdrtools

# mkdir /tmp/cdrom
# cp -ar /mnt/cdrom/* /tmp/cdrom/
# cp image.squashfs /tmp/cdrom/
# cd /tmp/cdrom
# mkisofs -v -r -J -o ../distcc_livecd.iso -b isolinux/isolinux.bin \
 -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 \
 -boot-info-table .

できたISOは76MB。コンパクトで素敵。CDRに焼いて起動。

boot: gentoo-nofb docache

って感じで起動すればdistccも自動起動。DHCPだったらそのままifconfigでIP調べる。docacheは起動後CD-ROMにアクセスしなくてもいいようにメモリ上にキャッシュするためにつけておく。メモリが256MB以下のPCの場合はメモリが不足する可能性があるので、CDROMうるさいし遅いけど我慢する。

でも、CDROMは何かとかさばるし邪魔。そもそも今回分散要員になるX60もX61もX41tもCD-ROMドライブが無い。なのでLiveUSBにする。

だが、install-minimalのinitrdはそのままだとLiveUSB化がうまく行かない。vfatでマウントする際に必要なNLSサポート用のドライバがカーネル組み込みではなくカーネルモジュールとして構築されているのに、initrdには入って無いのが原因。手動で入れる。

# mkdir /tmp/initrd
# cd /tmp/initrd

  // initrdを展開
# zcat /mnt/cdrom/isolinux/gentoo.igz | cpio -id

  // nlsをimage.squashfsの中からコピー
# cp -ar /tmp/squashfs-root/lib/modules/2.6.19-gentoo-r5/kernel/fs/nls lib/modules/2.6.19-gentoo-r5/kernel/fs/

  // moduleを自動で読み込むようにする
# nano etc/modules/fs
  nls_cp437
  nls_iso8859-1
    を末尾に追記

  // initrdを再生成
# find ./ | cpio -H newc -o > /tmp/initrd-new
# cd /tmp
# gzip initrd-new
# mv initrd-new.gz gentoo.igz

これでvfatでもマウントできるinitrdができた。あとはこれをsyslinuxで起動するように設定する。

USBメモリをWindowsPCにてFAT32でフォーマットし、syslinuxを入れる。USBメモリは128MBで十分。最近めちゃくちゃ安いからUSBメモリって素敵。

http://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-3.51.zip をダウンロードし、展開。Windows用バイナリはwin32以下にある。

C:\....> syslinux -ma X:  // X:はUSBメモリのドライブ名

syslinuxを導入したらUSBメモリにLiveCDの中身をコピーする。コピーするファイルは以下。

image.squashfs
livecd

gentoo
gentoo.igz
isolinux.cfg

下3つはisolinux配下にあるものをUSBメモリのrootに。isolinux.cfgは、syslinux.cfgにリネームする。

あとはBIOSでUSBメモリからbootすればOK。USBメモリによってうまくbootしない場合がある。fdiskで一度領域を切り直してformatしなおしたりするとうまく行く場合がある。ケースバイケースなのでその辺はgoogleで。


で、あとはこの作成したCD-ROMまたはUSBメモリを余ってるPC全部に突っ込んで起動。ifconfigでIPを調べておく。コンパイルしたいPCでもdistccdを起動し、

# distcc-config --set-hosts 192.168.0.AAA 192.168.0.BBB 192.168.0.CCC localhost

等と設定しておく。自分自身はソースの振り分けとかがあるので一番最後へ。先に指定した方が優先度が高いらしい。速いPC順でもいいかも。メインが遅いPCの場合はlocalhostを加えずにコンパイルは全部外に割り振る事もできる。MAKEOPTSで指定する同時コンパイル数は、CPU合計数 x 2 + 1くらいを指定するのが定石らしい。今回はCore2Duo x 2 + PenM x 1 だったので、5 x 2 + 1で-j11と指定した。

gentooのemerge場合はmake.confでFEATURES="distcc"と指定すれば自動でdistccを使用してくれる。便利。単発で使用したい場合は、

$ DISTCC_HOSTS="192.168.0.xxx 192.168.0.xxx localhost" make -j11 CC=distcc

とかやればいい。distccについてはそこら中で解説されてると思うのでこのくらいで。



imagemagickやglibcをコンパイルしてみた結果、普通にコンパイル出来た。distccではうまくコンパイルできない物もあるらしいので、失敗した場合は普通にコンパイルしてみるといいかも。そもそも、livecdに追加するパッケージがgcc gcc-config distcc binutilsの4つだけでいいのかどうかは不明。まぁ足りなくてエラー出たらまた後日足せば良いか。いまいちgccまわりには詳しくないので自信が無い。

今回作ったのはgcc-4.1.2。gccのバージョンが違うとコンパイル結果がおかしくなるらしいので、自分のgccバージョンに合わせたのを作成するといいかも。

作成したISOと、initrdはここ。

distcc_livecd.iso

gentoo.igz

もちろん無保証。

2007-07-30

2007-07-12

965GMでDRI続編(kernel-2.6.22)

10日にリリースされた2.6.22。落として解凍して放置ってたが、ちらっとさっき中身をのぞいてみたら、DRM関係のソースが新しくなってる。Kernelソースはgentoo-sourcesで。Gentooチームのパッチだったらごめん。とりあえずGentooな人は~x86キーワードで落とせばいいはず。

i915_dma.c:                    dev->pci_device == 0x2A02 || \
drm_pciids.h:   {0x8086, 0x2a02, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \

965GMのIDも入ってる!これで変な事しなくてもKernel側はOKかも。

xf86-video-intelも2.1.0が出たからそれも含めて週末にでもチェックしてみよう。

これでxf86-video-i810のebuildが出たらめんどくさい事無しでX61が使えるのになー。ま、そのうち出るだろう。