玄箱Webサーバ稼動


USE="mysql"emerge --newuse worldしたので、apache2phpmysqlによるxoopsが使える環境になりました。 Webサーバを公開するにあたり、ダイナミックDNSを使うことにします。

メジャーなところで、dyndns.comに登録しました。homelinux.comというサブドメインを使ってmomomo.homelinux.comとしました。(現在は利用していません)apacheの設定を少しばかり変更します。

/etc/apache2/httpd.conf

#AddDefaultCharset ISO-8859-1
AddDefaultCharset EUC-JP

バーチャルホストの機能を使い、外からのmomomo.homelinux.comでアクセスされた時のドキュメントを/var/www/momomo下に、LANからプライベートドキュメントとしてアクセスするドキュメントをデフォルトの/var/www/localhost/htdocs下に置くことにします。

/etc/apache2/vhosts.d/00_default_vhostを編集して

NameVirtualHost *:80
ServerAdmin webmaster@momomo.homelinux.com
DocumentRoot /var/www/momomo
ServerName momomo.homelinux.com
ErrorLog /var/log/apache2/momomo-error.log
CustomLog /var/log/apache2/momomo-access.log common
ServerName kuro
DocumentRoot "/var/www/localhost/htdocs"
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from 192.168.11.0/24

これで、LAN内からhttp://kuro/でアクセスした時はプライベートなドキュメントに、http://momomo.homelinux.com/でアクセスされた時は公開用のドキュメントにと、振り分けられるわけです。 
名前ベースのバーチャルホストを使用するには、注意が必要です。 Allow from 192.168.11.0/24とLAN内からのみのアクセスに限定しないと、ちょっとしたおまじないで、プライベートなはずのhttp://kuro/にアクセスされてしまうからです。デフォルトランレベルに登録して

# rc-update add apache2 default

apacheを起動します。

# /etc/init.d/apache2 start

次に、ルータの設定で、ポート80を玄箱に向けて、外からアクセスできるようにします。 DDNSクライアントを立ち上げるところですが、ルータにその機能があったのでDDSNの設定もルータにて行いました。 まだコンテンツまったくなしでつまらないですが、良かったら試しにアクセスしてみて下さい。(現在稼働していません)
http://momomo.homelinux.com/ 

分散クロスコンパイル環境の構築


パワー不足の玄箱でGentooを運用して行くには、少しでもコンパイルの速度を上げないとGentooが生きて来ないだろう、ということで・・・

ボロPC(とは言え、Pentium III 800MHz)に、コンパイルをお手伝いさせようと、前回は、PowerPC(玄箱)のコンパイル環境をPentiumeIII上に構築したわけです。

今回は、分散コンパイルさせるために、distccの導入です。
既に、玄箱には、distccは導入してあるので、ボロPCにも入れます。ついでに、ccacheも入れてしまいます。

ボロPCで:

# emerge distcc ccache

色々と試行錯誤がありましたが、最終的に次のようになりました。

玄箱側の設定:
/etc/make.confの内容:

CFLAGS="-O2 -mcpu=603e -fno-strict-aliasing -pipe -fsigned-char"
CHOST="powerpc-unknown-linux-gnu"
CXXFLAGS="${CFLAGS}"
PORTDIR=/var/portage
DISTDIR=/var/portage/distfiles
PKGDIR=/var/portage/packages
RPMDIR=/var/portage/rpm
PORTDIR_OVERLAY="/var/overlays/kurobox"
RSYNC_EXCLUDEFROM=/etc/portage/rsync_excludes
GENTOO_MIRRORS="http://mirror.gentoo.gr.jp/"
SYNC="rsync://192.168.11.101/gentoo-portage"
PORTAGE_TMPDIR=/var/tmp
MAKEOPTS="-j6"
FEATURES="ccache distcc"
DISTCC_DIR="${PORTAGE_TMPDIR}/.distcc"
CCACHE_SIZE="2G"
CCACHE_DIR="/var/tmp/ccache"

ホストの指定:

# distcc-config --set-hosts 192.168.11.101

/usr/lib/distcc/powerpc-unknown-linux-gnu-wrapperを次の内容で新規に作成する。

#!/bin/bash exec /usr/lib/distcc/bin/powerpc-unknown-linux-gnu-g${0:$[-2]} "$@"

これは、powerpc-unknown-linux-gnu-gccのようにフルネームではなく、gccと短い名前で呼ばれたときに、フルネームで呼ばれたかのように見せかけるラッパーです。
コンパイラが起動されたときにdistccを実行するように、シンボリックリンクをはります。

# cd /usr/lib/distcc/bin
# chmod a+x powerpc-unknown-linux-gnu-wrapper
# ln -s powerpc-unknown-linux-gnu-wrapper c++
# ln -s powerpc-unknown-linux-gnu-wrapper cc
# ln -s powerpc-unknown-linux-gnu-wrapper g++
# ln -s powerpc-unknown-linux-gnu-wrapper gcc
# ln -s /usr/bin/distcc powerpc-unknown-linux-gnu-c++
# ln -s /usr/bin/distcc powerpc-unknown-linux-gnu-g++
# ln -s /usr/bin/distcc powerpc-unknown-linux-gnu-gcc

