2013年2月11日

2013年2月末でCVS/CVSupが終了

昨年の2012年9月12日にPortsマネージメントチームから Ports Collection のCVS/CVSupによる提供が2013年2月末で終了します。現在CVS/CVSupを利用している人はportsnap又はSubversionを使う方法に移行する必要があります。
ちなみに高速でPorts Collection の取得が行える portsnap の利用が推奨されているようです。

自鯖のFreeBSDですが、OSやアプリケーションについては何回かバージョンアップを行っていますが、基本的な機能や設定は、ほとんど再利用して使っていたため、未だCVSupを利用していましたが、稼働中のFreeBSD8.2Rで新しくアプリを構築することはないので、とりあえずCronに設定していたCVSupの行をコメントアウトして停止させました。

今後、GPTで冗長化させたFreeBSD9.1に移行しようと考えてますので、そちらではportsnapを使用する予定です。

 

2013年2月 4日

GPTの障害時の対応

前回、FreeBSDをGTPのミラー構成でインストールしました。インストール方法については以下の記事を参考にして下さい。

 


事前の準備

まず、仮想マシンが保存されているハードディスクが壊れた時に構成ファイルが飛んでしまい復旧がめんどうなので、もう片方のディスクにコピーをしておきます。データストアの参照して、以下のファイルをdatastore1からdatastore2にコピーにコピーしておきます。

  • FreeBSD9.1.nvram
  • FreeBSD9.1.vmx
  • FreeBSD9.1.vmsd
  • FreeBSD9.1.vmxf

上がdatastore1で、下がdatastore2で必要なファイルをコピーした状態です。

■datastore1の状態
gpte01.jpg

■datastore2の状態
gpte02.jpg

 


datastore1で障害発生

仮想マシンが稼動しているdatastore1のハードディスクが突然お亡くなりになった想定で、意図的に障害は発生させます。da0のハードディスクがdatastore1上に、da1のハードディスクがdatatore2上に存在しgptでミラーしている状態を確認します。


root@bsd2:/root # gmirror status
      Name    Status  Components
mirror/gm0  COMPLETE  da0 (ACTIVE)
                      da1 (ACTIVE)
 

gptのミラーが正しく動いていることを確認したら、OSを停止させずに仮想マシンの電源をいきなり停止させます。

gpte03.jpg

仮想マシンが停止したら、まず仮想マシンをインベントリから削除します。

gpte04.jpg

gpte05.jpg

後、今回datastore1が障害で使えなくなった想定なので、datastore1のFreeBSD9.1配下をごっそりと削除します。

gpte06.jpg

 


datastore2からの復旧作業

datastore1が使えなくなったので、datastore2から復旧をさせます。この時点ではまだdatastore1のハードディスクが復旧していない状態です。

datastore2を参照してFreeBSD9.1.vmxファイルからインベントリの追加を行います。

gpte07.jpg

gpte08.jpg

gpte09.jpg

gpte10.jpg

datastore2から先ほど削除したインベントリ(FreeBSD9.1)を作成しました。この状態でインベントリを起動しようとするとdatastore1上のハードディスク(vmdkファイル)が見つからないというエラーが発生します。そのため、仮想マシンの設定の編集でdatastore1上のハードディスクを一旦削除します。

 gpte12.jpg

gpte11.jpg

ハードディスク1を削除します。

gpte13.jpg

ハードディスク1を削除したら仮想マシンを起動します。仮想マシンのコピーを検出すると以下のメッセージが表示されます。既存のMACアドレスを使用するか、新規にMACアドレスを割り当てるかの違いなので、今回は「 I moved it 」を選びます。

gpte14.jpg

GPTのミラーが正常に行えていればOSが起動するはずです。起動したらGPTのステータスを確認してみます。datastore2上の仮想ハードディスクがda0で起動しているのが判ります。

 

root@bsd2:/root # gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  da0 (ACTIVE)

 


datastore1復旧後の対応

datastore1のハードディスクを物理的に交換した後の対応です。まずdatastore1上に仮想ハードディスクを作成します。

