Gentoo Linuxでサーバを立てる

自宅のサーバをリプレイスすることにして鋭意作業中なので、その作業メモ。
基本的にはGentoo Linux x86ハンドブックを参照してインストールすればOKですが、俺用メモ的抜粋です。

動機

我が家に置いてある自宅サーバはうるさい、でかい、古いと三拍子揃っています。
2001年頃に建立以来、拡張を繰り返していて、ミドルタワーケースにPATAハードディスク5台という変態的な仕様になってしまっています。
途中、ケースと電源の交換が1回、メモリ拡張が1回、ルートドライブの交換は3回くらいやっているけど、マザーボードやCPUやメモリは建立当初から変わっていないので、もはや減価償却しきったというレベルではない。ちなみにCeleron 800MHz(Coppermine-128K)にメモリがPC100の512MBという、もう何世代前だかわからないような自作機。
OSは今でこそDebian 5.0(Lenny)がインストールされているけど、これが驚いたことに3.1(Sarge)がリリースされた直後にインストールして、その後2回dist-upgradeをして今に至っています。アップデートは定期的にしているものの、5年間でいろんなパッケージを入れたり削除したりしているので、いろんなゴミが蓄積されていることは想像できます。

ハード構成

CPUパワーを必要とするようなことはしないので、静音性や発熱の問題を考慮してAtomが本命。あとディスクはすっかりお安くなってしまったので、2TBのSATA。ケースは小さいキューブタイプでいいかな。ということで、

Mother Board: Asus AT5NM10-I
Memory: Pulsar DCSSDDR2-2GB-800
HDD: WesternDigital WD20EARS-00MVWB0
Case: JMAX JX-FX150S*1

こんな具合になりました。週末特価もあったりして、しめて約3万円です。いい世の中になったものです。
光学ドライブはインストールにしか使わない予定なので、手元にあるUSB接続のものでどうにかしてしまいます。
さすがにMini-ITXなので若干のキツキツ感はありますが、発熱上の問題とかは運用しながら考えます。
写真を貼っておくとこんな感じ。
http://twitpic.com/28vjpu
左が今回の新しいサーバ機、中央がWindowsが入ってるデスクトップ機、右がCeleronな旧サーバです。

BIOS設定して起動

何故かSATAポートのデフォルト設定がIDE互換モードだったので、AHCIにしてみます。あとはブートプライオリティの設定を調整しておきます。

そしてUSBでCDドライブを接続して、LiveCDでブートしてみます。
今回はここから落としたものを事前にCD-Rに焼いておきます。試す方は必ず手近なミラーサーバがどこかと、最新バージョンが何かを確認してから落としましょう。

http://www.gentoo.org/main/en/mirrors2.xml
http://ftp.iij.ad.jp/pub/linux/gentoo/releases/x86/current-iso/install-x86-minimal-20100216.iso

で、ブートしたら基本眺めてるだけだけど、途中でキーボードの配列タイプを聞いてくるので、日本語であれば22を選んでEnter。

この状態でDHCPされれば素直にネットワークに繋がるはず。
もし繋がらない場合は、ifconfigとかrouteコマンドを駆使して繋がるようにします。
ここまで来たら、最初にやることは2つ。
まずpasswdでrootのパスワードを設定して、それから/etc/init.d/sshd startするとsshで接続できるようになります。そこから先のセットアップはssh越しが楽でしょう。LiveCDでブートした状態では、sshdはほぼデフォルトの設定なので、22番でListenしていてrootでのログインも許可されています。セットアップ用でかつインターネットに直接さらされてなければ、そのままが手っ取り早いでしょう。

パーティション設定

一番悩むのがパーティション設計です。
今回は

/boot 128MB
/ 40GB
/home 残り
swap 2GB

で行きます。
ごく普通のfdiskですので、細かい使い方は割愛。拡張パーティションは何故か嫌いなので基本パーティション4つに分けてみます。

fdisk /dev/sda
Command (m for help): p

Disk /dev/sda: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x6e526493

Device Boot Start End Blocks Id System
/dev/sda1 1 17 136521 83 Linux
/dev/sda2 18 5240 41953747+ 83 Linux
/dev/sda3 5241 242940 1909325250 83 Linux
/dev/sda4 242941 243201 2096482+ 82 Linux swap / Solaris

