FreeBSD Tips


FreeBSD周りのインストール時の自分用メモです。
用途が合う人がいたら、使ってください。

Contents

  1. mgetty+sendfaxのセットアップ(受信FAX編)
  2. GhostScriptを美麗にインストール
  3. natd
  4. dhcp server

mgetty+sendfaxのセットアップ(受信FAX編)

我が家にはFAXがあるので、あえてFAXモデムをつかって受信する必要はありません。

しかし、家庭用のFAXは感熱だったり、熱転写だったり、保存には向かないし、遅いことが多いと思います。保存を考えて我が家のFAXは、インクジェットのものを購入したのですが、このFAXは180dpiぐらいの一昔前のインクジェットプリンタと同様のメカニズムを使っているように見えます。NECのFAXなのですが、同社のインクジェットプリンタと同じインクを使うために、インクが3000円弱もするわりに、長くは使えません。また、セットしておける紙の枚数も非常に少ないのです。

ご存知かもしれないし、多分、感覚的に分かると思いますが、インクジェットプリンタは、個人が大事に使うための機械です。LANにつないで、みんなでごりごり使ってもらおうとすると、大抵すぐに寿命が尽きてしまいます。その点、レーザープリンタの方がタフで、みんながLANでちょっとしたドキュメントを印刷しても、早いし問題もあまりおきません。

Home Officeには、レーザープリンタがつながっていて、これは常に省電力モードとなって電源が入っています。このプリンタにFAXを受信すると、割合便利だと思い、FAXモデムをセットアップすることにしました。

1.portsを使う。

/usr/ports/comms/mgetty+sendfax/のものを利用する。

MakefileのFORBIDDENをコメントアウトすること。

コンパイルし、インストールする前に、FAXモデムがどこにつながっているか確認をしておく。tipなどでATコマンドを送り、FAXモデムが動くことは確認しておこう。tipでの操作は/etc/remoteを多少操作する必要があるかもしれない。

make installでは、さまざまな質問をするので適当に答える。電話番号やどのcomポートを使うかも聞いてくるのでちゃんと答えること。

2./etc/ttysを確認する。

cuaa? "/usr/sbin/mgetty ・・・・・・・以下略

というものが追加(あるいはリプレース)されているはずである。これはこのcomポートをたたかれたら、そのプログラムを起動する(依存する)という処理なのだが、makeのなかでinitにHUPコマンドは送ってないようなので、送っておく。

kill -HUP 1

とやり、mgettyがきちんと動ことも確認しておく。ps aux | grep mgettyとするといるときもあるが、cuaa?をたたかれない限り起動しないこともある。

とりあえずその番号に電話しFAXモデムが答えてくれれば良い。携帯電話などから適当にその番号へコールし、モデムが受話器を取ってFAXの受付音が流れ始めたら、切ってしまって良い。

3.適当に受信する。

わざわざ人の手を借りるのも面倒なので、出来れば何らかの端末からFAXが送信できるとよい。以前私は、ISDNの1番号めのFAXから2番号めのFAXMODEMに転送をかけたが、フレッツ契約時にルータにしたため、どうしても1ポートはつながってしまうためにそれは出来ない。

今回は、WindowsCEのPERSONAの付属ソフトでFAXを送信した。

FreeBSD側でFAXが正常に受信されると、今回のインストールでは、

/var/spool/fax/incoming/

の下に、g3FAX形式の画像ファイルで格納される。g3ファイルは、g3topbmでpbm形式に変換することが出来るので、

g32pbm fn????? | xv -

* g32pbmとg3topbmは同一で、mgettyによりインストールされたものである。したがって、ここまで一気に来たなら、rehashを忘れないこと。

で、pbm形式になり、xvで表示することが出来る。

4.受信と同時に印刷をしたいとき。

受信と同時に印刷をする場合、受信と同時にスクリプトを立ち上げてあげる必要がある。そのスクリプトは、デフォルトでは、

/usr/local/lib/mgetty+sendfax/new_fax

というシェルスクリプトである。このスクリプトの中で、受け取ったらすぐに印刷するとか、メールを送るとか、WEBで見れるようにするだとか、適当にやればよい。今回はまず印刷することを考える。

