最終更新:2008/3/1

目次


はじめに

ここでは主に初めてFreeBSDを使う人を対象にシステムの更新とアプリケーションのインストールについて説明していきます。 FreeBSD自体のインストール方法については仮想マシンにおける環境構築をみて欲しい。 Virtual PC 2007を利用して起動して終了するまでの手順および基本コマンドを書いてあります。 実際のマシンにインストールする場合も同様の手順で行います。

特に断りがない限りFreeBSD 6.2を使うものとしています。 それ以外のバージョンの場合はコマンドがなかったり違う場所にあるかもしれません。 6.0や6.1の場合は6.2へアップグレードすることをお勧めします。 6.2は管理コマンドが最初からはいって便利になっています。 5.xから6.2への更新も可能ですがportsの再インストールなど付随作業が多いので考慮の上で実行してください。 またネットワークは当方の環境下で仮想マシン内に構築した場合の例であり、 利用している環境によってIPアドレスは異なります。 ブロードバンドルータなどが予め用意されており、 インターネットへは接続可能であると仮定します。


リモートログインをする

インストールの際にネットワークを正しく設定してSSHを利用許可してユーザーを最低1個作ってあれば、 リモートから接続することが可能になっています。 SSHを利用してログインするにはSSHに対応したソフトを用意する必要があります。 Windowsの場合はTeraTerm w/SSHの利用がお手軽です。TeraTermは下記より入手できます。 このソフトはBSDライセンスのオープンソース・ソフトウェアです。

http://ttssh2.sourceforge.jp/

UTF-8 TeraTerm Pro with TTSSH2をダウンロードして標準インストールします。 インストールが終ったら起動してみます。新しい接続の画面が表示されます。

ssh

ホスト名の欄にインストールしたFreeBSDのIPアドレスを入力します。 サービスがSSH、SSHバージョンがSSH2になっていることを確認します。 確認できたらOKを押して接続します。

認証前にセキュリティ警告がでます。 これは接続先のSSHサービスが以前利用したものと同じかどうかを確認するものです。 初めての接続では以前の記録がありませんので警告が出ることになります。 known hostsに記録することにより次回からは警告が出なくなります。 説明を読んだら続行を押します。

SSH2で利用される標準のホスト鍵は/etc/ssh/ssh_host_dsa_keyに格納されています。 この鍵が正しいかどうか確かめるにはコンソールからログインして

# ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key

と実行して表示される値と照合します。正しければ指紋が一致します。 この鍵を紛失しない限り再度警告は出ませんので、 万が一警告が出た場合はWindows(TeraTerm)かFreeBSD(SSH)のどちらかがおかしい事になります。 (第三者によりどちらかが改竄されたと言うことです)

SSH認証画面になったら、ユーザ名にインストール時に作ったユーザのいずれかを指定します。 チャレンジレスポンス認証を使うにチェックをいれて、OKを押します。 パスワード入力画面が出ますのでパスワードを入力し、エンターキーかOKを押します。 接続から認証確認までの制限時間(標準設定は2分間)がありますので、 すみやかに入力しないと接続が拒否される事があります。 その場合はもう一度、接続からやりなおします。

SSHに関する接続情報はヘルプのTTSSHを開くと確認できます。 特に設定を変えなければAES128ビット暗号が利用されます。

SSHというキーワードが出てきましたが、これはSecureSHellの略で、 リモート接続を暗号化して行うもので安全にデータのやり取りを行えます。 TeraTermはその名前の通りターミナル(入出力端末)として使う為のものですが、 SSHの暗号化経路をつかってファイル転送などもできます。

ファイル転送には専用のソフトを利用した方が便利です。 Windowsの場合はWinSCPなどが使えます。WinSCPは下記より入手できます。 このソフトはGNU General Public License(GPL)のオープンソース・ソフトウェアです。

http://winscp.net/eng/index.php

Downloadから「Multilanguage installation package」をダウンロードして標準インストールします。 インターフェイススタイルは好みで選択します。インストール後に自由に変更できます。 ノートンコマンダの方はローカルもリモートも一度に見れるので初めて使うならこちらの方が便利かもしれない。 エクスプローラの方はドラッグ&ドロップでの利用がメインであればいいかもしれない。 インストールが終ったらドラッグ&ドロップの機能を有効にする為にWindowsを再起動します。

WinSCPを起動したら、ホスト名とユーザ名に先ほどと同様に入力します。 ログインを押します。パスワード入力欄が出ますので、パスワードを入力してエンターキーかOKを押します。 フォルダ表示になったら環境設定>統合からクイックランチャーに入れておくと便利です。 ノートンコマンダ形式を選んだ場合は環境設定>環境>コマンダでエクスプローラスタイルの選択から 「マウスとキーボード」にしておくと普段のフォルダ同様の操作になります。

接続を終了させるにはセッションの切断を選択します。 もしくは右上の×(Windowsの終了ボタン)で終了します。 作業用フォルダの位置を保存しておきたい場合は終了前にセッションの保存を行います。 次回以降にこのセッションにログインするとすぐに目的のフォルダが開きます。

接続情報はコマンドのサーバ・プロトコル情報で確認できます。

各ソフトの具体的な操作方法やカスタマイズについてはここでは詳しく書きませんので、 必要であればヘルプを参照するなり他のサイトで調べてください。


時刻合わせをする

サーバの運用で必要なログなどにはマシンの時刻が記録されていきます。 この時間が大幅にずれていると、追跡が大変になるので時刻は正しく合わせておきます。 時刻を合わせるには ntpdate というコマンドを使います。

# ntpdate ntp.jst.mfeed.ad.jp

と実行すれば即座に時刻を同期してくれます。 ntp.jst.mfeed.ad.jp はインターネットマルチフィードが提供する時刻情報サービスです。 詳細は時刻情報提供サービス for Publicをご覧ください。 ※当然のことではあるが、DNSによって ntp.jst.mfeed.ad.jp のIPアドレスを解決できなければいけない。 エラーが出る場合はネットワークの設定をきちんと確認してください。

再起動時にこの作業を自動で行うには設定ファイルである /etc/rc.conf に設定を追加する必要があります。

/etc/rc.conf
ntpdate_enable="YES"
ntpdate_hosts="ntp.jst.mfeed.ad.jp"

この二行をファイルの最後に追加してあげれば次回起動時に実行してくれます。

なお、変動誤差が大きいマシンでは ntpdate 実行後に少しづつずれてしまうので、 時刻合わせを定期的に行うか常駐型のプログラムを利用しなければいけない。 この常駐してバックグラウンドで実行されるプログラムの事をデーモンと呼び、 各種サービスの提供を行います。 デーモンについては後々設定するとしてここでは省略します。


FreeBSDハンドブックを参照する

FreeBSDに限らず、製品には取り扱い説明書(マニュアル)がついてくるのが一般的です。 ネットからダウンロードして利用するソフトにも当然説明書はあります。 インストール時のdistributionにAllを選択していれば、 FreeBSDの説明書は /usr/share/doc というディレクトリに格納されています。 (最小構成の場合はインストールされてない可能性もあります) このファイル形式はHTMLで、英語はもちろん、日本語など各種言語に翻訳された物も含まれます。 サイズは約200MB(日本語だけでも約10MB)になります。 さすがにこれをすべて印刷して参照するのは現実的ではありませんので、 必要項目をブラウザで読むのが良いでしょう。

簡単に読むにはWindows上にファイルをすべてもってくる事です。 これなら普段お使いのブラウザ(Internet Explorer, Firefox, Opera など)ですぐに読むことができます。 一部のリンクが外部参照になっていたり、ファイルを指定している事があるかもしれませんが、 大抵のものは読むことができます。

FreeBSDのファイルをWindowsにコピーするには先ほどインストールしたWinSCPを利用します。 まずWinSCPで接続してください。 ノートンコマンダ形式であれば、ログイン直後は左側がマイドキュメント、 右側が自分のホームディレクトリになっています。 エクスプローラ形式であれば、ホームディレクトリになっています。

※ホームディレクトリは自分が作成したファイルなどを保存する場所で、 Windowsのマイドキュメントと同じような場所になります。 ISPやレンタルのホスティングサービスを利用した事がある人は public_html などのディレクトリを見かけた事はありませんか? FreeBSDでも同様に自分の作ったファイルを public_html にいれて Webサーバの設定を行うと使えるようになります。 サーバとしての各種設定などは別項目として後述します。

