[ 前のページ ] [ 目次 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ 次のページ ]


Debian リファレンス
第 8 章 - Debian tips


8.1 システムをブートする

ブートプロンプトの詳細は LDP にある BootPrompt-HOWTO をご覧ください。


8.1.1 "root パスワードを忘れてしまった!" (その 1)

コンソールのキーボードにアクセスできる人に限り、root パスワードを 知らずにシステムをブートして root アカウントにログオンできます。 (システムをブートするのを妨げる BIOS や lilo などの ブートローダからパスワードを要求されないことを仮定しています。)

これは外部の boot disk や BIOS のブート設定の変更を要求しない手順 です。ここで、"Linux" は標準の Debian インストールで Linux kernel をブートするためのラベルです。

lilo ブートスクリーンでは、boot: が表示されたら すぐに enter を押し、次のように入力します。 (自動ブートを避けるため、この時点で shift キーを押す必要があるシステム があります。また、lilo がフレームバッファを使っている場合、 タイプしたオプションを見るには TAB を押す必要があります。)

     boot: Linux init=/bin/sh

この操作により、システムが kernel をブートし、標準の init の代わりに /bin/sh を起動します。今や root 権限と root シェル を獲得しました。/ は現在読み込みのみでマウントされ、 多くのディスクパーティションはまだマウントされていないので、 十分機能するシステムとするには、次を実行する必要があります。

     init-2.03# mount -n -o remount,rw /
     init-2.03# mount -avt nonfs,noproc,nosmbfs
     init-2.03# cd /etc
     init-2.03# vi passwd
     init-2.03# vi shadow

(/etc/passwd の 2 番目のデータフィールドが全てのユーザ名に対して "x" である場合、そのシステムはシャドウパスワードを使用しているため、 /etc/shadow を編集する必要があります。) root パスワードを無効にするには、パスワードファイルの 2 番目のフィールド が空になるように編集してください。システムをリブートして、パスワード無しで root としてログインできるようになりました。runlevel 1 でブートすると、 (少なくとも Potato 以降の) Debian はパスワードを要求しますが、より古い システムは要求しませんでした。

/usr/ にアクセスできない場合に備えて /bin/ に最小限のエディタを置いておくのは良い考えです。 (緊急用エディタ, 第 11.2 節 参照)

また、sash パッケージのインストールも考慮に入れてください。 システムがブート不能に陥った場合、次を実行します。

     boot: Linux init=/bin/sash

sash/bin/sh が使えなくなった場合でも sh 対話的な代替品として働きます。 これはスタティックリンクされており、多くの標準的な機能を組込み機能として 含んでいます。 (リファレンスリストのため、プロンプトで "help" をタイプしてみてください)


8.1.2 "root パスワードを忘れてしまった!" (その 2)

rescue disk/root disk セットからブートします。 /dev/hda3 がもともとの root パーティションの場合、 次の手順は、パスワードファイルを前述の手順と同じ程度に簡単に編集できるように します。

     # mkdir fixit
     # mount /dev/hda3 fixit
     # cd fixit/etc
     # vi shadow
     # vi passwd

この手法の前述した手法に対する利点は、lilo パスワードを知る (ある場合) 必要がないことです。しかし、本手法を使うには、 システムがフロッピ又は CD からブートできるように BIOS セットアップに アクセスできる必要があります。


8.1.3 boot 不能

インストール中に boot ディスクを作るのをさぼっていたとしても、問題ありません。 lilo が壊れた場合、Debian インストールセットから boot disk を持ってきて、そこからシステムを boot させます。boot プロンプトでは、 root パーティション が /dev/hda12 であり、 ランレベル 3 で起動したいと仮定すると、次のコマンドを入力します。

     boot: rescue root=/dev/hda12 3

そして、フロッピにある kernel を使ってほとんどフル機能のシステムにブート します。(kernel の機能やモジュールの不足によるささいな誤作動はあります。)

システムが壊れた場合、ブート不能なシステムにパッケージをインストール, 第 6.3.6 節 をご覧ください。

カスタムブートフロッピが必要な場合、rescue disk の readme.txt に従ってください。


8.1.4 "boot 時に X を無効にさせてくれ!"

unstable を追いかけることは楽しいですが、ブート中に起動する バギーな xdmgdmkdm あるいは wdm がひどく噛みつくとも限りません。

まず boot プロンプトで次を入力して root シェルを獲得します。

     boot: Linux vga=normal s

ここで、Linux はブートしたい kernel のためのラベルです。 "vga=normal" により、lilo が必ず通常の VGA モードで起動します。 そして、"s" (又は "S") は init がシングルユーザモードを呼び出す ために渡されるパラメータです。

X の起動デーモンを全て無効にするためのいくつかの方法があります。

ここで、rc2.d の中の数字は /etc/inittab で指定したランレベルと対応させなければなりません。また、 ?dm は全ての xdm, gdm, kdm, wdm を置き換えるために複数回コマンドを 実行する必要があることを意味します。

このリストの最初だけが Debian での "真実の道" です。最後の方法は 簡単ですが、Debian でしか動かず、dpkg-reconfigure を使用した後は再度ディスプレイマネージャの設定を要求します。 残りは汎用のデーモンの無効化手段です。

コンソールシェルから startx コマンドを使って X をまだ起動 できます。


8.1.5 ブートプロンプトを使った他のブートトリック

lilo のブートプロンプトを使ってシステムを特定のランレベル と設定でブートすることができます。詳細は BootPrompt-HOWTO (LDP) にあります。

システムをランレベル 4 でブートさせたい場合、lilo の ブートプロンプトで次を入力してください。

     boot: Linux 4

root パスワードを知っている状態でシステムを普通に動くシングルユーザモード で起動したい場合、次の例のうち 1 つを lilo のブートプロンプト で実行してください。

     boot: Linux S
     boot: Linux 1
     boot: Linux -s

システムを実際よりも少ないメモリ容量を用いてブートしたい場合 (例えば 64MB のシステムで 48MB を用いる場合)、lilo ブートプロンプト で次を実行してください。

     boot: Linux mem=48M

