HACK # 41 = 10 # more /usr/local/etc/bacula-dir. conf 194 ー 4 章バックアップ Director { Name DIRport QueryFile WorkingDirectory PidDirectory Maximum Concurrent Password Messages Job { Name Type C1ient FileSet Schedu1e Stora ge Messages P001 Priority Fi1eSet { Jobs = laptop-dir = 9101 "/usr/local/etc/query. sql" "/var/db/bacula" "/var/run" "1Lftf1C4QtgZnWEB6vAGc0uSL3T6n + P7jeH + HtQOCWwV" = Standard "C1ient1" = Backup = laptop-fd "Fu11 Set" "Week1yCyc1e" = Fi1e = Standard = Default Write Bootstrap = "/var/db/bacu1a/C1ientI. bsr' Exclude = { /proc /tmp /. journal /. fsck } # 以下の除外項目のうち、後半の 2 つが役立っことがある # ルートディレクトリのバックアップをとる場合、 /usr/ports/sysutils/bacula/work/bacula-l. 32( lnclude = signature=MD5 { Name = "Fu11 Set" File Retention = 30 days Aut0Prune Job Retention Password Cata10g FDPort Address Name C1ient { = 6 months "laptop-client-password" = MyCata10g = 9102 = laptop.example.org = laptop-fd # ファイル記憶装置の定義 Storage { Name Address = Fi1e = laptop.example.org
HACK # 3 1 章 ユーザ環境のカスタマイズ キーを数値のエスケープシーケンスに結び付けることも可能だが、あまり便利だとは思え ない。それよりも、 CCtrI] + [ g ] に割り当てたほうが、すっと簡単だ。このキーストローク に割り当てたとき、どんなことが起こるかを眺めてみよう。 druC: bindkey " ^ ( " complete-word-fwd このコマンドを入力すると、静かにプロンプトが戻ってくるので、何かが働いたのだと推 測できる。 こで、 ls -1 /etc/ と入力し、 CCtrI] キーを押したままで繰り返し Cg] を押す と、ファイルまたはディレクトリが順に次のように現れる。 ls -1 /etc/COPYRIGHT ls -1 /etc/X11 ls -1 /etc/aliases ls -1 /etc/amd. map このようにすれば、欲しいものが見つかるまで、ディレクトリ内のファイルを 1 っすった どることができる。ファイルの名前がどの文字で始まるかを知っていれば、その文字を指定 して、さらにすばやく探すことができる。 a で始まるファイルなら、次のようにして探せ ばよい。 ls -1 /etc/a ls -1 /etc/auth. conf ls -1 /etc/apmd. conf ls -1 /etc/amd. map ls -1 /etc/aliases ls -1 /etc/a complete-word-fwd druC: bindkey " " ングを見るには、次のように実行すればよい。 バインディングだけを見たければ、そのキーを指定する。℃国 ] + [ g ] の現在のバインディ もちろん、 t ( sh が理解できるキーを調べるには、単に bindkey を使用する。特定のキーの /command is bound druC: man csh けることができる。 tcsh が理解できるコマンドの一覧を調べるには、次のようにしてみよう。 bindkey を使用すれば、シェルが理解できるコマンドを、シェルが理解できるキーに結び付 complete-word-back をキーに結び付ければよい。 ファイルを逆順にたどりたい場合 ( つまり、 a でなく z から始めたい場合 ) 、代わりに シェルは、 a で始まる候補を一通り表示したら、 a だけに戻ってピープ音を鳴らす。
F 「 eeBSD のトラフィックシェーピングで帯域を制御ー 3 引 メージファイルがあるが、発信帯域幅を独占させたくはなかった。また、ユーザがダウンロー ドアクセラレータを使用して不当に発信帯域幅を独占することも防ぎたかった。そこで、発 信帯域幅を 24 ビットのネットワークの範囲内で均一に共有することを選択した。 # バイプを最大 2000Kbps に設定 ipfw pipe 1 config bw 2000kbits/s # 上記の / 24 の制限をつけるためにキューを使用 ipfw queue 1 config pipe 1 mask dst-ip 0x 幵幵幵 00 # このマスクを設定すると、フロー ID を生成するとき、 # 宛先 IP アドレスの最初の 24 ビットだけを考慮 # Web サーバ ( 1.1.1.1 ) からの発信トラフィックを変更 ipfw add queue 1 tcp from 1.1.1.1 80 t0 any out もう 1 つの実例として、部門の受信トラフィックの制限を取り上げる。これは、 IMbps の 接続を使用している小さな会社で受信帯域幅を制限するという設定例だ。この設定を適用す る以前には、一部のユーザがピアツーピアのクライアントとダウンロードアクセラレータを 使用して、ほとんどすべての帯域幅を独占していた。解決方法は、それぞれの部門に重みを 付けて帯域幅を割り当て、部門の中で帯域幅の独占に対処させるというものだった。 # 使用する変数 # 外部インタフェース EXTIF=fxp0 # 自分の IP アドレス ME ニ 192.168.1.1 # バイプに総受信容量の 95 % を設定 ipfw pipe 1 config bw 950kbits/s # 部門のキューを設定 # 部門 1 と部門 2 はインターネットのヘビーユーザ ipfw queue 1 config pipe 1 weight 40 ipfw queue 2 config pipe 1 weight 40 # 経理部門はあまりネットワークを使用しない ipfw queue 3 config pipe 1 weight 5 # 他の部門は中程度にインターネットを使用 ipfw queue 4 config pipe 1 weight 20 # このサーバ宛の受信メール ( SMTP ) を「最優先」 ipfw queue 10 config pipe 1 weight 100 HACK # 70
HACK # 55 270 ー 6 章システムのセキュリティ デフォルトの ACL を設定 もっと進んだ例を考えてみよう。自分の ( 001 widgets ディレクトリにアクセスする許可を、 冷静な同僚である Bob に与えたいが、世界中のユーザには与えたくないとする。単に ACL の ェントリを追加しただけでは、作成したファイルがディレクトリの ACL を自動的に反映する わけではない。代わりに、デフォルトの ACL をディレクトリに設定する必要がある。そのディ レクトリで作成したファイルは、デフォルトの ACL を引き継ぐ。 getfacl または setfacl に - d オプションを渡すと、これらのコマンドは、ディレクトリ自体 の ACL でなく、ディレクトリの「デフォルトの ACL 」に作用する。 % mkdir ( 001 widgets % chmod o-rwx ( 001 widgets % 15 -1 drwxr-x-- 512 Apr 19 21 : 21 C001 widgets 2 て ob rob % getfacl -d ( 001 widgets # file : ( 001 widgets #own er : 1000 #group : 1000 すごく退屈だと思うだろう。では、デフォルトの ACL を追加してみる。 % setfacl -d -m u: bob:rw- ( 001 widgets setfacl: acl calc mask() failed: lnvalid argument setfacl : failed t0 set ACL mask on ( 001 widgets しまった。デフォルトの ACL は通常の ACL と同じようには扱えない。汎用的な user : : 、 other: : のエントリを追加するまで、デフォルトの ACL で特定のエントリを設定す ることはできない。 % setfacl -d -m u : : 靦 - , g : : て - - , 0 : : % setfacl -m u :bob:r-x ( 001 widgets こで、このディレクトリに、デフォルトでない r-x を bob に設定していることに注意し てほしい。ディレクトリのデフォルトの ACL は、そのディレクトリ内で作成したファイルに 作用するが、そのディレクトリ自体に作用するわけではない。つまり、 ( 001 widgets で作成す るあらゆるファイルに、 ACL 工ントリ u : bob : rw- が作用する。 今や、グループを使わなくても、 coolwidgets ディレクトリのファイルを読み書きする許可 を、自分自身と Bob に与えることができる。後にデフォルトの ACL を削除することに決め た場合、 -b オプションでファイルの ACL を削除したのと同様に、 setfacl の -k オプションで ディレクトリの ACL を削除できる。 - , u : bob:rw- ( 001 widgets
HACK # 36 174 ー 4 章バックアップ ディスクで作成するとき、マルチボリュームのアーカイプを使用することが一般的だった。 Minix と QNX4 では、アーカイプユーティリティにマルチボリュームの機能が備わっている のでなく、マルチボリュームを扱うために V01 ユーティリティを使用する。 V01 は、アーカイ プユーティリティでなく分割ユーティリティなので、アーカイプューティリティの実装を透 複数のポリュームを連結する ポリュームの順序を確認する メディアの終端にくると、次のポリューム用のメディアを要求する V01 ユーティリティは以下の操作を実施する。 過的に切り替える方法が必要になる。 gle. p1?number=23776) ・ pax のバグレポートと -A による回避策 (http://www.NetBSD.org/cgi-bin/query-pr-sin html node/tar 117. html) ・ GNU tar と POSIXtar についての説明 (http://www ・ gnu ・ org/software/tar/manual/ ty/pgp2/README. html) ・ NetBSD の PGP パッケージ (ftp : //ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/securi ・ man pax 参照 2.1. tar. bz2 から入手できる。 したユーティリティで、 http://www.ibiblio.org/pub/Linux/system/backup/mu1tiv01- マルチボリュームを扱う機能を持つユーティリティ。これは MarcSchaefer 氏が開発 multivol put=gplain から入手できる。 たユーティリティで、 http://groups ・ google.com/groups?se1m=80%40mirror.UUCP&out tar 用のポリュームヘッダを作成するユーティリティ。これは Brian Yost 氏が開発し vo 1 植するとよいだろう。 ルチボリュームアーカイプをたくさん作成する場合、以下のユーティリティのいずれかを移 残念ながら、 V01 ユーティリティは NetBSD のパッケージコレクションに入っていない。マ
ファイルを見つける一 61 ル名が 1 つだけなので、 g て ep はユーザがすでにファイル名を知っていると仮定する。 /dev/null { } と指定すると、 find は /dev/null と処理中のファイルの 2 つを g て ep に渡す。 grep は 2 つの ファイルを検索するので、どちらのファイルに文字列が入っているかを報告すべきだと判断 する。 / dev / null には何も入っていないので、 grep はもう一方のファイルの名前しか表示する ことはない。 この方法はとても便利だ。それでは、これをさらに使いやすくしてみよう。以下のような fst ⅱ ng という名前の単純なスクリプトを作成してみる。 % more æ/bin/fstring #!/bin/sh # 文字列が入っているファイルを探すスクリプト # $ 1 はユーザが検索する文字列に置き換わる -type f -exec grep " $ 1 " /dev/null { } \ ; find . $ 1 は位置パラメータだ。このスクリプトは、ユーザが検索したい文字列を 1 つだけ引数と して受け取る。このスクリプトを実行すると、シェルは検索したい文字列で $ 1 を置き換える。 つまり、このスクリプトを次のように実行すればよい。 % fstring 検索文字列 このスクリプトを自分で使用するつもりなら、検索文字列を指定すべきだということを覚 えているだろう。しかし、このスクリプトを他のユーザも利用するのであれば、 if 文を使用 して、検索文字列の指定を忘れた場合にエラーメッセージを表示するとよい。 #!/bin/sh # 文字列が入っているファイルを探すスクリプト # $ 1 はユーザが検索する文字列に置き換わる # 検索文字列の指定を忘れたら、エラーメッセージを表示 if test $ 1 then find . else echo "Don ・ t forget to include the word you would like to search for" ex it 1 -type f -exec grep " $ 1 " /dev/null { } \ ; fi chmod + x でスクリプトを実行可能にすることと、ユーザのパス上に置くことも忘れないで ほしい。他のユーザも利用する場合には、 /usr/local/bin に置くとよい。 参照 ・ man which HAC K # 13
HACK # 11 1 章ユーサ環境のカスタマイズ このように不格好なのは、 sc ⅱ pt のせいでなく以下のような理由がある。最初の理由とし % echo # linux enab1e="YES" に変更し、 % echo # linux enab1e="N0" を % echo # /etc/rc. conf を開いたら、 自分自身に少しだけコメントを送りたいとき、筆者は echo コマンドを使用している。 したときの入力を正確に記録したくても、あまり良い案が浮かばない。このような理由から、 なる。前述の C01 - b コマンドは、不要な文字をほとんど整理してくれるが、エデイタを使用 スクリプトセッションの間にエデイタを使用すると、スクリプトファイルが非常に乱雑に configure. firewall. nov. 11.2003. clean: ASCII EngIish text % file configure. firewall. nov. 11.2 3. clean 1md1avigne6Cm: cd /usr/ports/security/snort その結果は、すっと読みやすくなる。 C01 はバックスペースも削除する。 シーケンスを理解しないが、これらがまさに取り除きたい文字なのである。 - b を付けると、 筆者のスクリプトファイルは、まさに ( 01 を活用できる例だ。 ( 01 は制御文字とエスケープ C01 は、興味深い小さなユーティリテイだ。理解できない文字を静かに取り除いてくれる。 ( 01 -b 〉 configure. firewall. nov. 11.2003. clean % more configure. firewall. nov. 11.2003 ー、 除くことができる。 しかし、まったく方法がないわけではない。次のコマンドで、不要な文字をほとんど取り terminators, with escape sequences configure. firewall. nov. 11.2003: ASCII Eng1ish text, with CRLF, CR, LF line % file configure. firewall. nov. 11.2003 作について警戒できただろう。 事前に、このスクリプトファイルに file ユーティリティを実行していれば、このような動 完できた。 押して補完を試みたが、ビープ音が鳴った。 sno まで入力してからタブを押すと、 sno て t と補 した。 3 番目の理由として、筆者はタブの補完を使用した。 sn まで入力したところでタブを 去しなければならなかった。さらに / ysr と入力したので、 [ バックスペース ] で 3 文字を消 [ バックスペース ] キーで文字を消 することが多かった。 /usr なのに /s と入力してしまい、 左右に [lm および [m となって現れている。 2 番目の理由として、筆者はその日、入力ミスを て、筆者のカスタマイズしたプロンプトに制御文字が入っている。制御文字は、ユーザ名の
HACK # 41 4 章バックアップ Run = lncremental HourIy このスケジュールを使用する扣 b は、以下の日時に動き始める。 クライアント専用の BacuIa をインストール 増分バックアップは、 1 時間ごとに、ちょうど毎時 0 分に始まる。 差分バックアップは、毎月、第 2 、第 3 、第 4 、第 5 日曜日の午前 1 時 5 分に始まる。 毎月、第 1 日曜日の午前 1 時 5 分に始まる。 フルバックアップは、 記事 ) ・ http://鼎帳 onlamp.com/pub/a/on1amp/2004/01/09/bacu1a.html (ONInmp にある Bacula の ・ BacuIa の Web サイト (http://www.bacula.org/) 参照 Starting the Director daemon Starting the FiIe daemon Starting the Storage daemon Stopping the Director daemon Stopping the Fi1e daemon Stopping the Storage daemon # /u5て/10(a1/et(/て(. d/bacula. sh restart Bacula の設定ファイルを変更したら、デーモンを再起動することを忘れないでほしい。 も作成するとよい。 設定ファイルに、新しい Client リソースを追加すればよい。また、 J0b と FileSet のリソース さらに、このクライアントを Director に登録する必要がある。そのためには、 Director の # make -DWITH CLIENT ONLY install # cd /usr/ports/sysutils/bacula イアント専用の Bacula をインストールすることは簡単だ。 これまでは、サーバ上で Bacula をテストしてきた。 FreeBSD の po ホを利用すれば、クラ
HACK 350 ー # 70 手 な 度 高 7 net. inet. ip. fw. one_pass を 1( デフォルト ) に設定している場合に ipfw パイプまたは ipfw キュー のルールは「スローダウンした後で ipfw が受け付ける・・・・・・」ことと同等なので注意してほし い。 sysctl で 0 に設定している場合にはそのルールは、次のルールにバケットを渡すまでの 遅延として働く。そして、次のルールで拒否または別のシェーピングが働くことがある。 の Hack では、パイプとキューのデフォルトの動作が、受け付けまたはそれと同等な動作だ と仮定している。 単純な設定 帯域幅を制限するには様々な方法がある。以下に、外部ネットワーク用のインタフェース ed0 の帯域幅を制限する例をいくっか紹介する。 # 発信だけを制限 ipfw pipe 1 config bw 100kbits/s ipfw add 1 pipe 1 ip from any to any out xmit ed0 受信と発信をそれぞれ 100Kbps と 50Kbps に制限するには、次の例のように実行する。 ipfw pipe 1 config bw 100kbits/s ipfw pipe 2 config bw 50kbits/s ipfw add 100 pipe 1 ip 行 om any to any in recv ed0 ipfw add 100 pipe 2 ip from any to any out xmit ed0 次は帯域幅の合計 ( 受信と発信の合計 ) を制限する例だ。 ipfw pipe 1 config bw 100kbits/s ipfw add 100 pipe 1 ip from any to any in recv ed0 ipfw add 100 pipe 1 ip from any to any out xmit ed0 次の例では、各ホストの受信帯域幅を 16 ps に制限する ( 発信については制限しない ) 。 ipfw pipe 1 config bw 16kbits/s mask dst-ip 0x 幵 ff 幵幵 ipfw add 100 pipe 1 ip 行 om any to any in recv ed0 複雑な設定 次に、実例をいくっか紹介する。最初に Web サーバの発信トラフィックの速度を制限して みる。 これは、筆者のとあるサーバで設定している例だ。そのサーバには FreeBSD の ISO イ
HACK # 17 76 ー 2 章ファイルとファイルシステム で囲むことが多い。これらのフィールドに区切り文字が入っていることがある。そんなファ イルを、 1 つの区切り文字しか処理できないアプリケーション ( 例えば PostgreSQL ) にイン ポートすると、データを誤って解釈してしまうおそれがある。処理に失敗したら、むしろ幸 運だと考えるべきだ。 1 つの解決方法は、二重引用符の出現を追跡しながらテキストフィールドの内部かどうか を判断するスクリプトを作成することだ。そのために、文字の置換処理の実行中に、テキス トか非テキストかを切り替える変数を使用すればよい。区切り文字を適切な文字に置き換え るが、二重引用符で囲まれている区切り文字はそのままにしておき、二重引用符を削除す る。元のデータファイルを変更するよりも、編集したデータを新しいファイルに書き込むほ うが安全だ。 問題の解決手順 我々の必要性を満たすには、以下のアルゴリズムを実行すればよい。 2. 区切り文字の変数を作成して定義する。変数を delim とし、区切り文字として空白を を割り当てる。こでは変数 tswitch を宣言し、 tswitch = 1 と定義する。 1. テキストか非テキストかを示すスイッチ変数を作成し、「非テキスト」を意味する 1 5. 新しいファイルを書き込み用に開く。 データファイルを読み出し用に開く。 3. 適切な区切り文字を決める。タブ文字を使用するので、 newdelim にと定義する。 ーと定義する。 使用するので、 delim = 4. そして、データファイルのすべての文字に、以下の処理を実行する。 1. 3. 4. データファイルから 1 文字を読み出す。 2. 文字が二重引用符なら、 t s w i t ( h にテキストを意味する - 1 を割り当てるために tswitch = tswitch * -1 と実行する。 文字が del im の文字に等しく、 t swit c h が 1 ( 非テキスト ) なら、新しいファイルに new delim を書き込む。 文字が delim の文字に等しいが、 tswitch が -1( テキスト ) なら、新しいファイルに delim の値を書き込む。