まずは説明書が格納されている /usr/share/doc に移動しなければいけません。 移動方法はいくつかありますが、ここではマウスクリックだけで移動します。 ホームディレクトリ側の上部のドロップダウンリストの中に「/ <ルート>」というのがありますので選択します。 ディレクトリとファイルが表示されますので、usr という項目をダブルクリックで選択して開きます。 その中にある share を選択して開き、さらに doc を選択して開きます。 日本語の翻訳版は ja_JP.eucJP という場所に格納されているのでこれをコピーします。 WinSCPはドラッグ&ドロップが可能ですので、このディレクトリをデスクトップでもマイドキュメントでも お好きな場所に放りこめばOKです。コピーの確認がでますので「コピー」ボタンをクリックします。 セッションのパスワードを聞かれる場合はログインするときのパスワードを入力します。

多数のファイルが存在しますが、最初はハンドブックから見るのが良いでしょう。 コピーしたフォルダ内の books をクリックして開き、その中にある handbook をさらに開き、 index.html をダブルクリックして表示します。 無事にブラウザで開くことができたら、お気に入りに追加するなり、 ショートカットをデスクトップに作るなりしていつでも参照できるようにしておきます。 FreeBSDの概要は第1章を、Unix系を初めて利用する人は第3章を参照してください。 以降の説明は第3章のUnixの基礎知識を前提にしていきます。 いきなり最初から理解するのは無理ですので、 必要に応じて第3章を読み返しながら進めてください。


FreeBSD Updateを利用する

どんなシステムでも多かれ少なかれセキュリティ脆弱性は発生します。 それらを修正する為の配布ファイル群をパッチと呼びます。 FreeBSD ではパッチを自動的にシステムへ適用する為の仕組みとして FreeBSD Update を持っています。 これらを手動で行うには、パッチの取得とインストールの2ステップを実行します。

# freebsd-update fetch
# freebsd-update install

更新に必要なファイル群は /var/db/freebsd-update に格納されますが、 普段は気にする必要はないでしょう。 インストールが完了したら再起動して、追加の更新がないか確認します。 もしまだあれば同様にインストールして、再起動します。

# freebsd-update fetch
Looking up update.FreeBSD.org mirrors... 1 mirrors found.
Fetching metadata signature from update1.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.
Preparing to download files... done.

No updates needed to update system to 6.2-RELEASE-p8.

執筆時点ではこんな感じになります。No updates needed が表示されたら終わりです。

システムを最新に更新する方法としては、 CVSup によるファイル更新と make buildworld による再構築の方法もあります。 既存システムを新バージョンにアップグレードするには再構築の手順を取ることになります。 こちらの方法は少々長くなりますので別項目として書きます。


Portsコレクションを最新にする

FreeBSD にサードパーティ製のソフトウェアを簡単にインストールするための仕組みとして、 Ports コレクションが用意されています。 これを利用することにより、 アプリケーションのインストールおよびアンインストール、 依存する関連ソフトの自動インストール、 必要な初期設定ファイルの雛形の用意などの支援を行ってくれます。 また、ソフトウェアのバージョンアップなども行われていきますが、 Ports コレクションを利用することにより最新版へのアップデートもほぼ自動化して行うことができます。

Ports コレクションはアプリケーションのダウンロード先や FreeBSD に必要なパッチなどを含んだ、 膨大な索引ページのような存在です。 これらは日々更新されていきますので、 アプリケーションのインストール前にまず Ports コレクションを最新にする必要があります。 初めて利用する場合は fetch および extract でファイルの取得と完全展開を行います。

# portsnap fetch extract

二回目以降は取得と更新(変更部分のみ)を行います。

# portsnap fetch update

更新に必要なファイル群は /var/db/portsnap に格納されますが、 FreeBSD Update 同様普段は気にする必要はないでしょう。 なお、初めての取得 (fetch) は大量のファイルをダウンロードする為にそれなりに時間がかかります。 二回目以降は変更された差分のみをダウンロードしますのでそんなに時間はかかりません。


Portsで入れたソフトを管理する(portupgradeのインストール)

Ports コレクションによりインストールされたソフトの一覧を見るには pkg_info コマンドを使います。 アップデートが必要なソフトを調べるには pkg_version コマンドを使います。

# pkg_info
bitstream-vera-1.10_2 Bitstream Vera TrueType font collection
expat-2.0.0_1       XML 1.0 parser written in C
fontconfig-2.3.2_6,1 An XML-based font configuration API for X Windows
 .
 .
 .
# pkg_version -v
bitstream-vera-1.10_2               <   needs updating (port has 1.10_4)
expat-2.0.0_1                       =   up-to-date with port
fontconfig-2.3.2_6,1                <   needs updating (port has 2.4.2_2,1)
 .
 .
 .

こんな感じで2007/11/11時点ではかなりのソフトがアップデートが必要(needs updating)と報告されます。 しかもエラーまで発生しています(汗) 本来であればこれらを一個づつ処理していくのですが、 さすがに大変なのでこれらを一括して管理できるソフトを導入します。

その名は portupgrade です。 これをインストールするには Ports コレクションから導入します。 ソフトの名前の一部もしくはすべてがわかっているが場所がわからない場合は、 膨大な索引の中から検索する機能を使います。

# cd /usr/ports
# make search name=portupgrade
Port:   portupgrade-2.3.1,2
Path:   /usr/ports/ports-mgmt/portupgrade
Info:   FreeBSD ports/packages administration and management tool suite
Maint:  sem@FreeBSD.org
B-deps: ruby-1.8.6.111,1
R-deps: db41-4.1.25_4 perl-5.8.8_1 ruby-1.8.6.111,1 ruby18-bdb-0.6.2
WWW:    http://wiki.freebsd.org/portupgrade
  .
  .
  .

大量に表示されますが、Port: の欄と Path: の欄に注目します。 Moved: が表示されたものは過去のバージョンから移動したことを表します。 ファイルが多すぎて流れてしまう場合は、ページャを併用します。

# cd /usr/ports
# make search name=portupgrade | less

このように実行することで、less による表示の制御が行えます。 Path: がわかったらそのディレクトリに移動します。 さらに make コマンドによりそのソフトのダウンロードと作成およびインストール作業を行います。

# cd /usr/ports/ports-mgmt/portupgrade
# make
(実行すると、オプション選択画面がでます。通常は変更しないで、
TABキーで[OK]に移動して、エンターキーで確定で良いかと思います)
# make install
 .
 .
 .
===>   Registering installation for portupgrade-2.3.1,2

最終的に「Registering installation for portupgrade-XXXX」のような表示がでたらインストール完了です。 このソフトの利用や構築に必要であった依存するソフトも一緒にインストールされています。 実際にインストールされたものは前述の pkg_info にて確認することができます。

# pkg_info
  .
  .
  .
portupgrade-2.3.1,2 FreeBSD ports/packages administration and management tool s
ruby-1.8.6.111,1    An object-oriented interpreted scripting language
ruby18-bdb-0.6.2    Ruby interface to Sleepycat's Berkeley DB revision 2 or lat
  .
  .
  .

構築作業に利用されたディレクトリは、通常は work というディレクトリに残されています。 (今回は /usr/ports/ports-mgmt/portupgrade でしたので、/usr/ports/ports-mgmt/portupgrade/work になります) インストール作業が終ったらこれはもう不要ですので、すべて削除します。 これを実行しないと、ディスクスペースがどんどん消費されていきます。

# make clean
  .
  .
  .
===>  Cleaning for portupgrade-2.3.1,2

とは言うものの、やはり忘れてしまうこともあります。 ディスクスペースが不足してきたら、いまインストールした portupgrade に付属する portsclean コマンドを利用します。

※シェルにはコマンドの検索パスを高速に処理するためにキャッシュが利用されています。 そのため、インストール直後のファイルが実行できない事があります。 このキャッシュをクリアするにはCシェルであれば rehash コマンドを実行します。 もしくは exit コマンドで一旦終了して、再度ログインすると利用できるようになります。
# portsclean -C

これで、すべての作業ディレクトリ work が削除されます。 Ports によりダウンロードしたファイルは /usr/ports/distfiles に恒久的に格納されていきます。 次回にオプションを変更して再構築する場合などはダウンロードせずすぐに構築作業ができるようになっています。 こちらも利用していくとディスクスペースが消費されますので、 もしいらなくなっているファイルがあれば削除できます。 ただし、依存関係をすべて調べるので作業には時間がかかります。

# portsclean -D

インストールしたソフトが目的に合わなかったなど、アンインストールしたい場合は、 削除したいソフトのディレクトリに移動して、deinstall を実行します。

