[ サーバ構築 | FreeBSDトップ | FIVA ]


TIPS

daemon


Introduction

FreeBSDを運用していく上で便利なTIPS。
Single User Mode での起動

システム全般に関わる作業を実施する時等はシングルユーザモードで作業する。
シングルユーザモードで起動するためには、起動時の

Hit [Enter] to boot immediately, or any other key for command prompt
Booting [kernel] in 9 second...

のメッセージが表示されている時にEnter以外の任意のキーを入力し、 loaderのプロンプトokに対してboot -sと入力する。

Hit [Enter] to boot immediately, or any other key for command prompt
Booting [kernel] in 9 second...

Type '?' for a list of commands, 'help' for more detailed help.
ok boot -s

シングルユーザモードで起動する場合は、 起動処理の最後にシェルを問い合わせてくるので任意のシェルのフルパス名か、 /bin/shで良ければそのままEnterを入力する。

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

シェルを起動したら、ファイルシステムの正当性チェック(fsck)、 ファイルシステムのマウント(mount)、Swapの有効化(swapon)等 必要なコマンドを実行する。
これらのコマンドは通常の起動時はシステムが自動実行するが、 シングルユーザモードの場合は自動実行されないので明示的に起動する必要がある。

# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a

これでシングルユーザモードでの起動は完了。
Disk のデバイス名称

FreeBSD では IDEドライブは ad0ad1… SCSIドライブはda0da1…というデバイス名となる。 但し、USB接続のドライブの場合は全てSCSIとして扱われるので、 フロッピードライブやUSB Memory Key も da0da1…となる。
MS-DOS/Windows の世界で言うパーティションを FreeBSD では 伝統的にスライスという言葉で表現している。 各ドライブ内のスライスはs1s2…で示される。
MS-DOS/Windows で使用しているディスクを FreeBSD からアクセスするためには、 これらの名称をmount(8)コマンドの引数に指定して ファイルシステムとしてマウントする必要がある。 例えばプライマリ・マスターに接続されているIDEディスクの最初のスライスは /dev/ad0s1としてアクセスすることになる。
FreeBSD ではスライスを更にパーティションと呼ばれる単位に分割して 利用している。 パーティションはab…で示される。
パーティション名称は歴史的な慣習によりacは 以下の用途に使用される。

a ルートパーティション
b swapパーティション
c ディスク全体

MS-DOS/Windows の世界でのFDISK拡張パーティションは5番目以降の 通常パーティションとして扱われるので、 例えばIDEプライマリ・マスタ上の最初の拡張パーティションは /dev/ad05sでアクセスする事になる。
ssh-agent の設定