んで、フォーマット。/bootはext2、/と/homeはext4にしてみます。サイズがでかいとフォーマットにもやや時間がかかりますね。Windowsに比べればだいぶ早いですが。

mke2fs /dev/sda1 && \
mkfs.ext4 /dev/sda2 && \
mkfs.ext4 /dev/sda3 && \
mkswap /dev/sda4 && \
swapon /dev/sda4

さらにこれをマウントします。/mnt/gentooをルートとしたイメージで、各パーティションを割り当てます。

mount /dev/sda2 /mnt/gentoo && \
mkdir /mnt/gentoo/boot && mount /dev/sda1 /mnt/gentoo/boot && \
mkdir -p /mnt/gentoo/home && mount /dev/sda3 /mnt/gentoo/home

これでLiveCDでブートした状態から、/mnt/gentoo以下のディレクトリがハードディスクという格好で構成されます。ここから先はその/mnt/gentooに対して必要なファイル群を流しこんでいく感じ。

Stageのインストール

Gentoo LinuxではStageという便利なものがあります。ある程度の必要環境をまとめたものとでも言えばいいでしょうか。内容の大小により1〜3のStageがありますが、通常はstage3を使います。

cd /mnt/gentoo
wget http://ftp.iij.ad.jp/pub/linux/gentoo/releases/x86/current-stage3/stage3-i686-20100622.tar.bz2
wget http://ftp.iij.ad.jp/pub/linux/gentoo/releases/x86/current-stage3/stage3-i686-20100622.tar.bz2.DIGESTS

wget http://ftp.iij.ad.jp/pub/linux/gentoo/releases/x86/current-stage3/stage3-i686-20100622.tar.bz2.CONTENTS
md5sum -c stage3-i686-20100622.tar.bz2.DIGESTS
tar xvjpf stage3-i686-20100622.tar.bz2 -C /mnt/gentoo

ISOイメージと同じですが、手近なミラーサーバから最新のファイルを確認してダウンロードしましょう。
儀式的ですが、md5sumもした上で、これをマウントしてある/mnt/gentooに展開します。

同じくPortageの最新スナップショットをダウンロードして展開します。
こっちは/mnt/gentoo/usrに対して展開します。

wget http://ftp.iij.ad.jp/pub/linux/gentoo/snapshots/portage-latest.tar.bz2
wget http://ftp.iij.ad.jp/pub/linux/gentoo/snapshots/portage-latest.tar.bz2.md5sum
md5sum -c portage-latest.tar.bz2.md5sum
tar zxjf portage-latest.tar.bz2 -C /mnt/gentoo/usr

make.confの設定

nano -w /mnt/gentoo/etc/make.conf

でmake.confファイルを作成します。
Gentooのキモのひとつですね。
ちなみにLiveCDにはviが入っていないので、nanoを使います。

今回は若干無駄だとわかりつつこんな感じにしてみました。デフォルトでも入らないはずのUSEフラグも、GUI関連だったりして明らかに使う可能性のないものを明示的に抜いたり、何となく使うかなぁと思ってるものを入れちゃってるので、だいぶカオスになってしまってます。
MAKEOPTSは「論理コア数+1」がセオリーらしいので、DualCore+HyperThreadingAtom D510では5に設定しています。

CFLAGS="-O2 -march=i686 -pipe"
CXXFLAGS="-O2 -march=i686 -pipe"
# WARNING: Changing your CHOST is not something that should be done lightly.
# Please consult http://www.gentoo.org/doc/en/change-chost.xml before changing.
CHOST="i686-pc-linux-gnu"
MAKEOPTS="-j5"

USE="acpi alsa apache2 apm -arts -avi berkdb -bitmap -fonts cdb crypt -cups -emboss -encode \
ftp -fortran -foomaticdb gdbm gif -gnome -gpm -gtk -gtk2 -imlib ipv6 jpeg -kde libg++ \
libwww -ldap -mad maildir -mbox -mikmod -motif -mp3 -mpeg mysql ncurses nis nls nptl nntp -oggvorbis \
pam -opengl -oracle -oss pdflib perl php png postgres python -qt -quicktime readline samba -sdl -selinux -spell sse sse2 \
ssl svga tcpd -truetype -truetype-fonts -type1-fonts -X xml2 -xmms -xv zlib"