# cd /usr/ports/ports-mgmt/portupgrade
# make deinstall
===>  Deinstalling for ports-mgmt/portupgrade
===>   Deinstalling portupgrade-2.3.1,2

もちろん portupgrade は今後の管理上必要ですので削除を試したら、 もう一度インストールしてくださいね。

ソフトがどの Ports に依存しているか調べるには、all-depends-list を実行します。

# cd /usr/ports/ports-mgmt/portupgrade
# make all-depends-list
/usr/ports/lang/ruby18
/usr/ports/databases/ruby-bdb
/usr/ports/lang/perl5.8
/usr/ports/databases/db41

Portsで入れたソフトを管理する(portupgradeによる作業)

portupgrade をインストールすると管理を補助するツールが多数インストールされます。 普段必要になるのは portversion, portinstall, pkg_deinstall あたりでしょうか。 portinstall を利用すると、場所がすでに分かっているソフトはディレクトリに移動することなく、 簡単にインストールできます。 pkg_deinstall を利用すると、依存していたソフトもまとめて削除してくれるので、 アンインストール作業が楽になります。

Ports コレクションを最新にしたら、まずは FreeBSD インストール時に一緒に導入されたものを最新版にします。 ソフトのアップデートを行う前に一度 /usr/ports/UPDATING に目を通すとよいでしょう。 特定のソフトで起こる問題について記載のある場合があります。

portversion を利用して必要な情報をみてみます。

# portversion -v | grep '<'
bitstream-vera-1.10_2       <  needs updating (port has 1.10_4)
fontconfig-2.3.2_6,1        <  needs updating (port has 2.4.2_2,1)
freetype2-2.2.1_1           <  needs updating (port has 2.3.5)
 .
 .
 .

grep コマンドを使って出力のうち '<' を含むもののみを表示させています。 portversion および grep のオプションについては man コマンドで確認してください。 ここでアップデートが必要と出ているものを個別にアップデートすることもできますし、 まとめて一括でアップデートも行えます。 せっかく portupgrade を導入したので、まとめてアップデートしてしまいます。 (実行するには /usr にある程度(800MBぐらいかな?)の空き容量が必要です) それでは実行と思って /usr/ports/UPDATING をよく見てみたら、 xorg 6.9 からはそのまま入らないらしい。

xorg 6.9 からのアップデートには特殊な設定が必要です。 /usr/ports/UPDATING によると、XORG_UPGRADE を設定しなければいけないようです。 さらに libXft を処理しないから先にあげてくれみたいなことが書いてある。 最後にいらなくなった xorg-manpages をすべて削除して旧ディレクトリを除去します。 下記の作業では途中で対話モードにならないように -m BATCH=yes オプションをつけてある。

# setenv XORG_UPGRADE yes
# portupgrade -Rf -m BATCH=yes libXft
# portupgrade -a -m BATCH=yes
# pkg_delete xorg-manpages\*
# sh /usr/ports/Tools/scripts/mergebase.sh

必要なファイルのダウンロードとインストールが実行されていきます。 最初はかなりの量をダウンロードしてインストールしなければいけないので、時間がかかります。 問題がなければすべて更新されるはずですが、だめな場合は個別に対処する必要があります。

/usr/ports/Tools/scripts/mergebase.sh を実行すると、 続行するか聞かれますので、yes と入力します。 実行する環境によってはコンフリクトが表示されます。

# sh /usr/ports/Tools/scripts/mergebase.sh
This script will attempt to backup /usr/X11R6 into
 .
 .
 .
Enter 'yes' to continue, anything else will exit script: yes
CONFLICTING FILES:
./man/whatis

Files that exist both in /usr/local and /usr/X11R6 have been found as shown abov
e. Merging will not continue.
 .
 .
 .

こんな感じで ./man/whatis のみ表示されているならば正常です。 このファイルは毎週自動で作成されるファイルなので削除しても問題ないです。 また、コンフリクトした場合は /tmp/mergebase.XXXXXXXX というファイルが残されるのでそれも削除します。

# rm /usr/X11R6/man/whatis
# rm /tmp/mergebase.*
# sh /usr/ports/Tools/scripts/mergebase.sh
 .
 .
 .
Done.

アップデートが終ったら、portversion で確認してみます。 何も表示されなくなったら完了です。 しかし、Allインストールの仮想環境で以下の文章が表示されました。

# portversion -v | grep '<'
xorg-printserver-6.9.0_2    <  needs updating (port has 1.2.0,1)

Ports の Makefile に EXPIRATION_DATE=2007-12-25 と書かれているからなくなるのだろう。 使った事もないのでそのまま削除しました。

# pkg_deinstall xorg-printserver-6.9.0_2

もしも、XORG_UPGRADE を設定せずに portupgrade を実行してしまった場合は、 エラーで止まってしまいます。 その場合は、まず libXft に依存するものをすべて削除してから、 新規インストールして続けます。 (それでもだめなら xorg の削除と新規インストールが必要かもしれない)

# pkg_deinstall -r libXft
# setenv XORG_UPGRADE yes
# portinstall -m BATCH=yes libXft
# portupgrade -a -m BATCH=yes
# pkg_delete xorg-manpages\*
# sh /usr/ports/Tools/scripts/mergebase.sh

xorg の移行が終了したら、後は必要時に以下の2ステップを実行すればいい。 (/usr/ports/UPDATING に 2007/11/01 以降の注意書きがされたらそれに従うこと)

# portsnap fetch update
# portupgrade -a -m BATCH=yes

日本語マニュアルのインストール

システムの更新がおわったら、やはり日本語マニュアルは欲しいところですよね。 初めて来た人には英語だけでは困ってしまうでしょう。 そこで、japanese/man-doc という Ports コレクションがありますのでこれをインストールします。

# portinstall japanese/man-doc
 .
 .
 .
* (1) To read jman(1), use the following command sequence:            *
*        % setenv LC_CTYPE ja_JP.eucJP                                *
*        % setenv PAGER jless                                         *
*        % jman jman
 .
 .
 .

しばらく待つと日本語マニュアルとそれを閲覧するために必要なコマンドがインストールされます。 最後に jman を読むために必要な設定が表示されます。この通りに入力すると日本語で見ることができます。 ※rehash はインストール直後のコマンドを検索する為に必要です。 詳細は jman tcsh で組み込みコマンドの rehash の部分を参照してください。

# rehash
# setenv LC_CTYPE ja_JP.eucJP
# setenv PAGER jless
# jman jman

文字化けするときは、TeraTerm の漢字コードがUTF-8になっていますので変更します。 設定>端末で漢字受信を EUC に変更して、「OK」ボタンを押す。 設定>設定の保存で、「保存」ボタンを押す。 再度、jman コマンドで見てみます。 日本語で表示ができたら、次は設定ファイルに追加します。

# ee ~/.cshrc

中ほどに EDITOR と PAGER という部分がありますのでその部分を書き換えます。 ついでにEDITORもeeに変更しておきます。

setenv EDITOR  vi
setenv PAGER   more
↓
setenv EDITOR ee
setenv LC_CTYPE ja_JP.eucJP
setenv PAGER jless

以上で、root の設定ファイルは変わりましたが、他のユーザは切り替わりません。 ホームディレクトリ(ログインした時の場所)にある .cshrc を同様に変更する必要があります。 .cshrc というファイルは個人設定のファイルですので各自が自由に変更することができるのです。 自分の設定も書き換えたい場合はいったんログアウトして自分のIDでログインして編集します。 編集したら保存して、ログアウトして再度ログインして確認してみます。


バックアップの作成とリストア

バックアップ作業は地味ではあるけど、非常に重要な作業のひとつです。 バックアップとリストアは物理消失からの回復を行う作業です。 バックアップが必要なデータと理由はさまざまですが、 ハード障害や誤操作による破損からの回復が主な理由になるでしょう。 さらに考慮するのであれば、天災による破損なども考える必要があります。

前述のハード障害のうち、ハードディスクドライブの単体故障であれば、 RAID1〜RAID5で組み上げることで回避できますが、 RAIDコントローラの故障、複数ドライブの同時故障、 リビルド処理の失敗などが発生した場合は、 そのRAIDボリュームを回復させるのは非常に困難になります。

設定ファイルの変更を行う前に稼動している現在のファイルを保存しておく などもバックアップの基本になります。 以下の作業はすべて root ユーザで行います。

単体ファイルをコピーしておくには cp コマンドで行います。 この時に元のタイムスタンプ(ファイルの作成時間)を保存するには -p オプションを使います。 rc.conf をバックアップしたい時には以下のようにします。 (rc.conf.backup は重複しない任意のファイル名)

