The Linux Tips HOWTO Paul Anderson paul@geeky1.ebtech.net JF Project - 日本語訳 JF@linux.or.jp v3.6, June 1998 この HOWTO では、意外と知られていないちょっとしたヒントやコツを紹介して います。これを知れば、Linux はもっと便利になるはずです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Table of Contents 1. はじめに 2. 短い tips 2.1. お手軽 Syslog トリック〜Tips-HOWTO 管理人 Paul Anderson 2.2. 圧縮された HOWTO 文書を表示するスクリプト〜Didier Juges, 2.3. 空きスペースは充分か???〜Hans Zoebelein 2.4. ログファイル掃除ユーティリティ〜Paul Anderson, Tips-HOWTO 管理 者 2.5. core ファイル掃除のお手軽スクリプト〜Otto Hammersmith 2.6. 異なるファイルシステム間でのディレクトリ移動〜Alan Cox 2.7. どのディレクトリが一番大きいかを知る〜Mick Ghazey 2.8. Linux Gazette 2.9. GNU Make 3.70 の VPATH まわりの振る舞いを変えるパッチの場所〜 Ted Sterm 2.10. リブートのたびにいちいち fsck するのをやめさせるには?〜Dale Lutz 2.11. リブートの際、"device busy" のせいで fsck されるのを避ける方 法〜Jon Tombs 2.12. ハードディスク上の一番大きなファイルを見つける方法〜Simon Amor 2.13. パンチ穴を開けるマージンを取ってプリントアウトする方法〜Mike Dickey 2.14. 特定の正規表現を使ってファイルツリーを検索する方法〜Raul Deluth Miller 2.15. プログラムが勝手に作ったバックアップファイルやオートセーブフ ァイルを掃除するスクリプト〜Barry Tolnas 2.16. 一番メモリを食っているプロセスを探す方法〜Simon Amor 2.17. C プログラミング向けに vi をいじる〜Paul Anderson Tips-HOWTO 管理者 2.18. ctags を使って、プログラミングをやりやすくする方法 2.19. Red Hat で sendmail が起動時に 5 分間ハングする理由〜Paul Anderson 2.20. Red Hat で color-ls を使うための設定方法〜Paul Anderson 2.21. 特定の関数が /usr/lib のどのライブラリにあるか探す方法〜Pawel Veselow 2.22. C の簡単な test プログラムをコンパイルしたけれど、実行しても 何も出力されない! 3. 詳しい Tips 3.1. Linux と Windows でスワップパーティションを共有する方法〜Tony Acero 3.2. 削除してしまったファイルをなんとか復活させる方法〜Michael Hamilton 3.3. immutable(不変)フラグの使い方〜Jim Dennis 3.4. 新しいモノを入れる場所についての提言〜Jim Dennis 3.5. ディレクトリ内のファイル名を小文字に変換する〜Justin Dossey 3.6. Sendmail をアップグレードする方法〜Paul Anderson 3.7. 新人システム管理者のための tips 〜Jim Dennis 3.8. xdm で X サーバのホスト選択ができるようにする設定方法〜Arrigo Triulzi 4. 日本語訳について 1. はじめに ようこそ Linux Tips HOWTO へ。これは、Linux がもっと楽しくなる小ワザや ちょっとした最適化の方法を集めた文書です。いまのところ、ここで紹介する のはわたしが思いつく限りの tips と、旧版 Tips-HOWTO から転載した tips です(先人の知恵は拝借すべきなのです)。お気に入りのワザや tips があった ら何でも送ってください。Tips-HOWTO の次の版で紹介します。 Paul Anderson Linux TIPS HOWTO の管理者 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2. 短い tips 2.1. お手軽 Syslog トリック〜Tips-HOWTO 管理人 Paul Anderson /etc/syslog.conf を編集して、次の行を入れます。 # Dump everything on tty8 *.* /dev/tty8 注意事項:必ず Tab を使うこと! syslog はスペースを嫌います..... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2. 圧縮された HOWTO 文書を表示するスクリプト〜Didier Juges, 初心者のわたしから同じく初心者のひと向けに、HOWTO 文書の検索と表示が簡 単にできる短いスクリプトを紹介します。たとえば、わたしの環境だと HOWTO 文書は /usr/doc/faq/howto/ に圧縮されて入っています。ここで、文書のファ イル名は、XXX-HOWTO.gz であり、XXX の部分はその題名とします。わたしは、 次のような "howto" というスクリプトを作成して、/usr/local/sbin に置きま した。 #!/bin/sh if [ "$1" = "" ]; then ls /usr/doc/faq/howto | less else gunzip -c /usr/doc/faq/howto/$1-HOWTO.gz | less fi 引数なしでコマンドを実行すると、ディレクトリ内にある HOWTO 全部を表示し ます。次に、引数としてファイル名の最初の部分(ハイフンより左側)を入力す ると、 (もとの文書自体には変更を加えずに)その文書を解凍して、表示します 。 たとえば、Serial-HOWTO.gz を表示する場合は、次のように入力します。 $ howto Serial ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.3. 空きスペースは充分か???〜Hans Zoebelein マウントされているデバイス(ディスク、CD-ROM、フロッピー...)上に充分な空 きスペースがあるかどうか定期的にチェックする短いスクリプト。 空きスペースが無くなると、X 秒ごとにメッセージが表示され、満杯のデバイ スが生じるたびに 1 通のメールが届きます。 #!/bin/sh # # $Id: Tips-HOWTO.sgml,v 1.4 2001/07/21 14:58:17 senda Exp $ # # # ディスクが一時ファイルで満杯になると、コンパイル中に奇妙なメッセージが # 表示されるようになったので、これを書いて、ディスクが満杯になる前に警告 # が表示されるようにした。 # # このスクリプトで君のサーバが爆発を免れたなら、僕にお礼のメールを # 送ってちょうだい zocki@goldfish.cube.net # このスクリプトで君のサイトが全滅したなら、お気の毒ですが、おいしい # 話はそうないものです。責任は負えません。 # sed の扱いに習熟されている方、おおめに見てださい。:) # # # 自動化する方法:rc.local に 'check_hdspace &' と記述すること。 # $SLEEPTIME 秒ごとにディスク上の空きスペースをチェックします。 # フロッピーやテープドライブもチェックできます。:) # 空きスペースが $MINFREE (kb) 以下になると、警告メッセージを表示し、 # 問題のあるデバイスごとに 1 通のメールを $MAIL_TO_ME に送信します。 # 基準値以上の空きスペースが確保されると、再度スペース不足になった # 場合に備えて、メール送信機能が準備されます。 # # TODO: デバイスごとに異なる $MINFREE を設定できるようにすること。 # 空きスペースがなくなった場合、/*tmp ディレクトリのゴミファイルを # 掃除して、空きスペースを作るようにすること。 DEVICES='/dev/sda2 /dev/sda8 /dev/sda9' # デバイス; ディスクの設定 MINFREE=20480 # kb; これ以下で警告表示 SLEEPTIME=10 # 秒; チェックの間隔 MAIL_TO_ME='root@localhost' # 誰か; 警告メールの送信先 # ------- これ以下の部分は、変更する必要がありません (希望) :) ------- MINMB=0 ISFREE=0 MAILED="" let MINMB=$MINFREE/1024 # yep, we are strict :) while [ 1 ]; do DF="`/bin/df`" for DEVICE in $DEVICES ; do ISFREE=`echo $DF | sed s#.\*$DEVICE" "\*[0-9]\*""\*[0-9]\*" "\*## | sed s#" ".\*##` if [ $ISFREE -le $MINFREE ] ; then let ISMB=$ISFREE/1024 echo "WARNING: $DEVICE only $ISMB mb free." >&2 #echo "more stuff here" >&2 echo -e "\a\a\a\a" if [ -z "`echo $MAILED | grep -w $DEVICE`" ] ; then echo "WARNING: $DEVICE only $ISMB mb free. (Trigger is set to $MINMB mb)" \ | mail -s "WARNING: $DEVICE only $ISMB mb free!" $MAIL_TO_ME MAILEDH="$MAILED $DEVICE" MAILED=$MAILEDH # put further action here like cleaning # up */tmp dirs... fi elif [ -n "`echo $MAILED | grep -w $DEVICE`" ] ; then # Remove mailed marker if enough disk space # again. So we are ready for new mailing action. MAILEDH="`echo $MAILED | sed s#$DEVICE##`" MAILED=$MAILEDH fi done sleep $SLEEPTIME done ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.4. ログファイル掃除ユーティリティ〜Paul Anderson, Tips-HOWTO 管理者 わたしと読者が同じ環境にあるとするなら、読者は 430 人の登録者リストと、 日に 100 通以上のメッセージを UUCP 上で受け取っているはずです。こういう 場合、ハッカーならどうやってこの巨大なログを処理するんでしょうか?そう 、 chklogs をインストールすればいいのです。 chklogs は Emilio Grimaldo が作成したもので、最新バージョンの 1.8 は、 ftp.iaehv.nl:/pub/users/grimaldo/chklogs-1.8.tar.gz から入手できます。なによりもまず、こ れをインストールしましょう(もちろん、doc サブディレクトリにある info フ ァイルもチェックすること)。インストールが完了したら、crontab に次の行を 書き込んでください。 ┌──────────────────────────────────┐ │ # Run chklogs at 9:00PM daily. │ │ 00 21 * * * /usr/local/sbin/chklogs -m │ └──────────────────────────────────┘ 作業のあいまに、このソフトウェアがどれほど素晴らしいか作者に伝えるのを 忘れないでください。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.5. core ファイル掃除のお手軽スクリプト〜Otto Hammersmith 次のスクリプトを記述した rmcores というファイル ( このプログラムの作者 は、これを handle-cores と呼んでいます) を作成します。 #!/bin/sh USAGE="$0 " if [ $# != 2 ] ; then echo $USAGE exit fi echo Deleting... find $1 -name core -atime 7 -print -type f -exec rm {} \; echo e-mailing for name in `find $1 -name core -exec ls -l {} \; | cut -c16-24` do echo $name cat $2 | mail $name done そして、cron のジョブとして、これを定期的に起動してください。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.6. 異なるファイルシステム間でのディレクトリ移動〜Alan Cox あるディスクから他のディスクへ、ファイルツリーを丸ごとすばやく移動させ る方法。 (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -) [事故でディレクトリをダメにしてしまわないように、 cd /source/directory; tar... の部分を変更しました。これを教えてくれた Jim Dennis 、ありがとう。〜管理人 ] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.7. どのディレクトリが一番大きいかを知る〜Mick Ghazey お使いのコンピュータでどのディレクトリが一番大きいか?って思ったことは ありませんか?次のコマンドで判ります。 du -S | sort -n ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.8. Linux Gazette Linux Gazette の創刊者、John Fisk に栄誉あれ!素晴らしいオンラインマガ ジンであるばかりでなく、無料!!!なのです。これ以上何を期待します?次 のサイトをチェックしてください。 http://www.linuxgazette.com 現在、Linux Gazette は (1) 月刊になり、(2) John Fisk は既に編集を退いて 、 SSC が引き継いでいます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.9. GNU Make 3.70 の VPATH まわりの振る舞いを変えるパッチの場所〜Ted Sterm この問題を抱えている人が多いかどうかは分かりませんが、GNU Make のバージ ョン 3.70 にはわたしの気に入らない「特徴」があります。VPATH を絶対パス 名で与えた場合、おかしな動作をするのです。これに対処するきわめて安定し たパッチを Paul D. Smith が提供しています。また 、彼は GNU Make が更新されるたびに、ニュースグループ gnu.utils.bug にド キュメントとパッチを投稿しています。わたしは、アクセスするシステムのほ ぼすべての gmake にこのパッチを当てて再コンパイルしています。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.10. リブートのたびにいちいち fsck するのをやめさせるには?〜Dale Lutz Q:ブートのたびに e2fsck がディスクをチェックします。やめさせるには? カーネルを再構築すると、そのファイルシステムは "dirty" とマークされ、そ の結果、ブートのたびにディスクがチェックされてしまいます。これをやめさ せるには、次のコマンドを実行します。 rdev -R /zImage 1 このコマンドでカーネルが修正されるので、ファイルシステムは "dirty" だと 判断されることがなくなります。 注意: lilo を使っている場合、lilo の設定ファイル (通常は、/etc/ lilo.conf) の linux 設定の部分に read-only を加えてください。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.11. リブートの際、"device busy" のせいで fsck されるのを避ける方法〜 Jon Tombs シャットダウン時に "device busy" エラーが頻発する場合は、リブート時にフ ァイルシステムが fsck されます。以下に簡単な修正方法を述べます。 /etc/rc.d/init.d/halt か /etc/rc.d/rc.0 に移動し、そして mount -o remount,ro /mount.dir の一行を、umout -a を呼ぶ前に、/ を除いた、マウントする予定のすべてのフ ァイルシステムに対して付け加えます。こうすれば、何らかの理由で shutdown がプロセスの kill に失敗してディスクの umount ができなかった場合でも、 リブートの際、ディスクは "clean" なままです。リブート時間をかなり節約し てくれます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.12. ハードディスク上の一番大きなファイルを見つける方法〜Simon Amor ls -l | sort +4n あるいは、ディスクスペースがまさに逼迫している場合には、ちょっと時間が 掛かりますが、効果てきめんの次のコマンドを使ってください。 cd / ls -lR | sort +4n ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.13. パンチ穴を開けるマージンを取ってプリントアウトする方法〜Mike Dickey #!/bin/sh # /usr/local/bin/print # a simple formatted printout, to enable someone to # 3-hole punch the output and put it in a binder cat $1 | pr -t -o 5 -w 85 | lpr ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.14. 特定の正規表現を使ってファイルツリーを検索する方法〜Raul Deluth Miller わたしはこのスクリプトを "forall" と呼んでいます。次のようにして使って ください。 forall /usr/include grep -i ioctl forall /usr/man grep ioctl 以下は、"forall" の中身です。 #!/bin/sh if [ 1 = `expr 2 \> $#` ] then echo Usage: $0 dir cmd [optargs] exit 1 fi dir=$1 shift find $dir -type f -print | xargs "$@" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.15. プログラムが勝手に作ったバックアップファイルやオートセーブファイ ルを掃除するスクリプト〜Barry Tolnas 以下で紹介するのは、emacs のオートセーブファイル( #)、バックアップファ イル(~)、 .o ファイル、TeX の .log ファイルについて、ファイル階層を再帰 的に下降して削除する簡単な 2 行モノです。.tex と README ファイルの圧縮 もします。わたしはこれを "sqeeze" と呼んでいます。 #!/bin/sh #SQUEEZE removes unnecessary files and compresses .tex and README files #By Barry tolnas, tolnas@sun1.engr.utk.edu # echo squeezing $PWD find $PWD \( -name \*~ -or -name \*.o -or -name \*.log -or -name \*\#\) -exec rm -f {} \; find $PWD \( -name \*.tex -or -name \*README\* -or -name \*readme\* \) -exec gzip -9 {} \; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.16. 一番メモリを食っているプロセスを探す方法〜Simon Amor ps -aux | sort +4n または、 ps -aux | sort +5n ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.17. C プログラミング向けに vi をいじる〜Paul Anderson Tips-HOWTO 管理 者 わたしは、暇があると C プログラムを書いてます。その合間に、vi で C を書 きやすくするための修正を加えました。以下がわたしの .exrc です。 set autoindent set shiftwidth=4 set backspace=2 set ruler これが何をしているかというと、まず autoindent は、最初に一度インデント を入れるとそれ以下の行でも自動的にインデントを入れるものです。 shiftwidth は、^T をスペース 4 つ分に設定するもので、backspace は、 backspace モードに設定するもの、ruler は、行番号を表示するものです。特 定の行番号に移動する場合、たとえば 20 行目に行くには、次のコマンドを使 います。 vi +20 myfile.c ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.18. ctags を使って、プログラミングをやりやすくする方法 たいていのハッカーは、コンピュータ上に ctags を入れていますが、使ってま せん。でも、これは特定の関数を編集する際にとても便利です。たとえば、あ る関数があり、それが作成中のプログラム用ディレクトリ内のたくさんのソー スファイルのひとつに入っていて、ちょうど更新のためにその関数の編集をし たいのだとします。そして、この関数の名前は、foo() だとして、これをどの ソースファイルに入れたのか忘れてしまったとします。ctags が便利なのはそ ういう場合です。ctags を実行すると、tags というファイルがカレントディレ クトリに作成され、そのファイルにすべての関数が表示されます。そして、そ れらがどのファイルにあるのか、そのファイル内のどこにあるのかを教えてく れます。tags ファイルの中身は次のようなものです。 ActiveIconManager iconmgr.c /^void ActiveIconManager(active)$/ AddDefaultBindings add_window.c /^AddDefaultBindings ()$/ AddEndResize resize.c /^AddEndResize(tmp_win)$/ AddFuncButton menus.c /^Bool AddFuncButton (num, cont, mods, func, menu, item)$/ AddFuncKey menus.c /^Bool AddFuncKey (name, cont, mods, func, menu, win_name, action)$/ AddIconManager iconmgr.c /^WList *AddIconManager(tmp_win)$/ AddIconRegion icons.c /^AddIconRegion(geom, grav1, grav2, stepx, stepy)$/ AddStartResize resize.c /^AddStartResize(tmp_win, x, y, w, h)$/ AddToClientsList workmgr.c /^void AddToClientsList (workspace, client)$/ AddToList list.c /^AddToList(list_head, name, ptr)$/ vim で、たとえば AddEndResize() を編集する場合は、次のようにします。 vim -t AddEndResize これによって、エディタに適切なファイルが読み込まれ、カーソル位置が指定 した関数の最初にきます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.19. Red Hat で sendmail が起動時に 5 分間ハングする理由〜Paul Anderson これは、FAQ の対象になるくらい広く知られた問題です。Red Hat のディスト リビューションでこのバグが修正されたのかどうかは知りませんが、自分で直 すこともできます。/etc/hosts ファイルを覗くと、次のようになっているのが 分かると思います。 ┌──────────────────────────────────┐ │ 127.0.0.1 localhost yourbox │ └──────────────────────────────────┘ sendmail は起動時にホスト名(上記の例では、 yourbox) を探します。そして 、yourbox の IP が 127.0.0.1 であることを知るわけですが、sendmail はこ の IP が嫌いなので、もう一度、探そうとします。これを何度か繰り返して、 最後に諦めて終了してしまいます。この問題を解決するのはとても簡単で、/ etc/hosts ファイルを開いて、たとえば次のように変更するだけです。 ┌──────────────────────────────────┐ │ 127.0.0.1 localhost │ │ 10.56.142.1 yourbox │ └──────────────────────────────────┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.20. Red Hat で color-ls を使うための設定方法〜Paul Anderson Red Hat ディストリビューションには color-ls が同梱されていますが、どう して初期設定の色使いのまま放置されているのか理解に苦しみます。以下は、 それを修正するものです。 まず、eval `DIRCOLORS` とタイプします。 次に、alias ls='ls --color=auto' とします。 そして、上記 alias..... を /etc/bashrc に記述します。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.21. 特定の関数が /usr/lib のどのライブラリにあるか探す方法〜Pawel Veselow コンパイルの途中でリンクする必要があるライブラリが見当たらない場合、ど うします? gcc が報告するのは関数名だけです。以下の簡単なコマンドで、そ の関数を見つけることができます。 for i in *; do echo $i:;nm $i|grep tgetnum 2>/dev/null;done 上記の tgetnum という部分に、探している関数名がはいります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.22. C の簡単な test プログラムをコンパイルしたけれど、実行しても何も 出力されない! おそらく、そのプログラムをコンパイルして、test という名前のバイナリを作 成したのではないでしょうか? Linux には test というプログラムがもともと 存在しています。これは、ある条件が真か否かをテストするプログラムで、真 の場合は画面に何も表示しません。単に test と打つのではなく、./test と打 ってみてください。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3. 詳しい Tips 3.1. Linux と Windows でスワップパーティションを共有する方法〜Tony Acero 1. まず、対象となるパーティションを DOS パーティションとしてフォーマッ トして、そのパーティション上に Windows スワップファイルを作成します 。しかし、まだ Windows は起動しないでください(あとで圧縮がよく効く ように、この時点ではスワップファイルを空にしておいてください)。 2. Linux を起動して、上記パーティションをファイルとして保存します。た とえば、パーティションが /dev/hda8 であるとすると、以下のようにしま す。 dd if=/dev/hda8 of=/etc/dosswap 3. DOS スワップファイルを圧縮します。ほぼすべて 0 が並んでいるので、圧 縮は非常によく効きます。 gzip -9 /etc/dosswap 4. /etc/rc ファイルに次のような行を加えて、Linux 上にスワップスペース を準備し、インストールします。 注意: XXXXX の部分には、スワップパーティションのブロック数が入 ります。 mkswap /dev/hda8 XXXXX swapon -av /etc/fstab ファイルにこのスワップパーティションのエントリを加えるの を忘れないでください。 5. お使いの init および reboot パッケージが /etc/brc か /sbin/brc をサ ポートしている場合、次の行を /etc/brc に付け加えてください。サポー トしていない時は、DOS もしくは OS/2 をブートする場合でスワップパー ティションを DOS/Windows バージョンに戻したい場合に、下記を手動で入 力してください。 swapoff -av zcat /etc/dosswap.gz | dd of=/dev/hda8 bs=1k count=100 注意: 上記は、最初の 100 ブロックをパーティション上に書き戻すだ けです。わたしは、経験上これで充分だと思っています。 >> この方法の長所と短所 長所:かなりのディスクスペースを節約できること。 短所:ステップ 5 を自動化できない場合、毎回手動で入力しなければならない ので、リブートが 1 ナノ秒遅れてしまうこと。:-) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2. 削除してしまったファイルをなんとか復活させる方法〜Michael Hamilton ここでは、わたしがこれまで何度か使ったトリックを紹介します。 削除してしまったテキストファイルをなんとかして復活させる方法。 テキストファイル、たとえばメールや深夜のプログラミング作業の成果といっ たものを誤って削除してしまったとしても、諦めてしまうのは早計です。ファ イルが一旦ディスクに書き込まれていた場合、すなわち、だいたい 30 秒以上 そこにあった場合は、その内容はまだディスクパーティションに残っているか もしれません。 grep コマンドを使って、生のディスクパーティション (raw disk partition) を検索し、ファイルの中身を探すことができます。 たとえば、最近わたしは誤ってあるメールを削除してしまいました。その際、 まずわたしはメールが存在していたパーティションの内容を変更してしまうよ うな作業をすべて急遽取りやめました。この時は、ファイルを保存したり、プ ログラムをコンパイルしたりしないようにしました。それ以外にも、実際にシ ステムをシングルユーザモードに落として、そのファイルシステムを umount したこともありました。 次に、わたしは、対象となるディスクパーティションに egrep コマンドをかけ ました。その際、削除してしまったメールは /usr/local/home/michael/ に置 かれていたので、 df コマンドの出力から、それが /dev/hdb5 にあることが分 かりました。 sputnik3:~ % df Filesystem 1024-blocks Used Available Capacity Mounted on /dev/hda3 18621 9759 7901 55% / /dev/hdb3 308852 258443 34458 88% /usr /dev/hdb5 466896 407062 35720 92% /usr/local sputnik3:~ % su Password: [michael@sputnik3 michael]# egrep -50 'ftp.+COL' /dev/hdb5 > /tmp/x わたしは、ディスクパーティションをいじる際は極端に慎重になるので、ここ でもリターンキーを押す前に、一旦間をおいて、コマンドの構文が正確かどう か確認しました。この場合、メールには "ftp" という単語が含まれていて、そ の後に "COL" という単語で始まる文章が続いていました。メールのメッセージ は 20 行くらいだったので、-50 を使って該当する文章の前後すべてのテキス トを取得するようにしました。以前は、-3000 を使って、ソースコードのすべ ての行を取得できるようにしたこともありす。また、ここでは、egrep の出力 を別のディスクパーティションにリダイレクトしています。これは、探してい るメールが、egrep の出力で上書きされてしまうことを防止するためです。 つづいて、strings を使って、取得した出力を検査してみました。 strings /tmp/x | less 思った通り、メールはその中に入っていました。 この方法は、ディスクスペースの全部または一部がすでに上書きされているよ うな場合には、成功しないかもしれません。 このトリックが有効なのは、おそらく一人でシステムを使っている場合だけか もしれません。複数のユーザがいて、ディスクが頻繁に書き換えられる場合だ と、削除したファイルが置かれていた空間はすでに上書きされてしまっている かもしれません。それに、たいてのユーザは、ファイルを復旧する必要がある ときでも、マシンを勝手に独り占めするようなことはできません。 わたしの自宅のシステムでは、過去数年で 3 度ほど、数日分の成果を間違って 捨ててしまった際に、このトリックが役立ちました。こうした作業を通じて自 分でもたいへん進歩したと思っている点は、フロッピーに作業のバックアップ を取っておくようになったことです。おかげで、このトリックを使う機会は随 分減りました。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3. immutable(不変)フラグの使い方〜Jim Dennis Immutable フラグを使おう。 システムのインストールと設定が済んだら、すぐに /bin、 /sbin、/usr/bin、 /usr/sbin、/usr/lib (その他、およそ必要そうな場所) にいって、どんどん chattr +i コマンドを実行します。そして、root になって、カーネルファイル にもそのコマンドを実行してください。次に、mkdir /etc/.dist/ を実行して 、/etc 以下にある全ファイルをそのディレクトリにコピーします (わたしは、 一旦 /tmp/etcdist.tar を作ることで、コピーがループするのを防いでいます 。/etc/.dist.tar.gz を作るというのでもいいでしょう)。そして、それらのフ ァイルも immutable にします。 このようにしておくと、root でログインした際でも起こりうるダメージを最小 限に食い止められます。リダイレクション操作を誤ってファイルを上書きする ことがなくなりますし、rm -fr コマンドで間違ってスペースを入れてしまいシ ステムを不安定にしてしまうこともなくなります(その場合でも、データにはか なりのダメージが及ぶかもしれませんが、ライブラリとバイナリの安全性は向 上します)。 また、この作業によりセキュリティ全般が強化され、サービスを停止させるよ うな攻撃が不可能もしくはより困難になります(そうした攻撃の多くは、SUID されたプログラムの挙動を悪用してファイルを上書きする方法をとっています が、そうした SUID されたプログラムは本来勝手なシェルコマンドの実行を許 すものではないからです)。 この作業による唯一の短所は、様々なシステムコマンドをビルドして、 make install する際に不便が生じるという点です。つまり、make install する場合 でも、ファイルを上書きできなくなってしまいます。あらかじめ Makefile を 読んで、上書きされることになるファイル(およびファイルがインストールされ るディレクトリ) に対して chattr -i を実行するのを忘れると、make が失敗 してしまいます。そうした場合は、chattr を実行し、再度 make してください 。また、その機会を利用して、古いバイナリやライブラリなどを .old/ ディレ クトリに移動させたり、リネームしたり、 tar でまとめておいたりするといい かもしれません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.4. 新しいモノを入れる場所についての提言〜Jim Dennis 新しいモノはみんな /usr/local か /usr/local/'hostname' から始めよう。 お使いのディストリビューションの /usr/local 以下が空になっているなら、 自分で /usr/local/src や /usr/local/bin などを作成して使いましょう。お 使いのディストリビューションの /usr/local 以下にすでにファイルツリーが ある場合は、mkdir /usr/local/'hostname' を実行した上で、'wheel' グルー プに書き込み権限(+w) を与えましょう(わたしはさらに、SUID および SGID す ることで、wheel グループの個々のメンバだけがそこにファイルを置け、それ らの全ファイルが wheel グループに属するようにしています)。 これからは、いつも!いつも!いつも!新しいパッケージを /usr/local/src /.from/取得場所の名前($WHERE_I_GOT_IT)/ に置いて、/usr/local/src (もし くは ... /$HOSTNAME/src) 以下でコンパイルするようにしましょう。もし「ど うしても」/bin や /usr/bin 等にインストールしなければならないプログラム であるなら、/usr/local/ 以下の階層から必要な場所にシンボリックリンクを 張るようにしましょう。 こうした作業は面倒ではありますが、これによって、ディストリビューション のメディア(最近は CD が一般的です)から全体を再インストールする際に、バ ックアップやリストアすべき部分と、再インストールすべき部分を分けやすく なります。また、/usr/local/.from ディレクトリを使うことで、ソースをどこ から取ってきたかを不完全ながら記録しておくことができるので、パッケージ を更新するときに便利ですし、セキュリティ関係のアナウンスを追いかけると きには非常に重要な情報になります。 自宅のシステムのひとつ(今これを書いているマシン)を使い始めた当時、わた しはまだこうした方針を実行していませんでした。それゆえ、「インストール した当初の」状態と現在の状態とがどれだけ違うか未だによく分かっていませ ん。マシンのシステム設定はほとんどいじっておらず、これを使っているのは 自分だけであるにも関わらず、そんな状況なのです。 それにひきかえ、わたしが職場(システム管理者の役をやらされていた頃です) で設置したシステムは、すべて上記の方法で設定しました。それらのマシンは 、契約先の SE や情報関係の様々なひとびとによって管理されてきましたが、 今でもわたしは、最初にインストールと設定をした後に組み入れられたパッケ ージがどれなのかをつぶさに理解しています。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.5. ディレクトリ内のファイル名を小文字に変換する〜Justin Dossey Linux Gazette の issue 12 に掲載されている 2c tips (訳注:原文は、こち ら です。な お、この Tips は、Linux Gazette issue 13 に掲載されています。山口さん、情報提供あ りがとうございました。) で、ちょっと難しすぎるか不必要と思われる手順が 紹介されていることに気付きました。方法はいろいろあるわけなので、わたし からもその手順を紹介します。 #!/bin/sh # lowerit # カレントディレクトリの全ファイル名を小文字に変換するスクリプト # 通常ファイルだけを対象とする --ディレクトリ名は変更しない # 既存のファイルを上書きする前に、確認を求める for x in `ls` do if [ ! -f $x ]; then continue fi lc=`echo $x | tr '[A-Z]' '[a-z]'` if [ $lc != $x ]; then mv -i $x $lc fi done ん〜、長すぎます。わたしなら、こういうふうには書きません。むしろ、次の コマンドを使います。 for i in * ; do [ -f $i ] && mv -i $i `echo $i | tr '[A-Z]' '[a-z]'`; done; これなら、コマンドラインで出来ます。 この投稿者は、彼が使っている方法を分かり易いスクリプトにしたといってい ますが(下記参照)、ちょっと違うと思う。 次の tips は、ユーザの追加と削除についてです。Geoff は上手くやっていま すが、最後の手順がよくない。リブート?彼がユーザの削除のたびにリブート していないことを望みます。最初のふたつの手順で充分です。そのユーザがど んなプロセスを走らせているのでしょうか? IRC ロボットでしょうか?そうし たプロセスは次のコマンドで簡単に kill できます。 kill -9 `ps -aux |grep ^ |tr -s " " |cut -d " " -f2` たとえば、ユーザ名が foo なら、以下のようになります。 kill -9 `ps -aux |grep ^foo |tr -s " " |cut -d " " -f2` これで充分です。忘れてた root パスワードが必要になりますが。 Linux Gazette で紹介されてる解決法は最も汎用性がありますが、一番簡単な 方法というわけじゃありません。LILO や loadlin を使っているなら、ブート パラメタとして "single" を入力して、ログイン手続きやパスワードなしでデ フォルトシェルを直接起動できます。その状態でパスワードを変更するか削除 した上で、"init" を入力し、マルチユーザモードに移行すればいいと思います 。この場合、リブート回数は 1 回で済みます。そうでないと 2 回必要です。 Justin Dossey ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.6. Sendmail をアップグレードする方法〜Paul Anderson ここでは、何も修正されていないオリジナルのソースを使います。まず、 sendmail のソースコードを入手します。わたしは、version 8.9.0 を取ってき ました。これは、お気づきかと思いますが、安定版ではありません。取得先は 、 ftp.sendmail.org:/pub/sendmail/sendmail.8.9.0.tar.gz でした。 これは 1 メガ前後あり、現在わたしは 8.7.6 を使っていることを考慮すると 、この作業はなかなか大変です。上手くいけばメールのやりとりができますが 、そうでないと、メールなしでは HOWTO の新版を出せなくなってしまいます 。:) ソースを落としたら、解凍します。解凍すると、カレントディレクトリに sendmail-8.9.0 というサブディレクトリが作成されます。そのディレクトリに 移動して、README と README_NOTES を読みましょう(そして、開発者たちが達 成した更新結果に驚愕しましょう)。次に、src ディレクトリに移動します。作 業のほとんどは、ここで行います。 簡単な注意: sendmail は、コンパクトでパワフルな非常に良くできたプロ グラムです。 sendmail のバイナリは、5x86 133MHx の CPU と 32M バイ ト RAM のわたしの環境でも 5 分以下でコンパイルできました。(設定を除 いた)コンパイルとインストール全体で、15 分以下です! わたしは普段自分のシステム上で BIND を動かしていないので、次の行は、 # ifndef NAMED_BIND # define NAMED_BIND 1 /* use Berkeley Internet Domain Server */ # endif 1 を 0 に変更し、以下のようにしました。 # ifndef NAMED_BIND # define NAMED_BIND 0 /* use Berkeley Internet Domain Server */ # endif Debian 1.3.1 の場合、デフォルトで db.h は、sendmail で必要とされる /usr /include ではなく、/usr/include/db にインストールされます。それゆえ、 src、mailstats、 makemap、 praliases、 rmail、 smrsh のそれぞれのディレ クトリに移動して、次のコマンドを実行してください。 ./Build -I/usr/include/db 以上が済んだら、cd .. を実行し、make install と打ってください。これで sendmail version 8.9.0 がインストールされます!もちろんこれは、自分用の 設定ファイルを既にもっている場合です。わたしは majordomo を使ったフリー メーリングリストをホストしているので、すべてをスムースに稼働させるため に、次の行を /etc/sendmail.cf に付け加える必要がありました。 O DontBlameSendmail=forwardfileinunsafedirpath, forwardfileinunsafedirpathsafe sendmail 8.9.0 は、ディレクトリ配置やファイルパーミッションの設定を最近 細かくチェックするようになっているので、エイリアスとなっているディレク トリやファイル、もしくはグループでの書き込み権限や自由な書き込み権限が 付けられた .forward ファイルについて sendmail から文句が出るかもしれま せん。こうした細かなチェック機能を停止させることはよい考えではありませ んが、わたしはシングルユーザでコンソールを使って作業するだけなので、チ ェック機能停止が小さなセキュリティホールとなったとしても大丈夫だろうと 思っています。そのあたりは、ご自分の環境にあわせて判断してください。 YMMV ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.7. 新人システム管理者のための tips 〜Jim Dennis /README.'hostname' か /etc/README.'hostname' のどちらか一方もしくは両方 を作って、それを管理すること [ あるいは、/usr/local/etc/ README.'hostname' でもいいでしょう〜管理人] システム管理を始めたその日から、必ずオンラインのログファイルに記録を付 けるようにしましょう。root の /bash_logout に "vi /README.$(hostname)" という一行を入れておくこともできます。あるいは、次のような su もしくは sudo スクリプトを書いておいてもよいでしょう。 function exit \ { unset exit; exit; \ cat ~/tmp/session.$(date +%y%m%d) \ >> /README.$(hostname) && \ vi /README.$(hostname) } script -a ~/tmp/session.$(date +%y%m%d) /bin/su.org - (入力履歴を記録するコマンドを使ってセッションログを取るとともに、関数を 作成して自動的にそのログに追加・更新がなされるようにしています) わたし自身は、こうした自動化を方針として採用していません。これまで手動 で記録する習慣を守ってきました。ただ、自動化というのもアリかなと思って いるだけです(ご覧のように、スクリプトやシェル関数を作ってみたりはしてる わけです)。上記スクリプトで気になる点は、script コマンドが入っていると ころです。このコマンドのソースを取ってきて、(コマンド履歴の記録を一時停 止したり中止したり出来るような)コマンドラインパラメタを付け加えてから、 これを使おうと考えています。 わたしの(今回の)最後の提案は、 root ユーザのパスは、'PATH=/bin' とすべきである ということです。root のパスにそれ以外を付け加えるべきではありません。ル ートの作業で使うコマンドは、/bin からのシンボリックリンクかエイリアス、 もしくはシェル関数というかたちで提供するか、あるいは、 /bin にあるスク リプトかバイナリとするか、絶対パスを指定するかのいずれかにすべきです。 こうしておけば、root 権限で作業をする人は、自分がどれほどバイナリを頼り にしているか(ときには、痛いほど)分かるはずです。マルチユーザのホストを 管理する賢明なシステム管理者なら、自分の /bin や /.*history ファイルを 定期的に調べて、なんらかのパターンや抜け穴がないかどうか探すようになる でしょう。 本当にヤル気のあるシステム管理者なら、自動化できる箇所を探し当て、シス テムの妥当性を検査するプログラムを必要な場所に置くことで、root 権限が必 要な作業をいちいちしないで済むようにするでしょう (スクリプトによって機 能を細かく調整できる、エディタや MTA その他の対話的な巨大プログラムにつ いては、透過的なファイルやデータファイルが利用されることになるでしょう 。たとえば、悪名高い vi の ./.exrc や emacs の ./.emacs、さらに面倒な $EXINIT および組み込みヘッダやフッタマクロといったものです)。当然、そう したコマンドは、次のように実行することもできます。 cp $data $some_users_home/tmp su -c $origcommand $whatever_switches cp $some_users_home/tmp $data (オプションや引数は、コマンドによって異なります) 自宅で利用する場合やユーザが自分だけという場合、後半部分での提案は大げ さではありますが、マルチユーザシステムの管理者、特にインターネットに常 時接続されている(ネット関連企業などの)システムの管理者の場合、これらは 非常に有益なポリシーであると思います。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.8. xdm で X サーバのホスト選択ができるようにする設定方法〜Arrigo Triulzi 1. xdm を起動するファイル(たいてい、/etc/rc/rc.6 か /etc/rc.local にあ ります)を開いて、xdm の起動セクションが次のような内容になるよう編集 します。 /usr/bin/X11/xdm exec /usr/bin/X11/X -indirect hostname 2. /usr/lib/X11/xdm/Xservers を開いて、ローカルマシン上の X サーバを起 動させる行をコメントアウトします(すなわち、起動しないようにします) 。 3. マシンをリブートすると、ローカルマシン上の X サーバも、リモートマシ ンの X サーバも両方使えるようになります。 これを紹介するのは、わたしがなんとか自分自身のサブネットを設定して現在 の状態にもってくる際、すべての問題の解決に 2 週間ちかくかかったからです 。 注意:古い SLS (1.1.1) を使う場合、理由はよく分かりませんが、xdm の設定 行に -nodaemon という記述を入れたままにすることもできます。ただし、これ は、それ以降のバージョンには当てはまりません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4. 日本語訳について 翻訳:鴨澤眞夫(1996/10/01) 更新:千旦裕司(2001/03/20) 校正:山口さん(2001/07/07) 誤訳・誤字・脱字等がありましたら、 までご連絡ください。