ブートプロンプトの詳細は LDP にある BootPrompt-HOWTO
をご覧ください。
コンソールのキーボードにアクセスできる人に限り、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"
をタイプしてみてください)
rescue disk/root disk セットからブートします。
/dev/hda3
がもともとの root パーティションの場合、
次の手順は、パスワードファイルを前述の手順と同じ程度に簡単に編集できるように
します。
# mkdir fixit # mount /dev/hda3 fixit # cd fixit/etc # vi shadow # vi passwd
この手法の前述した手法に対する利点は、lilo
パスワードを知る
(ある場合) 必要がないことです。しかし、本手法を使うには、
システムがフロッピ又は CD からブートできるように BIOS セットアップに
アクセスできる必要があります。
インストール中に 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
に従ってください。
unstable を追いかけることは楽しいですが、ブート中に起動する
バギーな xdm
, gdm
, kdm
, や
wdm
がひどく噛みつくとも限りません。
まず boot プロンプトで次を入力して root シェルを獲得します。
boot: Linux vga=normal s
ここで、Linux はブートしたい kernel のためのラベルです。
"vga=normal" により、lilo
が必ず通常の VGA
モードで起動します。 そして、"s" (又は "S") は
init
がシングルユーザモードを呼び出す
ために渡されるパラメータです。
X の起動デーモンを全て無効にするためのいくつかの方法があります。
/etc/init.d/?dm
files.
/etc/rc2.d/S99?dm
ファイルを
/etc/rc2.d/K99?dm
に改名する。
/etc/rc2.d/S99?dm
を削除する。
ここで、rc2.d
の中の数字は /etc/inittab
で指定したランレベルと対応させなければなりません。また、
?dm
は全ての xdm
, gdm
,
kdm
, wdm
を置き換えるために複数回コマンドを
実行する必要があることを意味します。
このリストの最初だけが Debian での "真実の道" です。最後の方法は
簡単ですが、Debian でしか動かず、dpkg-reconfigure
を使用した後は再度ディスプレイマネージャの設定を要求します。
残りは汎用のデーモンの無効化手段です。
コンソールシェルから startx
コマンドを使って X をまだ起動
できます。
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 以上のメモリを使用できません。
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 MSDOS/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
と
/usr/share/doc/grub-doc/html/
をご覧ください。
システム管理者は 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
xterm
の表示を含む X
アプリケーションのグラフィックな画像を記録する
必要がある場合、gimp
(GUI) を使いましょう。ウィンドウごとあるいは
スクリーン全体をキャプチャーできます。代替品には、xwd
(xbase-clients
), import
(imagemagick
),
scrot
(scrot
), があります。
ファイル構成を再調整する必要がある場合、ファイルのリンクを含む内容を 次のように移動します。
標準的方法 # 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
ここで、scp
<==> rcp
であり、 ssh
<==> rsh
です。
サブディレクトリ全体のコピーに関する次の比較情報は Manoj Srivastava (srivasta@debian.org
) により
debian-user@lists.debian.org で掲示されました。
cp
伝統的に、cp
はシンボリックリンクを参照しませんし、ハードリンク
を保つので、本当はこの仕事に向いていません。もう 1 つ考えるべきことは、
まばらなファイル (穴を持つファイル) です。
GNU cp
はこれらの制限を越えています。しかしながら、非 GNU
システムでは、cp
はまだこの問題を抱えています。また、
cp
を用いて、小さく移植性の高いアーカイブを作成できません。
% cp -a . newdir
tar
Tar は cp
が持つシンボリックリンクの問題のいくつかを
解決していますが、cpio
は特別なファイルを扱えるため、 伝統的な
tar
は使用されていません。
tar
の複数のハードリンクの操作方法は、テープ上に 1つ
しかコピーを置かないことですが、コピーの名前はそのファイルを取得する
ために使用される 唯一の 名前です。cpio
の方法は
全リンクに対して 1つのコピーを置きますが、全リンクの名前を使ってファイル
を取得できます。
tar
コマンドは .bz2
ファイルに対するオプションが
Potato と Woody の間で変更されました。ですから、短縮形のオプションである
-I (Potato) や -j (Woody) の代わりに、スクリプトでは
--bzip2 を使ってください。
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
cpio
cpio
は cpio
又は tar
アーカイブへの
ファイルの操作ができます。アーカイブはディスク上の他のファイルにできますし、
磁気テープやパイプにもできます。
$ find . -depth -print0 | cpio --null --sparse -pvd new-dir
afio
afio
は cpio
フォーマットアーカイブの操作を
行うより良い手段です。般に、cpio
よりも高速で、データの
変造をいくらか上品な方法で扱います。マルチボリュームなアーカイブを
サポートし、さらに対話的な操作もサポートします。 afio
は
tar
や cpio
アーカイブ
を圧縮するよりもより安全な圧縮アーカイブを作成できます。afio
はバックアップスクリプト内で "アーカイブエンジン"
として使うのにベストです。
$ find . -depth -print0 | afio -px -0a new-dir
私は磁気テープへのバックアップに afio
を使っています。
差分バックアップとデータ同期はいくつかの方法で実装できます。
rcs
: バックアップと履歴、テキストのみ
rdiff-backup
: バックアップと履歴、シンボリックリンクも可能
pdumpfs
:
ファイルシステム内のバックアップと履歴。シンボリックリンクも可能
rsync
: 片方向同期
unison
: 双方向同期
cvs
:
サーババックアップおよび履歴機能を持つ多方向同期。テキストのみだが熟成している。Concurrent Versions System (CVS), 第 12.1 節
参照
arch
:
サーババックアップおよび履歴機能を持つ多方向同期、"作業ディレクトリ"
のようなものでは無い。
subversion
: サーババックアップおよび履歴機能を持つ
多方向同期、Apache と連携。
サブディレクトリ全体のコピーとアーカイブ, 第 8.3 節
に記述されているアーカイブ手法と タスクのスケジューリング
(cron
、at
), 第 8.6.27 節
に記述されている規則的なジョブの自動化を組み合わせると、すばらしい
バックアップシステムとなります。
3つの使いやすいユーティリティについて説明します。
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)
をご覧ください。
pdumpfs
による日々のバックアップ
pdumpfs
は 毎日のスナップショットを保存する Plan9 の
dumpfs
と似たシンプルな日々のバックアップシステムです。
ある日のファイルを取得するために、あらゆる過去のスナップショットにアクセス
できます。ホームディレクトリを pdumpfs
と cron
でバックアップしましょう!
pdumpfs
は送り先ディレクトリに YYYY/MM/DD の形
でスナップショットを構築します。全ソースファイルは pdumpfs
が最初に起動された際にスナップショットディレクトリにコピーされます。
次回の起動からは、ディスクスペースの節約のため、pdumpfs
は更新されたか、新たに作成されたファイルのみコピーし、未更新ファイルは
前日のスナップショットのファイルにハードリンクされます。
$ pdumpfs src-dir dest-dir [dest-basename]
pdumpfs(8)
をご覧ください。
Changetrack
はテキストベースの設定ファイルの変更点を RCS
アーカイブに定期的に記録します。 changetrack(1)
をご覧ください。
# apt-get install changetrack # vi changetrack.conf
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 する
システム故障に対する緊急手段が 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
にあります。
less
は標準的なページャ (ファイル内容のブラウザ) です。 ヘルプは
`h' を押してください。more
よりずっと多くのことが
できます。less
は eval $(lesspipe) や eval
$(lessfile) をシェルの起動スクリプトで実行することにより
ブーストできます。詳細は /usr/share/doc/lessf/LESSOPEN
をご覧ください。 -R オプションにより、文字をそのまま表示し、ANSI
の カラーエスケープシーケンスを有効にします。less(1)
をご覧ください。
w3m
もいくつかのエンコードシステム (EUC) では役に立つ
ページャの代替品かもしれません。
free
と top
はメモリリソースに関する良い情報を
提供します。"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 が使用するため、システムにより使用不可にされています。
# date MMDDhhmmCCYY # hwclock --utc --systohc # hwclock --show
これはシステム時刻とハードウェア時刻を MM/DD hh:mm, CCYY にセットします。 時刻はローカル時間で表示されますが、ハードウェア時間は UTC を用います。
もしハードウェア (BIOS) 時刻が GMT に設定されている場合は、
/etc/default/rcS
中で UTC=yes と設定を変更します。
Managing
Accurate Date and Time HOWTO
を参照。
リモートのサーバ経由自動的にシステムのクロックを設定して時刻を修正します。
# ntpdate server
システムがインターネットに常時接続している場合、/etc/cron.daily/
に書いておくのがよいでしょう。
chrony
パッケージを使用してください。
スクリーンセーバを無効にするには、次のコマンドを使ってください。
Linux コンソール上では、次を実行します。
# setterm -powersave off
kon2 (kanji) コンソールのスクリーンセーバを起動します。
# kon -SaveTime 0
X 起動中には次を実行します。
# xset s off 又は # xset -dpms 又は # xscreensaver-command -prefs
他のコンソール機能を制御するには、対応するマニュアルを読んでください。
ターミナルの行設定を変更したり印刷するには、stty(1)
も読んでください。
Glibc は管理データベースからエントリ、すなわち、パスワード、グループ、
ホスト、サービス、プロトコル、ネットワークなどを検索するために、
getent(1)
を提供しています。
getent database [key ...]
PC スピーカを常に抜いておくこともできます ;-) Bash シェルでは次を実行します。
echo "set bell-style none">> ~/.inputrc
スクリーンに出るエラーメッセージを黙らせるには、まず
/etc/init.d/klogd
をチェックします。このスクリプトに
KLOGD="-c 3" をセットし、
/etc/init.d/klogd restart を起動します。 代わりに、dmesg
-n3 を起動することもできます。
エラーレベルの意味を示します。
特定の使えないエラーメッセージが煩わしい場合、shutup-abit-bp6
のような些細な kernel patch を適用することを考慮に入れましょう。 (examples subdirectory
で入手可能)
他に見るべき箇所は、/etc/syslog.conf
です。コンソールデバイス
にメッセージが出力されるようになっているかをチェックしましょう。
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 用の最小の共通部分 です。
cat some-binary-file を実行してしまって端末が手を付けられなく なってしまった時は、次を実行します。 (タイプしてもコマンドがエコーされて見えないかもしれません)
$ reset
(EOF = ^M^J である) DOS テキストファイルを (EOF = ^j である) Unix テキストファイルに変換します。
# apt-get install sysutils $ dos2unix dosfile
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 にある関連の説明をごらんください。
より目的に特化した変換ツールもあります。
iconv
— ロケールエンコーディング変換ツール
konwert
— しゃれたエンコーディング変換ツール
uuencode
と uudecode
— Unix 用
mimencode
— メール用
FILES ファイルの全てにある FROM_REGEX を TO_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 をファイルの拡張子として追加して保存しておきます。
次のスクリプトはその場で 5–10 行と 16–20 行を削除します。
#!/bin/bash ed $1 <<EOF 16,20d 5,10d w q EOF
ここで、ed
コマンドは vi
コマンドモードコマンドと同じです。
スクリプトがファイルの後ろから編集するのを容易にします。
次に挙げる手順は 2つのソースファイルの差分を取り、ファイルの場所に応じて 統合された差分ファイルを file.patch0 又は file.patch1 という名前で作成します。
$ diff -u file.old file.new1 > file.patch0 $ diff -u old/file new1/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
$ split -b 650m file # ファイルを 650MB 毎に分割 $ cat x* >largefile # 一つの大きなファイルにマージ
全ての元 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
次のスクリプトはパイプの一部として素晴らしいことをします。
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 行を表示
次の方法は各ファイルについて *.ext とのマッチングを行います。スペースを持つファイル名などを適切に扱うことを保証し、どの方法も同じように処置します。
for x in *.ext; do if test -f "$x"; then command "$x" fi done
find
と xargs
の組合せ。
find . -type f -maxdepth 1 -name '*.ext' -print0 | \ xargs -0 -n 1 command
find
の -exec オプションによりコマンドを使った場合。
find . -type f -maxdepth 1 -name '*.ext' \ -exec command '{}' \;
find
の -exec
オプションにより短いシェルスクリプトを使う場合。
find . -type f -maxdepth 1 -name '*.ext' \ -exec sh -c "command '{}' && echo 'successful'" \;
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
が興味深いかもしれません。
次のコマンドは web ページを読み込んでテキストファイルに整形します。 Web から設定をコピーするときに非常に役立ちます。
$ lynx -dump http://www.remote-site.com/help-info.html >textfile
ここで links
と w3m
も使えますが、描画に少し
違いがあります。
これがメーリングリストのアーカイブの場合、mime contents からテキストにするには
munpack
を使います。
次のコマンドは web ページを PostScript ファイルに変換して印刷します。
$ apt-get install html2ps $ html2ps URL | lpr
lpr
又はlpd
, 第
3.6.1 節 をご覧ください。また、PostScript ファイルを作成するには
a2ps
および mpage
パッケージをチェック
してみてください。
次のコマンドはマニュアルページを PostScript に変換して印刷します。
$ man -Tps some-manpage | lpr $ man -Tps some-manpage | mpage -2 | lpr
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
プロセスにより使用された時間を表示します。
# time some-command >/dev/null real 0m0.035s # 壁掛け時計の時間 (真の経過時間) user 0m0.000s # ユーザモードでの時間 sys 0m0.020s # kernel モードでの時間
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 値はシステムに悪影響を及ぼすことが時々あります。注意して このコマンドを使ってください。
cron
、at
)
Linux で仕事をスケジューリングするには、cron
や at
を使いましょう。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
screen
を使って端末を切替える
screen
プログラムにより、単独の実際の端末又は
端末エミュレータウィンドウ上で複数の仮想端末を起動させ、
それぞれの端末で固有のの対話型シェルを持たせることが可能となります。 Linux
の仮想端末や複数の xterm
ウィンドウを使っている場合でさえも、
次に示す screen
の豊富な機能セットを探検する価値はあります。
screen
セッション全体を 切り離し、
後で再び取り付ける能力。
リモートターミナルからや VT100 ターミナルプログラムを使って Linux マシンに
よくログインする場合、screen
を使うと detach
(切り離し) 機能により生活がより簡単になります。
screen
を起動します。
screen
をデタッチして screen 自身をログアウト します。)
screen
は魔法のように前に開いていたウィンドウ全てを
リアタッチ します。
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)
をご覧ください。
screen
セッションでのバックスペースと Ctrl-H
screen
を起動中にバックスペースや Ctrl-H が動かないことに
気づいた場合、 /etc/screenrc
を編集し、次の行を見つけたら
コメントアウトしてください。(すなわち、この行の先頭に "#"
を追加してください)
bindkey -k kb stuff "\177"
screem
と等価なプログラム
xmove
を調べてください。xmove(1)
をご覧ください。
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 ポート番号を見つける
ローカルスプールからメールをフラッシュするには、次を実行します。
# exim -q # 送信待ちメールをフラッシュする # exim -qf # 全メールをフラッシュする # exim -qff # frozen したメールもフラッシュする
-qff オプションを /etc/ppp/ip-up.d/exim
スクリプト
にオプションとして入れるのが良いかもしれません。 Sarge では、exim
は exim4
に置き換わっています。
ローカルスプールから frozen したメールを配送エラーメッセージを付けて削除 するには、次を実行します。
# exim -Mg `mailq | grep frozen | awk '{ print $3 }'`
Sarge では、exim
は exim4
に置き換わっています。
mbox
の内容を再配送する
ホームディレクトリが満杯になり、procmail
が失敗する場合、
/var/mail/username
からホームディレクトリにある
ソートされたメールボックスにメールを手動で送信する必要があります。
ホームディレクトリにディスクスペースを確保してから、次を実行します。
# /etc/init.d/exim stop # formail -s procmail </var/mail/username # /etc/init.d/exim start
Sarge では、exim
が exim4
に置き換わっています。
ログファイルなどのファイルの内容をクリアにするには、rm を使って ファイルを削除してから新しい空のファイルを作成しないでください。 ファイルは削除して作成する間にまだアクセスされるかもしれないからです。 次の方法はファイルの内容をクリアにします。
$ :>file-to-be-cleared
次のコマンドはダミー又は空のファイルを作成します。
$ 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
chroot
chroot
プログラム (chroot(8)
) は
リブートせずに単独のシステムで同時に異なる GNU/Linux 環境を起動することを
可能にします。
また、低速なサテライトマシンを NFS マウントし、そこをより高速なマシンが chroot
ポイントとして apt-get
や dselect
のような
リソース食いなプログラムを実行することもできます。
chroot
を使って異なる Debian ディストリビューションを起動する
Woody にある debootstrap
コマンドを使うと、chroot した Debian
環境を容易に構築できます。例えば、高速なインターネットアクセス環境
を持っているならば、/sid-root に Sid の chroot を作成するには、
次を実行します。
main # cd / ; mkdir /sid-root main # debootstrap sid /sid-root http://ftp.debian.org/debian/ ... システム全体がダウンロードされるのを監視する main # echo "proc-sid /sid-root/proc proc none 0 0" >> /etc/fstab main # mount proc-sid /sid-root/proc -t proc main # cp /etc/hosts /sid-root/etc/hosts main # chroot /sid-root /bin/bash 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 をインストール
するのにも使えます。
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 のリロード
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 # 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
.
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
節 にある手順を進めます。
chroot
によりパッケージを作成する
より特化した chroot パッケージである pbuilder
は chroot
システムを構築し、chroot 内でパッケージを作成します。 パッケージの
build-dependencies が正しいかどうかをチェックしたり、
不必要で間違った構築依存性がパッケージに存在しないかを確認するための
理想的なシステムです。
2つのファイルがハードリンクを使った同じファイルかどうかチェックするには次を 実行します。
$ ls -li file1 file2
mount
する
file.img
がハードディスクの内容のイメージを含んでおり、
オリジナルのハードディスクのディスク設定が xxxx = (bytes/sector) *
(sectors/cylinder) であった場合、 次のコマンドはこのイメージを
/mnt
にマウントします。
# mount -o loop,offset=xxxx file.img /mnt
ほとんどのハードディスクは一セクタあたり 512 バイトであることに 注意してください。
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 "*"
他の OS のファイルシステムの多くを Linux kernel はサポートしており、 単にマウントすることによりファイルシステムを含むデバイスにアクセスできます。 特定のファイルシステムのために、デバイスをマウントせずにファイルシステムに アクセスするための専用のツールが存在します。これは kernel のファイルシステム のサポートを必要としないようにユーザスペースのプログラムとして実装されて います。
mtools
: MSDOS ファイルシステム(MS-DOS, Windows) 用
cpmtools
: CP-M ファイルシステム用
hfsutils
: HFS ファイルシステム (昔の Macintosh) 用
hfsplus
: HFS+ ファイルシステム (最近の Macintosh) 用
MS-DOS FAT ファイルシステムの作成やチェックを行うには、 dosfstools
が役立ちます。
ここに危険な行動の例をいくつか挙げます。特権アカウント root を使う 場合、副作用はさらに増大します。
"rm -rf .*" において、 ".*" は "." と ".." に拡張され、親ディレクトリに書き込む権限がたまたまあった場合、 カレントディレクトリの 隣の 全てのディレクトリも削除されて しまいます。
Debian システムは /etc/passwd
のような重要なファイルを
間違いにより失うことに対して丈夫です。Debian システムはこれらを
/var/backups/
に定期的にバックアップします。
これらのファイルを回復させたら、適切な権限を手動でセットしましょう。
# cp /var/backups/passwd /etc/passwd # chmod 644 /etc/passwd
パッケージ選択データの回復, 第 6.3.4 節 をご覧ください。
Debian リファレンス
CVS, 2005年 4月 3日 月曜日 22時59分00秒 UTC時間osamu@debian.org
tsuno@ngy.1st.ne.jp