# cp -p rc.conf rc.conf.backup

バックアップしたファイルから戻すには、以下のようにします。

# cp -p rc.conf.backup rc.conf

ディレクトリを丸ごとコピーするには -R オプションを使います。 この時にハードリンクは保存されませんので、 もしそのような情報も合わせて保持したい場合は tar コマンドなどを使う必要があります。 単一オプションはまとめて指定できるので、-p と -R は -pR のように指示できます。 /etc に含まれるファイルをすべて保存しておくには以下のようにします。 (/etc.backup は重複しない任意の名前)

# cp -pR /etc /etc.backup

バックアップしたディレクトリを戻すには、以下のようにします。 ここでは、完全に戻す為に元のディレクトリを etc.old として名前変更しています。

# mv /etc /etc.old
# cp -pR /etc.backup /etc

もしもリストアするファイル名がわかっているのであれば、 直接そのファイルを指定すればいい。 たとえば rc.conf を戻すには、以下のようにします。

# cp -p /etc.backup/rc.conf /etc/rc.conf

tar コマンドを使いディレクトリを保存するには、-c オプションを使い、以下のようにします。 ここでは、/etc.tar という単一ファイルに /etc の中にあるファイルをすべて保存しています。 -f オプションにより保存するファイル名を指定しています。 etc.tar という名前は任意でかまいませんが、 後から見てわかり易いように .tar という拡張子を使っています。 また、作業内容がわかりやすように -v オプションをつけて表示させています。 保存先の /etc.tar が書き出される領域には十分な空き容量が必要です。

# tar -cvf /etc.tar /etc

tar コマンドで作成したファイルを確認するには、-t オプションを使い、以下のようにします。

# tar -tvf /etc.tar

tar コマンドで作成したファイルを戻すには、-x オプションを使い、以下のようにします。 tar コマンドで戻す場所はデフォルトでカレントディレクトリからの相対パスになりますので、 現在の位置を間違えずに確認する必要があります。 また、既存ファイルは上書きされるので、注意が必要です。

# cd /
# tar -xvf /etc.tar

パーティション単位でバックアップするには、dump コマンドを利用します。 /var のパーティションを /var.dump というファイルに保存するには、以下のようにします。 ここで、/var は /etc/fstab に設定が存在しなければいけません。 設定が存在しない場合は /dev/ad0s1d のようなデバイス名を直接書く必要があります。 保存先の /var.dump が書き出される領域には十分な空き容量が必要です。 ここでは、オプションとして、-a -L -0 を指定しています。 -a は保存先のメディアが終了するまで書き続ける、 -L はマウントして稼動しているファイルシステムを対象にする事を教える、 -0 はダンプレベル0(フルバックアップ)を指示する。

# dump -aL0f /var.dump /var

dump コマンドで作成したファイルを確認するには、 restore コマンドと -t オプションを使い、以下のようにします。 restore コマンドはファイルの所有者や時間などの一時ファイルをTMPDIR配下(通常は /tmp)に置きますので、 十分な容量をあけておきます。

# restore -tvf /var.dump

dump コマンドで作成したファイルを戻すには、 restore コマンドと -r オプションを使い、以下のようにします。 戻す場所はカレントディレクトリになるので現在位置に注意します。 また、既存ファイルは上書きされます。 リストアが完了したら restoresymtable というファイルが残っていますので削除します。 このファイルは差分バックアップからリストアする場合に利用されます。

# cd /var
# restore -rvf /var.dump
# rm restoresymtable
セキュリティに注意

tar や dump コマンドでバックアップを作成する時に気をつけなければいけない事があります。 それはバックアップファイルのセキュリティを維持する事です。 上記のように何も考えないで作成すると、 誰でも参照できるファイルが作成されます。 もしもパスワードファイルなどがそこに含まれていると情報漏えいします。 実行のたびに umask 077 により自分以外が見えないようにしておきます。 元に戻すには umask 022 を実行します。 もしくは保存先のディレクトリが他者から見えないように最初に chmod 700 にしておけばいいです。

# umask 077
# dump -aL0f /var.dump /var
# umask 022
 .
 .
 .
# umask 077
# dump -aL0f /var.dump /var
# umask 022
 .
 .
 .
# mkdir /backup
# chmod 700 /backup
# dump -aL0f /backup/var.dump /var
 .
 .
 .
# dump -aL0f /backup/var.dump /var
 .
 .
 .

dump と restore のチェックをすると、 リストア確認したあとに削除できないファイルが存在する場合もあると思います。 これらは特殊なフラグが指定されている場合におこります。 たとえば /var/empty は変更禁止フラグがついています。 以下のように /tmp/test の中に /var システムをリストアして、 ディレクトリを削除するとエラーが出ます。

# cd /tmp
# mkdir test
# cd test
# restore -rvf /var.dump
# cd /tmp
# rm -rf test
rm: test/empty: Operation not permitted
rm: test: Directory not empty
#

これらのフラグを変更するには chflags コマンドを使います。 ここでは -R オプションで test ディレクトリ内のすべてに適用します。

# cd /tmp
# chflags -R noschg test
# rm -rf test
#

各種コマンドのオプションについて詳しくはそれぞれのマニュアルをみてください。

# jman tar ←tarコマンドの日本語マニュアルを参照

バックアップの作成とリストア(圧縮と分割)

バックアップに必要なコマンドの基本は前述の通りですが、 ディレクトリやパーティション単位の場合はサイズが大きくなりますので、 通常は圧縮コマンドを組み合わせて行います。 主な圧縮コマンドは gzip および bzip2 になります。 bzip2 は動作が遅いものの gzip より良好な圧縮率が得られる可能性が高いです。 これらのコマンドを組み合わせるにはシェルのパイプとリダイレクト機能を利用し、 ファイル名に - を指定して流し込みます。

圧縮の場合は、以下のようにします。 ファイル名はわかりやすいように .gz もしくは .bz2 を使っています。

# tar -cvf - /etc | gzip > /etc.tar.gz
もしくは
# tar -cvf - /etc | bzip2 > /etc.tar.bz2
# dump -aL0f - /var | gzip > /var.dump.gz
もしくは
# dump -aL0f - /var | bzip2 > /var.dump.bz2

伸張の場合は、以下のようにします。

# gzip -dc /etc.tar.gz | tar -xvf -
もしくは
# bzip2 -dc /etc.tar.bz2 | tar -xvf -
# gzip -dc /var.dump.gz | restore -rvf -
もしくは
# bzip2 -dc /var.dump.gz | restore -rvf -

gzip -dc や bzip2 -dc の変わりに gzcat や bzcat コマンドを利用することも可能です。

# gzcat /etc.tar.gz | tar -xvf -
もしくは
# bzcat /etc.tar.bz2 | tar -xvf -
# gzcat /var.dump.gz | restore -rvf -
もしくは
# bzcat /var.dump.bz2 | restore -rvf -

それでもサイズがまだ大きい場合には split コマンドで分割する必要があります。 split コマンドは -b オプションでサイズが指定できます。サイズには k もしくは m により、 それぞれキロバイト、メガバイトで指定できます。 デフォルトでは xaa, xab, xac, ... というようなファイルに分割されますので、 もし任意のファイル名を先頭に付けたい場合は、prefix として名前を指定します。

既存のファイルを10メガバイト単位で分割する場合
# split -b 10m /var.dump.gz
既存のファイルを10メガバイト単位で分割して、/tmp/var.dump.gz.aa などにする場合
# split -b 10m /var.dump.gz /tmp/var.dump.gz.
dumpして圧縮しつつ10メガバイト単位で分割して、保存する場合
# dump -aL0f - /var | gzip | split -b 10m - /tmp/var.dump.gz.

分割したファイルを元に戻すには cat コマンドでつなげて送ります。

分割ファイルを結合して一個のファイルにまとめる場合
# cat /tmp/var.dump.gz.* > /tmp/var.dump.gz
分割ファイルを結合しつつ伸張してリストアする場合
# cat /tmp/var.dump.gz.* | gzcat | restore -rvf -

ここまで一通り説明してきましたが、 バックアップ先のファイルは重複しないという前提で行っています。 分割した旧ファイルが残っている場合で、 以前より分割数が少ない場合は問題になりますので、 先に消去するなり、別の名前になるように保存します。 一般的には保存した日付などをいれて重複しないようにします。

