The Linux Tips HOWTO 日本語版 鴨澤眞夫 JCD00743@niftyserve.jp 訳 r 1.0.0, 1 Oct. 1996 元の文書は The Linux Tips HOWTO Paul Anderson, panderso@ebtech.net v2.0, August 1996 です。 このHOWTOには、あまり他では見つからないような、Linux をちょいっと 良くする小ワザやヒントが載っています。 1. はじめに ようこそ Linux Tips HOWTO へ。これは Linux がもっと楽しくなるイカした 仕掛け&最適化法の文書。今回は自分で思いついたモノと前の Tips-HOWTO にあった物(先人の千絵^H^H知恵を無駄にしちゃぁイカン)だけなんで、お 気に入りのアドバイスや tips があったら何でも送って。次の Tips-HOWTO に載せられるかも。 Linux TIPS HOWTO 管理者 Paul Anderson panderso@ebtech.net 2. 短い Tips 2.1. お手軽 Syslog トリック。〜Tips-HOWTO 管理人 Paul Anderson /etc/syslog.conf を編集し、次の行を入れちゃいましょう。 # 全て tty8 に書き出せ *.* /dev/tty8 ちょい注意:Tab を使うんですよ。syslog はスペースがダメです。 2.2. ファイルシステム間でディレクトリを移動。〜Alan Cox、A.Cox@swansea.ac.uk [訳注; JF の小島三弘さんより「Alan Cox さんのこのアドレスは obsolete ですね。 最近は alan@lxorguk.ukuu.org.uk から投稿しているようです。」] あるディスクから他のディスクへ、ファイルツリーを丸ごと素早く移動する方法 (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -) 事故ってディレクトリをダメにしないように、cd /source/directory; tar.... 云々というものから変更しました。Jim Dennis、jadestar@rahul.net さん、 教えてくれてありがとう。〜管理人 2.3. どのディレクトリが一番大きいかを知る。〜Mick Ghazey、 mghazey@miso.lowdown.com ウチのコンピュータでどのディレクトリが一番大きいの?って思ったことは ありませんか? du -S | sort -n とすると判ります。 2.4. Linux Gazette( Linux 新聞) Linux Gazette の創造者、John Fisk に栄誉あれ。素晴らしい e-zine(オンライン マガジン)であるうえ、無料です!!! これ以上何を期待します? http://www.redhat.com/lg をチェックして下さい。行った人は LG がどれほど素晴らしい e-zine であるか、 John Fisk にひとこと書いて下さいね。 2.5. GNU Make 3.70 の VPATH まわりの振る舞いを変えるパッチのありか。Ted Stern、 stern@amath.washington.edu この問題を抱えてる人が多いかどうかは知りません。が、GNU Make のバージョン 3.70 には、私の気に入らない「特徴」があります。VPATH を絶対パス名で与えた 場合、おかしな動作をするのです。きわめて安定したパッチを Paul D. Smith が提供しています。彼はまた、GNU Make に改変がある 度に、ニュースグループ gnu.utils.bug にドキュメントとパッチを投稿しています。 私はだいたい、アクセスする全システムの gmake に彼のパッチを当てて再コンパイル しています。 2.6. リブートのたびにいちいち fsck するのをやめさせるには? 〜Dale Lutz、dal@wimsey.com Q: ブートの度に e2fsck がディスクをチェックします。やめさせるには? A: カーネルを再構築すると、そのファイルシステムは”dirty”とマークされます。 おかげでブートの度にディスクがチェックされるようになっちゃいます。 これを直すには、 rdev -R /zImage 1 を実行。するとカーネルが修正され、ファイルシステムは”dirty”では なくなります。 Note: lilo を使ってるなら、lilo の設定ファイル(普通 /etc/lilo.conf ) の linux をセットアップするところに read-only を加えてね。 2.7. リブート時、”device busy”のせいで起きる fsck を避けるには。 〜Jon Tombs、jon@gtex02.us.es シャットダウンの際に device busy エラーが頻発し、リブートの際に fsck が 必要になってしまう場合、簡単に修正できます。 /etc/brc か /sbin/brc で umount -a を呼ぶ以前の行に、以下を加えます。 mount -o remount,ro /mount.dir この行を / 以外にマウントする全てのファイルシステムのために書きましょう。 こうすれば、何らかの理由で shutdown がプロセスの kill に失敗し、ディスクの umount ができなくても、リブートの際にはディスクは clean です。リブート時間 をかなり節約してくれてます。 2.8. ハードディスク中の最大級のファイルを見つけるには。 〜Simon Amor、simon@foobar.co.uk ls -l | sort +4n とします。 本当にディスクスペースが逼迫しているあなたには、 cd / ls -lR | sort +4n があります。時間はチョットかかりますが、かなり使えますよ。 2.9. パンチ穴を開ける分のマージンを取ってプリントアウトする方法。 〜Mike Dickey、mdickey@thorplus.lib.purdue.edu ______________________________________________________________________ #!/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.10. 特定の正規表現を使ってファイルツリー中を検索する方法。 〜Raul Deluth Miller、rockwell@nova.umd.edu 私はこのスクリプトを '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.11. プログラムが自動的に作ったバックアップファイルやオートセーブファイル を始末するスクリプト。〜Barry Tolnas、tolnas@nestor.engr.utk.edu ディレクトリ階層を再帰的に降下して、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.12. メモリを多く食ってるプロセスの見つけかた。〜Simon Amor、 simon@foobar.co.uk ps -aux | sort +4n -または- ps -aux | sort +5n 3. 詳細な Tips 3.1. Linux と Windows の共有スワップパーティション。 〜Tony Acero、ace3@midway.uchicago.edu 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 に以下のものを加える。パッケージが /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. immutable(不変)フラグの使い方。〜Jim Dennis、jadestar@rahul.net Immutable フラグを使え インストール、コンフィギュアを済ませたら、すぐ、/bin、/sbin/、/usr/bin、 /usr/sbin、/usr/lib(その他、通常必要そうな場所)を 'chattr +i command' して回るべし。ケチケチせずにどんどん行こうよ。ルートにあるカーネルファイ ルも immutable にしよう。次は、 'mkdir /etc/.dist/' して、/etc/ にある ファイルを全部このディレクトリにコピーしよう。(私はこれを /tmp/etcdist.tar を作って2ステップで実行し、コピーがループするのを防い でます)。(単に /etc/.dist.tar.gz を作るってもよろしい。)--そして、 このファイルも immutable にしよう。 こうしておけば、root としてログインしたときに起こしうるダメージを最小限に できます。リダイレクションを誤ってファイルを上書きしたり、'rm -fr' コマン ドに誤ってスペースを入れちゃってシステムを使用不能にしたくないでしょ? (依然としてデータにはダメージを与えられますが、ライブラリとバイナリは 安全になります。) また、この作業によりセキュリティーが強化され、各種サービスを悪用する方法が 不可能あるいは極めて困難になります。(これらの多くが、*本来任意のシェル コマンドを実行できるようにはなっていない* SUID されたプログラムを使い、 ファイルを上書きする方法をとっているからです) この作業によって唯一不便になるのは、様々なシステムバイナリを 'make install' するときです。つまり、この作業によって 'make install' による ファイルの上書きも拒否されます。Makefile を読むのを忘れ、上書きされる はずのファイル(とファイルを付け加えようとしているディレクトリ)に chattr -i しなかった場合 -- その make は失敗します。まあ、単に chattr コマンドを使ってから make を再実行すればいいんですが。これは 古いバイナリやライブラリなど、その時上書きされそうなものを .old/ ディレクトリに移したり、リネームしたり、tar でまとめておくチャンスで もあります。 3.3. 新しいモノを入れる場所についての提言。〜Jim Dennis jadestar@rahul.net 新しいモノはみんな、/usr/local か /usr/local/`hostname` の下で始めよう。 配布パッケージが /usr/local を使わないなら、自分で /usr/local/src、 /usr/local/bin などを作って使おう。/usr/local ツリーに何か置くような配布 パッケージなら、'mkdir /usr/local/`hostname` した上で、'wheel' グル−プ にそのディレクトリへの書きこみ権限 (+w) を与えよう(私は更に、wheel グル −プのユーザに SUID と SGID することで、そのプログラムが自分のファイルと 自分で作ったファイルのみをいじれるよう、作られたファイルは 'wheel' グル −プに属すようにしています)。 さあ、もうこれからはいつも!いつも!いつも!、新しいパッケージ (.tar その他のファイル)は /usr/local/src/.from/$WHEREVER_I_GOT_IT/ [訳注: /usr/local/src/.from/どこでもとにかく取って来た場所の名前/ で、どんな所から取ってきても必ず場所を書くこと、という意味] に置き、/usr/local/src(または .../$HOSTNAME/src )以下でコンパイルする 習慣をつけよう。そのプログラムが /usr/local 以下の部分にインストールさ れることを確かめるべし。もし「絶対に」 /bin や /usr/bin にインストール しなければならないプログラムなら、/usr/local 以下の階層からそこにシンボ リックリンクを張るようにする。 面倒くさいですが、こうしておけば配布メディア(今では大体CDですね)から 全てを再インストールする際、バックアップすべきファイルと再インストールす べきファイルを分けやすくなります。また、/usr/local/.from ディレクトリを 使うことで、ソースをどこから持ってきたかの非公式なログを保存することもで きます。こうしておくと新しいバージョンを探しやすくなりますし、セキュリ ティー関係のアナウンスを追いかける際には極めて重要な情報になります。 自分のものに関してもこういう風にする以前、家のシステム(今使ってるやつ) では、元々の配布パッケージのファイルと新しくインストールしたファイルを ごちゃごちゃにしていました。自分だけが使うシステムであり、ほとんど設定を いじっていないにも関らず、もとの「インストールされたままの」システムと どんな風に違うか、全て「判っている」とは言えませんでした。 対照的に、私が仕事(システム管理のようなことをやらされていた頃です)で 設置したシステムは、全てこのやり方で設定しています。これらのマシンは契約 で作業している人やあまり出来のよくない人など、さまざまな人々に管理され、 いろいろとバージョンアップされたり、新しいプログラムをインストールされた りします。にもかかわらず、最初にシステムをインストールし、設定した *後に*、どんなものが組み入れられたか厳密に知っています。 3.4. 新人システム管理者向けのいくつかの tips。〜Jim Dennis、 jadestar@rahul.net /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 - (セッションログを生成するのに typescript コマンドを使い、このログを 追加更新するのにファンクションを生成しています。) 私自身は、このように記録を自動的に取る方法を採用していません。ずっと自己 訓練してやってきました。でも、(上に示したようなスクリプトやシェル機能 を使って記録を自動的にさせるような)アイデアは気にいっています。先のス クリプトで気になるところは 'script' コマンドを使ってるところです。この スクリプトを広める前に、 'script' コマンドのソースを探してきて、いくつ かのコマンドラインパラメータ(コマンドラインから記録を一時停止したり中 止するオプション)を追加しなければならないと考えています。 最後の提言(今のところ)は: root のパスは 'PATH= /bin' とすべきである です。ルートのパスに他の物は加えません。ルートの作業は、/bin からの シンボリックリンク、エイリアス、シェルファンクションで提供されるか、 /bin に存在するスクリプトかバイナリ、あとは絶対パスで指定されるもので あるべきです。それで全てにすべきなのです。 やってみると、ルートで頑張っている人は自分が各種のバイナリコマンドに どれほど頼っているか(時には苦しみと共に)気付くでしょう。複数のユーザが 利用するホスト5. xdm のホストを選ぶチューザー (chooser) を設定する方法。 〜Arrigo Triulzi、a.triulzi@ic.ac.uk 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 を編集し、ローカルマシンでサーバをスタート する行、例えば starting 0: をコメントアウトする。 3. マシンをリブートすると、はい、家でも外でも使えます。 自分のサブネットでこの設定をしようと必死だったとき、何が悪いか全部見当が 付くまで、一週間ほど取られちゃいました。で、これを書き加えました。 おっと:何らかの理由で、古い SLS (1.1.1) では、xdm の行の後ろに -nodaemon を付けておけます。 -- これは後のリリースでは動きません。