gpte15.jpg

gpte16.jpg

ハードディスクを追加します。

gpte17.jpg

gpte18.jpg

datastore1を指定して仮想ハードディスクを作成します。datastore2の仮想ハードディスクとディスク容量を合わせてください。

gpte19.jpg

gpte20.jpg

gpte21.jpg

ディスクを追加するとda1で認識しました。インストールした時とデバイスが逆になってしまってます。

 
root@bsd2:/root # dmesg
                    :
da1 at mpt0 bus 0 scbus2 target 0 lun 0
da1: <VMware Virtual disk 1.0> Fixed Direct Access SCSI-2 device
da1: 320.000MB/s transfers (160.000MHz, offset 127, 16bit)
da1: Command Queueing enabled
da1: 20480MB (41943040 512 byte sectors: 255H 63S/T 2610C)
 

gmirrorを使ってディスクを同期させます。そのままinsertで追加しようとすると怒られるので、一旦持っている情報をforgetで忘れさせてあげてから再度insertで追加してください。

 

root@bsd2:/root # gmirror insert gm0 da1
gmirror: Not all disks connected.
 
root@bsd2:/root # gmirror forget gm0
 
root@bsd2:/root # gmirror status
      Name    Status  Components
mirror/gm0  COMPLETE  da0 (ACTIVE)
 
root@bsd2:/root # gmirror insert gm0 da1
 
root@bsd2:/root # gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  da0 (ACTIVE)
                      da1 (SYNCHRONIZING, 25%)
 
root@bsd2:/root # gmirror status
      Name    Status  Components
mirror/gm0  COMPLETE  da0 (ACTIVE)
                      da1 (ACTIVE)
 

これで、無事復旧することが出来ました。必要に応じてdatastore1から起動するように各自変更してみてください。

今回は無事データが復旧しましたが、この手順を参考にしてくれた方のデータを保障する訳ではないので各自で良く検証してから運用してください。

2013年1月31日

FreeBSDをGPTでインストール

前回、2つのdetastoreをもつESXi5.1上に、それぞれのdatastoreにハードディスクを持つ仮想マシンを作成しました。作成方法はこちらを見てください。

早速FreeBSDをインストールしてみます。OSのバージョンは、2013年1月時点で最新のFreeBSD9.1にしました。以下の64ビット対応のISOファイルをFreeBSDのサイトからダウンロードします。

  • FreeBSD-9.1-RELEASE-amd64-dvd1.iso

GPTを使ったFreeBSD9.1のインストール

FreeBSDをGPTを使ってハードディスクをミラーするインストールをします。1パーティションで面白くないので、従来のようにパーティションを分割してインストールしてみました。

仮想マシンのCD-ROMにISOをマウントして仮想マシンを起動します。

fgpt01.jpg

今回は、FreeBSDのインストールが目的なので「install」を選択します。

fgpt02.jpg

KEYマップの設定をします。

fgpt03.jpg

Japanese106を選択してください。

fgpt04.jpg

ホスト名の設定です。FQDNの形式で入力してください。

fgpt05.jpg

インストールコンポーネントの選択です。

fgpt06.jpg

GPTを作るためshellを選択します。

fgpt07.jpg

20GのハードディスクをGPTでフォーマットします。その際パーティションは以下のようにしました。

パーティション 容量(19GB利用可能)
/ 1GB
swap 1GB
/tmp 1GB
/var 4GB
/usr 12GB(残り全部)

GPTでフォーマットしたら、各パーティションをnewfsでufsファイルシステムを作成します。

 
kldload geom_mirror
gmirror label -b split gm0 da0
gpart create -s gpt mirror/gm0
gpart add -s 512k -t freebsd-boot -l boot mirror/gm0
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 mirror/gm0
gpart add -s 1g -t freebsd-ufs -l root mirror/gm0
gpart add -s 1g -t freebsd-swap -l swap mirror/gm0
gpart add -s 1g -t freebsd-ufs -l tmp mirror/gm0
gpart add -s 4g -t freebsd-ufs -l var mirror/gm0
gpart add -t freebsd-ufs -l usr mirror/gm0
 