GENTOO_MIRRORS="http://ftp.iij.ad.jp/pub/linux/gentoo/ \
http://gentoo.gg3.net/ \
ftp://gg3.net/pub/linux/gentoo/ \
ftp://ftp.ecc.u-tokyo.ac.jp/GENTOO \
http://gentoo.channelx.biz/ \
http://mirror.gentoo.gr.jp"

SYNC="rsync://rsync.jp.gentoo.org/gentoo-portage"

chrootします

ここまで準備できたら、/mnt/gentooをルートとした環境にchrootします。以降のセットアップはこの環境下で行ないます。

cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf
mount -t proc none /mnt/gentoo/proc
mount -o bind /dev /mnt/gentoo/dev
chroot /mnt/gentoo /bin/bash
env-update && source /etc/profile && \
export PS1="(chroot) $PS1"

いくつかの初期設定系

まずはPortageの状態を最新にします。

emerge --sync

続いてロケールの設定を行ないます。

nano -w /etc/locale.gen

今回は日本語環境はUTF-8にしたいので、
en_US ISO-8859-1
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
の3行をコメントアウトを外して、

locale-gen

を実行します。

さらにローカルタイムの設定

rm /etc/localtime && \
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

カーネルの設定

まずはカーネルソースとgenkernelをダウンロードします

USE="-doc symlink" emerge gentoo-sources
emerge genkernel

genkernelはカーネルの自動ビルダです。古式ゆかしくカーネルコンパイルをしてもいいんですが、この方が楽です。

続けてgenkernelの設定ですが、

nano -w /etc/genkernel.conf

で、MENUCONFIG="yes"にしておくと、genkernelを実行した時にコンパイルオプションのメニューが必ず出てきます。

そしていざコンパイルです。

genkernel --menuconfig all

コンパイル開始。メニューが出てくるので必要なオプションを選んでいきます。事前にlspciやdmesgを確認して、必要なドライバ類を確認しておいた方がベストです。
ちなみに今回の場合、特にドライバ類を最低限に絞ったこともあり、コンパイルに15分かかりました。

さらにその他初期設定

fstabも自力で書くのがGentoo流。nanoで開いて、下記を追記します。
通常運用時は/bootをマウントしない状態にしておきます。普段はマウントしないでも運用できるので、間違えて削除したりするリスクを考えると、常時マウントしておく必然性はありません。

nano -w /etc/fstab

/dev/sda1 /boot ext2 noauto,noatime 1 2
/dev/sda2 / ext4 defaults,noatime 0 1
/dev/sda3 /home ext4 defaults,noatime 0 0
/dev/sda4 none swap sw 0 0

ホスト名やネットワークの設定など。OS起動と同時にブートさせたいサービス類はrc-updateコマンドで設定します。ここではeth0は自動起動するようにします。ついでにsshd自動起動ですかね。

nano -w /etc/conf.d/hostname
nano -w /etc/conf.d/net
nano -w /etc/hosts
rc-update add net.eth0 default
rc-update add sshd default

/etc/conf.d/netがIPアドレスやルーティングの設定ですが、config_eth0でIPアドレス設定、サブネットマスクとブロードキャストアドレスを併記します。route_eth0の方でルーティング設定です。こっちはデフォルトゲートウェイのみ書いています。eth1がある場合も同じように書いていきますが今回はありません。

config_eth0=( "192.168.xxx.xxx netmask 255.255.255.0 brd 192.168.xxx.255")
routes_eth0=( "default gw 192.168.xxx.xxx" )

忘れないうちにrootのパスワードを設定しておきます。

passwd

あとはキーボードの設定とか。
日本語キーボードの場合は、KEYMAP="jp106"を指定します。

nano -w /etc/conf.d/keymaps

タイムゾーンの設定。日本であれば、CLOCK="local"とTIMEZONE="Asia/Tokyo"を指定します。

nano -w /etc/conf.d/clock

基礎的パッケージ類のインストール

Gentooはデフォルトではcronもsyslogもインストールされないという男前仕様です。
なので、こんな感じでガッツリインストールします。

emerge -a \
app-admin/syslog-ng \
sys-process/vixie-cron \
sys-apps/slocate \
sys-boot/grub

syslog-ngとcronは自動起動しましょう。

rc-update add syslog-ng default && \
rc-update add vixie-cron default

grubの設定等

当然のことながらgrubの設定も手書きです。

nano -w /boot/grub/grub.conf

genkernelでコンパイルしている場合は、こんな感じでしょうか。

default 0
timeout 5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz

title=Gentoo Linux 2.6.34-r1
root (hd0,0)
kernel /boot/kernel-genkernel-x86-2.6.34-gentoo-r1 root=/dev/ram0 init=/linuxrc ramdisk=8192 real_root=/dev/sda2 udev doscsi
initrd /boot/initramfs-genkernel-x86-2.6.34-gentoo-r1

んでもってgrubのインストールをします。フロッピードライブを付ける気もないので、--no-floppyをつけちゃいます。

grep -v rootfs /proc/mounts > /etc/mtab
grub-install --no-floppy /dev/sda

ここまで来たら準備完了です。
リブートしましょう。exitした後のカレントディレクトリが/mnt/gentooだったりするとumountできないので、cdもします。

exit
cd /
umount /mnt/gentoo/boot /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo/home /mnt/gentoo
reboot

リブート時にLiveCDを抜いておけば、先程インストールしたgrub経由で先程コンパイルしたカーネルからブートします。
ここで起動できないというトラップにはまりがちです。よくやるのは
・fstabの記述ミス
grub.confの記述ミス
カーネルコンパイルミス
とかでしょうか。
いずれの場合も最初の方の手順にしたがって、LiveCDでブートしなおして、ハードディスクをマウントの上、各ファイルを修正します。カーネルのリコンパイルが必要な場合は、chrootしてgenkernelを実行し、コンパイルオプション、特にドライバ類に不足がないかを確認します。この辺りはハード構成によって変わる場合があるので、トライ&エラーが必要になってしまうことが往々にあります。

その他よく使うパッケージのインストール

一応まずはemereg worldします。デフォルトからUSEフラグを書き換えてるのでNオプションがいります。

emege -avuND world

ちなみにgccとかglibcのアップデートが入ると恐ろしく時間がかかりますので、覚悟しましょう。

あとは使いそうなパッケージをインストールしていきます。
サーバ系はとりあえず後回し、超基本系のみだけど、個人的に使いそうなものはいろいろ入れちゃってます。今回は入れてませんが、DHCPで使いたい場合はnet-misc/dhcpcdをインストールする必要があります。他にもいくつか種類がありますが、デフォではDHCPクライアントすら入ってないという仕様です。

emerge -avuD \
net-misc/ntp \
sys-apps/pciutils \
app-admin/sysstat \
app-admin/logrotate \
net-misc/openssh \
app-editors/vim \
net-dns/bind-tools \
net-misc/whois \
net-misc/telnet-bsd \
app-admin/sudo \
net-analyzer/nmap \
net-analyzer/traceroute \
app-portage/gentoolkit \
www-client/w3m \
net-firewall/iptables \
net-dialup/minicom \
app-arch/afio \
net-ftp/ftp \
net-ftp/lftp \
app-arch/lha \
app-arch/zip \
app-arch/unzip \
app-misc/screen \
sys-apps/hdparm \
sys-apps/sdparm \
net-analyzer/tcpdump \
net-nds/portmap \
net-fs/nfs-utils \
sys-apps/usbutils \
app-portage/eix \
app-i18n/nkf \
app-portage/splat \
sys-apps/tcp-wrappers \
app-vim/greputils \
sys-devel/bc \
app-arch/rpm \
sys-apps/lm_sensors \
app-admin/hddtemp \
net-analyzer/iftop \
net-analyzer/nethogs

ユーザの設定

まずはwheelグループのユーザのみがrootにsuできるようにします。
visudoして、%wheel ALL=(ALL) ALLのコメントを外します。

そしてとりあえず自分用ユーザを作ります。個人的なポリシーですが、UIDは1000から連番で振ります。

useradd -u 1000 -g users -G wheel -m hoge
id hoge
uid=1000(hoge) gid=100(users) groups=100(users),10(wheel)
passwd hoge

これでhogeユーザでログインしてsuできることを確認しましょう。できればsshでのrootログインをふさいでしまいます。

vi /etc/ssh/sshd_config

して、PermitRootLoginをnoにします。

ここまでで最低限Gentoo Linuxをサーバとして使えそうな状態までインストールできました。でもまだiptablesもかけてないので、インターネットにさらしちゃいけません。
細かいサーバ系のインストール・設定も書いていきたいけど、それは追々。

*1:当初はFX100Bとかで考えてたんだけど、アキバに買いに行ったら値段が変わらなかったので。カードリーダーはその内ちゃんと使えるようにするかな