UNIXにインストールされたプリンタは、すべてPSプリンタ(あるいはgsによるクローン)であることを前提にすると、g3ファイルからpsファイルに変換をすれば、すべてのプリンタで印刷が可能になる。

mgetty+sendfaxの中には、g3topsという便利なソフトが、

/usr/ports/comms/mgetty+sendfax/work/mgetty-1.1.21/contrib

の中に入っているので、このソフトを使わせていただこう。ただし、メーリングリストに掲載されたと思われるフォーマットで記述されていて、最初にドキュメントらしきものが書いてある。適当にもとのg3tops.cのバックアップを取り(cp g3tops.c g3tops.c.org)、最初のほうのマニュアルをコメントアウトしよう。コンパイルは次のように行えばよい。

cc -pipe -O -o g3tops g3tops.c -I ../ -I ../g3/ ../g3/g3.o

コンパイルできたら、/usr/local/lib/mgetty+sendfax/にでも適当にコピーしておく。

そして、new_faxスクリプトを次のような感じで記述しておく。

#!/bin/sh

PATH=/usr/bin:/bin:/usr/local/bin

HUP="$1"
SENDER="$2"
PAGES="$3" 

G3TOPS=/usr/local/lib/mgetty+sendfax/g3tops

shift 3
P=1

while [ $P -le $PAGES ]
do
FAX=$1

$G3TOPS $FAX | lpr -P ps

shift
P=`expr $P + 1`
done

exit 0

どっかのサンプルから適当に改変して作ったのだと思うが、基本的なことだけなので分かりやすいとおもう。FAXログを残したり受信と同時にメールをしたり、WEBに児童掲載するなどしたいときには、ここから適当に編集するとよい。

意見がある方はこちら


GhostScriptを美麗にインストール

なにを美麗にインストールするかというと、美しい印刷のための必要最低限のインストールです。

まずは、FreeTypeVFlibghostscriptの関係を理解する必要あります。

ghostscriptは、いわゆるpostscriptクローンですが、そのままでは日本語フォントを、まともに使うことはできないと考えてよいと思います(CID Fontを使う方法はありますが、MacのCDを読んだりする必要があるので、ここでは記述しません。要望があったら記述します)。

今でこそ、日本語フォントは主にWindowsで利用するTrueTypeがたくさん出回っています。市販している大日本スクリーンヒラギノシリーズのフォントを購入すれば、PSプリンタ標準ともいえるモリサワフォントに匹敵するほどの美しいフォントフェイスを利用することが出来ます。

VFlibは日本語フォント周りを管理するためのドライバのようなものだと思えばよいと思います。これで、日本語フォントまわりに、TrueTypeどころか、書体クラブフォントをはじめ、いろんなフォントを使うことができるようになるのです。歴史的に日本語フォントの実装には苦労があったので、そのためにVFlibにはいろんなフォントを利用するよう実装されています。しかし、要は手っ取り早く、明朝とゴシックなどが綺麗に印刷できれば良いと考えている人が多いと思います。

VFlibはTrueTypeFontを使うことができますが、そのエンジンにはフォントのヒント情報を使うためのコードが無いそうです。ヒント状態がないフォント展開では、たとえばmの3本の縦棒の太さが小さな文字のときに揃わなかったりします。人間の目はバランスに対して厳しいので、そこに違和感を感じてしまいます。

そこで、もう少し賢いFreeTypeをつかいます。FreeTypeはフォントをバラしてビットマップ化するためのライブラリのようなものなので、それだけで日本語フォントを管理する機能はありません。そこで、TrueTypeの展開にFreeTypeを使い、VFlibで日本語フォントを管理するように、ghostscriptをコンパイルします。(注意、ただし全くWindowsと同じ展開をするわけではありません。)

そのままghostscriptをportsでインストールすると、Watanabeフォントを使うことになります。フリーで公開されているフォントに対して意見を言うのは気を引けますが、フォントはアーティファクトですのでやはり美しさで選びたいものです。PortsではFreeTypeを使わないようなので、順を追ってインストールします。