newfs -j /dev/gpt/root
newfs -j /dev/gpt/tmp
newfs -j /dev/gpt/var
newfs -j /dev/gpt/usr
 

インストール後に起動するマウントポイントをfstabに書き込みます。

 
echo "/dev/gpt/swap none swap sw 0 0" >> /tmp/bsdinstall_etc/fstab
echo "/dev/gpt/root / ufs rw,noatime 1 1 " >> /tmp/bsdinstall_etc/fstab
echo "/dev/gpt/tmp /tmp ufs rw,noatime 2 2 " >> /tmp/bsdinstall_etc/fstab
echo "/dev/gpt/usr /usr ufs rw,noatime 2 2 " >> /tmp/bsdinstall_etc/fstab
echo "/dev/gpt/var /var ufs rw,noatime 2 2 " >> /tmp/bsdinstall_etc/fstab
 

インストールするためにマウントします。exitでシェルを抜けると自動でインストールが始まります。

 
mount /dev/gpt/root /mnt
mkdir /mnt/tmp
mkdir /mnt/usr
mkdir /mnt/vat
 
mount /dev/gpt/tmp /tmp
mount /dev/gpt/usr /usr
mount /dev/gpt/var /var
 
exit
 

fgpt08.jpg

ルートのパスワードを入力します。

fgpt09.jpg

インターフェースの設定です。

fgpt10.jpg

IPv4のインターフェースの設定です。

fgpt11.jpg

今回はDHCPを使用せず、固定でIPアドレスを設定します。

fgpt12.jpg

インターフェースのIPアドレスとサブネットマスク、ディフォルトゲートウェイを設定します。

fgpt13.jpg

IPv6のインターフェースの設定です。IPv6は設定しませんでした。

fgpt14.jpg

DNSの設定です。

fgpt15.jpg

時間の設定です。標準ではUTCになります。

fgpt16.jpg

「Asia」を選択します。

fgpt17.jpg

「Japan」を選択します。

fgpt18.jpg

有効にするサービスを選択します。

fgpt19.jpg

クラッシュダンプを有効にします。

fgpt20.jpg

ユーザを作成します。ここではユーザの作成方法は省略します。

fgpt21.jpg

インストールは終わったのでExitを選択します。

fgpt22.jpg

再起動するまえにもう一度編集します。

fgpt23.jpg

起動オプションを変更します。

 
echo 'geom_mirror_load="YES"' >> /boot/loader.conf
echo '-Dh' >> /boot.config
 
exit
 

機器を再起動します。

fgpt24.jpg

無事OSが起動してきたら、パーティションサイズを確認すると、ちゃんとパーティションが切られています。最後にインストール段階では1つ目のハードディスクしか使っていなかったので、もう片方のハードディスクにデータをコピーします。

 
root@bsd2:/root # df -h
Filesystem       Size    Used   Avail Capacity  Mounted on
/dev/gpt/root    991M    361M    550M    40%    /
devfs            1.0k    1.0k      0B   100%    /dev
/dev/gpt/tmp     991M    8.1M    904M     1%    /tmp
/dev/gpt/usr      12G    1.8G    9.8G    15%    /usr
/dev/gpt/var     3.9G     37M    3.5G     1%    /var
 
root@bsd2:/root # gmirror status
      Name    Status  Components
mirror/gm0  COMPLETE  da0 (ACTIVE)
 
root@bsd2:/root # gmirror insert -v gm0 da1
Done.
 
root@bsd2:/root # gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  da0 (ACTIVE)
                      da1 (SYNCHRONIZING, 43%)
 
root@bsd2:/root # gmirror status
      Name    Status  Components
mirror/gm0  COMPLETE  da0 (ACTIVE)
                      da1 (ACTIVE)
 

これでインストール完了です。

障害時の復旧方法については、こちらを参考にして下さい。

2013年1月26日

FreeBSDのGPTでソフトミラー