あらかじめ消去する場合の例
# rm /tmp/var.dump.gz.*
# dump -aL0f - /var | gzip | split -b 10m - /tmp/var.dump.gz.
2007年11月23日の場合の例
# dump -aL0f - /var | gzip | split -b 10m - /tmp/var-20071123.dump.gz.

バックアップの作成とリストア(ネットワーク経由)

ディレクトリやパーティション単位でバックアップをとる時には、 バックアップファイル自体を含まないようにしないといけません。 一番簡単なのはハードディスクを二台装着して、 一台をバックアップ専用に使う事です。 二台用意できなかったり、装着自体できないような場合は、 ネットワークドライブの利用もしくはネットワーク経由で行う事を考える必要があります。 空きパーティションがある場合はその場所を利用する事もできます。

たとえば minerva というマシンに backup というユーザがあれば、ssh を使って、 以下のようにすると、ネットワーク経由(SSHなので暗号化経路)でバックアップ、リストアが実行できます。 ここでは、minerva の /usr/local/var/aquarius の中にバックアップファイルを作成可能としています。 (あらかじめ、/usr/local/var/aquarius を作成して、backup ユーザが書き込める状態にする必要があります。) cat コマンドは入力ファイルを表示するもので、受け取ったものをそのまま流しています。 ssh -l backup を使うと backup ユーザのログインパスワードを聞かれますので入力します。

あらかじめバックアップ先を用意する(操作例)
# ssh -l hogehoge minerva ←別マシンへリモート接続
> su ←rootユーザになる
# pw useradd backup -c "Backup User" -d / -s /bin/tcsh ←ユーザの追加
# passwd backup ←パスワードの設定
# mkdir -p /usr/local/var/aquarius ←ディレクトリの作成
# chown backup /usr/local/var/aquarius ←所有者を backup に変更
# chmod 700 /usr/local/var/aquarius ←アクセス権限を自分(backup)のみに設定
# exit ←rootユーザを終了
> exit ←リモート接続を終了
バックアップの場合
# dump -aL0f - /var | gzip | ssh -l backup minerva "cat > /usr/local/var/aquarius/var.dump.gz"
リストアの場合
# ssh -l backup minerva "cat /usr/local/var/aquarius/var.dump.gz" | gzcat | restore -rvf -

ファイルを分割する場合は cat コマンドのかわりに split コマンドを使います。 たとえば、DVD-Rには4.7GBの容量があります。 これは1k=1000なので、4.7GB=4.7*1000*1000*1000 となり、 2のべき乗単位(1k=1024, 1M=1024k, 1G=1024M)にすると、 4.377GB(=4482MB)になるので、 -b 4482m を指定します。 これらの計算には bc コマンドが使えます。

4.7GB を 1k=1000 から 1k=1024 に変換して計算
# echo "4.7*1000*1000*1000/1024/1024/1024" | bc -l
4.37721610069274902343
4.7GB を 1k=1000 から 1k=1024 に変換してMB単位で計算
# echo "4.7*1000*1000*1000/1024/1024/1024*1024" | bc -l
4482.26928710937500000000

分割したファイルはDVD-Rを書き込めるマシンに移動して、 それぞれDVD-Rに書き込みます。 リストアする場合は分割したファイルをすべてハードディスクに用意しておきます。

DVD-R用に分割して保存する場合
# dump -aL0f - /usr | gzip | ssh -l backup minerva "split -b 4482m - /usr/local/var/aquarius/usr.dump.gz."
分割ファイルをリストアする場合
# ssh -l backup minerva "cat /usr/local/var/aquarius/usr.dump.gz.*" | gzcat | restore -rvf -

バックアップの作成とリストア(差分バックアップ)

フルバックアップができるようになったら、 差分バックアップに挑戦してみます。 まずは用意として dump コマンドでフルバックアップをとる必要があります。 -u オプションを指定していると実行したダンプの日時が /etc/dumpdates に記録されていきます。 ここではスペースの都合上、/var パーティションについてのみ書きます。 通常はすべてのパーティションに対して行います。 また、/backup に二台目のドライブが接続されていると仮定します。

一番単純なレベル1のみを使っていく場合は以下のようにします。

# dump -aL0uf - /var | gzip > /backup/var.dump.gz ←フルバックアップ(Level 0)
  DUMP: Date of this level 0 dump: Sat Nov 24 10:23:01 2007
  DUMP: Date of last level 0 dump: the epoch
  DUMP: Dumping snapshot of /dev/ad0s1d (/var) to standard output
 .
 .
 .

# dump -aL1uf - /var | gzip > /backup/var-1.dump.gz ←差分バックアップ(Level 1)
  DUMP: Date of this level 1 dump: Sat Nov 24 10:23:32 2007
  DUMP: Date of last level 0 dump: Sat Nov 24 10:23:01 2007 ←ベースになっているレベルと時間
  DUMP: Dumping snapshot of /dev/ad0s1d (/var) to standard output
 .
 .
 .

レベル0は月の初めなどある程度の間隔で実行します。 保存されたフルバックアップの /backup/var.dump.gz は 差分バックアップの作成には必要ありません。 別の場所などに大切に保管しておきます。 差分バックアップは /etc/dumpdates に記録された日付があれば作成できます。 レベル1は必要な時に実行していきます。通常は毎日実行します。

こういう定型作業は crontab に設定することで繰り返し実行できます。 /etc/crontab をエディタで編集して最後の行に以下のような設定を追加します。 保存すると、cron が自動的(一分ごと)に読み込んでくれます。 この設定は毎日4時0分(24時間表記)にレベル1を、 毎月1日5時0分にレベル0を実行する場合の設定です。

/etc/crontab
# backup level 0 ←コメント行
0       5       1       *       *       root    dump -aL0uf - /var | gzip > /backup/var.dump.gz
# backup level 1
0       4       *       *       *       root    dump -aL1uf - /var | gzip > /backup/var-1.dump.gz
↑分    ↑時    ↑日    ↑月    ↑曜日  ↑実行ユーザ名 ↑コマンド列

cron で自動実行すると、その出力はメールとして root 宛てに届きます。 出力がいらない場合は /dev/null という特殊ファイルに出力することで破棄できます。

リストアの必要がでたら、 まずベースになるフルバックアップを戻して、 その後に差分バックアップを戻します。

# cd /var
# gzcat /backup/var.dump.gz | restore -rvf -
# gzcat /backup/var-1.dump.gz | restore -rvf -
# rm restoresymtable

個々のパーティションについて個別に設定しても動きますが、 crontab の見通しが悪くなるので、 あらかじめスクリプトファイルを作成して、 そのファイルを実行することでよりスマートに処理が行えます。 ここでは簡単にフルバックアップと差分バックアップ用の2個のファイルを作ります。

/backup/backup0.sh
#!/bin/sh

DUMPDIR="/backup"
EXT=".dump.gz"

umask 077
dump -aL0uf - / | gzip > $DUMPDIR/root$EXT
dump -aL0uf - /tmp | gzip > $DUMPDIR/tmp$EXT
dump -aL0uf - /var | gzip > $DUMPDIR/var$EXT
dump -aL0uf - /usr | gzip > $DUMPDIR/usr$EXT
/backup/backup1.sh
#!/bin/sh

DUMPDIR="/backup"
EXT=".dump.gz"

umask 077
dump -aL1uf - / | gzip > $DUMPDIR/root-1$EXT
dump -aL1uf - /tmp | gzip > $DUMPDIR/tmp-1$EXT
dump -aL1uf - /var | gzip > $DUMPDIR/var-1$EXT
dump -aL1uf - /usr | gzip > $DUMPDIR/usr-1$EXT

スクリプトが用意できたら、crontab を編集します。

/etc/crontab
# backup level 0
0       5       1       *       *       root    sh /backup/backup0.sh
# backup level 1
0       4       *       *       *       root    sh /backup/backup1.sh
↑分    ↑時    ↑日    ↑月    ↑曜日  ↑実行ユーザ名 ↑コマンド列

ダンプレベルは直前に実行した指定レベルより低い値をベースとして差分を作成します。 レベル0、レベル1に続けてレベル2とレベル3を実行すると以下のようになります。

# dump -aL2uf - /var | gzip > /backup/var-2.dump.gz ←差分バックアップ(Level 2)
  DUMP: Date of this level 2 dump: Sat Nov 24 12:01:42 2007
  DUMP: Date of last level 1 dump: Sat Nov 24 12:00:00 2007 ←ベースになっているレベルと時間
 .
 .
 .