1.portsでFreeTypeのインストールをする。

/usr/ports/print/freetype/で普通にインストールするだけです。

2.portsでVFlibのインストールをする。

watanabeフォントをダウンロードすると、時間がかかるのでMakefileを編集して削除します。FreeTypeを使うようにします。

# diff Makefile.org Makefile
13,14c13,14
< DISTFILES= ${DISTNAME}${EXTRACT_SUFX} \
< watanabe-vf.tar.Z
---
> DISTFILES= ${DISTNAME}${EXTRACT_SUFX}
> # watanabe-vf.tar.Z
38,40d37
< ${MKDIR} ${PREFIX}/share/fonts/watanabe_font
< tar -C ${PREFIX}/share/fonts/watanabe_font \
< -xzf ${DISTDIR}/watanabe-vf.tar.Z

どのバージョンのdiffかわからないので、短いし手で編集するとよいでしょう。

3.VFlibでのフォントの指定

/usr/local/share/VFlib/2.25.1/vfontmapにて、truetypeフォントを指定します。truetypeフォントはどこにあってもよいです。細かい指定は、vfontmap内にあります。そこのgothとminを変更します。

たとえば、こんな感じです

min:\
:ft=freetype:\
:ff=/usr/local/share/fonts/dshirmn2.ttc:
goth:\
:ft=freetype:\
:ff=/usr/local/share/fonts/dshirkg2.ttc:

以上は、千都ヒラギノフォントのヒラギノ明朝2とヒラギノ角ゴシック2の指定です。

4.portsでVFghostscriptをインストールする

/usr/ports/japanese/vfghostscript55/にあります。古いバージョンだと、CIDフォントがつかえません。あたらしいものを使うことをお勧めします。

以上で日本語フォントが美しく印刷可能なghostscriptが出来上がります。日本語ドキュメントをa2psでレーザプリンタに出力したら、モリサワフォントを内蔵したPSプリンタに勝るとも劣らない品質で出力できるでしょう。

番外.afmフォントをインストールする

日本語は上記で完璧ですが、courierなどは代理フォントで出力されるため、本物のcourierと違い文字のステム(文字の線の幅)が揃ってないと思います。IllustratorなどをWindowsで使っていれば、そのディレクトリに本物のcourierやHelveticaが入っていると思います。Sun使いならどっかにDisplay PostScriptのためのフォントが入っています。しかし、このフォントの利用に対する規約がどうなっているかわからないので注意はしてください

予断ですが、英語フォントは法律的にフォントフェイスが著作権で保護できないそうで、別名で同じような形のフォントを作ることができます。ただし、フォントデータそのものはソフトウェアに及ぶ著作権で保護でき、フォント名は商標で保護できるとのこと。代理フォントは拡大したオリジナルフォントのアウトラインを取り、それを縮小したものが多いそうです。そういうデータはフォントのヒント情報がなく、ステム情報などが落ちているために、縮小したときに「m」の三本の線が不ぞろいだったりしてしまいます(もちろんmぐらいあとで編集すればなんとでもなりますが、そういうノウハウはオリジナルを作った人しかないということです)。上記の法律話は法律の専門家ではないので話半分で聞くこと。

英文のType1フォントは、オリジナルを使いたいと思います。

1.フォントファイル(*.pfb)とメトリックファイル(*.pfm)を、/usr/local/share/ghostscript/fontにコピーする。

2./usr/local/share/ghostscript/5.50vflib/Fontmapを書き換える。

持っているファイルによりますが、こんな感じの変更ですむでしょう。