自宅ではNASやメールサーバなど、ほとんどの機能がESXi上で動いていて、そろそろバックアップを真剣に考えないとヤバいかなと思い始めてます。ESXi上の仮想ホストのバックアップを行うには以下の3パターンがあります。

  • 法人向けの高価なバックアップソフトの使用
  • ESXiにスクリプトを置いて実行
  • 通常のOSバックアップを使用

個人では、さすがに10万以上もバックアップに投資出来ませんし、ESXiに手を加えると簡単かもしれませんが、後のESXiのバージョンアップで問題が出そうなので、通常のOSバックアップを使用することにしました。
ただ、ufsdumpやddのようにOS標準のバックアップでは面白くないので、VMwareと連携したバックアップを考えたところGUID パーティション テーブル(GPT)を使って2つあるdatastoreにミラーする方法に行き着きました。

VMwareのバックアップの問題については、vmdkファイルがスナップショットを取っている状態でしか取得出来ない点です。逆の発想をすればvmdkファイルだけコピー出来ていればvmxのような構成ファイルは事前にコピーが可能ということになります。GPTを使用するとブート領域もコピーすることが出来るためハードディスクが一つ壊れても、もう片方のハードディスクから起動するが出来るというわけです。

以下の表はdatastore1でインベントリを作成してOSを起動させた状態で、datastore2をバックアップとして使う際のdatastoreの状態です。

datastore1 コピー方法 datastore2
 FreeBSD9.vmdk ミラー  FreeBSD9_1.vmdk
 FreeBSD9.nvram 手動  FreeBSD9.nvram
 FreeBSD9.vmx 手動  FreeBSD9.vmx
 FreeBSD9.vmsd 手動  FreeBSD9.vmsd
 FreeBSD9.vmxf 手動  FreeBSD9.vmxf

赤文字:稼働中のOSで使用青文字:バックアップ用に手動でコピー

仮想マシンの作成

GPTを使用するために仮想マシンのディスクを異なるdatastoreに作成します。

gpt01.jpg

gpt02.jpg

仮想マシンはdatastore1に保存します。

gpt03.jpg

gpt04.jpg

FreeBSDをインストールするので「その他」から「FreeBSD(64ビット)」を選択します。

gpt05.jpg

gpt06.jpg

gpt07.jpg

gpt08.jpg

gpt09.jpg

gpt10.jpg

「データストアまたはデータストアクラスタの指定」を参照よりdatastore1を選択します。

gpt11.jpg

gpt12.jpg

「完了時仮想マシンの設定を編集」にチェックをいれ続行を押します。

gpt13.jpg

仮想マシンのプロパティが表示されるので「追加ボタン」を押します。

gpt14.jpg

ハードディスクを選択して「次へ」を押します。

gpt15.jpg

gpt16.jpg

先ほどはdatastore1を選択したので、ここでは「データストアまたはデータストアクラスタの指定」を参照よりdatastore2を選びます。

gpt17.jpg

gpt18.jpg

gpt19.jpg

「終了ボタン」を押すと仮想マシンを作成します。

gpt20.jpg

これで、FreeBSDをインストールする仮想マシンの準備は完了です。少し長くなってしまったのでGPTを使用したインストールは次回にします。

FreeBSDのインストール方法はこちらに書いています。

2012年12月28日

Apacheでリバースプロキシ

現在このBLOGを公開するのに80番ポートを使用していますが、同じ80番ポートを使ってSRXの管理WEB画面や別のサーバで構築予定のOpManagerの画面をインターネットからアクセスするため、リバースプロキシを導入することにしました。

リバースプロキシとは

まず、通常のプロキシはユーザがインターネットに接続する際に通信の仲介を行うことで、アクセス制限を行ったり、キャッシュにより効率する目的で利用されますが、リバースプロキシはサーバの手前に設置され、代理応答することによりWEBコンテンツサーバの負荷を軽減したり、ユーザのアクセスを制限してセキュリティを向上させる目的で導入されます。

リバースプロキシの構築