デフォルトランレベルにdistccccacheを登録しておきます。

# rc-update add distcc default
# rc-update add ccache default

ボロPC側の設定:
/etc/make.confの内容:

CFLAGS="-Os -march=pentium4 -pipe"
CHOST="i686-pc-linux-gnu"
CXXFLAGS="${CFLAGS}"
GENTOO_MIRRORS="http://mirror.gentoo.gr.jp"
SYNC="rsync://rsync.jp.gentoo.org/gentoo-portage"
PORTDIR_OVERLAY="/usr/local/portage"
PORTAGE_TMPDIR=/var/tmp
MAKEOPTS="-j2"
FEATURES="ccache"
CCACHE_SIZE="2G"
CCACHE_DIR="/var/tmp/ccache"

こちらは、お手伝いをするだけなので、設定はこれだけです。
玄箱と同じくデフォルトランレベルに登録しておきます。

# rc-update add distcc default
# rc-update add ccache default

以上で、設定は終わりです。
それぞれのマシンでdistccccacheを起動した後、玄箱側で何かをemergeしてボロPC側で、powerpc-~cc1・・・などのプロセスが実行されれば、導入は成功です。

ntpによる時刻の同期


コンパイル環境は、ひとまず整ったので、これからは、必要なパッケージを導入して行きます。 まずは、軽いところから、ntpを。

# emerge ntp

(多少は速くなっているのかな・・・) /etc/ntpd.confの編集:

server [ntpサーバの指定] (一番近いであろうプロバイダのNTPサーバを指定しました)
driftfile       /var/lib/ntp/ntp.drift
restrict default nomodify nopeer
restrict 127.0.0.1    # LAN内からアクセスできるようにして、サービスを公開
restrict 192.168.11.0 mask 255.255.255.0
nomodify
nopeer
notrap

/etc/conf.d/ntp-clientの編集:

NTPCLIENT_CMD="ntpdate"
NTPCLIENT_OPTS=" -b -u [NTPサーバの指定]"
NTPCLIENT_TIMEOUT=30

デフォルトランレベルに登録しておきます。

# rc-update add ntpd default
# rc-update add ntp-client default

ボロPC側でも、同様の手順でntpを導入し、[NTPサーバ]指定の箇所には、玄箱のアドレスを指定して、LAN内を同期させるようにしました。

クロスコンパイル環境の構築


ひさびさのGentooいじりの投稿です。Gentoo玄箱は、立ち上がったものの、パッケージ導入の時間のかかること。
少しでも、このボトルネックを解消しようと、ボロPCにクロスコンパイル環境を構築して、distccを使った分散コンパイルを使用するという計画です。
なかなかうまくいかなかったのですが、なんとか動きだしたので、ご報告させていただきます。
ツールチェーンの構築は、何度か経験はあるのですが、「なんか面倒だった」という記憶だけ残っていて、すっかり忘れていました。 いろいろ調べていると、crossdevというツールがあるらしい。今回はこれを試してみることにしました。

# emerge crossdev

このツールは、コマンド一発で、ツールチェーンを構築してくれる優れものです。 まず、最初にやらなければならないのが、ターゲットマシン(すなわち玄箱)のツールチェーン環境のバージョンを調べることから。現在の玄箱にインストールされているバージョンは、次のとおりです。

  • gcc 3.4.4-r1
  • binutils 2.16.1
  • kernel(header) 2.4.26-r1
  • glibc 2.3.5-r3

次に、crossdevを使って

# crossdev -t powerpc --g 3.4.4-r --b 2.16.1 --k 2.4.26-r1 --l 2.3.5-r3

で後は、待つだけ。 のハズなのですが、configure中にエラーが出てしまうのです。ソースを見たり、検索でこんな事例はないか調べたり、まったく検討違いのことばかりの3日間。 結局、ボロPC(ホスト側)のビルドチェーンが玄箱のバージョンに対応できなかったのです。分かってしまえば、こんなもの、とほほ・・・

# emerge -uD system

を実行して、再度crossdevして、無事クロス環境の構築は完了。 crossdev、偉い! 次は、クロスでの、分散コンパイル環境の構築。

・・・(To be continued)

ブート失敗?!


もしも、うまく起動しなかったら、どうしましょ?
私の場合は、起動はうまくいったのですが、先にも述べたとおり、rootパスワードの設定を忘れて、ログインできないことになってしまいました  。

えっ?!インストールのやり直し?

いえ、インストールCDを使って、復旧できます 。

インストールCDから、ブートして、ログインプロンプトが出るまで待ちます。

次に、ディスクをマウントして、chrootGentoo環境に入ります。私の場合は、

# mount /dev/hda4 /mnt/gentoo
# cd /mnt/gentoo
# mkdir var boot
# mount /dev/hda1 boot
# mount /dev/hda3 var

procファイルシステムもマウントして、

# mount -t proc none /mnt/gentoo/proc