実際より多いメモリ容量をここで絶対指定しないでください。さもないと kernel がクラッシュします。64MB より多い、例えば 128MB のメモリを持っている場合、 mem=128M をブートプロンプトで実行するか、同様の行を /etc/lilo.conf に追加しないと、古い kernel や古い BIOS を 持つマザーボードは 64MB 以上のメモリを使用できません。


8.1.6 GRUB ブートパラメータの設定

GRUB は GNU Hurd プロジェクト由来の新しいブートマネージャであり、 Lilo より柔軟性がありますが、ブートパラメータの取り扱い方が lilo とはずいぶん異なります。

     grub> find /vmlinuz
     grub> root (hd0,0)
     grub> kernel /vmlinuz root=/dev/hda1
     grub> initrd /initrd
     grub> boot

ここで、Hurd デバイス名に気づく必要があります。

     the Hurd/GRUB       Linux               MS-DOS/Windows
      (fd0)               /dev/fd0            A:
      (hd0,0)             /dev/hda1           C: (通常)
      (hd0,3)             /dev/hda4           F: (通常)
      (hd1,3)             /dev/hdb4           ?

詳細は /usr/share/doc/grub/README.Debian.gz/usr/share/doc/grub-doc/html/ をご覧ください。


8.2 行動を記録する


8.2.1 シェルでの行動を記録する

システム管理者は Unix 環境において通常の PC 環境よりもより複雑な仕事 を行います。システムトラブルから回復する必要がある場合に備えて、 設定の最も基本的な意味を確実に知る必要があります。X11 ベースの GUI 設定ツールは見栄えは良く便利ですが、たびたび緊急事態に対応できません。

このような観点で、シェルでの活動を記録することは、特に root に とっては良い習慣です。

Emacs では、M-x shell を実行すると、バッファに記録を開始し、 C-x C-w を使うとバッファをファイルに書き出します。

Shell では、screen を使って端末を切替える, 第 8.6.28 節 に記述されているように、screen コマンドを "^A H" 付きで実行するか、script コマンドを 使ってください。

     $ script
     スクリプトを開始しました、ファイルは typescript です
      ... 何かを行う ...
      Ctrl-D
     $ col -bx <typescript >savefile
     $ vi savefile

次は script の代わりに使えます。

     $ bash -i 2>&1 | tee typescript

8.2.2 X での行動を記録する

xterm の表示を含む X アプリケーションのグラフィックな画像を記録する 必要がある場合、gimp (GUI) を使いましょう。ウィンドウごとあるいは スクリーン全体をキャプチャーできます。代替品には、xwd (xbase-clients), import (imagemagick), scrot (scrot), があります。


8.3 サブディレクトリ全体のコピーとアーカイブ

これらのコピーとアーカイブコマンドはシステムやデーターのバックアップの 基本となります。簡単なバックアップスクリプト例が  スクリプト例に backup として納められています。


8.3.1 サブディレクトリ全体をコピーする基本的なコマンド

ファイル構成を再調整する必要がある場合、ファイルのリンクを含む内容を 次のように移動します。

     標準的方法
     # cp -a /source/directory /dest/directory # GNU cp が必要
     # (cd /source/directory && tar cf - . ) | \
             (cd /dest/directory && tar xvfp - )
     ハードリンクを含む場合、衒学的な方法が必要となります。
     # cd /path/to/old/directory
     # find . -depth -print0 | afio -p -xv -0a /mount/point/of/new/directory
     リモートにコピーする。
     # (cd /source/directory && tar cf - . ) | \
             ssh user@host.dom (cd /dest/directory && tar xvfp - )
     リンクファイルが無い場合は次を実行する。
     # scp -pr user1@host1.dom:/source/directory \
               user2@host2.dom:/dest/directory

サブディレクトリ全体のコピーに関する次の比較情報は Manoj Srivastava (srivasta@debian.org) により debian-user@lists.debian.org で掲示されました。


8.3.2 cp

伝統的に、cp はシンボリックリンクを参照しませんし、ハードリンク を保つので、本当はこの仕事に向いていません。もう 1 つ考えるべきことは、 まばらなファイル (穴を持つファイル) です。

GNU cp はこれらの制限を越えています。しかしながら、非 GNU システムでは、cp はまだこの問題を抱えています。また、 cp を用いて、小さく移植性の高いアーカイブを作成できません。

     % cp -a . newdir

8.3.3 tar

Tar は cp が持つシンボリックリンクの問題のいくつかを 解決していますが、cpio は特別なファイルを扱えるため、 伝統的な tar は使用されていません。

tar の複数のハードリンクの操作方法は、テープ上に 1つ しかコピーを置かないことですが、コピーの名前はそのファイルを取得する ために使用される 唯一の 名前です。cpio の方法は 全リンクに対して 1つのコピーを置きますが、全リンクの名前を使ってファイル を取得できます。

tar コマンドは .bz2 ファイルに対するオプションが Potato と Woody の間で変更されました。ですから、短縮形のオプションである -I (Potato) や -j (Woody) の代わりに、スクリプトでは --bzip2 を使ってください。


8.3.4 pax

新しい POSIX (IEEE Std 1003.2-1992, pages 380–388 (section 4.48) と pages 936–940 (section E.4.48)) 互換の移植性のあるアーカイブ 交換ユーティリティです。pax はアーカイブファイルの読み書き、 内容のリスト表示が行え、ディレクトリ階層のコピーもできます。pax の操作は特別なファイルフォーマットに依存せず、さまざまなアーカイブフォーマット をサポートしています。

pax の実装はまだ新しく、未熟です。

     # apt-get install pax
     $ pax -rw -p e . newdir
      又は
     $ find . -depth  | pax -rw -p e  newdir

8.3.5 cpio

cpiocpio 又は tarアーカイブへの ファイルの操作ができます。アーカイブはディスク上の他のファイルにできますし、 磁気テープやパイプにもできます。

     $ find . -depth -print0 | cpio --null --sparse -pvd new-dir

8.3.6 afio