# dump -aL3uf - /var | gzip > /backup/var-3.dump.gz ←差分バックアップ(Level 3)
  DUMP: Date of this level 3 dump: Sat Nov 24 12:01:52 2007
  DUMP: Date of last level 2 dump: Sat Nov 24 12:01:42 2007 ←ベースになっているレベルと時間
 .
 .
 .

この手順で作成したレベル3をリストアするには、ベースになっているレベル2のリストアが必要です。 レベル2のリストアをするには、ベースになっているレベル1のリストアが必要です。 レベル1のリストアをするには、ベースになっているレベル0のリストアが必要です。 最終的に以下のコマンドを実行すればレベル3まで戻ります。

# cd /var
# gzcat /backup/var.dump.gz | restore -rvf -
# gzcat /backup/var-1.dump.gz | restore -rvf -
# gzcat /backup/var-2.dump.gz | restore -rvf -
# gzcat /backup/var-3.dump.gz | restore -rvf -
# rm restoresymtable

パラメータを1個だけ受け取ってそれによってダンプレベルを変更するスクリプトです。 crontab と組み合わせて、こんな感じで使います。 曜日の数字は0が日曜日、1が月曜日、・・・、6が土曜日になります。

/backup/backup.sh
#!/bin/sh

DUMPDIR="/backup"
DUMPLEVEL="1"
EXT=".dump.gz"

if [ $# -gt 0 ]; then
  case "$1" in
    [1-9])
      DUMPLEVEL="$1"
      ;;
    -[1-9])
      DUMPLEVEL="${1#-}"
      ;;
    *)
      echo "Dump Level Error"
      exit 1
      ;;
  esac
fi

umask 077
dump -$DUMPLEVEL -aLuf - / | gzip > $DUMPDIR/root-$DUMPLEVEL$EXT
dump -$DUMPLEVEL -aLuf - /tmp | gzip > $DUMPDIR/tmp-$DUMPLEVEL$EXT
dump -$DUMPLEVEL -aLuf - /var | gzip > $DUMPDIR/var-$DUMPLEVEL$EXT
dump -$DUMPLEVEL -aLuf - /usr | gzip > $DUMPDIR/usr-$DUMPLEVEL$EXT
/etc/crontab
# backup level 0
0       5       1       *       *       root    sh /backup/backup0.sh
# backup level 1
0       4       *       *       0       root    sh /backup/backup.sh 1
# backup level 2
0       4       *       *       1       root    sh /backup/backup.sh 2
# backup level 3
0       4       *       *       2       root    sh /backup/backup.sh 3
# backup level 4
0       4       *       *       3       root    sh /backup/backup.sh 4
# backup level 5
0       4       *       *       4       root    sh /backup/backup.sh 5
# backup level 6
0       4       *       *       5       root    sh /backup/backup.sh 6
# backup level 7
0       4       *       *       6       root    sh /backup/backup.sh 7
↑分    ↑時    ↑日    ↑月    ↑曜日  ↑実行ユーザ名 ↑コマンド列

少し、補足しておきます。 別パーテイションにバックアップを作成するのが簡単でいいのですが、 稼動中のものを長時間落とせない場合などは無い袖は振れないので、 既存パーティション内に作らなければいけない事もあります。 そんな場合には、dump 対象から外したいファイルやディレクトリに nodump という特殊フラグをつけておきます。 これを誤って使うとバックアップされなくなるので注意が必要です。 さらにフルバックアップをとる場合は -h 0 オプションを指定します。 差分バックアップはデフォルトで nodump を対象にしませんのでDUMPDIRを指定するだけでOK。 たとえば、/usr/backup を作成してそこにバックアップを取るように計画した場合は、 以下のようにします。特殊フラグは ls コマンドに -l と -o オプションをつけると見えます。 当然ですが、ディスク容量が不足しないように注意します。

# mkdir /usr/backup
# chmod 700 /usr/backup
# chflags nodump /usr/backup
↑backup ディレクトリに含まれるすべてのファイルをdump対象から外します
# ls -lo /usr
total 58
drwxrwxr-x   2 root  operator  -       512 Nov 28 06:17 .snap
lrwxr-xr-x   1 root  wheel     -        10 Nov 11 20:22 X11R6 -> /usr/local
drwx------   2 root  wheel     nodump  512 Nov 26 23:04 backup
drwxr-xr-x   2 root  wheel     -      7168 Nov 11 18:40 bin
 .
 .
 .

もし、後々このバックアップディレクトリが不要になったら、dump フラグをつけて戻します。

# chflags dump /usr/backup
# ls -lo /usr
total 58
drwxrwxr-x   2 root  operator  -  512 Nov 28 06:17 .snap
lrwxr-xr-x   1 root  wheel     -   10 Nov 11 20:22 X11R6 -> /usr/local
drwx------   2 root  wheel     -  512 Nov 26 23:04 backup
drwxr-xr-x   2 root  wheel     - 7168 Nov 11 18:40 bin
 .
 .
 .
backup0.sh (nodump対応)
#!/bin/sh

DUMPDIR="/usr/backup" ←nodump フラグをつけたディレクトリを指定します
EXT=".dump.gz"

umask 077
dump -aL0uf - / | gzip > $DUMPDIR/root$EXT
dump -aL0uf - /tmp | gzip > $DUMPDIR/tmp$EXT
dump -aL0uf - /var | gzip > $DUMPDIR/var$EXT
dump -h 0 -aL0uf - /usr | gzip > $DUMPDIR/usr$EXT
↑-h 0 が指定されると nodump が付いたものはフルバックアップからも除かれます
backup1.sh (nodump対応)
#!/bin/sh

DUMPDIR="/usr/backup" ←nodump フラグをつけたディレクトリを指定します
EXT=".dump.gz"

umask 077
dump -aL1uf - / | gzip > $DUMPDIR/root-1$EXT
dump -aL1uf - /tmp | gzip > $DUMPDIR/tmp-1$EXT
dump -aL1uf - /var | gzip > $DUMPDIR/var-1$EXT
dump -aL1uf - /usr | gzip > $DUMPDIR/usr-1$EXT
backup.sh (nodump対応)
#!/bin/sh

DUMPDIR="/usr/backup" ←nodump フラグをつけたディレクトリを指定します
DUMPLEVEL="1"
EXT=".dump.gz"

if [ $# -gt 0 ]; then
  case "$1" in
    [1-9])
      DUMPLEVEL="$1"
      ;;
    -[1-9])
      DUMPLEVEL="${1#-}"
      ;;
    *)
      echo "Dump Level Error"
      exit 1
      ;;
  esac
fi

umask 077
dump -$DUMPLEVEL -aLuf - / | gzip > $DUMPDIR/root-$DUMPLEVEL$EXT
dump -$DUMPLEVEL -aLuf - /tmp | gzip > $DUMPDIR/tmp-$DUMPLEVEL$EXT
dump -$DUMPLEVEL -aLuf - /var | gzip > $DUMPDIR/var-$DUMPLEVEL$EXT
dump -$DUMPLEVEL -aLuf - /usr | gzip > $DUMPDIR/usr-$DUMPLEVEL$EXT

バックアップを分割して保存するには以下のようなスクリプトで行います。 先頭にあるSPLITSIZEという部分で分割サイズを指定しておきます。 参考として4482MBで分割するようになっています。 ファイル名の最後に . が付いていることに注意します。 (主に見た目の問題ですが…) これを付けないと root.dump.gzaa, root.dump.gzab のようにくっついてしまいます。 なお、バックアップサイズが指定サイズ以下の場合は aa に収まっています。

backup0.sh (分割対応)
#!/bin/sh

SPLITSIZE="4482m" ←分割するサイズを指定します
DUMPDIR="/backup"
EXT=".dump.gz"

umask 077
rm $DUMPDIR/root$EXT.* ←バックアップ作成前に旧ファイルをすべて削除します(以下同様)
dump -aL0uf - / | gzip | split -b $SPLITSIZE - $DUMPDIR/root$EXT.
rm $DUMPDIR/tmp$EXT.*
dump -aL0uf - /tmp | gzip | split -b $SPLITSIZE - $DUMPDIR/tmp$EXT.
rm $DUMPDIR/var$EXT.*
dump -aL0uf - /var | gzip | split -b $SPLITSIZE - $DUMPDIR/var$EXT.
rm $DUMPDIR/usr$EXT.*
dump -aL0uf - /usr | gzip | split -b $SPLITSIZE - $DUMPDIR/usr$EXT.
backup1.sh (分割対応)
#!/bin/sh

SPLITSIZE="4482m"
DUMPDIR="/backup"
EXT=".dump.gz"

