2009年6月15日月曜日

FreeBSD でサーバ構築 #9 BIND の設定

林檎生活100: FreeBSD でサーバ構築 #8の続き.BIND の設定ファイルである /etc/namedb/named.conf とドメインのゾーンファイルの書き方を説明する.

まずは,named.conf の書き方.といっても,デフォルトにちょっと追加するだけなので,詳しい文法は知らなくてもいいと思う.

1. 21行目の listen-on サブステートメントを次のようにコメントアウトする.
// If named is being used only as a local resolver, this is a safe dafault.
// For named to be accessible to the network, comment this option, spedify
// the proper IP address, or delete this option.
// listen-on { 127.0.0.1; };

これが記述されていると,BIND は localhost インタフェースに来た問い合わせ,つまり,ローカルからの問い合わせにしか応答しなくなる.なので,外からの自分が所有するドメイン(僕の場合は,legna.org だね.)への問い合わせを受け付ける必要があるので,インタフェースを限定しないようにコメントアウトする.

2. 自分が所有するドメインのゾーンファイルの場所などをファイル末尾に追記する.
zone "legna.org" {
type master;
file "master/legna.org";
allow-transfer {
71.6.202.218;
};
};

zone のあとの名前は起点名というもので,あとから重要になるのでドメイン名をそのまま使おう.マスタを示す type master; を記述して,ゾーンファイルへのパスを記述する.ゾーンファイルの名前は何でもいいが,ドメイン名が無難だろう.allow-transfer サブステートメントは,ゾーンの転送を許可するスレーブの IP アドレスを記述している.一応,everydns.net のを調べて記述しているが,不明な場合は次のように記述してもいい.allow-transfer のデフォルトは any だからだ.
zone "legna.org" {
type master;
file "master/legna.org";
};


named.conf の変更はこれだけだ.固定 IP 1つだけを取得していることを前提にしているので,逆引きゾーンなどの設定は省略させてもらう.

さて,それではゾーンファイルを書くことにしよう.僕の場合は,/etc/namedb/master/legna.org がゾーンファイルになる.今回はテンプレートがないので,スクラッチから記述していこう.

1. TTL(Time To Live: 生存期間)の記述
$TTL 3h

このゾーンへの問い合わせに対しての応答で,TTL に記述した時間だけ問い合わせもとサーバにキャッシュしておくように指示するという意味がある.まああまり気にしなくてもいい.3h は 3時間の意味.

2. SOA レコードの記述
まずは,次のような SOA (Start Of Authority) レコードを記述する.(ドメイン名のあとのドットを忘れないように.)
@ SOA lucifer.legna.org. hostmaster.legna.org. 2009061500 3h 1h 1w 1h

@は起点名 legna.org に置き換えられる.lucifer.legna.org. はネームサーバの記述で,hostmaster.legna.org. は hostmaster@legna.org ということでメールアドレスの記述で,ネームサーバの管理者の問い合わせ先ということだ.2009061500 はシリアル番号で,スレーブがゾーンデータを更新するときに参照するため,ゾーンファイルを更新したら必ず増加させよう.YYYYMMDDNN(年月日当日更新回数)で記述することで更新するたびにシリアル番号を確実に増加させることができる.

残りの4つの時間は,先頭からリフレッシュ,リトライ,期限切れ,ネガティブキャッシュ TTL を表す.それぞれ,スレーブがゾーンデータをチェックする間隔,リフレッシュ間隔が過ぎてもマスタにアクセスできなかった場合のリトライ間隔,ゾーンデータが無効になる期限,ネガティブキャッシュ(資源レコード集合やドメイン名の非存在をキャッシュする機能.)の生存期間を表す.

3. NS レコードの記述
NS(ネームサーバ)の前には,@が省略されている.つまり,legna.org. というものが省略されていると考える.僕の環境の場合は,次のように ネームサーバの情報を記述する.
          NS    lucifer.legna.org.
NS ns1.everydns.net.
NS ns2.everydns.net.
NS ns3.everydns.net.
NS ns4.everydns.net.

4. MX レコードの記述
MX(メールエクスチェンジャ)はメールサーバの構築のときに説明する.とりあえず,こんな感じに書いておく.
lucifer   MX 10 lucifer.legna.org.

5. A レコードの記述
A(ホスト)の前には lucifer と記述されている.末尾にドットがないので,起点名が付与されるので,lucifer.legna.org. になる.このレオードで IP とホスト名を関連づける.
lucifer   A     203.152.220.151

6. CNAME レコードの記述
賛否両論あるが,localhost と www はここで記述するのが好き.別名みたいなもの.
localhost CNAME localhost.
www CNAME lucifer.legna.org.