afiocpio フォーマットアーカイブの操作を 行うより良い手段です。般に、cpio よりも高速で、データの 変造をいくらか上品な方法で扱います。マルチボリュームなアーカイブを サポートし、さらに対話的な操作もサポートします。 afiotarcpio アーカイブ を圧縮するよりもより安全な圧縮アーカイブを作成できます。afio はバックアップスクリプト内で "アーカイブエンジン" として使うのにベストです。

     $ find . -depth -print0 | afio -px -0a new-dir

私は磁気テープへのバックアップに afio を使っています。


8.4 差分バックアップとデータ同期

差分バックアップとデータ同期はいくつかの方法で実装できます。

サブディレクトリ全体のコピーとアーカイブ, 第 8.3 節 に記述されているアーカイブ手法と タスクのスケジューリング (cronat), 第 8.6.27 節 に記述されている規則的なジョブの自動化を組み合わせると、すばらしい バックアップシステムとなります。

3つの使いやすいユーティリティについて説明します。


8.4.1 rdiff を用いた差分バックアップ

rdiff-backup はあらゆるタイプのファイルに対して 差分バックアップによる素晴らしくシンプルなバックアップを提供します。 ~/ のほとんどを /mnt/backup にバックアップするには、 次を実行します。

     $ rdiff-backup --include ~/tmp/keep --exclude ~/tmp  ~/ /mnt/backup

このアーカイブから 3 日前のデータを ~/old に復旧するには、 次を実行します。

     $ rdiff-backup -r 3D /mnt/backup ~/old

rdiff-backup(1) をご覧ください。


8.4.2 pdumpfs による日々のバックアップ

pdumpfs は 毎日のスナップショットを保存する Plan9 の dumpfs と似たシンプルな日々のバックアップシステムです。 ある日のファイルを取得するために、あらゆる過去のスナップショットにアクセス できます。ホームディレクトリを pdumpfscron でバックアップしましょう!

pdumpfs は送り先ディレクトリに YYYY/MM/DD の形 でスナップショットを構築します。全ソースファイルは pdumpfs が最初に起動された際にスナップショットディレクトリにコピーされます。 次回の起動からは、ディスクスペースの節約のため、pdumpfs は更新されたか、新たに作成されたファイルのみコピーし、未更新ファイルは 前日のスナップショットのファイルにハードリンクされます。

     $ pdumpfs src-dir dest-dir [dest-basename]

pdumpfs(8) をご覧ください。


8.4.3 RCS による規則的な差分バックアップ

Changetrack はテキストベースの設定ファイルの変更点を RCS アーカイブに定期的に記録します。 changetrack(1) をご覧ください。

     # apt-get install changetrack
     # vi changetrack.conf

8.5 システムフリーズからの回復


8.5.1 プロセスを殺す

top を起動し、どのプロセスの動きがおかしいかを調べます。 CPU 使用量でソートするためには `P' 、メモリ量でソートするには `M'、 プロセスを殺すには `k' を押します。又は、BSD スタイルの ps aux | less や System-V スタイルの ps -efH | less も使えるかもしれません。 System-V スタイルの文法では親 ID (PPID) を表示するので、 ゾンビ (defunct) となった子プロセスを殺すのに使えます。

プロセス ID によりプロセスを殺す (又はシグナルを送る) には kill を、プロセスのコマンド名により同様のことを行うには killall を使います。良く使われるシグナルは次の通りです。

      1: HUP、デーモンを再起動
     15: TERM、通常の kill
      9: KILL、激しく kill する

8.5.2 Alt-SysRq

システム故障に対する緊急手段が kernel のコンパイルオプション "Magic SysRq key" により供給されています。i386 で Alt-SysRq を押し、r 0 k e i s u b キーのうち一つを続けて押してください。すると魔法が効果を発揮します。

Un`r'aw は X のクラッシュの後などにキーボードを回復します。端末の ログレベルを `0' に減らすと、エラーメッセージが減少します。 sa`k' (sytem attention key) は現在の仮想端末上の全プロセスを殺します。 t`e'rminate は現在の端末上の init 以外の全プロセスを殺します。 k`i'll は init 以外の全プロセスを殺します。

`S'ync、 `u'mount、そして re`b'oot は本当にひどい状況から脱出するための ものです。

Debian の標準でインストールされる kernel は本文書が書かれた現時点では 本オプション付でコンパイルされていません。kernel を再構築してこの機能を 有効にしてください。詳しい情報は /usr/share/doc/kernel-doc-version/Documentation/sysrq.txt.gz 又は /usr/src/kernel-version/Documentation/sysrq.txt.gz にあります。


8.6 覚えるべき小さくて洒落たコマンド


8.6.1 Pager