umask 077
rm $DUMPDIR/root-1$EXT.*
dump -aL1uf - / | gzip | split -b $SPLITSIZE - $DUMPDIR/root-1$EXT.
rm $DUMPDIR/tmp-1$EXT.*
dump -aL1uf - /tmp | gzip | split -b $SPLITSIZE - $DUMPDIR/tmp-1$EXT.
rm $DUMPDIR/var-1$EXT.*
dump -aL1uf - /var | gzip | split -b $SPLITSIZE - $DUMPDIR/var-1$EXT.
rm $DUMPDIR/usr-1$EXT.*
dump -aL1uf - /usr | gzip | split -b $SPLITSIZE - $DUMPDIR/usr-1$EXT.
backup.sh (分割対応)
#!/bin/sh

SPLITSIZE="4482m"
DUMPDIR="/backup"
DUMPLEVEL="1"
EXT=".dump.gz"

if [ $# -gt 0 ]; then
  case "$1" in
    [1-9])
      DUMPLEVEL="$1"
      ;;
    -[1-9])
      DUMPLEVEL="${1#-}"
      ;;
    *)
      echo "Dump Level Error"
      exit 1
      ;;
  esac
fi

umask 077
rm $DUMPDIR/root-$DUMPLEVEL$EXT.*
dump -$DUMPLEVEL -aLuf - / | gzip | split -b $SPLITSIZE - $DUMPDIR/root-$DUMPLEVEL$EXT.
rm $DUMPDIR/tmp-$DUMPLEVEL$EXT.*
dump -$DUMPLEVEL -aLuf - /tmp | gzip | split -b $SPLITSIZE - $DUMPDIR/tmp-$DUMPLEVEL$EXT.
rm $DUMPDIR/var-$DUMPLEVEL$EXT.*
dump -$DUMPLEVEL -aLuf - /var | gzip | split -b $SPLITSIZE - $DUMPDIR/var-$DUMPLEVEL$EXT.
rm $DUMPDIR/usr-$DUMPLEVEL$EXT.*
dump -$DUMPLEVEL -aLuf - /usr | gzip | split -b $SPLITSIZE - $DUMPDIR/usr-$DUMPLEVEL$EXT.

上記スクリプトを適当な場所に置き、crontab で指定します。 もしも、nodump と分割の両方が必要であれば上記を参考に分割対応のスクリプトに、 -h 0 オプションの追加とDUMPDIRの修正をしてください。


起動ディスクのリストア手順

ここではシステム設定ミス等による起動不可能ではなく、 ディスクの物理故障により交換必須になったと仮定します。 もしもRAID故障の場合はその回復をまず試みてください。 それでもダメな場合は以下の手順で。

起動ディスクを交換して容量アップを行う場合もこの手順と同じように実行すればいいので、 ディスク交換直前にフルバックアップを取って作業するとよいでしょう。 二台のハードディスクが接続可能ならば、旧ディスクを二台目として接続しておけば、 バックアップファイルを用意する必要がなくなります。

起動ディスクが故障した場合、 リストアを実行するために必要なコマンド等を予め用意しなければいけないので、 インストール手順で最小構成を選択して起動できるシステムを作成します。 パーティションの割り当てサイズは同容量でなくて構いませんが、 構成(/tmp, /var, /usr などのマウントポイント)はできれば以前と同じにしておきます。 構成を変更する場合は、バックアップスクリプトなどを修正するのを忘れないようにします。 もしも以前の構成が不明な場合は、 仮構成で作成するか別のマシンで、 /etc が含まれるルートシステムをリストアして /etc/fstab を確認します。

こういう確認作業は VirtualPC 等で予備の FreeBSD を作成すると便利です。 あらかじめフルバックアップのファイルを確認するマシンに用意します。 ここでは /home/staff/root.dump.gz を用意できたものとします。

# mkdir /tmp/root ←確認に使うディレクトリを作成
# cd /tmp/root ←リストアする位置に移動
# gzcat /home/staff/root.dump.gz | restore -rvf - ←上記の場所にリストア
# cat /tmp/root/etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0s1b             none            swap    sw              0       0
/dev/ad0s1a             /               ufs     rw              1       1
/dev/ad0s1e             /tmp            ufs     rw              2       2
/dev/ad0s1f             /usr            ufs     rw              2       2
/dev/ad0s1d             /var            ufs     rw              2       2
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0
# rm -rf /tmp/root ←確認に使ったディレクトリを削除

以前の構成が読み取れたらその構成で新規インストールします。 この時に ChoseDistributions で Minimal を選択して最小インストールします。 間違えたら Reset を選択してクリアしてから選び直します。 Minimal を選択した場合はPortsコレクションの選択はありません。 それ以降は同じ手順で行います。細かい調整はリストアで戻るのでいりません。 ネット経由でバックアップファイルを送るならば、 IPアドレスとSSHができるユーザを1個だけ作成をします。

distmin

バックアップファイルを用意します。 ネット経由のバックアップマシンがある場合はそこから持ってきます。 ない場合はバックアップメディアからファイルをWinSCPなどでコピーします。 分割してある場合は結合しておきます。 (もちろん作業を間違えない自信があるなら分割のままでも構いませんが) ここでは /home/staff 以下に、 root.dump.gz, tmp.dump.gz, usr.dump.gz, var.dump.gz の4個があるとします。

準備ができたら、リストア作業を開始します。 まず再起動して、システムをシングルユーザモードで起動します。 起動時に出る以下のような画面でスペースキーを押すとカウントが止まります。 ここで、single user mode と書いてある番号のキーを押します。 この例では4番になりますので、4のキーを押します。

boot

起動するとログインシェルのパスを聞いてきますので、 /rescue/sh と入力してログインします。

Enter full pathname of shell or RETURN for  /bin/sh: /rescue/sh

コマンド編集機能を有効に使うためにオプションを設定します。 設定するとコマンドの履歴がカーソルキーの上下で見られるようになります。 繰り返し実行する時はこれを修正して実行します。

# set -o emacs

コマンドの実行パスに /rescue を追加します。 これを実行しない場合は各コマンドを /rescue/gzip, /rescue/restore のように毎回書きます。 /rescue のコマンドは外部ライブラリ(リストアされるかもしれない)を読み込まないので / のリストアをする場合は必須です。

# PATH=/rescue:$PATH

タイムゾーンを日本時間に設定します。

# /etc/rc.d/adjkerntz start

リストアするパーティションをマウントします。 ここでは最小インストールで用意したものをすべてマウントする為に、 -a オプションを指定して実行します。

# mount -a

実際にマウントできたかどうか df コマンドで確認します。 以下のように設定した/tmp, /usr, /var 等の Mounted がある事を確認します。 もちろん数字の部分は容量ですので環境によって違います。

# df
Filesystem  512-blocks    Used    Avail Capacity  Mounted on
/dev/ad0s1a    1015260   73672   860368     8%    /
devfs                2       2        0   100%    /dev
/dev/ad0s1e    1015260      24   934016     0%    /tmp
/dev/ad0s1f   24372188 3621580 18800836    16%    /usr
/dev/ad0s1d    4052060     384  3727512     8%    /var

各バックアップファイルを設定に合わせてリストアしていきます。

# cd /
# gzcat /home/staff/root.dump.gz | restore -rvf -
# rm restoresymtable
# cd /tmp
# gzcat /home/staff/tmp.dump.gz | restore -rvf -
# rm restoresymtable
# cd /usr
# gzcat /home/staff/usr.dump.gz | restore -rvf -
# rm restoresymtable
# cd /var
# gzcat /home/staff/var.dump.gz | restore -rvf -
# rm restoresymtable

もしも差分ファイルも戻す必要がある場合はそれぞれ戻します。 以下はレベル2まで戻す場合の例です。

# cd /
# gzcat /home/staff/root.dump.gz | restore -rvf -
# gzcat /home/staff/root-1.dump.gz | restore -rvf -
# gzcat /home/staff/root-2.dump.gz | restore -rvf -
# rm restoresymtable
# cd /tmp
# gzcat /home/staff/tmp.dump.gz | restore -rvf -
# gzcat /home/staff/tmp-1.dump.gz | restore -rvf -
# gzcat /home/staff/tmp-2.dump.gz | restore -rvf -
# rm restoresymtable
# cd /usr
# gzcat /home/staff/usr.dump.gz | restore -rvf -
# gzcat /home/staff/usr-1.dump.gz | restore -rvf -
# gzcat /home/staff/usr-2.dump.gz | restore -rvf -
# rm restoresymtable
# cd /var
# gzcat /home/staff/var.dump.gz | restore -rvf -
# gzcat /home/staff/var-1.dump.gz | restore -rvf -
# gzcat /home/staff/var-2.dump.gz | restore -rvf -
# rm restoresymtable