全部まとめるとこうなる.
$TTL 3h
@ SOA lucifer.legna.org. hostmaster.legna.org. 2009061500 3h 1h 1w 1h

NS lucifer.legna.org.
NS ns1.everydns.net.
NS ns2.everydns.net.
NS ns3.everydns.net.
NS ns4.everydns.net.

MX 10 lucifer.legna.org.

lucifer A 203.152.220.151

localhost CNAME localhost.
www CNAME lucifer.legna.org.

これで,ゾーンファイルの記述も完了.設定の反映と確認作業をつぎのようなかんじで行おう.
# /etc/rc.d/named restart
Stopping named.
Starting named.
# exit
$ nslookup lucifer.legna.org 0.0.0.0
Server: 0.0.0.0
Address: 0.0.0.0#53

Name: lucifer.legna.org
Address: 203.152.220.151
$ nslookup www.legna.org 0.0.0.0
(省略)
$ nslookup localhost.legna.org 0.0.0.0
(省略)

以上で,BIND の設定は完了.次回は,ルータのポート解放とゾーン転送,逆引き設定(インターリンクの場合のみ.)について書いて,BIND 編の最終回としたいと思う.そのあとは,メールサーバをやるぞ☆

参考文献:
DNS & BINDクックブック―ネームサーバ管理者のためのレシピ集
BIND 9 Administrator Reference Manual
RFC2308(日本語訳)
西村大介の KTYY でのページ: localhost 問題

追記(2009年6月22日):
MX レコードの表記を変更.Sendmail の回での説明のため.

追記(2009年10月13日):
DNS の回送について.ローカルで答えられない問い合わせをほかのネームサーバ(例えば,プロバイダのネームサーバ.)に回送する方法.僕のサーバでは,この設定をすることにした.プロバイダのサーバに任せた方が,キャッシュとか効いていいかなぁってw

その設定は,named.conf の該当箇所を次のように修正するだけ.forward ステートメントは,ローカルで答えられない問い合わせは回送して,再起的問い合わせをしないために only にする.forwarders ステートメントは,うちのブロードバンドルータの IP アドレスを指定し,ブロードバンドルータに解決を任せる.(そして,そのブロードバンドルータがプロバイダのネームサーバに回送するわけなんだけどねw)

// In addition to the "forwarders" clause, you can force your name
// server to never initiate queries of its own, but always ask its
// forwarders only, by enabling the following line:
//
forward only;

// If you've got a DNS server around at your upstream provider, enter
// its IP address here, and enable the line below. This will make you
// benefit from its cache, thus reduce overall DNS traffic in the Internet.
forwarders {
192.168.1.1;
};

2009年6月14日日曜日

C 言語の話#3 オブジェクト指向プログラミング?

オブジェクト指向プログラミング?を C言語でやってみた.オブジェクト指向プログラミングというよりも,カプセル化をやっているだけなのだけどねw

論じるよりソースを見てもらえると早い.やってみたのはこんなかんじのことだ.
/* main.c */
#include <stdio.h>
#include "book.h"

int main(void)
{
Book *book;

book = newBook("伝奇集", "J.L. ボルヘス");

printf("%s\t%s\n", book->getTitle(book), book->getAuthor(book));

deleteBook(book);

return 0;
}

new でつくって,アクセッサで値を参照して,delete で解放する.基本的なルールはこんなかんじ.

・「クラス名 *インスタンス変数名;」でインスタンス変数を宣言する.
・「インスタンス変数 = newクラス名(引数…);」でインスタンス化する.
・「インスタンス変数名->関数名(インスタンス変数名, 引数…)」で関数を呼び出す.
・「deleteクラス名(インスタンス変数名);」でインスタンスを解放する.

new と delete の対応に気をつけさえすれば,Book クラスのメモリのことを気にしなくていいようになっている.(理想としてはね.)

book.h と book.c の実装はこんな感じ.
/* book.h */
#ifndef __BOOK_H__
#define __BOOK_H__

typedef struct _Book Book;

struct _Book {
char *title;
char *author;
char *((*getTitle)(const Book *book));
char *((*getAuthor)(const Book *book));
};

Book *newBook(const char *title, const char *author);
void deleteBook(Book *book);