今回apacheにプロキシのモジュールを組み込むことで、リバースプロキシを構築します。モジュールの作成にはapxsを使っています。

オペレーションシステム FreeBSD 8.2-RELEASE
WEBサーバアプリケーション apache-2.2.19

apacheでリバースプロキシを構築するためには、「mod_proxy」と「mode_proxy_http」が必要になります。これらはapacheのソースファイルに含まれています。ここではFreeBSDらしくportsでインストールしたapacheのソースファイルを使用しています。apacheのmake時にclean指定をしていなかったためソースファイルを残しています。

# cd /usr/ports/www/apache22/work/httpd-2.2.19/modules/proxy

プロキシモジュールをapxsを使ってインストール
# /usr/local/sbin/apxs -i -a -o mod_proxy.so -c mod_proxy.c proxy_util.c
/usr/local/sbin/apxs -i -a -o mod_proxy_http.so -c mod_proxy_http.c proxy_util.c

freebsdでは自動でコンフィグにLoadModeuleを追加してくれます。
# grep mod_proxy /usr/local/etc/apache22/httpd.conf
LoadModule proxy_module       libexec/apache22/mod_proxy.so
LoadModule proxy_http_module  libexec/apache22/mod_proxy_http.so
 

apxsを使用してproxyモジュールをインストールする際は、「proxy_util.c」も一緒にコンパイルしてください。そうしないとapacheの再起動の際にLoadModuleで以下のエラーが発生します。


httpd: Syntax error on line 106 of /usr/local/etc/apache22/httpd.conf: Cannot load /usr/local/libexec/apache22/mod_proxy_http.so into server: /usr/local/libexec/apache22/mod_proxy_http.so: Undefined symbol "ap_proxy_location_reverse_map"
 

httpd.confにリバースプロキシの設定を追加します。バーチャルホストを使ってますので実際にはhttpd-vhosts.confを修正します。設定のサンプルとして「test.or2.to」にアクセスした際に192.168.40.254に転送する設定にしています。

# vi /usr/local/etc/apache22/extra/httpd-vhosts.conf

<VirtualHost *:80>
    ServerName test.or2.to
    ServerAdmin root@xxx.xx
    ErrorLog /var/log/www/test-error.log
    CustomLog /var/log/www/test-access.log common
    <Location />
    ProxyPass http://192.168.40.254/
    ProxyPassReverse http://192.168.40.254/
    </Location>
</VirtualHost>
 

コンフィグチェックしてapacheを再起動します。

 
# apachectl configtest
# apachectl restart
 

apacheの再起動が完了したら、test.or2.toにブラウザでアクセスします。無事リバースプロキシを中継してsrxの管理画面が表示できました。ここでは記載していませんがDNSにtest.or2.toのAレコードを追加しています。

jweb01.jpg

本当は、BLOGと同じドメインを使いたかったのですが、リバースプロキシにリクエストするパスと、WEBコンテンツサーバに到達する際のパスが変わってしまうとリンクが動作しないため、BLOGとは別ドメインを使いました。

 

2012年12月15日

JUNOSのコンフィグをFTPで保存

JUNOSの設定を外部のFTPサーバにアップします。

基本構成

まずFreeBSDにFTPサーバをインストールします。今回はFTPサーバ定番のproftpdにしました。今回構築した環境は以下の通りです。

オペレーションシステム FreeBSD 8.2-RELEASE
FTPサーバ proftpd-1.3.4b

FTPサーバの構築

FreeBSDなので、いつものportsでサクッっとproftpdをインストールしてしまいます。

 
# cd /usr/ports/ftp/proftpd/
# make install clean
 

コンフィグですが、IPv6はこの環境では使っていないのでOFFにしていますが、それ以外はディフォルトのまま使っています。

# cat /usr/local/etc/proftpd.conf
 
#
# For more information about Proftpd configuration
# see http://www.proftpd.org/
#
# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use.  It establishes a single server
# and a single anonymous login.  It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.
 