リストアが完了したら、/etc/fstab と現在のマウントポイントが合っているか確認します。

この例では /dev/ad0s1a が / にマウントされています。 同様に /dev/ad0s1e が /tmp に、/dev/ad0s1f が /usr に、/dev/ad0s1d が /var になっています。

# df
Filesystem  512-blocks    Used    Avail Capacity  Mounted on
/dev/ad0s1a    1015260   73672   860368     8%    /
devfs                2       2        0   100%    /dev
/dev/ad0s1e    1015260      24   934016     0%    /tmp
/dev/ad0s1f   24372188 3621580 18800836    16%    /usr
/dev/ad0s1d    4052060     384  3727512     8%    /var

df コマンドの表示が /etc/fstab の設定にある事を確認します。 もし違う場合は /etc/fstab を修正します。 構成を変更した場合は正しく修正しないと起動しなかったり、 違う場所にファイルが作成されたりします。

# cat /etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0s1b             none            swap    sw              0       0
/dev/ad0s1a             /               ufs     rw              1       1
/dev/ad0s1e             /tmp            ufs     rw              2       2
/dev/ad0s1f             /usr            ufs     rw              2       2
/dev/ad0s1d             /var            ufs     rw              2       2
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0

確認できたら、umount コマンドでマウントしたものを解除して、再起動します。

# cd /
# umount -a
# reboot

起動ディスクのリストア手順(二台接続)

二台接続した場合で違う部分の手順を書きます。 操作で同じ項目は前項を参照してください。 ここでは、ad0に新ディスクを、 ad2に旧ディスク(ad0として利用していたもの)を接続したと仮定します。 接続したドライブはシェルを入力する行の上あたりに表示されますので確認しておきます。

新しいディスクが起動できるように最小インストールを行います。 この時にパーティション構成も容量も合わせる必要はありませんが、 構成を変更する場合は、バックアップスクリプトなどを修正するのを忘れないようにします。 バックアップは旧ディスクから直接取れるので準備ありません。 再起動して、システムをシングルユーザモードで起動します。 /rescue/shでログインし、作業環境を設定して確認します。

Enter full pathname of shell or RETURN for  /bin/sh: /rescue/sh
# set -o emacs
# PATH=/rescue:$PATH
# /etc/rc.d/adjkerntz start
# mount -a
# df

ここから二台目にあるファイルを確認して作業します。 まず、旧ディスクのルートを /mnt に読み込み専用でマウントして fstabを確認します。 確認したら必要ないのでマウントを解除します。

# mount -r /dev/ad2s1a /mnt
# cat /mnt/etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0s1b             none            swap    sw              0       0
/dev/ad0s1a             /               ufs     rw              1       1
/dev/ad0s1e             /tmp            ufs     rw              2       2
/dev/ad0s1f             /usr            ufs     rw              2       2
/dev/ad0s1d             /var            ufs     rw              2       2
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0
# umount /mnt

Device が /dev/ad0 から始まるものを /dev/ad2 と置き換えて作業します。 それぞれフルバックアップを取りながら新規ディスクへリストアしていきます。 swap 領域は移動しません。

# cd / ←上記 Mountpoint の指定位置に移動してリストア
# dump -aL0f - /dev/ad2s1a | restore -rvf -
# rm restoresymtable
# cd /tmp
# dump -aL0f - /dev/ad2s1e | restore -rvf -
# rm restoresymtable
# cd /usr
# dump -aL0f - /dev/ad2s1f | restore -rvf -
# rm restoresymtable
# cd /var
# dump -aL0f - /dev/ad2s1d | restore -rvf -
# rm restoresymtable

リストアが完了したら、/etc/fstab と現在のマウントポイントが合っているか確認します。 確認できたらマウントを解除して、再起動します。

# cd /
# umount -a
# reboot

root 宛てメールを転送する

インストール直後は特にメール設定を行わなかったのですが、 root 宛てメールは普段ログインするアカウントに転送しておいた方が便利です。 su コマンドで root になって /etc/mail/aliases を編集します。 先頭に以下のような設定がありますので変更します。 ここでは staff というユーザに転送する例です。 staff の部分は自分で使っているユーザ名に変更します。 ※サーバがグローバルIPであれば、 ここに普段使っているメールアドレスを書くことで転送できます。 プライベートIPのサーバではメールの戻り先がないので、 プロバイダのメールアドレスを指定しても拒否される事があります。 (より正確に言うと、sendmailの既定値であるホスト名.ドメイン名が外部から参照できないといけない。)

/etc/mail/aliases
# root: me@my.domain
↓変更する
root: staff

変更したら newalias コマンドを実行して、 データベースを更新します。 これらの作業コマンドを羅列すると以下のようになります。

> su
# ee /etc/mail/aliases
# newalias
# exit
>

ドメインを取得して公開する

自分の作ったサーバをインターネットに公開するには、 最低グローバルIPアドレスが1個必要です。 このIPアドレスを直接指定して利用するのもいいですが、 より簡単にアクセスするにはドメイン名の指定がいります。 このIPアドレスとドメイン名を結びつけるにはDNSサービスが必要になります。

自分の好きなドメイン名を付けるには有料で取得しなければいけないのですが、 特定のドメイン名のサブドメインとして無料で利用できるサービスがいくつかあります。 その中で当方が利用しているMyDNS.JPを使う例を参考に書いておきます。 もし、自分のドメインを持っていて、 それを利用したいならばドメイン名をそれぞれ読み替えてください。

MyDNS.JP: http://www.mydns.jp/

MyDNS.JPを利用するにはユーザー登録をして、 MasterID と Password を取得する必要があります。 サイトへ行くと左側にメニューがあります。 「TERMS」に利用規約があるのでしっかり読みます。 「REGISTER」からユーザー登録を行います。 登録完了すると、 登録したメールアドレスに MasterID と Password が届きます。

サイトの右上に入力欄がありますので、 届いた MasterID と Password を入力して、 「LOG IN」をクリックしてログインします。

「DOMAIN INFO」から利用するドメイン名とホスト名を指定します。 無料のサブドメイン名を利用するには、 好きな名前.mydns.jp という形式でドメイン名を指定します。 好きな名前は半角の英数字(大文字小文字の区別はない)とハイフンから作ります。 たとえば、athena.mydns.jp のような名前にします。 ホスト名は何でもかまわないのですが、 一般的な www を指定しておけば問題ないでしょう。 他の人が使っているドメイン名は利用できませんので、 もし使われている場合は名前を変えて登録します。

利用しているIPアドレスをMyDNSへ通知します。 どの方法を使っても良いのですが、FreeBSD にはあらかじめ fetch というコマンドがありますので、 これをつかってFTPアクセスするのが楽でしょう。 ログイン情報ファイルとFTPアクセスのスクリプトファイルを用意して、 cron の設定を追加するとこんな感じです。

/etc/mydns.pw (パスワードが含まれるので chmod 600 /etc/mydns.pw をしておく)
machine www.mydns.jp
login xxxxxx ←xxxxxxの部分は自分のMasterIDを指定します
password yyyyyy ←yyyyyyの部分は自分のPasswordを指定します
/etc/mydns.sh
#!/bin/sh
fetch -N /etc/mydns.pw ftp://www.mydns.jp/ >/dev/null 2>&1
/etc/crontab(ファイルの最後に追加します)
# mydns update
*/10    *       *       *       *       root    sh /etc/mydns.sh

「LOG INFO」に更新情報が記録されていくので、 cron で正しく設定できたかチェックします。 「MyDNS.JP IpInfo Update!」という表示が出ていれば正常です。 存在しない場合は、IDとパスワードが正しいか調べて、 /var/log/cron でスクリプトが正しく起動しているか調べます。

この指定により、http://athena.mydns.jp/ や http://www.athena.mydns.jp/ の名前でインターネット側からアクセスできるようになります。 また、任意の名前@athena.mydns.jp といった形式のメールが扱えるようになります。 もちろんサーバの設定は必要です。(プライベートIPの場合はルータ設定も) 各種設定が終ったら、 インターネットが利用できる携帯が手元にあるならば試してみるとよいでしょう。

以下の説明ではここで設定した athena.mydns.jp に対して書きますので、 自分の設定したドメインに読み替えてください。 それではWebサーバのインストールと設定をどうぞ。