FreeBSD QandA 2004年4月9日 更新分
管理番号 2228 (更新)
更新履歴
Q. 乱数を得ようと rand(3) を使ったのですが、非常に質の悪い乱数が生成され
てしまいます。
A. FreeBSD の rand 関数は質の悪い乱数生成関数ですので、使わない方がよいで
しょう。
乱数を利用する場合、次の2通りの用途があります。
(1) Monte Carlo 法等のシミュレーション
再現性のある擬似乱数が必要です
(2) 暗号
乱数列が推測できてはいけません
(1) シミュレーション等に用いる擬似乱数
シミュレーション向けの擬似乱数については、2004年現在 Mersenne
Twister が最も良いでしょう。
<URL:http://www.math.keio.ac.jp/~matumoto/mt.html>
詳しくは「間違いだらけの擬似乱数選び」
<URL:http://www.soi.wide.ad.jp/class/20010000/slides/03/>
をご覧ください。
実装については、上記サイトで紹介されているものの他、C++ 版が boost
<URL:http://www.boost.org/>
(ports にもなっています: ports/devel/boost)
に含まれるほか、C# 版が
<URL:http://takel.jp/mt/>
で公開されています。言語によっては処理系や広く使われているライブラリで
提供されていることもあります。
(2) 暗号
暗号に用いる場合、簡単にいうと、生成される乱数列が推測できてはいけません。
FreeBSD では、/dev/random が利用できます。また、RC4 暗号に用いられる疑似
乱数生成関数 arc4random() も用意されています。それぞれ、ramdom(4)、
arc4random(3) のマニュアルを参照してください。
他にも OpenSSL で乱数生成用の API が提供されています (RAND_*)。engine(3)、
rand(3) 等、関連するマニュアルを参照してください。詳しいことは暗号関連の
参考書を調べてください。
なお、OpenSSL のマニュアル rand(3) はシステムの rand(3) 関数と重なって
いるので、man -a 3 rand と -a オプションを指定しないと読めないでしょう。
管理番号 2348 (新規)
更新履歴
Q. moused 経由で X にマウスイベントを送る設定にしたら、マウスカーソルは正
常に動くのですが、クリックのイベントが遅れます。
以前から使っている XF86Config そのままなのですが。
A. XFree86 4.2.0 の頃から、moused 経由で mouse を使う場合には XF86Config
の Protocol の行を、"sysmouse" ではなく "auto" とする必要があります。
たとえば、スクロールマウスの場合は、
Section "InputDevice"
Identifier "moused"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/sysmouse"
Option "Protocol" "auto"
Option "Buttons" "5"
Option "ZAxisMapping" "4 5"
EndSection
のように書きます
管理番号 2460 (新規)
更新履歴
Q. メディアタイプの自動認識がうまくいかない NIC の設定を、DHCP クライ
アントで行いたいと思っています。
メディアタイプの手動設定をするには、/etc/rc.conf において、
ifconfig_de0="media 100baseTX mediaopt full-duplex"
のように(通常はIPアドレスなども同時に設定しますが)、また DHCP クラ
イアントを起動するには、
ifconfig_de0="DHCP"
のように設定します。
これを両方同時に設定したいのですが、うまくいきません。
A. FreeBSDの起動時に実行されるネットワークインターフェース初期化スクリ
プトは、/etc/rc.conf の ifconfig_${ifn} の内容によって、各インター
フェースに対する処理内容を決定していますが、DHCP クライアントを起動
すのは、ifconfig_${ifn} が "[Dd][Hh][Cc][Pp]" である時だけです。
ですから、「DHCP クライアントを実行」しながら「 ifconfig(8) でメディ
アタイプを指定」という処理をするには、rc.conf(5) の設定だけでは無理
で、少し工夫が必要です。
(注) 以下「de0」は、お使いの NIC に合わせて適宜「fxp0」などに
読み替えてください。
まず、 /etc/rc.conf で
ifconfig_de0="DHCP"
と指定しておき、DHCP クライアント(デフォルトでは dhclient(8) ) が
起動するようにしておきます。メディアタイプの指定については、次の
二通りの方法がありますが、例として 100BaseTX / 全二重に設定する場合
を挙げます。
(方法その1)
メディアタイプを ifconfig(8) で手動設定する際のコマンドを、そのま
ま /etc/start_if.de0 に
ifconfig de0 media 100baseTX mediaopt full-duplex
のように記述します。DHCP クライアントの起動前に、初期化スクリプト
がこの内容を読み込んで実行してくれます。詳細は rc.conf(5) を参考
にしてください。
(方法その2)
DHCPクライアントに dhclient(8) を用いる場合、/etc/dhclient.conf に
interface "de0" {
media "media 100baseTX mediaopt full-duplex";
}
のように記述して、dhclient(8) 自身にメディアタイプを設定させます。
詳細は dhclient.conf(5) を参考にしてください。
管理番号 49 (更新)
更新履歴
Q. FreeBSD カーネルがお亡くなりになるのですが、これを開発者に伝えたいの
ですが
A. カーネルが吐き出すメッセージを記録するとき,何に注目したらよいか
「どんなメッセージを記録すべきか?」
<URL:http://www.nendai.nagoya-u.ac.jp/~kato/FreeBSD/debug/message.html>
「カーネルパニックを最大限に利用する」
<URL:http://www.freebsd.org/doc/ja_JP.eucJP/books/faq/hackers.html#KERNEL-PANIC-TROUBLESHOOTING>
「Kernel Debugging」
<URL:http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/kerneldebug.html>
などを参考にしてください。
管理番号 1012 (更新)
更新履歴
Q. base64 ってなんですか?
A. RFC2045 で規定されている、バイナリデータをメールなどで送る
ための、バイナリ <-> テキスト変換方式の一つです。base64 化
したデータは以下のようなテキスト形式になります。
f0VMRgEBAQkAAAAAAAAAAAIAAwABAAAAMC4TwDQAAAAkZTwAAAAAADQAIAAFACgA
GgAXAAYAAAA0AAAANAAQwDQAEMCgAAAAoAAAAAUAAAAEAAAAAwAAANQAAADUABDA
1AAQwA0AAAANAAAABAAAAAEAAAABAAAAAAAAAAAAEMAAABDAlVk1AJVZNQAFAAAA
ABAAAAEAAACgWTUAoGlFwKBpRcBYcgYANM0JAAYAAAAAEAAAAgAAAJDLOwCQ20vA
メールやネットニュースなどで、本文が base64 エンコードされて
いる場合、
Content-Transfer-Encoding: base64
というヘッダがつけられます。
MIME 対応のメーラー (Mozilla, Sylpheed, Mew, Semi-Gnus など)
を使うと、base64 化されたメールを扱うことができます。
コマンドラインから操作したい場合は、FreeBSD 付属の OpenSSL を
使うのがお手軽でしょう。
エンコード
% openssl enc -base64 -e < plain.txt > base64.txt
デコード
% openssl enc -base64 -d < base64.txt > plain.txt
また ports/packages にある、base64・mpack・uudeview でも
扱うことができます。
管理番号 175 (更新)
更新履歴
Q. フロッピー 1枚で起動する FreeBSD の作り方を教えてください。
A. こちらのサイトではブラウザ上で設定を行ない、フロッピー
イメージをダウンロードすることができます。proxy サーバ、
ゲートウェイサーバなどの用途に使えます。
<URL:http://www.floppy-1.com/>
自分でいろいろとカスタマイズしたい方は PicoBSD がおすすめです。
<URL:http://people.freebsd.org/~picobsd/picobsd.html>
管理番号 67 (更新)
更新履歴
Q. RFC の和訳 (日本語訳) はありますか?
A. RFC ならびに Internet Draft を和訳するプロジェクトが複数存在します。
それぞれ扱う分野が違うので、適切に参照しましょう。
<URL:http://rfc-jp.nic.ad.jp/>
<URL:http://www.ipa.go.jp/security/rfc/RFC.html>
<URL:http://www.imasy.or.jp/~yotti/#rfc>
RFC 日本語訳へのリンク集
<URL:http://www5d.biglobe.ne.jp/~stssk/rfcjlist.html>
管理番号 140 (更新)
更新履歴
Q. プロファイラ・プロファイリングって何ですか? プロファイラの
使い方がわかりません。
A. プログラムの各関数が何回呼ばれ、実行時間がどれくらいかかったか
統計をとることをプロファイリングと言います。プロファイラは
その際に使用するツールです。
プログラムの高速化をしたい場合、手あたり次第に修正するの
ではなく、まずプロファイラで解析し、どこがボトルネックに
なっているか見極めましょう。
以下、C 言語でのプロファイリングの例を紹介します。
[ステップ 1]
プログラムをコンパイルするとき、-pg オプションを付けます。
% cc -pg hoge.c
もし
% cc -pg hoge.c
ld: -lc_p: no match
とエラーなった場合は、/usr/lib/libc_p.a がないと言われて
いますので、基本配布物である proflibs をインストールしま
しょう。
[ステップ 2]
コンパイルしたプログラムを実行します。
% ./a.out
カレントディレクトリに a.out.gmon というファイルが作ら
れているはずです (環境によっては gmon.out かもしれません)。
このファイルには、関数に入るときと出るときの時刻などの
情報が記録されています。
[ステップ 3]
統計結果を表示します。
% gprof a.out a.out.gmon
(略)
% cumulative self self total
time seconds seconds calls ms/call ms/call name
63.9 2.53 2.53 1 2534.18 2733.40 func1 [2]
5.0 3.32 0.20 1 199.22 199.22 func2 [7]
4.3 3.49 0.17 main [1]
3.4 3.63 0.14 664580 0.00 0.00 vfprintf [4]
(略)
func1 が全体の実行時間の 63.9% を占めているのに対し、
func2 は 5.0% であることがわかります。
func1 を 2倍高速化すれば、プログラム全体では 31% の実行
時間削減につながりますが、func2 を 2倍高速化した場合は
2.5% しか削減されません。
これにより、まずは func1 の高速化に着手すべき、という
結論が得られます。より詳細な情報は gprof(1) を参照して
ください。
gprof は、C 言語用のプロファイラです。他の言語でも、プロ
ファイラが用意されているはずです。例えば Perl なら DProf
パッケージを使います (p5-Devel-DProf として port/package
が用意されています)。
管理番号 1764 (更新)
更新履歴
Q. FreeBSD 4.x (4.8-RELEASE 以前)で kterm を使っているときに、vi など
で画面の文字がゴミとなって残ることがあります。
A. FreeBSD 4.x で画面制御ライブラリに ncurses(3) を使用するように
なったため、termcap(5) データベースの kterm に関するエントリに
潜んでいたバグが顕在化しました。
今のところ 2 通りの解決方法があります。
1) /usr/share/misc/termcap の kterm のエントリを以下のように修正し、
/usr/share/misc で cap_mkdb termcap を実行して下さい。
kterm|kterm kanji terminal emulator (X window system):\
:hs:es:ts=\E[?E\E[?%i%dT:fs=\E[?F:ds=\E[?H:\
:KJ:sc=\E7:rc=\E8:cs=\E[%i%d;%dr:TY=ascii:\
:eA@:as=\E(0:ae=\E(B:tc=xterm-r6:
2) $HOME/.termcap (なければ作成する) に以下の記述を追加し、
eval `tset -s` をシェルの初期化ファイルなどで実行して下さい。
ただし setuid/setgid された一部のプログラム( systat(1) , top(1)
など)には、このやり方では対応できません( ncurses(3) 参照)。
kterm|kterm kanji terminal emulator (X window system):\
:hs:es:ts=\E[?E\E[?%i%dT:fs=\E[?F:ds=\E[?H:\
:KJ:sc=\E7:rc=\E8:cs=\E[%i%d;%dr:TY=ascii:\
:eA@:as=\E(0:ae=\E(B:tc=xterm-r6:
なお 4.9-RELEASE からは、この修正が標準で /usr/share/misc/termcap
に入っています。
管理番号 2549 (新規)
更新履歴
Q. FreeBSD 4.9-RELEASE 以降及び 5.x-RELEASE で、kterm 上でページャや
エディタ等を起動して終了した時に、画面がこれらのプログラムを実行する
直前の状態に戻ってしまい、プログラム終了時の画面が参照できなくなり
ます。
4.8-RELEASE 以前では、プログラム終了時の画面がそのまま残ったはずな
のですが。
A. termcap(5) の kterm エントリにおいて、:tc= の示す先が旧来の xterm
から xterm-r6 に変更され、ti/te ケーパビリティが有効になったため
です。
4.8-RELEASE 以前のように、プログラム終了時の画面が残るように
するには、:tc= の前に :ti@:te@ を入れるのが簡単です。root に
なって、/usr/share/misc/termcap 中の kterm エントリの最後の行、
:eA@:as=\E(0:ae=\E(B:tc=xterm-r6:
これを次のように変更して、cap_mkdb(1) コマンドを実行してください。
:eA@:as=\E(0:ae=\E(B:ti@:te@:tc=xterm-r6:
参考: [FreeBSD-users-jp 77760] 4.9R の (j)less
[FreeBSD-users-jp 77765] Re: 4.9R の (j)less
管理番号 798 (更新)
更新履歴
Q. FreeBSD の各バージョンの配布ファイルの内容や変更点を調べたいのですが。
A. CVS リポジトリを CVSweb で見てください。
<URL:http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/>
例えば、/etc/rc の内容を見たい場合は
<URL:http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/etc/rc?lang=ja>
で、ファイルの変更履歴を見ることができます。
また FreeBSD 3.2-RELEASE で配布された /etc/rc を見たければ、
RELENG_3_2_0_RELEASE というタグを探します。
1.169.2.11 Mon May 3 8:13:26 1999 UTC by grog
CVS Tags: RELENG_3_2_PAO_BP, RELENG_3_2_0_RELEASE, RELENG_3_2_PAO;
Branch: RELENG_3
ですね。
/etc/rc の 4.1-RELEASE と 4.2-RELEASE との変更点を見たければ、一番下の
Diffs between ... and ....
とあるところで、一方の SELECT BOX で「RELENG_4_1_0_RELEASE」を、もう
一方で「RELENG_4_2_0_RELEASE」を選択し、「Get Diffs」ボタンを押すと
<URL:http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/etc/rc.diff?lang=ja&r1=1.212.2.4%3ARELENG_4_1_0_RELEASE&tr1=1.1&r2=1.212.2.8%3ARELENG_4_2_0_RELEASE&tr2=1.212.2.23&f=u>
という差分が得られます。
FreeBSD は、最先端の開発は -CURRENT で、安定版は -STABLE で、
というふうに2本立てで行われています。
<URL:http://www.jp.FreeBSD.org/www.FreeBSD.org/doc/ja_JP.eucJP/books/handbook/current-stable.html>
2004/01/07 現在では、5-CURRENT/4-STABLE となっています。
<URL:http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/etc/rc?lang=ja>
で、
1.254 Sat Mar 10 5:33:37 2001 UTC by dougb
などとリビジョン番号 (バージョンのようなもの) が 1.xxx となっているものが
-CURRENT です。現在は 1.xxx = 5-CURRENT ですが、そのうち 1.xxx = 6-CURRENT に
なり、1.xxx = 7-CURRENT となっていくでしょう。
一方 -STABLE は
1.212.2.21 Wed Mar 7 20:13:56 2001 UTC by jkh
Branch: RELENG_4
のように「Branch: RELENG_4」とあり、1.xxx.y.zzz という形のリビジョン
番号になっています。
cvsweb では、-CURRENT/-STABLE の変更が時系列順に並んでいますので、注意して
下さい。4-STABLE のみの変更点を見たい場合は、一番下にある
ここでは一つのブランチの履歴だけを選んで表示することができます。
Branch: ...
というところで「RELENG_4」を選択し、「View Branch」ボタンを押します。
<URL:http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/etc/rc?lang=ja&only_on_branch=RELENG_4>
これが、4.0-RELEASE がリリースされてから、4-STABLE で /etc/rc に
加えられた全ての変更です。
cvsweb のブランチ表示はお世辞にもわかりやすいとは言えませんので、
分岐の仕方がよくわからなくなったら
<URL:http://cvsweb.allbsd.org/cvsweb.cgi>
からたどれる
<URL:http://cvsweb.allbsd.org/cvsgraph.cgi?r=freebsd&m=src&f=etc/rc>
の画像を見ましょう。この画像は cvsgraph というツールを利用して作成されて
います (devel/cvsgraph として ports/packages が用意されています)。
CVSについては [管理番号 649] を参照してください。
管理番号 4 (更新)
更新履歴
Q. FreeBSD に関する Web 上の情報源を教えてください。
A. FreeBSD プロジェクトの Web ページは
英語版 <URL:http://www.FreeBSD.org/>
日本語訳 <URL:http://www.FreeBSD.org/ja/>
日本のミラーサイトは、
英語版 <URL:http://www.jp.FreeBSD.org/www.FreeBSD.org/>
日本語訳 <URL:http://www.jp.FreeBSD.org/www.FreeBSD.org/ja/>
です。
日本語訳は、英語版に追いついていない場合があるので、最新の情報について
は英語版も確認した方がよいかもしれません。
それ以外の、FreeBSD 友の会による日本独自の情報は
<URL:http://www.jp.FreeBSD.org/>
にあります。
メーリングリストの紹介、メーリングリストや NetNews の過去メール検索、
daily Snapshots、watcher、QandA、その他が公開されています。
管理番号 1861 (更新)
更新履歴
Q. MSDOS 用パーティション (FAT) にある日本語ファイル名を扱うことは出来ますか。
A. A1.
FreeBSD 5.2-RELEASE から、 マウントする際に -L と -D オプションを指定
することで、マルチバイト文字を使ったファイル名が扱えます。例えば日本語
ファイル名を扱いたい時は、次のようにします。
# mount_msdosfs -L ja_JP.eucJP -D CP932 /dev/ad1s1 /mnt
ただし、
libiconv.ko
msdosfs_iconv.ko
モジュールを起動時に組み込むか、もしくは、
options LIBICONV
options MSDOSFS_ICONV
を追加してカーネルを再構築する必要があります。またどちらの場合でも、
libiconv (ports/devel/libiconv) のインストールも必要です。
詳細は [FreeBSD-tech-jp 3369] 、リリースノート、及び mount_msdosfs(8)
を参照してください。
A2.
以下の ports/packages にあるアプリケーションで、MSDOS 用パーティション
(FAT) の日本語ファイル名 (Unicode Long File Name) をサポートして
います。
1. ja-msdosfs (ports/japanese/msdosfs)
ports/japanese/msdosfs または packages の ja-msdosfs を導入し、
mount_jamsdos を使って FAT パーティションをマウントしてください。
日本語は EUC で表現されていますので、アプリケーションが EUC を扱
うことができれば、cp や tar などのコマンドを普通に使うことができ
ます。(4.2-RELEASE 以降)
<URL:http://www.linkclub.or.jp/~clover/msdosfs.html>
補足: 起動時にマウントするには...
/modules 以下に msdos_ja.ko が存在していていれば、mount_jamsdos
を実行した時点でモジュールがロードされます。起動時に間違いなくマウント
するためには mount_jamsdos を /sbin に置くべきですが、ports によっ
て /sbin, /modules をいじるのはまずいので、自動ではなく手動
(/usr/local/etc/rc.d/ja-msdosfs.sh) でロードするように作られています。
そこで、ブート時にマウントするのであれば、
# cp -p /usr/local/sbin/mount_jamsdos /sbin
# cp -p /usr/local/lib/ja-msdosfs/msdos_ja.ko /modules
# chmod a-x /usr/local/etc/rc.d/ja-msdosfs.sh
とした後に、/etc/fstab でマウントエントリを書く時に FStype を
jamsdos にしてください。
/dev/da0 /mnt msdos ro,nodev,noexec 0 0
^^^^^ ここを修正
再起動を行うと起動時にマウントされているはずです。
2. ja-mtools (ports/japanese/mtools) [管理番号 640]
GNU の mtools に Unicode LFN サポートを加えたものです。mtools に
含まれるコマンド (mdir や mcopy など) だけで取り扱うことができます。
3. fd (ports/shells/fd)
いわゆる FDclone です。DOS 時代の FD に似た (といっても知らない
人も多いかもしれませんが) CUI ベースのファイル操作ツールです。
<URL:http://hp.vector.co.jp/authors/VA012337/soft/fd/freebsd.html#msdos>
管理番号 124 (更新)
更新履歴
Q. moused を使用している時は XF86Config にはどう書けばよいのでしょうか。
A. <URL:http://www.xfree86.org/4.3.0/mouse3.html#6>
<URL:http://xjman.dsl.gr.jp/xf86_3/mouse-3.html#ss3.3>
に書いてありますが、moused を使用しているときは、マウスの種類に関わら
ず、XF86Config には
Protocol "Auto"
Device "/dev/sysmouse"
と書きます。
管理番号 2567 (新規)
更新履歴
Q. ssh で remote login した jail で X アプリケーションを実行すると、
次のエラーが出て実行できません (FreeBSD 4.9-RELEASE で確認)。
% xterm
X11 connection rejected because of wrong authentication.
X connection to localhost:10.0 broken (explicit kill or server shutdown).
A. 原因はよく分からないのですが、/etc/ssh/sshd_config に
X11UseLocalhost no
という設定を行なえば起動できるようです。
この変更に伴い、DISPLAY 環境変数が「localhost:10.0」から
「ホスト名:10.0」に変わります。
管理番号 2576 (新規)
更新履歴
Q. NTFS / CD9660 / UDF で日本語ファイル名を扱うことは出来ますか。
A. FreeBSD 5.2-RELEASE から、日本語を含めた、マルチバイト文字を使った
ファイル名を、これらのファイルシステム上で扱うことが出来ます。
ただし、
libiconv.ko
ntfs.ko (NTFS)
ntfs_iconv.ko (NTFS)
cd9660_iconv.ko (CD9660)
udf.ko (UDF)
udf_iconv.ko (UDF)
モジュールを起動時に組み込むか、もしくは、
options LIBICONV
options NTFS
options NTFS_ICONV
options CD9660_ICONV
options UDF
options UDF_ICONV
を追加してカーネルを再構築する必要があります。またどちらの場合でも、
libiconv (ports/devel/libiconv) のインストールも必要です。
詳細は [FreeBSD-tech-jp 3369] 、リリースノート、及び mount_ntfs(8) ,
mount_cd9660(8) , mount_udf(8) を参照してください。
参考: [FreeBSD-users-jp 76194] からのスレッド。
(当時の 4-stable 向けのパッチもあります。)
管理番号 503 (更新)
更新履歴
Q. ファイルを暗号化したいのですが、どうすればいいですか?
A. FreeBSD に標準で含まれる OpenSSL を使うとよいでしょう。
plain.txt を AES 256 ビットで暗号化し、crypted に出力する
には以下のようにします。
% openssl enc -e -aes256 -in plain.txt -out crypted.dat
enter aes-256-cbc encryption password: (鍵を入力)
Verifying - enter aes-256-cbc encryption password: (確認のためもう一度鍵を入力)
復号化する場合は以下のようにします。
% openssl enc -d -aes256 -in crypted.dat -out plain-decrypted.txt
enter aes-256-cbc decryption password: (暗号化の際に使用した鍵を入力)
AES 256 ビットでなく、DES で暗号化します。
% openssl enc -e -des -in plain.txt -out crypted.dat
OpenSSL で使用可能な暗号は enc(1) を参照してください。よく
わからなければ、AES を使っておきましょう。2004 年現在では、
安全性・速度などを考えると、AES が最もバランスのよい暗号で
あると考えられています。
なお、crypt(1)・bdes(1) という古いコマンドもありますが、
特に使用する必要はないでしょう。