検索

Google
Web www.icefree.org

RSS of recent changes

 

仮想マシンでFreeBSD

2017-06-20 (火) 23:23:54 (1556d)
03 Mar 2007-

ネットワークの構成を変えて、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
    お役に立ててなによりです。
    誤字のご指摘ありがとうございます。早速直しておきました。

Counter: 2588, today: 1, yesterday: 3