#endif /* __BOOK_H__ */
/* book.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "book.h"

char *book_getTitle(const Book *book);
char *book_getAuthor(const Book *book);

Book *newBook(const char *title, const char *author)
{
Book *book;

book = (Book *)malloc(sizeof(Book));
if (book == NULL) {
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}

book->title = (char *)malloc(strlen(title) + 1);
if (book->title == NULL) {
free(book);
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}
book->author = (char *)malloc(strlen(author) + 1);
if (book->author == NULL) {
free(book->title);
free(book);
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}

strcpy(book->title, title);
strcpy(book->author, author);

book->getTitle = book_getTitle;
book->getAuthor = book_getAuthor;

return book;
}

void deleteBook(Book *book)
{
free(book->author);
free(book->title);

free(book);
}

char *book_getTitle(const Book *book)
{
return book->title;
}

char *book_getAuthor(const Book *book)
{
return book->author;
}

こういう実装が好きでよくやるのだけど,もっといい方法があったら教えてほしい.

2009年6月13日土曜日

iTunes ライブラリを移動する方法

iTunes Music フォルダを移動する方法.新しい外付け HDD を買ったので,iTunes ライブラリを移動♪

1. iTunes>環境設定…>詳細の「"iTunes Music"フォルダの場所」を新しいフォルダに変更する.また,「"iTunes Music"フォルダを整理する」がチェックされていることを確認する.


2. ファイル>ライブラリ>ライブラリを統合…をクリックし,ポップアップウィンドウの統合をクリックする.




参考文献:
iTunes for Mac: 「iTunes Music」フォルダを移動する

LaCie 4big Quadra を購入

LaCie 4big Quadra 2TB を購入した♪RAID 5 を構築できるバックアップドライブがほしいなということで.


デザインもかっこよくて,とてもいい感じ.背面もすっきりしている.


RAID 5+Spare で使用する.3台で RAID5 を組み,1台は故障したときのスペアドライブとすることで,耐障害性の高い状態にした.アクセスも高速だし,とくに不満はない.

僕が行った初期設定はこんな感じ.

1. 電源をオンにする.
2. 前面 LED と背面 LED が青の点滅から青の点灯に変わる(正常起動)ことを確認し電源をオフにする.
3. 前面スイッチを押したまま起動し,前面 LED を赤と青の交互点滅(RAID 設定モード)状態にする.
4. 背面の+と-のスイッチを細いもので押し, RAID 設定番号を6 (RAID 5+Spare) にする.
5. 前面スイッチを押して,前面 LED を青の点滅にし,青の点灯になるまで待つ.
6. 電源を一度オフにし,再度電源をオンにする.
7. 前面 LED と背面 LED が青の点滅から青の点灯に変わることを確認する.
8. 電源スイッチを AUTO にする.(Mac の起動と 4big Quadra の起動を連動させるため.)

ほかの製品と比べても,こいつは大きいなぁ.まあ,4台 HDD が入ってるから当然なんだけどさ.


関連製品:
LaCie 4big QuadraAmazon で製品を見る

2009年6月12日金曜日

Inspiron Mini 12 のヒンジ破損

左側のヒンジが死亡した.普通にディスプレイを開いたら,ガリガリって音がして,ディスプレイがぐらつくようになってしまった.外側からわかる亀裂や破損はないんだけど,あきらかに左側のヒンジがずれてがたつく.


とりあえずテクニカルサポートに電話したら,破損部分の写真をメールで送ってくれと言われたので,メールに写真2枚を添付して送った.無償修理の対象内だといいなぁ.

3ヶ月しか経ってないのに,ヒンジ破損は残念だなぁ.筐体がちゃちぃのは仕方ないが,ヒンジは丈夫にしてほしい.

関連製品:
Dell Inspiron Mini 12Amazon で製品を見る

2009年6月3日水曜日

rc.conf の gateway_enable についてのメモ

FreeBSD の /etc/rc.conf に gateway_enable="YES" を追加すると,IP フォワーディング(この場合,あるインタフェースから別のインタフェースへの IP パケットの転送の意味.)が有効になる.ルータとして機能させるために必要な設定./etc/rc.d/routing というシェルスクリプトの87, 88行目のコマンドが,この設定によって実行される.
echo -n ' IP gateway=YES'
sysctl net.inet.ip.forwarding=1 >/dev/null

2009年6月2日火曜日

Inspiron Mini 12 で Age of Empires II Gold Edition

就活も終わったし,Age of Empires II Gold Edition を Inspiron Mini 12 でやるかぁと思ったら,動作しないことが判明した(泣)

原因は,搭載されている Intel GMA 500 にあるのではないかなぁと予想.いろいろ試行錯誤をしてみたが,お手上げだった.だれか動かした人がいたら教えてください.

関連製品:
Dell Inspiron Mini 12Amazon で製品を見る
Age of Empires II Gold EditionAmazon で製品を見る

追記(2009年9月15日):
ディスプレイドライバを無効にして,Windows 標準のディスプレイドライバで実行すると起動できた♪