仮想マシンでFreeBSD
ネットワークの構成を変えて、UN*Xサーバが物理的なサーバである必要がなくなったので、Windowsサーバ上の仮想マシンで動かすようにしてみます。
UN*Xで提供していた機能を全てWindowsで提供するようにするっていう手もあるのですが、面倒すぎるので、ハードウェアの仮想化だけでUN*X自体は残すようにしました。
移行前の旧サーバは、FreeBSD4.6です。移行後は、FreeBSD6.2です。
仮想化 †
Windowsホスト上で動作する無料の仮想化ソフトというと、今はMicrosoftとVMWareのものが人気です。
Microsoftは、
- Virtual PC
- Virtual Server
VMWareは
- VMWare Player
- VMWare Server
がそれぞれデスクトップ向けと、サーバ向けです。
正確には、VMWare Playerは機能制限で、Virtual PCの完全な競合はVMWare Workstationあたりになりますが、こちらは有料で2万円くらいです。
個人的には、MSよりもVMWareの方が軽くて高機能という印象を持っているので、今回はVMWare Serverを使いました。
デスクトップ向けのものを使ってもサーバの運用は可能ですが、サーバ向けの方がバックグラウンドで動作させたりリモートからの制御したりしやすくなっています。
ただ、IISを導入しておく必要があったりするので、デスクトップ用途に使う場合は、デスクトップ向けの方が導入が楽です。
VMWare Serverの場合は、サーバに導入したら、そのままサーバ上でVMWare Server Consoleというツールで操作するか、別のクライントにVMWare Server クライアントをインストールして、サーバと同様にVMWare Server Consoleを起動するかします。
VMWare Server Console のインタフェースはVMWare Workstationなどと同じような操作体系になっています。別サーバで動いているのか、ローカルで普通に仮想化ソフトが動いているのか気にせずに使えます。
今回、CUIのFreeBSDを作るにあたって、
- HDD 20GB
- MEM 256MB
にしてみました。
HDDもメモリも半分くらいでもなんとかなりそうです。
ホストは、
- CPU Pentium3 1GHz
- MEM 1GB
- OS Windows 2003 Server
です。結構旧式です。
旧サーバで動かしていたサービス †
ネットワーク・マネージメント †
- DNS
- DHCP (isc-dhcp3-3.0.1.r9)
- PPTP (poptop 1.1.4.b4)
ファイルサーバ †
- NFS
- SAMBA (2.2.2.j1.1)
データベース †
- PostgreSQL 7.3.3
- MySQL 3.23.49
その他 †
- apache 1.3.24
- TELNET
- SNMP 5.0.1
アプリケーション †
- unison 2.10.2
- curl 7.10.7
- fetchmail 5.9.6
- ncftp1-1.9.5
- mrtg-2.9.18.p11
- perl-5.6.1
- qpopper 4.0.4
- rsync 2.5.6
- wget 1.8.1
- php 4.3.2
移行しないサービス †
DNS,DHCPは、仮想化されたホスト側に移します。
fetchmail, qpopper, wget, curlはもう使っていないのでインストールしません。
PostgreSQLのインストールとデータの移行 †
データベースがapacheやPHPの依存先になっているので、データベースからインストールします。
この後にPHPをインストールことを考慮して、バージョンは7.4にしました。
portsでお手軽に
postgresql74-server
を入れました。
データを移行しようと思ったのですが、旧サーバのデータは試しに入れたMovableType?のものだけだったので移行しませんでした。
/etc/rc.conf
に
postgresql_enable="YES"
を追加。(これをしないと、rc.dのスクリプトを直接呼んでも走りません)
cd /usr/local/etc/rc.d
./010.pgsql.sh initdb
MySQLのインストールとデータの移行 †
PostgreSQLと同じ理由で5.0.33にしました。
インストールは、portsで
mysql50-server
を入れるだけ。
データの移行。
PostgreSQLと違ってデータがたくさんあるので移行します。
マニュアルによると、3.23から5.0へはいきなりバージョンアップせずに順に上げていけ、とあります。
まず旧サーバを5.0まで上げました。
危ないのでバックアップ
cd /var/db
tar cpf mysql20070303.tar mysql
3.23から4.0に
cd /usr/ports/database
cd mysql324-server
make deinstall
cd ../mysql324-client
make deinstall
クライアントとしてmysqlを使っているアプリが使っているという依存関係の警告がでますが、移行前のサーバはもう使わないので気にしないことにします。
cd ../mysql40-server
make
make install
4.0.26を入れます。
アップデートのツールは、mysqldにコネクションを張ってアップデートするので、mysqld_safeを起動しておきます。
mysql_fix_privilege_table --password="PASSWORD"
でデータをアップデートします。
ERROR 1061 at line 5: Duplicate key name 'Grantor'
とか出るけど、Duplicate key nameは無視していいらしい(マニュアルより)
ISAM(MyISAMではない)は無いのでDBのコンバートはしませんでした。
4.0から4.1に
アンインストールは、mysqld_safeを止めて、portsからdeinstallしました。
portsは古すぎて使えませんでした。公式のソースからインストールしました。標準の設定はデータディレクトリが違うので、
mysql_safe --datadir=/var/db/mysql
で起動します。
mysql_fix_privilege_table --password="PASSWORD"
でまたアップデートします。
4.1から5.0に
古いmysqld_safeを止めます。
4.1はソースを展開したところで、
make uninstall
でアンインストールできます。
5.0は4.1と同様にソースから入れました。
5.0からはmysql_upgradeというツールを使います。
mysql_upgrade --password="PASSWORD" --datadir=/var/db/mysql --verbose
/var/db/mysqlをそのまま新サーバに転送してもいいのだけど、今回はdumpして戻す方法を取ってみました。
旧サーバで、
mysqldump --password='PASSWORD' --all-databases > mysql.dump
で、ダンプして、新サーバにmysql.dumpを転送します。
新サーバでは、
cd /var/db
/usr/local/bin/mysql_init_db
chown -R mysql:mysql mysql
/usr/local/bin/mysqld_safe&
/usr/local/bin/mysqladmin -u root password 'PASSWORD'
/usr/local/bin/mysql --passowrd='PASSWORD' < mysql.dump
です。
init_dbあたりは、rc.d/のスクリプトでも出来そうですが、よく分らなかったので手動です。
ちなみに、新サーバでmysqldumpしてみたところ同じサイズのファイルが出てきました。/var/db以下のサイズの合計は意外にも新サーバの方が大きくなっていました。
/etc/rc.conf
に
mysql_enable=YES
を追加
samba †
SAMBAは伝統的にjapanese以下にあるもののほうが良さそう。
japanese/samba3
を入れました。
samba3だとVISTAでも素直に使えそうです。(認証の都合)
homeを旧サーバからそのまま持ってきた都合で、文字コードを旧サーバと合わせる必要があります。
旧サーバでは、
client code page = 932
coding system = euc
でした。
/usr/local/etc/smb.conf
で
display charset = eucjp-ms
unix charset = eucjp-ms
dos charset = cp932
を設定。(実はこれではダメ)
日本語ファイルを作ってテストしてみたところ上手く動いてくれませんでした。Windowsで新規ファイルを作ってもうまく反映されません。
文字変換はiconvを利用しているらしいので、インストールされているiconv(1.9.2.2_2)で使えるコードを確認(iconv -l)してみると、eucjp-msはありません。euc-jpはあるので、それを利用するとうまく動きました。
display charset = euc-jp
unix charset = euc-jp
dos charset = cp932
です。
/etc/rc.conf
に
samba_enable="YES"
を追加する。
cd /usr/local/etc/rc.d
./samba start
でとりあえず起動。
telnet †
仮想マシンで動いているのでVMware Server Consoleで接続可能なのですが、telnetがあったほうが便利なので使えるようにしておきます。
/etc/rc.conf
に
inetd_enable="YES"
を追加して、
/etc/inetd.conf
のtelnet tcp の行を有効化。
WEBサーバ †
apacheは2系でもいいのですが、モジュールの都合で1系の方が苦労しないので、1.3.37にします。
cd /usr/ports/www
cd apache13
make
make install
SSLとかIPv6とかは使わないので、最初は素のapacheにしておきます。
/etc/rc.d
に
apache_enable="YES"
を追加。
PHP †
lang/php5 (5.1.6)
apacheのオプションを追加
<IfModule mod_php5.c> AddType application/x-httpd-php .php AddType application/x-httpd-php-sorce .php </IfModule>
IfModule? mod_dir.cもphp3,4用しかないので、
DirectoryIndex index.php index.html
を追加します。
ユーザのホームに
hoge.php
<?php phpinfo(); ?>
を置いて内容を確認してみる。
モジュール †
デフォルトではほとんどモジュールが入っていないので、必要なものを入れていきます。
PCRE
devel/php5-pcre
普通はPCREはデフォルトで入るものですが、FreeBSDのportsではこれもdisalbeになっているらしい。
unison †
同期用のツールです。
http://www.cis.upenn.edu/~bcpierce/unison
バージョンアップで互換性がなくなる(相互接続できなくなる)ことが多いので、バージョン管理に注意しないといけません。
今の最新は2.13.16ですが、2.10.2以前のものとは非互換です。
今回はまとめて全部バージョンアップすることにしました。
新サーバは
net/unison
からportsで入れました。
旧サーバはportsの設定が面倒なので、手動で入れます。
古いバージョンの削除
#pkg_delete unison-2.10.2
ダウンロード・展開
%fetch http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.13.16.tar.gz
%tar zxvf unison-2.13.16.tar.gz
%cd unison-2.13.16
Makefileの編集(オプション)
%vi Makefile
THREADS=true
UISTYLE=text
配布物のままだとコンパイルエラーが出るのでパッチあて。
%vi pty.c
以下は、portsにあるパッチ
patch-pty.c
--- pty.c.orig Mon May 30 15:15:43 2005 +++ pty.c Sat Aug 27 15:47:55 2005 @@ -21,6 +21,7 @@ #endif #ifdef __FreeBSD__ +#include <sys/types.h> #include <libutil.h> #define HAS_OPENPTY 1 #endif @@ -40,9 +41,10 @@ /* c_openpty: unit -> (int * Unix.file_descr) */ CAMLprim value c_openpty() { int master,slave; + value pair; if (openpty(&master,&slave,NULL,NULL,NULL) < 0) uerror("openpty", (value) 0); - value pair = alloc_tuple(2); + pair = alloc_tuple(2); Store_field(pair,0,Val_int(master)); Store_field(pair,1,Val_int(slave)); return pair;
コンパイル
%gmake
インストール
#cp unison /usr/local/bin
PPTP †
portsのnet/poptopをインストール。
/etc/rc.conf
pptpd_enable="YES"
/usr/local/etc/pptpd.conf
logwtmp localip 10.0.3.1 remoteip 10.0.3.128-254
/etc/ppp/options.pptpd
lock nodefaultroute name poptop auth proxyarp -chap -chapms +chapms-v2 ipcp-accept-local ipcp-accept-remote lcp-echo-failure 3 lcp-echo-interval 5 deflate 0 mppe-128 mppe-stateless
/etc/ppp/ppp.conf
pptp: set log phase chat connect lcp ipcp command set device localhost:pptp set dial set login set ifaddr 10.0.3.1 10.0.3.128-10.0.3.254 255.255.255.128 set server /tmp/loop "" 0177 disable CHAP MSCHAP PAP enable MSCHAPv2 disable deflate pred1 deny deflate pred1 set mppe 128 stateless enable MPPE accept MPPE enable chap81 enable proxy
/etc/ppp/ppp.secret
USER PASSWORD
pap,chapはdisableなので、pap-secret, chap-secretは用意していません。
ここまでの設定で、外部からPPTPで繋がるようになりますが、ルーティング設定等をしないとおそらく使い物にはなりません。
以下では、PPTPサーバ(今設定しているサーバ)のIPアドレスは192.168.1.10とします。
まずは、WAN -> LAN(PPTPサーバ)に繋がるようにします。
VMServerのEthernet設定はBridged(英語版での名称)にしてください。
ルータの設定で、外部からのVPN接続がPPTPサーバに繋がるようにします。
RT-200NEの場合だと、
静的IPマスカレード設定で、
TCP 1723 -> 192.168.1.10 1723
にします。
LAN-> PPTPサーバ -> VPN と流すための設定します。
デフォルトでFreeBSDサーバはゲートウェイにならないので、
rc.conf
gateway_enable="YES"
とします。とりあえず、
# sysctl net.inet.ip.forwarding=1
とすればリブートしなくても試せます。
次に、LAN内のルーティング設定を変えます。
Windowsクライアントだと、
route add 10.0.3.128 mask 255.255.255.128 192.168.1.10
で変えられますが、面倒なのでデフォルトルータになってるルータ経由で流れるようにします。
RT-200NEの場合だと、静的ルーティング設定で、
10.0.3.128/255.255.255.128 LAN 192.168.1.10
を追加。
ちなみに、PPTPの設定で、PPTPのクライアントがVPNをデフォルトルートにしないようにしているので、PPTPクライアントでも適切なルーティング設定が必要です。
ウイルスバスター2007を使っている場合は、デフォルトの設定でVPNが遮断されます。
Windows Mobile 5 (zero3es)からは繋がりません。
NTPサーバ †
仮想マシン上では時間が安定しないので、ntpdでは時間を合わせないようにします。
正確な時間が提供できないので、あまりNTPサーバにする意味はありません。
むしろしない方がいいです。
/etc/rc.conf
ntpd_enable="YES"
/etc/ntp.conf
# #server ntp1.jst.mfeed.ad.jp #server ntp2.jst.mfeed.ad.jp #server ntp3.jst.mfeed.ad.jp server 127.127.1.0 prefer restrict default nomodify
コメント †
- Bunpei Matoba 2007-07-10 (火) 11:50:31
FreeBSD上のpptp設定でこのページを大いに参考にさせていただきました。
一点だけ、本文中の
/etc/ppp/ppp.secrets
は
/etc/ppp/ppp.secret
が正しいですよね。 - vvp 2007-07-10 (火) 20:30:14
お役に立ててなによりです。
誤字のご指摘ありがとうございます。早速直しておきました。