chrootして、Gentoo環境に入ります。

# chroot /mnt/gentoo /bin/bash
# env-update && source /etc/profile

ここで、必要な作業を実行します。

後は、chrootから抜けて、再度リブートします。

# exit
# umount /mnt/gentoo/boot /mnt/gentoo/var /mnt/gentoo/proc /mnt/gentoo
# reboot

この方法は、カーネルの作成失敗、GRUBの設定ミスなどにも、応用がききますね。

GRUBのインストールと設定


ブートローダは、GRUBを使う。長い間、LILOに慣れてきたのですが、最近は、GRUBが趨勢のようです。

例によって、エマージして、インストール。

# emerge grub

/boot/grub/grub.confを編集して、

timeout 5
default 0

title  Gentoo Linux 2.6.14-r5
root   (hd0,0)
kernel /kernel-2.6.14-gentoo-r5 root=/dev/hda4

としました。

grubを起動して、MBRに書き込みます。

# grub --no-floppy

grub> root (hd0,0)
grub> setup (hd0)
grub> quit

これで、ようやく再起動できる状態になりました。

chrootから抜けて、ディスクをアンマウトしてリブートです。

# exit
# cd
# umount /mnt/gentoo/boot /mnt/gentoo/var /mnt/gentoo/proc /mnt/gentoo
# reboot

ほい!っと。

システムツールの導入

ブート前に、必要なシステムツールをインストールしておきます。

まずは、ログツール。sysklogdsysklogd-ngmetalogの中から、metalogを使うことにします。

# emerge metalog

cronは、dcronfcronvixie-cronから、vixie-cronを選びました。

# emerge vixie-cron

slocateも、ここでインストールします。

# emerge slocate

次は、ブートローダをインストールします。

システムの設定

必要なシステム設定をします。

まずは、/etc/fstabを編集。

/dev/hda1 /boot ext2 noauto,noatime 1 2
/dev/hda4 /   ext3 noatime        0 1
/dev/hda3 /var  ext3 noatime        0 1
/dev/hda2 none swap sw             0 0

次は、ネットワークまわりを設定していきます。

/etc/conf.d/hostnameを編集。

HOSTNAME="xxxx"

/etc/conf.d/domainnameの編集。

DNSDOMAIN="example.com"

domainnameを自動実行スクリプトとして登録します。

# rc-update add domainname default

/etc/conf.d/netを編集して、ネットワークの設定します。

config_eth0=( "192.168.11.101 netmask 255.255.255.0" )
routes_eth0=( "default gw 192.168.11.1" )

ブート時にネットワークを有効にさせます。

rc-update add net.eth0 default

/etc/hostsは、とりあえずこのPCだけ、記述しておきます。

127.0.0.1      localhost
192.168.11.101 xxxx.example.com xxxx

ここらで、忘れずにrootパスワードを変更してきます(実は、これを忘れて、ログインできなかったのだ。

# passwd
New UNIX password:
Retype new UNIX password:
passwd: password updated successfully

デフォルトでは、使いにくいので、KEYMAPを設定しておく。/etc/conf.d/keymapsを編集して、

...
KEYMAP="jp106"
...

としておきます。
最後に、UTCは使用していないので、clocklocalに設定します。

...
CLOCK="local"
...

カーネルの構築


やっと、カーネルの構築です。
その前に(準備が長いな・・・)タイムゾーンの設定か。

# ln -sf /usr/share/zoneinfo/Japan /etc/localtime

カーネルソースを持ってきます。

# emerge gentoo-sources

カーネルソースのバージョンの確認。

# ls -l /usr/src/linux

linux-2.6.14-gentoo-r5となっています。

# make menuconfig

で、カーネルのオプションを指定していくわけですが、よくわからないものは、デフォルトのままにして、以下のものだけを変更しました。

  • Processor family –> Pentium III
  • Device Driver
    –>Network device
    –>Ethernet (10 or 100Mbit)
    –><M>Inter(R) PRO/100M+ support

カーネルコンパイルだ、ふぅ。

# make && modules_install

/etc/modules.autoload.d/kernel-2.6を編集して、NICインターフェースのe100を追加しておきます。

chrootして、構築する環境に入る


さて、いよいよchrootするわけですが、その前にDNS情報のコピーと、procファイルシステムをマウントしておきます。

cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf
mount -t proc none /mnt/gentoo/proc

chrootの準備は整った(ハズ)。

# chroot /mnt/gentoo /bin/bash

環境を引き継ぐ。

# env-update
# source /etc/profile

次は、Portageの更新とやら・・・

# emerge --sync

必要なロケールだけ使用するように設定します。

echo "sys-libs/glibc userlocales" >> /etc/portage/package.use

/etc/locales.buildを編集して、以下のように設定します。

en_US/ISO-8859-1
en_US.UTF-8/UTF-8
de_DE/ISO-8859-1
de_DE@euro/ISO-8859-15
ja_JP.EUC-JP/EUC-JP
ja_JP.UTF-8/UTF-8
ja_JP/EUC-JP