ssh(1) を使用する際のパスフレーズを ssh-agent(1) を利用して自動化する方法。

  • 公開キーの作成
  • rsarsa1dsa それぞれの認証鍵を作成する。

    $ ssh-keygen -d rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/XXX/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/XXX/.ssh/id_rsa.
    Your public key has been saved in /home/XXX/.ssh/id_rsa.pub.
    The key fingerprint is:
    00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 XXX@hostname
    $ ssh-keygen -d rsa1
    Generating public/private rsa1 key pair.
    Enter file in which to save the key (/home/XXX/.ssh/identity):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/XXX/.ssh/identity.
    Your public key has been saved in /home/XXX/.ssh/identity.pub.
    The key fingerprint is:
    00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 XXX@hostname
    $ ssh-keygen -d dsa
    Generating public/private dsa key pair.
    Enter file in which to save the key (/home/XXX/.ssh/id_dsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/XXX/.ssh/id_dsa.
    Your public key has been saved in /home/XXX/.ssh/id_dsa.pub.
    The key fingerprint is:
    00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 XXX@hostname

  • 公開鍵を結合
  • 作成した公開鍵を全てまとめて authorized_keysという ファイルを作成。

    $ cd .ssh
    $ cat *.pub > authorized_keys

  • 公開鍵を転送
  • 結合した authorized_key ファイルを接続先のホストに転送する。

    $ scp authorized_key remote-host:.ssh/authorized_keys

  • ssh-agentの起動
  • ssh-agent(1) を使用するためには 環境変数をいくつか設定する必要があるので、 ssh-agent-s を使用して bourne shell 系の環境変数を出力させる。
    ssh-agent を起動したら ssh-add を使用して パスフレーズを記憶させる。

    $ eval `ssh-agent -s`
    $ ssh-add
    Enter passphrase for /home/XXX/.ssh/id_rsa:
    Identity added: /home/XXX/.ssh/id_dsa (/home/XXX/.ssh/id_dsa)
    Identity added: /home/XXX/.ssh/id_rdsa (/home/XXX/.ssh/id_dsa)
    Identity added: /home/XXX/.ssh/identity (XXX@hostname)

  • ssh 用の設定ファイル作成
  • $HOME/.ssh/config ファイルに以下の記述をすると ssh-agent の認証が フォワードされるので便利。

    ForwardAgent yes


以上で ssh-agent の設定は終了。
パスフレイズ無しで ssh 接続

パスフレイズを入力しないで ssh(1)接続する方法。
セキュリティ上の観点からお勧めできないが、 どうしても必要な場合の設定方法を以下に示す。

  • 公開キーの作成
  • rsaの認証鍵を作成する。

    $ ssh-keygen -d rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/XXX/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/XXX/.ssh/id_rsa.
    Your public key has been saved in /home/XXX/.ssh/id_rsa.pub.
    The key fingerprint is:
    00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 XXX@hostname

  • 公開鍵を転送
  • 作成された id_rsa.pub ファイルを接続先のホストに転送する。
    接続先のファイル名は ~/.ssh/authorized_keysとする必要がある。

    $ scp id_rsa.pub remote-host:.ssh/authorized_keys


以上で設定は終了。
C debug macro

C言語で debug する際等に使用する可変引数なマクロの実現方法。
FreeBSD 固有の話題ではないが、 UNIX とは切っても切れない縁であるC言語の話題なのでここにメモする。

#define debug(...) fprintf(stderr, __VA_ARGS__)

こういう定義を書いておくと debug() マクロが可変引数として使用可能である。
sylpheed での POP before SMTP

sylpheed(1) で pop before smtp を利用する方法。
最近は SPAM 対策のために relay を禁止している smtp サーバが殆んどである。 もちろん、自分で管理している smtp サーバも pop before smtp としている。 しかし、現在のsylpheed(1) では pop bofore smtp に対応していないので、 以下の様にして暫定的に pop before smtp に対応している。
ただし、pop 用のパスワードを平文でファイルに保存してしまうので、 セキュリティの観点からは危険である。

  • fetchmail のインストール
  • ports 等を利用して fetchmail をインストールする。

  • fetchmail の設定
  • fetchmail で pop アクセスするために $HOME/.fetchmailircに以下の設定を行う。

    poll popサーバ
    username "popユーザ名"
    password "popパスワード"

  • signature スクリプトの作成
  • パスの通ったディレクトリに以下の様なスクリプトを用意する。

    #!/bin/sh
    fetchmail -s -c -d 5 popサーバ &
    echo <<EOF
    シグネチャ
    EOF

  • sylpheed の設定
  • アカウントの設定→作成タブで署名コマンドの出力とし、 上で作成したスクリプトを指定する。

上記の設定により、メイルの作成時に自動的に fetchmail が実行されるので 結果として pop アクセスにより smtp サーバが利用可能となる。
sendmail の Masquerade

NAT の使用や FireWall の内側で sendmail(8) を使用する場合、 envelop from のドメイン名が FQDN の場合はホスト名の解決ができないので、 メイルを送信できない場合がある。 そこで /etc/mail/sendmail.cf を適切に設定する事により、 envelop from のドメイン名を変更する必要がある。
sendmail に付属する m4 を利用した sendmail.cfの 生成ツールを使用する場合、以下の設定を追加する事により、 envelop from や Return-Path を変更する事ができる。

FEATURE(masquerade_envelope) envelope from の書き換え
FEATURE(masquerade_entire_domain) Return-Path の書き換え
FEATURE(local_no_masquerade) 自ドメインは masquerade しない
この設定をしないと自ドメイン宛のメイルは全て localhost に 配送されてしまう
MASQUERADE_AS(変更したいドメイン名) 変更するドメイン名

以下の設定を /etc/mail/freebsd.mc に追加して make(1) を実行すると FQDN.cfFQDN.submit.cf が作成されるので、それぞれを sendmail.cfsubmit.cf と 名称変更して sendmail(8) を再起動する。
VFlib のフォント追加

VFlib で特定の TrueType Font を使用するための設定を追加する。
まずはフォントファイルを任意のディレクトリにコピーし、 ttiと呼ばれるフォントインデックスファイルを作成する。

# cd /usr/X11R6/lib/X11/fonts/TrurType
# ttindex MY-mincho.ttf
# ttindex MY-gotcic.ttf

これでフォントインデックスファイルが作成される。
次にフォント情報を定義ファイルvfontcapに追加する。 vfontcap ファイルが存在するディレクトリは インストール方法やインストールしたバージョンによって異なるが、 FreeBSD 5.1-RELEASE の標準設定の場合は /usr/local/share/VFlib/2.25.6 にインストールされるので、このファイルをエディタで開き、設定を変更する。
明朝体の出力で使用されるフォントは min:から開始される行、 ゴシック体の出力で使用されるフォントはgoth:から開始される行で それぞれ定義されているので、fc=の後ろのフォント名を変更する。
fc=で指定する名称はフォントのタイプとフォントデータを格納した ファイル名がvfontcap で定義されている必要がある。

min:\

:fc=my-mincho:
goth:\

:fc=my-gothic:
my-mincho:\

fc=r-my-mincho:\
my-gothic:\

fc=r-my-gothic:\
r-my-mincho|My mincho font:\

ft=truetype:\

ff=/usr/X11R6/lib/X11/fonts/TrueType/MY-mincho:
my-gothic|My gothic font:\

ft=truetype:\

ff=/usr/X11R6/lib/X11/fonts/TrueType/MY-gothic:

最後に /usr/local/share/texmf/dvips/base/psfonts.mapで Ryumin-Light にはmy-mincho、GothicBBB にはmy-goticを使用する様に 以下の設定を追加すればよい。

rml Ryumin-Light-H <'r-my-mincho
gbm GothicBBB-Medium-H <'r-my-gothic
rmlv Ryumin-Light-V <'r-my-mincho
gbmv GothicBBB-Medium-V <'r-my-gothic

これで VFlib を使用した dvips等 でベクトルフォントが使用できる。
tcpdump のオプション

普段は滅多に使用しないが、ネットワーク系のトラブルが発生した際に 威力を発揮するツールの一つに tcpdump(1) がある。
滅多に使わないのでオプションを忘れてしまいがちなので、 備忘録がわりにここに残しておく。

# tcpdump -n -Xx -s 0 -i インタフェース

-Xx パケットを16進とASCIIで表示する。
-n アドレスを名前に変換しない。
-s 0 パケット長を制限せず全てのデータを表示する。
tar を利用したリモートコピー

通常は rsync(1) 等を使用するが、 GNU tar(1) と ssh(1) を使用して リモートホストにローカルサーバと同一の環境を構築する場合の コマンドライン引数を備忘録として残す。

# tar -C / -zcf - --force-local . | ssh リモートホスト tar -C / -zxpf - --forcelocal --unlink-first

-C / tar を実行する前に chdir するディレクトリを指定する
--forcelocal : が含まれているファイルも強制的にローカルホストとみなす
-p 保護情報(ファイルのパーミッション)を完全に設定する
--unlink-first ファイルを作成する前に削除する
/etc/mail/aliases の復活方法

sendmail(8)は alias を Berkeley DB の Hash 形式で管理しているが、 このdbファイルは /etc/mail/aliases ファイルを作成後、 newaliases(1)コマンドを実行して変換する。
操作ミスで/etc/mail/aliasesを削除してしまった場合等は、 perl(1)を使用して/etc/mail/aliases.dbから復活できる。 そんな奴いないって突っ込みは却下(笑)

#!/usr/local/bin/perl
# dbmopen() のファイル名は ".db" を指定しない
dbmopen(%aliases, "/etc/mail/aliases", undef);

while(($k, $v) = each %aliases){
    print "$k = $v\n";
}

dbmclose(%aliases);

とある方からmakemap(8)を使った方が早くて確実だと指摘を頂きました。
ご指摘ありがとうございます>S.O.さま

# makemap -u hash /etc/mail/aliases.db
無線LANの自動切替

複数の無線LANアクセスポイントで無線LANの設定変更を自動化する。
自宅と職場で無線LANを使用している場合に、 SSIDWEPKEY の設定を自動で変更するための設定を行う。 動作原理は SSIDWEPKEY の組み合わせで DHCPDISCOVER パケットを送信し、 DHCPOFER が正しく帰ってくるまで繰り返すらしい。
この便利な機能を使用するために/etc/dhclient.confに以下の設定を追加する。

interface "インタフェース" {

media "ssid SSID wepmode WEPMODE wepkey WEPKEY media DS/11Mbps",
:


"ssid SSID wepmode WEPMODE wepkey WEPKEY media DS/11Mbps";
}

無線LANカードの挿入時に dhclient(8) が自動実行される様に /etc/rc.confに以下の設定を追加する。

pccard_ifconfig "DHCP"
起動時の DHCP 処理

最近は DHCP で動的に IP アドレスを配布している LAN 環境が増えている。
出先で一々ネットワークの設定をしなくて済むので非常に便利なのだが、 ノートパソコンを持ち歩いている場合 LAN 環境がない状態で起動する事もあるので 起動時に DHCP を有効にしているとタイムアウトまで待たされるか Ctrl + C で起動時の DHCP を待つ必要がある。
これでは不便なので DHCP による IP アドレスの取得前に インタフェイスの状態を確認する様にするために、/etc/rc.d/dhclientに以下の設定を追加する。

# 追加

:
dhclient_prestart()
{

dhcp_list="`list_net_interfaces dhcp`"

for ifn in ${dhcp_list}; do # 追加


if ifconfig ${ifn} | egrep -q 'status:[[:space:]]*active'; then # 追加



tmp_list="${tmp_list} ${ifn}" # 追加


fi # 追加

done # 追加

dhcp_list="${tmp_list}"

if [ -z "${dhcp_list}" ]; then


return 1

fi

:

起動時に dhclient(8) が自動実行される様に /etc/rc.confに以下の設定を追加する。

ifconfig_インタフェース "DHCP"
rpm2cpio のオプション

Linux 用のアプリケイション等を liux emulator 経由で使用する際に 避けて通れない rpm 形式ファイルの展開方式。
ports から rpm2cpioコマンドを導入し、 以下のコマンドでディレクトリを展開する。

$ rpm2cpio rpmファイル | cpio -ivd
イメージファイルのマウント

cd の iso-image 等 ファイルシステムイメージをマウントするために、 FreeBSD 5系ではメモリディスク md(4) を使用する。
メモリディスクはmalloc(9)を利用して割り当てたメモリディスクや、 スワップ領域を利用したメモリディスクにも利用される。
mdconfig(8) コマンドでイメージファイルをデバイスに関連付けした後で、 mount(8) コマンドを使用して通常通りマウントし ファイルシステムにアクセスする。

# mdconfig -a -t vnode -f イメージファイル
# mount -t タイプ /dev/mdn マウントポイント

-a イメージファイルをデバイスに関連付けする
-t vnode デバイスへの関連付けをイメージファイルと指定する



Last Update: Oct. 19 2005 Copyright © Mitzyuki IMAIZUMI 2002,2004,2005 All Rights Reserved,