#/Symbol /StandardSymL ;
/Symbol (sy______.pfb) ;
#/Times-Roman /NimbusRomNo9L-Regu ;
#/Times-Italic /NimbusRomNo9L-ReguItal ;
#/Times-Bold /NimbusRomNo9L-Medi ;
#/Times-BoldItalic /NimbusRomNo9L-MediItal ;
/Times-Roman (tir_____.pfb) ;
/Times-Italic (tii_____.pfb) ;
/Times-Bold (tib_____.pfb) ;
/Times-BoldItalic (tibi____.pfb) ;
#/Courier /NimbusMonL-Regu ;
#/Courier-Oblique /NimbusMonL-ReguObli ;
#/Courier-Bold /NimbusMonL-Bold ;
#/Courier-BoldOblique /NimbusMonL-BoldObli ;
/Courier (com_____.pfb) ;
/Courier-Oblique (coo_____.pfb) ;
/Courier-Bold (cob_____.pfb) ;
/Courier-BoldOblique (cobo____.pfb) ;
#/AvantGarde-Book /URWGothicL-Book ;
#/AvantGarde-BookOblique /URWGothicL-BookObli ;
#/AvantGarde-Demi /URWGothicL-Demi ;
#/AvantGarde-DemiOblique /URWGothicL-DemiObli ;
/AvantGarde-Book (agw_____.pfb) ;
/AvantGarde-BookOblique (agwo____.pfb) ;
/AvantGarde-Demi (agd_____.pfb) ;
/AvantGarde-DemiOblique (agdo____.pfb) ;
#/Helvetica /NimbusSanL-Regu ;
#/Helvetica-Oblique /NimbusSanL-ReguItal ;
#/Helvetica-Bold /NimbusSanL-Bold ;
#/Helvetica-BoldOblique /NimbusSanL-BoldItal ;
/Helvetica (hv______.pfb) ;
/Helvetica-Oblique (hvo_____.pfb) ;
/Helvetica-Bold (hvb_____.pfb) ;
/Helvetica-BoldOblique (hvbo____.pfb) ;

Courierだけ変更するだけで、一応a2psの英文字が本物のcourierになります。小さく印刷されるので文字のステムが揃って非常に綺麗です。

<余談>

私は、必要なソフト以外インストールすることがどちらかというと嫌いなタイプです。そういうことを前提に下記を読んでください。

ghostscriptは5.0以降、日本語のCIDフォントをType1フォントと同じ要領で利用することが出来ます。

今回はやりませんでしたが、CIDフォントのファイルが手に入れば、それをインストールすることでVFlibもFreeTypeも必要がなくなります。

しかし、CIDフォントはMacからプリンタにインストールして利用するもので、Macのファイルシステムのなかでしか存在しません。したがって、WindowsやUNIXのように、ファイルの実体を取り出すことは難しいと考えてよいと思います。Display PostScriptを持ったSunのOpenWindowでさえ、日本語フォントは平成明朝と平成ゴシックのTrueTypeです(ただしCID decodeエンジンは持っているようです。)

MacのCDROMを読むことが出来るツールを利用すると、いくつかのCIDフォントはフォントファイルの実体を取り出すことが出来ます。DynaFontは吸い出すことができ、規定の方法でgs5.50にインストールすると利用することができましたが、個人的にDynaFontを使うことが無いために実験だけ行なって利用しておりません。

ではモリサワフォントを購入してインストールすればモリサワリュウミンとモリサワゴシックBでPSプリンタの出来上がりではないか!と印刷にこだわる人は思うかもしれません。残念ながらモリサワフォントはMacにインストールする際も、ファイルが実体化することがないのです。CDROMには暗号化されて入っているためモリサワフォントのMac版CDROMを買っても、利用することが出来ません。たとえファイルを取り出すことが出来ても、暗号フォント(psにはそういう規格があるのです)になっているので、そのままではghostscriptでは使うことが出来ないのです。

ヒラギノフォントのCID版がMacで発売されたようで、DynaFontのように抽出可能なら、VFlibもTrueTypeも利用せずに日本語フォントが使えるでしょう。Mac用ヒラギノCIDフォントでは試したことがないので何もいえませんが。


natd

/etc/rc.confに、下記を書く

gateway_enable="YES"
natd_enable="YES"
natd_flags="-f /etc/natd.conf"
natd_interface="lnc0"

ここでlnc0は外側のNICのこと。設定ファイルを-f指定でファイルから読み込み、外側のNICをnatd.confにも書いてあるが、ここでinterfaceを指定しておかないとnatdが起動されない。ipfwと噛み合わせるためにはrc.firewallでも参照されているからだ。