ServerName                      "ProFTPD Default Installation"
ServerType                      standalone
DefaultServer                   on
ScoreboardFile          /var/run/proftpd/proftpd.scoreboard
 
# Port 21 is the standard FTP port.
Port                            21
 
# Use IPv6 support by default.
#UseIPv6                                on
UseIPv6                         off
 
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask                           022
 
# To prevent DoS attacks, set the maximum number of child processes
# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances                    30
 
CommandBufferSize       512
 
# Set the user and group under which the server will run.
User                            nobody
Group                           nogroup
 
# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
#DefaultRoot ~
 
# Normally, we want files to be overwriteable.
AllowOverwrite          on
 
# Bar use of SITE CHMOD by default
<Limit SITE_CHMOD>
  DenyAll
</Limit>
 
# A basic anonymous configuration, no upload directories.  If you do not
# want anonymous users, simply delete this entire <Anonymous> section.
 
#########################################################################
#                                                                       #
# Uncomment lines with only one # to allow basic anonymous access       #
#                                                                       #
#########################################################################
 
#<Anonymous ~ftp>
#   User                                ftp
#   Group                               ftp
 
  ### We want clients to be able to login with "anonymous" as well as "ftp"
  # UserAlias                   anonymous ftp
 
  ### Limit the maximum number of anonymous logins
  # MaxClients                  10
 
  ### We want 'welcome.msg' displayed at login, and '.message' displayed
  ### in each newly chdired directory.
  # DisplayLogin                        welcome.msg
  # DisplayFirstChdir           .message
 
  ### Limit WRITE everywhere in the anonymous chroot
  # <Limit WRITE>
  #   DenyAll
  # </Limit>
#</Anonymous>

FTPデーモンを起動します。

# /usr/local/etc/rc.d/proftpd start

FTPにログイン出来ない

始め、chrootの設定を有効にするために、proftpd.confの「#DefaultRoot ~」部分をコメントインしていましたが、以下のメッセージが出力されてFTPでログインできませんでした。

Dec 15 00:38:31 bsd proftpd[59720]: bsd.or2.to (192.168.40.128[192.168.40.128]) - error: FreeBSD with vulnerable chroot (FreeBSD-SA-11:07.chroot)
Dec 15 00:38:31 bsd proftpd[59720]: bsd.or2.to (192.168.40.128[192.168.40.128]) - chroot to '/usr/home/juniper' failed for user 'juniper': Operation not permitted
Dec 15 00:38:31 bsd proftpd[59720]: bsd.or2.to (192.168.40.128[192.168.40.128]) - error: unable to set default root directory
 

どうやら、freeBSDのいくつかのバージョンのlibcにおいて問題があるようです。回避策(Workaround)としては、chrootを使わない。または、パッチを当ててコンパイルし直す必要があるようですが、JUNOSのコンフィグバックアップしか使う目的がないので、proftpd.confの「DefaultRoot ~」をコメントアウトしました。詳細は以下のリンク先を参考にして下さい。

参考URL:Code execution via chrooted ftpd

JUNOSをFTPでコンフィグバックアップ

FTPサーバの準備が完了したら、ようやくFTPを使ったコンフィグ保存です。FTPサーバは「192.168.40.2」で、ユーザは「juniper」、保存するファイル名を「SRX100H_121215.conf」にしています。

 
juniper@SRX100H> configure
Entering configuration mode
 
[edit]
juniper@SRX100H# save ftp://juniper@192.168.40.2/SRX100H_121215.conf
Password for juniper@192.168.40.2: *******
ftp://juniper@192.168.40.2/SRX100H_121215.conf 100% of 55 kB 2109 kBps
Wrote 1928 lines of configuration to 'ftp://juniper@192.168.40.2/SRX100H_121215.conf'
 
[edit]
juniper@SRX100H#
 

サーバ上にファイルが保存されたことを確認します。

 
bsd# ls -l SRX100H_121215.conf
-rw-r--r--  1 juniper  wheel  56387 Dec 15 01:14 SRX100H_121215.conf
 

以上です。