less は標準的なページャ (ファイル内容のブラウザ) です。 ヘルプは `h' を押してください。more よりずっと多くのことが できます。lesseval $(lesspipe)eval $(lessfile) をシェルの起動スクリプトで実行することにより ブーストできます。詳細は /usr/share/doc/lessf/LESSOPEN をご覧ください。 -R オプションにより、文字をそのまま表示し、ANSI の カラーエスケープシーケンスを有効にします。less(1) をご覧ください。

w3m もいくつかのエンコードシステム (EUC) では役に立つ ページャの代替品かもしれません。


8.6.2 フリーなメモリ

freetop はメモリリソースに関する良い情報を 提供します。"Mem:" 行にある "used" のサイズは心配しなくてもよいですが、 その下を読んでください。 (下の例の 38792)

     $ free -k # for 256MB machine
                  total       used       free     shared    buffers cached
     Mem:        257136     230456      26680      45736     116136 75528
     -/+ buffers/cache:      38792     218344
     Swap:       264996          0     264996

物理メモリの正確な量は grep '^Memory' /var/log/dmesg により 確認できます。この場合、 "Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)" のような出力となります。

     合計         = 262144k = 256M (1k=1024, 1M=1024k)
     dmesg でのフリーなメモリ量 = 256984k = Total - kernel - reserved - data - init
     シェルでのフリーなメモリ量 = 257136k = Total - kernel - reserved - data

約 5MB は kernel が使用するため、システムにより使用不可にされています。


8.6.3 時刻の設定 (BIOS)

     # date MMDDhhmmCCYY
     # hwclock --utc --systohc
     # hwclock --show

これはシステム時刻とハードウェア時刻を MM/DD hh:mm, CCYY にセットします。 時刻はローカル時間で表示されますが、ハードウェア時間は UTC を用います。

もしハードウェア (BIOS) 時刻が GMT に設定されている場合は、 /etc/default/rcS 中で UTC=yes と設定を変更します。


8.6.4 時刻の設定 (NTP)

Managing Accurate Date and Time HOWTO を参照。


8.6.4.1 インターネットへの常時接続により時刻を設定する

リモートのサーバ経由自動的にシステムのクロックを設定して時刻を修正します。

     # ntpdate server

システムがインターネットに常時接続している場合、/etc/cron.daily/ に書いておくのがよいでしょう。


8.6.4.2 散発的なインターネット接続で時刻を設定する

chrony パッケージを使用してください。


8.6.5 スクリーンセーバなどのコンソール機能の制御方法

スクリーンセーバを無効にするには、次のコマンドを使ってください。

Linux コンソール上では、次を実行します。

     # setterm -powersave off

kon2 (kanji) コンソールのスクリーンセーバを起動します。

     # kon -SaveTime 0

X 起動中には次を実行します。

     # xset s off
      又は
     # xset -dpms
      又は
     # xscreensaver-command -prefs

他のコンソール機能を制御するには、対応するマニュアルを読んでください。 ターミナルの行設定を変更したり印刷するには、stty(1) も読んでください。


8.6.6 管理データベースの検索

Glibc は管理データベースからエントリ、すなわち、パスワード、グループ、 ホスト、サービス、プロトコル、ネットワークなどを検索するために、 getent(1) を提供しています。

     getent database [key ...]

8.6.7 サウンド (ビープ音) を無効にする

PC スピーカを常に抜いておくこともできます ;-) Bash シェルでは次を実行します。

     echo "set bell-style none">> ~/.inputrc

8.6.8 コンソールのスクリーン上のエラーメッセージ

スクリーンに出るエラーメッセージを黙らせるには、まず /etc/init.d/klogd をチェックします。このスクリプトに KLOGD="-c 3" をセットし、 /etc/init.d/klogd restart を起動します。 代わりに、dmesg -n3 を起動することもできます。

エラーレベルの意味を示します。

特定の使えないエラーメッセージが煩わしい場合、shutup-abit-bp6 のような些細な kernel patch を適用することを考慮に入れましょう。 (examples subdirectory で入手可能)

他に見るべき箇所は、/etc/syslog.conf です。コンソールデバイス にメッセージが出力されるようになっているかをチェックしましょう。


8.6.9 正しいタイプに端末を設定する

Unix ライクシステムでの端末スクリーンは通常 (n)curses ライブラリ ルーチンを使ってアクセスされます。これらのライブラリはユーザに 適度な最適化による端末に依存しない文字端末の更新手段を与えます。 ncurses(3X)terminfo(5) をご覧ください。

Debian システムでは、前もって定義された多数のエントリがあります。

     $ toe | less                  # 全エントリ
     $ toe /etc/terminfo/ | less   # ユーザが再定義したエントリ

環境変数 TERM として選択したエントリをエクスポートします。

Debian でないホストから Debian システムにリモートでログインした時に、xterm 用の 端末エントリが Debian でない xterm では動かない場合、 端末のタイプを "xterm" から "xterm-r6" などの機能制限されたものに変更してください。 詳細は /usr/share/doc/libncurses5/FAQ をご覧ください。"dumb" は terminfo 用の最小の共通部分 です。


8.6.10 端末を正常な状態に戻す

cat some-binary-file を実行してしまって端末が手を付けられなく なってしまった時は、次を実行します。 (タイプしてもコマンドがエコーされて見えないかもしれません)

     $ reset

8.6.11 DOS から Unix スタイルにテキストファイルを変換する

(EOF = ^M^J である) DOS テキストファイルを (EOF = ^j である) Unix テキストファイルに変換します。

     # apt-get install sysutils
     $ dos2unix dosfile

8.6.12 recode によりテキストファイルを変換する

次のコマンドにより、テキストファイルの改行コードを DOS, MAC, そして Unix 間 で変換できます。

     $ recode /cl../cr <dos.txt >mac.txt
     $ recode /cr.. <mac.txt >unix.txt
     $ recode ../cl <unix.txt >dos.txt

フリーな recode はファイルの各種文字セットや surface を次のように 変換できます。

     $ recode charset1/surface1..charset2/surface2 \
       <input.txt >output.txt

次に示す文字セットがよく用いられます (ロケール入門, 第 9.7.3 節 も参照)。 [37]

次に示す surface がよく用いられます。 [38]

詳細は、info recode にある関連の説明をごらんください。

より目的に特化した変換ツールもあります。


8.6.13 正規表現による置換

FILES ファイルの全てにある FROM_REGEXTO_TEXT に置き換えます。

     $ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' FILES ...

-i は "in-place editing"、-p は "implicit loop over FILES ..." のためのオプションです。 置換が複雑な場合、パラメータ i.bak-i の代わりに 使うことで容易にエラーから回復できます。これは元のファイルをそれぞれ .bak をファイルの拡張子として追加して保存しておきます。


8.6.14 スクリプトを使ってその場でファイルを編集する

次のスクリプトはその場で 5–10 行と 16–20 行を削除します。

     #!/bin/bash
     ed $1 <<EOF
     16,20d
     5,10d
     w
     q
     EOF

ここで、ed コマンドは vi コマンドモードコマンドと同じです。 スクリプトがファイルの後ろから編集するのを容易にします。


8.6.15 ソースファイルから差分を取得しマージする

次に挙げる手順は 2 つのソースファイルの差分を取り、ファイルの場所に応じて 統合された差分ファイルを file.patch0 又は file.patch1 という名前で作成します。

     $ diff -u file.old file.new > file.patch0
     $ diff -u old/file new/file > file.patch1

差分ファイル (パッチファイルとも呼ばれる) はプログラムの更新箇所を送るために 使われます。差分ファイルを受け取ったパーティはこの更新を他の file に次のように適用します。

     $ patch -p0 file < file.patch0
     $ patch -p1 file < file.patch1

3つの異なるバージョンのソースコードを持っている場合は、diff3 を使ってより効率的にこれらをマージできます。

     $ diff3 -m file.mine file.old file.yours > file

8.6.16 大きなファイルを複数の小さなファイルに変換する

     $ split -b 650m file   # ファイルを 650MB 毎に分割
     $ cat x* >largefile    # 一つの大きなファイルにマージ

8.6.17 テキストファイルテーブルからデータを取り出す

全ての元 Debian リーダの名前と就任日がスペースで分割されたフォーマットで リストされている DPL と呼ばれるファイルを考えてみましょう。

     Ian     Murdock   August  1993
     Bruce   Perens    April   1996
     Ian     Jackson   January 1998
     Wichert Akkerman  January 1999
     Ben     Collins   April   2001
     Bdale   Garbee    April   2002
     Martin  Michlmayr March   2003

これらのタイプのファイルからデータを取り出すには、Awk が良く使われます。

     $ awk '{ print $3 }' <DPL                   # 開始月
     August
     April
     January
     January
     April
     April
     March
     $ awk '($1=="Ian") { print }' <DPL          # Ian と呼ばれる DPL のリスト
     Ian     Murdock   August  1993
     Ian     Jackson   January 1998
     $ awk '($2=="Perens") { print $3,$4 }' <DPL # Perens 就任時
     April 1996

Bash などのシェルもこれらのファイルを解釈するのに使えます。

     $ while read first last month year; do 
         echo $month
       done <DPL
     ... 最初の Awk の例と同じ出力

ここで、read 組込みコマンドは $IFS( 内部フィールドセパレータ) を用いて行を単語単位で分割します。

IFS を ":" に変更すると、/etc/passwd をシェルでうまくパーズ できます。

     $ oldIFS="$IFS"   # 旧値を保存
     $ IFS=":"
     $ while read user password uid gid rest_of_line; do
         if [ "$user" = "osamu" ]; then 
           echo "$user's ID is $uid"
         fi
       done < /etc/passwd
     osamu's ID is 1001
     $ IFS="$oldIFS"   # 旧値に戻す

(同じことを Awk を使って行うには、FS=":" を用いてフィールド セパレータをセットします。)

IFS はパラメータ拡張、コマンド置換、算術拡張の結果を分割するためにも シェルにより使われます。これらはダブルクォートやシングルクォートされた 単語内では発生しません。IFS の標準値は <space>, <tab>, と <newline> の組合せです。

シェルの IFS トリックを注意深く使ってください。 シェルがスクリプトの一部を 入力 として解釈した場合、 奇妙なことが起きるかもしれません。

     $ IFS=":,"                        # ":" と ","  を IFS として使う
     $ echo IFS=$IFS,   IFS="$IFS"     # echo は Bash 組込みコマンド
     IFS=  , IFS=:,
     $ date -R                         # 単なるコマンド出力
     Sat, 23 Aug 2003 08:30:15 +0200
     $ echo $(date -R)                 # サブシェルの出力をメインシェルに入力
     Sat  23 Aug 2003 08 30 36 +0200
     $ unset IFS                       # IFS を標準にリセット
     $ echo $(date -R)
     Sat, 23 Aug 2003 08:30:50 +0200

8.6.18 コマンドをパイプするためのわずかなスクリプト

次のスクリプトはパイプの一部として素晴らしいことをします。

     find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local"
                          # いくつかのファイルを除き /usr にある全ファイルを見つける
     xargs -n 1 command   # 標準入力からの全てのアイテムに対してコマンドを実行
     xargs -n 1 echo |    # スペース区切りのアイテムを行単位で分割する
     xargs echo      |    # 全ての行を 1 行にマージする
     grep -e pattern|     # patternを含む行を取り出す
     cut -d: -f3 -|
             # : で区切られた 3 番目のフィールドを取り出す (passwd ファイルなど)
     awk '{ print $3 }' | # スペースで区切られた 3 番目のフィールドを取り出す
     awk -F'\t' '{ print $3 }' |
             # タブで区切られた 3 番目のフィールドを取り出す
     col -bx |            # バックスペースを削除し、タブをスベースに変換する
     expand -|            # タブをスペースに変換する
     sort -u|             # 入力をソートし重複箇所を削除する
     tr '\n' ' '|         # 複数の行を 1 行に繋げる
     tr '\r' ''|          # キャリッジリターンを削除
     tr 'A-Z' 'a-z'|      # 大文字を小文字に変換する
     sed 's/^/# /'|       # 各行をコメントアウトする
     sed 's/\.ext//g'|    # .ext を削除する
     sed  -n -e 2p|       # 2 番目の行を表示
     head -n 2 -|         # 最初の 2 行を表示
     tail -n 2 -|         # 最後の 2 行を表示

8.6.19 ファイルごとにループするためのわずかなスクリプト

次の方法は各ファイルについて *.ext とのマッチングを行います。スペースを持つファイル名などを適切に扱うことを保証し、どの方法も同じように処置します。


8.6.20 Perl ショートスクリプトの狂気

Awk スクリプトは a2p(1) を用いれば自動的に Perl で書き直せますが、ワンライン Awk スクリプトは手動でワンライン Perl スクリプト に完璧に変換できます。例えば、

     awk '($2=="1957") { print $3 }' |

は次の行のどれとも同じです。

     perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
     perl -lane 'print $F[2] if $F[1] eq "1957"' |

上の行の perl への引数の全てのスペースはすべて削除できますし、 Perl における番号と文字列の間の自動変換の利点を利用しています。

     perl -lane 'print$F[2]if$F[1]eq+1957' |

コマンドラインオプションについては perlrun(1) をご覧ください。より狂った Perl スクリプトについては、http://perlgolf.sourceforge.net が興味深いかもしれません。


8.6.21 web ページからテキストやメーリングリストのアーカイブを取得する

次のコマンドは web ページを読み込んでテキストファイルに整形します。 Web から設定をコピーするときに非常に役立ちます。

     $ lynx -dump http://www.remote-site.com/help-info.html >textfile

ここで linksw3m も使えますが、描画に少し 違いがあります。

これがメーリングリストのアーカイブの場合、mime contents からテキストにするには munpack を使います。


8.6.22 web ページをきれいに印刷する

次のコマンドは web ページを PostScript ファイルに変換して印刷します。

     $ apt-get install html2ps
     $ html2ps URL | lpr

lpr又はlpd, 第 3.6.1 節 をご覧ください。また、PostScript ファイルを作成するには a2ps および mpage パッケージをチェック してみてください。


8.6.23 マニュアルページをきれいに印刷する

次のコマンドはマニュアルページを PostScript に変換して印刷します。

     $ man -Tps some-manpage | lpr
     $ man -Tps some-manpage | mpage -2 | lpr

8.6.24 2つの PostScript や PDF ファイルをマージする

2つの PostScript や PDF ファイルをマージできます。

     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \
       -sOutputFile=bla.ps -f foo1.ps foo2.ps
     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
       -sOutputFile=bla.pdf -f foo1.pdf foo2.pdf

8.6.25 コマンドの実行時間を計測する

プロセスにより使用された時間を表示します。

     # time some-command >/dev/null
     real    0m0.035s       # 壁掛け時計の時間 (真の経過時間)
     user    0m0.000s       # ユーザモードでの時間
     sys     0m0.020s       # kernel モードでの時間

8.6.26 nice コマンド

起動時にコマンドの nice 値をセットするには、nice (GNU の shellutils パッケージに収録) を使ってください。 renice (bsdutils) や top も プロセスを renice できます。nice 値が 19 の場合はプロセスは最低速度 (最低の優先度) なプロセスです。負の nice 値は "not-nice" であり、 -20 では最速 (最高の優先度) なプロセスです。スーパーユーザだけが 負の nice 値をセットできます。

     # nice  -19 top                                         # 非常に nice
     # nice --20 cdrecord -v -eject speed=2 dev=0,0 disk.img # 非常に高速

極端な nice 値はシステムに悪影響を及ぼすことが時々あります。注意して このコマンドを使ってください。


8.6.27 タスクのスケジューリング (cronat)

Linux で仕事をスケジューリングするには、cronat を使いましょう。at(1)crontab(5)crontab(8) をご覧ください。

定期的にスケジューリングするイベントを設定するには、crontab -e コマンドを起動して crontab ファイルを作成したり編集します。 crontab ファイルの例:

     # (/etc/passwd の指定に関らず) コマンド実行に /bin/sh を使用する。
     SHELL=/bin/sh
     # (この crontab の所有者に関らず) あらゆる出力を `paul' にメールする。
     MAILTO=paul
     # 分 時 月内日 月 曜日 コマンド (Day... are OR'ed)
     # 毎日、日付変更の 5 分後に実行する
     5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
     # 毎月初日の 2:15pm に実行する -- 出力は paul にメールされる
     15 14 1 * *     $HOME/bin/monthly
     # 平日の午後 10 時に実行してジョーを心配させる
     0 22 * * 1-5 mail -s "午後 10時だ" joe%ジョー、%%お前の子どもはどこだい?%
     23 0-23/2 * * * echo "毎日 0, 2, 4..時 23 分に実行する"
     5 4 * * sun     echo "日曜 4時 5分に実行する"
     # 毎月第一日曜日の午前 3時 40分に実行する
     40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args