/etc/natd.confに、下記を書く。

log yes
log_denied yes
same_ports yes
interface lnc0
redirect_address 192.168.1.10 202.212.33.66

ここでも外向きNICがlnc0。

最後の行はLAN内の192.168.1.10に、グローバルアドレス202.212.33.66(pool)を与えておいた。

このままでは、筒抜けなのでIPFWをあわせてセットアップしておくこと。

<余談>

ひとつのNICに複数のIPを指定する方法。(IP Alias)

ifconfig_ep1="inet B.B.B.1 netmask 255.255.255.0"

ifconfig_ep1_alias0="inet B.B.B.2 netmask 255.255.255.255"


DHCP Server

LAN内で、DHCPサーバを立てておくと、何かと便利である。マシンはせいぜい5台程度なので、すべて固定IPを与えたって良いのだが、知人がうちに来てマシンをセットアップしたり、モバイルを持ってきて、外(INTERNET)に出たいというときに、DHCPなら何も言わずにすむのがありがたい。

1.portsを使う。

 /usr/ports/net/wide-dhcp

/usr/ports/net/wide-dhcp/work/dhcp-1.4.0p6/server/README.jisより引用。

>DHCPサーバの実行には、アドレスプールを記述する/etc/dhcpdb.poolというファ
>イルと、リレーエージェントに関する情報を記述した/etc/dhcpdb.relayとい
>うファイルの二つが必要となります。

らしいです。英語に自信が無い方は、

/usr/ports/net/wide-dhcp/work/dhcp-*/server/にて、

nkf -e dhcps.8.jis | gzip -9 > /usr/local/man/ja/man8/dhcps.8.gz
nkf -e dhcpdb.pool.5.jis | gzip -9 > /usr/local/man/ja/man5/dhcpdb.pool.5.gz
nkf -e  dhcpdb.relay.5.jis | gzip -9 > /usr/local/man/ja/man5/dhcpdb.relay.5.gz

* jman のシステムをきちんと理解していないため、適当なことをしている可能性高し。

を読むと良いでしょう。

2.dhcpdb.poolの作成。

/usr/ports/net/wide-dhcp/work/dhcp-1.4.0p6/db_sample

に、ファイルと説明があるので、読むと良い。

/etc/dhcpdb.pool

# define a global entry which specifies the stuff every host uses.
global:!snmk=255.255.255.000:tmof=32400:

# define different master entries for each subnet. . .
# `dnsv' is IP address of DNS server.
# `dnsd' is domain name of your domain.
subnet255:tblc=global:rout=192.168.1.254:dht1=500:dht2=850:\
:brda=192.168.1.255:dnsv=192.168.1.1:dnsd=wizard.justplayer.com:

# entries for dynamic allocation (DHCP) DYNAMIC
4000: :ipad=192.168.1.200:dfll=3600:maxl=7200:tblc=subnet255:
4001: :ipad=192.168.1.201:dfll=3600:maxl=7200:tblc=subnet255:
4002: :ipad=192.168.1.202:dfll=3600:maxl=7200:tblc=subnet255:
4003: :ipad=192.168.1.203:dfll=3600:maxl=7200:tblc=subnet255:
4004: :ipad=192.168.1.204:dfll=3600:maxl=7200:tblc=subnet255:
4005: :ipad=192.168.1.205:dfll=3600:maxl=7200:tblc=subnet255:
4006: :ipad=192.168.1.206:dfll=3600:maxl=7200:tblc=subnet255:
4007: :ipad=192.168.1.207:dfll=3600:maxl=7200:tblc=subnet255:
4008: :ipad=192.168.1.208:dfll=3600:maxl=7200:tblc=subnet255:
4009: :ipad=192.168.1.209:dfll=3600:maxl=7200:tblc=subnet255:

要は参照されていて、サブネットマスク(snmk)、デフォルトルート(rout)、ブロードキャスト(brda)、DNS(dnsv)、ドメイン名(dnsd)を変更する。

ipadは、予約されるアドレスなので、列挙してよい。

あとは普通に起動スクリプトを書いてあげよう。