一度きりの仕事をスケジューリングするには、at コマンドを起動します。

     $ echo 'command -args'| at 3:40 monday

8.6.28 screen を使って端末を切替える

screen プログラムにより、単独の実際の端末又は 端末エミュレータウィンドウ上で複数の仮想端末を起動させ、 それぞれの端末で固有のの対話型シェルを持たせることが可能となります。 Linux の仮想端末や複数の xterm ウィンドウを使っている場合でさえも、 次に示す screen の豊富な機能セットを探検する価値はあります。


8.6.28.1 遠隔アクセスのシナリオ

リモートターミナルからや VT100 ターミナルプログラムを使って Linux マシンに よくログインする場合、screenを使うと detach (切り離し) 機能により生活がより簡単になります。

  • ダイアルアップ接続経由でログインし、いくつかのウィンドウでエディタや 他のプログラムを開いて複数の screen を起動します。

  • 突然端末を離れることが必要になりましたが、ハングアップすることにより 今までやった仕事を失いたくありません。

  • ^A d をタイプしてセッションを デタッチ してログアウトします (又は、より素早くやるには、^A DD をタイプして screen をデタッチして screen 自身をログアウト します。)

  • 再びログインする時に、screen -r コマンドを入力すると、 screen は魔法のように前に開いていたウィンドウ全てを リアタッチ します。


  • 8.6.28.2 典型的な screen コマンド

    いったん screen を始めると、標準では ^A である コマンドキーストロークを除く全てのキーボード入力が現在のウィンドウに 送られます。全ての screen コマンドは ^A に加えて さらに一つのキー [に加えてパラメータ] をタイプすることにより入力されます。 役立つコマンドを挙げます。

         ^A ?     ヘルプスクリーンを表示 (キーバインドダイアログ)
         ^A c     新規ウィンドウを作成してそこに切替える
         ^A n     次のウィンドウに移動
         ^A p     前のウィンドウに移動
         ^A 0     ウィンドウナンバー 0 に移動
         ^A w     ウィンドウリストを表示
         ^A a     カレントウィンドウにキーボード入力として Ctrl-A を送信
         ^A h     カレントウィンドウのハードコピーをファイルに書き出す
         ^A H     カレントウィンドウのファイルへのログ記録を開始/終了
         ^A ^X    端末をロック (パスワードによる保護)
         ^A d     ターミナルからスクリーンセッションをデタッチする
         ^A DD    スクリーンセッションをデタッチしてログアウトする
    

    これは screen コマンドと機能の小さなサブセットに過ぎません。 screen にやらせたいことが何かあるなら、たぶんできるでしょう。 詳細は screen(1) をご覧ください。


    8.6.28.3 screen セッションでのバックスペースと Ctrl-H

    screen を起動中にバックスペースや Ctrl-H が動かないことに 気づいた場合、 /etc/screenrc を編集し、次の行を見つけたら コメントアウトしてください。(すなわち、この行の先頭に "#" を追加してください)

         bindkey -k kb stuff "\177"
    

    8.6.28.4 X 用の screem と等価なプログラム

    xmove を調べてください。xmove(1) をご覧ください。


    8.6.29 ネットワークテストの基礎

    netkit-ping, traceroute, dnsutils, ipchains (2.2 kernel 用), iptables (2.4 kernel 用), そして net-tools パッケージをインストールして次を実行します。

         $ ping yahoo.com            # インターネット接続をチェック
         $ traceroute yahoo.com      # IP パケットを追跡
         $ ifconfig                  # ホストの設定をチェック
         $ route -n                  # ルーティング設定をチェック
         $ dig [@dns-server.com] host.dom [{mx|any}] |less
               # dns-server.com による {mx|any} レコード
               # に対する host.dom DNS レコードをチェックする
         $ ipchains  -L -n |less     # パケットフィルタをチェック (2.2 kernel 用)
         $ iptables -L -n |less      # パケットフィルタをチェック (2.4 kernel 用)
         $ netstat -a                # 開いているポート全てを見つける
         $ netstat -l --inet         # 接続待ちのポートを見つける
         $ netstat -ln --tcp         # 接続待ちの TCP ポート番号を見つける
    

    8.6.30 ローカルのスプールからメールをフラッシュする

    ローカルスプールからメールをフラッシュするには、次を実行します。

         # exim4 -q    # 送信待ちメールをフラッシュする
         # exim4 -qf   # 全メールをフラッシュする
         # exim4 -qff  # frozen したメールもフラッシュする
    

    -qff オプションを /etc/ppp/ip-up.d/exim スクリプト にオプションとして入れるのが良いかもしれません。 Woody 以前では、exim4exim に置き換えてください。


    8.6.31 frozen したメールをローカルスプールから削除する

    ローカルスプールから frozen したメールを配送エラーメッセージを付けて削除 するには、次を実行します。

         # exim4 -Mg `mailq | grep frozen | awk '{ print $3 }'`
    

    Woody 以前では、exim4exim に置き換えてください。


    8.6.32 mbox の内容を再配送する

    ホームディレクトリが満杯になり、procmail が失敗する場合、 /var/mail/username からホームディレクトリにある ソートされたメールボックスにメールを手動で送信する必要があります。 ホームディレクトリにディスクスペースを確保してから、次を実行します。

         # /etc/init.d/exim4 stop
         # formail -s procmail </var/mail/username
         # /etc/init.d/exim4 start
    

    Woody 以前では、exim4exim に置き換えてください。


    8.6.33 ファイルの内容をクリアする

    ログファイルなどのファイルの内容をクリアにするには、rm を使って ファイルを削除してから新しい空のファイルを作成しないでください。 ファイルは削除して作成する間にまだアクセスされるかもしれないからです。 次の方法はファイルの内容をクリアにします。

         $ :>file-to-be-cleared
    

    8.6.34 ダミーファイル

    次のコマンドはダミー又は空のファイルを作成します。

         $ dd if=/dev/zero    of=filename bs=1k count=5 # 5KB の空の内容
         $ dd if=/dev/urandom of=filename bs=1M count=7 # 7MB のランダムな内容
         $ touch filename # 0B ファイルを作成 (既にある場合、mtime を更新)
    

    例えば、最も実用的な使いかたとして、Debian のブートフロッピから 実行される次のコマンドはハードディスク /dev/hda の内容を 完全に削除します。

         # dd if=/dev/urandom of=/dev/hda ; dd if=/dev/zero of=/dev/hda
    

    8.6.35 chroot

    chroot プログラム (chroot(8)) は リブートせずに単独のシステムで同時に異なる GNU/Linux 環境を起動することを 可能にします。

    また、低速なサテライトマシンを NFS マウントし、そこをより高速なマシンが chroot ポイントとして apt-getdselect のような リソース食いなプログラムを実行することもできます。


    8.6.35.1 chroot を使って異なる Debian ディストリビューションを起動する

    Sarge にある debootstrap コマンドを使うと、chroot した Debian 環境を容易に構築できます。 Sarge 以降のディストリビューションでは、適切なオプションを付ける代わりに cdebootstrap コマンドを使えるかもしれません。 例えば、高速なインターネットアクセス環境を持っており、 /sid-root に Sid の chroot を作成するには、 次を実行します。

         main # cd / ; mkdir /sid-root
         main # debootstrap sid /sid-root http://ftp.debian.org/debian/
         ... システム全体がダウンロードされるのを監視する
         main # echo "proc /sid-root/proc proc none 0 0" >> /etc/fstab
         main # mount proc /sid-root/proc
         main # mount /dev/ /sid-root/dev -o bind
         main # cp /etc/hosts /sid-root/etc/hosts
         main # chroot /sid-root /bin/bash
         chroot # cd /dev; /sbin/MAKEDEV generic ; cd -
         chroot # apt-setup # set-up /etc/apt/sources.list
         chroot # vi /etc/apt/sources.list # source を unstable が指すように編集
         chroot # dselect  # aptitude を使って、mc や vim をインストールしてもよい :)
    

    この時点で完全に機能する Debian システムを持っているはずです。 ここではメインの Debian 環境に影響を与える恐れなく動きまわれます。

    この debootstrap のトリックは Debian ではなく他の GNU/Linux ディストリビューションのインストールディスクを使って Debian をインストール するのにも使えます。


    8.6.35.2 chroot 用のログイン設定

    chroot /sid-root /bin/bash をタイプするのは簡単ですが、 意図せずに環境変数を全て引き継いでしまったりします。chroot に直接ログイン できる別の仮想端末で他のログインプロセスを起動するのがよりよい方法です。

    標準の Debian システムでは、tty1 から tty6 は Linux 端末を起動し、tty7 は X Window を起動します。例えば tty8 を chroot 化された端末に設定しましょう。 chroot を使って異なる Debian ディストリビューションを起動する, 第 8.6.35.1 節 に記述したように chroot システムを作成した後、 メインシステムの root シェルから次をタイプします。

         main # echo "8:23:respawn:/usr/sbin/chroot /sid-root "\
                "/sbin/getty 38400 tty8"  >> /etc/inittab
         main # init q    # init のリロード
    

    8.6.35.3 chroot 用の X 設定

    chroot で最新の X や GNOME を安全に起動したいですか? これは可能です。 次の例は仮想端末 vt9 で GDM を起動させます。

    まず chroot を使って異なる Debian ディストリビューションを起動する, 第 8.6.35.1 節 に記述している方法を用いて chroot システム をインストールします。メインシステムの root から chroot システムに 主要な設定ファイルをコピーします。

         main # cp /etc/X11/XF86Config-4 /sid-root/etc/X11/XF86Config-4
         main # chroot /sid-root # 又は chroot の端末を使う
         chroot # cd /dev; /sbin/MAKEDEV generic ; cd -
         chroot # apt-get install gdm gnome x-window-system
         chroot # vi /etc/gdm/gdm.conf # [servers] セクションの vt7 を vt9 に書き換える
         chroot # /etc/init.d/gdm start
    

    ここで、/etc/gdm/gdm.conf は最初の仮想端末を vt7 から vt9 に変更しました。

    今 chroot での完全な X 環境とメインシステムの間を Linux 仮想端末 を切替えること、例えば Ctrl-Alt-F7 や Ctrl-Alt-F9 を使うことにより 簡単に切替えることができます。お楽しみに!

    [FIXME] Add a comment and link to the init script of the chrooted gdm.


    8.6.35.4 chroot を使って他のディストリビューション を起動する

    他の Linux ディストリビューションのための chroot 環境も簡単に作れます。 他のディストリビューションのインストーラを使って別のパーティションにシステム をインストールします。その root パーティションが /dev/hda9 とすると、次のようになります。

         main # cd / ; mkdir /other-dist
         main # mount -t ext3 /dev/hda9 /other-dist
         main # chroot /other-dist /bin/bash
    

    そして chroot を使って異なる Debian ディストリビューションを起動する, 第 8.6.35.1 節, chroot 用のログイン設定, 第 8.6.35.2 節, や chroot 用の X 設定, 第 8.6.35.3 節 にある手順を進めます。


    8.6.35.5 chroot によりパッケージを作成する

    より特化した chroot パッケージである pbuilder は chroot システムを構築し、chroot 内でパッケージを作成します。 パッケージの build-dependencies が正しいかどうかをチェックしたり、 不必要で間違った構築依存性がパッケージに存在しないかを確認するための 理想的なシステムです。


    8.6.36 ハードリンクのチェック方法

    2つのファイルがハードリンクを使った同じファイルかどうかチェックするには次を 実行します。

          
         $ ls -li file1 file2
    

    8.6.37 ハードディスクイメージファイルを mount する

    file.img がハードディスクの内容のイメージを含んでおり、 オリジナルのハードディスクのディスク設定が xxxx = (bytes/sector) * (sectors/cylinder) であった場合、 次のコマンドはこのイメージを /mnt にマウントします。

         # mount -o loop,offset=xxxx file.img /mnt
    

    ほとんどのハードディスクは一セクタあたり 512 バイトであることに 注意してください。


    8.6.38 Samba

    Windows からファイルを取得する基本的な方法は次の通りです。

         # mount -t smbfs -o username=myname,uid=my_uid,gid=my_gid \
                 //server/share /mnt/smb  # Windows ファイルを Linux にマウント
         # smbmount //server/share /mnt/smb \
                 -o "username=myname,uid=my_uid,gid=my_gid"
         # smbclient -L 192.168.1.2 # コンピュータ上の共有のリスト
    

    Linux から Samba の隣人は次のようにチェックできます。

         # smbclient -N -L ip_address_of_your_PC | less
         # nmblookup -T "*"
    

    8.6.39 他の OS のファイルシステムを扱うためのユーティリティ

    他の OS のファイルシステムの多くを Linux kernel はサポートしており、 単にマウントすることによりファイルシステムを含むデバイスにアクセスできます。 特定のファイルシステムのために、デバイスをマウントせずにファイルシステムに アクセスするための専用のツールが存在します。これは kernel のファイルシステム のサポートを必要としないようにユーザスペースのプログラムとして実装されて います。

    MS-DOS FAT ファイルシステムの作成やチェックを行うには、 dosfstools が役立ちます。


    8.7 注意すべき典型的な間違い

    ここに危険な行動の例をいくつか挙げます。特権アカウント root を使う 場合、副作用はさらに増大します。


    8.7.1 rm -rf .*

    ".*" は "." と ".." を含むように拡張されるので、 ワイルドカードファイル名をコマンド行引数で "rm -rf .*" のように 使うと危険な結果をもたらす危険があります。 幸いにも、 Debian ディストリビューションに含まれている "rm" コマンド の最新版では、引数ファイル名の健全性を検査し、"." と ".." を 削除します。しかし、これはいつも成り立つとは限りません。 ワイルドカードファイル名がどのように機能するかを知るには、次をお試しください。


    8.7.2 rm /etc/passwd

    Debian システムは /etc/passwd のような重要なファイルを 間違いにより失うことに対して丈夫です。Debian システムはこれらを /var/backups/ に定期的にバックアップします。 これらのファイルを回復させたら、適切な権限を手動でセットしましょう。

         # cp /var/backups/passwd /etc/passwd
         # chmod 644 /etc/passwd
    

    パッケージ選択データの回復, 第 6.3.4 節 をご覧ください。


    [ 前のページ ] [ 目次 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ 次のページ ]


    Debian リファレンス

    CVS, 2007年 1月 18日 木曜日 11時54分01秒 UTC時間

    Osamu Aoki (青木 修) osamu#at#debian.org
    翻訳: 角田 慎一 tsuno#at#ngy.1st.ne.jp
    著者, 第 A.1 節