製作著作 © 2007-2010 Osamu Aoki (青木 修)
概要
This book is free; you may redistribute it and/or modify it under the terms of the GNU General Public License of any version compliant to the Debian Free Software Guidelines (DFSG). (日本語による参考説明: 本書はフリーです; Debian フリーソフトウェアガイドライン (DFSG) に適合するいかなるバージョンの GNU General Public License の条件の下ででも再配布や改変をすることを許可します。)
目次
表目次
ls -l
" の出力の最初の文字のリスト
chmod
(1) コマンドで用いられるファイルパーミッションの数字モード
$HOME
" の値のリスト
aptitude
(8) や apt-get
(8)
/apt-cache
(8) を使うコマンドラインによる基本パッケージ管理操作
aptitude
(8) に関する特記すべきコマンドオプション
dpkg
が作成する特記すべきファイル
pam_unix
(8) に関する重要な設定ファイル
/etc/network/interfaces
" のスタンザのリスト
net-tools
コマンドと新しい iproute2
コマンド等との翻訳表
lenny
での "ls -l
" コマンドによる時間と日付の表示例
/etc/fstab
"
エントリーにマッチが無いリムーバブルデバイスをノーマルユーザーにマウントする事を許すパッケージのリスト
cvs
(1) の最初の引数として使用)
svn
(1) の最初の引数として使用)
bsdmainutils
と coreutils
パッケージ中のタブ変換コマンドのリスト
このDebian リファレンス (第 2 版) (2011-02-26 17:58:45 UTC) はシステムインストール後のユーザー向け案内書として Debian のシステム管理に関する概論の提供を目指しています。
本書が対象とする読者は、 GNU/Linux システムがどう機能するかを理解するのに、シェルスクリプトぐらいは学ぶ気はあるが、全ての C のソースまで読む気がない人です。
一切保証は致しません。全ての商標はそれぞれの商標の所有者の財産です。
Debian システム自体は動く標的です。このため最新状況を反映した正確な記述は困難です。現行の不安定版の Debian システムを用いて本書は記していますが、皆様が読まれる時点ではすでに記載内容が古くなっているでしょう。
本書はあくまで二次的参考文献として扱って下さい。本書は正式の案内書を置き換えません。著者及び本書への貢献者は本書中の誤謬や欠落や曖昧さが引き起こす結果に一切責任を負いません。
Debian プロジェクトはフリーなオペレーティングシステムを作ろうという共通目的を持った個人の集団です。そのディストリビューションは次の特徴があります。
unstable
やテスト版 testing
アーカイブによる、最新のソフトウエアーへの円滑なアップグレードの重視
Debian の中のフリーソフトウエアー構成要素は、GNU や Linux や BSD や X や ISC や Apache や Ghostscript や Common Unix Printing System や Samba や GNOME や KDE や Mozilla や OpenOffice.org や Vim や TeX や LaTeX や DocBook や Perl や Python や Tcl や Java や Ruby や PHP や Berkeley DB や MySQL や PostgreSQL や Exim や Postfix や Mutt や FreeBSD や OpenBSD や Plan 9 やその他の多くの独立のフリーソフトウエアーのプロジェクトに由来します。Debian はこの多種多様なフリーソフトウエアーを 1つのシステムにまとめ上げます。
本書の作成にあたり次の編集指針を守りました。
私はシステムの階層的側面やシステムの低レベルを明らかにしようとしました。
本文書だけに頼らず自分で答えを見出す努力をしっかりすることを期待します。本文書は効率的なスタートポイントを提供するだけです。
一義的情報源から自分自身で解決策を探し出すべきです。
/usr/share/doc/<package_name>
" ディレクトリー下にある文書
dpkg -L
<package_name> |grep '/man/man.*/'
"
dpkg -L
<package_name> |grep '/info/'
"
詳細な文書を読むには、"-doc
"
をサフィクスとする対応する文書パッケージをインストールする必要があるかもしれません。
bash
(1) シェルコマンドの例示をする次のような簡略化した表現スタイルで本書は情報を提供します。
# <root アカウントからのコマンド> $ <ユーザーアカウントからのコマンド>
これらのシェルプロンプトは使われるアカウントを区別します。これはちょうど環境変数として: "PS1='\$'
" と
"PS2=' '
"
を設定した場合に相当します。これらの環境変数値はあくまで本書の読みやすさのためで、実際のインストール済みシステではほとんど見かけません。
"PS1='\$'
" と "PS2=' '
" という環境変数値の意味は
bash
(1) を参照下さい。
システム管理者が行うべきアクションは命令文で書かれています: 例えば、「シェルに各コマンド文字列をタイプ後毎にエンターキーをタイプします。」 (必ずしも「〜しましょう。」とはせず簡潔に訳しています。)
英語では、テーブル中の説明や類似のコラムには、パッケージ説明の慣習に従い、定冠詞抜も不定冠詞も抜きの名詞句が入ります。これらには、マンページのコマンドの短い説明の慣習に従った頭の "to" 抜きの不定詞句が代わりに名詞句として入ることもあります。変だなとお考えの方もあるとは存じますが、これは本文書をできるだけ簡潔にするための著者の恣意的な文体の選択です。(対応部分を文切り型の名詞句的表現に訳しています。)
コマンド名を含めて固有名詞はその位置によらず大文字・小文字の区別を保持します。
本文中に引用されるコマンドの断片はダブルクォーテションマーク間にタイプライターフォントで書き
"aptitude safe-upgrade
" のように表現されます。
本文中に設定ファイルから引用された文字データーはダブルクォーテションマーク間にタイプライターフォントで書き
"deb-src
" のように表現されます。
コマンドはその名前をタイプライターフォントで書き、場合によってはその後ろにマンページのセクション番号を括弧中に入れて書き
bash
(1) のように表現されます。読者は次の様にタイプして情報を得るように心がけて下さい。
$ man 1 bash
マンページはその名前をタイプライターフォントで書き、その後ろにマンページのセクション番号を括弧中に入れて書き
sources.list
(5) のように表現されます。読者は次の様にタイプして情報を得るように心がけて下さい。
$ man 5 sources.list
info
ページはダブルクォーテションマーク間にタイプライターフォントというコマンドの断片形式で書き "info
make
" のように表現されます。読者は次の様にタイプして情報を得るように心がけて下さい。
$ info make
ファイル名はダブルクォーテションマーク間にタイプライターフォントで書き
"/etc/passwd
" のように表現されます。読者は次の様にタイプして情報を得るように心がけて下さい。
$ sensible-pager "/etc/passwd"
ディレクトリー名はダブルクォーテションマーク間にタイプライターフォントで書き
"/etc/init.d/
" のように表現されます。読者は次の様にタイプして情報を得るように心がけて下さい。
$ mc "/etc/init.d/"
パッケージ名はその名をタイプライターフォントで書き
"vim
" のように表現されます。読者は次の様にタイプして情報を得るように心がけて下さい。
$ dpkg -L vim $ apt-cache show vim $ aptitude show vim
文書は、その場所のファイル名でダブルクォーテションマーク間にタイプライターフォントで書き
"/usr/share/doc/sysv-rc/README.runlevels.gz
" や
"/usr/share/doc/base-passwd/users-and-groups.html
"
のように表現されたり、その場所の URL で http://www.debian.org
のように表現されます。読者は次の様にタイプして情報を得るように心がけて下さい。
$ zcat "/usr/share/doc/sysv-rc/README.runlevels.gz" | sensible-pager $ sensible-browser "/usr/share/doc/base-passwd/users-and-groups.html" $ sensible-browse "http://www.debian.org"
環境変数は、頭に "$
"
がついた名前をダブルクォーテションマーク間にタイプライターフォントで書き、"$TERM
"
のように表現されます。読者は次の様にタイプして情報を得るように心がけて下さい。
$ echo "$TERM"
各パッケージの後ろについている "*" は、各パッケージの Debian バグトラッキングシステム (BTS) にリンクされています。
ポプコンのデーターは各パッケージの客観的人気の指標として提示されいます。それがダウンロードされた日付は 2010-12-08 14:47:18 UTC で、 109197 を越すバイナリーパッケージ数と 19 のアーキテクチャーにまたがる 95150 つの提出レポートからなります。
amd64
の不安定版 unstable
アーカイブは現在高々
30552 つのパッケージしか含みません。ポプコンデーターは多くの旧式設置システムからのレポートを含みます。
"votes" を意味する "V:" が前についたポプコンの数は "100 * (PC で最近実行されたパッケージに関するポプコン提出)/(全ポプコン提出)" として計算される。
"installs" を意味する "I:" が前についたポプコンの数は "100 * (PC にインストールされているパッケージに関するポプコン提出)/(全ポプコン提出)" として計算される。
Popcon の数字はパッケージの重要性の絶対指標と考えるべきでません。統計を曲げる多くの因子があります。例えば、Popcon
に参加しているシステムの一部は "/bin
" などのディレクトリーをシステム性能向上のために
"noatime
" オプションでマウントすることで当該システムから "vote"
することを実質的に禁止しているかもしれません。
各パッケージの客観的指標としてパッケージサイズデーターも提供されます。それは "apt-cache show
" や
"aptitude show
" コマンドが ( 現在の amd64
アーキテクチャー上の unstable
リリース上で) 表示する
"Installed-Size:
" です。サイズは KiB (Kibibyte = 1024 バイト単位) で表示されます。
小さなパッケージサイズのパッケージは unstable
リリース中の当該パッケージが内容のある他パッケージを依存関係でインストールするためのダミーパッケージだからかもしれません。
"(*)" が後ろについたパッケージのサイズは、unstable
リリース中にパッケージが無く
experimental
リリース中のパッケージサイズが代用されたことを示します。
新規ユーザーを啓蒙する Debian のメーリングリストで見つけた興味深い引用文を記します。
<miquels
at cistron.nl>
<tollef at add.no>
コンピューターシステムを学ぶことは新しい外国語を学ぶことに似ていると考えます。チュートリアルブックは有用ですが、実際に自ら使って学ぶことが必要です。円滑なスタートが出きるように、いくつかの基本的なポイントを説明します。
Debian GNU/Linux の強力なデザインはマルチユーザー、マルチタスクという Unix オペレーティングシステムに由来します。これら Unix と GNU/Linux の特徴や類似点の強力さを活用することを覚えましょう。
Unix 対象の文書を避けたり、GNU/Linux に関する文書だけに頼ることは、有用な情報を見逃すことになるので止めましょう。
Unix 的システムをコマンドラインツールで少々使った経験があれば、私がここで説明することはすべてご存知でしょう。リアリティーチェックと記憶を呼び戻すのにこれを使って下さい。
X Window システムを gdm
等のディスプレーマネージャーとともにインストールした場合以外には、システム起動の際に文字の login スクリーンが現れます。あなたのホスト名が
foo
と仮定すると、login プロンプトは次に示すような見えます。
foo login:
GNOME や KDE のような GUI 環境をインストールした場合には、Ctrl-Alt-F1 とすることで login プロンプトが出て、Alt-F7 とすることで GUI 環境に戻れます (詳細は下記の「仮想コンソール」参照)。
login プロンプトであなたのユーザー名 (例えば penguin
) を打鍵し Enter
キーを押します。さらにあなたのパスワードを打鍵し Enter キーを再び押します。
Unix の伝統に従い、Debian
システムではユーザー名とパスワードに関して大文字小文字の区別をします。ユーザー名は通常小文字のみから選ばれます。最初のユーザーアカウントは通常インストールの際に作られます。追加のユーザーアカウントは
root によって adduser
(8) を用いて作られます。
"/etc/motd
" (本日のメッセージ: Message Of The Day)
に保存されている歓迎メッセージとコマンドプロンプトを表示しシステムが起動されます。
Debian GNU/Linux lenny/sid foo tty1 foo login: penguin Password: Last login: Sun Apr 22 09:29:34 2007 on tty1 Linux snoopy 2.6.20-1-amd64 #1 SMP Sun Apr 15 20:25:49 UTC 2007 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. foo:~$
ここで、Debian GNU/Linux システムがフリーソフトで無保証であるという、歓迎メッセージの主要部分は
"/etc/motd.tail
" ファイルを編集することでカスタム化できます。最初の行は
"uname -snrvm
" 用いたシステム情報から生成されます。
これであなたはシェルの中にいます。シェルはあなたからのコマンドを解釈します。
インストールの際に "Desktop environment" タスクを選定し GNOME の
gdm
とともに X Window
システムをインストールした場合には、システムの起動するとグラフィカルな login
プロンプトのスクリーンが表示されます。あなたのユーザー名とパスワードを入力することで非特権ユーザーアカウントに login できます。タブ (tab)
を用いたりマウスの第一クリックを用いるとユーザー名とパスワードの間を行き来できます。
gnome-terminal
(1) や rxvt
(1) や
xterm
(1) のような x-terminal-emulator
プログラムを X の下で起動するとシェルプロンプトが得られます。GNOME デスクトップ環境下では、"Applications" →
"Accessories" → "Terminal" とクリックしてもうまくいきます。
次の「仮想コンソール」も参照下さい。
デスクトップ環境 (例えば fluxbox
)
次第ではメニューの起点がよく分からないことがあります。そんな時はスクリーンの中央を (右)クリックしてメニューが表示されることを期待しましょう。
root アカウントはスーパーユーザーとか特権ユーザーとも呼ばれます。このアカウントからは次のようなシステム管理活動ができます。
root アカウントの権限を使うには、この無制限の権限ゆえ配慮と責任ある行動が求められます。
root のパスワードを他人に決して教えてはいけません。
ファイル (Debian システムにとってはファイルの一種である CD-ROM 等のハードウエアーデバイスも含む) パーミッションは、非 root ユーザーによるそのファイルの使用やアクセスをできなくなくすることがあります。この様な状況の下では root アカウントを使うことが簡便なテスト法ですが、問題解決はファイルパーミッションとユーザーのグループのメンバーシップを適正に設定する必要があります (「ファイルシステムのパーミッション」参照)。
root のパスワードを使って root のシェルプロンプトを使えるようにする基本的な方法を次に記します。
root
と入力します。
どのユーザーシェルプロンプトからでも "su -l
" と入力します。
どのユーザーシェルプロンプトからでも "su
" と入力します。
デスクトップのメニューが GUI
のシステム管理ツールを適切な権限とともに自動的に起動しない場合、gnome-terminal
(1) や
rxvt
(1) や xterm
(1) のような X
ターミナルエミュレーターの root シェルプロンプトから起動できます。「root シェルプロンプト」
and 「X クライアントを root で実行」を参照下さい。
gdm
(1) 等のディスプレーマネージャーのプロンプトに root
と入力して、X ディスプレー / セッションマネージャーを root アカウントのもとで決して起動してはいけません。
クリチカルな情報が表示されている際には、あなたの X スクリーンを覗き見られるかもしれないのでリモートの信頼できない GUI プログラムを決して実行してはいけません。
デフォールトの Debian システムでは、6つの切り替え可能な VT100
様の文字コンソールがあり、Linux ホスト上で直接コマンドシェルを起動できるようになっています。GUI
環境下でない場合は、Left-Alt-key
と F1
—
F6
の中の一つのキーを同時に押すことで仮想コンソール間の切り替えができます。仮想ターミナルそれぞれに独立したアカウントでログインすることができ、。マルチユーザー環境を提供します。このマルチユーザー環境は
Unix の偉大な機能で、癖になります。
X Window システムの下では、Ctrl-Alt-F1
キーを押す、つまり
left-Ctrl-key
と left-Alt-key
と
F1-key
キーを同時に押すと文字コンソール1にアクセスできます。通常仮想コンソール7で実行されている X
Window システムへは Alt-F7
を押すことにより戻れます。
これとは別の方法で、例えば仮想ターミナル1という今とは違う仮想ターミナルへの変更がコマンドラインから出来ます。
# chvt 1
コマンドプロンプトで Ctrl-D
、つまり left-Ctrl-key
と
d-key
の同時押しをするとシェルでのアクティビティーを終了できます。文字コンソールの場合は、こうすると
login プロンプト戻ります。これらのコントロール文字は通常 "control D" と大文字を使って表記されますが、Shift
キーを押す必要はありません。また Ctrl-D
に関する簡略表記 ^D
も使われます。この代わりに "exit" とタイプすることができます。
x-terminal-emulator
(1) にあっては、このようにすることで
x-terminal-emulator
のウィンドウが閉じることができます。
ファイル操作の際にパーフォーマンス向上のためにメモリーへのデーターのキャッシュがされる他の現代的な OS と同様に、Debian システムでも電源を安全に切る前に適正なシャットダウン手順を取る必要があります。これはすべてのメモリー上の変更を強制的にディスクに書き出しすことで、ファイルの完全性を維持するためです。ソフトウエアーによる電源コントロールができる場合、シャットダウン手続きはシステムの電源を自動的に落とします。(これがうまくいかない時には、シャットダウン手続きの後で数秒間電源ボタンを押す必要があるかもしれません。)
通常のマルチユーザーモードからのシステムのシャットダウンがコマンドラインから出来ます。
# shutdown -h now
シングルユーザーモードからのシステムのシャットダウンがコマンドラインから出来ます。
# poweroff -i -f
この他に、"/etc/inittab
" に
"ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now
"
と書かれていれば、Ctrl-Alt-Delete
(left-Ctrl-key
と left-Alt-Key
と
Delete
の同時押し) を入力するシャットダウン方法もあります。
「SSH 上のリモートシステムをシャットダウンする方法」を参照下さい。
例えば "cat <some-binary-file>
"
のような変な事をした後でスクリーンが無茶苦茶になった場合、コマンドプロンプトに "reset
"
と入力して下さい。このときコマンドを入力してもスクリーンには読み取れる表示がされないかもしれません。"clear
"
とすればスクリーンが消去できます。
デスクトップ環境タスク抜きの最小限インストレーション Debian システムですら基本的な Unix 機能は提供されますが、コマンドラインや
curses に基づく mc
や vim
等のいくつかの文字ターミナルパッケージを apt-get
(8)
を使って次のように追加インストールすることから始めることを初心者にお薦めします。
# apt-get update ... # apt-get install mc vim sudo ...
既にこれらのパッケージがインストールされている場合には、新しいパッケージはインストールされません。
表1.1 興味あるテキストモードのプログラムパッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
mc
*
|
V:12, I:28 | 6508 | テキストモードの全画面ファイルマネージャー |
sudo
*
|
V:42, I:71 | 668 | ユーザーに限定的な root 権限を与えるプログラム |
vim
*
|
V:15, I:33 | 1792 | Unix テキストエディター Vi IMproved (改良版 Vi)、プログラマーのためのテキストエディター (標準版) |
vim-tiny *
|
V:16, I:92 | 776 | Unix テキストエディター Vi IMproved (改良版 Vi)、プログラマーのためのテキストエディター (軽量版) |
emacs23 *
|
V:3, I:4 | 13016 | GNU プロジェクト Emacs、Lisp に基づく拡張可能なテキストエディター (23版) |
w3m
*
|
V:24, I:84 | 1992 | テキストモード WWW ブラウザー |
gpm
*
|
V:3, I:4 | 484 | テキストコンソール上の Unix 式のカットアンドペースト (daemon) |
いくつかの参考資料を読むのも良いことです。
表1.2 有用な文書パッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
doc-debian *
|
I:82 | 408 | Debian プロジェクトの文書、(Debian FAQ) 他 |
debian-policy *
|
I:3 | 3500 | Debian ポリシーマニュアルと関連文書 |
developers-reference *
|
I:1.0 | 1388 | Debian 開発者のためのガイドラインと情報 |
maint-guide *
|
I:0.7 | 776 | Debian 新メンテナ向けガイド |
debian-history *
|
I:0.3 | 3736 | Debian プロジェクトの歴史 |
debian-faq *
|
I:66 | 1224 | Debian FAQ (よくある質問集) |
doc-linux-text *
|
I:82 | 8616 | Linux HOWTO と FAQ (テキスト版) |
doc-linux-html *
|
I:0.7 | 62564 | Linux HOWTO と FAQ (HTML 版) |
sysadmin-guide *
|
I:0.2 | 964 | Linux システム管理者ガイド |
これらのパッケージの一部を次のようにしてインストールします。
# apt-get install package_name
次の練習のためにあなたのメインのユーザーアカウントを使いたくない場合には、例えば fish
という追加のユーザーアカウントを作成できます。root シェルプロンプトで次のように入力します。
# adduser fish
すべての質問に返事をします。
こうすることで fish
という名前の新規アカウントが作られます。練習の後で、このユーザーとそのホームディレクトリーは次のようのすれば削除できます。
# deluser --remove-home fish
ラップトップ PC 上のデスクトップの Debian システム等のような典型的単一ユーザーワークステーションでは次のような単純な
sudo
(8) の設定をして、非特権ユーザー (例えば penguin
)
に管理者権限を (root パスワードではなく) ユーザー自身のパスワードで与えることがよくあります。
# echo "penguin ALL=(ALL) ALL" >> /etc/sudoers
これに代え、次のようにして非特権ユーザー penguin
にパスワード一切無しに管理者権限を与えることもよくあります。
# echo "penguin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
このトリックの使用は、単一ユーザーワークステーション上であなた自身が管理者でユーザーである際のみに限るべきです。
システムセキュリティー上非常に悪い事態を招くので、マルチユーザーワークステーション上の通常ユーザーアカウントに対してこの様な設定をしてはいけません。
上記例のような penguin
のパスワードとアカウントは root パスワードや root
アカウント同様の保護が必要です。
この文脈上の管理者権限はワークステーションに関するシステム管理業務をする権限を与えられた人に属します。そのような権限と能力を持っていなければ、あなたの会社の管理部門の管理職や上司とはいえこのような権限を与えてはいけません。
特定デバイスや特定ファイルへのアクセスの権限を与えるには、sudo
(8) をつかって得た
root
権限を用いるのではなく、group
を使って限定的アクセス与えることを考えるべきです。
sudo
(8) を使ってもう少し工夫された注意深い設定をすれば、共有システム上の他のユーザーに root
パスワードを教えること無く限定的管理権限を許可することができます。こうすることは、誰が何をしたかを明らかにするので、複数の管理者がいるホストにおける責任の所在を明らかにします。ただ、誰にもそんな権限を与えたく無いかもしれません。
非特権ユーザーアカウントを使う限り全くリスク無く Debian システムでお遊びをする準備万端です。
何故なら、たとえデフォールトのインストール後ですら Debian システムは非特権ユーザーがシステムに損害を与えられないように適正なファイルパーミッションが設定されているからです。もちろん悪用可能な穴が残っているかもしれませんが、こんな問題まで心配する人はこのセクションを読んでいるべきではなく、Securing Debian Manual を読むべきです。
Debian システムを Unix 的システムとして次に学びましょう:
GNU/Linux や他の Unix 的オペレーティングシステムでは、ファイルはディレクトリーに整理されています。すべてのファイルやディレクトリーは、"/
"を根
(root) に持つ一本の大きな木 (ツリー) のようにアレンジされています。
このようなファイルやディレクトリーはいくつかのデバイスに展開することができます。あるデバイス上にあるファイルシステムを大きなファイルツリーにマウントするのに
mount
(8) が使われます。その逆に、それを切り離すのに
umount
(8) が使われます。最近の Linux
カーネルでは、mount
(8)
をオプションとともに用いると、ファイルツリーの一部を別のところと結びつけたり、共有・非共有・従属・バインド不可としてファイルシステムをマウントもできます。各ファイルシステムごとの使用可能なマウントオプションは
"/share/doc/linux-doc-2.6.*/Documentation/filesystems/
"
にあります。
Unix システム上のディレクトリーは、一部の他システム上ではフォルダと呼ばれます。Unix システム上では "A:
"
のようなドライブというコンセプトが無いこと覚えておいて下さい。単一のファイルシステムがあって、そこにすべてが含まれています。これは
Windows と比べた際の大きな利点です。
Unix ファイルの基礎は以下です。
MYFILE
" と
"MyFile
" は異なるファイルです。
/
" と記載されます。これを root ユーザーのホームディレクトリー
"/root
" とは混同しないで下さい。
/
"
以外の文字・記号からなる名前がついています。ルートディレクトリーは例外で、その名前は "/
"
("スラッシュ" とか "ルートディレクトリー" と読まれます) でその名前を変えることはできません。
/
"
ディレクトリーで始まり、ファイル名中の各ディレクトリーやファイル名の間には "/
" がはさまります。最初の
"/
" はディレクトリー名です。その他の "/
"
は、次のサブディレクトリーとの区別をします。そして最後には実際のファイルの名前がきます。ちょっと混乱しそうですので、次の完全に記述したファイル名 の例をご覧下さい:
"/usr/share/keytables/us.map.gz
"。
一方このベース名である、"us.map.gz
" だけをファイル名と呼ぶ人もあります。
/etc/
" や "/usr/
"
のような複数の枝を持ちます。これらのサブディレクトリーもまた "/etc/init.d/
" や
"/usr/local/
"
のように、さらにサブディレクトリーに枝別れします。これらの全体をまとめてディレクトリーツリーと呼びます。絶対ファイル名はツリーの根元
("/
") から枝の先 (ファイル)
までの経路として考えることもできます。また、あたかもディレクトリーツリーを家系図のように人が話すのを聞いたことがあるでしょう。あたかもそれぞれのサブディレクトリーに親があるとし、パスはファイルの完全な祖先の系図のように表現します。ルートディレクトリーではない他の場所から始まる相対パスもあります。ディレクトリー
"../
"
は親ディレクトリーを参照していることを覚えておきましょう。このような呼び方はディレクトリーのような構造を持つ他の階層的ツリー状のデーター構造体でもよく使われます。
C:\
"
のようなデバイス名が含まれる RT-11 や CP/M や OpenVMS や MS-DOS や AmigaOS や
Microsoft Windows
と違う点です。(但し、通常のファイルシステム中に物理デバイスを示すディレクトリー項目はあります。「ファイルシステムの内側」参照。)
ほとんど全ての文字や記号をファイル名中に使えますが、実際そうすることは賢明ではありません。スペースやタブや改行や他の特殊文字:
{ } ( ) [ ] ' ` " \ / > < | ; ! # & ^ * % @ $
はコマンドラインで特別な意味を持つので避けるべきです。名前の中の単語間には、ピリオドやハイフンや下線を選んで区別します。各語頭を
"LikeThis
" のように語頭を大文字にすることもできます。経験を積んだ Linux
のユーザーはファイル名中にスペースが入ることを避けます。
"root" (ルート) と言う言葉は "root ユーザー" と言う意味でも "ルートディレクトリー" と言う意味でも使われます。それがいずれかは使われている文脈から明かです。
パスと言う言葉は上述の完全に記述したファイル名に関して使われるばかりではなくコマンドサーチパスにも使われます。どちらの意味かは文脈から明かです。
ファイル階層について詳細に学ぶ最も良い方法は、Filesystem Hierarchy Standard
("/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz
" や
hier
(7)) に記述されています。手始めとして次の事実を覚えるべきです。
表1.3 重要ディレクトリーの使い方のリスト
ディレクトリー | ディレクトリーの用途 |
---|---|
/
|
ルートディレクトリー |
/etc/
|
システム全体の設定ファイル |
/var/log/
|
システムのログファイル |
/home/
|
全ての非特権ユーザーのホームディレクトリー |
Unix の伝統に従い、Debian/Linux
システムはハードディスクや他のストレージデバイス上に存在する物理データーを表す ファイルシステムを提供し、コンソールスクリーンやリモートのシリアルコンソールなどのハードウェアデバイスとの相互作用が
"/dev/
" の下に統一された形式で表されています。
Debian/Linux システム上の、各々のファイルやディレクトリーや名前付きパイプ (2つのプログラムがデーターを共有する方法)
や物理デバイスは、それぞれの所有者 (owner) やデーターが所属するグループ (group) や最終アクセス時間などの付帯属性
(attribute) を記述する inode と呼ばれるデーター構造を持ちます。
Debian GNU/Linux システムでの inode 構造
の正確な定義を知るには、"/usr/include/linux/fs.h
" をご覧下さい。
ほとんど全てをファイルシステム表現しようというアイデアは Unix の発明でしたし、現代的な Linux
カーネルはこのアイデアを一歩進めています。コンピューター上で実行されているプロセス情報さえファイルシステム中に見つけられます。
このような物理的実体と内部プロセスの抽象的かつ統一された表現は非常にパワフルなので、多くの全く異なるデバイスに同じコマンドを使用して同種の操作が行えます。実行中のプロセスに繋がった特殊なファイルにデーターを書き込むことでカーネルが如何に動作するかまで変更できます。
ファイルツリーや物理的実体の間の関係を確認する必要がある際には、mount
(8) を引数無しで実行して下さい。
Unix 的システムのファイルシステムのパーミッションは次の3つの影響されるユーザーのカテゴリーのために定義されています。
ファイルでは、それぞれに対応するパーミッションは次のようになります。
ディレクトリーでは、対応するパーミッションはそれぞれ次のようになります。
ここで、ディレクトリーに関する実行 (execute) パーミッションとはディレクトリー内のファイルへの読出しを許可するのみならず、サイズや変更時間のようなアトリビュート閲覧を許可します。
ファイルやディレクトリーのパーミッション情報他を表示するには、ls
(1)
が使われます。"-l
" オプション付きでこれを実行すると、次の情報がこの順序で表示されます。
root アカウントから chown
(1) を使用することでファイルの所有者を変更します。ファイルの所有者又は
root アカウントから chgrp
(1) を使用することでファイルのグループを変更します。ファイルの所有者又は
root アカウントから chmod
(1)
を使用することでファイルやディレクトリーのアクセスパーミッションを変更します。foo
ファイルの操作の基本的文法は次の通り。
# chown <newowner> foo # chgrp <newgroup> foo # chmod [ugoa][+-=][rwxXst][,...] foo
例えば次のようにするとディレクトリーツリーの所有者をユーザー foo
に変更しグループ
bar
で共有できます。
# cd /some/location/ # chown -R foo:bar . # chmod -R ug+rwX,o=rX .
更に特殊なパーミッションビットが3つ存在します。
ここで、これらのビットの "ls -l
"
のアウトプットはこれらの出力によってかくされた実行ビットが非設定 (unset)
の場合大文字となります。
セットユーザー ID を実行ファイルにセットすると、ユーザーはファイルの所有者 ID (例えば、root) を使って実行ファイルを実行することを許可されます。同様に、セットグループ ID を実行ファイルにセットすると、ユーザーはファイルのグループ ID (例えば、root) を使って実行ファイルを実行することを許可されます。これらの設定はセキュリティーを破壊するリスクを引き起こすので、これらのビットを有効にするには特別な注意が必要です。
セットグループ ID をディレクトリーに対して有効にすると、ディレクトリーに作成した全ファイルがディレクトリーのグループに所属するという BSD 的ファイル生成手法が有効になります。
スティッキビットをディレクトリーに対して有効にすると、ディレクトリーにあるファイルがファイルの所有者以外から削除されるのを防ぎます。"/tmp
"
のような全員書込み可能ディレクトリーやグループ書込み可能なディレクトリーなどのにあるファイルの内容を安全にするためには、書込みパーミッションを無効にするだけでなく、ディレクトリーにスティッキビットもセットする必要があります。さもなければ、ディレクトリーに書込みアクセスできるユーザーにより、ファイルが削除され、同じ名前で新規ファイルが作成されることを許してしまいます。
ファイルパーミッションの興味ある例を次にいくつか示します。
$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4 crw------- 1 root root 108, 0 2007-04-29 07:00 /dev/ppp -rw-r--r-- 1 root root 1427 2007-04-16 00:19 /etc/passwd -rw-r----- 1 root shadow 943 2007-04-16 00:19 /etc/shadow -rwsr-xr-x 1 root root 700056 2007-04-22 05:29 /usr/sbin/exim4 $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src drwxrwxrwt 10 root root 4096 2007-04-29 07:59 /tmp drwxrwsr-x 10 root staff 4096 2007-03-24 18:48 /usr/local drwxrwsr-x 4 root src 4096 2007-04-27 00:31 /usr/src drwxrwsr-x 2 root mail 4096 2007-03-28 23:33 /var/mail drwxrwxrwt 2 root root 4096 2007-04-29 07:11 /var/tmp
chmod
(1)
を用いて、ファイルパーミッションを記述するためのもう一つの数字モードが存在します。この数字モードは8進数を使った3桁から4桁の数字を用います。
表1.5 chmod
(1) コマンドで用いられるファイルパーミッションの数字モード
数字 | 意味 |
---|---|
1桁目 (任意) | セットユーザー ID (=4) とセットグループ ID (=2) とスティキービット (=1) の和 |
2桁目 | ユーザーに関する、読出し (read) (=4) と書込み (write) (=2) と実行 (execute) (=1) のファイルパーミッションの和 |
3桁目 | グループに関して、同上 |
4桁目 | ユーザーに関して、同上 |
これは複雑に聞こえるかもしれませんが、実際は本当にシンプルです。"ls -l
" コマンドの出力の最初の数列
(2〜10列) を見て、それをファイルパーミッションのバイナリー表記 (2進数) ("-" を "0"、"rwx" を "1")
として読むと、この数字モードの値はファイルパーミッションの8進数表現として意味を持ちます。
例えば、次を試してみて下さい:
$ touch foo bar $ chmod u=rw,go=r foo $ chmod 644 bar $ ls -l foo bar -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:22 bar -rw-r--r-- 1 penguin penguin 12 2007-04-29 08:22 foo
シェルスクリプトから "ls -l
"
で表示される情報にアクセスする必要がある際には、test
(1) や
stat
(1) や readlink
(1)
のような適切なコマンドの使用を考えるべきです。シェル組込みコマンドの "[
" や
"test
" を使うのも手です。
新規作成ファイルのやディレクトリーに適用されるパーミッションは umask
シェル組込みコマンドを使うことにより制限できます。dash
(1) か
bash
(1) か builtins
(7) をご覧下さい。
(ファイルパーミッション) = (要求されたパーミッション) & ~(umask 値)
表1.6 umask 値の例
umask | 作成されるファイルパーミッション | 作成されるディレクトリーパーミッション | 使い方 |
---|---|---|---|
0022
|
-rw-r--r--
|
-rwxr-xr-x
|
ユーザーのみにより書込み可 |
0002
|
-rw-rw-r--
|
-rwxrwxr-x
|
グループにより書込み可 |
Debian システムはユーザー専用グループ (UPG) 方式がデフォールト方式です。新規ユーザーがシステムに追加される毎に UPG
は作成されます。UPG はそのグループを作成したユーザーと同じ名前を持ち、そのユーザーが UPG の唯一のメンバーです。UPG
方式では、全ユーザーが各自専用のグループを持つので umask を 0002
と設定しても安全です。(一部
Unix 系システムでは全一般ユーザーを1つの users
グループに所属させることがよく行われます。そのような場合には安全のため 0022
と umask を設定します。)
グループパーミッションを特定ユーザーに適用するには、"sudo vigr
"
を用いてそのユーザーをグループのメンバーにする必要があります。
もし "auth optional pam_group.so
" 行が
"/etc/pam.d/common-auth
"
に書き加えれ、"/etc/security/group.conf
"
に対応する設定がされていれば、実際のユーザーのグループメンバーシップは動的に割り当てられます。(4章認証参照。)
ハードウエアーデバイスは Debian システム上では一種のファイルでしかありません。CD-ROM や USB メモリースティックのようなデバイスをユーザーアカウントからアクセスするのに問題があった場合にはそのユーザーを該当するグループのメンバーにします。
いくつかのシステムが供給するグループはそのメンバーに root
権限無しに特定のファイルやデバイスにアクセスすることを可能にします。
表1.7 ファイルアクセスのためにシステムが供給する特記すべきグループのリスト
グループ | アクセスできるファイルやデバイスの説明 |
---|---|
dialout
|
シリアルポート ("/dev/ttyS[0-3] ") への全面的かつ直接のアクセス
|
dip
|
信頼できるピアーにダイヤルアップ IP 接続をするためのシリアルポートへの制限付きアクセス |
cdrom
|
CD-ROM や DVD+/-RW のドライバー |
audio
|
音声デバイス |
video
|
映像デバイス |
scanner
|
スキャナー |
adm
|
システムモニターのログ |
staff
|
下級管理業務のためのディレクトリー:
"/usr/local "、"/home "
|
モデムの設定をしたりどこにでも電話したり等するには dialout
グループに所属する必要があります。もし信頼できるピアーに関する事前定義された設定ファイル
"/etc/ppp/peers/
" が root
によって作成されていると、dip
グループに属するだけで pppd
(8) や
pon
(1) や poff
(1) コマンドを用いてダイヤルアップ IP 接続が作成できます。
いくつかのシステムが供給するグループはそのメンバーに root
権限無しに特定のコマンドを実行することを可能にします。
表1.8 特定コマンド実行のためにシステムが供給する特記すべきグループのリスト
グループ | 実行可能なコマンド |
---|---|
sudo
|
パスワード無しに sudo を実行
|
lpadmin
|
プリンターのデーターベースからプリンターを追加・変更・削除するコマンドを実行 |
plugdev
|
USB メモリーのようなリムーバブルデバイスに関して pmount (1) を実行
|
システムが供給するユーザーやグループの完全なリストは、base-passwd
パッケージが供給する
"/usr/share/doc/base-passwd/users-and-groups.html
"
の中にある最新バージョンの "Users and Groups" 文書を参照下さい。
ユーザーやグループシステムを管理するコマンドは passwd
(5) や
group
(5) や shadow
(5) や
newgrp
(1) や vipw
(8) や
vigr
(8) や pam_group
(8) を参照下さい。
GNU/Linux ファイルのタイムスタンプには3種類あります。
表1.9 タイムスタンプのタイプのリスト
タイプ | 意味 |
---|---|
mtime |
ファイル内容変更時間 (ls -l )
|
ctime |
ファイル状態変更時間 (ls -lc )
|
atime |
ファイル最終アクセス時間 (ls -lu )
|
ctime はファイル作成日時ではありません。
Debian システム上のファイルを単に読むだけで inode 中の
atime
情報を更新する書込みオペレーションが通常引き起こされることを覚えておいて下さい。ファイルシステムを
"noatime
" や "relatime
"
オプションを用いてマウントすることでシステムはこのようなオペレーションをしなくなるので、ファイルへの読出しアクセスを高速化できます。ハードディスクの活動を抑えパワーの節約ができるのでこのような設定はラップトップ向けに推奨されます。mount
(8)
を参照下さい。
既存ファイルのタイムスタンプを変更するには touch
(1) コマンドを使って下さい。
タイムスタンプに関して、現代の英語ロケール ("en_US.UTF-8
") では旧式の英語ロケール
("C
") と違った文字列が ls
コマンドから出力されます。
$ LANG=en_US.UTF-8 ls -l foo -rw-r--r-- 1 penguin penguin 3 2008-03-05 00:47 foo $ LANG=C ls -l foo -rw-r--r-- 1 penguin penguin 3 Mar 5 00:47 foo
"ls -l
" の出力のカスタム化は「時間と日付のカスタム化表示」を参照下さい。
"foo
" というファイルを異なるファイル名 "bar
"
に結びつけるのには2つの方法があります。
ln foo bar
"
ln -s foo bar
"
リンク数の変化と rm
コマンドの結果の微妙な違いについての次の例をご覧下さい。
$ echo "Original Content" > foo $ ls -li foo 2398521 -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:15 foo $ ln foo bar # hard link $ ln -s foo baz # symlink $ ls -li foo bar baz 2398521 -rw-r--r-- 2 penguin penguin 17 2007-04-29 08:15 bar 2398538 lrwxrwxrwx 1 penguin penguin 3 2007-04-29 08:16 baz -> foo 2398521 -rw-r--r-- 2 penguin penguin 17 2007-04-29 08:15 foo $ rm foo $ echo "New Content" > foo $ ls -li foo bar baz 2398521 -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:15 bar 2398538 lrwxrwxrwx 1 penguin penguin 3 2007-04-29 08:16 baz -> foo 2398540 -rw-r--r-- 1 penguin penguin 12 2007-04-29 08:17 foo $ cat bar Original Content $ cat baz New Content
ハードリンクは同一ファイルシステム内に作れ、ls
(1) コマンドに "-i
"
オプションを使って表示される inode 番号が同じです。
シンボリックリンクは上の例に示したように、常にファイルアクセスパーミッション "rwxrwxrwx
"
を持ちますので、シンボリックリンクが指すファイルのアクセスパーミッションが有効ファイルアクセスパーミッションとなります。
もし特段の理由がないなら複雑なシンボリックリンクやハードリンクを作らない方が一般的には良いでしょう。シンボリックリンクの論理的組み合わせがファイルシステム中でループになっているという悪夢を引き起こすかもしれません。
もしハードリンクを使う特段の理由がなければ、ハードリンクよりシンボリックリンクを使う方が一般的には良いでしょう。
".
"
ディレクトリーは、それ自身が中にあるディレクトリーとリンクしていますので、新規ディレクトリーのリンク数は2から始まります。"..
"
ディレクトリーは親ディレクトリーとリンクしているので、ディレクトリーのリンク数は新規サブディレクトリーの増加に伴い増加します。
もし最近あなたが Windows から Linux に移動してきたなら、Unix のファイル名のリンクは Windows 上でもっとも似ている "shortcuts" との比較で如何にうまくできているかにすぐ気づくでしょう。ファイルシステム中に実装されているのでアプリケーションからはリンクされたファイルなのかオリジナルなのかの区別がつきません。ハードリンクの場合は実際全く違いはありません。
名前付きパイプは、パイプのように働くファイルです。何かをファイルに入れると、もう一方の端からそれが出てきます。こうしてこれは FIFO または First-In-First-Out (先入れ先出し) と呼ばれます。つまり、最初にパイプに入れられたものが最初にもう一方の端から出てきます。
名前付きパイプに書き込む場合、パイプに書き込むプロセスは情報がパイプから読出されるまで終了しません。名前付きパイプから読み出す場合、読出すプロセス何か読出すものが無くなるまで終了するのを待ちます。パイプのサイズは常に
0 です。 -- 名前付きパイプはデーターを保存せず、 シェルの "|
"
のように2つのプロセスをリンクするだけです。しかし、このパイプは名前を持つので、2つのプロセスは同じコマンドラインになくても良いし、同じユーザーにより実行される必要さえありません。パイプは
Unix の非常に影響力ある発明でした。
例えば、次を試してみて下さい:
$ cd; mkfifo mypipe $ echo "hello" >mypipe & # put into background [1] 8022 $ ls -l mypipe prw-r--r-- 1 penguin penguin 0 2007-04-29 08:25 mypipe $ cat mypipe hello [1]+ Done echo "hello" >mypipe $ ls mypipe mypipe $ rm mypipe
ソケットはインターネットのコミュニケーションやデーターベースやオペレーティングシステム自身によって頻繁に使われます。ソケットは名前つきパイプ (FIFO) に似ており、異なるコンピューター間でさえプロセス間の情報交換を可能にします。ソケットにとって、これらのプロセスは同時に実行する必要も、同じ祖先プロセスの子供である必要もありません。これはプロセス間通信 (IPC) の終端点です。ネットワーク越しで異なるホストの間で情報の交換をすることも可能です。2つの典型的なソケットは、インターネットソケットと Unix ドメインソケットです。
"netstat -an
" を実行すると特定のシステム上のソケットの全般状況がよく分かります。
デバイスファイルは、システム上のハードディスク、ビデオカード、ディスプレー、キーボードなどの物理デバイス又は仮想デバイス等を意味します。仮想デバイスの例として
"/dev/console
" として表されるコンソールがあります。
2タイプのデバイスファイルがあります。
文字デバイス
ブロックデバイス
デバイスファイルの読出し書込みが可能ですが、人間にとっては意味不明のバイナリーデーターがファイル中に多分含まれています。データーを直接デバイスファイルに書き込むことは時々ハードウェアの接続に関するトラブルシュートに役立ちます。例えば、プリンタデバイス
"/dev/lp0
" にテキストファイルをダンプしたり、 適切なシリアルポート
"/dev/ttyS0
"
にモデムコマンドを送ることができます。しかし、注意深くやらないと、大災害をもたらすことがあります。くれぐれも気をつけて下さい。
通常のプリンターへのアクセスは lp
(1) を使います。
次のように ls
(1) を実行するとデバイスノード番号が表示されます。
$ ls -l /dev/hda /dev/ttyS0 /dev/zero brw-rw---- 1 root cdrom 3, 0 2007-04-29 07:00 /dev/hda crw-rw---- 1 root dialout 4, 64 2007-04-29 07:00 /dev/ttyS0 crw-rw-rw- 1 root root 1, 5 2007-04-29 07:00 /dev/zero
/dev/hda
" はメジャーデバイス番号3 とマイナーデバイス番号0 を持ちます。これは
cdrom
グループに所属するユーザーにより、読出し / 書込みアクセスが可能です。
/dev/ttyS0
" はメジャーデバイス番号4 とマイナーデバイス番号64 を持ちます。これは
dialout
グループに所属するユーザーにより、読出し / 書込みアクセスが可能です。
/dev/zero
" はメジャーデバイス番号1 とマイナーデバイス番号5 を持ちます。これは誰によっても読出し
/ 書込みアクセスが可能です。
Linux 2.6 システムでは、"/dev/
" の下のファイルは
udev
(7) メカニズムで自動的に充足されます。
いくつかの特別なデバイスファイルがあります。
表1.10 スペシャルなデバイスファイルのリスト
デバイスファイル | アクション | レスポンスの説明 |
---|---|---|
/dev/null
|
読出し | "行末 (EOF) 文字 " を返す |
/dev/null
|
書込み | 何も返さず (底なしのデーターのゴミ捨て場) |
/dev/zero
|
読出し |
"\0 (NUL) 文字" を返す (ASCII の数字のゼロとは違う)
|
/dev/random
|
読出し | 真の乱数発生機から真のエントロピーのあるランダムな文字を返す (遅い) |
/dev/urandom
|
読出し | 暗号学的にセキュアーな擬似乱数発生機からランダムな文字を返す |
/dev/full
|
書込み | ディスクフル (ENOSPC) エラーを返す |
以上はシェルのリディレクションとともによく使われます。(「典型的なコマンドシーケンスとシェルリディレクション」参照)。
procfs と sysfs は
"/proc
" や "/sys
"
上にマウントされる仮想ファイルシステムであり、カーネルの内部データー構造をユーザー空間にさらけ出します。言い換えると、オペレーティングシステムのオペレーションへの便利なのぞき窓となると言う意味で仮想といえます。
"/proc
" ディレクトリー中には、システム上で実行されている各プロセスに対応したそのプロセス ID (PID)
の名前がついたサブディレクトリー他があります。プロセス情報をアクセスする ps
(1)
のようなシステムユーティリティーはこのディレクトリー構造からその情報を得ています。
"/proc/sys/
"
の下のディレクトリーには実行時のカーネル変数を変更するインターフェースがあります。(専用の sysctl
(8)
コマンドもしくはその起動 / 設定ファイル "/etc/sysctrl.conf
"
によっても同様のことができます。)
Linux カーネルが "Too many open files" とエラーを出力することがあります。root のシェルから、例えば
"echo "65536" > /proc/sys/fs/file-max
" 等と
"file-max
" の値をより大きな値に増加することで解決できます。(旧式カーネルではこれが必要でした。)
特にあるファイル - "/proc/kcore
" -
に気づくと、パニックになる人がよくいます。これは一般に巨大です。これは (おおよそ) コンピューターのメモリーの内容のコピーです。これは kernel
をデバッグするのに用いられます。コンピューターのメモリーを指す仮想ファイルなので、そのサイズに関して心配する必要は全くありません。
"/sys
"
の下のディレクトリーはカーネルから引き出されたデーター構造、その属性、それらの関連を含んでいます。一部カーネル変数を実行時に変更する機構もまた含まれたりします。
linux-doc-2.6.*
パッケージで供給される Linux カーネル文書
("/usr/share/doc/linux-doc-2.6.*/Documentation/filesystems/*
")
中の "proc.txt(.gz)
" や "sysfs.txt(.gz)
"
や関連する他の文書を参照下さい。
Midnight Commander (MC) は Linux コンソールや他の端末環境のための GNU 製 "スイス軍ナイフ" です。標準 Unix コマンドを習うよりもより簡単なメニューを使ったコンソール経験が初心者にもできます。
"mc
" と名づけられた Midnight Commander
パッケージを次のようにしてインストールする必要があります。
$ sudo apt-get install mc
Debian システムを探検するために mc
(1)
コマンドを使います。これは学習するための最良の方法です。カーソールキーとエンターキーを使うだけで興味深い場所をちょっと探検します。
/etc
" とサブディレクトリー
/var/log
" とサブディレクトリー
/usr/share/doc
" とサブディレクトリー
/sbin
" と "/bin
"。
終了時に作業ディレクトリーを MC に変更させそのディレクトリーへ cd させるためには、mc
パッケージが提供するスクリプトを "~/.bashrc
" が含むように変更します。
. /usr/share/mc/bin/mc.sh
この理由は mc
(1) ("-P
" オプション項目) を参照下さい
(今言っていることがよく分からないなら、これは後日しても大丈夫です。)
MC は次のようにして起動します。
$ mc
MC を使うとメニューを通じた最小限のユーザーの努力で全てのファイル操作の面倒が見られます。ヘルプ表示を出すには、ただ F1 を押すだけです。カーソールキーとファンクションキーの操作だけで MC を使えます。
gnome-terminal
(1)
のようなコンソールでは、ファンクションキーのキーストロークがコンソールプログラムに横取りされる事があります。gnome-terminal
の場合、"Edit" → "Keyboard Shortcuts" とするとこの機能を無効にできます。
もし文字化け表示がされる文字符号化 (エンコーディング) 問題に出会った際には、MC のコマンドラインに "-a
"
を加えると解消する事があります。
これでも MC の表示の問題が解消しない際には、「ターミナルの設定」を参照下さい。
2つのディレクトリーパネルがありそれぞれファイルリストを含むのが標準です。他の便利なモードとしては、右側のウィンドウを "information"
とセットしてファイルアクセス権情報などを表示するモードがあります。次にいくつかの不可欠なキーストロークを示します。gpm
(8)
デーモンを実行すると、Linux の文字ターミナルでマウスも使えます。(MC で通常の挙動のカットアンドペーストをさせるには、shift
キーを押して下さい。)
表1.11 MC のキーバインディング
キー | キーバインディング |
---|---|
F1
|
ヘルプメニュー |
F3
|
内部ファイルビューワー |
F4
|
内部エディター |
F9
|
プルダウンメニュー有効 |
F10
|
MC を終了 |
Tab
|
二つのウィンドウの間を移動 |
Insert もしくは Ctrl-T
|
コピーのような複数ファイル操作のためにファイルをマーク |
Del
|
ファイルの削除 (気をつけましょう -- MC を安全削除モードに設定) |
カーソールキー | 自明 |
cd
コマンドは選択されたスクリーンに表示されたディレクトリーを変更します。
Ctrl-Enter
と Alt-Enter
はファイル名をコマンドラインにコピーします。コマンドライン編集と一緒に cp
(1) や
mv
(1) コマンドで御使用下さい。
Alt-Tab
はシェルファイル名の自動展開の選択肢を表示します。
mc /etc /root
"。
Esc
+ n-key
→ Fn
(つまり、Esc
+ 1
→
F1
、等々、Esc
+ 0
→
F10
)
Esc
をキーの前に押すのは Alt
をキーと同時に押すのと同様の効果があります。つまり、Esc
+ c
は
Alt-C
と同じです。Esc
はメタキーとよばれ時々
"M-
" と表記されます。
MC の内部エディターは興味深いカットアンドペースト機構を持ちます。F3
キーを押すと、選択範囲のスタートとマークし、次に F3
を押すと、選択範囲のエンドとマークし、選択範囲を強調します。そしてカーソールを動かすことができます。F6
を押すと、選択範囲はカーソールの位置に移動します。F5
を押すと、選択範囲はコピーされ、カーソールの位置に挿入されます。F2
を押すとファイルをセーブします。F10
を押すと選択範囲はなくなります。ほとんどのカーソールキーは直感的に働きます。
このエディターは次のコマンドの内のひとつを使いファイルに対し直接起動できます。
$ mc -e filename_to_edit
$ mcedit filename_to_edit
これはマルチモードエディターではありませんが、複数の Linux コンソール上で使用すると同じ効果を発揮させされます。ウィンドウ間のコピーを行うには、 Alt-<n> キーを押して仮想コンソールを切替えて、"File→Insert file" や "File→Copy to file" を用いてファイルの一部を他のファイルに動かします。
この内部エディターはお好きな他の外部エディターと置き換えが可能です。
また、多くのプログラムは使用するエディターを決定するために環境変数 "$EDITOR
" や
"$VISUAL
" を使用します。最初 vim
(1) や
nano
(1) が使いにくい場合には "~/.bashrc
"
に次に示す行を追加してエディターを "mcedit
" に設定するのも一計です。
export EDITOR=mcedit export VISUAL=mcedit
できればこれは "vim
" に設定することを推奨します。
vim
(1) が使いにくい場合には、mcedit
(1)
をほとんどのシステム管理業務のために使い続けられます。
MC は非常に賢明なビューワーです。文書内の単語を検索するための素晴らしいツールです。私は
"/usr/share/doc
" ディレクトリー内のファイルに対していつもこれを使います。これは 大量にある
Linux 情報を閲覧する最速の方法です。このビューワーは次のコマンドの内のひとつを使い直接起動できます。
$ mc -v path/to/filename_to_view
$ mcview path/to/filename_to_view
ファイルの上で Enter を押すと、適切なプログラムがファイル内容を処理します (「スタートするプログラムのカスタム化」参照)。これは非常に便利な MC の機能です。
表1.12 enter キー入力への MC の反応
ファイルタイプ | enter キーへの反応 |
---|---|
実行ファイル | コマンド実行 |
man ファイル | ビューワーソフトに内容をパイプ |
html ファイル | ウェッブブラウザーに内容をパイプ |
"*.tar.gz " や "*.deb " ファイル
|
サブディレクトリーであるかのように内容を表示 |
これらのビューワーや仮想ファイルの機能を有効にするためには、閲覧可能なファイルには実行可能と設定されていてはいけません。chmod
(1)
コマンドを使うか、MC のファイルメニュー経由で状態を変更して下さい。
MC はほとんど全てのことを可能にしますが、シェルプロンプトから実行されるコマンドラインツールの使用方法について学び、Unix 的な作業環境に親しむのは非常に重要なことです。
ログインシェルは chsh
(1) を使えば選択できます。
表1.13 シェルプログラムのリスト
パッケージ | ポプコン | サイズ | POSIX シェル | 説明 |
---|---|---|---|---|
bash
*
|
V:91, I:99 | 3536 | はい | Bash: GNU Bourne Again SHell (デファクトスタンダード) |
tcsh
*
|
V:4, I:27 | 768 | いいえ | TENEX C Shell: 拡張バージョンの Berkeley csh |
dash
*
|
V:25, I:32 | 248 | はい | Debian の Almquist シェル、シェルスクリプトに好適 |
zsh
*
|
V:3, I:6 | 12784 | はい | Z shell: 多くの拡張された標準シェル |
pdksh
*
|
V:0.2, I:1.1 | 468 | はい | パブリックドメインバージョンの Korn シェル |
csh
*
|
V:0.6, I:2 | 404 | いいえ | OpenBSD の C シェル、Berkeley csh の派生 |
sash
*
|
V:0.2, I:1.0 | 856 | はい | 組み込みコマンド付きの独立シェル (標準の
"/bin/sh " には不向き)
|
ksh
*
|
V:0.5, I:1.6 | 2800 | はい | 真の AT&T バージョンの Korn シェル |
rc
*
|
V:0.16, I:1.6 | 204 | いいえ | AT&T Plan 9 の rc シェルの実装 |
posh
*
|
V:0.01, I:0.11 | 228 | はい |
ポリシー準拠の通常シェル (pdksh の派生)
|
このチュートリアル章内では、インタラクティブなシェルは常に bash
です。
vim
(1) の挙動は "~/.vimrc
" を使ってカスタム化できます。
例えば、次を試してみて下さい。
# CD upon exiting MC . /usr/share/mc/bin/mc.sh # set CDPATH to good one CDPATH=.:/usr/share/doc:~:~/Desktop:~ export CDPATH PATH="${PATH}":/usr/sbin:/sbin # set PATH so it includes user's private bin if it exists if [ -d ~/bin ] ; then PATH=~/bin:"${PATH}" fi export PATH EDITOR=vim export EDITOR
bash
に関する更なるカスタム化方法は、9章システムに関するティップ中の「着色化されたコマンド」等にあります。
Unix 的環境下では、特別の意味を持ったいくつかのキーストロークがあります。通常の
Linux の文字ターミナルでは左側の Ctrl
や Alt
キーのみが期待にそって機能することに配慮下さい。次に特記すべき暗記するべきキーストロークを記します。
表1.14 Bash のキーバインディングのリスト
キー | キーバインディングの説明 |
---|---|
Ctrl-U
|
カーソールの前の1行を消去 |
Ctrl-H
|
カーソールの前の1文字を削除 |
Ctrl-D
|
入力を終了 (シェルを使用中の場合、シェルを終了) |
Ctrl-C
|
実行中のプログラムを終了 |
Ctrl-Z
|
プログラムをバックグラウンドジョブに移動し一時停止 |
Ctrl-S
|
スクリーンへの出力を停止 |
Ctrl-Q
|
スクリーンへの出力を再開 |
Ctrl-Alt-Del
|
システムをリブート / 停止、inittab (5) 参照
|
Left-Alt キー (もしくは、Windows キー )
|
Emacs および同様の UI でのメタキー |
Up-arrow
|
bash でコマンド履歴検索をスタート
|
Ctrl-R
|
bash でインクリメンタルなコマンド履歴検索をスタート
|
Tab
|
bash のコマンドラインのファイル名入力を完結
|
Ctrl-V Tab
|
bash のコマンドラインで Tab を展開することなく入力
|
ターミナルの Ctrl-S
機能は stty
(1) で無効にできます。
Unix 流のマウス操作は3ボタンマウスが基本です。
表1.15 Unix 流のマウス操作
アクション | 反応 |
---|---|
マウスの左クリックアンドドラッグ | 選択とクリップボードへのコピー |
左クリック | 選択スタート点の選択 |
右クリック | 選択エンド点の選択とクリップボードへのコピー |
中クリック | クリップボードをカーソール位置に挿入 (ペースト) |
現代的なホイールマウスの真ん中のホイールは中マウスボタンと見なされ、中クリックに使えます。2ボタンマウス状況では左右のボタンの同時押しが中クリックとして使えます。Linux
の文字コンソールでマウスを使うには gpm
(8) をデーモンで実行する必要があります。
less
(1) は機能拡張されたページャー (ファイル内容のブラウザー)
です。"h
" と入力するとヘルプが表示されます。これは、more
(1)
よりもはるかに機能があり、"eval $(lesspipe)
" または "eval
$(lessfile)
"
とシェルのスタートスクリプト中で実行することで更に機能拡充されます。詳しくは、"/usr/share/doc/lessf/LESSOPEN
"
を参照下さい。"-R
" オプションを用いると生の option allows raw 文字出力が許可され、ANSI
カラーエスケープシーケンスが有効になります。less
(1) を参照下さい。
Unix 的システムで人気のある、Vim か Emacs プログラムのいずれかのバリアントに習熟するべきです。
著者としては Vim コマンドに慣れることは正しいことだと考えています。なぜなら Vi エディターは Linux/Unix
の世界では必ず存在するからです。(実際はオリジナルの vi
か、新しい
nvi
がどこででも見つけられるプログラムです。これにもかかわらず Vim
を著者が初心者のために選んだのは、より強力かつ動作が充分似ているのと、F1
キーを通じてヘルプが表示されるからです。)
これとは違い、Emacs か XEmacs をエディターとして選ぶのも、特にプログラムをするには、非常に良い選択です。Emacs には、ニュースリーダ機能、ディレクトリーの編集機能、メール機能他の、過多な機能があります。プログラミングやシェルスクリプトの編集に使うときは、作業中のフォーマットをインテリジェントに認識し助力をしようとします。Linux 上で必要なプログラムは Emacs だけと考える人もいます。Emacs を今10分間学ぶことは将来何時間もの節約になります。Emacs を学ぶ際には GNU の Emacs マニュアルを持っておくことを高く推薦します。
これら全てのプログラムには練習しながら学べるようにチュータリングプログラムが普通付いてきます。Vim を
"vim
" とタイプして起動し、F1 キーを押します。最初の35行を読みます。カーソールを
"|tutor|
" に移動し Ctrl-]
を押してオンラインの訓練コースを始めます。
Vim や Emacs のような良いエディターは、正しいフォント設定がされた UTF-8 ロケールの下の適正なオプションを使った x-terminal-emulator を使うと、UTF-8 や他のエギゾチックな符号化方式 (エンコーディング) のテキストを正しく扱えます。マルチバイトテキストに関するそれぞれの文書を参照下さい。
Debian にはいくつかの異なったエディターがあります。上述のように vim
パッケージをインストールすることを推薦します。
Debian ではシステムのデフォールトのエディターへの統一されたアクセスを "/usr/bin/editor
"
コマンドを通じて提供しているので、他のプログラム (例えば reportbug
(1) 等)
が起動できます。設定変更は次で出来ます。
$ sudo update-alternatives --config editor
著者が "/usr/bin/vim.tiny
" より
"/usr/bin/vim.basic
" を初心者に推薦するのはシンタクスハイライトをサポートしているからです。
多くのプログラムは "$EDITOR
" か "$VISUAL
"
という環境変数を使ってどのエディターを使うかを決めます (「MC の内部エディター」と「スタートするプログラムのカスタム化」参照)。Debian システムの整合性のために、これらを
"/usr/bin/editor
" と設定しましょう。(歴史的には
"$EDITOR
" は "ed
"
で、"$VISUAL
" は "vi
" でした。)
vim
(1) の挙動は "~/.vimrc
" を使ってカスタム化できます。
例えば、次を試してみて下さい:
" ------------------------------- " Local configuration " set nocompatible set nopaste set pastetoggle=<f2> syn on if $USER == "root" set nomodeline set noswapfile else set modeline set swapfile endif " filler to avoid the line above being recognized as a modeline " filler " filler
シェルコマンドの出力はスクリーンから押し出されると永久に無くなってしまうかもしれません。シェルでの活動を後で見直せるようにファイルに記録しておくのは良いことです。この種の記録は何らかのシステム管理作業をする際には非常に重要です。
シェル活動の記録の基本方法は script
(1) の下で実行することです。
例えば、次を試してみて下さい:
$ script Script started, file is typescript
script
の下で何なりのシェルコマンドを実行します。
Ctrl-D
を押して script
から脱出します。
$ vim typescript
「シェルの活動を綺麗に記録」を参照下さい。
基本的 Unix コマンドを学びます。ここでは一般的意味で "Unix" を使っています。いかなる Unix クローンの OS
も等価なコマンドを提供します。Debian
システムも例外ではありません。今一部コマンドが思うように機能しなくても心配しないで下さい。エリアス
がシェルで使われた場合は、対応するコマンドの出力は変わります。次は順番に実行すると言う意味の例ではありません。
非特権ユーザーのアカウントから次のコマンドを全て実行します。
表1.16 基本の Unix コマンドのリスト
コマンド | 説明 |
---|---|
pwd
|
カレント / ワーキングディレクトリーの名前を表示 |
whoami
|
現在のユーザー名を表示 |
id
|
現在のユーザーのアイデンティティ (名前と uid と gid と関連する group) を表示 |
file <foo>
|
"<foo> " ファイルのファイルタイプを表示
|
type -p <commandname>
|
"<commandname> " コマンドのファイルの位置を表示
|
which <commandname>
|
, , |
type <commandname>
|
"<commandname> " コマンドに関する情報を表示
|
apropos <key-word>
|
"<key-word> " に関連したコマンドを発見
|
man -k <key-word>
|
, , |
whatis <commandname>
|
"<commandname> " コマンドに関する1行の説明を表示
|
man -a <commandname>
|
"<commandname> " コマンドに関する説明を表示 (Unix スタイル)
|
info <commandname>
|
"<commandname> " コマンドに関する比較的長い説明を表示 (GNU スタイル)
|
ls
|
ディレクトリーの内容をリスト (非ドットファイルおよびディレクトリー) |
ls -a
|
ディレクトリーの内容をリスト (全ファイルおよびディレクトリー) |
ls -A
|
ディレクトリーの内容をリスト (ほとんど全ファイルおよびディレクトリー、".. " と
". " をスキップ)
|
ls -la
|
ディレクトリーの内容を詳細情報とともにリスト |
ls -lai
|
ディレクトリーの内容を inode 番号と詳細情報とともにリスト |
ls -d
|
現ディレクトリーの中の全ディレクトリーをリスト |
tree
|
ファイルツリーの内容を表示 |
lsof <foo>
|
"<foo> " ファイルのオープンの状態をリスト
|
lsof -p <pid>
|
プロセス ID: "<pid> " によってオープンされたファイルをリスト
|
mkdir <foo>
|
現ディレクトリー中に "<foo> " という新規ディレクトリー作成
|
rmdir <foo>
|
現ディレクトリー中の "<foo> " というディレクトリーを削除
|
cd <foo>
|
現ディレクトリー中もしくは "$CDPATH " 変数中にリストされたディレクトリー中の
"<foo> " というディレクトリーにディレクトリーを変更
|
cd /
|
ディレクトリーをルートディレクトリーに変更 |
cd
|
現在のユーザーのホームディレクトリーにディレクトリーを変更 |
cd /<foo>
|
絶対ディレクトリーパス "/<foo> " にディレクトリーを変更
|
cd ..
|
親ディレクトリーにディレクトリーを変更 |
cd ~<foo>
|
ユーザー "<foo> " のホームディレクトリーにディレクトリーを変更
|
cd -
|
一つ前のディレクトリーにディレクトリーを変更 |
</etc/motd pager
|
"/etc/motd " の内容をデフォールトのページャーで表示
|
touch <junkfile>
|
空ファイル "<junkfile> " を作成
|
cp <foo> <bar>
|
既存のファイル "<foo> " を新規ファイル
"<bar> " にコピー
|
rm <junkfile>
|
ファイル "<junkfile> " を削除
|
mv <foo> <bar>
|
既存のファイル "<foo> " の名前を新しい名前
"<bar> " に変更 (ディレクトリー
"<bar> " が存在不可)
|
mv <foo> <bar>
|
既存のファイル "<foo> " を新しい場所
"<bar>/<foo> " に移動 (ディレクトリー
"<bar> " が存在しなければいけない)
|
mv <foo> <bar>/<baz>
|
既存のファイル "<foo> " を新しい場所の新しい名前のファイル
"<bar>/<baz> " に移動 (ディレクトリー
"<bar> " が存在しなければいけないが、ディレクトリー
"<bar>/<baz> " は存在してはいけない)
|
chmod 600 <foo>
|
既存のファイル "<foo> " を他人から読出し不可かつ書込み不可 (全員実行不可)
|
chmod 644 <foo>
|
既存のファイル "<foo> " を他人からは読出し可だが書込み不可 (全員実行不可)
|
chmod 755 <foo>
|
既存のファイル "<foo> " を他人からは読出し可だが書込み不可 (全員実行可能)
|
find . -name <pattern>
|
シェルで "<pattern> " にマッチするファイル名を探索 (比較的遅い)
|
locate -d . <pattern>
|
シェルで "<pattern> " にマッチするファイル名を探索
(定期的に生成されるデーターベースを使い比較的早い)
|
grep -e "<pattern>" *.html
|
現ディレクトリーにある ".html " で終わる全ファイルから "<pattern>"
のパターンを検索し、該当する全ファイルを表示
|
top
|
フルスクリーンを用いてプロセス情報を表示し、"q " と押して終了
|
ps aux | pager
|
起動中の全プロセスの情報を BSD スタイルの出力を用いて表示 |
ps -ef | pager
|
起動中の全プロセスの情報を System-V スタイルの出力を用いて表示 |
ps aux | grep -e "[e]xim4*"
|
"exim " もしくは "exim4 " の起動中の全プロセスを表示
|
ps axf | pager
|
起動中の全プロセスの情報を ASCII アート出力を用いて表示 |
kill <1234>
|
プロセス ID"<1234>" により識別されるプロセスを停止 |
gzip <foo>
|
Lempel-Ziv コーディング (LZ77) を用いて "<foo> " を圧縮し
"<foo>.gz " を作成
|
gunzip <foo>.gz
|
"<foo>.gz " を解凍して "<foo> "
を作成
|
bzip2 <foo>
|
Burrows-Wheeler ブロックソートテキスト圧縮アルゴリズムと Huffman コーディングを用いて
"<foo> " を圧縮し "<foo>.bz2 "
を作成 (gzip より高圧縮率)
|
bunzip2 <foo>.bz2
|
"<foo>.bz2 " を解凍して "<foo> "
を作成
|
xz <foo>
|
Lempel–Ziv–Markov鎖アルゴリズムを用いて "<foo> " を圧縮し
"<foo>.xz " を作成 (bzip2 より高圧縮率)
|
unxz <foo>.xz
|
"<foo>.xz " を解凍して "<foo> "
を作成
|
tar -xvf <foo>.tar
|
"<foo>.tar " アーカイブからファイルを展開
|
tar -xvzf <foo>.tar.gz
|
gzip 圧縮された "<foo>.tar.gz " アーカイブからファイルを展開
|
tar -xvjf <foo>.tar.bz2
|
"<foo>.tar.bz2 " アーカイブからファイルを展開
|
tar -xvJf <foo>.tar.xz
|
"<foo>.tar.xz " アーカイブからファイルを展開
|
tar -cvf <foo>.tar <bar>/
|
フォルダ "<bar>/ " の内容を
"<foo>.tar " アーカイブにアーカイブ
|
tar -cvzf <foo>.tar.gz <bar>/
|
フォルダ "<bar>/ " の内容を
"<foo>.tar.gz " アーカイブに圧縮アーカイブ
|
tar -cvjf <foo>.tar.bz2 <bar>/
|
フォルダ "<bar>/ " の内容を
"<foo>.tar.bz2 " アーカイブに圧縮アーカイブ
|
tar -cvJf <foo>.tar.xz <bar>/
|
フォルダ "<bar>/ " の内容を
"<foo>.tar.xz " アーカイブに圧縮アーカイブ
|
zcat README.gz | pager
|
標準のページャーを用いて圧縮された "README.gz " の内容を表示
|
zcat README.gz > foo
|
"README.gz " の内容を解凍してファイル "foo " を作成
|
zcat README.gz >> foo
|
圧縮された "README.gz " の内容をファイル "foo "
の末尾に追加 (ファイルが存在しない場合は事前に作成)
|
Unix は ".
"
で始まるファイル名を隠す伝統があります。それらは伝統的には特定の設定情報やユーザーの嗜好を含むファイルです。
cd
コマンドに関しては builtins
(7) を参照下さい。
最小限の Debian システムのデフォールトのページャーは more
(1)
で、スクロールバックができません。less
パッケージを "apt-get install
less
" と言うコマンドラインでインストールすると、less
(1) が
デフォールトのページャーになりカーソールキーでスクロールバック出来るようになります。
上記の "ps aux | grep -e "[e]xim4*"
" コマンド中に現れる正規表現中の
"[
" と "]
" は grep
が自分自身にマッチするのを避けることを可能とします。正規表現中の "4*
" は数字
"4
" の0回以上の繰り返しを意味するので、grep
が
"exim
" と "exim4
" の両方にマッチすることが可能になります。
"*
"
はシェルのファイルネームのグロブでも正規表現ででも使われますが、これらの意味は異なります。grep
(1)
から正規表現を学びましょう。
上記のコマンドを訓練として用いて、ディレクトリーを渡り歩き、システムの中を覗き込んで下さい。コンソールのコマンドに関して質問がある場合は、必ずマニュアルページを読んでみて下さい。
例えば、次を試してみて下さい:
$ man man $ man bash $ man builtins $ man grep $ man ls
マンページのスタイルは慣れるのに少々大変かもしれません。なぜなら特に比較的旧式の非常に伝統的なマンページは比較的言葉が少ないからです。しかし一旦慣れるとその簡潔さの良さが分かります。
GNU や BSD 由来を含む多くの Unix 的なコマンドは次のように (場合によっては一切の引数無しで) 起動すると簡単なヘルプ情報を表示します。
$ <コマンド名> --help $ <コマンド名> -h
Debian システムの使い方が少し分かったでしょう。Debian
システム上でのコマンド実行のメカニズムを掘り下げます。初心者のためにちょっと簡略化してみました。正確な説明は
bash
(1) を参照下さい。
シンプルなコマンドは、次の要素のシーケンスとなります。
>
と >>
と
<
と <<
等。)
&&
と ||
と
<改行> と ;
と &
と
(
と )
)
環境変数の値は Unix コマンドの挙動を変えます。
環境変数のデフォールト値は PAM システムが初期設定されます。その後次のような何らかのアプリケーションプログラムにより再設定されているかもしれません。
gdm
のようなディスプレーマネージャーは環境変数を再設定します。
~/bash_profile
" や "~/.bashrc
"
にあるシェル起動コードの中でシェルは環境変数を再設定します。
"$LANG
" 変数に与えられる完全なロケール値は3つの部分からなります:
"xx_YY.ZZZZ
"。
表1.17 ロケールの値の3つの部分
ロケールの値 | 意味 |
---|---|
xx
|
ISO 639 言語コード (小文字)、例えば "en" |
YY
|
ISO 3166 国コード (大文字)、例えば "US" |
ZZZZ
|
コードセット、常に "UTF-8" と設定 |
言語コードと国コードは "info gettext
" 中の該当記述を参照下さい。
現代的な Debian システム上では、十分な理由と必要な知見をもって歴史的なコードセットを特段希望しない限り、常にコードセットを UTF-8
と設定すべきです。
ロケールの詳細に関しては、「ロケール」を参照下さい。
"LANG=en_US
" は、"LANG=C
"
でも、"LANG=en_US.UTF-8
" でもありません。それは
"LANG=en_US.ISO-8859-1
" です (「符号化方式の基本」参照)。
表1.18 推奨ロケールのリスト
推奨ロケール | 言語 (地域) |
---|---|
en_US.UTF-8
|
英語 (米国) |
en_GB.UTF-8
|
英語 (英国) |
fr_FR.UTF-8
|
フランス語 (フランス) |
de_DE.UTF-8
|
ドイツ語 (ドイツ) |
it_IT.UTF-8
|
イタリア語 (イタリア) |
es_ES.UTF-8
|
スペイン語 (スペイン) |
ca_ES.UTF-8
|
カタラン語 (スペイン) |
sv_SE.UTF-8
|
スウェーデン語 (スウェーデン) |
pt_BR.UTF-8
|
ポルトガル語 (ブラジル) |
ru_RU.UTF-8
|
ロシア語 (ロシア) |
zh_CN.UTF-8
|
中国語 (中華人民共和国) |
zh_TW.UTF-8
|
中国語 (台湾_R.O.C.) |
ja_JP.UTF-8
|
日本語 (日本) |
ko_KR.UTF-8
|
韓国語 (大韓民国) |
vi_VN.UTF-8
|
ベトナム語 (ベトナム) |
典型的なコマンドの実行は次のようなシェルの行シーケンスを用います。
$ date Sun Jun 3 10:27:39 JST 2007 $ LANG=fr_FR.UTF-8 date dimanche 3 juin 2007, 10:27:33 (UTC+0900)
以上で、date
(1) プログラムは異なる環境変数 "$LANG
"
値で実行されます。
ほとんどのコマンド実行は頭に環境変数定義をつけないのが普通です。上記の例の代わりに次のように実行します。
$ LANG=fr_FR.UTF-8 $ date dimanche 3 juin 2007, 10:27:33 (UTC+0900)
ここで確認できるように、コマンドの出力は環境変数に影響されフランス語の出力となっています。もし環境変数を (例えばシェルスクリプトを呼んでいて) サブプロセスに引き継ぎたい際には、次のように環境変数を export (エクスポート) しなければいけません。
$ export LANG
バグ報告をする際には、非英語環境を使っているなら、プログラムを "LANG=en_US.UTF-8
"
の下で実行し確認することが望ましいです。
"$LANG
" とこれに関連した環境変数に関しては、locale
(5) と
locale
(7) を参照下さい。
特段必要がなければ "$LC_*
" 変数を避けて、"$LANG
"
変数のみを用いてシステム環境設定する事をお薦めします。
シェルにコマンドを打ち込んだ際に、シェルは "$PATH
"
環境変数にリストされたディレクトリーのリストから検索します。"$PATH
"
環境変数の値は、シェルの検索パスとも呼ばれます。
標準の Debian インストールでは、ユーザーアカウントの "$PATH
" 環境変数には
"/sbin
" や "/usr/sbin
"
が含まれないかもしれません。例えば、ifconfig
コマンドは
"/sbin/ifconfig
" とフルパスを使って実行する必要があります。(類似の
ip
コマンドは "/bin
" にあります。)
Bash シェルの "$PATH
"
環境変数は、"~/.bash_profile
" か "~/.bashrc
"
ファイルで変更できます。
多くのコマンドはユーザー特定の設定をホームディレクトリーに保存し、その内容でコマンドの挙動が変わります。ホームディレクトリーは
"$HOME
" 環境変数で指定されます。
表1.19 "$HOME
" の値のリスト
"$HOME " の値
|
プログラム実行状況 |
---|---|
/
|
init プロセスが実行するプログラム (デーモン) |
/root
|
通常の root シェルから実行されるプログラム |
/home/<normal_user>
|
通常のユーザーシェルから実行されるプログラム |
/home/<normal_user>
|
通常のユーザーの GUI デスクトップメニューから実行されるプログラム |
/home/<normal_user>
|
"sudo program " を用いて root として実行されるプログラム
|
/root
|
"sudo -H program " を用いて root として実行されるプログラム
|
シェルは、"~/
" を現ユーザーのホームディレクトリーである
"$HOME/
" へと展開します。シェルは、"~foo/
" をユーザー
foo
のホームディレクトリーである "/home/foo/
"
へと展開します。
プログラムコマンドによっては引数があります。引数は "-
" か "--
"
で始まり、オプションと呼ばれ、コマンドの挙動をコントロールします。
$ date Mon Oct 27 23:02:09 CET 2003 $ date -R Mon, 27 Oct 2003 23:02:40 +0100
上記で、コマンドライン引数 "-R
" が date
(1) の挙動を
RFC2822 準拠の日付文字列出力と変えています。
ファイル名を全てタイプせずにファイルのグループをコマンド処理したいことがよくあります。シェルのグロブ (ワイルドカードとも時々呼ばれる) を用いたファイル名のパターン展開を用いるとこのニーズに答えられます。
表1.20 シェルグロブパターン
シェルグロブパターン | マッチルールの説明 |
---|---|
*
|
". " で始まらないファイル (部分) 名
|
.*
|
". " で始まるファイル (部分) 名
|
?
|
1文字 |
[…]
|
括弧中の1文字 |
[a-z]
|
"a " と "z " の範囲間の1文字
|
[^…]
|
括弧内 ("^ " 以外) に含まれる文字以外の1文字
|
例えば、次を試してみて下さい:
$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt $ echo *.txt 1.txt 2.txt $ echo * 1.txt 2.txt 3.c 4.h $ echo *.[hc] 3.c 4.h $ echo .* . .. .5.txt ..6.txt $ echo .*[^.]* .5.txt ..6.txt $ echo [^1-3]* 4.h $ cd ..; rm -rf junk
glob
(7) を参照下さい。
通常のシェルのファイル名の展開と違い、find
(1) が "-name
"
テスト他でシェルパターン "*
" をテストする際にはファイル名先頭の ".
"
ともマッチします。(新 POSIX 機能)
BASH は shopt 組み込みオプションで "dotglob
" や
"noglob
" や "nocaseglob
" や
"nullglob
" や "nocaseglob
" や
"extglob
"
などとすることでグロブ挙動を色々変更できます。bash
(1) を参照下さい。
各コマンドは終了ステータスを戻り値 (変数: "$?
") として返します。
例えば、次を試してみて下さい。
$ [ 1 = 1 ] ; echo $? 0 $ [ 1 = 2 ] ; echo $? 1
シェルの論理的な観点では、成功は、0 (ゼロ) の値を持つ論理的真として扱われることに注意して下さい。少々これは非直感的なのでここで再確認する必要があります。
次に挙げるシェルコマンドの一部として一行でタイプするシェルコマンドの慣用句を覚えましょう。
表1.22 シェルコマンドの慣用句
コマンドの慣用句 | 説明 |
---|---|
command &
|
command をサブシェル中でバックグラウンド実行
|
command1 | command2
|
command1 の標準出力を command2 の標準入力に
パイプ (同時並行で実行)
|
command1 2>&1 | command2
|
command1 の標準出力と標準エラー出力を command2
の標準入力にパイプ (同時進行で実行)
|
command1 ; command2
|
command1 を実行し、後に続いて
command2 を実行
|
command1 && command2
|
command1 を実行; もし成功したら、 後に続いて
command2 を実行 (command1
と command2
の両方が成功したら、正常終了を返す)
|
command1 || command2
|
command1 を実行; もし成功しなかったら、後に続いて command2 を実行
(command1 か
command2 のどちらかが成功したら、正常終了を返す)
|
command > foo
|
command の標準出力を foo ファイルにリダイレクト (上書き)
|
command 2> foo
|
command の標準エラー出力を foo ファイルにリダイレクト
(上書き)
|
command >> foo
|
command の標準出力を foo ファイルにリダイレクト (追記)
|
command 2>> foo
|
command の標準エラー出力を foo ファイルにリダイレクト (追記)
|
command > foo 2>&1
|
command の標準出力と標準エラー出力を foo ファイルにリダイレクト
|
command < foo
|
command の標準入力を foo ファイルからリダイレクト
|
command << delimiter
|
command の標準入力を "delimiter "
に出会うまでのこれに続く行からリダイレクト (ヒアドキュメント)
|
command <<- delimiter
|
command の標準入力を "delimiter "
に出会うまでのこれに続く行からリダイレクト (ヒアドキュメント、行頭のタブ文字は入力から削除)
|
Debian
システムはマルチタスクシステムです。バックグラウンドジョブを使うと単一シェルの下で複数プログラムを実行可能にします。バックグラウンドジョブの管理にはシェル内部組み込みコマンドの
jobs
や fg
や bg
や
kill
を使います。bash(1) マンページ中の "SIGNALS" と "JOB CONTROL"
セクションや builtins
(1) を参照下さい。
例えば、次を試してみて下さい:
$ </etc/motd pager
$ pager </etc/motd
$ pager /etc/motd
$ cat /etc/motd | pager
4つ全ての例が全く同じ表示をしますが、最後の例は余計な cat
コマンドを実行するので理由なくリソースの無駄遣いをします。
シェルでは exec
組み込みコマンドを任意のファイルディスクリプタとともに使いファイルをオープンすることができます。
$ echo Hello >foo $ exec 3<foo 4>bar # open files $ cat <&3 >&4 # redirect stdin to 3, stdout to 4 $ exec 3<&- 4>&- # close files $ cat bar Hello
上記で、"n<&-
" と
"n>&-
" はファイルディスクリプタ
"n
" をクローズするという意味です。
ファイルデスクリプタの 0-2 は事前定義されています。
良く使うコマンドにエリアスを設定できます。
例えば、次を試してみて下さい:
$ alias la='ls -la'
こうすると、"la
" が "ls -la
"
の短縮形として機能し、全てのファイルを長いリスト形式でリストします。
既存のエリアスは alias
でリストできます (bash
(1) の
"SHELL BUILTIN COMMANDS" 参照)。
$ alias ... alias la='ls -la'
type
内部コマンドを使うと正確なパスやコマンドの正体を識別できます
(bash
(1) の "SHELL BUILTIN COMMANDS" 下参照)。
例えば、次を試してみて下さい:
$ type ls ls is hashed (/bin/ls) $ type la la is aliased to ls -la $ type echo echo is a shell builtin $ type file file is /usr/bin/file
上記で、ls
は最近探索されましたが "file
"
は最近探索されていませので、"ls
" は "ハッシュされた" つまりシェルには
"ls
" コマンドの場所を高速アクセスのために内部記録していると表示されます。
「着色化されたコマンド」を参照下さい。
Unix 的作業環境では、テキスト処理はテキストを標準テキスト処理ツールの連鎖パイプを通す行います。これは決定的な Unix の発明です。
Unix 的システムでしばしば使われる標準テキスト処理ツールがいくつかあります。
正規表現無使用:
cat
(1) はファイルをつなぎ合わせ全てを出力します。
tac
(1) はファイルをつなぎ合わせ逆順で出力します。
cut
(1) は行の一部を選択し出力します。
head
(1) はファイルの最初の部分を選択し出力します。
tail
(1) はファイルの最後の部分を選択し出力します。
sort
(1) は行を順番に並び替えます。
uniq
(1) は順番に並べられたファイルから重複行を削除します。
tr
(1) は文字を変換削除します。
diff
(1) は1行ごとにファイルを比較します。
基本正規表現 (BRE) 使用:
egrep
(1) はテキストのパターンマッチをします。
ed
(1) は原始的な行エディター。
sed
(1) はストリームエディター。
vim
(1) はスクリーンエディター。
emacs
(1) はスクリーンエディター。(ちょっと拡張された BRE)
拡張正規表現 (ERE) 使用:
egrep
(1) はテキストのパターンマッチをします。
awk
(1) は単純なテキスト処理をします。
tcl
(3tcl) は考え得る全てのテキスト処理をします:
re_syntax
(3)。時々 tk
(3tk) とともに使用されます。
perl
(1) は考え得る全てのテキスト処理をします。perlre
(1).
pcregrep
パッケージの pcregrep
(1)
はテキストのパターンマッチを Perl 互換正規表現
(PCRE) パターンを使ってします。
re
モジュールとともに使うことで python
(1)
は考え得る全てのテキスト処理をします。"/usr/share/doc/python/html/index.html
"
を参照下さい。
もしこれらのコマンドが正確にどう動作するかを確認したいなら、"man command
"
を使って自分で見つけましょう。
ソート順や範囲表現はロケールに依存します。コマンドの伝統的挙動を得たい際には、"LANG=C
"
をコマンドの前に付けて UTF-8 ロケールではなく C ロケールでコマンドを使います。(「"$LANG
" 変数」と「ロケール」を参照)。
Perl 正規表現 (perlre
(1)) と
Perl 互換正規表現 (PCRE) と
re
モジュールで提供される Python 正規表現は
ERE に多くの共通の拡張をしています。
正規表現は多くのテキスト処理ツールで使われています。シェルグロブに類似していますがより複雑で強力です。
正規表現はマッチするパターンを表現し、テキスト文字とメタ文字からなっています。
メタ文字は特別な意味を持った文字です。上記のようにテキストツールによって、BRE と ERE の2つの主要なスタイルがあります。
表1.24 BRE と ERE のメタ文字
BRE | ERE | 正規表現の説明 |
---|---|---|
\ . [ ] ^ $ *
|
\ . [ ] ^ $ *
|
共通のメタ文字 |
\+ \? \( \) \{ \} \|
|
"\ " でエスケープされた、BRE のみで用いるメタ文字
|
|
+ ? ( ) { } |
|
"\ " でエスケープされ無い、ERE のみで用いるメタ文字
|
|
c
|
c
|
非メタ文字 "c " にマッチ
|
\c
|
\c
|
c " 自身がメタ文字でも
"c " というそのままの文字とマッチ
|
.
|
.
|
改行を含めた如何なる文字ともマッチ |
^
|
^
|
文字列の最初とマッチ |
$
|
$
|
文字列の最後とマッチ |
\<
|
\<
|
単語先頭とマッチ |
\>
|
\>
|
単語末尾とマッチ |
\[abc…\]
|
[abc…]
|
"abc… " のいずれかの文字にマッチ
|
\[^abc…\]
|
[^abc…]
|
"abc… " 以外の文字にマッチ
|
r*
|
r*
|
"r " という正規表現の0回以上にマッチ
|
r\+
|
r+
|
"r " という正規表現の1回以上にマッチ
|
r\?
|
r?
|
"r " という正規表現の0回か1回にマッチ
|
r1\|r2
|
r1|r2
|
"r1 " か "r2 " という正規表現のいずれかにマッチ
|
\(r1\|r2\)
|
(r1|r2)
|
"r1 " か "r2 "
という正規表現のいずれかにマッチし、それを括弧で囲まれた正規表現と見なす
|
emacs
の正規表現は、ERE 同様の "+
" と
"?
" をメタ文字と扱う拡張をしてはありますが、基本的に BRE です。これら文字を emacs
の正規表現で
"\
" でエスケープする必要はありません。
grep
(1) をつかうと正規表現を使って文字列探索ができます。
例えば、次を試してみて下さい:
$ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE Yoyodyne, Inc., hereby disclaims all copyright interest in the program
「着色化されたコマンド」を参照下さい。
置換式の場合、一部の文字に特別な意味があります
Perl の置換式では、"\n
" の代わりに "$n
"
をつかい、"&
" には特段の意味はありません。
例えば、次を試してみて下さい:
$ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/' zzz=1abc2efg3hij4= $ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/' zzz=&=
ここで、括弧で囲まれた正規表現のスタイルと、マッチした文字列が異なるツール上でテキスト置換処理にどう使われるかとに注目下さい。
これらの正規表現は一部エディター内でカーソールの動きやテキスト置換アクションに対しても使えます。
シェルコマンドラインの行末のバックスラッシュ "\
"
は改行をホワイトスペース文字としてエスケープするので、シェルコマンドライン入力を次行に継続させます。
これらのコマンドを習うために、関連するマニュアルページを全て読んで下さい。
ed
(1) コマンドは次のようにすると "file
" 中に存在する全ての
"FROM_REGEX
" を "TO_TEXT
" で置換できます。
$ ed file <<EOF ,s/FROM_REGEX/TO_TEXT/g w q EOF
sed
(1) コマンドは次のようにすると "file
" 中に存在する全ての
"FROM_REGEX
" を "TO_TEXT
" で置換できます。
$ sed file 's/FROM_REGEX/TO_TEXT/g' | sponge file
sponge
(8) コマンドは moreutils
パッケージが提供する非標準の Unix ツールです。これはオリジナルファイルの上書きがしたい際に非常に有用です。
vim
(1) コマンドは ex
(1) コマンドを使い次のようにすると
"file
" 中に存在する全ての "FROM_REGEX
" を
"TO_TEXT
" で置換できます。
$ vim '+%s/FROM_REGEX/TO_TEXT/gc' '+w' '+q' file
上記の "c
" フラグをにより各置換毎に対話型の確認をします。
複数ファイル ("file1
" と "file2
" と
"file3
") を vim
(1) や
perl
(1) で同様に正規表現を用いて処理できます。
$ vim '+argdo %s/FROM_REGEX/TO_TEXT/ge|update' '+q' file1 file2 file3
上記の "e
" フラグをにより "No match" エラーでマッピングが停止することを防ぎます。
$ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' file1 file2 file3
perl(1) の例中で、"-i
" はその場での編集、"-p
"
はファイルに関する暗黙的なループを意味します。
"-i
" の代わりに "-i.bak
"
という引数を用いるとオリジナルファイル名に ".bak
"
をつけたファイル名でオリジナルファイルが保管されます。複雑な置換のエラーからの復元が簡単にできます。
ed
(1) や vim
(1) は BRE です。一方、perl
(1) は ERE です。
2004年以前の元 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
最新のDebian のリーダーの歴史に関しては、"A Brief History of Debian" を参照下さい。
Awk はこういったタイプのファイルからデーターを抽出するために良く使われます。
例えば、次を試してみて下さい:
$ awk '{ print $3 }' <DPL # month started August April January January April April March $ awk '($1=="Ian") { print }' <DPL # DPL called Ian Ian Murdock August 1993 Ian Jackson January 1998 $ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started April 1996
Bash などのシェルもこれらのファイルを解釈するのに使えます。
例えば、次を試してみて下さい:
$ while read first last month year; do echo $month done <DPL ... 最初の Awk 例と同じ出力
ここで、read
組込みコマンドは "$IFS
"
(内部フィールドセパレータ) を用いて行を単語単位で分割します。
"$IFS
" を ":
"
に変更すると、"/etc/passwd
" をシェルでうまく解読できます。
$ oldIFS="$IFS" # save old value $ IFS=':' $ while read user password uid gid rest_of_line; do if [ "$user" = "bozo" ]; then echo "$user's ID is $uid" fi done < /etc/passwd bozo's ID is 1000 $ IFS="$oldIFS" # restore old value
(同じことを Awk を使って行うには、フィールドセパレータ設定は "FS=':'
" とします。)
IFS はパラメーター展開、コマンド置換、数式展開の結果を分割するためにもシェルにより使われます。これはダブルクォートやシングルクォートされた単語内では発生しません。IFS の標準値は <space> と <tab> と <newline> の組合せです。
シェルの IFS トリックを注意深く使って下さい。シェルがスクリプトの一部を入力として解釈した場合に、奇妙なことが起きるかもしれません。
$ IFS=":," # use ":" and "," as IFS $ echo IFS=$IFS, IFS="$IFS" # echo is a Bash builtin IFS= , IFS=:, $ date -R # just a command output Sat, 23 Aug 2003 08:30:15 +0200 $ echo $(date -R) # sub shell --> input to main shell Sat 23 Aug 2003 08 30 36 +0200 $ unset IFS # reset IFS to the default $ echo $(date -R) Sat, 23 Aug 2003 08:30:50 +0200
次のスクリプトはパイプの一部として素晴らしいことをします。
表1.26 コマンドをパイプするためのスクリプト断片
スクリプト断片 (1行入力) | コマンドの効果 |
---|---|
find /usr -print
|
"/usr " の下の全ファイル発見
|
seq 1 100
|
1から100までプリント |
| xargs -n 1 <command>
|
パイプからの各項目を引数としてコマンドを反復実行 |
| xargs -n 1 echo
|
パイプからのホワイトスペースで分離された項目を行に分割 |
| xargs echo
|
パイプからの全ての行を1行にマージ |
| grep -e <regex_pattern>
|
<regex_pattern> を含む行を抽出 |
| grep -v -e <regex_pattern>
|
<regex_pattern> を含まない行を抽出 |
| cut -d: -f3 -
|
": " で区切られた3番目のフィールドを抽出 (passwd ファイルなど)
|
| awk '{ print $3 }'
|
ホワイトスペースで区切られた3番目のフィールドを抽出 |
| awk -F'\t' '{ print $3 }'
|
タブで区切られた3番目のフィールドを抽出 |
| col -bx
|
バックスペースを削除し、タブをスベースに変換 |
| expand -
|
タブをスベースに変換 |
| sort| uniq
|
入力をソートし重複箇所を削除 |
| tr 'A-Z' 'a-z'
|
大文字を小文字に変換 |
| tr -d '\n'
|
複数行を1行に連結 |
| tr -d '\r'
|
キャリッジリターンを削除 |
| sed 's/^/# /'
|
各行頭に "# " を追加
|
| sed 's/\.ext//g'
|
".ext " を削除
|
| sed -n -e 2p
|
2番目の行を表示 |
| head -n 2 -
|
最初の2行を表示 |
| tail -n 2 -
|
最後の2行を表示 |
1行のシェルスクリプトは find
(1) や xargs
(1)
を使って非常に複雑な操作を多くのファイルに繰り返し実行できます。「ファイル選択の慣用句」と「ファイルに関してループしながらコマンドを反復実行」を参照下さい。
シェルの対話モードを使うのが複雑過ぎるようになったときには、シェルのスクリプトを書くのも一計です (「シェルスクリプト」参照)。
本章は最新安定版リリースがコード名: squeeze
と言う前提で書かれています。
Debian は、フリーソフトウエアーのコンパイル済みバイナリーパッケージからなる整合性あるディストリビューションを作り、そのアーカイブを通じてそれらを頒布するボランティア組織です。
Debian のアーカイブは、HTTP や FTP 法によるアクセスされるための多くのリモートのミラーサイトとして提供されています。それは、CD-ROM/DVD によっても提供されています。
Debian のパッケージ管理システムは、適正に使われれば、バイナリーパッケージの整合性ある組み合わせがアーカイブからシステムにインストールされるようになっています。現在、amd64 アーキテクチャーには 30552 つのパッケージがあります。
Debian のパッケージ管理システムは、多彩な歴史があり、使用されるフロントエンドのユーザープログラムやバックエンドのアーカイブへのアクセス方法に多くの選択肢があります。現在は以下を推薦します。
apt-get
(8)。
update-manager
(8)。
表2.1 Debian のパッケージ管理ツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
apt
*
|
V:90, I:99 | 5600 |
アドバンスドパッケージツール (APT)、"http " や "ftp " や
"file " というアーカイブへのアクセス方法を dpkg
に提供するフロントエンド (apt-get /apt-cache
コマンドを含む)
|
aptitude *
|
V:25, I:98 | 11916 |
aptitude (8) を使うインタラクティブなターミナルベースのパッケージマネージャー
|
update-manager-gnome *
|
V:7, I:10 | 1221 |
update-manager (8) を使ってソフトウエアーの更新を管理する GNOME のアプリケーション
|
tasksel *
|
V:5, I:93 | 904 | Debian システムにタスクをインストールするための選択ツール (APT のフロントエンド) |
unattended-upgrades *
|
V:4, I:31 | 280 | セキュリティーアップデートの自動インストールを可能にする APT の拡張パッケージ |
dselect *
|
V:2, I:30 | 2404 | ターミナルベースのパッケージマネージャー (過去の標準、APT や他の旧式のアクセス法のフロントエンド) |
dpkg
*
|
V:92, I:99 | 6804 | Debian のためのパッケージ管理システム |
synaptic *
|
V:13, I:40 | 6464 | グラフィカルなパッケージマネージャー (APT の GNOME フロントエンド) |
apt-utils *
|
V:51, I:99 | 516 |
APT ユーティリティープログラム: apt-extracttemplates (1) と
apt-ftparchive (1) と apt-sortpkgs (1)
|
apt-listchanges *
|
V:11, I:17 | 280 | パッケージ変更履歴の通知ツール |
apt-listbugs *
|
V:1.4, I:2 | 508 | APT による各インストール前にクリチカルバグをリストする |
apt-file *
|
V:2, I:9 | 188 | APT パッケージ探索ユーティリティー -- コマンドラインインターフェース |
apt-rdepends *
|
V:0.13, I:0.9 | 92 | パッケージの依存関係を再帰的にリスト |
Debian システム上でのパッケージ設定の要点を次に記します。
debconf
(7)
と呼ばれる標準化されたユーザーインターフェースを使用し、それぞれ毎の設定スクリプトとともに提供されます。
ランダムな混合のスイーツからパッケージをインストールしてはいけません。コンパイラーの ABI とかライブラリー のバージョンとかインタープリターの機能等のシステム管理に関する深い知見が必要なパッケージの整合性がきっと破壊されます。
初心者の Debian システム管理者は Debian の安定版 stable
リリースをセキュリティーアップデートを適用しながら使うべきです。Debian
システムを非常によく理解するまでは、用心として次の有効なアクションですら避けておくべきと考えます。次は留意点です。
/etc/apt/sources.list
" の中にテスト版
testing
とか不安定版 unstable
とかを含めません。
/etc/apt/sources.list
" の中に標準の Debian と Debian 以外の Ubuntu
のようなアーカイブを混在させません。
/etc/apt/preferences
" を作成しません。
dpkg -i <random_package>
" でインストールしません。
dpkg --force-all -i <random_package>
"
で絶対インストールしません。
/var/lib/dpkg/
" の中のファイルを消去や改変しません。
ソースから直接コンパイルしたソフトウエアープログラムをインストールする際にシステムファイルを上書きしません。
/usr/local/
" か "/opt/
"
中にインストールします。
上記のアクションで起きる Debian パッケージシステムへのコンパチブルでない効果はシステムを使えなくするかもしれません。
ミッションクリティカルなサーバーを走らせる真剣な Debian システム管理者は更なる用心をすべきです。
安全な条件下であなたの特定の設定で徹底的にテストすることなくセキュリティーアップデートをも含めた如何なるパッケージもインストールをしてはいけません。
私が上記で警告したとはいえ、自分自身で管理するデスクトップ環境では Debian
のテスト版 testing
や不安定版 unstable
のスイーツを自分のメインのシステムとして使おうと多くの本書の読者が望むことは分かっています。システムは非常に快調に動くし、頻繁に更新されるし、最新の機能が提供されるからです。
あなたの業務サーバーには、セキュリティーアップデートをした安定版
stable
スイーツを推薦します。例えばあなたの母親の PC
のように、管理に限られた時間しか割けないデスクトップ PC に関しても同様の事が言えます。
"/etc/apt/sources.list
"
の中のディストリビューション文字列を、"testing
" とか
"unstable
" というスイーツ名、もしくは
"wheezy
とか
"sid
" というコード名に単に設定するだけで十分です。
testing
や unstable
を使うことは大変楽しいけれど、リスクがついてきます。Debian システムの
unstable
スイーツさえおおむね非常に安定に見えますが、Debian システムの
testing
や unstable
スイーツでは過去パッケージ上の問題をいくつか経験して来てるし、その一部は簡単には解決できないものでした。結構痛い目に会うことになるかもしれませんよ。時々、壊れたパッケージや機能の欠損が数週間続くことが起こります。
Debian パッケージのバグからの早急かつ簡単な復元を確実にするいくつかのアイデアがここにあります。
stable
スイーツを別のパーティションにインストールし、システムをヂュアルブータブル化
apt-listbugs
をインストールしてアップグレードの前に Debian バグトラッキングシステム (BTS)
をチェックを考慮
(これらの用心のための方策の何れもできないなら、テスト版 testing
や不安定版
unstable
スイーツを使うのにはあなたはきっと準備不足です。)
以下に記すことにより悟りを開けば、アップグレード地獄という果てしない因果応報の葛藤から人は解脱し、Debian の涅槃の境地に到達できます。
Debian アーカイブをシステムユーザーの視点から見てみます。
Debian アーカイブの正式のポリシーは Debian ポリシーマニュアル、第2章 - Debian アーカイブに規定されています。
典型的な HTTP アクセスの場合、現在の安定版
stable
=squeeze
システムを例にとると、次の様に "/etc/apt/sources.list
"
ファイルの中にアーカイブは規定されています。
deb http://ftp.XX.debian.org/debian/ squeeze main contrib non-free deb-src http://ftp.XX.debian.org/debian/ squeeze main contrib non-free deb http://security.debian.org/ squeeze/updates main contrib deb-src http://security.debian.org/ squeeze/updates main contrib
"ftp.XX.debian.org
" はあなたの所在場所に合う、Debian
の全世界ミラーサイトリスト中に見つかるミラーサイトの URL、例えば日本なら
"ftp.jp.debian.org
"、に置き換えなければいけません。これらのサーバーの状況は Debian ミラー確認サイトで確認できます。
上記で、次の安定版 stable
がリリースされて驚かされ無いように、私はスイート名の
"stable
" でなくコード名の "squeeze
"
を使います。
"/etc/apt/sources.list
" の意味は
sources.list
(5) に記載されていて、要点は以下です。
deb
" 行がバイナリーパッケージのための定義です。
deb-src
" 行がソースパッケージのための定義です。
ソース関連のメタデーターにアクセスしない aptitude
のためだけなら
"deb-src
" 行は安全に省略 (もしくは "#" を行頭に挿入してコメントアウト)
することができます。こうするとアーカイブのメタデーターの更新速度が向上します。URL は "http://
" や
"ftp://
" や "file://
" 等々の何れも可能です。
もし上記の例で "squeeze
" ではなく "sid
"
が使われる場合には、セキュリティーアップデートのための "deb: http://security.debian.org/
...
" 行は不要です。安定版 stable
とテスト版
testing
(即ち squeeze
と
wheezy
) にのみセキュリティーアップデートがあります。
"sid
" (不安定版 unstable
)
のためにはセキュリティーアップデートのアーカイブが存在しません。
次は設定ファイル内に用いられる Debian アーカイブサイトの URL とスイーツ名もしくはコード名です。
表2.2 Debian アーカイブサイトのリスト
アーカイブの URL | スイート名 (コード名) | 目的 |
---|---|---|
http://ftp.XX.debian.org/debian/ |
stable (squeeze )
|
安定版 (squeeze) のリリース |
http://ftp.XX.debian.org/debian/ |
testing (wheezy )
|
テスト版 (wheezy) のリリース |
http://ftp.XX.debian.org/debian/ |
unstable (sid )
|
不安定版 (sid) のリリース |
http://ftp.XX.debian.org/debian/ |
experimental
|
実験的プリリリース (任意、開発者専用) |
http://ftp.XX.debian.org/debian/ |
stable-proposed-updates
|
次回安定版ポイントリリース用のアップデート (任意) |
http://security.debian.org/ |
stable/updates
|
安定版用のセキュリティーアップデート (重要) |
http://security.debian.org/ |
testing/updates
|
テスト版用のセキュリティーアップデート (重要) |
http://ftp.XX.debian.org/debian/ |
squeeze-updates
|
squeeze のためのスパムフィルターや IM クライアント他用のコンパチブルなアップデート |
http://backports.debian.org/debian-backports/ |
squeeze-backports
|
squeeze のためのバックポートされたパッケージ (任意) |
セキュリティーアップデートされた純粋な安定版 stable
リリースのみが最善の安定性を提供します。一部
testing
や unstable
由来のパッケージを混用してほとんど
stable
リリースを走らせることは、純粋な unstable
リリースを走らせるよりリスクがあります。stable
リリースの下で最新バージョンのいくつかのプログラムが本当に必要なら、squeeze-updates や backports.debian.org (「Updates と Backports」参照)
サービスからのパッケージを使って下さい。これらのサービスは細心の注意を持って使う必要があります。
基本的に、stable
か testing
か
unstable
のスイーツの内の1つだけを "deb
"
行に書くべきです。もし、stable
と testing
と
unstable
のスイーツの何らかの組み合わせを "deb
"
行に書けば、APT
プログラムは、最新のアーカイブのみが有効であるにもかかわらず、実行速度が低下します。"/etc/apt/preferences
"
ファイルがはっきりとした目的を持って使われている場合 (「候補バージョンの調整」)
のみ複数のリストに意味があります。
stable
や testing
スイーツの Debian
システムでは、上記の例のようにセキュリティーアップデートを有効とするように
"/etc/apt/sources.list
" の中に
"http://security.debian.org/
" の行を含めることはいいことです。
stable
アーカイブのセキュリティーバグは Debian
のセキュリティーチームにより修正されます。本活動は非常に厳格で信頼できるものです。testing
アーカイブのセキュリティーバグは Debian の testing セキュリティーチームにより修正されます。諸所の 事情で、本活動は
stable
ほどは厳格ではなく、修正された unstable
パッケージの移行を待つ必要があるかもしれません。unstable
アーカイブのセキュリティーバグは個別のメンテナにより修正されます。活発にメンテされている unstable
パッケージはアップストリームのセキュリティー修正を使うことで通常比較的良い状態です。Debian がセキュリティーバグへ如何に対応するかに関しては
Debian security FAQ を参照下さい。
表2.3 Debian アーカイブエリアのリスト
エリア | パッケージ数 | パッケージ構成要素のクライテリア |
---|---|---|
main
|
29887 |
DSFG に完全準拠し、non-free のパッケージに非依存 (main = 主要)
|
contrib
|
202 |
DSFG に完全準拠だが、non-free のパッケージに依存有り (contrib = 寄与)
|
non-free
|
463 | 非 DSFG 準拠 |
ここで、上記にあるパッケージ数は amd64 アーキテクチャーに関する数字です。厳密に言うなら、main
エリアのアーカイブのみを Debian システムと考えるべきです。
Debian アーカイブの構成は、各アーカイブの URL の後ろに dists
か
pool
をつけた URL にブラウザーを向ければ学習できます。
ディストリビューションは、スイーツとコード名の2つの方法で言及されます。この他にディストリビューションと言う言葉は多くの文書でスイーツの同義語としても使われています。スイーツとコード名の関係は次のようにまとめられます。
表2.4 スイーツとコード名の関係
タイミング |
スイーツ = 安定版 stable
|
スイーツ = テスト版 testing
|
スイーツ = 不安定版 unstable
|
---|---|---|---|
squeeze リリース後
|
コード名 = squeeze
|
コード名 = wheezy
|
コード名 = sid
|
wheezy リリース後
|
コード名 = wheezy
|
コード名 = wheezy+1
|
コード名 = sid
|
コード名の歴史は、Debian FAQ: 6.3.1 Which other codenames have been used in the past? に記載されています。
比較的厳格な Debian アーカイブの用語法では、"セクション" という言葉はアプリケーションの分野によるパッケージ分類に特化して使われます。(しかし、"main セクション" という言葉は main エリアを提供する Debian アーカイブ部分を表現するのにしばしば使われています。)
Debian デベロッパー (DD) が不安定版 unstable
アーカイブに新たなアップロードを
(incoming での処理を経由して)
する度毎に、アップロードするパッケージが最新の不安定版 unstable
アーカイブの最新のパッケージ集合とコンパチブルであるようにする義務が DD にはあります。
重要なライブラリーのアップグレード他の理由で DD がこのコンパチビリティーを壊す際には、debian-devel のメーリングリスト他に通常アナウンスがされます。
Debian のアーカイブ管理スクリプトによって非安定版 unstable
アーカイブからテスト版
testing
アーカイブへパッケージ集合が移動される前に、アーカイブ管理スクリプトはパッケージの成熟度
(約10日経過) と RC バグレポート状況を確認するばかりでなく、テスト版 testing
アーカイブの最新パッケージ集合とのコンパチブルであるようにするように努めます。このプロセスがあるので、テスト版
testing
アーカイブは非常に新しくかつ使いやすいのです。
リリースチームによる徐々のアーカイブ凍結過程を通じて、少々の手動の介入を伴いつつテスト版 testing
アーカイブは完全に整合性をもったバグの無い状態へと徐々に熟成されます。そして、古いテスト版 testing
アーカイブのコード名を新たな安定版 stable
アーカイブへと割り当て、新たなコード名を新たなテスト版
testing
アーカイブへと割り当てることで、新たな安定版 stable
がリリースされます。新たなテスト版 testing
アーカイブの当初の内容は、新たにリリースされた安定版
stable
アーカイブとまったく同じです。
不安定版 unstable
もテスト版 testing
アーカイブもともにいくつかの要因で一時的に細かな問題発生があるかもしれません。
unstable
にて)
unstable
にて)
testing
と unstable
の両方にて)。
testing
にて)、等。
もしこれらのアーカイブを使おうと考えるなら、この種の細かな問題の修復や回避は必須技能です。
たとえいつも非安定版 unstable
やテスト版 testing
アーカイブを使っていようとも、ほとんどのデスクトップユーザーは新たな安定版 stable
リリースの後約数ヶ月はセキュリティーアップデートされた安定版 stable
アーカイブを使うべきです。この移行期は、非安定版 unstable
もテスト版
testing
アーカイブの何れももほとんどの人に良いものではありません。非安定版
unstable
アーカイブを使おうとすると、核となるパッケージが大アップグレードの嵐に見舞われるので、あなたのシステムをうまく使える状態に保つのは困難です。テスト版
testing
アーカイブを使おうとしても、安定版 stable
アーカイブとほとんど同じ内容でセキュリティーサポートはありません (Debian testing-security-announce
2008-12)。1ヶ月ほど経てば、非安定版 unstable
アーカイブなら注意を払えば使えるかもしれません。
テスト版 testing
アーカイブを追跡している際には、除去されたパッケージによって引き起こされる問題は該当するバグ修正のためにアップロードされたパッケージを非安定版
unstable
アーカイブからインストールすれば通常回避できます。
アーカイブの定義は、Debian ポリシーマニュアルを参照下さい。
Debian システムはコントロールファイル中のバージョン情報付きのバイナリー依存関係宣言を通して整合性のあるバイナリーパッケージの集合を提供します。ここにその少々簡素化し過ぎの定義を示します。
"Depends"
"Pre-Depends"
"Recommends"
"Suggests"
"Enhances"
"Breaks"
"Conflicts"
"Replaces"
"Provides"
正常な設定として "Provides" と "Conflicts" と "Replaces" とを単一バーチャルパッケージに対し同時宣言することがあります。こうするといかなる時にも当該バーチャルパッケージを提供する実パッケージのうち確実に一つだけがインストールされます。
ソースの依存関係をも含む正式の定義は the Policy Manual: Chapter 7 - Declaring relationships between packages にあります。
パッケージ管理の簡略化されたイベントの流れをまとめると次のようになります。
更新 ("aptitude update
"
か "apt-get update
"):
アップグレード ("aptitude
safe-upgrade
" と "aptitude full-upgrade
"
か、"apt-get upgrade
" と "apt-get
dist-upgrade
"):
インストール ("aptitude install
...
" か "apt-get install ...
"):
削除 ("aptitude remove
...
" か "apt-get remove ...
"):
完全削除 ("aptitude purge
...
" か "apt-get purge ...
"):
上記では全体像の理解のためにわざと技術詳細を端折っています。
内容が正確な正式文書を読むように心がけるべきです。まず Debian に特定のことが記載された
"/usr/share/doc/<package_name>/README.Debian
"
を最初に読むべきです。また "/usr/share/doc/<package_name>/
"
の中にある他の文書も参照すべきです。「Bash のカスタム化」に書かれたようなシェル設定がされていれば、次のようにタイプして下さい。
$ cd <package_name> $ pager README.Debian $ mc
さらに詳しい情報を得るには "-doc
"
というサフィクスを持った対応する文書パッケージをインストールする必要があるかもしれません。
特定パッケージに関する問題に出会った際には、Debian バグトラッキングシステム (BTS) サイトを必ず確認します。
表2.5 特定パッケージの問題解決のためのキーとなるウェッブサイトのリスト
ウェッブサイト | コマンド |
---|---|
Debian バグトラッキングシステム (BTS) のホームページ |
sensible-browser "http://bugs.debian.org/"
|
既知のパッケージに関するバグレポート |
sensible-browser
"http://bugs.debian.org/<package_name>"
|
既知のバグ番号に関するバグレポート |
sensible-browser
"http://bugs.debian.org/<bug_number>"
|
"site:debian.org
" や
"site:wiki.debian.org
" や
"site:lists.debian.org
" 等を含む検索語で Google を検索します。
バグ報告をする際には、reportbug
(1) コマンドを使います。
Debian システム上での基本的なパッケージ管理は Debian
システム上にあるどのパッケージ管理ツールを使ってもできます。ここでは、apt-get
/
apt-cache
や aptitude
といった基本的なパッケージ管理ツールを説明します。
パッケージをインストールしたりパッケージのメタデーターを更新するようなパッケージ管理操作には root 権限が必要です。
apt-get
や apt-cache
コマンドは最も基本的なパッケージ管理ツールです。
apt-get
/apt-cache
はコマンドラインのユーザーインターフェースのみを提供します。
apt-get
はリリース間のような大掛かりなシステムアップグレードに最適です。
apt-get
は共通のパッケージ状態データーを使う頑強で安定なパッケージリゾルバーを提供します。
apt-get
は推薦パッケージの自動インストールと自動削除をサポートするように更新されています。
apt-get
はパッケージ活動のログをサポートするように更新されています。
apt-cache
はパッケージ名や説明に関して標準の regex を使った検索機能を提供します。
apt-get
と apt-cache
は
/etc/apt/preferences
を使って複数のバージョンのパッケージを管理できますが、それはとても面倒です。
aptitude
コマンドは最も多芸なパッケージ管理ツールです。
aptitude
はフルスクリーンのインタラクティブなテキストユーザーインターフェースを提供します。
aptitude
はコマンドラインのユーザーインターフェースも提供します。
aptitude
はインストールされたパッケージを検査したり入手可能なパッケージを探索したりするような日常のインタラクティブなパッケージ管理に最適です。
aptitude
は aptitude
のみにより使われる追加のパッケージ状態データーもまた使う拡張パッケージリゾルバーを提供します。
aptitude
は推薦パッケージの自動インストールや自動削除をサポートします。
aptitude
はパッケージ活動のログをサポートします。
aptitude
はパッケージメタデータ全てに関する拡張されたregex を使った探索を提供します。
aptitude
は /etc/apt/preferences
を使わずに複数のバージョンのパッケージを管理できますし、それは非常に直感的です。
aptitude
コマンドはその拡張されたパッケージリゾルバーのような豊富なフィーチャーとともに提供されますが、この複雑さは Bug #411123 や Bug
#514930 や Bug #570377
のようないくつかのリグレッションを引き起こしました
(また起こしているかもしれません)。疑いのある場合には、aptitude
コマンドに代えて
apt-get
や apt-cache
コマンドを使ってください。
aptitude
(8) や apt-get
(8)
/apt-cache
(8) を使うコマンドラインによるパッケージ管理操作を次に記します。
表2.6 aptitude
(8) や apt-get
(8)
/apt-cache
(8) を使うコマンドラインによる基本パッケージ管理操作
aptitude シンタックス
|
apt-get /apt-cache シンタックス
|
説明 |
---|---|---|
aptitude update
|
apt-get update
|
パッケージアーカイブメタデーター更新 |
aptitude install foo
|
apt-get install foo
|
"foo " パッケージの候補バージョンをその依存関係とともにインストール
|
aptitude safe-upgrade
|
apt-get upgrade
|
他のパッケージを削除すること無くインストール済みパッケージの候補バージョンをインストール |
aptitude full-upgrade
|
apt-get dist-upgrade <パッケージ>
|
必要なら他のパッケージを削除しながらインストール済みパッケージの候補バージョンをインストール |
aptitude remove foo
|
apt-get remove foo
|
設定ファイルを残したまま "foo " パッケージを削除
|
N/A |
apt-get autoremove
|
既に必要なくなっている自動済みパッケージを削除 |
aptitude purge foo
|
apt-get purge foo
|
設定ファイルを含めて "foo " パッケージを完全削除
|
aptitude clean
|
apt-get clean
|
収集されローカルに貯蔵されたパッケージファイルを完全消去 |
aptitude autoclean
|
apt-get autoclean
|
収集されローカルに貯蔵されたパッケージファイルのうち古くなったパッケージを消去 |
aptitude show foo
|
apt-cache show <パッケージ>
|
"foo "パッケージに関する詳細情報を表示
|
aptitude search <regex>
|
apt-cache search <regex>
|
<regex> とマッチするパッケージを検索 |
aptitude why <regex>
|
N/A | なぜ <regex> とマッチするパッケージがインストールされるのかを説明 |
aptitude why-not <regex>
|
N/A | なぜ <regex> とマッチするパッケージがインストールされないのかを説明 |
lenny
以降、apt-get
と
aptitude
は自動インストールされたパッケージ状態を共有しているので (「APT に関するパッケージ状態」参照)、これらのツールを特段の問題なく混用できます (Bug #594490 参照)。
"safe-upgrade
"/"upgrade
" と
"full-upgrade
"/"dist-upgrade
"
の違いは新しいバージョンのパッケージが該当する古いバージョンと異なった依存関係がある場合にのみ起こります。"aptitude
safe-upgrade
" コマンドは新規のパッケージをインストールも削除もしません。
"aptitude why <regex>
" は "aptitude -v why
<regex>
" とすることでさらに詳しい情報を表示します。同様の情報は "apt-cache
rdepends <package>
" とすることでも得られます。
aptitude
コマンドが最初コマンドラインモードで実行されパッケージ間のコンフリクトのような問題に直面した場合は、プロンプトがでた際に
"e
" を押すことでフルスクリーンのインタラクティブモードに切り替えられます。
"aptitude
" のすぐ後ろにコマンドオプションをつけられます。
表2.7 aptitude
(8) に関する特記すべきコマンドオプション
コマンドオプション | 説明 |
---|---|
-s
|
コマンド結果のシミュレート |
-d
|
インストール / アップグレード無しにダウンロードのみする |
-D
|
自動的なインストールや削除の前に簡単な説明を表示 |
詳細は aptitude
(8) や
"/usr/share/doc/aptitude/README
" にある "aptitude user's
manual" を参照下さい。
現在でも存続している dselect
パッケージは、過去のリリースでは推薦されたフルスクリーンのインタラクティブなパッケージ管理ツールでした。
インタラクティブなパッケージ管理のためには aptitude
をインタラクティブモードでコンソールのシェルプロンプトから次のように立ち上げます。
$ sudo aptitude -u Password:
これによりアーカイブ情報のローカルコピーは更新され、フルスクリーンのパッケージリストがメニュー付きで表示されます。Aptitude の設定ファイルは
"~/.aptitude/config
" にあります。
user の設定ファイルでなく root の設定ファイルを使いたい際には、上記の例で "sudo aptitude
...
" の代わりに "sudo -H aptitude ...
" を使います。
Aptitude
はインタラクティブに起動されると次にするアクションを自動的に設定します。その設定が好ましくない場合はメニュー:"Action" →
"Cancel pending actions" からリセットすることができます。
パッケージの状態を閲覧し、"予定のアクション" の設定をこのフルスクリーンモードで各パッケージするための重要なキーを次に記します。
表2.8 aptitude のキーバインディングのリスト
キー | キーバインディング |
---|---|
F10 もしくくは Ctrl-t
|
メニュー |
?
|
(より詳細な) キーの意味のヘルプの表示 |
F10 → ヘルプ → ユーザーマニュアル
|
ユーザーマニュアルの表示 |
u
|
パッケージアーカイブ情報の更新 |
+
|
パッケージをアップグレードまたはインストールするとマーク |
-
|
パッケージを削除するとマーク (設定ファイルは温存) |
_
|
パッケージを完全削除するとマーク (設定ファイルも削除) |
=
|
パッケージをホールド |
U
|
全てのアップグレード可能なパッケージをマーク (full-upgrade として機能) |
g
|
選ばれたパッケージのダウンロードとインストールをスタート |
q
|
現在のスクリーンを終了し変更を保存 |
x
|
現在のスクリーンを終了し変更を廃棄 |
Enter
|
パッケージに関する情報閲覧 |
C
|
パッケージの変更履歴を閲覧 |
l
|
表示されるパッケージの制限を変更 |
/
|
最初のマッチを検索 |
\
|
最終検索の反復 |
コマンドラインのファイル名の規定や、"l
" や "/
"
を押した後のメニュープロンプトは次に記す aptitude の regex (正規表現) が使われます。aptitude の regex は
"~n
" で始めそれにパッケージ名を続けた文字列を使うことで明示的にパッケージ名とマッチさせられます。
ビジュアルインターフェースで全てのインストール済みパッケージを候補バージョンにアップグレードさせるには "U
"
を押さなければいけません。これをしないと選ばれたパッケージとそれにバージョン付きの依存関係のある特定のパッケージのみがアップグレードされます。
インタラクティブなフルスクリーンモードの aptitude
(8)
はパッケージリスト中のパッケージは次の例のように表示されます。
idA libsmbclient -2220kB 3.0.25a-1 3.0.25a-2
上記の行は左から次に記すような意味です。
"?
" を押して表示されるヘルプスクリーンの一番下に全フラグのリストがあります。
現在のローカルの環境設定によって候補バージョンは選ばれます
(apt_preferences
(5) と「候補バージョンの調整」を参照)。
"表示
" メニューの下に数種のパッケージ表示があります。
表2.9 aptitude の表示のリスト
表示 | 状況 | ビューの説明 |
---|---|---|
パッケージ画面
|
良好 | 表2.10「標準パッケージ画面の分類」参照 (デフォールト) |
推奨を監査
|
良好 | 何らかのインストール済みパッケージによって推薦されているがインストールされていないパッケージをリスト |
平坦なパッケージリスト
|
良好 | パッケージを分類せずにリスト (regex とともに使用) |
Debtags 表示
|
十分使える | パッケージの debtags のエントリーにより分類したパッケージをリスト |
カテゴリー別表示
|
非推奨 |
パッケージのカテゴリー別に分類してパッケージをリスト (これに代えて Debtags 表示 を利用しましょう)
|
パッケージの debtags によるタグ付け状況を改善するのにご協力下さい!
標準 "パッケージ画面
" はパッケージを dselect
にいくつかの機能を加えた感じで分類します。
表2.10 標準パッケージ画面の分類
分類 | ビューの説明 |
---|---|
更新可能なパッケージ
|
section → area →
package と整理してパッケージをリスト
|
新規パッケージ
|
, , |
インストール済みのパッケージ
|
, , |
インストールされていないパッケージ
|
, , |
廃止された、またはローカルで作成されたパッケージ
|
, , |
仮想パッケージ
|
同一機能のパッケージをリスト |
タスク
|
タスクに一般的に必要な機能を持つパッケージのリスト |
Tasks
ビューはあなたのタスクに使うパッケージをいいとこ取りするのに使えます。
Aptitude はその regex 式機能を通してパッケージを探索する方法をいくつか提供します。
シェルコマンドライン:
aptitude search
'<aptitude_regex>'
"
aptitude show '<package_name>'
"
対話型フルスクリーンモード:
l
"
/
"
\
"
n
"
N
"
<package_name> という文字列は、"~
" で始めて regex
式と明示されていない限り、パッケージ名との完全な一致検索として扱います。
aptitude の regex 式は mutt 的な拡張 ERE (「正規表現」参照) で aptitude
に特定なマッチ規則の拡張は次に示すとおりです。
表2.11 aptitude の regex 式のリスト
拡張マッチ規則の説明 | regex 式 |
---|---|
パッケージ名とのマッチ |
~n<名前のregex>
|
記述とのマッチ |
~d<記述のregex>
|
タスク名とのマッチ |
~t<タスクのregex>
|
debtag とのマッチ |
~G<debtagのregex>
|
メンテナとのマッチ |
~m<maintainerのregex>
|
パッケージセクションとのマッチ |
~s<セクションのregex>
|
パッケージバージョンとのマッチ |
~V<バージョンのregex>
|
アーカイブ (archive) とのマッチ |
~A{sarge,etch,sid }
|
オリジン (origin) とのマッチ |
~O{debian,… }
|
優先度 (priority) とのマッチ |
~p{extra,important,optional,required,standard }
|
必須 (essential) パッケージとのマッチ |
~E
|
仮想パッケージとのマッチ |
~v
|
新規パッケージとのマッチ |
~N
|
次のアクションとのマッチ |
~a{install,upgrade,downgrade,remove,purge,hold,keep }
|
インストール済みパッケージとのマッチ |
~i
|
A-マークのついたインストール済みパッケージとマッチ (自動インストール済みパッケージ) |
~M
|
A-マークのついていないインストール済みパッケージとマッチ (管理者が選択したパッケージ) |
~i!~M
|
インストール済みかつアップグレード可能なパッケージとマッチ |
~U
|
削除済みだが完全削除されていないパッケージとマッチ |
~c
|
削除済みか完全削除済みか削除可能なパッケージとマッチ |
~g
|
パッケージ依存関係が壊れたパッケージとマッチ |
~b
|
depends/predepends/conflict の依存関係が壊れたパッケージとマッチ |
~B<type>
|
<term> パッケージに対して <type> の依存関係があるパッケージとマッチ |
~D[<type>:]<term>
|
<term> パッケージに対して <type> の壊れた依存関係があるパッケージとマッチ |
~DB[<type>:]<term>
|
<term> パッケージに対して <type> の依存関係があるパッケージとマッチ |
~R[<type>:]<term>
|
<term> パッケージに対して <type> の壊れた依存関係があるパッケージとマッチ |
~RB[<type>:]<term>
|
他のインストール済みパッケージが依存するパッケージとマッチ |
~R~i
|
他のインストール済みパッケージが一切依存しないパッケージとマッチ |
!~R~i
|
他のインストール済みパッケージが依存もしくは推薦するパッケージとマッチ |
~R~i|~Rrecommends:~i
|
フィルターされたバージョンの <term> とマッチ |
~S filter <term>
|
常に全てのパッケージにマッチ (真) |
~T
|
どのパッケージにもマッチしない (偽) |
~F
|
^
" や ".*
" や
"$
" などを使う egrep
(1) や
awk
(1) や perl
(1) といった典型的な Unix
的テキストツールで使われる ERE と同様です。
<regex_pattern> がヌル文字列の場合は "~T
" をコマンドの直後に使って下さい。
次がショートカットです。
~P<term>
" ==
"~Dprovides:<term>
"
~C<term>
" ==
"~Dconflicts:<term>
"
…~W term
" == "(…|term)
"
mutt が表現のお手本なので、mutt
に慣れているユーザーはすぐ慣れるでしょう。"User's Manual"
("/usr/share/doc/aptitude/README
") 中の "SEARCHING,
LIMITING, AND EXPRESSIONS" を参照下さい。
lenny
バージョンの aptitude
(8) では、新規の
"?broken
" のような長形式の
regex マッチ形式が、古い "~b
" のような短形式のマッチ形式に代えて使えます。そのためチルダ文字 "~
"
に加えてスペース文字 "
" も regex の終端文字として扱われます。新規の長形式のマッチ形式については "User's Manual" を参照下さい。
aptitude
によるパッケージの選択は、"F10
→ Options →
Dependency handling" のメニュー設定に従って、"Depends:
"
リストに規定されたパッケージばかりでは無く "Recommends:
"
リストに規定されたパッケージも引き込みます。このような自動的にインストールされたパッケージは不要になると
aptitude
が自動的に削除します。
lenny
リリース以前は、apt-get
等の他の標準的な APT
ツールは自動的削除機能がありませんでした。
パッケージアクティビティーの履歴はログファイルで確認できます。
表2.12 パッケージアクティビティーのログファイル
ファイル | 内容 |
---|---|
/var/log/dpkg.log
|
全パッケージアクティビティの dpkg レベルのアクティビティーのログ
|
/var/log/apt/term.log
|
APT アクティビティのログ |
/var/log/aptitude
|
aptitude コマンドアクティビティのログ
|
これらのログから意味のある理解を迅速に得るのは実際には難しいです。より簡単な方法については「設定ファイルの変更記録」を参照下さい。
aptitude
(8) 操作例を次に示します。
次のコマンドはパッケージの名前が regex にマッチするパッケージをリストします。
$ aptitude search '~n(pam|nss).*ldap' p libnss-ldap - NSS module for using LDAP as a naming service p libpam-ldap - Pluggable Authentication Module allowing LDAP interfaces
これはパッケージの正確な名前を探すときに非常に便利です。
"平坦なパッケージリスト" のビューで "l
" のプロンプトに regex
"~dipv6
"
を入れるとその意味にマッチするパッケージにビューが制限され、その情報をインタラクティブに閲覧できます。
削除したパッケージが残した全ての設定ファイルを次のようにして完全削除できます。
次のコマンドの結果をチェックします。
# aptitude search '~c'
もしリストされたパッケージが完全削除されても問題ないなら、次のコマンドを実行します。
# aptitude purge '~c'
同様のことをインタラクティブにすればよりきめの細かい結果が得られます。
"平坦なパッケージリスト" のビューで "l
" のプロンプトに regex
"~c
" を入れると regex にマッチする "削除されたが完全駆除されていない"
パッケージにビューが制限されます。トップレベルの見出しの上で "[
" を押すと regex
にマッチする全てのパッケージが表示されます。
次に "インストール済みのパッケージ" 等のトップレベルの見出しの上で "_
" を押します。その見出しの下の
regex にマッチするパッケージだけが完全削除と設定されます。インタラクティブに個々のパッケージの上で "=
"
を押せばそれらのパッケージを完全削除対象から外せます。
このテクニックは非常に便利で、他の多くのコマンドキーでも使えます。
(非 aptitude のパッケージインストーラー等を使った後で) パッケージの自動 / 手動インストールの状態を整理する私の方法を次に記します。
aptitude
を root としてインタラクティブに起動します。
u
" と "U
" と "f
" と
"g
" とタイプしてパッケージリストを更新しパッケージをアップグレードします。
~i(~R~i|~Rrecommends:~i)
" と入力するために
"l
" とタイプし、自動インストールとなるよう "M
" と
"インストール済みのパッケージ" の上でタイプします。
~prequired|~pimportant|~pstandard|~E
"
と入力するために "l
" とタイプし、手動インストールとなるよう "m
" と
"インストール済みのパッケージ" の上でタイプします。
~i!~M
" と入力するために "l
"
とタイプし、"インストール済みのパッケージ" の上で "[
"
とタイプしてパッケージを見えるようにした後で個々のパッケージの上で "-
"
とタイプして使っていないパッケージを削除します。
~i(~R~i|~Rrecommends:~i)
" と入力するように
"l
" とタイプし、"インストール済みのパッケージ" の上で自動インストールとなるよう
"M
" とタイプします。
aptitude
を終了します。
apt-get -s autoremove|less
" と root
から起動して何が使われていないのか確認します。
aptitude
とインタラクティブモードで再起動して必要なパッケージを
"m
" でマークします。
apt-get -s autoremove|less
" と root
から再起動して削除対象が期待にかなっていることを再確認します。
apt-get autoremove|less
" と root
から起動して使用していないパッケージを自動削除します。
"Tasks
" の上で "m
"
を押すのも一案で、大量ファイル除去となる事態が回避できます。
新規リリース等への移行は、Debian では下記のようにアップグレードできるのですが、新たなシステムをクリーンインストールすることを考えるべきです。こうすると溜めてきたゴミの除去ができる上に最新のパッケージの最良の組み合わせも分かります。もちろん安全な場所に完全なシステムのバックアップ (「バックアップと復元」参照) を事前にしなくてはいけません。異なったパーティションを使ったデュアルブート設定をすることをスムーズな移行をするためにお薦めします。
"/etc/apt/sources.list
"
ファイルの内容を新規リリースへと向けるように変更し、"apt-get update; apt-get
dist-upgrade
"コマンドを実行することでシステム全体のアップグレードができます。
安定版 stable
からテスト版 testing
や不安定版
unstable
にアップグレードするには、「Debian アーカイブの基本」にある
"/etc/apt/sources.list
" 例の
"squeeze
" を
"wheezy
" か "sid
" に置き換えます。
一部のパッケージで移行に関して支障をきたすことが実際には起こるかもしれません。これは大体パッケージ依存関係に起因します。アップグレードする差が大きければ大きいほど比較的大きな問題似合う可能性がより大きくなります。以前の安定版
stable
からリリース後の新規安定版 stable
への移行では新規リリースノートを読んでそこに記載された手続き通りに完全にすれば問題発生を防げます。
安定版 stable
からテスト版 testing
へ移行すると決めた時には頼りにするリリースノートはありません。前回の安定版
stable
のリリースの後で安定版 stable
とテスト版
testing
の差がかなり大きくなっているかもしれません。そうだとアップグレードをする状況は複雑になっています。
メーリングリストから最新情報を収集するとか常識を使うといった予防措置をしながらフルアップグレードをするべきです。
script
(1) を使ってアップグレード活動を記録します。
aptitude unmarkauto vim
" 等として、"unmarkauto"
を重要なパッケージに適用します。
/etc/apt/preferences
" ファイルを削除します (apt-pinning を無効化)。
oldstable
→ 安定版
stable
→ テスト版 testing
→ 不安定版
unstable
。
/etc/apt/sources.list
" ファイルを更新して新アーカイブ対象に
"aptitude update
" を実行します。
aptitude install perl
" 等として、先に新規の中核的パッケージを必要に応じてインストールします。
apt-get -s dist-upgrade
" コマンドを実行して影響を確認します。
apt-get dist-upgrade
" コマンドを実行します。
stable
リリース間でアップグレードする際に Debian のメジャーリリースを飛ばすのは賢明ではありません。
過去の "リリースノート" ではシステム全体のアップグレードをするのに GCC や Linux カーネルや initrd-tools や Glibc や Perl や APT tool chain 等には特別な配慮が必要でした。
unstable
での毎日のアップグレードは「パッケージ問題からの防御」を参照下さい。
aptitude
ではハイレベル過ぎるとか必要な機能を欠くという他のパッケージ管理操作のリストです。
表2.13 高度なパッケージ管理操作
コマンド | アクション |
---|---|
COLUMNS=120 dpkg -l <パッケージ名パターン>
|
バグレポートのためにインストールされたパッケージの状態をリスト |
dpkg -L <パッケージ名>
|
インストールされたパッケージの内容をリスト |
dpkg -L <パッケージ名> | egrep '/usr/share/man/man.*/.+'
|
インストールされたパッケージのマンページをリスト |
dpkg -S <ファイル名パターン>
|
マッチするファイル名があるインストールされたパッケージをリスト |
apt-file search <ファイル名パターン>
|
マッチするファイル名があるアーカイブ中のパッケージをリスト |
apt-file list <パッケージ名パターン>
|
アーカイブ中のマッチするパッケージをリスト |
dpkg-reconfigure <パッケージ名>
|
特定パッケージを再設定 |
dpkg-reconfigure -p=low <パッケージ名>
|
もっとも詳細な質問で特定パッケージを再設定 |
configure-debian
|
フルスクリーンメニューからパッケージを再設定 |
dpkg --audit
|
部分的にインストールされたパッケージに関してシステムを監査 |
dpkg --configure -a
|
全ての部分的にインストールされたパッケージを設定 |
apt-cache policy <バイナリーパッケージ名>
|
バイナリーパッケージに関して使用可能なバージョンやプライオリティーやアーカイブ情報を表示 |
apt-cache madison <パッケージ名>
|
パッケージに関して使用可能なバージョンやアーカイブ情報を表示 |
apt-cache showsrc <バイナリーパッケージ名>
|
バイナリーパッケージに関してソースパッケージの情報を表示 |
apt-get build-dep <パッケージ名>
|
パッケージをビルドするのに必要なパッケージをインストール |
apt-get source <パッケージ名>
|
(標準アーカイブから) ソースをダウンロード |
dget <dsc ファイルの URL>
|
(他のアーカイブから) ソースをダウンロード |
dpkg-source -x
<パッケージ名>_<バージョン>-<debianバージョン>.dsc
|
ソースパッケージの組 ("*.tar.gz " と
"*.debian.tar.gz " / "*.diff.gz ")
からソースツリーをビルド
|
debuild binary
|
ローカルのソースツリーからパッケージをビルド |
make-kpkg kernel_image
|
カーネルソースツリーからカーネルパッケージをビルド |
make-kpkg --initrd kernel_image
|
カーネルソースツリーから initramfs を有効にしてカーネルパッケージをビルド |
dpkg -i
<パッケージ名>_<バージョン>-<debian_バージョン>_<アーキテクチャー名>.deb
|
ローカルパッケージをシステムにインストール |
debi
<パッケージ名>_<バージョン>-<debian_バージョン>_<アーキテクチャー名>.dsc
|
ローカルパッケージ (複数) をシステムにインストール |
dpkg --get-selections '*' >selection.txt
|
dpkg レベルのパッケージ選択状態情報を保存
|
dpkg --set-selections <selection.txt
|
dpkg レベルのパッケージ選択状態情報を設定
|
echo <package_name> hold | dpkg --set-selections
|
特定パッケージの dpkg レベルのパッケージ選択状態を hold にする ("aptitude hold
<package_name> " と等価)
|
"dpkg -i …
" や "debi …
"
といった低いレベルのパッケージツールはシステム管理者によって注意深く使われなければいけません。必要なパッケージ依存関係を自動的に面倒見てくれません。Dpkg
の "--force-all
" や類似のコマンドラインオプション
(dpkg
(1) 参照)
はエキスパートだけが使うようにできています。十分にその影響を理解せずに使うとシステム全体を壊してしまうかもしれません。
以下に注意下さい。
aptitude
と異なり、他のパッケージ管理コマンドはシェルグロブ (「シェルグロブ」参照) のようなパターンを使います。
apt-file
パッケージに入っている apt-file
(1) は事前に
"apt-file update
" を実行する必要があります。
configure-debian
パッケージに入っている
configure-debian
(8) はそのバックエンドとして
dpkg-reconfigure
(8) を実行します。
dpkg-reconfigure
(8) はそのバックエンドとして
debconf
(1) を利用するパッケージスクリプトを実行します。
apt-get build-dep
" や "apt-get source
"
や "apt-cache showsrc
" コマンドは
"/etc/apt/sources.list
" の中に "deb-src
"
エントリーが必要です。
dget
(1) や debuild
(1) や
debi
(1) は devscripts
パッケージが必要です。
apt-get source
" を使った (再)パッケージ化の手続きは「安定版システムへのパッケージ移植」を参照下さい。
make-kpkg
コマンドは kernel-package
パッケージが必要です (「カーネル」参照)。
debsums
をインストールすると debsums
(1) を使って
"/var/lib/dpkg/info/*.md5sums
" ファイル中の MD5sum
値との比較でインストールされたパッケージファイルを検証できます。MD5sum がどのような仕組かは「MD5 和」参照下さい。
侵入者によって MD5sum のデーターベースが改竄されているかもしれないので debsums
(1)
はセキュリティーツールとしては限定的有用性しかありません。管理者によるローカルの変更や記憶メディアのエラーによる損傷を点検するぐらいには有用です。
多くのユーザーは新規機能やパッケージを求めて Debian システムの非安定版 unstable リリースを追いかけることを好みます。こういうことをするとクリティカルなパッケージのバグにシステムが遭遇しやすくなります。
apt-listbugs
パッケージをインストールすれば、APT システムを使ってアップグレードする時に
Debian の BTS を自動的にクリティカルなバグに関して点検することで、クリティカルなバグからあなたのシステムを防御できます。
apt-listchanges
パッケージをインストールすれば、APT システムを使ってアップグレードする時に
NEWS.Debian
中の重要ニュースを表示します。
最近は Debian サイトの http://packages.debian.org/ を訪問するとパッケージメタデーターの検索を簡単に出きるようになっていますが、より伝統的な方法を見てみます。
grep-dctrl
(1) や grep-status
(1) や
grep-available
(1) コマンドは Debian
のパッケージコントロールファイルの一般的フォーマットに従ういかなるファイルを検索するのにも使えます。
マッチする名前のファイルを含む dpkg
でインストールされたパッケージ名を探索するのに
"dpkg -S <ファイル名パターン>
"
が使えます。しかしメンテナスクリプトで生成されるファイルはこれでは見逃されます。
dpkg のメタデーターに関してより詳細な検索をする必要がある場合、"/var/lib/dpkg/info/
"
ディレクトリーで "grep -e regexパターン *
"
コマンドを実行しないといけません。こうすることでパッケージスクリプトやインストール時の質問テキスト中の言葉まで検索できます。
パッケージ依存関係を再帰的に検索したい際には、apt-rdepends
(8) を使います。
Debian のパッケージ管理システムが内部的のどのように機能するのかを学びます。何らかのパッケージ問題が発生した際にあなた自身の解決を見出すのに役立つでしょう。
各ディストリビューションのメタデーターのファイルは例えば
"http://ftp.us.debian.org/debian/
" のような各 Debian ミラーサイトの
"dist/<コード名>
"
の下に保存されています。そのアーカイブ構造はウェッブブラウザーで閲覧できます。6つのタイプの重要メタデーターがあります。
表2.14 Debian アーカイブのメタデーターの内容
ファイル | 場所 | 内容 |
---|---|---|
Release
|
ディストリビューションのトップ | アーカイブの説明との整合性情報 |
Release.gpg
|
ディストリビューションのトップ |
アーカイブキーで署名された "Release " ファイルに関する署名ファイル
|
Contents-<アーキテクチャー>
|
ディストリビューションのトップ | 該当アーカイブ中全てのパッケージに関する全ファイルリスト |
Release
|
各ディストリビューション / エリア / アーキテクチャーの組み合わせのトップ |
apt_preferences (5) のルールに利用されるアーカイブの記述。
|
Packages
|
各ディストリビューション / エリア / バイナリーアーキテクチャーの組み合わせのトップ |
バイナリーパッケージに関して debian/control を連結
|
Sources
|
各ディストリビューション / エリア / ソースの組み合わせのトップ |
ソースパッケージに関して debian/control を連結
|
最近のアーカイブではネットワークトラフィックを減らすべく圧縮された差分ファイルとしてこれらのメタデーターは保存されています。
セキュアー APT システムではトップレベルの "Release" ファイルがアーカイブを署名するのに使われています。
Debian アーカイブの各スイーツには例えば次に示すような
"http://ftp.us.debian.org/debian/dists/unstable/Release
"
のようなトップレベルの "Release" ファイルがあります。
Origin: Debian Label: Debian Suite: unstable Codename: sid Date: Sat, 26 Jan 2008 20:13:58 UTC Architectures: alpha amd64 arm hppa hurd-i386 i386 ia64 m68k mips mipsel powerpc s390 sparc Components: main contrib non-free Description: Debian x.y Unstable - Not Released MD5Sum: e9f11bc50b12af7927d6583de0a3bd06 22788722 main/binary-alpha/Packages 43524d07f7fa21b10f472c426db66168 6561398 main/binary-alpha/Packages.gz ...
「Debian アーカイブの基本」の中で "スイーツ (suite)" や "コード名 (codename)" を使う理由はこれを見れば分かるでしょう。"ディストリビューション" は "スイーツ" と "コード名" との両方を指したい際に用いられます。アーカイブが提供する全アーカイブ "エリア (area)" 名が "Component" の下にリストされます。
トップレベルの "Release
" ファイルの整合性は セキュアー apt という暗号学手法インフラストラクチャーによって検証されます。
Release.gpg
" は真正のトップレベルの
"Release
" ファイルと秘密の Debian アーカイブキーから作成されます。
公開の Debian アーカイブキーは "/etc/apt/trusted.gpg
"
に取り込むには次のようにします。
base-files
パッケージを用いてキーリングをインストールすることで自動で取り込む。
gpg
か
apt-key
ツールを用いて手動で取り込む。
Release.gpg
" ファイルと
"/etc/apt/trusted.gpg
" 中の公開アーカイブキーを用いてダウンロードされたトップレベルの
"Release
" ファイルの整合性を暗号学手法を用いて検証します。
"全ての Packages
" と "Sources
ファイルの整合性はそのトップレベルの "Release
" ファイル中の MD5sum
値を用いて検証します。"パッケージファイルの整合性は "Packages
" や
"Sources
" ファイル中の MD5sum
値を用いて検証します。debsums
(1) と「インストールされたパッケージファイルの検証」を参照下さい。
暗号学手法を用いた署名の検証は MD5sum 値の計算よりも非常に CPU を使うプロセスなので、トップレベルの
"Release
" ファイルには暗号学手法を用いた署名を使いつつ各パッケージには MD5sum
値を用いることでパーフォーマンスを保ったまま良好なセキュリティーが確保できます
(「データーセキュリティーのインフラ」参照)。
アーカイブレベルの "Release
" ファイルが
apt_preferences
(5) のルールに使われます。
"http://ftp.us.debian.org/debian/dists/unstable/main/binary-amd64/Release
"
や
"http://ftp.us.debian.org/debian/dists/sid/main/binary-amd64/Release
"
等の "/etc/apt/sources.list
" 中の "deb
"
行で特定される全てのアーカイブロケーションにはアーカイブレベルの次に示すような "Release
"
ファイルがあります。
Archive: unstable Component: main Origin: Debian Label: Debian Architecture: amd64
"Archive:
" スタンザには、Debian
アーカイブではスイート名 ("stable
" や
"testing
" や "unstable
" 等)
が使われますが、Ubuntu アーカイブではコード名
("dapper
" や "feisty
" や
"gutsy
" や "hardy
" や
"intrepid
" 等) が使われます。
experimental
や
squeeze-backports
のような自動的にインストールされるべきでないパッケージを含むような一部アーカイブでは次に示す
"http://ftp.us.debian.org/debian/dists/experimental/main/binary-amd64/Release
"
のような追加の行があります。
Archive: experimental Component: main Origin: Debian Label: Debian NotAutomatic: yes Architecture: amd64
"NotAutomatic: yes
" となっていない通常のアーカイブではデフォールトの Pin-Priority
値は 500 ですが、"NotAutomatic: yes
" となっている特別なアーカイブではデフォールトの
Pin-Priority 値は 1 です (apt_preferences
(5) と「候補バージョンの調整」参照)。
aptitude
や apt-get
や
synaptic
や apt-file
や
auto-apt
等の APT ツールが使われる際には Debian
アーカイブ情報を含むメタデーターのローカルコピーを更新する必要があります。この様なローカルのコピーは
"/etc/apt/sources.list
" 中のディストリビューション
(distribution)
とエリア (area)
とアーキテクチャー
(architecture)
の名前に対応する次のファイル名です (「Debian アーカイブの基本」参照)。
/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<ディストリビューション>_Release
"
/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<ディストリビューション>_Release.gpg
"
/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<ディストリビューション>_<エリア>_source_Sources
"
/var/lib/apt/lists/ftp.us.debian.org_debian_dists_<ディストリビューション>_<エリア>_source_Sources
"
/var/cache/apt/apt-file/ftp.us.debian.org_debian_dists_<ディストリビューション>_Contents-<アーキテクチャー>.gz
"
(apt-file
用)
最初の4つのタイプのファイルは全ての適切な APT コマンド間で共有されておりコマンドラインから "apt-get
update
" や "aptitude update
" によって更新されます。もし
"/etc/apt/sources.list
" 中に "deb
" 行があれば
"Packages
" メタデーターが更新されます。もし
"/etc/apt/sources.list
" 中に "deb-src
"
行があれば "Sources
" メタデーターが更新されます。
"Packages
" や "Sources
"
メタデーターはバイナリーやソースパッケージのファイルの場所を指している "Filename:
"
スタンザを含んでいます。現在、それらのパッケージはリリース間の移行を滞り無くするために "pool/
"
ディレクトリーツリーの下に置かれています。
"Packages
" メタデーターのローカルコピーは aptitude
を使ってインタラクティブに検索できます。grep-dctrl
(1) という専用の検索コマンドを使うと
"Packages
" と "Sources
"
メタデーターのローカルコピーを検索できます。
"Contents-<アーキテクチャー>
" メタデーターのローカルコピーは
"apt-file update
"
で更新でき、他の4つと異なるところにあります。apt-file
(1)
を参照下さい。(auto-apt
では
"Contents-<アーキテクチャー>.gz
"
のローカルコピーがデフォールトでは異なるところにあります。)
lenny
以降の APT
ツールではリモートから取得したメタデーターに追加でローカルで生成されるインストール状態情報を
"/var/lib/apt/extended_states
"
に保存して、自動インストールされた全パッケージを全ての APT ツールで追跡するのに用います。
aptitude
コマンドではリモートから取得したメタデーターに追加でローカルで生成されるインストール状態情報を
"/var/lib/aptitude/pkgstates
" に保存して用いています。
Debian のパッケージファイルには特定の名前の構造があります。
表2.15 Debian パッケージの名前の構造
パッケージタイプ | 名前の構造 |
---|---|
バイナリーパッケージ (所謂 deb )
|
<パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>-<アーキテクチャー>.deb
|
バイナリーパッケージ (所謂udeb )
|
<パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>-<アーキテクチャー>.udeb
|
ソースパッケージ (アップストリームのソース) |
<パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.orig.tar.gz
|
1.0 ソースパッケージ (Debian の変更部分)
|
<パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.diff.gz
|
3.0 (quilt) ソースパッケージ (Debian の変更部分)
|
<パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.debian.tar.gz
|
ソースパッケージ (内容記述) |
<パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.dsc
|
ここでは基本的なパッケージフォーマットのみが記述されています。詳細は dpkg-source
(1) を参照下さい。
表2.16 Debian パッケージ名の各部分に使用可能な文字
名前の部分 | 使用可能文字 (regex) | 存在 |
---|---|---|
<パッケージ名>
|
[a-z,A-Z,0-9,.,
|
必須 |
<エポック>:
|
[0-9]+:
|
任意 |
<アップストリームのバージョン>
|
[a-z,A-Z,0-9,.,
|
必須 |
<debianのバージョン>
|
[a-z,A-Z,0-9,.,
|
任意 |
パッケージバージョンの順位は dpkg
(1) を使って、例えば "dpkg
--compare-versions 7.0 gt 7.~pre1 ; echo $?
" とすると確認できます。
Debian インストーラー (d-i)
のバイナリーパッケージには、通常の deb
ではなく udeb
をファイル拡張子として使われます。udeb
パッケージはポリシー条件を緩和しドキュメントのように必須でない内容を削除した減量 deb
パッケージです。deb
と udeb
パッケージは同一のパッケージ構造を共有しています。"u
" はマイクロと言う意味で使っています。
dpkg
(1) は Debian
パッケージ管理の最も低レベルのツールです。非常に強力ですから気をつけて使う必要があります。
"<パッケージ名>
"というパッケージをインストールする際に、dpkg
は次に記す順番でパッケージを処理します。
ar -x
" と等価)
debconf
(1) を使い
"<package_name>.preinst
" を実行
tar -x
" と等価)
debconf
(1) を使い
"<package_name>.postinst
" を実行
debconf
システムによって I18N と L10N (8章I18N と L10N) のサポートのある標準化されたユーザーとの対話が実現できます。
表2.17 dpkg
が作成する特記すべきファイル
ファイル | 内容の説明 |
---|---|
/var/lib/dpkg/info/<パッケージ名>.conffiles
|
設定ファイルのリスト。(ユーザー変更可能) |
/var/lib/dpkg/info/<パッケージ名>.list
|
パッケージによりインストールされるファイルやディレクトリーのリスト |
/var/lib/dpkg/info/<パッケージ名>.md5sums
|
パッケージによりインストールされるファイルの MD5 ハッシュ値のリスト |
/var/lib/dpkg/info/<パッケージ名>.preinst
|
パッケージインストールの前に実行するパッケージスクリプト |
/var/lib/dpkg/info/<パッケージ名>.postinst
|
パッケージインストールの後に実行するパッケージスクリプト |
/var/lib/dpkg/info/<パッケージ名>.prerm
|
パッケージ削除の前に実行するパッケージスクリプト |
/var/lib/dpkg/info/<パッケージ名>.prerm
|
パッケージ削除の前に実行するパッケージスクリプト |
/var/lib/dpkg/info/<パッケージ名>.conffiles
|
debconf システムのためのパッケージスクリプト
|
/var/lib/dpkg/alternatives/<パッケージ名>
|
update-alternatives コマンドが用いる代替情報
|
/var/lib/dpkg/available
|
すべてのパッケージの入手可能性情報 |
/var/lib/dpkg/diversions
|
dpkg (1) に用いられ、dpkg-divert (8)
が設定する迂回情報。
|
/var/lib/dpkg/statoverride
|
dpkg (1) に用いられ、dpkg-statoverride (8)
が設定する状態の上書き情報。
|
/var/lib/dpkg/status
|
全パッケージに関する状態情報 |
/var/lib/dpkg/status-old
|
"var/lib/dpkg/status " ファイルの第一世代のバックアップ
|
/var/backups/dpkg.status*
|
"var/lib/dpkg/status " ファイルの第二世代以前のバックアップ
|
"status
" ファイルは dpkg
(1) や
"dselect update
" や "apt-get -u
dselect-upgrade
" のようなツールによって使われます。
grep-dctrl
(1) という専用の検索コマンドを使うと
"status
" と "available
"
メタデーターのローカルコピーを検索できます。
デビアンインストーラー
環境下では、udpkg
コマンドが udeb
パッケージを開けるのに用いられます。udpkg
コマンドはストリップダウンされたバージョンの
dpkg
コマンドです。
Debian システムには update-alternatives
(8)
を用いて何らかの重畳するプログラムを平和裏にインストールするメカニズムがあります。例えば vim
と
nvi
の両方のパッケージがインストールされた状況下で vi
コマンドが
vim
を選択して実行するようにできます。
$ ls -l $(type -p vi) lrwxrwxrwx 1 root root 20 2007-03-24 19:05 /usr/bin/vi -> /etc/alternatives/vi $ sudo update-alternatives --display vi ... $ sudo update-alternatives --config vi Selection Command ---------------------------------------------- 1 /usr/bin/vim *+ 2 /usr/bin/nvi Enter to keep the default[*], or type selection number: 1
Debian の代替 (alternatives) システムは、その選択を
"/etc/alternatives/
" の中のシムリンクとして保持します。選択プロセスには
"/var/lib/dpkg/alternatives/
" の中の対応するファイルが使われます。
dpkg-statoverride
(8) コマンドで提供される状態の上書きは、パッケージをインストールする際にファイルに関して異なる所有者やモードを使うよう dpkg
(1)
に指示する方法です。もし "--update
"
が指定されファイルが存在すれば、即座に新たな所有者やモードに設定されます。
パッケージが所有するファイルの所有者やモードをシステム管理者が
chmod
や chown
コマンドを用いて直接変更しても次のパッケージアップグレードがリセットします。
ここでファイルと言いましたが、実際には
dpkg
が扱うディレクトリーやデバイス等のいかなるファイルシステムオブジェクトであってもいいです。
非安定 (unstable)
システムを動かす時には、管理者には壊れたパッケージ管理状況から復元できることが望まれます。
ここで説明するいくつかの方法は非常にリスクが高いアクションです。警告しましたよ!
もしデスクトップ GUI プログラムが上流の大きなバージョンアップグレードの後に不安定性を経験した際には、そのプログラムが作った古いローカル設定ファイルとの干渉を疑うべきです。もし新規作成したユーザーアカウントでそのプログラムが安定なら、この仮説が裏付けられます。(これはパッケージングのバグで、通常パッケージャーによって回避されます。)
安定性を復元するには、対応するローカル設定ファイルを移動し GUI プログラムを再スタートします。後日設定情報を回復するために古い設定ファイルの内容を読む必要があるかもしれません。(あまり慌てて消去しないようにしましょう。)
aptitude
(8) や apt-get
(1)
等の、アーカイブレベルのパッケージ管理システムはパッケージの依存関係を使って重複するファイルを持つファイルのインストールしようとさえしません
(「パッケージ依存関係」参照)。
パッケージメインテナによるエラーや、システム管理者による不整合な混合ソースのアーカイブの採用 (「混合したアーカイブソースからのパッケージ」参照)
があった場合には、パッケージ依存関係が誤って定義される事態が発生するかもしれません。そういう状況下で重複するファイルを持つパッケージを
aptitude
(8) や apt-get
(1)
を使ってインストールしようとすると、パッケージを展開する dpkg
(1)
は既存ファイルを上書きすることなく呼ばれたプログラムにエラーを確実に返します。
第三者が作成したパッケージを使うと、root
権限で実行されるシステムに関して何でもできるメンテナスクリプトが実行されるので、システムが重大なリスクにさらされます。dpkg
(1)
はパッケージを展開するするさいに上書きする事を防止するだけです。
そのような壊れたインストール状況は、まず古い問題原因となっているパッケージ <old-package>
を削除すれば回避できます。
$ sudo dpkg -P <old-package>
パッケージスクリプト内のコマンドが何らかの理由でエラーを返しスクリプトがエラーで終了した場合には、パッケージ管理システムは動作を途中終了するので部分的にインストールされたパッケージのある状況が生まれます。パッケージがその削除スクリプト内にバグを持つ場合には、パッケージが削除不能になりうるので大変厄介です。
"<パッケージ名>
"
のパッケージスクリプトの問題に関しては、次のパッケージスクリプトの内容を確認するべきです。
/var/lib/dpkg/info/<パッケージ名>.preinst
"
/var/lib/dpkg/info/<パッケージ名>.postinst
"
/var/lib/dpkg/info/<パッケージ名>.prerm
/var/lib/dpkg/info/<パッケージ名>.prerm
"
スクリプトの問題原因部分を次のようなテクニックを使い root から編集します。
#
" を挿入し問題行を無効にする
|| true
" を挿入し成功を強制的に返さす
全ての部分的にインストールされたパッケージを次のコマンドで設定します。
# dpkg --configure -a
dpkg
は非常に低レベルのパッケージツールなのでネットワーク接続もないブート不能な非常に劣悪な状況下でも機能します。foo
パッケージが壊れていて置き換える必要があると仮定します。
バグの無い古いバージョンの foo
パッケージが
"/var/cache/apt/archives/
"
にあるパッケージキャッシュの中に見つかるかもしれません。(ここにみつからなければ、http://snapshot.debian.net/
アーカイブからダウンロードしたり、機能している機器のパッケージキャッシュからコピーできます。)
もしブート不可能な場合には、次のコマンドを使ってインストールすることもできます。
# dpkg -i /path/to/foo_<old_version>_<arch>.deb
システムがそれほど壊れていないなら、「緊急ダウングレード」に書かれているようにして、より高レベルの APT システムを通じてシステム全体をダウングレードする手もあります。
ハードディスクからブートできない場合は、他の方法でのブート方法を考えるべきです。
/target
" にマウントします。
foo
パッケージを次のようにしてインストールします。
# dpkg --root /target -i /path/to/foo_<old_version>_<arch>.deb
この例は、たとえハードディスク上の dpkg
コマンドが壊れていても機能します。
ハードディスク上の別のシステムであれ、GNU/Linux のライブ CD であれ、ブート可能な USB キードライブであれ、ネットブートであれ、どのように起動された GNU/Linux システムでも同様にして壊れたシステムを救済するのに使えます。
もしこの方法でパッケージをインストールしようとして何らかの依存関係違反のためにうまくいかなくてどうしようもなくなった場合には、dpkg
の "--ignore-depends
" や
"--force-depends
"
や他のオプションを使って依存関係をオーバーライドすることができます。こうした場合には、後で適正な依存関係を修復するように真剣に取り組む必要があります。詳細は
dpkg
(8) を参照下さい。
システムがひどく壊れた場合には、システムを安全な場所に完全バックアップし (「バックアップと復元」参照)、クリーンインストールを実行するべきです。こうすることは時間の節約でもあり最終的に良い結果に結びつきます。
もし何らかの理由で "/var/lib/dpkg/status
" の内容が腐った場合には、Debian
システムはパッケージ選択データーが失われ大きな打撃を被ります。古い "/var/lib/dpkg/status
"
ファイルは、"/var/lib/dpkg/status-old
" や
"/var/backups/dpkg.status.*
" としてあるので探します。
"/var/backups/
"
は多くの重要な情報を保持しているので、これを別のパーティション上に置くのも良い考えです。
ひどく壊れた場合には、システムのバックアップをした後フレッシュに再インストールすることをお薦めします。たとえ
"/var/
"
ディレクトリーの中が完全に消去されても、"/usr/share/doc/
"
ディレクトリー中から新規インストールのガイドとなる情報を復元できます。
最低限の (デスクトップ) システムを再インストールします。
# mkdir -p /path/to/old/system
"/path/to/old/system/
" に古いシステムをマウントします。
# cd /path/to/old/system/usr/share/doc # ls -1 >~/ls1.txt # cd /usr/share/doc # ls -1 >>~/ls1.txt # cd # sort ls1.txt | uniq | less
こうすると、インストールすべきパッケージ名が表示されます。("texmf
"
のようなパッケージ名以外が一部あるかもしれません。)
パッケージの説明や "Tasks" の下のリストを使ってあなたが必要なパッケージを aptitude
で見つけることができます。
2つ以上の似たパッケージに出会い "試行錯誤" の努力無しにどのパッケージをインストールするか迷った際には、常識を使って下さい。次に示す点は好ましいパッケージの良い指標と考えます。
python
による
python2.4
)
Debian は分散型の開発モデルのボランティアプロジェクトですので、そのアーカイブには目指すところや品質の異なる多くのパッケージがあります。これらをどうするかは自己判断をして下さい。
安定版 (stable)
と security
updates と squeeze-updates
のような公式にサポートされた特定の組み合わせ以外は、混合したアーカイブソースからのパッケージをインストールすることを、公式には Debian
ディストリビューションとしてサポートしていません。
testing
を追跡しながら、unstable
にある特定の新規アップストリームバージョンのパッケージを1回だけ取り入れる操作例を次に示します。
/etc/apt/sources.list
" ファイルを変更し、単一の
"unstable
" エントリーのみにします。
aptitude update
" を実行します。
aptitude install <パッケージ名>
"の実行します。
testing
のためのオリジナルの
"/etc/apt/sources.list
" ファイルを復元します。
aptitude update
" を実行します。
この様な手動のアプローチをすると "/etc/apt/preferences
" ファイルを作ることもないし、また
apt-pinning について悩むこともありません。でもこれではとても面倒です。
混合したアーカイブソースを使うことを Debian が保証していないので、その場合にはパッケージ間の互換性は自分自身で確保しなければいけません。もしパッケージに互換性がないと、システムを壊すことになるかもしれません。この様な技術的要件を判断できる必要があります。ランダムな混合したアーカイブソースを使うことは全く任意の操作ですが、私としてはこの操作はお薦めできません。
異なるアーカイブからパッケージをインストールするための一般ルールは以下です。
非バイナリーパッケージのインストールは比較的安全です。
バイナリーパッケージ (非 "Architecture: all
")
のインストールは、通常多くの障害があり、安全ではありません。
パッケージを比較的安全にインストールできるようにするために、一部の商用 non-free バイナリープログラムパッケージは完全に静的にリンクされたライブラリーとともに提供される事があります。そんなパッケージに関しても ABI 互換性等の問題は確認するべきです。
壊れたパッケージを短期的に避ける場合以外では、公式にサポートされていないアーカイブからバイナリーパッケージをインストールするのは一般的には賢明ではありません。たとえ apt-pinning (「候補バージョンの調整」参照) を使った場合にもこれは当てはまります。chroot や類似のテクニック (「仮想化システム」参照) 使って、他のアーカイブからのプログラムを実行するよう検討するべきです。
"/etc/apt/preferences
" ファイル無しだと、APT
システムはバージョン文字列を用いて、最新バージョンを候補バージョンとします。これが通常状態で APT
システムの最も推薦される使い方です。全ての公式にサポートされたアーカイブの組み合わせは、自動的にアップグレードするソースとすべきでないアーカイブは
NotAutomatic
とマークされ適正な扱いを受けるので、"/etc/apt/preferences
" ファイルを必要としません。
バージョン文字列比較ルールは、例えば "dpkg --compare-versions ver1.1 gt ver1.1~1;
echo $?
" とすれば確認できます (dpkg
(1) 参照)。
パッケージを混合したアーカイブからのソース (「混合したアーカイブソースからのパッケージ」参照)
から定常的にインストールする場合には、apt_preferences
(5) に書かれたように適正な項目のある
"/etc/apt/preferences
" ファイルを作り候補バージョンに関するパッケージ選択ルールを操作することによってこういった複雑な操作を自動化できます。これを
apt-pinning と呼びます。
初心者のユーザーによる apt-pinning の利用は大トラブル発生を間違いなく起こします。本当に必要な時以外は apt-pinning の利用は避けなければいけません。
apt-pinning を利用する際には、Debian はパッケージの互換性を保証しないので、ユーザー自身がパッケージの互換性を確保しなければいけません。apt-pinning は全く任意の操作で、著者が使うようにと勧めているわけではありません。
アーカイブレベルの Release ファイル (「アーカイブレベルの "Release" ファイル」参照) が
apt_preferences
(5) のルールに使われます。だから、apt-pinning は normal Debian archives や security Debian archives ではスイート
("suite") 名を使って機能します。(これは Ubuntu
アーカイブとは異なります)。例えば "/etc/apt/preferences
"
ファイル中で、"Pin: release a=unstable
" とはできますが、"Pin:
release a=sid
" とはできません。
非 Debian アーカイブを apt-pinning の一部に使う場合には、それが提供されている対象の確認とその信頼性の確認をします。例えば、Ubuntu と Debian は混合して使うようにはなっていません。
"/etc/apt/preferences
" ファイルを作成することなしでも、かなり複雑なシステム操作
(「dpkg コマンドを使っての救済」と「混合したアーカイブソースからのパッケージ」参照) が apt-pinning
を使わずにできます。
単純化した apt-pinning テクニックの説明を次にします。
APT システムは "/etc/apt/sources.list
"
ファイル中に規定された使えるパッケージソースから最高の Pin-Priority でアップグレードするパッケージを候補バージョンパッケージとして選択します。パッケージの Pin-Priority が1000
より大きい場合には、このアップグレードするというバージョン制約が外れるのでダウングレードできるようになります (「緊急ダウングレード」参照)。
各パッケージの Pin-Priority 値は "/etc/apt/preferences
" ファイル中の
"Pin-Priority" 項目にて規定されるか、そのデフォールト値が使われます。
表2.18 各パッケージソースタイプ毎のデフォールト Pin-Priority 値のリスト
デフォールト Pin-Priority | パッケージソースタイプ |
---|---|
990 | ターゲットリリースアーカイブ |
500 | normal archive |
100 | installed package |
1 | NotAutomatic アーカイブ |
ターゲットのリリースアーカイブは次のようにして設定できます。
APT::Default-Release "stable";
" 行を使う
"/etc/apt/apt.conf
" ファイル
apt-get install -t testing some-package
" 等の
"-t
" オプションの引数
アーカイブ中のアーカイブレベルの Release ファイル (「アーカイブレベルの "Release" ファイル」参照) に "NotAutomatic:
yes
" を含まれると NotAutomatic
アーカイブが設定されます。
複数アーカイブソースの <package> に関する Pin-Priority 値は "apt-cache policy
<package>
" の出力で表示されます。
Package pin:
" で始まる行は、<package> のみとの関連付けが
"Package pin: 0.190
" 等と定義されている場合に、pin のパッケージバージョンを示します。
Package pin:
"
という行はありません。
0.181 700
" 等としてリストされます。
0
"
が"0.181 0
" 等としてリストされます。
/etc/apt/preferences
" ファイル中に
"Package: *
" として定義) はアーカイブへのパスの左側に、"200
http://backports.debian.org/debian-backports/
squeeze-backports/main Packages
" 等としてリストされます。
testing
を追跡しながら、unstable
にある特定の新規アップストリームバージョンのパッケージが定常的にアップグレードされる、apt-pinning テクニックの例を次に示します。全ての必要なアーカイブを
"/etc/apt/sources.list
" ファイル中に次のようにリストします。
deb http://ftp.us.debian.org/debian/ testing main contrib non-free deb http://ftp.us.debian.org/debian/ unstable main contrib non-free deb http://security.debian.org/ testing/updates main contrib
"/etc/apt/preferences
" を次のように設定します。
Package: * Pin: release a=testing Pin-Priority: 500 Package: * Pin: release a=unstable Pin-Priority: 200
"<package-name>
" という名前のパッケージとその依存ファイルを
unstable
アーカイブからこの設定の下でインストールしたい場合、"-t
" オプションを使ってターゲットリリースを切り替える
(unstable
の Pin-Priority が990 になる) 次のコマンドを実行します。
$ sudo apt-get install -t unstable <package-name>
この設定では、通常の "apt-get upgrade
" や "apt-get
dist-upgrade
" ("aptitude safe-upgrade
" や
"aptitude full-upgrade
") の実行は、testing
アーカイブからインストールされたパッケージは最新の testing
アーカイブを使ってアップグレードし、unstable
アーカイブからインストールされたパッケージは最新の
unstable
アーカイブを使ってアップグレードします。
"/etc/apt/sources.list
" ファイルから
"testing
" の項目を削除しないように注意します。"testing
"
項目がその中にないと、APT システムは最新の unstable
アーカイブを使ってアップグレードします。
著者は上記操作のすぐ後に "/etc/apt/sources.list
" ファイルを編集して
"unstable
" アーカイブ項目をコメントアウトします。こうすることで、最新の
unstable
アーカイブによって unstable
からインストールされたパッケージをアップグレードしなくなりますが、"/etc/apt/sources.list
"
ファイル中に項目が多すぎてアップデートのプロセスが遅くなることをさけられます。
もし "/etc/apt/preferences
" ファイル中で "Pin-Priority:
200
" の代わりに "Pin-Priority: 20
"
が用いられた場合は、"/etc/apt/sources.list
" ファイルの中の
"testing
" 項目が削除されようと、Pin-Priority 値は100 のインストール済みパッケージは
unstable
アーカイブによってアップグレードされる事はありません。
最初の "-t unstable
"
によるインストール無しに、unstable
の特定パッケージを自動的に追跡したい場合、"/etc/apt/preferences
"
ファイルを作りそのトップにこれらパッケージを明示的に次のようにリストします。
Package: <package-1> Pin: release a=unstable Pin-Priority: 700 Package: <package-2> Pin: release a=unstable Pin-Priority: 700
以上で、各特定パッケージに関して Pin-Priority 値が設定されます。例えば最新の unstable
バージョンのこの "Debian リファレンス"
を英語版で追跡するためには、"/etc/apt/preferences
" ファイルに次の項目を設定します。
Package: debian-reference-en Pin: release a=unstable Pin-Priority: 700 Package: debian-reference-common Pin: release a=unstable Pin-Priority: 700
この apt-pinning テクニックは stable
アーカイブを追跡している際にも有効です。著者の経験では、文書パッケージは unstable
アーカイブからインストールしても今までいつも安全でした。
次に unstable
を追跡しながら experimental
にある特定の新規アップストリームバージョンのパッケージを取り込む apt-pinning テクニックの例を示します。すべての必要なアーカイブを
"/etc/apt/sources.list
" ファイルに次のようにリストします。
deb http://ftp.us.debian.org/debian/ unstable main contrib non-free deb http://ftp.us.debian.org/debian/ experimental main contrib non-free deb http://security.debian.org/ testing/updates main contrib
experimental
アーカイブのデフォールトの Pin-Priority 値は、NotAutomatic アーカイブ (「アーカイブレベルの "Release" ファイル」参照) なので、常に1 (<<100)
です。experimental
アーカイブにある特定パッケージを次回アップグレード時に自動的に追跡しようとしない限り、"/etc/apt/preferences
"
ファイル中で experimental
アーカイブを使うために Pin-Priority
値を明示的に設定する必要はありません。
stable
(squeeze
)
のためのアップグレードパッケージを提供する、squeeze-updates と backports.debian.org アーカイブがあります。
squeeze-backports
等の NotAutomatic
アーカイブの中にあるパッケージ全てを使ってはいけません。あなたの必要性に適合する選択されたパッケージだけを使います。
次に squeeze
と
squeeze-updates
を追跡しながら
squeeze-backports
にある特定の新規アップストリームバージョンのパッケージを取り込む apt-pinning テクニックの例を示します。すべての必要なアーカイブを
"/etc/apt/sources.list" ファイルに次のようにリストします。
deb http://ftp.us.debian.org/debian/ squeeze main contrib non-free deb http://security.debian.org/ squeeze/updates main contrib deb http://ftp.us.debian.org/debian/ squeeze-updates main contrib non-free deb http://backports.debian.org/debian-backports/ squeeze-backports main contrib non-free
backports.debian.org アーカイブのデフォールトの
Pin-Priority 値は、NotAutomatic アーカイブ (「アーカイブレベルの "Release" ファイル」参照) なので、常に1 (<<100) です。backports.debian.org
アーカイブにある特定パッケージを次回アップグレード時に自動的に追跡しようとしない限り、"/etc/apt/preferences
"
ファイル中で backports.debian.org
アーカイブを使うために Pin-Priority 値を明示的に設定する必要はありません。
"<package-name>
" という名前のパッケージをその依存関係ともども
squeeze-backports
アーカイブからインストールしたい時には、"-t
"
オプションでターゲットリリースを切り替えながら次のコマンドを使います。
$ sudo apt-get install -t squeeze-backports <package-name>
特定のパッケージをアップグレードしたいときには、"/etc/apt/preferences
"
ファイルを作成しその中に全てのパッケージを次のように明示的にリストしなければいけません。
Package: <package-1> Pin: release o=Backports.org archive Pin-Priority: 700
また、"/etc/apt/preferences
" ファイルを次のようにしてもよい。
Package: * Pin: release a=stable , o=Debian Pin-Priority: 500 Package: * Pin: release a=squeeze-updates, o=Debian Pin-Priority: 500 Package: * Pin: release a=squeeze-backports, o=Backports.org archive Pin-Priority: 200
"apt-get upgrade
" と "apt-get
dist-upgrade
" ("aptitude safe-upgrade
" と
"aptitude full-upgrade
") の実行は、stable
アーカイブからインストールされたパッケージを最新の stable
アーカイブを使ってアップグレードし、他のアーカイブからインストールされたパッケージを最新の
"/etc/apt/sources.list
"
ファイルに記載された全てのアーカイブの最新の対応するアーカイブを使ってアップグレードします。
apt
パッケージには、パッケージの自動ダウンロードのサポートする専用の cron スクリプト
"/etc/cron.daily/apt
" が同梱されています。このスクリプトは
unattended-upgrades
パッケージをインストールすることで自動アップグレード実行の機能拡張をします。これらは、"/usr/share/doc/unattended-upgrades/README
"
に記述されているように、"/etc/apt/apt.conf.d/02backup
" と
"/etc/apt/apt.conf.d/50unattended-upgrades
"
の中のパラメーターでカスタム化できます。
unattended-upgrades
パッケージは基本的に stable
システムのセキュリティーアップグレードのためです。既存の stable
システムが、自動アップグレードで壊される危険性が、セキュリティーアップグレードがすでに閉じたセキュリティーホールからの侵入者によりシステムが壊わされる危険性より小さいなら、パラメーターを次のように設定して自動アップグレードをするのも一計です。
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Download-Upgradeable-Packages "1"; APT::Periodic::Unattended-Upgrade "1";
unstable
システムを使っている場合には、自動アップグレードするとシステムはいつの日か確実に壊われるので、それはしたくないでしょう。そんな
unstable
の場合でも、次に記すような事前にパッケージをダウンロードするパラメーターを設定でインタラクティブなアップグレードをするための時間を節約したいでしょう。
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Download-Upgradeable-Packages "1"; APT::Periodic::Unattended-Upgrade "0";
APT によるダウンロードのバンド幅を例えば 800Kib/sec (=100kiB/sec) に制限したい場合には、APT のパラメーターを次のように設定します。
APT::Acquire::http::Dl-Limit "800";
Debian では設計としてはダウングレードを正式にサポートしません。緊急の復元処置の一部としてのみ実行されるべきです。こういう状況であるにもかかわらず、多くの場合にうまく機能することが知られています。重要なシステムでは回復処置の後に全ての重要データーをバックアップし、最初から新規システムを再インストールします。
壊れたシステムアップグレードからの復元するために、候補バージョンを操作して新しいアーカイブから古いアーカイブにダウングレードすることがうまくいくかもしれません
(「候補バージョンの調整」参照)。これは、何度も "dpkg -i
<broken-package>_<old-version>.deb
"
コマンドを実行する退屈な作業をしないでよくする方法です (「dpkg コマンドを使っての救済」参照)。
次に記すような "unstable
" を追跡する
"/etc/apt/sources.list
" ファイル中の行を探します。
deb http://ftp.us.debian.org/debian/ sid main contrib non-free
それを testing
を追いかけるように次と交換します。
deb http://ftp.us.debian.org/debian/ wheezy main contrib non-free
"/etc/apt/preferences
" を次のように設定します。
Package: * Pin: release a=testing Pin-Priority: 1010
そして、"apt-get dist-upgrade
"
を実行して、システム全体にわたってパッケージのダウングレードを強制します。
この緊急ダウングレードの後でこの特別の "/etc/apt/preferences
" ファイルを削除します。
依存関係の問題を最小限とすべく、できるだけ多くのパッケージを削除 (remove で、完全削除 purge ではありません!) します。システムのダウングレードのためには手動でいくつかのパッケージを削除とインストールしなければいけないかも知れません。Linux カーネルやブートローダーや udev や PAM や APT やネットワーク関係のパッケージやそれらの設定ファイルには特に注意が必要です。
"/var/lib/dpkg/available
" や
"/usr/share/doc/package_name/changelog
" の中にリストされたメンテナの名前は
"誰がパッケージ化活動の背後にいるのか"
に関していくばくかの情報を提供しますが、パッケージを実際にアップロードをした人がはっきりしません。devscripts
パッケージ中の who-uploads
(1) は Debian
のソースパッケージを実際にアップロードした人を確定します。
ソースからプログラムをコンパイルして Debian パッケージを置換えたい際には、それを実際にローカルで Debian 化してパッケージ
(*.deb
) して、私的アーカイブを使うのが好ましいです。
しかし、プログラムをソースからコンパイルして "/usr/local
"
にインストールすることを選んだ際には、パッケージ依存関係を満足させるための最後の手段として equivs
を使う必要があるかもしれません。
Package: equivs Priority: extra Section: admin Description: Circumventing Debian package dependencies This is a dummy package which can be used to create Debian packages, which only contain dependency information.
stable
システムの部分アップグレードのためには、その環境内でソースパッケージを使ってパッケージをリビルドするのが好ましいです。こうすることでパッケージ依存関係による大掛かりなアップグレードをしないで済みます。
stable
システムのための
"/etc/apt/sources.list
" ファイルに次のエントリーを追加します。
deb-src http://http.us.debian.org/debian unstable main contrib non-free
コンパイルするのに必要なパッケージをインストールしソースパッケージをダウンロードをします。
# apt-get update # apt-get dist-upgrade # apt-get install fakeroot devscripts build-essential $ apt-get build-dep foo $ apt-get source foo $ cd foo*
必要があればパッケージを調整しましょう
次を実行します。
$ dch -i
"+bp1
" を後ろに付けるなどして、"debian/changelog
"
中でパッケージバージョンを先に進める
次のようにしてパッケージをビルドしシステムにインストールします。
$ debuild $ cd .. # debi foo*.changes
Debian アーカイブの特定サブセクション全てをミラーするとディスク空間とネットワークのバンド幅の大いなる無駄遣いですので、LAN 上に多くのシステムを管理している際には APT
のためのローカルのプロキシサーバーを設置することを考えるのは良いことです。APT は、apt.conf
(5) とか
"/usr/share/doc/apt/examples/configure-index.gz
"
に説明されたようにして、汎用の squid
のような ウェッブ (http) プロキシサーバー (「他のネットワークアプリケーションサーバー」参照)
を使うように設定できます。"$http_proxy
"
環境変数による設定は、"/etc/apt/apt.conf
" ファイル中の設定より優先します。
Debian アーカイブ専用のプロキシツールがあります。実際に使う前に BTS をチェック下さい。
表2.19 Debian アーカイブ専用のプロキシツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
approx *
|
V:0.3, I:0.3 | 3896 | Debian アーカイブファイルのキャッシュプロキシサーバー (コンパイルされた OCaml プログラム) |
apt-cacher *
|
V:0.3, I:0.4 | 308 | Debian パッケージとソースファイルのキャッシュプロキシ (Perl プログラム) |
apt-cacher-ng *
|
V:0.3, I:0.4 | 1092 | ソフトウエアーパッケージの頒布ためのキャッシュプロキシ (コンパイルされた C++ プログラム) |
debtorrent *
|
V:0.12, I:0.17 | 1185 | Debian パッケージのための bittorrent プロキシ (Python プログラム) |
Debian がそのアーカイブ構造を再編した際に、このような専用のプロキシツールはパッケージメンテナによるコードの修正が必要で、一定期間使えなくなることがあります。一方、汎用のウェッブ (http) プロキシは比較的堅牢ですしそのような変化に合わすのも簡単です。
近代的なセキュアーAPT システム (「トップレベルの "Release" ファイルと信憑性」参照) と互換性のある小規模のパブリックアーカイブを作る例を次に示します。まず、いくつかの仮定をします。
foo
"
www.example.com
"
apt-utils
や gnupg
等のパッケージ
http://www.example.com/~foo/
" ( →
"/home/foo/public_html/index.html
")
amd64
"
サーバーシステム上で Foo のアーカイブキーを作成します。
$ ssh foo@www.example.com $ gpg --gen-key ... $ gpg -K ... sec 1024D/3A3CB5A6 2008-08-14 uid Foo (ARCHIVE KEY) <foo@www.example.com> ssb 2048g/6856F4A7 2008-08-14 $ gpg --export -a 3A3CB5A6 >foo.public.key
Foo に関するキー ID"3A3CB5A6
" のアーカイブキーファイル
"foo.public.key
" を公開
"Origin: Foo" というアーカイブツリーを作成します。
$ umask 022 $ mkdir -p ~/public_html/debian/pool/main $ mkdir -p ~/public_html/debian/dists/unstable/main/binary-amd64 $ mkdir -p ~/public_html/debian/dists/unstable/main/source $ cd ~/public_html/debian $ cat > dists/unstable/main/binary-amd64/Release << EOF Archive: unstable Version: 4.0 Component: main Origin: Foo Label: Foo Architecture: amd64 EOF $ cat > dists/unstable/main/source/Release << EOF Archive: unstable Version: 4.0 Component: main Origin: Foo Label: Foo Architecture: source EOF $ cat >aptftp.conf <<EOF APT::FTPArchive::Release { Origin "Foo"; Label "Foo"; Suite "unstable"; Codename "sid"; Architectures "amd64"; Components "main"; Description "Public archive for Foo"; }; EOF $ cat >aptgenerate.conf <<EOF Dir::ArchiveDir "."; Dir::CacheDir "."; TreeDefault::Directory "pool/"; TreeDefault::SrcDirectory "pool/"; Default::Packages::Extensions ".deb"; Default::Packages::Compress ". gzip bzip2"; Default::Sources::Compress "gzip bzip2"; Default::Contents::Compress "gzip bzip2"; BinDirectory "dists/unstable/main/binary-amd64" { Packages "dists/unstable/main/binary-amd64/Packages"; Contents "dists/unstable/Contents-amd64"; SrcPackages "dists/unstable/main/source/Sources"; }; Tree "dists/unstable" { Sections "main"; Architectures "amd64 source"; }; EOF
あなたのサーバーシステム上の APT アーカイブ内容の繰り返しアップデートは dupload
を設定することで自動化できます。
次に示す内容の "~/.dupload.conf
" を設定したクライアントで "dupload
-t foo changes_file
" を実行して、全てのパッケージファイルを
"~foo/public_html/debian/pool/main/
" に設置します。
$cfg{'foo'} = { fqdn => "www.example.com", method => "scpb", incoming => "/home/foo/public_html/debian/pool/main", # The dinstall on ftp-master sends emails itself dinstall_runs => 1, }; $cfg{'foo'}{postupload}{'changes'} = " echo 'cd public_html/debian ; apt-ftparchive generate -c=aptftp.conf aptgenerate.conf; apt-ftparchive release -c=aptftp.conf dists/unstable >dists/unstable/Release ; rm -f dists/unstable/Release.gpg ; gpg -u 3A3CB5A6 -bao dists/unstable/Release.gpg dists/unstable/Release'| ssh foo@www.example.com 2>/dev/null ; echo 'Package archive created!'";
dupload
(1) が起動する postupload フックスクリプトがアップロード毎に更新されたアーカイブファイルを作成します。
この小規模のパブリックアーカイブをクライアントシステムの apt 行に追加できます。
$ sudo bash # echo "deb http://www.example.com/~foo/debian/ unstable main" \ >> /etc/apt/sources.list # apt-key add foo.public.key
もしローカルファイルシステム上にアーカイブがある場合には、上記の代わりに "deb file:///home/foo/debian/
…
" が使えます。
パッケージと debconf の選択状態のローカルコピーは次に記すようにして作成できます。
# dpkg --get-selections '*' > selection.dpkg # debconf-get-selections > selection.debconf
ここで、"*
" は"selection.dpkg
" が"purge"
に関するパッケージ項目も含めるようにします。
これら2ファイルを他のコンピューターに移動し、次のようにしてインストールします。
# dselect update # debconf-set-selections < myselection.debconf # dpkg --set-selections < myselection.dpkg # apt-get -u dselect-upgrade # or dselect install
実質的に同じ設定でクラスターとなった多くのサーバーを管理することをお考えの場合には、専用パッケージである fai
等を使って全システムを管理することを考えます。
alien
(1) を使うと、Red Hat の rpm
や Stampede
の slp
や Slackware の tgz
や Solaris の
pkg
ファイルフォーマットを Debian の deb
パッケージに変換できます。あなたのシステムにインストールしたパッケージに替えて他の Linux
ディストリビューション由来のパッケージを使いたい際には、alien
を使って変換しインストールします。alien
は LSB パッケージをサポートします。
alien
(1) は sysvinit
や
libc6
や libpam-modules
等の必須のシステムパッケージを置き換えるために使うべきではありません。実質的には alien
(1) は、LSB
準拠か静的にリンクされた non-free
のバイナリーのみで提供されるパッケージにのみ使われるべきです。フリーソフトの場合は、ソースパッケージを使い本物の Debian
パッケージを作るべきです。
現行の "*.deb
" パッケージの内容は、どんな Unix
的環境でも標準の ar
(1) と tar
(1)
を使うことで、dpkg
(1) を使うこと無く開梱できます。
# ar x /path/to/dpkg_<version>_<arch>.deb # ls total 24 -rw-r--r-- 1 bozo bozo 1320 2007-05-07 00:11 control.tar.gz -rw-r--r-- 1 bozo bozo 12837 2007-05-07 00:11 data.tar.gz -rw-r--r-- 1 bozo bozo 4 2007-05-07 00:11 debian-binary # mkdir control # mkdir data # tar xvzf control.tar.gz -C control # tar xvzf data.tar.gz -C data
パッケージの内容は mc
コマンドを使っても閲覧できます。
パッケージ管理に関しては次の文書からさらに学習できます。
パッケージ管理の一義的文書:
aptitude
(8) と dpkg
(1) と
tasksel
(8) と apt-get
(8) と
apt-config
(8) と apt-key
(8) と
sources.list
(5) と apt.conf
(5) と
apt_preferences
(5);
/usr/share/doc/apt-doc/guide.html/index.html
" と
"/usr/share/doc/apt-doc/offline.html/index.html
" from the
apt-doc
package;
aptitude-doc-en
パッケージに入っている、"/usr/share/doc/aptitude/html/en/index.html
"。
正規で詳細な Debian アーカイブに関する文書:
Debian ユーザー向けの Debian パッケージ作成の入門書:
Debian システムが以下に起動され設定されるかの知っていることはシステム管理者として賢明です。正確で詳細な情報がインストールされたパッケージのソースや文書中にあるとは言え、我々の大部分にとってはちょっと大変過ぎます。
著者などの過去の知見に基づき Debian システムの要点とそれらの設定の簡単な参考となる概論を提供するように勤めました。Debian システムは動く標的なので、システムの状況が変わっているかもしれません。システムに変更を加える前に、各パッケージの最新文書を参照下さい。
コンピューターシステムは、電源投入イベントからユーザーに機能の完備したオペレーティングシステム (OS) を提供するまでブートストラッププロセスを数段通過します。
単純化のため、デフォールトのインストールをした典型的な PC プラットフォームに限定し議論します。
典型的なブートストラッププロセスは4段ロケットのようです。各段のロケットは次の段のロケットにシステムのコントロールを引き継ぎます。
もちろん、これらに関して異なる設定をすることはできます。例えば、自分自身で専用カーネルをコンパイルした場合、ミニ Debian システムのステップをスキップできます。自分自身で確認するまでは、あなたのシステムがこの様になっていると決めつけないで下さい。
伝統的な PC プラットフォームでない SUN とか Macintosh システム等では、ROM 上の BIOS やディスク上のパーティション (「ディスクパーティション設定」) が非常に異なっているかもしれません。そのような場合にはプラットフォーム特定の文書をどこかで求めて下さい。
BIOS は電源投入イベントが引き起こすブートプロセスの1段目です。CPU のプログラムカウンターが電源投入イベントで初期化され、読出し専用メモリー (ROM) 上にあるBIOS が特定のメモリーアドレスから実行されます。
BIOS はハードウエアーの基本的な初期化 (POST: 電源投入時自己診断) を行い、システムのコントロールをあなたが提供する次のステップにシステムのコントロールを引き継ぎます。BIOS は通常ハードウエアーによって供給されます。
BIOS 初期画面はどのキーを押すと BIOS 設定画面に入って BIOS の挙動を設定できるかを通常表示しています。よく使われるキーは F1 や F2 や F10 や Esc や Ins や Del です。もし BIOS 初期画面が洒落た画像表示で隠されている場合、Esc 等の何らかのキーをおすとこれを無効にできます。こういったキーはハードウエアーに大いに依存します。
BIOS が起動するコードのハードウエアー上の場所や優先順位は BIOS 設定画面から選択できます。典型的には最初に見つかった選択されたデバイス (ハードディスクやフロッピーディスクや CD-ROM 等) の最初の数セクターがメモリー上にロードされこの初期コードが実行されます。この初期コードは次のいずれでもよろしい。
典型的にはプライマリハードディスクの指定されたパーティションからシステムが起動されます。伝統的 PC のハードディスクの最初の2セクターにマスターブートレコード (MBR) が含まれます。ブート選択に含まれるディスクのパーティション情報はこの MBR の最後に記録されています。BIOS から実行される最初のブートローダーコードは残りの部分を占めます。
ブートローダーは BIOS によって起動されるブートプロセスの2段目です。それはシステムのカーネルイメージと initrd イメージをメモリーにロードし、それらにコントロールを引き継ぎます。この initrd イメージはルートファイルシステムイメージで、そのサポートは使われるブートローダー次第です。
Debian システムは通常 Linux カーネルをデフォールトのシステムカーネルとして使っています。現在の 2.6 カーネルにとっての initrd イメージは技術的に言うなら initramfs (初期 RAM ファイルシステム) イメージです。initramfs イメージはルートファイルシステム中のファイルの gzip された cpio アーカイブです。
Debian システムのデフォールトインストールでは、GRUB ブートローダーの1段目のコードを PC プラットホームの MBR の中に置きます。多くのブートローダーと設定の選択肢があります。
表3.1 ブートローダーのリスト
ブートローダー | パッケージ | ポプコン | サイズ | initrd | 説明 |
---|---|---|---|---|---|
GRUB Legacy | grub-legacy * | V:0.4, I:1.1 | 1984 | サポート |
ディスクパーティションや vfat や ext3 等のファイルシステムを理解するぐらいスマートです。(lenny
のデフォールト)
|
GRUB 2 | grub-pc * | V:7, I:25 | 2480 | サポート | ディスクパーティションや vfat や ext3 等のファイルシステムを理解するぐらいスマートです。 |
GRUB 2 | grub-rescue-pc * | V:0.04, I:0.5 | 3896 | サポート | GRUB 2 のブート可能なレスキューイメージ (CD とフロッピー) (PC/BIOS バージョン) |
Lilo | lilo * | V:0.5, I:2 | 1236 | サポート | ハードディスク上のセクター位置に依存します。(旧式) |
Isolinux | syslinux * | V:1.3, I:8 | 204 | サポート | ISO9660 ファイルシステムを理解します。ブート CD に使われています。 |
Syslinux | syslinux * | V:1.3, I:8 | 204 | サポート | MSDOS ファイルシステム (FAT) 理解します。ブートフロッピーで使われます。 |
Loadlin | loadlin * | V:0.03, I:0.2 | 144 | サポート | 新しいシステムが FreeDOS/MSDOS システムから起動されます。 |
Neil Turton の MBR | mbr * | V:0.8, I:5 | 96 | 非サポート | MSDOS の MBR を代替するフリーソフトです。ディスクパーティションを理解するだけです。 |
grub-rescue-pc
パッケージのイメージから作ったブート可能なレスキューメディア (CD かフロッピー)
無しにブートローダーを試してはいけません。これさえあると、ハードディスク上に機能するブートローダーが無くともシステムの起動ができます。
GRUB Legacy のメニューの設定は "/boot/grub/menu.lst
"
にあります。例えば、次のような内容です。
title Debian GNU/Linux root (hd0,2) kernel /vmlinuz root=/dev/hda3 ro initrd /initrd.img
GRUB 2 のメニューの設定は "/boot/grub/grub.cfg
" にあります。
"/etc/grub.d/*
" の雛形と
"/etc/default/grub
" の設定から
"/usr/sbin/update-grub
" を使って自動的に作られます。例えば、次のような内容です。
menuentry "Debian GNU/Linux" { set root=(hd0,3) linux /vmlinuz root=/dev/hda3 initrd /initrd.img }
これらの例で、これらの GRUB パラメーターは次の意味です。
表3.2 GRUB パラメーターの意味
GRUB パラメーター | 意味 |
---|---|
root
|
GRUB legacy では "(hd0,2) " また GRUB 2 では
"(hd0,3) " と設定することでプライマリディスクの3つ目のパーティションを使用
|
kernel
|
カーネルパラメーター "root=/dev/hda3 ro " とともに
"/vmlinuz " にあるカーネルを使用
|
initrd
|
"/initrd.img " にある initrd/initramfs イメージを使用
|
GRUB legacy プログラムが使うパーティション値は Linux カーネルやユーティリティーツールが使う値より1つ少ない数字です。GRUB 2 プログラムはこの問題を修正します。
UUID (「UUID を使ってパーティションをアクセス」参照)
は、"/dev/hda3
" のようなファイル名に代わるブロックの特定デバイスを確定するのに使え、例えば
"root=UUID=81b289d5-4341-4003-9602-e254a17ac232 ro
" です。
チェインロード (連鎖導入) とよばれる技術を使うと、あるブートローダーから他のブートローダーを起動できます。
"info grub
" と grub-install
(8) を参照下さい。
ミニ Debian システムはブートローダーによって起動されるブートプロセスの3段目です。メモリー上でルートファイルシステムとともにシステムカーネルを実行します。これはオプションの起動プロセスの準備段階です。
"ミニ Debian システム" は著者がこの3段目のブートプロセスを本文書中で記述するために作った言葉です。このシステムは一般に initrd とか initramfs システムと呼ばれています。類似のメモリー上のシステムは Debian インストーラーでも使われています。
"/init
"
スクリプトはこのメモリー上のルートファイルシステムで最初に実行されるプログラムです。それはユーザー空間でカーネルを初期化し次の段階にコントロールを引き継ぐシェルプログラムです。このミニ
Debian
システムは、メインのブートプロセスが始まる前にカーネルモジュールを追加したり、ルートファイルシステムを暗号化されたファイルシステムとしてマウントする等のブートプロセスの柔軟性を提供します。
"break=init
" 等をカーネルブートパラメーターとして与えると、本部分のブートプロセスに割り込み root
シェルを獲得できます。この他の割り込み条件は "/init
"
スクリプトを参照下さい。このシェル環境はあなたの機器のハードウエアーを詳細に検査できるだけ十分洗練されています。
ミニ Debian システムは機能を削ったシステムで、主に busybox
(1) という GNU
ツールで提供されます。
読出しのみのルートファイルシステム上では、mount
コマンドには "-n
"
オプションを使う必要があります。
表3.3 Debian システムののブートユーティリティーのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
initscripts *
|
V:91, I:99 | 284 | システムの始動と停止のためのスクリプト |
sysvinit *
|
V:85, I:99 | 208 |
System-V 的な init (8) ユーティリティー
|
sysv-rc *
|
V:91, I:99 | 300 | System-V 的なランレベル変更メカニズム |
sysvinit-utils *
|
V:91, I:99 | 224 |
System-V 的なユーティリティー
(startpar (8)、bootlogd (8)、…)
|
lsb-base *
|
V:91, I:99 | 36 | Linux Standard Base 3.2 の init スクリプト機能 |
insserv *
|
V:22, I:26 | 292 | LSB init.d スクリプト依存関係を使いブート順序を整理するツール |
upstart *
|
V:0.15, I:0.2 | 700 |
並行処理のためのイベント依存の init (8) デーモン (sysvinit
代替)
|
readahead-fedora *
|
V:0.3, I:0.5 | 144 | ブートプロセスファイルをプリロードする readahead (8)
|
uswsusp *
|
V:4, I:14 | 536 | Linux が提供するユーザースペースソフトウエアーによるサスペンドを使うためのツール |
kexec-tools *
|
V:0.17, I:0.5 | 320 |
kexec (8) リブートのための kexec ツール (ワームリブート)
|
bootchart *
|
V:0.13, I:0.7 | 132 | ブートプロセスのパーフォンマンスアナライザー |
bootchart-view *
|
V:0.10, I:0.6 | 280 | ブートプロセスのアナライザー (可視化) |
mingetty *
|
V:0.2, I:0.5 | 64 |
コンソール専用 getty (8)
|
mgetty *
|
V:0.19, I:0.6 | 416 |
インテリジェントモデム用の代替 getty (8)
|
本セクションは、古典的 System V スタイルの
lenny
上のブートシステムについての記述です。Debian
はイベントドリブンのブートシステムに移行中です。The
future of the boot system in Debian と Dependency based boot sequence
を参照下さい。
"/etc/init.d/rc
" と "/etc/init.d/rcS
" と
"/usr/sbin/update-rc.d
" と
"/usr/sbin/invoke-rc.d
" のスクリプトによって全てのブートメカニズムには互換性があります。
readahead-fedora
パッケージは適量の DRAM のあるシステムの起動を高速化できます。
通常の Debian システムはミニ Debian システムによって起動されるブートプロセスの4段目です。ミニ Debian システムのシステムカーネルはこの環境ででも実行され続けます。ルートファイルシステムはメモリー上から本当にハードディスク上にあるファイルシステムに切り替えられます。
"/sbin/init
"
プログラムが最初のプログラムとして実行され、メインのブートプロセス遂行します。Debian は通常 sysv-rc
による伝統的な sysvinit スキームを使います。詳細な説明は、init
(8) と
inittab
(5) と
"/usr/share/doc/sysv-rc/README.runlevels.gz
"
を参照下さい。次にこのメインのブートプロセスの簡略化した概論を記します。
/etc/inittab
" の記述にしたがいシステムを初期化します。
マルチユーザーモードで使われる最初のランレベルランレベルは、"init=
"
というカーネルブートパラメーターもしくは "/etc/inittab
" の"initdefault"
行で指定されます。インストールされたままの Debian システムはランレベル 2
でスタートします。
init システムが実行する全ての実際のスクリプトファイルは "/etc/init.d/
"
ディレクトリーの中にあります。
各ランレベルはその設定に1つのディレクトリーを使い次に記す特定の意味があります。
表3.4 ランレベルとその用途説明のリスト
ランレベル | ディレクトリー | ランレベル用途の説明 |
---|---|---|
N
|
無し |
システムのブートアップ (無し) レベル ("/etc/rcN.d/ " ディレクトリーは無し)
|
0
|
/etc/rc0.d/
|
システム停止 |
S
|
/etc/rcS.d/
|
ブート時のシングルユーザーモード (別名: "s ")
|
1
|
/etc/rc1.d/
|
マルチユーザーモードから切り替えたシングルユーザーモード |
2
|
/etc/rc2.d/
|
マルチユーザーモード |
3
|
/etc/rc3.d/
|
,, |
4
|
/etc/rc4.d/
|
,, |
5
|
/etc/rc5.d/
|
,, |
6
|
/etc/rc6.d/
|
システム再起動 |
7
|
/etc/rc7.d/
|
有効なマルチユーザーモードだが通常不使用 |
8
|
/etc/rc8.d/
|
,, |
9
|
/etc/rc9.d/
|
,, |
コンソールからランレベルを、例えば4に、次のようにして変更できます。
$ sudo telinit 4
Debian システムは2から5のランレベル間で如何なる意味の違いも事前に付与しません。Debian システムのシステム管理者はこれに変更を加えられます。(つまり Debian は、Red Hat Linux とも Sun Microsystems 社の Solaris とも Hewlett Packard 社の HP-UX とも IBM 社の AIX とも…違います。)
Debian システムは7から9のランレベルに対応するディレクトリーをパッケージインストール時に充足することはありません。伝統的な Unix バリアントはこれらのランレベルを使いません。
Debian の squeeze
では、アルファベット順ではなく
insserv
パッケージで提供される依存関係基準のブート順が使われます。"/etc/default/rcS
" 中の
"CONCURRENCY
" 値がその並行処理をコントロールします: 並行処理無しは
"none
"、同一順位番号間の並行処理は
"startpar
"、完全な並行処理は
"makefile
"。"/usr/share/doc/insserv/README.Debian
"
を参照下さい。
ランレベルのディレクトリー中のシムリンク名前は、"S<2-digit-number><original-name>
"
か "K<2-digit-number><original-name>
"
という形式となっています。2桁数字はスクリプトの実行順序決定に使われます。"S
" は"スタート (Start)"
と言う意味で、"K
" は"停止 (Kill)" と言う意味です。
"CONCURRENCY=none
" の場合、init
(8) か
telinit
(8) コマンドがランレベルを "<n>" に変更すると、次のスクリプトを実行します。
/etc/rc<n>.d/
" 中の "K
"
で始まるスクリプト名が、"stop
" のみを引数としてアルファベット順に実行されます。(サービス停止)
/etc/rc<n>.d/
" 中の "S
"
で始まるスクリプト名が、"start
" のみを引数としてアルファベット順に実行されます。(サービス開始)
例えば、ランレベルのディレクトリーに "S10sysklogd
" と
"S20exim4
" があった時に、"../init.d/exim4
"
にシムリンクされた "S20exim4
"
の前に、"../init.d/sysklogd
" にシムリンクされた
"S10sysklogd
" が実行されます。
"CONCURRENCY=makefile
" (新デフォルト) の場合、init
スクリプトのヘッダーで定義されたパッケージの依存関係がパッケージの順付けに用いられます。
メンテナよりあなたのほうが知識があるのでもなければ "/etc/rcS.d/
"
の中のシムリンクに変更を加えようとするのはお勧めできません。
例えば、次に示す Red Hat Linux のようなランレベルを設定してみます。
init
はデフォールトとしてランレベル =3 でシステムを起動します。
init
はランレベル =(0,1,2,6) で gdm
(1)
を起動しません。
init
はランレベル =(3,4,5) で gdm
(1) を起動します。
これは、"/etc/inittab
"
ファイルをエディターで変更して起動するランレベル変更し、sysv-rc-conf
や
bum
等の使いやすいランレベル管理ツールを使ってランレベルを編集することでできます。こうする代わりにコマンドラインだけを使うなら、(gdm
パッケージをデフォールトでインストールしディスプレーマネージャーとして選択した後に) 次に示すようにします。
# cd /etc/rc2.d ; mv S21gdm K21gdm # cd /etc ; perl -i -p -e 's/^id:.:/id:3:/' inittab
ディスプレーマネージャーデーモン (xdm
や gdm
や
kdm
や wdm
)
が起動される際には、"/etc/X11/default-display-manager
"
ファイル内容を確認する事を覚えておいて下さい。
startx
(1) コマンドを使えば、どのコンソールシェルからも X が起動できます。
"/etc/init.d/
" の中の各 init
スクリプトのデフォールトパラメーターは、"/etc/default/
"
の中の環境変数のアサインメントのみを含む対応ファイルによって与えられます。このディレクトリー名の選択は Debian
システム特定です。それは、Red Hat Linux
や他のディストリビューションで使われる "/etc/sysconfig
"
ディレクトリーにほぼ相当します。例えば、"/etc/default/cron
" を使うと
"/etc/init.d/cron
" がどう機能するかを制御できます。
"/etc/default/rcS
" ファイルを使うと motd
(5) や
sulogin
(8) 等のブート時のデフォールトをカスタム化できます。
もしそのような変数の変更で希望の挙動が得られない場合には、init スクリプト自体を変更することができます。これらスクリプトは管理者が編集可能な設定ファイルです。
カーネルがシステムのホスト名を維持管理します。ランレベル S の
"/etc/init.d/hostname.sh
" にシムリンクされた init
スクリプトは、(hostname
コマンドを使って)
"/etc/hostname
"
に保存された名前を使ってブート時にホスト名を設定します。このファイルには、完全修飾ドメイン名ではなく、システムのホスト名のみが含まれているべきです。
現在のホスト名を確認するには、hostname
(1) を引数無しで実行します。
ルートファイルシステムはカーネル起動時にカーネルによってマウントされますが、他のファイルシステムは次の init スクリプトでランレベル S 中でマウントされます。
/proc
" と "/sys
"
等中のカーネルファイルシステムに関しては、"`/etc/init.d/mountkernfs.sh
"
/dev
"
中の仮想ファイルシステムに関しては、"`/etc/init.d/mountdevsubfs.sh
"
/etc/fstab
" を使う普通のファイルシステムに関しては
"`/etc/init.d/mountall.sh
"
/etc/fstab
" を使うネットワークファイルシステムに関しては
"/etc/init.d/mountnfs.sh
"
ファイルシテムのマウントオプションは "/etc/fstab
" で設定されます。「マウントオプションによるファイルシステムの最適化」を参照下さい。
ネットワークファイルシステムの実際のマウントはネットワークインターフェースの起動を待ちます。
各ブートアップごとに、全てのファイルシステムをマウントした後で、"/tmp
" と
"/var/lock
" と "/var/run
"
中の一時ファイルはクリーンされます。
ネットワークインターフェースはランレベル S で "/etc/init.d/ifupdown-clean
" と
"/etc/init.d/ifupdown
" にシムリンクされた init
スクリプトよって初期化されます。それらの設定に関しては、5章ネットワークの設定を参照下さい。
多くのネットワークサービス (6章ネットワークアプリケーション参照) はブート時に、例えば
"/etc/init.d/exim4
" にシムリンクされている
"/etc/rc2.d/S20exim4
" (RUNLEVEL=2 の場合) 等という、マルチユーザーモード下の
init スクリプトによってデーモンプロセスとして起動されます。
ネットワークサービスの一部はスーパーサーバー、inetd
(もしくはその同等)
を用いて必要に応じて起動されます。inetd
は、"/etc/init.d/inetd
" にシムリンクされた
"/etc/rc2.d/S20inetd
" (RUNLEVEL=2 の場合)
によってブート時に起動されます。基本的に、inetd
は一つの実行デーモンにより複数の他デーモンを起動できるようにすることで、システムのロードを下げます。
サービス要求がスーパーサーバー inetd
に到達する度に、そのプロトコルとサービスが "/etc/protocols
" と
"/etc/services
" というデーターベースを照覧することで確認されます。さらに
inetd
は、"/etc/inetd.conf
"
の中にある通常のインターネットサービスか、"/etc/rpc.conf
" の中にある Sun RPC 準拠サービスを照覧します。
時々、inetd
が対象となるサーバーを直接起動せずに、対象となるサーバー名を
"/etc/inetd.conf
" 中に引数とし記載したTCP
デーモンラッパープログラム tcpd
(8)
を起動することがあります。この様な場合には、tcpd
は要求を記録し
"/etc/hosts.deny
" や "/etc/hosts.allow
"
を用いた追加確認後で適切なサーバープログラムを起動します。
システムのセキュリティーのためにできるだけ多くのネットワークサービスを無効にします。「サーバーのサービスへのアクセスの制限」を参照下さい。
inetd
(8) と inetd.conf
(5) と
protocols
(5) と services
(5) と
tcpd
(8) と hosts_access
(5) と
hosts_options
(5) と rpcinfo
(8) と
portmap
(8) と
"/usr/share/doc/portmap/portmapper.txt.gz
" を参照下さい。
ログファイルとスクリーン上の両方のシステムメッセージに関して、 "/etc/default/syslogd
" と
"/etc/syslog.conf
"
によってカスタム化できます。syslogd
(8) と
syslog.conf
(5) を参照下さい。さらに「ログアナライザー」を参照下さい。
ログファイルとスクリーン上の両方のカーネルメッセージに関して、"/etc/default/klogd
"
によってカスタム化できます。このファイル中に "KLOGD='-c 3'
" と設定し
"/etc/init.d/klogd restart
"
を実行します。klogd
(8) を参照下さい。
エラーメッセージのレベルを次に記すように直接変更してもいいです。
# dmesg -n3
表3.5 カーネルエラーレベルのリスト
エラーレベル値 | エラーレベル名 | 意味 |
---|---|---|
0 | KERN_EMERG | システムは不安定 |
1 | KERN_ALERT | 直ぐアクションが必要 |
2 | KERN_CRIT | クリチカルなコンディション |
3 | KERN_ERR | エラーコンディション |
4 | KERN_WARNING | 警告コンディション |
5 | KERN_NOTICE | ノーマルだが重要なコンディション |
6 | KERN_INFO | 情報 |
7 | KERN_DEBUG | デバグレベルのメッセージ |
Linux カーネル 2.6 では、udev
システムがハードウエアーの自動検出と初期化のメカニズムを提供します (udev
(7)
参照)。カーネルが各デバイスを発見すると、udev システムは sysfs ファイルシステム
(「procfs と sysfs」参照)
からの情報を使いユーザープロセスを起動し、modprobe
(8) プログラム (「カーネルモジュール初期化」参照)
を使ってそれをサポートする必要なカーネルモジュールをロードし、対応するデバイスノードを作成します。
もし "/lib/modules/<kernel-version>/modules.dep
"
が何らかの理由で depmod
(8) によって適正に生成されていなかった場合には、モジュールは udev
システムによる期待にそってロードされないかもしれません。これを修正するには、"depmod -a
" を実行します。
デバイスノード名は "/etc/udev/rules.d/
"
の中のファイルによって設定できます。現在のデフォールトのルールは、cd
とネットワークデバイス以外は非静的なデバイス名となる動的生成名を作る傾向があります。cd やネットワークデバイスと同様のカスタムルールを追加することで
USB メモリースティック等の他のデバイスにも静的なデバイス名を生成出来ます。"Writing udev rules" か
"/usr/share/doc/udev/writing_udev_rules/index.html
"
を参照下さい。
udev システムは少々動くターゲットなので、詳細は他のドキュメントに譲り、ここでは最小限の記述に止めます。
"/etc/fstab
"
中のマウントルールでは、デバイス名が静的なデバイス名である必要がありません。"/dev/sda
"
等のデバイス名ではなく UUID を使ってデバイスをマウントできます。「UUID を使ってパーティションをアクセス」を参照下さい。
modprobe
(8) プログラムは、ユーザープロセスからカーネルモジュールを追加や削除することで実行中の
Linux カーネルの設定を可能にします。udev システム (「udev システム」参照)
は、その起動を自動化しカーネルモジュールの初期化を補助します。
"/etc/modules
" ファイル中にリストしてプリロードする必要のある
(modules
(5) 参照)
次に記すような非ハードウエアーや特殊ハードウエアーのドライバーモジュールがあります。
iptables
(8) と 「Netfilter インフラ」) を提供する netfilter モジュール
modprobe
(8)
プログラムのための設定ファイルは、modprobe.conf
(5) で説明されているように
"/etc/modprobes.d/
"
ディレクトリーの下にあります。(あるカーネルモジュールが自動ロードされるのを避けるには、"/etc/modprobes.d/blacklist
"
ファイル中にブラックリストします。)
depmod
(8) プログラムによって生成される
"/lib/modules/<version>/modules.dep
"
ファイルは、modprobe
(8) プログラムによって使われるモジュール依存関係を記述します。
ブート時に modprobe
(8)
を使ってのモジュールロードの問題に出会った場合には、"depmod -a
" として
"modules.dep
" を再構築をするとこの様な問題が解消できるかもしれません。
modinfo
(8) プログラムは Linux カーネルモジュールに関する情報を表示します。
lsmod
(8) プログラムは "/proc/modules
"
の内容を読みやすい形式にして、どのカーネルモジュールが現在ロードされているかを表示します。
あなたのシステム上の正確なハードウエアーを特定します。「ハードウエアーの識別」を参照下さい。
ブート時に期待されるハードウエアー機能を有効となるように設定もできます。「ハードウエアー設定」を参照下さい。
あなたのデバイスのサポートは、カーネルを再コンパイルすれば追加できます。「カーネル」を参照下さい。
人 (またはプログラム) がシステムへのアクセスの要求をした際に、認証はその正体が信頼できるものだと確認します。
PAM の設定のエラーはあなたをあなた自身のシステムから締め出すかも知れません。レスキュー CD を手元に置くか代替ブートパーティション設定を必ずします。復元するには、それらを使ってシステムをブートしそこから修正します。
通常の Unix 認証は PAM
(プラグ可能な認証モジュール) のもとで pam_unix.so
(8)
モジュールによって提供される。":
" で分離されたエントリーを持つその3つの重要な設定ファイルは次です。
表4.1 3つの pam_unix
(8) に関する重要な設定ファイル
ファイル | パーミッション (許可) | ユーザー | グループ | 説明 |
---|---|---|---|---|
/etc/passwd
|
-rw-r--r--
|
root
|
root
|
(浄化された) ユーザーアカウント情報 |
/etc/shadow
|
-rw-r-----
|
root
|
shadow
|
保護されたユーザーアカウント情報 |
/etc/group
|
-rw-r--r--
|
root
|
root
|
グループ情報 |
"/etc/passwd
" ファイルは次の内容です。
... user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash ...
passwd
(5) に説明されているように、このファイルの ":
"
で分離されたエントリーそれぞれは次の意味です。
"/etc/passwd
"
の2番目のエントリーは暗号化したパスワードのエントリーとして使われていました。"/etc/shadow
"
が導入された後は、このエントリーはパスワード規定エントリーとして使われています。
表4.2 "/etc/passwd" の2番目のエントリーの内容
内容 | 意味 |
---|---|
(空白) | パスワード無しアカウント |
x |
暗号化したパスワードは "/etc/shadow " ファイルの中にあります。
|
* | このアカウントへのログイン不可 |
! | このアカウントへのログイン不可 |
"/etc/shadow
" の内容は次です。
... user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7::: user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7::: ...
shadow
(5) で説明されているように、このファイルの ":
"
で分離されたエントリーそれぞれは次の意味です。
$1$
" で始まっているのは MD5
暗号化が使われていることを示します。"*" はログイン不可を示します。)
"/etc/group
" のファイル内容は次です。
group1:x:20:user1,user2
group
(5) に説明されているように、このファイルの ":
"
で分離されたエントリーそれぞれは次の意味です。
"/etc/gshadow
" ファイルは "/etc/shadow
"
ファイルが "/etc/group
" ファイルに対する機能と同様の機能がありますが、実際には使われていません。
もし "authoptionalpam_group.so
" 行が
"/etc/pam.d/common-auth
"
に書き加えれ、"/etc/security/group.conf
"
に対応する設定がされていれば、実際のユーザーのグループメンバーシップは動的に割り当てられます。pam_group
(8)
を参照下さい。
base-passwd
パッケージはユーザーとグループに関する権威のあるリストが含まれます:
"/usr/share/doc/base-passwd/users-and-groups.html
"。
アカウント情報管理のための重要コマンドを記します。
表4.3 アカウント情報を管理するコマンドのリスト
コマンド | 機能 |
---|---|
getent passwd <user_name>
|
"<user_name> " のアカウント情報の閲覧
|
getent shadow <user_name>
|
"<user_name> " のシャドーされたアカウント情報の閲覧
|
getent group <group_name>
|
"<group_name> " のグループ情報の閲覧
|
passwd
|
アカウントのパスワード管理 |
passwd -e
|
アカウント開設のための一回だけ使えるパスワードの設定 |
chage
|
パスワードのエージング情報管理 |
一部機能が機能するには root 権限が必要な場合があります。パスワードとデーターの暗号化は crypt
(3)
を参照下さい。
Debian が提供する alioth 機器と同様な PAM と NSS
の設定をされたシステム上では、ローカルの "/etc/passwd
" や
"/etc/group
" や "/etc/shadow
"
の内容がシステムにアクティブに利用されていないことがあります。
passwd
(1) によるとシステムインストール時や passwd
(1)
コマンドによってアカウント作成する際には、次に記すようなセットからなる6から8文字の良好なパスワードを選択するべきです。
想像できるような単語はパスワードに選択禁止。
ソルトを使って暗号化されたパスワードを生成する独立のツールがあります。
表4.4 パスワード生成ツールのリスト
パッケージ | ポプコン | サイズ | コマンド | 機能 |
---|---|---|---|---|
whois
*
|
V:10, I:88 | 396 |
mkpasswd
|
crypt (3) ライブラリーの充実しすぎたフロントエンド
|
openssl *
|
V:56, I:91 | 2380 |
openssl passwd
|
パスワードハッシュの計算 (OpenSSL)。passwd (1ssl)
|
Debian システムのような最新の Unix 的システムは PAM (プラグ可能な認証モジュール: Pluggable Authentication Modules) と NSS (ネームサービススイッチ: Name Service Switch) メカニズムをローカルのシステム管理者がそのシステム管理用に提供します。それらの役割をまとめると次の様になります。
ls
(1)andid
(1)
等のプログラムがユーザーやグループの名前を得ために C
標準ライブラリー経由で頻用する柔軟なネームサービスメカニズムを提供します。
これらの PAM と NSS システムは一貫した設定が必要です。
PAM と NSS システムに関する注目のパッケージは次です。
表4.5 特記すべき PAM と NSS システムのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
libpam-modules *
|
V:88, I:99 | 1036 | 差し替え可能な認証モジュール (基本サービス) |
libpam-ldap *
|
V:2, I:4 | 408 | LDAP インターフェースを可能にする差し替え可能な認証モジュール |
libpam-cracklib *
|
V:2, I:2 | 104 | cracklib のサポートを可能にする差し替え可能な認証モジュール |
libpam-doc *
|
I:0.6 | 1208 | 差し替え可能な認証モジュール (html と text の文書) |
libc6
*
|
V:97, I:99 | 10012 | GNU C ライブラリー: "ネームサービススイッチ" も提供する共有ライブラリー |
glibc-doc *
|
I:3 | 2008 | GNU C ライブラリー: マンページ |
glibc-doc-reference *
|
I:1.4 | 12156 | GNU C ライブラリー: info と pdf と html フォーマットでのリファレンスマニュアル (non-free) |
libnss-mdns *
|
I:49 | 116 | マルチキャスト DNS を使った名前解決のための NSS モジュール |
libnss-ldap *
|
I:4 | 268 | LDAP をネームサービスとして使う NSS モジュール |
libnss-ldapd *
|
V:0.18, I:0.5 | 144 |
LDAP をネームサービスとして使う NSS モジュール (libnss-ldap の新たなフォーク)
|
libpam-doc
中の "The Linux-PAM System Administrators'
Guide" は PAM 設定を学ぶ上で必須です。
glibc-doc-reference
の中の "System Databases and Name
Service Switch" セクションは NSS 設定を学ぶ上で必須です。
より大規模かつ最新のリストは "aptitudesearch'libpam-|libnss-'
"
コマンドを実行すると得られます。NSS という頭字語は "ネームサービススイッチ: Name Service Switch" と異なる
"ネットワークセキュリティーサービス: Network Security Service" を指すこともあります。
PAM は個別プログラムに関する環境変数をシステム全体のデフォールト値に初期化する最も基本的な手段です。
PAM がアクセスする注目すべき設定ファイルを次に記します。
表4.6 PAM によりアクセスされる設定ファイルのリスト
設定ファイル | 機能 |
---|---|
/etc/pam.d/<プログラム名>
|
"<program_name> " に関する PAM 設定の設定;
pam (7) と pam.d (5) 参照
|
/etc/nsswitch.conf
|
各サービスに関するエントリーによる NSS 設定の設定; nsswitch.conf (5) 参照
|
/etc/nologin
|
ユーザーのログイン制限のために pam_nologin (8) モジュールがアクセス
|
/etc/securetty
|
pam_securetty (8) モジュールにより root アクセスに使う tty を制限
|
/etc/security/access.conf
|
pam_access (8) モジュールによりアクセス制限を設定
|
/etc/security/group.conf
|
pam_group (8) モジュールによりグループに基づく制約を設定
|
/etc/security/pam_env.conf
|
pam_env (8) モジュールにより環境変数を設定
|
/etc/environment
|
"readenv=1 " 引数を付きの pam_env (8)
モジュールによって追加での環境変数を設定
|
/etc/default/locale
|
"readenv=1envfile=/etc/default/locale " 引数を付きの
pam_env (8) モジュールによって追加でロケールを設定します。(Debian)
|
/etc/security/limits.conf
|
pam_linits (8) モジュールによってリソース制限 (ulimit, core, …) を設定
|
/etc/security/time.conf
|
pam_time (8) モジュールによって時間制限を設定
|
パスワード選択の制限は pam_unix
(8) と
pam_cracklib
(8) モジュールで実装されています。それらは引数を使って設定します。
PAM モジュールはファイル名のサフィクスとして ".so
" を使います。
集中化された軽量ディレクトリーアクセスプロトコル (LDAP) を採用することで多くのネットワーク上の Unix 的や非 Unix 的システムを最新の集中システム管理が実現できます。軽量ディレクトリーアクセスプロトコルのオープンソース実装は OpenLDAP ソフトウエアーです。
LDAP サーバーは、libpam-ldap
と libnss-ldap
パッケージで提供される PAM と NSS を使うことで Debian システムにアカウント情報を提供します。この実現ためにはいくつかの設定が必要です
(著者は本設定を使っていないため、次の情報は完全に二次情報です。ご理解の上お読み下さい。)。
slapd
(8) 等のプログラムを走らせることで集中化された
LDAP サーバーを設置します。
デフォールトの "pam_unix.so
" に代えて
"pam_ldap.so
" を使うには "/etc/pam.d/
"
ディレクトリー中の PAM 設定ファイルを変更します。
/etc/pam_ldap.conf
"
をlibpam-ldap
の設定ファイル、"/etc/pam_ldap.secret
" を root
のパスワードを保存するファイルとして使っています。
デフォールト ("compat
" または "file
") に代えて
"ldap
" を使うには "/etc/nsswitch.conf
"
ファイル中の NSS 設定を変更します。
/etc/libnss-ldap.conf
"
をlibnss-ldap
の設定ファイルとして使っています。
libpam-ldap
が SSL (もしくは TLS) 接続を使うよう設定しなければいけません。
libnss-ldap
が
SSL (もしくは TLS) 接続を使うように設定できます。
nscd
(8)
をローカルで走らせるべきです。
libpam-doc
パッケージで提供される
pam_ldap.conf
(5) や
"/usr/share/doc/libpam-doc/html/
" や
glibc-doc
パッケージで提供される
"infolibc'NameServiceSwitch'
" といった文書を参照下さい。
同様に、これに代わる集中化されたシステムは他の方法を使っても設定できます。
これは Richard M. Stallman が書いた昔の "info su
"
の最後に書かれていた有名な文言です。ご心配は無用です。現在 Debian にある su
は PAM
を使っているので "/etc/pam.d/su
" の中の
"pam_wheel.so
" の行をエネーブルすることで su
を使えるのを
root
グループに限定できます。
libpam-cracklib
パッケージをインストールすると、例えば
"/etc/pam.d/common-password
" に次のような行があれば、パスワード規則を強化できます。
lenny
の場合:
password required pam_cracklib.so retry=3 minlen=9 difok=3 password required pam_unix.so use_authtok nullok md5
squeeze
の場合:
password required pam_cracklib.so retry=3 minlen=9 difok=3 password [success=1 default=ignore] pam_unix.so use_authtok nullok md5 password requisite pam_deny.so password required pam_permit.so
カーネルのセキュアーアテンションキー (SAK) 機能の制限は「Alt-SysRq キー」を参照下さい。
sudo
はシステム管理者がユーザーに制限付きの root 権限を与え、その root
活動を記録するように設計されたプログラムです。sudo
はユーザーの通常パスワードだけが必要です。sudo
パッケージをインストールし、"/etc/sudoers
"
の中のオプションを設定することによりアクティベートして下さい。"/usr/share/doc/sudo/examples/sudoers
の設定例を参照下さい。
単一ユーザーシステムにおける私の sudo
の使い方 (「sudo の設定」参照)
は自分自身の失敗からの防衛を目指しています。sudo
を使うことは、常に root
アカウントからシステムを使うよりは良い方法だと個人的には考えます。例えば、次は
"<some_file>
" の所有者を
"<my_name>
" に変更します。
$ sudo chown <my_name> <some_file>
root のパスワード (自分でシステムインストールをした Debian ユーザーなら当然知っています)
を知っていれば、どのユーザーアカウントからいかなるコマンドも "su -c
" とすれば root
もとで実行できます。
セキュリティー強化した Linux (SELinux) は強制アクセス制御 (MAC) ポリシーのある通常の Unix 的な権限モデルより厳格な枠組みです。ある条件下では root の権限すら制限を受けます。
システムのセキュリティーのためにできるだけ多くのサーバープログラムを無効とするのは良い考えです。このことはネットワークサーバーの場合は決定的です。直接デーモンとしてであれスーパーサーバープログラム経由であれ有効にされている使っていないサーバーがあることはセキュリティーリスクと考えられます。
sshd
(8) 等の多くのプログラムが PAM
を使ったアクセスコントロールを使っています。サーバーサービスへのアクセスを制限するには多くの方法があります。
/etc/default/<プログラム名>
"
/etc/inetd.conf
"
/etc/hosts.deny
" と
"/etc/hosts.allow
"、tcpd
(8)
/etc/rpc.conf
"
atd
(8) に関する "/etc/at.allow
" と
"/etc/at.deny
"
atd
(8) に関する "/etc/at.allow
" と
"/etc/at.deny
"
「ランレベル管理例」と「各 init スクリプトのデフォールトのパラメーター」と「PAM と NSS によってアクセスされる設定ファイル」と「ネットワークサービスの初期化」と「Netfilter インフラ」を参照下さい。
もし現代的な Debian システムでリモートアクセスで問題に会った場合には、"/etc/hosts.deny
"
中に "ALL:PARANOID
"
等の問題となっている設定があればコメントアウトします。(ただしこの種の行為に関するセキュリティーリスクに注意を払わなければいけません。)
ここに書かれている情報はあなたのセキュリティーのニーズに充分ではないかもしれませんが、良いスタートです。
多くのトランスポーテーションレイヤーサービスはパスワード認証も含めて暗号化せずにメッセージをプレーンテキストで通信します。途中で傍受されかねないインターネットの荒野を経由して暗号化せずパスワードを送ることは非常によくない考えです。これらに関しては、"トランスポーテーションレイヤーセキュリティー"(TLS) もしくはその前身の "セキュアーソケットレイヤー" (SSL) で暗号化することでパスワードを含むすべての通信をセキュアーにしてサービスができます。
表4.7 インセキュアーとセキュアーのサービスとポートのリスト
インセキュアーなサービス名 | ポート | セキュアーなサービス名 | ポート |
---|---|---|---|
www (http) | 80 | https | 443 |
smtp (mail) | 25 | ssmtp (smtps) | 465 |
ftp-data | 20 | ftps-data | 989 |
ftp | 21 | ftps | 990 |
telnet | 23 | telnets | 992 |
imap2 | 143 | imaps | 993 |
pop3 | 110 | pop3s | 995 |
ldap | 389 | ldaps | 636 |
暗号化には CPU タイムがかかります。CPU に友好的な代替方法として、POP には "パスワードを認証されたポストオフィスプロトコル "(APOP) や SMTP や IMAP には "チャレンジレスポンス認証メカニズム MD5" (CRAM-MD5) といったセキュアーな認証プロトコルでパスワードのみを保護しつつ通信はプレーンテキストですることもできます。(最近メールクライアントからメールサーバーにインターネット経由でメールメッセージを送る際には、CRAM-MD5 で認証をしたのちネットワークプロバイダーによるポート25 ブロッキングを避けて従来の SMTP ポート25 の代わりにメッセージサブミッションポート587 を使うことがよく行われます。)
セキュアーシェル (SSH)
プログラムはセキュアーな認証とともにインセキュアーなネットワークを通過したお互いに信頼し合っていないホスト間のセキュアーで暗号化された通信を可能にします。OpenSSH クライアント ssh
(1) と OpenSSH デーモン sshd
(8)
から成り立っています。SSH はポートフォーワーディング機能を使い POP や X
のようなインセキュアープロトコルの通信をインターネット経由でトンネルするのに使えます。
クライアントは、ホストベースド認証、公開鍵認証、チャレンジレスポンス認証、パスワード認証を使って認証をとろうとします。公開鍵認証を利用すると、リモートからのパスワード無しログインができるようになります。「リーモートアクセスサーバーとユーティリティー (SSH)」を参照下さい。
たとえ、セキュアーシェル (SSH) やポイントツーポイントトンネリングプロトコル (PPTP) サーバーのようなセキュアーサービスを走らせる場合でも、ブルートフォースのパスワード推測等による侵入の可能性は残っています。次のようなセキュリティーのためのツールとともに、ファイアーウォールポリシー (「Netfilter インフラ」参照) を使うのはセキュリティー状況を向上させることが期待できます。
あなたの機器に他人が root 権限を持ってアクセスするのを阻止するには、次のアクションが必要です。
ハードディスクへの物理的アクセスがあれば、パスワードをリセットすることは次の手順を使うと比較的簡単です。
/etc/passwd
" を編集し、root
アカウントの2番目の項目を空にします。
grub-rescue-pc
の起動時に GRUB のメニュー項目を編集可能 (「2段目: ブートローダー」参照) なら、次の手順を使えてさらに簡単です。
root=/dev/hda6 rw init=/bin/sh
"
のような感じに変更してシステムを起動します。
/etc/passwd
" を編集し、root
アカウントの2番目の項目を空にします。
これで、システムの root シェルにパスワード無しに入れるようになりました。
root
シェルにアクセスさえできれば、システム上の全てにアクセスできシステム上のどのパスワードでもリセットできます。さらに。john
とか crack
パッケージ (「システムのセキュリティーと整合性のチェック」参照)
のようなブルートフォースのパスワードクラッキングツールを使ってすべてのユーザーアカウントのパスワードが破られるかもしれません。こうして破られたパスワードは他のシステムへの侵入を引き起こしかねません。
この様な懸念を回避できる唯一の合理的なソフトウエアー的解決法は、dm-crypt と
initramfs (「データー暗号化ティップ」 参照)
をつかう、ソフトウエアー暗号化されたルートパーティション (もしくは "/etc
" パーティション)
を使うことです。でも、パスワードがシステム起動毎に必要になってしまいます。
GNU/Linux のネットワーク設定の一般的ガイドは Linux Network Administrators Guide を参照下さい。
現代的な Debian システムの基本的ネットワークインフラをレビューします。
表5.1 GUI のネットワーク設定ツール
パッケージ | ポプコン | サイズ | タイプ | 説明 |
---|---|---|---|---|
ifupdown *
|
V:60, I:99 | 228 | 設定::ifupdown | ネットワークを接続したり切断したりする標準化されたツール (Debian 特定) |
ifplugd *
|
V:0.4, I:0.9 | 244 | , , | 有線ネットワークを自動的に管理 |
ifupdown-extra *
|
V:0.04, I:0.2 | 124 | , , |
"ifupdown " パッケージを強化するネットワークテストスクリプト
|
ifmetric *
|
V:0.02, I:0.10 | 100 | , , | ネットワークインターフェースの経路メトリック設定 |
guessnet *
|
V:0.07, I:0.3 | 516 | , , |
"/etc/network/interfaces " ファイル経由で
"ifupdown " パッケージを補強する mapping スクリプト
|
ifscheme *
|
V:0.03, I:0.08 | 132 | , , |
"ifupdown " パッケージを補強する mapping スクリプト
|
ifupdown-scripts-zg2 *
|
V:0.00, I:0.04 | 232 | , , | Zugschlus さんの ifupdown の手動方法のインターフェーススクリプト |
network-manager *
|
V:24, I:33 | 2628 | 設定::NM | NetworkManager (デーモン): ネットワークを自動管理 |
network-manager-gnome *
|
V:17, I:29 | 5616 | , , | NetworkManager (GNOME フロントエンド) |
network-manager-kde *
|
V:2, I:3 | 264 | , , | NetworkManager (KDE フロントエンド) |
cnetworkmanager *
|
V:0.05, I:0.2 | 208 | , , | NetworkManager (コマンドラインクライアント) |
wicd
*
|
V:0.5, I:2 | 88 | 設定::wicd | 有線と無線のネットワークマネージャー (メタパッケージ) |
wicd-cli *
|
V:0.04, I:0.2 | 128 | , , | 有線と無線のネットワークマネージャー (コマンドラインクライアント) |
wicd-curses *
|
V:0.15, I:0.4 | 236 | , , | 有線と無線のネットワークマネージャー (Curses クライアント) |
wicd-daemon *
|
V:1.9, I:2 | 1780 | , , | 有線と無線のネットワークマネージャー (デーモン) |
wicd-gtk *
|
V:1.6, I:2 | 772 | , , | 有線と無線のネットワークマネージャー (GTK+ クライアント) |
iptables *
|
V:27, I:99 | 1316 | 設定::Netfilter | パケットフィルターと NAT のための管理ツール (Netfilter) |
iproute *
|
V:41, I:88 | 1044 | 設定::iproute2 |
iproute2、IPv6 や他の上級ネットワーク設定:
ip (8) や tc (8) 等
|
ifrename *
|
V:0.2, I:0.6 | 236 | , , |
各種の静的クライテリアに基づきネットワークインターフェースを改名します: ifrename (8)
|
ethtool *
|
V:4, I:13 | 208 | , , | Ethernet デバイス設定の表示と変更 |
iputils-ping *
|
V:36, I:99 | 96 | test::iproute2 | ホスト名か IP アドレスによってリモートホストのネットワークからの到達性をテスト (旧来、GNU) |
iputils-arping *
|
V:0.6, I:6 | 36 | , , | ARP アドレスによって特定されるリモートホストのネットワークからの到達性をテスト |
iputils-tracepath *
|
V:0.4, I:2 | 72 | , , | リモートホストへのネットワークパスを追跡 |
net-tools *
|
V:70, I:99 | 1016 | 設定::net-tools |
NET-3 ネットワーキングツールキット (net-tools、IPv4
ネットワーク設定): ifconfig (8) 等
|
inetutils-ping *
|
V:0.03, I:0.12 | 296 | テスト::net-tools | ホスト名か IP アドレスによってリモートホストのネットワークからの到達性をテスト (旧来、GNU) |
arping *
|
V:0.5, I:3 | 104 | , , | ARP アドレスによって特定されるリモートホストのネットワークからの到達性をテスト (旧来) |
traceroute *
|
V:13, I:99 | 192 | , , | リモートホストへのネットワークパス追跡するツール (旧来、コンソール) |
dhcp3-client *
|
V:32, I:92 | 60 | 設定::低レベル | DHCP クライアント |
wpasupplicant *
|
V:28, I:39 | 828 | , , | WPA と WPA2 (IEEE 802.11i) のためのクライアントサポート |
wireless-tools *
|
V:7, I:22 | 420 | , , | Linux のワイアレス拡張を操作するツール |
ppp
*
|
V:6, I:26 | 1016 | , , |
chat による PPP/PPPoE コネクション
|
pppoeconf *
|
V:0.4, I:3 | 344 | 設定::ヘルパー | PPPoE コネクションの設定ヘルパー |
pppconfig *
|
V:0.2, I:2 | 964 | , , |
chat による PPP コネクションの設定ヘルパー
|
wvdial *
|
V:0.5, I:2 | 416 | , , |
wvdial と ppp による PPP コネクションの設定ヘルパー
|
mtr-tiny *
|
V:2, I:26 | 120 | テスト::低レベル | リモートホストへのネットワークパスを追跡するツール (curses) |
mtr
*
|
V:0.7, I:3 | 180 | , , | リモートホストへのネットワークパスを追跡するツール (curses と GTK+) |
gnome-nettool *
|
V:2, I:33 | 2848 | , , | 共通のネットワーク情報操作のためのツール (GNOME) |
nmap
*
|
V:6, I:31 | 7112 | , , | ネットワークマッパー / ポートスキャナー (Nmap、コンソール) |
zenmap *
|
V:0.2, I:1.3 | 2400 | , , | ネットワークマッパー / ポートスキャナー (GTK+) |
knmap
*
|
V:0.10, I:0.6 | 712 | , , | ネットワークマッパー / ポートスキャナー (KDE) |
tcpdump *
|
V:3, I:24 | 1020 | , , | ネットワークトラフィックアナライザー (Tcpdump、コンソール) |
wireshark *
|
V:1.4, I:9 | 2052 | , , | ネットワークトラフィックアナライザー (Wireshark、GTK+) |
tshark *
|
V:0.4, I:3 | 276 | , , | ネットワークトラフィックアナライザー (コンソール) |
nagios3 *
|
V:1.0, I:1.8 | 32 | , , | ホストとサービスとネットワークを監視や管理するシステム (Nagios) |
tcptrace *
|
V:0.05, I:0.4 | 436 | , , |
tcpdump の出力から接続状況のまとめを作成
|
snort
*
|
V:0.6, I:0.8 | 1260 | , , | 柔軟なネットワーク侵入検知システム (Snort) |
ntop
*
|
V:1.2, I:2 | 11124 | , , | ネットワークの使用状況をウェッブブラウザーで表示 |
dnsutils *
|
V:14, I:90 | 412 | , , |
BIND によって提供されるネットワーククライアント:
nslookup (8) と nsupdate (8) と
dig (8)
|
dlint
*
|
V:0.4, I:6 | 96 | , , | ネームサーバーの閲覧で DNS のゾーン情報をチェック |
dnstracer *
|
V:0.11, I:0.5 | 92 | , , | DNS サーバーをその源流まで追跡 |
ドメイン名を名付けるのは通常 PC ワークステーションのユーザーにとってはトリッキーです。PC ワークステーションは、ネットワークを渡り歩く可動 PC かもしれないし、インターネットからアクセスできない NAT ファイアーウォールの背後にあるかもしれません。そのような場合、ドメイン名がかち合うのを避けるために有効なドメイン名をドメイン名として選びたくないでしょう。
無効なドメイン名を使う時には、MTA 等のプログラムによって使われるドメイン名を偽装する必要があります。「メールアドレス設定」を参照ください。
rfc2606
によると、インターネットから確実に無効なドメイン名を作るためにはトップレベルドメイン
(TLD) の選択として "invalid
" が良い選択のようです。
mDNS ネットワーク探索プロトコル (Apple Bonjour / Apple Rendezvous、Debian 上の Avahi) は、"local" を擬似トップレベルドメインとして使います。Microsoft も "local" をローカルエリアネットワークの TLD として推奨しているようでもあります。
あなたの LAN の DNS サービスが "local
" を LAN 用の TLD として使うと、mDNS
と干渉するかもしれません。
無効 TLD のよくある選択は、私が受け取ったメールの解析によると、"localdomain
" とか
"lan
" とか "localnet
" とか
"home
" のようです。
ホスト名の解決もまた、現在 NSS (ネームサービススイッチ、Name Service Switch) メカニズムによってサポートされています。この解決の流れは次です。
hosts: files dns
" のようなスタンザのある
"/etc/nsswitch.conf
"
ファイルがホスト名の解消の順序を規定します。(これは、"/etc/host.conf
" ファイル中の
"order
" スタンザの機能を置換します。)
files
メソッドが最初に発動されます。ホスト名が
"/etc/hosts
"
ファイルに見つかると、それに対応する全ての有効アドレスを返し終了します。("/etc/host.conf
"
ファイルは "multi on
" を含みます。)
dns
メソッドが発動されます。"/etc/resolv.conf
"
ファイルで識別されるインターネットドメイン名システム
(DNS) への問い合わせでホスト名が見つかれば、それに関する全ての有効アドレスを返します。
ホスト名と IP アドレスを関連付ける
"/etc/hosts
" ファイルは次の内容です。
127.0.0.1 localhost 127.0.1.1 <host_name>.<domain_name> <host_name> # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
上記中の <host_name> は、"/etc/hostname
"
で定義される自分自身のホスト名と一致します。上記中の <domain_name> は、このホストの完全修飾ドメイン名 (FQDN) です。
真の FQDN の無いモービル PC に関する <domain_name> には、"lan
" や
"home
" や "invalid
" や
"localdomain
" や "none
" や
"private
" 等のでっち上げで無難な TLD を使えます。
resolvconf
パッケージがインストールされなかったら、"/etc/resolv.conf
"
は静的なファイルです。インストールされると、それはシンボリックリンクになります。いずれにせよ、解決機構を初期化する情報を含んでいます。もし DNS が
IP="192.168.11.1
" に見つかるなら、それは次の内容です。
nameserver 192.168.11.1
resolvconf
パッケージはこの "/etc/resolv.conf
"
をシンボリックリンクにし、フックスクリプトで自動的にその内容を管理します。
アドホクの mDNS のドメイン "local
" 中で通常 Unix/Linux
プログラムによる名前解決を実質的にできるようにするマルチキャスト DNS (Zeroconf、別名 Apple Bonjour / Apple
Rendezvous) を使うホスト名解決は、libnss-mdns
パッケージをインストールすると提供できます。このような機能を有効にするには、"/etc/nsswitch.conf
"
ファイル中に "hosts: files mdns4_minimal [NOTFOUND=return] dns
mdns4
" のようなスタンザが必要です。
Linux カーネル中の各ハードウエアーは、それが見つかり次第ユーザー空間の設定メカニズム udev
(「udev システム」参照) を通じて、例えば eth0
のようなネットワークインターフェース名が付与されます。ネットワークインターフェース名は、ifup
(8) と
interfaces
(5) の中で物理インターフェースと呼ばれています。
MAC
アドレス等を使って各リブート毎に永続性をもって各ネットワークインターフェースが名付けられるように記録するファイル
"/etc/udev/rules.d/70-persistent-net.rules
" があります。このファイルは
"persistent-net-generator.rules
" ルールファイルによって実行されているような
"/lib/udev/write_net_rules
"
プログラムによって自動生成されます。そのファイルを変更することで命名ルールを変更できます。
"/etc/udev/rules.d/70-persistent-net.rules
"
ルールファイルを編集する時は、各ルールを1行に納めて MAC
アドレスに小文字を使わなければいけません。例えば、あなたがこのファイル中に "Firewire device" と "PCI
device" を見つけたら、きっと "PCI device" をeth0
として第1番目のネットワークインターフェースとして設定したいでしょう。
rfc1918 によってローカルエリアネットワーク (LAN) での使用に予約されている各クラス毎の IPv4 32ビットアドレス範囲を確認します。これらのアドレスは本来のインターネット上のアドレスとかち合う事が無いことが保証されています。
表5.2 ネットワークアドレス範囲のリスト
クラス | ネットワークアドレス | ネットマスク | ネットマスク / ビット | サブネットの数 |
---|---|---|---|---|
A | 10.x.x.x | 255.0.0.0 | /8 | 1 |
B | 172.16.x.x — 172.31.x.x | 255.255.0.0 | /16 | 16 |
C | 192.168.0.x — 192.168.255.x | 255.255.255.0 | /24 | 256 |
これらのアドレス内の1つがホストに付与されている場合、そのホストはインターネットに直接アクセスせず、各サービスのプロキシとなるかネットワークアドレス変換 (NAT) をするゲートウエーを通してアクセスしなければいけません。ブロードバンドルーターは消費者 LAN 環境のために通常 NAT を行います。
Debian システムによってほとんどのハードウエアーデバイスはサポートされていますが、一部のネットワークデバイスはそのサポートのために DSFG non-free のドライバーが必要です。「Non-free ハードウエアードライバー」を参照下さい。
Debian の squeeze
システム上では、NetworkManager (NM)
(network-manager
と関連パッケージ) や Wicd (wicd
と関連パッケージ) 等の管理デーモン経由でネットワーク接続の管理ができます。
サーバーにはこの様な自動ネットワーク設定を使わないで下さい。これらはラップトップ上のモービルデスクトップを主対象としています。
これらの現代的なネットワーク設定ツールはレガシーの "ifupdown
" パッケージやその
"/etc/network/interfaces
"
設定ファイルとの競合を避けるように適正に設定する必要があります。
これらの自動ネットワーク設定ツール機能の一部は、リグレッションにあっているかもしれません。最新の問題や制約条件に関しては network-manager の BTS や wicd の BTS を参照下さい。
Debian 上での NM や Wicd
に関する正式のドキュメンテーションは、"/usr/share/doc/network-manager/README.Debian
"
や "/usr/share/doc/wicd/README.Debian
" によりそれぞれ提供されます。
デスクトップのための現代的ネットワーク設定の要点は以下です。
次のようにして、例えば foo
というデスクトップユーザーを
"netdev
" グループに属するようにします。(GNOME や KDE のような現代的デスクトップ環境の下では
D-bus 経由でそれを自動的にするのも一つの方法です。)
$ sudo adduser foo netdev
"/etc/network/interfaces
" の設定を次のようにできるだけ簡単にします。
auto lo iface lo inet loopback
次のようにして NM や Wicd を再起動します。
$ sudo /etc/init.d/network-manager restart
$ sudo /etc/init.d/wicd restart
ifupdown
との干渉を避けるために、"/etc/network/interfaces
" にリストされてないインターフェースか、"auto …
" または
"allow-hotplug …
" を使いかつ (他のオプション無しで) "iface …
inet dhcp
" を使って設定されているインターフェースのみが NM によって管理されます。
NM のネットワーク設定能力を拡張したい場合には、network-manager-openconnect
や
network-manager-openvpn-gnome
や
network-manager-pptp-gnome
や
mobile-broadband-provider-info
や
gnome-bluetooth
等の適正なプラグインモジュールや補足パッケージを探してください。Wicd
の場合もまったく同様の方法で対処します。
こういった自動ネットワーク設定は、「ifupdown を使った基本的なネットワーク設定 (レガシー)」や「ifupdown を使う上級ネットワーク設定 (レガシー)」のような
"/etc/network/interfaces
" への凝ったレガシー
ifupdown
設定と互換性がないかも知れません。最新の問題や制約条件に関しては network-manager の BTS や wicd の BTS を参照下さい。
「デスクトップのためのモダンネットワーク設定」に記載された手法ではあなたの目的にとって不十分な場合には、多くの簡単なツールを組み合わせるレガシーのネットワーク接続や設定を使うべきです。
レガシーのネットワーク接続は手法毎に特定です (「ネットワーク接続方法 (レガシー)」参照)。
Linux の低レベルネットワーク設定には2タイプのプログラムがあります (「Iproute2 コマンド」参照)。
ifconfig
(8)、…) は Linux NET-3
ネットワークシステム由来です。これらの多くはすでに時代遅れです。
ip
(8)、…) は現行の Linux のネットワークシステムです。
これらの低レベルのネットワークプログラムは強力ですが、使うのが面倒です。そこで高レベルのネットワーク設定プログラムが作られました。
ifupdown
パッケージは Debian
上のそのような高レベルネットワーク設定のデファクトスタンダードです。それを使うと、"ifup eth0
"
とするだけでネットワークを立ち上げることができます。その設定ファイルは、"/etc/network/interfaces
"
ファイルで、その典型的内容は次です。
auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp
resolvconf
パッケージは、ネットワークアドレス解決設定ファイル
"/etc/resolv.conf
"
の書き変えを自動化してネットワークアドレス解決の円滑な再構成をサポートするために ifupdown
システムを補完するために作られました。現在、ほとんどの Debian のネットワーク設定パッケージは
resolvconf
パッケージを使うように変更されています
("/usr/share/doc/resolvconf/README.Debian
"参照)。
ifplugd
や guessnet
や
ifscheme
等の ifupdown
パッケージの補助スクリプトが有線
LAN 上の可動 PC
のためのネットワーク環境設定のようなネットワーク環境の動的設定を自動化するために作られました。これらはちょっと使い難いですが、既存の
ifupdown
システムとは反りが合います。
詳細に例示とともに説明します (「ifupdown を使った基本的なネットワーク設定 (レガシー)」と「ifupdown を使う上級ネットワーク設定 (レガシー)」参照)。
本セクションで説明されている接続テスト方法はあくまでテスト目的のためのものです。毎日のネットワーク接続のために使うためではありません NM か Wicd
か ifupdown
パッケージを通して使うことをお勧めします (「デスクトップのためのモダンネットワーク設定」と「ifupdown を使った基本的なネットワーク設定 (レガシー)」参照)。
典型的なネットワーク接続方法と PC までの接続経路は次のようにまとめられます。
表5.3 典型的なネットワーク接続方法と接続経路のリスト
PC | 接続方法 | 接続経路 |
---|---|---|
シリアルポート (ppp0 )
|
PPP | ⇔ モデム ⇔ POTS ⇔ ダイヤルアップアクセスポイント ⇔ ISP |
イーサーネットポート (eth0 )
|
PPPoE/DHCP/静的 | ⇔ BB モデム ⇔ BB サービス ⇔ BB アクセスポイント ⇔ ISP |
イーサーネットポート (eth0 )
|
DHCP/静的 | ⇔ LAN ⇔ ネットワークアドレス変換 (NAT) 機能のある BB ルーター (⇔ BB モデム …) |
各接続方法のための設定スクリプトのまとめて次に記します。
表5.4 ネットワーク接続設定のリスト
接続方法 | 設定 | バックエンドパッケージ |
---|---|---|
PPP |
pppconfig 決定論的 chat の作成
|
pppconfig と ppp
|
PPP (代替) |
wvdialconf はヒューリスティックのある chat の作成
|
ppp と wvdial
|
PPPoE |
pppoeconf 決定論的 chat の作成
|
pppoeconf と ppp
|
DHCP |
"/etc/dhcp3/dhclient.conf " 中に記述されています
|
dhcp3-client
|
静的 IP (IPv4) |
"/etc/network/interfaces " 中に記述されています
|
net-tools
|
静的 IP (IPv6) |
"/etc/network/interfaces " 中に記述されています
|
iproute
|
ネットワーク接続の省略語は次の意味です。
ケーブル TV 経由の WAN 接続サービスは大体 DHCP か PPPoE でサービスを受けます。ADSL と FTTP の接続サービスは大体 PPPoE でサービスを受けます。WAN 接続の正確な設定要件はあなたの ISP にご確認下さい。
BB ルータが家庭内 LAN 環境を作るのに使われる時には、LAN 上の PC はネットワークアドレス変換 (NAT) をして BB ルーター経由で WAN に接続されます。そのような場合、LAN 上の PC のネットワークインターフェースは静的 IP か BB ルーターからの DHCP でサービスを受けます。BB ルーターはあなたの ISP による指示にしたがって WAN に接続されるよう設定しなければいけません。
典型的な現代的な家庭内や小規模ビジネスネットワークの LAN は WAN (インターネット) に何らかの消費者向けブロードバンドルーターを使って接続されています。このルーターの後ろの LAN は通常ルーター上で稼働する動的ホスト設定プロトコル (DHCP) サーバーによりサービスを受けています。
動的ホスト設定プロトコル (DHCP)
サービスを受けるイーサーネットでは、dhcp3-client
パッケージをインストールするだけです。
設定スクリプト pppconfig
はPPP
接続を次の選択をすることで対話式で設定します。
表5.6 pppconfig を使っての PPP 接続のための設定ファイルのリスト
もし pon
と poff
コマンドが引数無しに起動された場合には、"<isp_name>" の値として "provider
"
が使われます。
低レベルのネットワーク設定ツールを使って次に記すように設定の確認ができます。
$ sudo pon <isp_name> ... $ sudo poff <isp_name>
"/usr/share/doc/ppp/README.Debian.gz
" を参照下さい。
pppd
(8) を使う異なるアプローチは、wvdial
パッケージが提供する
wvdial
(1) からそれを実行することです。電話を掛け接続の交渉をするために
pppd
がchat
(8)
を実行するのではなく、wvdial
が電話を掛け接続の交渉をした後に
pppd
を始動し後を任せます。
設定スクリプト wvdialconf
は PPP 接続を次の選択をすることで対話式で設定します。
ほとんどの場合 wvdial
は接続をすることに成功し、自動的に認証データーのリストを管理します。
低レベルのネットワーク設定ツールを使って次に記すように設定の確認ができます。
$ sudo wvdial ... $ sudo killall wvdial
wvdial
(1) と wvdial.conf
(5) を参照下さい。
あなたの ISP が PPPoE 接続を提供し、あなたの PC を直接 WAN に接続すると決めた際には、あなたの PC のネットワークは PPPoE
で設定しないといけません。PPPoE とはイーサーネット経由の PPP の意味です。設定スクリプト
pppoeconf
は PPPoE 接続を対話式で設定します。
設定ファイルは以下。
低レベルのネットワーク設定ツールを使って次に記すように設定の確認ができます。
$ sudo /sbin/ifconfig eth0 up $ sudo pon dsl-provider ... $ sudo poff dsl-provider $ sudo /sbin/ifconfig eth0 down
"/usr/share/doc/pppoeconf/README.Debian
" を参照下さい。
Debian システム上の伝統的な TCP/IP ネットワークのセットアップは
ifupdown
パッケージをより高レベルのツールとして使います。2つの場合があります。
resolvconf
パッケージを使い設定し、容易にネットワーク設定を切り替えられるようにしましょう (「DHCP サービスを受けるネットワークインターフェース」参照)。
resolvconf
パッケージを使うことなく設定し、システムを単純にしましょう (「静的 IP を使うネットワークインターフェース」参照)。
このような伝統的設定方法は上級設定をしたい際に非常に有用です (「ifupdown を使った基本的なネットワーク設定 (レガシー)」参照)。
ifupdown
パッケージは Debian
システムでの高レベルネットワーク設定の標準化された枠組みを提供します。このセクションでは、簡略化された紹介と多くの典型例で
ifupdown
を使った基本的なネットワーク設定を学びます。
ifupdown
パッケージには2つのコマンドがあります: ifup
(8)
と ifdown
(8)。設定ファイル "/etc/network/interfaces"
により規定される高レベルのネットワーク設定を提供します。
表5.9 ifupdown を使う基本的なネットワーク設定コマンドのリスト
コマンド | アクション |
---|---|
ifup eth0
|
"iface eth0 " スタンザがあれば、ネットワークインターフェース
eth0 をネットワーク設定 eth0 で起動
|
ifdown eth0
|
"iface eth0 " スタンザがあれば、ネットワークインターフェース
eth0 に関するネットワーク設定 eth0 を終了し停止
|
up
状態にあるインターフェースを、ifconfig
(8) や ip
(8)
コマンドのような低レベル設定ツールを使って設定してはいけません。
ifupdown
というコマンドはありません。
"/etc/network/interfaces
" のシンタックスは
interfaces
(5) に説明されていて、要点を次に記します。
表5.10 "/etc/network/interfaces
" のスタンザのリスト
スタンザ | 意味 |
---|---|
"auto <interface_name> "
|
システム起動時にインターフェース <interface_name> を起動 |
"allow-auto <interface_name> "
|
, , |
"allow-hotplug <interface_name> "
|
カーネルがインターフェースからのホットプラグイベントを認知した際にインターフェース <interface_name> を起動 |
"iface <config_name> … " によって始まる行
|
ネットワーク設定 <config_name> を規定 |
"mapping <interface_name_glob> " によって始まる行
|
<interface_name> に対応する <config_name> の mapping 値を規定 |
ハッシュ "# " で始まる行
|
コメントして無視 (行末コメントは非サポート) |
バックスラシュ "\ " で終わる行
|
設定を次行に継続 |
iface
スタンザで始まる行は次のシンタクスです。
iface <config_name> <address_family> <method_name> <option1> <value1> <option2> <value2> ...
基本設定に関しては、mapping
スタンザは使われませんし、ネットワークインターフェース名をネットワーク設定名として使います (「mapping スタンザ」参照)。
"/etc/network/interfaces
" のネットワークインターフェースに関する
"iface
" スタンザの重複定義をしてはいけません。
"/etc/network/interfaces
"
ファイルに次の設定をすることでシステムブート時にループバックネットワークインターフェース lo
が起動されます
(auto
スタンザ経由)。
auto lo iface lo inet loopback
この設定は、"/etc/network/interfaces
" ファイル中にいつも存在します。
「イーサーネットを使っての DHCP 接続」によりシステムの準備をした後、DHCP
によってサービスされるネットワークインターフェースは "/etc/network/interfaces
"
ファイルの中に次のような設定エントリーを設定します。
allow-hotplug eth0 iface eth0 inet dhcp hostname "mymachine"
Linux カーネルが物理インターフェース eth0
を認識した場合、allow-hotplug
スタンザは
ifup
によりそのインターフェースが起動させられるようにし、iface
スタンザが
ifup
がインターフェースが DHCP を使うように設定します。
静的 IP によってサービスされるネットワークインターフェースは
"/etc/network/interfaces
" ファイル中に例えば次の設定エントリーを作ることで設定されます。
allow-hotplug eth0 iface eth0 inet static address 192.168.11.100 netmask 255.255.255.0 broadcast 192.168.11.255 gateway 192.168.11.1 dns-domain lan dns-nameservers 192.168.11.1
Linux カーネルが物理インターフェース eth0
を認識した場合、allow-hotplug
スタンザは
ifup
によりそのインターフェースが起動させられるようにし、iface
スタンザが
ifup
がインターフェースが静的 IP を使うように設定します。
ここでは次を仮定しています。
192.168.11.0
-
192.168.11.255
192.168.11.1
192.168.11.100
resolvconf
パッケージ: インストール済み
lan
"
192.168.11.1
resolvconf
パッケージがインストールされていないと、DNS 関係の設定は手動で
"/etc/resolv.conf
" を次のように編集する必要があります。
nameserver 192.168.11.1 domain lan
上記例で用いた IP アドレスはそのままコピーされるべきものではありません。IP 番号はあなたの実際のネットワーク設定に合わせなければいけません。
ワイアレス LAN (省略すると WLAN) は IEEE 802.11 という標準群に基づく特別な免許なく使える無線を使う帯域拡散通信を経由の高速ワイアレス接続を提供します。
WLAN インターフェースは通常の Ethernet インターフェースと非常に似ていますが、始動時にネットワーク ID
と暗号キーデーターを必要とします。インターフェース名が使われるカーネルドライバーによって eth1
や
wlan0
や ath0
や
wifi0
等とインターフェース名が少々異なる以外は、それらに使われる高レベルのネットワークツールは
Ethernet インターフェースのものとまったく同じです。
wmaster0
デバイスは、新規の Linux の mac80211 API による SoftMAC によってのみ使われる内部デバイスのマスターデバイスです。
WLAN に関して留意すべきキーワードは次です。
表5.11 WLAN の略語のリスト
省略語 | 元の言葉 | 意味 |
---|---|---|
NWID | ネットワーク ID | 802.11 以前の WaveLAN ネットワークによって使われる16ビットネットワークID (非常に非推奨) |
(E)SSID | (拡張) サービスセットアイデンティファイアー | 802.11 ワイアレス LAN が統合されて連結されてできるワイアレスアクセスポイント (APs) のネットワーク名、ドメイン ID |
WEP, (WEP2) | 有線等価プライバシー | 第1世代の、40ビットのキーを使う64ビット (128ビット) のワイアレス暗号化標準 (非推奨) |
WPA | Wi-Fi 保護アクセス (Protected Access) | 第2世代の、WEP との互換性のあるワイアレス暗号化標準 (802.11i の殆ど) |
WPA2 | Wi-Fi 保護アクセス 2 (Protected Access 2) | 第3世代の、WEP との互換性のないワイアレス暗号化標準 (完全に 802.11i) |
実際のプロトコルの選択肢は採用しているワイアレスルーターによって普通制約されます。
新規のWPA/WPA2を使うWLANをサポートするには、wpasupplicant
パッケージをインストールする必要があります。
WLAN 接続上の DHCP によってサービスされている IP
の場合には、"/etc/network/interfaces
" ファイルのエントリーは次のようです。
allow-hotplug ath0 iface ath0 inet dhcp wpa-ssid homezone # hexadecimal psk is encoded from a plaintext passphrase wpa-psk 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
"/usr/share/doc/wpasupplicant/README.modes.gz
" を参照下さい。
旧式の WEP を使う WLAN をサポートするには、wireless-tools
パッケージをインストールする必要があります。(あなたの消費者用のルーターは今だにセキュアーでないインフラを使っているかもしれませんが、無いよりはましです。)
WEP を使う WLAN 上のネットワークトラフィックは他人に覗かれているかも知れないことを覚えておいて下さい。
WLAN 接続上の DHCP によってサービスされている IP
の場合には、"/etc/network/interfaces
" ファイルのエントリーは次のようです。
allow-hotplug eth0 iface eth0 inet dhcp wireless-essid Home wireless-key1 0123-4567-89ab-cdef wireless-key2 12345678 wireless-key3 s:password wireless-defaultkey 2 wireless-keymode open
"/usr/share/doc/wireless-tools/README.Debian
" を参照下さい。
以前説明したように PPP 接続を設定する必要があります (「pppconfig を使っての PPP 接続」参照)。さらに、第1番目の PPP デバイス
ppp0
のための "/etc/network/interfaces
"
ファイルのエントリーを次のように追加します。
iface ppp0 inet ppp provider <isp_name>
以前説明したように wvdial
を使う代替 PPP 接続をまず設定する必要があります (「wvdialconf を使った代替 PPP 接続」参照)。さらに、第1番目の PPP
デバイス ppp0
のための
"/etc/network/interfaces
" ファイルのエントリーを次のように追加します。
iface ppp0 inet wvdial
PPPoE によってサービスされる直接 WAN に接続した PC の場合、以前説明したように PPPoE 接続を設定する必要があります (「pppoeconf を使った PPPoE 接続」参照)。さらに、第1番目の PPPoE デバイス
eth0
のための "/etc/network/interfaces
"
ファイルのエントリーを次のように追加します。
allow-hotplug eth0 iface eth0 inet manual pre-up /sbin/ifconfig eth0 up up ifup ppp0=dsl down ifdown ppp0=dsl post-down /sbin/ifconfig eth0 down # The following is used internally only iface dsl inet ppp provider dsl-provider
"/etc/network/run/ifstate
"
ファイルは、ifupdown
パッケージが管理する全ての有効なネットワークインターフェースの意図したネットワーク設定状態を記録します。残念ながら
ifupdown
が意図したにもかかわらずインターフェースを起動できなかった場合でも、"/etc/network/run/ifstate
"
ファイルはインターフェースが起動されたと表示します。
あるインターフェースに関する ifconfig
(8) コマンド出力が次の例のような行を欠いている場合、IPV4 ネットワークの一部としては使えません。
inet addr:192.168.11.2 Bcast:192.168.11.255 Mask:255.255.255.0
PPPoE に接続されているイーサーネットデバイスの場合、ifconfig
(8)
コマンドのアウトプットは上記例のような行を欠いています。
例えば eth0
というインターフェースを再設定したい際には、まず "sudo ifdown eth0
"
コマンドを実行してそれを無効にしなければいけません。こうすることで eth0
のエントリーが
"/etc/network/run/ifstate
" ファイルから削除されます。(もし
eth0
が有効でなかったりそれにたいして過去に間違った設定がされている際には、こうするとエラーメッセージを発することになるかもしれません。シンプルな単一ユーザーのワークステーションではいつも問題なことは知る限り起こらないようです。)
こうすることで、必要に応じてネットワークインターフェース eth0
を自由に再設定するために
"/etc/network/interfaces
" の内容を自由に書き換えられます。
こうした後で、eth0
を"sudo ifup
eth0
" コマンドを使って再起動できます。
ネットワークインターフェースは、"sudo ifdown eth0;sudo ifup
eth0
" とすることで (再)初期化できます。
ifupdown-extra
パッケージは、ifupdown
とともに使う使いやすいネットワーク接続テストを提供します。
network-test
(1) コマンドはシェルから実行できます。
ifup
コマンド実行毎に実行されます。
network-test
コマンドをつかうことで面倒な低レベルコマンドを使ってネットワーク問題を分析する手間を省けます。
自動スクリプトは "/etc/network/*/
" にインストールされ、次の機能があります。
/etc/network/routes
" の定義に従った静的ルートの設定
/var/log/syslog
" ファイルに記録
この syslog 記録はリモートシステムのネットワーク問題を管理する上で非常に有用です。
ifupdown-extra
パッケージの自動的な挙動は
"/etc/default/network-test
" によって設定可能です。これらの自動テストの一部は
ARP からの返答を聞くのでシステムのブートプロセスを少々遅らせます。
ifupdown
パッケージの機能は、上級知識を使うと「ifupdown を使った基本的なネットワーク設定 (レガシー)」に書かれているよりも向上します。
ここに記述されている機能は全く任意のものです。著者自身、怠け者で面倒な事が嫌いなために、ここに書かれたことを使うことは滅多にありません。
「ifupdown を使った基本的なネットワーク設定 (レガシー)」に書かれた情報でネットワーク接続をうまく設定できないのに、次の情報を使うと状況は更に悪くなります。
ifplugd
パッケージはイーサーネット接続のみを管理する旧式の自動ネットワーク設定ツールです。これによって可動
PC 等のイーサーネットケーブルの脱着問題を解決します。もし NetworkManager か Wicd (「デスクトップのためのモダンネットワーク設定」参照)
がインストールされている場合は、このパッケージは必要ありません。
このパッケージはデーモンとして実行され、auto とか allow-hotplug という機能 (表5.10「"/etc/network/interfaces
" のスタンザのリスト」)
を置き換え、インターフェースがネットワークに繋がれるとインターフェースを起動します。
例えば eth0
という内部イーサーネットポートに対する ifplugd
パッケージの利用方法は次です。
/etc/network/interfaces
" の中のスタンザを削除しましょう: "auto
eth0
" または "allow-hotplug eth0
"、
/etc/network/interfaces
" の中のスタンザを残しましょう: "iface
eth0 inet …
" と "mapping …
"、
ifplugd
パッケージをインストールします。
sudo dpkg-reconfigure ifplugd
" の実行します。
eth0
を"ifplugd により監視される静的インターフェース" とします。
こうするとお望みどおりのネットワーク設定が機能します。
電源投入もしくはハードウエアーの発見時に、インターフェースは自動的に起動されます。
ifplugd
(8) コマンドの引数はインターフェースの再設定の遅延時間などの挙動を設定します。
ifmeric
パッケージを使うと、DHCP でもルートのメトリクスを事後操作できます。
次のようにすると eth0
インターフェースを wlan0
インターフェースより優先するように設定できます。
ifmetric
パッケージをインストールします。
iface eth0 inet dhcp
" 行のすぐ下に "metric
0
" というオプション行を追加します。
iface wlan0 inet dhcp
" 行のすぐ下に "metric
1
" というオプション行を追加します。
メトリック0とは最高優先順位のルートでデフォールトのルートということを意味します。大きなメトリック値は低い優先順位を意味します。最低のメトリック値をもつ有効なインターフェースの
IP アドレスが発信源となるインターフェースになります。ifmetric
(8) を参照下さい。
物理的には単一のイーサーネットインターフェースは異なる IP アドレスをもつ複数の仮想インターフェースとして設定できます。いくつかの IP サブネットワークにインターフェースを繋ぐのが通常こうする目的です。例えば、単一ネットワークインターフェースを使った IP アドレスに基づく仮想ウェッブホスティングがその適用例です。
例えば、次を仮定します。
192.168.0.x/24
を使います。
eth0
を DHCP が提供する IP
アドレスで使います。
eth0:0
を192.168.0.1
で使います。
このとき "/etc/network/interfaces
" 中の次のスタンザがあなたのネットワークを設定します。
iface eth0 inet dhcp metric 0 iface eth0:0 inet static address 192.168.0.1 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 metric 1
netfilter/iptables (「Netfilter インフラ」参照) を使ってネットワークアドレス変換 (NAT) を使う上記設定例は単一インターフェースを使って LAN に対して安価なルーターを提供しますが、そのような設定を使ったのでは真のファイアーウォール能力はありません。2つの物理インターフェースと NAT を使ってインターネットからローカルネットワークをセキュアーするべきです。
ifupdown
パッケージはネットワーク設定名とネットワークインターフェース名を使って上級ネットワーク設定をできるようにします。わたしは
ifup
(8) や interfaces
(5)
とは少々異なる用語法をここでは使っています。
表5.12 ネットワークデバイスの用語法のリスト
マンページの用語法 | 著者の用語法 | この後の文中の用例 | 説明 |
---|---|---|---|
物理インターフェース名 | ネットワークインターフェース名 |
lo , eth0 ,
<interface_name>
|
Linux カーネルが (udev メカニズムを利用して) 与えた名前
|
論理インターフェース名 | ネットワーク設定名 |
config1 , config2 ,
<config_name>
|
"/etc/network/interfaces " 中で iface に続く名前のトークン
|
「簡略化されたコマンドシンタックス」中の基本的なネットワーク設定コマンドは、iface
スタンザ中のネットワーク設定名のトークンと、"/etc/network/interfaces
"
中のネットワークインターフェース名が一致している必要があります。
上級ネットワーク設定コマンドは次のような "/etc/network/interfaces
"
の中で、ネットワーク設定名とネットワークインターフェース名を区別を可能にします。
表5.13 ifupdown を使う上級ネットワーク設定コマンドのリスト
コマンド | アクション |
---|---|
ifup eth0=config1
|
ネットワーク設定 config1 を使うネットワークインターフェース
eth0 を始動
|
ifdown eth0=config1
|
ネットワーク設定 config1 を使うネットワークインターフェース
eth0 を停止
|
ifup eth0
|
mapping
スタンザによって選ばれる設定を使ってネットワークインターフェース eth0 を始動
|
ifdown eth0
|
mapping
スタンザによって選ばれる設定を使ってネットワークインターフェース eth0 を停止
|
「"/etc/network/interfaces" の基本的なシンタックス」では複雑になるのを避けるために
"/etc/network/interfaces
" 中の mapping
スタンザを説明しませんでした。このスタンザには次のシンタクスがあります。
mapping <interface_name_glob> script <script_name> map <script_input1> map <script_input2> map ...
上記は、<script_name>
で指定される mapping
スクリプトで設定の選択を自動化することで "/etc/network/interfaces
"
に上級機能を付与します。
次の実行を追いかけましょう。
$ sudo ifup eth0
"<interface_name_glob>
" が"eth0
"
と一致する時に、この実行は自動的に eth0
を設定する次のコマンドの実行を引き起こします。
$ sudo ifup eth0=$(echo -e '<script_input1> \n <script_input2> \n ...' | <script_name> eth0)
ここで、"map
" を含む行は任意で反復可です。
mapping
スタンザのグロッブはシェルのファイル名グロブのように機能します (「シェルグロブ」参照)。
「基本ネットワーク設定」でしたように
"/etc/network/interfaces
"
ファイルを書き直すことなくいくつかのネットワーク設定間を手動で切り替える方法を次に示します。
アクセスする必要のある全てのネットワーク設定のついて、次に示すような単一の
"/etc/network/interfaces
" ファイルを作ります。
auto lo iface lo inet loopback iface config1 inet dhcp hostname "mymachine" iface config2 inet static address 192.168.11.100 netmask 255.255.255.0 broadcast 192.168.11.255 gateway 192.168.11.1 dns-domain lan dns-nameservers 192.168.11.1 iface pppoe inet manual pre-up /sbin/ifconfig eth0 up up ifup ppp0=dsl down ifdown ppp0=dsl post-down /sbin/ifconfig eth0 down # The following is used internally only iface dsl inet ppp provider dsl-provider iface pots inet ppp provider provider
iface
の後にあるトークンのネットワーク設定名に、ネットワークインターフェース名のトークンを使っていないことに注目下さい。また、何らかのイベントの際にネットワークインターフェース
eth0
を自動的に起動する auto
スタンザも allow-hotplug
スタンザもありません。
さあ、ネットワーク設定を切り替える準備完了です。
あなたの PC を DHCP が提供される LAN に移動します。次のようにしてネットワークインターフェース (物理インターフェース) eth0
にネットワーク設定名 (論理インターフェース名)
config1
を付与してそれを起動します。
$ sudo ifup eth0=config1 Password: ...
インターフェース eth0
が起動され、DHCP で設定され、LAN に接続されます。
$ sudo ifdown eth0=config1 ...
インターフェース eth0
が停止され、LAN から切断されます。
あなたの PC を静的 IP が提供される LAN に移動します。次のようにしてネットワークインターフェース (物理インターフェース) eth0
にネットワーク設定名 (論理インターフェース名)
config2
を付与してそれを起動します。
$ sudo ifup eth0=config2 ...
インターフェース eth0
が起動され、静的 IP で設定され、LAN
に接続されます。dns-*
で与えられる追加パラメーターが
"/etc/resolv.conf
" の内容を設定します。この
"/etc/resolv.conf
" はresolvconf
パッケージがインストールされている方がうまく管理されます。
$ sudo ifdown eth0=config2 ...
インターフェース eth0
が停止され、LAN から再度切断されます。
あなたの PC を PPPoE が提供されているサービスに繋がっている BB モデムのポートに移動します。次のようにしてネットワークインターフェース eth0
にネットワーク設定名 pppoe
を付与してそれを起動します。
$ sudo ifup eth0=pppoe ...
インターフェース eth0
が起動され、ISP に直接接続された PPPoE で設定されます。
$ sudo ifdown eth0=pppoe ...
インターフェース eth0
が停止され再切断されます。
あなたの PC を LAN や BB モデムのない POTS とモデムを使っている場所に移動します。次のようにしてネットワークインターフェース ppp0
にネットワーク設定名 pots
を付与してそれを起動します。
$ sudo ifup ppp0=pots ...
インターフェース ppp0
が起動され、PPP を使ってインターネットに接続されます。
$ sudo ifdown ppp0=pots ...
インターフェース ppp0
が停止され再切断されます。
ifupdown
システムのネットワーク設定状態の現状は
"/etc/network/run/ifstate
" ファイルの内容で確認します。
複数のネットワークインターフェースがある場合には、eth*
や ppp*
等の最後の数字を調整する必要があります。
ifupdown
システムはスクリプトに環境変数を引き渡して
"/etc/network/*/
" 中にインストールされたスクリプトを自動実行します。
表5.14 ifupdown システムが引き渡す環境変数のリスト
環境変数 | 引き渡す変数値 |
---|---|
"$IFACE "
|
処理対象のインターフェースの物理名 (インターフェース名) |
"$LOGICAL "
|
処理対象のインターフェースの論理名 (設定名) |
"$ADDRFAM "
|
インターフェースの <address_family> |
"$METHOD "
|
インターフェースの <method_name>。(例えば "static") |
"$MODE "
|
ifup から実行されると "start"、ifdown から実行されると
"stop"
|
"$PHASE "
|
"$MODE " と同じ、ただし pre-up と
post-up と pre-down と
post-down 段階を詳細に区別
|
"$VERBOSITY "
|
"--verbose " 使用の指標; 使用されたら1、使用されなかったら0
|
"$PATH "
|
コマンドサーチパス:
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin "
|
"$IF_<OPTION> "
|
iface
スタンザ下の対応するオプションの値
|
各環境変数 "$IF_<OPTION>
" は、対応する <option1> や
<option2> オプションの名前に "$IF_
"
を付け、大文字に変換し、ハイホンを下線に変換し、英数字文字以外を捨てて作成されます。
<address_family> や <method_name> や <option1> や <option2> に関しては「"/etc/network/interfaces" の基本的なシンタックス」を参照下さい。
ifupdown-extra
パッケージ (「ifupdown-extra パッケージ」参照) はこのような環境変数を使って
ifupdown
パッケージの機能拡張をします。ifmetric
パッケージ
(「ifmetric パッケージ」参照) は
"$IF_METRIC
" 変数を通してメトリック値を設定する
"/etc/network/if-up.d/ifmetric
"
スクリプトをインストールします。ネットワーク設定の自動選択の簡単で強力な枠組みを提供している guessnet
パッケージ (「guessnet を使う mapping」参照) もまたこれらを使います。
これらの環境変数を使うネットワーク設定スクリプトのより具体的な例に関しては、"/usr/share/doc/ifupdown/examples/*
"
中の例示スクリプトや ifscheme
と
ifupdown-scripts-zg2
パッケージで使われているスクリプトを確認して下さい。このような追加スクリプトは基本的な
ifupdown-extra
や guessnet
パッケージと機能の重複があります。このような追加スクリプトをインストールしたら、干渉しないようにこのようなスクリプトをカスタム化するべきです。
「手動切り替え可能なネットワーク設定」に記述されたように手動で設定選択する代わりに、「mapping スタンザ」に記述された mapping メカニズムをつかってカスタムスクリプトでネットワーク設定を自動的に選択できます。
guessnet
パッケージにより提供される
guessnet-ifupdown
(8) コマンドは mapping
スクリプトとして使われるように設計されており、ifupdown
システムを拡張する強力な枠組みを提供します。
iface
スタンザの下の各ネットワーク設定毎に guessnet
オプションの値としてテスト条件をリストします。
iface
をネットワーク設定として選択します。
guessnet
オプションは
ifupdown
システムにより実行されるスクリプトに追加の環境変数をエクスポートするだけなので、"/etc/network/interfaces
"
ファイルを mapping スクリプトと guessnet-ifupdown
とオリジナルのネットワーク設定インフラである ifupdown
とで重複して利用することで特に支障は起こりません。詳細は guessnet-ifupdown
(8) を参照下さい。
"/etc/network/interfaces
" 中に複数の guessnet
オプション行が必要な時には、オプション行の開始文字列重複を ifupdown
パッケージは許さないので、guessnet1
や guessnet2
等で始まるオプション行を使います。
Iproute2 コマンドは完全な低レベルネットワーク設定機能を提供します。型遅れとなった net-tools コマンドと新しい iproute2 コマンド等との翻訳表を次に示します。
表5.15 型遅れとなった net-tools
コマンドと新しい iproute2
コマンド等との翻訳表
型遅れの net-tools | 新しい iproute2 等 | 操作 |
---|---|---|
ifconfig (8)
|
ip addr
|
デバイスのプロトコル (IP または IPv6) アドレス |
route (8)
|
ip route
|
ルーティングテーブル |
arp (8)
|
ip neigh
|
ARP または NDISC キャッシュ項目 |
ipmaddr
|
ip maddr
|
マルチキャストアドレス |
iptunnel
|
ip tunnel
|
IP 経由トンネル |
nameif (8)
|
ifrename (8)
|
MAC アドレスに基づきネットワークインターフェースを命名 |
mii-tool (8)
|
ethtool (8)
|
イーサーネットデバイスの設定 |
ip
(8) と IPROUTE2
Utility Suite Howto を参照下さい。
次の低レベルネットワークコマンドは、ネットワーク設定を変更しないので安全に使えます。
表5.16 低レベルネットワークコマンドのリスト
コマンド | 説明 |
---|---|
ifconfig
|
有効インターフェースのリンクとアドレスの状態を表示 |
ip addr show
|
有効インターフェースのリンクとアドレスの状態を表示 |
route -n
|
数字を使ったアドレスで全てのルーティングテーブルを表示 |
ip route show
|
数字を使ったアドレスで全てのルーティングテーブルを表示 |
arp
|
ARP キャッシュテーブルの現状の内容を表示 |
ip neigh
|
ARP キャッシュテーブルの現状の内容を表示 |
plog
|
ppp デーモンのログを表示 |
ping yahoo.com
|
"yahoo.com " までのインターネット接続の確認
|
whois yahoo.com
|
ドメインデーターベースに "yahoo.com " を誰が登録したかを確認
|
traceroute yahoo.com
|
"yahoo.com " までのインターネット接続の追跡
|
tracepath yahoo.com
|
"yahoo.com " までのインターネット接続の追跡
|
mtr yahoo.com
|
"yahoo.com " までのインターネット接続の追跡 (繰り返し)
|
dig [@dns-server.com] example.com [{a|mx|any}]
|
"example.com " のDNS レコードを
"dns-server.com " で"a " か
"mx " か "any " かのレコードに関して確認します。
|
iptables -L -n
|
パケットフィルターの確認 |
netstat -a
|
オープンポートの発見 |
netstat -l --inet
|
聴取中のポートの発見 |
netstat -ln --tcp
|
聴取中の TCP ポートの発見 (数字) |
dlint example.com
|
"examle.com " の DNS ゾーン情報を確認
|
これらの低レベルネットワーク設定ツールは "/sbin/
"
中にあります。"/sbin/ifconfig
" 等のような完全コマンドパスを使うか、
"~/.bashrc
" 中の "$PATH
" リストに
"/sbin
" を追加する必要があるかもしれません。
一般的なネットワークの最適化は本書の射程外です。ここでは消費者用の接続に関する課題にのみ触れます。
表5.17 ネットワーク最適化ツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
iftop
*
|
V:1.3, I:7 | 72 | ネットワークインターフェースの帯域利用情報を表示 |
iperf
*
|
V:0.5, I:3 | 200 | インターネットプロトコルのバンド幅測定ツール |
apt-spy *
|
V:0.17, I:1.7 | 204 |
バンド幅テストに基づき "/etc/apt/sources.list " ファイルを作成
|
ifstat *
|
V:0.2, I:1.2 | 88 | インターフェース統計モニター |
bmon
*
|
V:0.2, I:0.9 | 188 | 可搬型バンド幅モニター兼速度推定機 |
ethstatus *
|
V:0.10, I:0.7 | 84 | ネットワークデバイスのスループットを迅速に測定するスクリプト |
bing
*
|
V:0.08, I:0.6 | 96 | 経験則的確率バンド幅試験ソフト |
bwm-ng *
|
V:0.2, I:1.2 | 152 | 簡単軽量のコンソール式のバンド幅モニター |
ethstats *
|
V:0.05, I:0.3 | 52 | コンソール式のイーサーネット統計モニター |
ipfm
*
|
V:0.04, I:0.19 | 156 | 帯域分析ツール |
最大送信単位 (MTU)
値は、ping
(8) を"-M do
" オプションとともに使って ICMP
パケットをデーターサイズ 1500 (IP+ICMP ヘッダー分の28バイトを加えて) から始めて IP
フラグメンテーションしない最大サイズを見つけることで実験的に決定できます。
例えば、次を試してみて下さい:
$ ping -c 1 -s $((1500-28)) -M do www.debian.org PING www.debian.org (194.109.137.218) 1472(1500) bytes of data. From 192.168.11.2 icmp_seq=1 Frag needed and DF set (mtu = 1454) --- www.debian.org ping statistics --- 0 packets transmitted, 0 received, +1 errors
1500ではなく1452を試す
ping
(8) が1454で成功するのを確認します。
このプロセスはパス MTU (PMTU) 発見 (RFC1191) で、tracepath
(8)
コマンドで自動化できます。
PMTU 値が1454となる上記例は Asynchronous Transfer Mode (ATM) をバックボーンネットワークとして使い顧客を PPPoE でサービスしていた FTTP プロバイダーの場合でした。実際の PMTU 値はあなたの環境に依存します。例えば私の新しい FTTP プロバイダーの場合は1500です。
表5.18 最適 MTU 値の基本的なガイドライン
ネットワーク環境 | MTU | 理由 |
---|---|---|
ダイヤルアップ接続 (IP: PPP) | 576 | 標準 |
イーサーネット接続 (IP: DHCP または固定) | 1500 | 標準かつデフォールト |
イーサーネット接続 (IP: PPPoE) | 1492 (=1500-8) | PPP ヘッダーに2バイト、PPPoE ヘッダーに6バイト、 |
イーサーネット接続 (ISP のバックボーン: ATM、IP: DHCP または固定) | 1462 (=48*31-18-8) | 著者推定: イーサーネットヘッダーに18、SAR 末尾に8 |
イーサーネット接続 (ISP のバックボーン: ATM、IP: PPPoE) | 1454 (=48*31-8-18-8) | 根拠は"Optimal MTU configuration for PPPoE ADSL Connections"参照 |
これらの基本的なガイドラインに加えて、次を覚えておきます。
MTU 値をそのデフォールトの1500から1454に設定する例を次に示します。
DHCP (「DHCP サービスを受けるネットワークインターフェース」参照)
の場合、"/etc/network/interfaces
" 中の該当する iface
スタンザ行を次と交換する事ができます。
iface eth0 inet dhcp hostname "mymachine" pre-up /sbin/ifconfig $IFACE mtu 1454
静的 IP (「静的 IP を使うネットワークインターフェース」参照)
の場合、"/etc/network/interfaces
" 中の該当する iface
スタンザ行を次と交換する事ができます。
iface eth0 inet static address 192.168.11.100 netmask 255.255.255.0 broadcast 192.168.11.255 gateway 192.168.11.1 mtu 1454 dns-domain lan dns-nameservers 192.168.11.1
直接の PPPoE (「pppoeconf を使った PPPoE 接続」参照)
の場合、"/etc/ppp/peers/dsl-provider
" 中の該当する
"mtu
" 行を次と交換する事ができます。
mtu 1454
最大セグメントサイズ (MSS) はパケットサイズの代替尺度として使われます。MSS と MTU の関係は次です。
iptables
(8) (「Netfilter インフラ」参照) を使う最適化は MSS
を使ってパッケットサイズを制約できるのでルーターとして有用です。iptables
(8) 中の "TCPMSS"
を参照下さい。
現代的な高帯域でレイテンシーの大きな WAN では、TCP のスループットは TCP バッファーサイズパラメーターを "TCP Tuning Guide" や "TCP tuning" に書かれている手順で調整することで最大化できます。今のところ現在の Debian のデフォールトは高速の 1G bps の FTTP サービスでつながっている私の LAN でも十分機能しています。
Netfilter はLinux カーネルのモジュール (「カーネルモジュール初期化」参照) を利用するステートフルファイアーウォールとネットワークアドレス変換 (NAT) のインフラを提供します。
表5.19 ファイアーウォールツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
iptables *
|
V:27, I:99 | 1316 | netfilter のための管理ツール |
iptstate *
|
V:0.14, I:0.9 | 152 |
netfilter の状態を常時モニター
(top (1) と類似)
|
shorewall-perl *
|
V:0.15, I:0.5 | 76 |
Shoreline ファイアーウォール、netfilter 設定ファイル生成システム (Perl
ベース、lenny で推薦)
|
shorewall-shell *
|
I:1.9 | 76 |
Shoreline ファイアーウォール、netfilter 設定ファイル生成システム
(シェルベース、lenny での代替)
|
netfilter のユーザー空間の主プログラムは
iptables
(8) です。シェルから対話形式で手動で netfilter を設定し、その状態を
iptables-save
(8)
で保存し、iptables-restore
(8) を使って init
スクリプト経由でシステムのリブート時に回復できます。
shorewall のような設定ヘルパースクリプトはこの過程を簡単にします。
http://www.netfilter.org/documentation/
(または "/usr/share/doc/iptables/html/
" 中) の文書を参照下さい。
これらは Linux 2.4
のために書かれたとはいえ、iptables
(8) コマンドも netfilter カーネル機能も現在の Linux
2.6 にもあてはまります。
ネットワーク接続を確立した (5章ネットワークの設定参照) あとで、各種のネットワークアプリケーションを実行できます。
多くのウェッブブラウザーパッケージがハイパーテキストトランスファープロトコル (HTTP) を使って遠隔コンテントにアクセスするために存在します。
表6.1 ウェッブブラウザーのリスト
パッケージ | ポプコン | サイズ | タイプ | ウェッブブラウザーの説明 |
---|---|---|---|---|
iceweasel *
|
V:30, I:48 | 3761 | X | ブランドを外した Mozilla Firefox |
iceape-browser *
|
V:1.4, I:2 | 35686 | , , | 非商標化された Mozilla、bug#505565 というセキュリティー問題で削除済 |
epiphany-browser *
|
V:13, I:34 | 1060 | , , | GNOME、HIG 準拠、Epiphany |
galeon *
|
V:0.9, I:1.4 | 1776 | , , | GNOME、Galeon は Epiphany が継承 |
konqueror *
|
V:8, I:15 | 3584 | , , | KDE、Konqueror |
w3m
*
|
V:24, I:84 | 1992 | テキスト | w3m |
lynx
*
|
I:22 | 252 | , , | Lynx |
elinks *
|
V:2, I:5 | 1448 | , , | ELinks |
links
*
|
V:3, I:9 | 1380 | , , | Links (テキストのみ) |
links2 *
|
V:0.7, I:3 | 3288 | グラフィクス | Links (X を使わないコンソールグラフィクス) |
次に示す特別の URL 文字列を使うと一部のブラウザーでその設定値を確認する事ができます。
about:
"
about:config
"
about:plugins
"
Debian は、Java (ソフトウエアープラットフォーム) や Flash のみならず、MPEG や MPEG2 や MPEG4 や DivX や Windows Media Video (.wmv) や QuickTime (.mov) や MP3 (.mp3) や Ogg/Vorbis ファイルや DVDs や VCDs 等を取り扱えるブラウザーのプラグインコンポーネントを提供します。Debian では contrib や non-free アーカイブエリアに non-free のブラウザープラグインパッケージを提供しています。
表6.2 ブラウザープラグインのリスト
パッケージ | ポプコン | サイズ | エリア | 説明 |
---|---|---|---|---|
icedtea6-plugin *
|
V:0.9, I:1.6 | 272 | main | OpenJDK と IcedTea に基づく Java プラグイン |
sun-java6-plugin *
|
I:10 | 100 | non-free | Sun の Java SE 6 (i386 専用) のための Java プラグイン |
mozilla-plugin-gnash *
|
V:0.4, I:4 | 60 | main | Gnash に基づく Flash のプラグイン |
flashplugin-nonfree *
|
V:1.3, I:15 | 132 | contrib | Adobe Flash Player (i386 と amd64 専用) をインストールする Flash のプラグインヘルパー |
mozilla-plugin-vlc *
|
V:3, I:4 | 128 | main | VLC メディアプレイヤーに基づくマルチメディアプラグイン |
totem-mozilla *
|
V:20, I:34 | 544 | main | GNOME's Totem メディアプレイヤーに基づくマルチメディアプラグイン |
gecko-mediaplayer *
|
V:0.6, I:0.8 | 724 | main | (GNOME) MPlayer に基づくマルチメディアプラグイン |
nspluginwrapper *
|
V:1.8, I:3 | 472 | contrib | i386 Netscape プラグインを amd64 アーキテクチャー上で実行するためのラッパー |
上記の Debian パッケージを使うのが遥に簡単であるとはいえ、今でもブラウザーのプラグインは "*.so" をプラグインディレクトリー (例えば
"/usr/lib/iceweasel/plugins/
")
等にインストールしブラウザーを再起動することで手動で有効にすることができます。
ウェッブサイトによっては使っているブラウザーのユーザーエージェント文字列によって接続を拒否します。こういう状況はユーザーエージェント文字列を偽装することで回避できます。例えば、これは次の内容を
"~/.gnome2/epiphany/mozilla/epiphany/user.js
" か
"~/.mozilla/firefox/*.default/user.js
"
といったユーザー設定ファイル追加すればできます。
user_pref{"general.useragent.override","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"};
こうする代わりに、URL に"about:config
"
を入力して表示画面内容を右クリックしてこの変数を追加や再設定することでもできます。
偽装されたユーザーエージェント文字列は Java に対して良からぬ副次効果を引き起こすかもしれません。
もしインターネットと直接メール交換するメールサーバーを設定するなら、このような初歩的文書が不要なぐらいシステムを熟知しているべきです。
以下の設定例は消費者用インターネット接続上の典型的モービルワークステーションにのみ有効です。
スパム (望みも頼みもしない email) 問題を封じ込めるために、多くの消費者用インターネット接続を提供する ISP は対抗措置を実施しています。
メールシステムを設定したりメール配達問題を解決する際には、こうした新たな制約に配慮しなければいけません。
このような敵意のあるインターネットの状況と制約を考慮して、Yahoo.com や Gmail.com 等の独立インターネットメール ISP はトランスポートレイヤーセキュリティー (TLS) やその前駆者であるセキュアーソケットレイヤー (SSL) を使ってインターネット上のどこからでも接続できるセキュアーなメールサービスを提供しています。
リモートホストに確実にメールを直接送るために、消費者用インターネット接続上で SMTP
サーバーを実行するのは現実的ではありません。メールは拒否されるでしょう。あなたの接続 ISP もしくは独立メール ISP
が提供する何らかのスマートホストサービスを使わなければいけません。次の文章では簡単のために、そのスマートホストが
"smtp.hostname.dom
" にあり、SMTP
AUTH を必要とし、メッセージサブミッションポート (587) を使うと仮定します。
最も簡単なメール設定は、MUA (「メールユーザーエージェント (MUA)」参照) 自身が ISP
のスマートホストにメールを送信し ISP の POP3 サーバーからメールを受信する設定です。この設定タイプは機能が充実した
icedove
(1) や evolution
(1) 等の GUI の MUA
でよく使われます。メールを種類毎にフィルターする必要がある際には MUA のフィルター機能を使う必要があります。このような場合にはローカルの MTA
(「メールトランスポートエージェント (MTA)」参照) はローカル配送のみをする必要があります。
これに代わるメール設定は、ローカルの MTA 経由で ISP のスマートホストにメールを送信し ISP の POP3 サーバーからメール取得プログラム
(「リモートメールの取得および転送ユーティリティー」参照)
によってローカルのメイルボックスに受信する設定です。メールの種類毎にフィルターする必要がある場合には、フィルター付きの MDA (「フィルター付きのメールデリバリーエージェント (MDA)」参照)
を使って別々のメイルボックスにフィルターします。このタイプの設定は、どんな MUA で設定することができるのですが、単純な
mutt
(1) や gnus
(1) 等のコンソールの MUA (「メールユーザーエージェント (MUA)」参照) でよく使われます。このような場合にはローカルの MTA (「メールトランスポートエージェント (MTA)」参照)
はスマートホストへの配送とローカル配送の両方をする必要があります。モービルワークステーションは有効な FQDN
を持たないので、メール配送エラーを避けるように外部に出すメール中のローカルメール名を隠して偽装するようにローカル MTA を設定します (「メールアドレス設定」参照)。
Maildir を使いホームディレクトリー下のどこかに email のメッセージを保存するように MUA/MDA を設定したいかもしれません。
普通のワークステーションでは、メールトランスポートエージェント (MTA) にexim4-*
か
postfix
パッケージのどちらがよく選ばれます。この選択は全くあなた次第です。
表6.3 ワークステーションでの基本的メールトランスポートエージェント関連パッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
exim4-daemon-light *
|
V:60, I:65 | 1104 | Exim4 メールトランスポートエージェント (MTA: Debian のデフォールト) |
exim4-base *
|
V:62, I:68 | 1688 | Exim4 文書 (text) と共通ファイル |
exim4-doc-html *
|
I:0.6 | 3440 | Exim4 文書 (html) |
exim4-doc-info *
|
I:0.3 | 556 | Exim4 文書 (info) |
postfix *
|
V:18, I:20 | 3492 | Postfix メールトランスポートエージェント (MTA: Debian の代替候補) |
postfix-doc *
|
I:1.9 | 3420 | Postfix 文書 (html+text) |
sasl2-bin *
|
V:2, I:5 | 448 | Cyrus SASL API の実装 (SMTP AUTH について postfix を補完) |
cyrus-sasl2-doc *
|
I:2 | 284 | Cyrus SASL - 文書 |
ポプコンの投票数では exim4-*
は postfix
より何倍も人気があるようですが、postfix
が Debian
のデベロッパーに人気がないということではありません。Debian のサーバーシステムは exim4
も
postfix
も使っています。目立つ Debian のデベロッパーからのメーリングリスト投稿 メールのヘッダーの分析は、これら両方の MTA
がともに人気があることを示唆しています。
exim4-*
パッケージは非常に小さなメモリー消費とその設定が非常にフレキシブルであることで知られています。postfix
パッケージは非常にコンパクトで高速で単純でセキュアーであることで知られています。両ソフトウエアーは十分な文書とともに提供され、品質とライセンスでもともに良好です。
Debian アーカイブ中には異なった能力と狙いを持ったメールトランスポートエージェント (MTA) パッケージに関して多くの選択肢があります。
表6.4 Debian アーカイブ中のメールトランスポートエージェント (MTA) パッケージに関する選択肢リスト
パッケージ | ポプコン | サイズ | 能力と狙い |
---|---|---|---|
exim4-daemon-light *
|
V:60, I:65 | 1104 | 高機能 |
postfix *
|
V:18, I:20 | 3492 | 高機能 (セキュリティー) |
exim4-daemon-heavy *
|
V:1.7, I:1.9 | 1220 | 高機能 (柔軟性) |
sendmail-bin *
|
V:1.9, I:2 | 2052 | 高機能 (既に慣れている場合) |
nullmailer *
|
V:0.7, I:0.8 | 436 | 超軽量、ローカルメール無し |
ssmtp
*
|
V:1.2, I:1.7 | 0 | 超軽量、ローカルメール無し |
courier-mta *
|
V:0.14, I:0.15 | 12316 | 超高機能 |
xmail
*
|
V:0.14, I:0.16 | 836 | 軽量 |
masqmail *
|
V:0.04, I:0.05 | 624 | 軽量 |
esmtp
*
|
V:0.09, I:0.2 | 172 | 軽量 |
esmtp-run *
|
V:0.07, I:0.11 | 64 |
軽量 (esmtp の sendmail 互換性拡張)
|
msmtp
*
|
V:0.3, I:0.8 | 340 | 軽量 |
msmtp-mta *
|
V:0.11, I:0.15 | 32 |
軽量 (msmtp の sendmail 互換性拡張)
|
スマートホスト経由のインターネットメールに関しては、exim4-*
パッケージを次のように (再)設定します。
$ sudo /etc/init.d/exim4 stop $ sudo dpkg-reconfigure exim4-config
"General type of mail configuration" に関して、"スマートホストでメール送信; SMTP または fetchmail で受信する" を選択します。
"System mail name:" をそのデフォルトである FQDN (「ホスト名の解決」参照) に設定します。
"IP-addresses to listen on for incoming SMTP connections:" をそのデフォルトである "127.0.0.1 ; ::1" と設定します。
"Other destinations for which mail is accepted:" の内容を消去します。
"Machines to relay mail for:" の内容を消去します。
"送出スマートホストの IP アドレスまたはホスト名:" を"smtp.hostname.dom:587" と設定します。
"Hide local mail name in outgoing mail?" に関して "<No>"
を選択します。(この代わりに、「メールアドレス設定」にある
"/etc/email-addresses
" を使用します。)
"DNS クエリの数を最小限に留めますか (ダイヤルオンデマンド)?" に次の内のひとつの返答をします。
"Delivery method for local mail:" を"mbox format in /var/mail/" と設定します。
"Split configuration into small files?:" に関して "<Yes>" を選択します。
"/etc/exim4/passwd.client
"
を編集しスマートホストのためのパスワードエントリーを作成します。
$ sudo vim /etc/exim4/passwd.client ... $ cat /etc/exim4/passwd.client ^smtp.*\.hostname\.dom:username@hostname.dom:password
次のようにして exim4
を起動します。
$ sudo /etc/init.d/exim4 start
"/etc/exim4/passwd.client
"
中のホスト名はエリアスであってはいけません。真のホスト名は次の様にして確認できます。
$ host smtp.hostname.dom smtp.hostname.dom is an alias for smtp99.hostname.dom. smtp99.hostname.dom has address 123.234.123.89
エリアス問題を回避するために "/etc/exim4/passwd.client
"
の中に正規表現を用いています。もし ISP がエリアスで示されるホストを移動させても SMTP AUTH がきっと動きます。
"/etc/exim4/
" 中の exim4
設定ファイルを手動で改変した後には update-exim4.conf
(8) を実行しなければいけません。
"DNS クエリの数を最小限に留めますか (ダイヤルオンデマンド)?" という debconf の質問に "No" (デフォールト値)
が選ばれシステムがブート時にインターネットに繋がっていない場合、exim4
の起動は長い時間がかかります。
次に示す正式のガイドを読んで下さい:
"/usr/share/doc/exim4-base/README.Debian.gz
" と
update-exim4.conf
(8)。
ローカルのカスタム化ファイル "/etc/exim4/exim4.conf.localmacros
" を作成して
MACRO を設定してもいいです。例えば、Yahoo のメールサービスでは
"MAIN_TLS_ENABLE = true
" と
"AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS = yes
"
がその設定の中に必要だと言われています。
あなたのラップトップ PC 用に "/etc/aliases
" を尊重する軽量 MTA
を探しているなら、exim4
(8) の設定を
"/etc/default/exim4
" 中に
"QUEUERUNNER='queueonly'
" や
"QUEUERUNNER='nodaemon'
" 等と設定する事を考慮するべきです。
スマートホスト経由のインターネットメールに関しては postfix 文書と重要マニュアルページを読むことから始めるべきです。
表6.5 重要 postfix マニュアルページのリスト
コマンド | 機能 |
---|---|
postfix (1)
|
Postfix コントロールプログラム |
postconf (1)
|
Postfix の設定ユーティリティー |
postconf (5)
|
Postfix 設定パラメーター |
postmap (1)
|
Postfix 検索テーブルのメンテナンス |
postalias (1)
|
Postfix エリアスデーターベースのメンテナンス |
postfix
と sasl2-bin
パッケージを次のように
(再)設定します。
$ sudo /etc/init.d/postfix stop $ sudo dpkg-reconfigure postfix
"スマートホストを使ってインターネット" を選択します。
"SMTP リレーホスト (なければ空):" を "[smtp.hostname.dom]:587
"
と設定します。
$ sudo postconf -e 'smtp_sender_dependent_authentication = yes' $ sudo postconf -e 'smtp_sasl_auth_enable = yes' $ sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd' $ sudo postconf -e 'smtp_sasl_type = cyrus' $ sudo vim /etc/postfix/sasl_passwd
スマートホストのパスワードエントリーを作成します。
$ cat /etc/postfix/sasl_passwd [smtp.hostname.dom]:587 username:password $ sudo postmap hush:/etc/postfix/sasl_passwd
次に記すように postfix
を起動します。
$ sudo /etc/init.d/postfix start
dpkg-reconfigure
ダイアログと
"/etc/postfix/sasl_passwd
" の中で "[
" と
"]
" を使うことで MX レコードを確認せずに指定された hostname
その物を直接使うように確実にします。"usr/share/doc/postfix/html/SASL_README.html
"
の中の "Enabling SASL authentication in the Postfix SMTP client" を参照下さい。
メールのトランスポートとデリバリーとユーザーのエージェントが使うメールアドレス設定ファイルが少々存在します。
表6.6 メールアドレス関連のファイルのリスト
ファイル | 機能 | アプリケーション |
---|---|---|
/etc/mailname
|
(送出)メールのデフォールトのホスト名 |
Debian 固有、mailname (5)
|
/etc/email-addresses
|
送出メールのホスト名の偽装 |
exim (8) 固有、exim4-config_files (5)
|
/etc/postfix/generic
|
送出メールのホスト名の偽装 |
postfix (1) 固有、postmap (1) コマンド実行後有効。
|
/etc/aliases
|
受入メールのためのアカウント名のエリアス |
一般的、newaliases (1) コマンド実行後有効。
|
通常 "/etc/mailname
" ファイル中の mailname はホストの IP の一つとして解決できる完全修飾ドメイン名 (FQDN)
です。解決できる IP アドレスのあるホスト名を持たない可動ワークステーションの場合には、この mailname を "hostname -f
"
に設定します。(これは exim4-*
と postfix
の両方に有効な安全な選択肢です。)
"/etc/mailname
" の内容は多くの MTA
以外のプログラムによってそのデフォールト挙動のために使われます。mutt
の場合、~/muttrc
ファイル中の "hostname
" と
"from
" 変数を設定して mailname の値をオーバーライドします。bts
(1) や
dch
(1) 等の devscripts
パッケージ中のプログラムの場合、環境変数の "$DEBFULLNAME
" や
"$DEBEMAIL
" をエキスポートしてその値をオーバーライドします。
通常 popularity-contest
パッケージは root アカウントからメールを FQDN
付きで送信します。/usr/share/popularity-contest/default.conf
に記載された様に /etc/popularity-contest.conf
中に
MAILFROM
を設定する必要があります。こうしないと、smarthost の SMTP
サーバーによってあなたのメールは拒否されます。少々面倒ですが、root からの全メールの発信元を書き替えるより、この方法は安全ですし、他のデーモンや
cron スクリプトに関してもこの方法を適用するべきです。
mailname を"hostname
-f
" と設定した時には、次によって MTA で発信元メールアドレスを偽装することが実現できます。
exim4
(8) の場合、exim4-config_files
(5)
に説明されているように "/etc/email-addresses
"
postfix
(1) の場合、generic
(5) に説明されているように
"/etc/postfix/generic
"
postfix
の場合、次に記す追加ステップが必要です。
# postmap hash:/etc/postfix/generic # postconf -e 'smtp_generic_maps = hash:/etc/postfix/generic' # postfix reload
あなたのメール設定は次のようにするとテストできます。
exim
(8) の場合、-brw, -bf, -bF, -bV, …
オプションを使用
postmap
(1) の場合、-q
オプションを使用
Exim はexiqgrep
(8) や exipick
(8)
のようないくつかのユーティリティープログラムとともに供給されます。利用可能なコマンドは "dpkg -L
exim4-base|grep man8/
" を参照下さい。
基本的な MTA 操作が存在します。その一部は sendmail
(1)
互換性インターフェース経由で実行する事もできます。
表6.7 基本的 MTA 操作のリスト
exim コマンド | postfix コマンド | 説明 |
---|---|---|
sendmail
|
sendmail
|
標準入力からメールを読み配送を手配 (-bm )
|
mailq
|
mailq
|
メールキューを状態とキュー ID とともにリスト (-bp )
|
newaliases
|
newaliases
|
エリアスデーターベースを初期化 (-I )
|
exim4 -q
|
postqueue -f
|
待機メールを排出 (-q )
|
exim4 -qf
|
postsuper -r ALL deferred; postqueue -f
|
全メールを排出 |
exim4 -qff
|
postsuper -r ALL; postqueue -f
|
凍結メールをも排出 |
exim4 -Mg queue_id
|
postsuper -h queue_id
|
キュー ID によってメッセージを凍結 |
exim4 -Mrm queue_id
|
postsuper -d queue_id
|
キュー ID によってメッセージを削除 |
N/A |
postsuper -d ALL
|
全メッセージを削除 |
"/etc/ppp/ip-up.d/*
" 中のスクリプトで全メールを排出するのは良い考えかも知れません。
Debian 関連のメーリングリストを購読する場合、参加者のデファクトスタンダードで期待通り挙動をする mutt
や gnus
等の MUA を使うのは良い考えかも知れません。
表6.8 メールユーザーエージェント (MUA) のリスト
パッケージ | ポプコン | サイズ | タイプ |
---|---|---|---|
iceweasel *
|
V:30, I:48 | 3761 | X GUI プログラム (ブランドを外した Mozilla Firefox) |
evolution *
|
V:16, I:34 | 4724 | X GUI プログラム (グループウエアスイートの一部) |
icedove *
|
V:8, I:12 | 38864 | X GUI プログラム (ブランドを外した Mozilla Thunderbird) |
mutt
*
|
V:26, I:83 | 6004 |
きっと vim とともに使われるキャラクターターミナルプログラム
|
gnus
*
|
V:0.06, I:0.3 | 6453 |
(x)emacs の下でキャラクターターミナルプログラム
|
vim
と組み合わせて mutt
をメールユーザーエージェント (MUA)
として使うように "~/.muttrc
" を使って次に示すようにカスタム化します。
# # User configuration file to override /etc/Muttrc # # spoof source mail address set use_from set hostname=example.dom set from="Name Surname <username@example.dom>" set signature="~/.signature" # vim: "gq" to reformat quotes set editor="vim -c 'set tw=72 et ft=mail'" # "mutt" goes to Inbox, while "mutt -y" lists mailboxes set mbox_type=Maildir # use qmail Maildir format for creating mbox set mbox=~/Mail # keep all mail boxes in $HOME/Mail/ set spoolfile=+Inbox # mail delivered to $HOME/Mail/Inbox set record=+Outbox # save fcc mail to $HOME/Mail/Outbox set postponed=+Postponed # keep postponed in $HOME/Mail/postponed set move=no # do not move Inbox items to mbox set quit=ask-yes # do not quit by "q" only set delete=yes # always delete w/o asking while exiting set fcc_clear # store fcc as non encrypted # Mailboxes in Maildir (automatic update) mailboxes `cd ~/Mail; /bin/ls -1|sed -e 's/^/+/' | tr "\n" " "` unmailboxes Maillog *.ev-summary ## Default #set index_format="%4C %Z %{%b %d} %-15.15L (%4l) %s" ## Thread index with senders (collapse) set index_format="%4C %Z %{%b %d} %-15.15n %?M?(#%03M)&(%4l)? %s" ## Default #set folder_format="%2C %t %N %F %2l %-8.8u %-8.8g %8s %d %f" ## just folder names set folder_format="%2C %t %N %f"
HTML メールや MS ワードのインラインのアッタチメントを表示するように、"/etc/mailcap
" か
"~/.mailcap
" に次に記す内容を追加します。
text/html; lynx -force_html %s; needsterminal; application/msword; /usr/bin/antiword '%s'; copiousoutput; description="Microsoft Word Text"; nametemplate=%s.doc
Mutt はIMAP クライアントやメールボックス様式変換機として使えます。メッセージを
"t
" や "T
" 他でタグできます。こうしてタグされたメッセージは
";C
" を使う異なるメールボックス間の移動や ";d
"
を使う消去で一括処理できます。
fetchmail
(1) は GNU/Linux 上のリモートメールの取得のデファクト標準でしたが、著者は現在
getmail
(1)
が気に入っています。もしバンド幅を節約するためにメールをダウンロードする前に拒否したいなら、mailfilter
か mpop
が役に立つかもしれません。どのメールの取得ユーティリティーを使おうとも、取得したメールをパイプ経由で
maildrop
等の MDA に配送するようにシステム設定をすることをお勧めします。
表6.9 リモートメールの取得および転送ユーティリティーのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
fetchmail *
|
V:2, I:5 | 2588 | メール取得ユーティリティー (POP3、APOP、IMAP) (旧式) |
getmail4 *
|
V:0.3, I:0.9 | 668 | メール取得ユーティリティー (POP3、IMAP4、SDPS) (単純、セキュアー、高信頼) |
mailfilter *
|
V:0.00, I:0.07 | 332 | メール取得ユーティリティー (POP3)、regex フィルター機能付き |
mpop
*
|
V:0.01, I:0.08 | 324 | メール取得ユーティリティー (POP3) かつ MDA、フィルター機能付き |
getmail
(1) の設定は getmail 文書に記載されています。次に示すのがユーザーとして複数の
POP3 アカウントにアクセスする著者の設定です。
"/usr/local/bin/getmails
" を次のように作成します。
#!/bin/sh set -e if [ -f $HOME/.getmail/running ]; then echo "getmail is already running ... (if not, remove $HOME/.getmail/running)" >&2 pgrep -l "getmai[l]" exit 1 else echo "getmail has not been running ... " >&2 fi if [ -f $HOME/.getmail/stop ]; then echo "do not run getmail ... (if not, remove $HOME/.getmail/stop)" >&2 exit fi if [ "x$1" = "x-l" ]; then exit fi rcfiles="/usr/bin/getmail" for file in $HOME/.getmail/config/* ; do rcfiles="$rcfiles --rcfile $file" done date -u > $HOME/.getmail/running eval "$rcfiles $@" rm $HOME/.getmail/running
次のように設定します。
$ sudo chmod 755 /usr/local/bin/getmails $ mkdir -m 0700 $HOME/.getmail $ mkdir -m 0700 $HOME/.getmail/config $ mkdir -m 0700 $HOME/.getmail/log
各 POP3 アカウント毎に "$HOME/.getmail/config/pop3_name
"
設定ファイルを次のように作成します。
[retriever] type = SimplePOP3SSLRetriever server = pop.example.com username = pop3_name@example.com password = secret [destination] type = MDA_external path = /usr/bin/maildrop unixfrom = True [options] verbose = 0 delete = True delivered_to = False message_log = ~/.getmail/log/pop3_name.log
次のように設定します。
$ chmod 0600 $HOME/.getmail/config/*
"/usr/local/bin/getmails
" が15分毎に
cron
(8) により実行されるようにスケジュールするために、"sudo crontab -e
-u <user_name>
" と実行して次に記すユーザーの cron エントリーを追加します。
5,20,35,50 * * * * /usr/local/bin/getmails --quiet
POP3 へのアクセス問題は getmail
に起因しないかもしれません。一部の有名な無償の POP3 サービスは
POP3 のプロトコルに違反しているかも知れませんし、それらのスパムフィルターが完璧でないかも知れません。例えば、RETR コマンドを受信すると
DELE
コマンドの受信を待たずにメッセージを消去するかもしれませんし、スパムメールボックスに隔離するかも知れません。被害を最小限にするにアクセスされたメッセージをアーカイブして消去しないようにサービスの設定をします。"Some mail was not downloaded"
を参照下さい。
postfix
や exim4
等のほとんどの MTA プログラムは、MDA
(メールデリバリーエージェント) として機能します。フィルター機能のある専門の MDA があります。
procmail
(1) は GNU/Linux 上のフィルター付きの MDA のデファクト標準でしたが、著者は現在
maildrop
(1) が気に入っています。どのフィルターユーティリティーを使おうとも、フィルターされたメールを
qmail スタイルの Maildir
にデリバリーするようにシステムを設定します。
表6.10 フィルター付きの MDA のリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
procmail *
|
V:19, I:84 | 368 | フィルター付き MDA (旧式) |
mailagent *
|
V:0.3, I:5 | 1692 | Perl フィルター付き MDA |
maildrop *
|
V:0.3, I:0.8 | 1000 | 構造化フィルター言語付き MDA |
maildrop
(1) の設定は maildropfilter 文書に記載されています。次に
"$HOME/.mailfilter
" の設定例を示します。
# Local configuration MAILROOT="$HOME/Mail" # set this to /etc/mailname contents MAILHOST="example.dom" logfile $HOME/.maildroplog # rules are made to override the earlier value by the later one. # mailing list mails ? if ( /^Precedence:.*list/:h || /^Precedence:.*bulk/:h ) { # rules for mailing list mails # default mailbox for mails from mailing list MAILBOX="Inbox-list" # default mailbox for mails from debian.org if ( /^(Sender|Resent-From|Resent-Sender): .*debian.org/:h ) { MAILBOX="service.debian.org" } # default mailbox for mails from bugs.debian.org (BTS) if ( /^(Sender|Resent-From|Resent-sender): .*@bugs.debian.org/:h ) { MAILBOX="bugs.debian.org" } # mailbox for each properly maintained mailing list with "List-Id: foo" or "List-Id: ...<foo.bar>" if ( /^List-Id: ([^<]*<)?([^<>]*)>?/:h ) { MAILBOX="$MATCH2" } } else { # rules for non-mailing list mails # default incoming box MAILBOX="Inbox-unusual" # local mails if ( /Envelope-to: .*@$MAILHOST/:h ) { MAILBOX="Inbox-local" } # html mails (99% spams) if ( /DOCTYPE html/:b ||\ /^Content-Type: text\/html/ ) { MAILBOX="Inbox-html" } # blacklist rule for spams if ( /^X-Advertisement/:h ||\ /^Subject:.*BUSINESS PROPOSAL/:h ||\ /^Subject:.*URGENT.*ASISSTANCE/:h ||\ /^Subject: *I NEED YOUR ASSISTANCE/:h ) { MAILBOX="Inbox-trash" } # whitelist rule for normal mails if ( /^From: .*@debian.org/:h ||\ /^(Sender|Resent-From|Resent-Sender): .*debian.org/:h ||\ /^Subject: .*(debian|bug|PATCH)/:h ) { MAILBOX="Inbox" } # whiltelist rule for BTS related mails if ( /^Subject: .*Bug#.*/:h ||\ /^(To|Cc): .*@bugs.debian.org/:h ) { MAILBOX="bugs.debian.org" } # whitelist rule for getmails cron mails if ( /^Subject: Cron .*getmails/:h ) { MAILBOX="Inbox-getmails" } } # check existance of $MAILBOX `test -d $MAILROOT/$MAILBOX` if ( $RETURNCODE == 1 ) { # create maildir mailbox for $MAILBOX `maildirmake $MAILROOT/$MAILBOX` } # deliver to maildir $MAILBOX to "$MAILROOT/$MAILBOX/" exit
procmail
と違い、maildrop
は欠落した maildir
ディレクトリーを自動的に作りません。"$HOME/.mailfilter
" の例中のように事前に
maildirmake
(1) を使ってディレクトリーを作らなければいけません。
procmail
(1) 用の "$HOME/.procmailrc
"
を使う類似設定を次に記します。
MAILDIR=$HOME/Maildir DEFAULT=$MAILDIR/Inbox/ LOGFILE=$MAILDIR/Maillog # clearly bad looking mails: drop them into X-trash and exit :0 * 1^0 ^X-Advertisement * 1^0 ^Subject:.*BUSINESS PROPOSAL * 1^0 ^Subject:.*URGENT.*ASISSTANCE * 1^0 ^Subject: *I NEED YOUR ASSISTANCE X-trash/ # Delivering mailinglist messages :0 * 1^0 ^Precedence:.*list * 1^0 ^Precedence:.*bulk * 1^0 ^List- * 1^0 ^X-Distribution:.*bulk { :0 * 1^0 ^Return-path:.*debian-devel-admin@debian.or.jp jp-debian-devel/ :0 * ^Resent-Sender.*debian-user-request@lists.debian.org debian-user/ :0 * ^Resent-Sender.*debian-devel-request@lists.debian.org debian-devel/ :0 * ^Resent-Sender.*debian-announce-request@lists.debian.org debian-announce :0 mailing-list/ } :0 Inbox/
LAN 上でプライベートのサーバーを実行する場合、LAN クライアントにメールを配達するために POP3 / IMAP4 サーバーを実行することを考えます。
表6.11 POP3/IMAP サーバーのリスト
パッケージ | ポプコン | サイズ | タイプ | 説明 |
---|---|---|---|---|
qpopper *
|
V:1.1, I:4 | 636 | POP3 | Qualcomm 拡張の BSD POP3 サーバー |
courier-pop *
|
V:1.6, I:2 | 244 | POP3 | Courier メールサーバー - POP3 サーバー (maildir フォーマットのみ) |
ipopd
*
|
V:0.10, I:0.18 | 212 | POP3 | Washington 大学 POP2 と POP3 サーバー |
cyrus-pop3d-2.2 *
|
V:0.18, I:0.3 | 852 | POP3 | Cyrus メールシステム (POP3 サポート) |
xmail
*
|
V:0.14, I:0.16 | 836 | POP3 | ESMTP/POP3 メールサーバー |
courier-imap *
|
V:2, I:3 | 1624 | IMAP | Courier メールサーバー - IMAP サーバー (maildir フォーマットのみ) |
uw-imapd *
|
V:0.7, I:4 | 280 | IMAP | Washington 大学 IMAP サーバー |
cyrus-imapd-2.2 *
|
V:0.4, I:0.6 | 2632 | IMAP | Cyrus メールシステム (IMAP サポート) |
旧来の Unix 的システムでは BSD のラインプリンターデーモンが標準でした。 Unix 的システム上のフリーソフトの標準プリント出力フォーマットは PostScript なので、Ghostscript とともに何らかのフィルターシステムを使って non-PostScript プリンターへの印刷が可能になっています。
最近、共通 UNIX 印刷システム (CUPS) が新しいデファクトスタンダードです。CUPS は、インターネット印刷プロトコル (IPP) を使います。IPP は現在 Windows XP や Mac OS X 等の他の OS でもサポートされ、新たなクロスプラットフォームの両方向通信能力のあるリモート印刷のデファクト標準となっています。
Debian システム上のアプリケーションの標準の印刷可能データーフォーマットは、ページ記述言語である PostScript (PS) です。PS フォーマットのデーターは Ghostscript という PostScript のインタープリターに供給され、プリンター固有の印刷可能なデーターを生成します。「Ghostscript」を参照下さい。
CUPS システムのファイルフォーマット依存の自動変換機能のおかげで、どんなデーターでも lpr
コマンドに供給すると期待される印刷出力が生成されます。(CUPS では、lpr
はcups-bsd
パッケージをインストールすると有効となります。)
Debian システムには、プリントサーバーやユーティリティーで留意すべきパッケージがいくつかあります。
表6.12 プリントサーバーとユーティリティーのリスト
パッケージ | ポプコン | サイズ | ポート | 説明 |
---|---|---|---|---|
lpr
*
|
V:2, I:2 | 440 | printer (515) | BSD lpr/lpd (ラインプリンターデーモン) |
lprng
*
|
V:0.6, I:1.3 | 2904 | , , | , , (拡張) |
cups
*
|
V:33, I:44 | 15540 | IPP (631) | インターネット印刷 CUPS サーバー |
cups-client *
|
V:17, I:46 | 908 | , , | CUPS 用System V プリンターコマンド:
lp (1) と lpstat (1) と
lpoptions (1) と cancel (1) と
lpmove (8) と lpinfo (8) と
lpadmin (8) 等
|
cups-bsd *
|
V:7, I:41 | 420 | , , | CUPS 用BSD プリンターコマンド:
lpr (1) と lpq (1) と
lprm (1) と lpc (8) 等
|
cups-driver-gutenprint *
|
V:12, I:38 | 1212 | 非該当 | CUPS 用のプリンタードライバー |
CUPS システムはウェッブブラウザーを "http://localhost:631/" に向けることで設定できます。
セキュアーシェル (SSH) はインターネット経由で接続するセキュアーな方法です。Debian では、OpenSSH と呼ばれる SSH のフリーバージョンが
openssh-client
と openssh-server
パッケージとして提供されています。
表6.13 リモートアクセスサーバーとユーティリティーのリスト
パッケージ | ポプコン | サイズ | ツール | 説明 |
---|---|---|---|---|
openssh-client *
|
V:52, I:99 | 2104 |
ssh (1)
|
セキュアーシェルクライアント |
openssh-server *
|
V:70, I:83 | 700 |
sshd (8)
|
セキュアーシェルサーバー |
ssh-askpass-fullscreen *
|
V:0.08, I:0.4 | 92 |
ssh-askpass-fullscreen (1)
|
ユーザーに ssh-add 用のパスフレーズを質問する (GNOME2) |
ssh-askpass *
|
V:0.7, I:5 | 156 |
ssh-askpass (1)
|
ユーザーに ssh-add 用のパスフレーズを質問する (プレーン X) |
あなたの SSH がインターネットからアクセスできる場合には、「インターネットのためのセキュリティー強化策」を参照下さい。
リモートのシェルプロセスが回線接続の中断の際にも継続するようにするために screen
(1)
プログラムを使いましょう (「screen プログラム」参照)。
OpenSSH サーバーを実行したい場合には、"/etc/ssh/sshd_not_to_be_run
"
が存在してはいけません。
SSH には2つの認証プロトコルがあります。
表6.14 SSH の認証プロトコルと方法のリスト
SSH プロトコル | SSH 手法 | 説明 |
---|---|---|
SSH-1 |
"RSAAuthentication "
|
RSA アイデンティティ鍵を用いるユーザー認証 |
, , |
"RhostsAuthentication "
|
".rhosts " に基づくホスト認証 (インセキュアー、無効化済み)
|
, , |
"RhostsRSAAuthentication "
|
RSA ホストキーと組み合わせの、".rhosts " に基づくホスト認証 (無効化済み)
|
, , |
"ChallengeResponseAuthentication "
|
RSA チャレンジ応答認証 |
, , |
"PasswordAuthentication "
|
パスワードを用いる認証 |
SSH-2 |
"PubkeyAuthentication "
|
公開鍵を用いるユーザー認証 |
, , |
"HostbasedAuthentication "
|
公開キークライアントホスト認証と組み合わせの、"~/.rhosts " か
"/etc/hosts.equiv " に基づくホスト認証 (無効化済み)
|
, , |
"ChallengeResponseAuthentication "
|
チャレンジ応答認証 |
, , |
"PasswordAuthentication "
|
パスワードを用いる認証 |
非 Debian システムを使う際にはこれらの相違点に注意します。
詳細は、"/usr/share/doc/ssh/README.Debian.gz
" と
ssh
(1) と sshd
(8) と
ssh-agent
(1) と ssh-keygen
(1) を参照下さい。
次に示すのがキーとなる設定ファイルです。
表6.15 SSH 設定ファイルのリスト
設定ファイル | 設定ファイルの説明 |
---|---|
/etc/ssh/ssh_config
|
SSH クライアントのデフォールト、ssh_config (5) 参照
|
/etc/ssh/sshd_config
|
SSH サーバーのデフォールト、sshd_config (5) 参照
|
~/.ssh/authorized_keys
|
当該 SSH サーバーの当該アカウント接続用にクライアントが使用するデフォールト公開 SSH キー |
~/.ssh/identity
|
ユーザーの秘密 SSH-1 RSA キー |
~/.ssh/id_rsa
|
ユーザーの秘密 SSH-2 RSA キー |
~/.ssh/id_dsa
|
ユーザーの秘密 SSH-2 DSA キー |
公開と秘密の SSH キーをどう使うかに関しては、ssh-keygen
(1) と
ssh-add
(1) と ssh-agent
(1) を参照下さい。
接続をテストして設定を確認します。何らかの問題がある際には、"ssh -v
" を使います。
ローカルの秘密 SSH キーを暗号化するパスフレーズは "ssh-keygen -p
" として後から変更できます。
ホストを制限したり特定コマンドを実行するように "~/.ssh/authorized_keys
"
中に記載してオプションを追加できます。詳細は、sshd
(8) を参照下さい。
次に示す内容は、クライアントから ssh
(1) 接続をスタートします。
表6.16 SSH クライアント起動例のリスト
コマンド | 説明 |
---|---|
ssh username@hostname.domain.ext
|
デフォールトモードで接続します。 |
ssh -v username@hostname.domain.ext
|
デバグメッセージを有効にしてデフォールトモードで接続します。 |
ssh -1 username@hostname.domain.ext
|
SSH version 1 での接続を強制します。 |
ssh -1 -o RSAAuthentication=no -l username
hostname.domain.ext
|
SSH version 1 でパスワードを使うことを強制します。 |
ssh -o PreferredAuthentications=password -l username
hostname.domain.ext
|
SSH version 2 でパスワードを使うことを強制します。 |
もしローカルとリモートで同一ユーザー名を使う際には、"username@
"
とタイプするのを省略できます。たとえローカルとリモートで異なるユーザー名を使う際にでも、"~/.ssh/config
"
とタイプするのを省略できます。例えば Debian Alioth
サービスでのユーザー名が "foo-guest
"
という場合には、"~/.ssh/config
" が次を含むように設定します。
Host alioth.debian.org svn.debian.org git.debian.org User foo-guest
ssh
(1) はユーザーにとってより賢明でよりセキュアーな
telnet
(1) として機能します。telnet
コマンドと異なり、ssh
コマンドは telnet
エスケープ文字
(初期デフォールト CTRL-]) に出会うことで中断される事がありません。
ssh
を通して localhost
のポート 4025 から
remote-server
のポート 25 へと、localhost
のポート 4110 から remote-server
のポート 110
へと接続するパイプを設定するには、ローカルホスト上で次のように実行します。
# ssh -q -L 4025:remote-server:25 4110:remote-server:110 username@remote-server
このようにするとインターネット経由で SMTP/POP3 サーバーへとセキュアーに接続できます。リモートホストの
"/etc/ssh/sshd_config
" 中の
"AllowTcpForwarding
" エントリーを "yes
"
と設定します。
"RSAAuthentication
" (SSH-1 プロトコル) もしくは
"PubkeyAuthentication
" (SSH-2 プロトコル)
を使うと、リモートシステムのパスワードを覚える必要が無くなります。
リモートシステム上の "/etc/ssh/sshd_config
" 中に
"RSAAuthentication yes
" か "PubkeyAuthentication
yes
" という対応する設定をします。
次に示すように、ローカルで認証キーを生成しリモートシステム上に公開キーをインストールします。
RSAAuthentication
": SSH-1 の RSA キー (置き換えられたので非推奨。)
$ ssh-keygen $ cat .ssh/identity.pub | ssh user1@remote "cat - >>.ssh/authorized_keys"
PubkeyAuthentication
": SSH-2 の RSA キー
$ ssh-keygen -t rsa $ cat .ssh/id_rsa.pub | ssh user1@remote "cat - >>.ssh/authorized_keys"
PubkeyAuthentication
": SSH-2 の DSA キー (遅いので非推奨。)
$ ssh-keygen -t dsa $ cat .ssh/id_dsa.pub | ssh user1@remote "cat - >>.ssh/authorized_keys"
SSH-2 の DSA キーを使うことは、キーが小さく遅いので非推奨です。特許が期限切れとなったので DSA を使って RSA 特許を回避する理由はありません。DSA はデジタル署名アルゴリズムで遅いです。また DSA-1571-1 も参照下さい。
SSH-2 で"HostbasedAuthentication
" が機能するには、サーバーホストの
"/etc/ssh/sshd_config
" と、クライアントホストの
"/etc/ssh/ssh_config
" か
"~/.ssh/config
" という両方のホスト設定で
"HostbasedAuthentication
" を"yes
"
と調節する必要があります。
他のプラットフォーム上で使えるフリーな SSH クライアントがいくつかあります。
表6.17 他のプラットフォーム上で使えるフリーな SSH クライアントのリスト
環境 | フリーの SSH プログラム |
---|---|
Windows | puTTY (http://www.chiark.greenend.org.uk/~sgtatham/putty/) (GPL) |
Windows (cygwin) | cygwin 中の SSH (http://www.cygwin.com/) (GPL) |
古典的 Macintosh | macSSH (http://www.macssh.com/) (GPL) |
Mac OS X |
OpenSSH; ターミナルアプリケーションの ssh を使用しましょう (GPL)
|
SSH の認証キーをパスフレーズで保護する方がより安全です。もしパスフレーズが設定されていない場合には "ssh-keygen
-p
" で設定できます。
上記のようにパスワードを使って接続したリモートホスト上の "~/.ssh/authorized_keys
"
中にあなたの公開 SSH キー (例えば "~/.ssh/id_rsa.pub
") を設定します。
$ ssh-agent bash $ ssh-add ~/.ssh/id_rsa Enter passphrase for /home/<username>/.ssh/id_rsa: Identity added: /home/<username>/.ssh/id_rsa (/home/<username>/.ssh/id_rsa)
次に示すように、今後リモートパスワードは必要ありません。
$ scp foo <username>@remote.host:foo
ssh-agent のセッションを終了するのに ^D を押します。
X サーバーの場合、通常の Debian の起動スクリプトは親プロセスとして ssh-agent
を実行します。だから ssh-add
は1回だけ実行される必要しかありません。詳細は
ssh-agent
(1) と ssh-add
(1) を参照下さい。
"shutdown -h now
" (「システムをシャットダウンする方法」参照) を実行しているプロセスを
at
(1) コマンド (「タスク1回実行のスケジュール」参照)
を使って次のようにして SSH が終了することから守る必要があります。
# echo "shutdown -h now" | at now
"shutdown -h now
" をscreen
(1) (「screen プログラム」参照) セッション中で実行しても同様のことができます。
問題に出会ったら、設定ファイルのパーミッションを確認し、ssh
を"-v
"
オプションとともに実行します。
root でファイアーウォールと問題を起こした場合には、"-P
" オプションを使いましょう;
こうするとサーバーポートの 1 — 1023 を使うのを回避します。
リモートサイトへの ssh
接続が急に動作し無くなった際は、システム管理者による変更、特に可能性が高いのはシステムメンテナンス中に
"host_key
"
が変更された結果かもしれません。実際にこういう状況で誰も洒落たハックでリモートホストとしてなりすまそうとしていないことを確認した後に、"host_key
"
エントリーをローカルホストの "~/.ssh/known_hosts
"
から削除すると再び接続できるようになります。
他のネットワークアプリケーションサーバーを次に示します。
表6.18 他のネットワークアプリケーションサーバー
パッケージ | ポプコン | サイズ | プロトコル | 説明 |
---|---|---|---|---|
telnetd *
|
V:0.4, I:1.1 | 156 | TELNET | TELNET サーバー |
telnetd-ssl *
|
V:0.10, I:0.3 | 152 | , , | , , (SSL サポート) |
nfs-kernel-server *
|
V:12, I:21 | 412 | NFS | Unix 式ファイル共有 |
samba
*
|
V:18, I:31 | 23096 | SMB | Windows のファイルとプリンター共有 |
netatalk *
|
V:5, I:9 | 3428 | ATP | Apple/Mac のファイルとプリンター共有 (AppleTalk) |
proftpd-basic *
|
V:6, I:7 | 4064 | FTP | 汎用ファイルダウンロード |
wu-ftpd *
|
V:0.4, I:0.6 | 820 | , , | , , |
apache2-mpm-prefork *
|
V:38, I:42 | 68 | HTTP | 汎用ウェッブサーバー |
apache2-mpm-worker *
|
V:6, I:7 | 68 | , , | , , |
squid
*
|
V:6, I:7 | 1848 | , , | 汎用ウェッブプロキシサーバー |
squid3 *
|
V:1.5, I:1.8 | 3600 | , , | , , |
slpd
*
|
V:0.14, I:0.2 | 180 | SLP | LDAP サーバーとしての OpenSLP サーバー |
bind9
*
|
V:10, I:17 | 1080 | DNS | 他のホストの IP アドレス |
dhcp3-server *
|
V:5, I:10 | 64 | DHCP | クライアント自身の IP アドレス |
コモンインターネットファイルシステムプロトコル (CIFS) はサーバーメッセージブロック (SMB) と同じプロトコルで Microsoft Windows で広く使われています。
Debian アーカイブの全内容のローカルのミラーサーバーを使うより、squid
等のプロキシサーバーを使う方がはるかにバンド幅を節約上ではるかに効率的です。
他のネットワークアプリケーションクライアントを次に示します。
表6.19 他のネットワークアプリケーションクライアント
パッケージ | ポプコン | サイズ | プロトコル | 説明 |
---|---|---|---|---|
netcat *
|
I:28 | 36 | TCP/IP | TCP/IP 用万能ツール (スイス陸軍ナイフ) |
openssl *
|
V:56, I:91 | 2380 | SSL | セキュアソケットレイヤー (SSL) のバイナリーと関連する暗号化ツール |
stunnel4 *
|
V:0.6, I:2 | 512 | , , | 万能 SSL ラッパー |
telnet *
|
V:13, I:89 | 200 | TELNET | TELNET クライアント |
telnet-ssl *
|
V:0.2, I:1.1 | 208 | , , | , , (SSL サポート) |
nfs-common *
|
V:49, I:81 | 660 | NFS | Unix 式ファイル共有 |
smbclient *
|
V:6, I:35 | 45200 | SMB | MS Windows のファイルとプリンター共有 |
smbfs
*
|
V:5, I:24 | 56 | , , | リモートの MS Windows ファイルをマウントやアンマウントするコマンド |
ftp
*
|
V:9, I:85 | 168 | FTP | FTP クライアント |
lftp
*
|
V:1.3, I:6 | 1876 | , , | , , |
ncftp
*
|
V:1.4, I:7 | 1276 | , , | フルスクリーンの FTP クライアント |
wget
*
|
V:33, I:99 | 2364 | HTTP と FTP | ウェッブダウンローダー |
curl
*
|
V:7, I:23 | 352 | , , | , , |
bind9-host *
|
V:43, I:91 | 188 | DNS | bind9 由来の host (1) コマンド、"Priority:
standard "
|
dnsutils *
|
V:14, I:90 | 412 | , , | bind 由来の dig (1) コマンド、"Priority:
standard "
|
dhcp3-client *
|
V:32, I:92 | 60 | DHCP | IP アドレス獲得 |
ldap-utils *
|
V:2, I:7 | 672 | LDAP | LDAP サーバーからデーター獲得 |
telnet
プログラムを使うとシステムデーモンへの手動接続とその診断ができます。
プレーンな POP3 サービスをテストするには、次のようにします。
$ telnet mail.ispname.net pop3
一部の ISP が提供する TLS/SSL を有効にした POP3 サービスをテストするには、telnet-ssl
か
openssl
パッケージによる、TLS/SSL を有効にした telnet
クライアントが必要です。
$ telnet -z ssl pop.gmail.com 995
$ openssl s_client -connect pop.gmail.com:995
次の RFC は各システムデーモンに関する必要な知見を提供します。
"/etc/services
" の中にポートの使用され方が記載されています。
Debian システム上の X Window システムは X.Org 由来のソースに基づいています。2009年7 月現在、それは X11R7.1(etch) と X11R7.3(lenny) と X11R7.3(squeeze) と X11R7.4(sid) です。
インストールを簡略化するための (メタ)パッケージが少々あります。
表7.1 X Window のためのキーとなる (メタ)パッケージのリスト
(メタ)パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
xorg
*
|
I:43 | 80 | X ライブラリー、X サーバー、フォントセット、基本的な X クライアントとユーティリティーの集合 (メタパッケージ) |
xserver-xorg *
|
V:30, I:51 | 228 | このパッケージは X サーバーのフルスイーツとその設定 |
xbase-clients *
|
V:3, I:47 | 132 | X クライアントの雑多な集合 |
x11-common *
|
V:41, I:92 | 568 | X Window システムのためのファイルシステムインフラ |
xorg-docs *
|
I:6 | 1956 | X.Org ソフトウエアースイーツの雑多な文書 |
menu
*
|
V:28, I:52 | 2060 | メニューに対応しているアプリケーションに関して Debian メニューを生成 |
gksu
*
|
V:23, I:46 | 540 |
su (1) か sudo (8) の Gtk+ フロントエンド
|
menu-xdg *
|
I:47 | 76 | Debian メニュー構造を freedesktop.org の xdg メニュー構造に変換 |
xdg-utils *
|
V:16, I:46 | 300 | freedesktop.org によって提供される統合デスクトップ環境のためのユーティリティー |
gnome-desktop-environment *
|
I:29 | 44 | 標準の GNOME デスクトップ環境 (メタパッケージ) |
kde-standard *
|
I:3 | 36 | コアの KDE デスクトップ環境 (メタパッケージ) |
xfce4
*
|
I:4 | 40 | Xfce 軽量デスクトップ環境 (メタパッケージ) |
lxde-core *
|
I:2 | 36 | LXDE 軽量デスクトップ環境 (メタパッケージ) |
fluxbox *
|
V:0.9, I:2 | 4424 | Fluxbox: 自由自在に設定可能でリソース消費が少ない X ウィンドウマネージャー |
X の基本に関しては、X
(7) と the LDP XWindow-User-HOWTO を参照下さい。
デスクトップ環境は、通常 X ウィンドウマネージャーとファイルマネージャーと互換性あるユーティリティープログラムのスイートの組み合わせです。
GNOME や KDE や Xfce や LXDE 等の充実したデスクトップ環境を aptitude
のタスクメニューを使って設定できます。
タスクメニューは Debian の unstable
/testing
環境下では最新のパッケージの変遷状態を反映していないかもしれません。そのような状況ではパッケージ間のコンフリクトを避けるために
aptitude
(8) のタスクメニューの下でいくつかの
(メタ)パッケージを非選択にする必要があります。(メタ)パッケージを非選択にする場合には、それらに依存関係を提供しているパッケージが自動削除されないように特定のパッケージを手動選択しなければいけません。
上記と違う方法として、Fluxbox 等の X ウィンドウマネージャーだけを使って簡単な環境を設定する事もできます。
X ウィンドウマネージャーやデスクトップ環境のガイドは X のためのウィンドウマネージャーを参照下さい。
Debian メニューシステムは
menu
パッケージの update-menus
(1) を使って、テキストと
X の両指向のプログラムに関して一般化されたインターフェースを提供します。各パッケージは
"/usr/share/menu/
"
ディレクトリーにメニューデーターをインストールします。"/usr/share/menu/README
"
を参照下さい。
Freedesktop.org の xdg メニューシステム対応の各パッケージは
"/usr/share/applications/
" の下の
"*.desktop
" で提供されるそのメニューデーターをインストールします。Freedesktop.org
スタンダード対応の現代的デスクトップ環境は xdg-utils
パッケージを使ってこれらのデーターからそれぞれのメニューを生成します。"/usr/share/doc/xdg-utils/README
"
を参照下さい。
X Window システムはサーバーとクライアントのプログラムの組み合わせとして起動されます。ローカルとリモートと言う言葉に対応するサーバーとクライアントと言う言葉の意味に注意を払う必要があります。
表7.2 サーバー/クライアントの用語法のリスト
タイプ | 説明 |
---|---|
X サーバー | ユーザーのディスプレーや入力デバイスが接続されたローカルホスト上で実行されるプログラム。 |
X クライアント | データーを処理し X サーバーへ話しかけるリモートホスト上で実行されるプログラム。 |
アプリケーションサーバー | データーを処理しクライアントへ話しかけるリモートホスト上で実行されるプログラム。 |
アプリケーションクライアント | ユーザーのディスプレーや入力デバイスが接続されたローカルホスト上で実行されるプログラム。 |
X サーバーの情報は xorg
(1) を参照下さい。
X サーバー (lenny
以降) は、その設定に
"/etc/X11/xorg.conf
" からの情報より HAL や D-bus 等の標準化された OS
サービスからの情報を使うように書き換えられています。このため "/etc/X11/xorg.conf
"
の内容は減ってきています。X
サーバーの移行問題の回避をする必要があるかもしれません。
次のようにすると dexconf
(1) を使って新たな
"/etc/X11/xorg.conf
" ファイルが生成して X サーバーが (再)設定されます。
# dpkg-reconfigure --priority=low x11-common # dpkg-reconfigure --priority=low xserver-xorg
この "/etc/X11/xorg.conf
"
ファイルを手動編集してはいるが自動的にファイルを更新したい場合には、次のコマンドを実行します。
# sudo dpkg-reconfigure -phigh xserver-xorg
あなたのモニターのスペックに関して注意深く確認します。大きな高解像度の CRT モニターの場合、チラつきを軽減するためにモニターの許容する限りできるだけ高いリフレッシュレート (85 Hz なら十二分、75 Hz で十分) 設定することが望ましい。LCD モニターの場合、その低速反応性のためにより低速の標準リフレッシュレート (60 Hz) 設定で通常問題はありません。
あなたのモニターシステムのハードウエアーを破壊するかもしれないので、高過ぎるリフレッシュレートを使わないように注意して下さい。
"X サーバー " (ディスプレー側) が"X クライアント" (アプリケーション側) からの接続を許可するようにするにはいくつかの方法があります。
表7.3 X サーバーへの接続方法のリスト
方法 | パッケージ | ポプコン | サイズ | ユーザー | 暗号化 | 適切な用途 |
---|---|---|---|---|---|---|
xhost コマンド
|
xbase-clients *
|
V:3, I:47 | 132 | 非確認 | いいえ | 非推奨 |
xauth コマンド
|
xbase-clients *
|
V:3, I:47 | 132 | 確認済み | いいえ | パイプ経由のローカル接続用 |
ssh -X コマンド
|
openssh-client *
|
V:52, I:99 | 2104 | 確認済み | はい | リモートネットワーク接続用 |
GNOME ディスプレーマネージャー |
gdm
*
|
V:22, I:33 | 16548 | 確認済み | いいえ (XDMCP) | パイプ経由のローカル接続用 |
KDE ディスプレーマネージャー |
kdm
*
|
V:8, I:11 | 5510 | 確認済み | いいえ (XDMCP) | パイプ経由のローカル接続用 |
X ディスプレーマネージャー |
xdm
*
|
V:0.7, I:1.8 | 780 | 確認済み | いいえ (XDMCP) | パイプ経由のローカル接続用 |
WindowMaker ディスプレーマネージャー |
wdm
*
|
V:24, I:84 | 1992 | 確認済み | いいえ (XDMCP) | パイプ経由のローカル接続用 |
LTSP ディスプレーマネージャー |
ldm
*
|
V:0.02, I:0.09 | 392 | 確認済み | はい | リモート SSH ネットワーク接続用 (シンクライアント) |
暗号手法を使っている等といった非常に良い理由無しには、X 接続のためにセキュアーされていないネットワーク経由のリモート TCP/IP 接続を使ってはいけません。暗号化無しのリモート
TCP/IP ソケット接続は盗聴の被害に会いやすく、Debian
システムではデフォールトで無効化されています。"ssh -X
" を使います。
もし完全にセキュアーな環境の中では、"/usr/share/gdm/defaults.conf
"
をオーバーライドするように "/etc/gdm/gdm.conf
" 中に
"DisallowTCP=false
" と設定し、"find /etc/X11 -type f
-print0 | xargs -0 grep nolisten
" で見つかる行から
"-nolisten
" を削除することでリモート TCP/IP 接続を無理やり有効にする事ができます。
LTSP は、Linux ターミナルサーバープロジェクトのことです。
X Window システムは X サーバーとそれに接続する X クライアントの組み合わせの X セッションとしてよく起動されます。通常のデスクトップ環境ではそれらの両方ともワークステーション上で実行されます。
X session は次で起動されます。
startx
コマンド
/etc/rc?.d/
" ディレクトリー ("?
" はランレベルに対応)
中の最後にある起動スクリプトから起動される X
ディスプレーマネージャーデーモンプログラム *dm
の1つ
ディスプレーマネージャーデーモンの起動スクリプトは実際に実行される前に
"/etc/X11/default-display-manager
" ファイルの内容を確認します。こうすることで
X
ディスプレーマネージャーデーモンプログラムが1つだけが実行されることを確実にします。
X ディスプレーマネージャーの初期環境変数に関しては、「X Window の下でのみ特定ロケール」を参照下さい。
本質的にこれらすべてのプログラムは "/etc/X11/Xsession
"
スクリプトを実行します。そうすることで、"/etc/X11/Xsession
"
スクリプトは、"/etc/X11/Xsession.d/
" ディレクトリー中のスクリプトを
run-parts
(8) 風に実行します。これは本質的に次の順番で見つかる最初のプログラムを
exec
builtin コマンドで実行することです。
/etc/X11/Xsession
"
の引数として指定されたスクリプト。
~/.xsession
" か
"~/.Xsession
" スクリプト。
/usr/bin/x-session-manager
" コマンド。
/usr/bin/x-window-manager
" コマンド。
/usr/bin/x-terminal-emulator
" コマンド。
このプロセスは "/etc/X11/Xsession.options
" の内容に影響されます。これらの
"/usr/bin/x-*
" コマンドが指し示すプログラムが正確に何であるかは Debian の
alternative システムにより決定され、"update-alternatives --config
x-session-manager
" 等によって変更されます。
gdm
(1) はメニューから X セッションのセッションのタイプ (デスクトップ環境: 「デスクトップ環境の設定」) とか、言語 (ロケール: 「ロケール」) を選択できるようにします。それは "~/.dmrc
"
の中に選択されたデフォールト値を次のように保存します。
[Desktop] Session=default Language=ja_JP.UTF-8
"/etc/X11/Xsession.options
" が、"#
"
文字が前に付いていない "allow-user-xsession
" と言う行を含んでいるシステム上では、誰でも
"~/.xsession
" か "~/.Xsession
"
を定義することでシステムコードを完全にオーバーライドして "/etc/X11/Xsession
"
の挙動をカスタム化できます。"~/.xsession
" ファイル中の最後のコマンドはあなたの最も好む X
window/ セッションマネージャーを起動するように "exec
some-window/session-manager
" という形式の使う必要があります。
上記のように完全にシステムコードをオーバーライドすること無しに X セッションをカスタム化する新方法を次に示します。
gdm
は特定のセッションを選択する事ができて、それを
"/etc/X11/Xsession
" の引数に設定できます。
~/.xsessionrc
" ファイルが起動プロセスの一部として実行されます。(デスクトップ非依存)
~/.gnomerc
" ファイルが起動プロセスの一部として実行されます。(GNOME デスクトップのみ)
~/.gnome2/session
"
ファイルなどを使うかもしれません。
"ssh -X
" を使うことで、ローカルの X
サーバーからリモートのアプリケーションサーバーへのセキュアーな接続が可能となります。
コマンドラインオプション "-X
" を使わないでおくには、リモートホストの
"/etc/ssh/sshd_config
" 中の
"X11Forwarding
" エントリーを "yes
" と設定します。
ローカルホスト上の X サーバーの起動します。
ローカルホスト上で xterm
を開きます。
ssh
(1) を実行してリモートサイトとの接続を次のように確立します。
localname @ localhost $ ssh -q -X loginname@remotehost.domain Password:
リモートホスト上の "gimp
" 等の X アプリケーションコマンドを次のように実行します。
loginname @ remotehost $ gimp &
ここに書かれた手法はリモート X クライアントがあたかもローカルの UNIX ドメインソケット経由でローカル接続されているかのようにして、リモート X クライアントからの出力を表示できるようにします。
インターネット経由のセキュアーな X ターミナルは ldm
等の専用のパッケージを使えば簡単に実現でき、リモートで実行される X デスクトップ環境の全てを表示します。あなたのローカル機器は SSH
経由で接続されたリモートのアプリケーションサーバーのシンクライアントになります。
あなたの通常のディスプレーマネージャーの gdm
に同様の機能を追加するには、"/usr/local/bin/ssh-session
"
上に実行可能な次に示すようなシェルスクリプトを追加します。
#!/bin/sh -e # Based on gdm-ssh-session in gdm source (GPL) ZENITY=$(type -p zenity) TARGETHOST=$($ZENITY --width=600 \ --title "Host to connect to" --entry \ --text "Enter the name of the host you want to log in to as user@host.dom:") TARGETSESSION=$($ZENITY --width=600 --height=400 \ --title "Remote session name" --list --radiolist --text "Select one" \ --column " " --column "Session" --column "description" --print-column 2 \ TRUE "/etc/X11/Xsession" "Debian" \ FALSE "/etc/X11/xinit/Xclients" "RH variants" \ FALSE "gnome-session" "GNOME session" \ FALSE "xterm" "Safe choice" \ FALSE "rxvt" "Safe choice" \ FALSE "gnome-terminal" "Safe choice") echo "Connecting to "$TARGETHOST" with $TARGETSESSION" /usr/bin/ssh -A -X -T -n "$TARGETHOST" "$TARGETSESSION" #SSH_ASKPASS=/usr/bin/ssh-askpass /usr/bin/ssh -A -X -T -n "$TARGETHOST" "$TARGETSESSION"
次の内容を "/etc/dm/Sessions/ssh.desktop
" に追加します。
[Desktop Entry] Encoding=UTF-8 Name=SSH Comment=This session logs you into a remote host using ssh Exec=/usr/local/bin/ssh-session Type=Application
2002年に、Fontconfig 2.0
がフォントアクセスの設定とカスタム化のためのディストリビューション非依存のライブラリーとして作られました。Debian
はsqueeze
以降 Fontconfig
2.0 だけをそのフォント設定に使います。
X Window システムのフォントサポートは次のように要約できます。
旧来の X サーバー側フォントサポートシステム
現代的な X クライアント側フォントサポートシステム
fonts.conf
(5) を参照下さい。
表7.4 X Window フォントシステムをサポートするパッケージのテーブル
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
xfonts-utils *
|
V:23, I:71 | 516 | X Window システムフォントユーティリティープログラム |
libxft2 *
|
V:44, I:74 | 148 | Xft、X アプリケーションと FreeType フォントラスター化ライブラリーをつなげるライブラリー |
libfreetype6 *
|
V:58, I:87 | 740 | FreeType 2.0 フォントラスター化ライブラリー |
fontconfig *
|
V:21, I:73 | 472 | Fontconfig、汎用フォント設定ライブラリー — サポートバイナリー |
fontconfig-config *
|
I:81 | 440 | Fontconfig、汎用フォント設定ライブラリー — 設定データー |
フォント設定情報は次のようにして確認できます。
xset q
"
fc-match
"
fc-list
"
"The Penguin and Unicode" は現代的な X Window システムの良い概論です。http://unifont.org/ にある他の文書も Unicode フォントや Unicode 化されたソフトや国際化や Unicode のフリー (英語で自由と無償という意味)/ リブレ (仏語等で自由の意味、無償という意味は無い)/ オープンソース (FLOSS) オペレーティングシステム上での使い勝手の問題に関する良い情報源です。
コンピューターフォントには大きくわけて2つのタイプがあります。
ビットマップフォントを拡大するとギザギザのイメージになってしまいますが、アウトラインやストロークフォント拡大するとスムーズなイメージになります。
Debian システム上のビットマップフォントは、".pcf.gz
" というファイル拡張子を持った圧縮された
X11 pcf
ビットマップフォントファイルとして提供されます。
Debian システム上のアウトラインフォントは次で提供されます。
.pfb
" (バイナリーフォントファイル) と ".afm
"
(フォントメトリクスファイル) というファイル拡張子を持った PostScript
Type 1 フォントファイル。
.ttf
" というファイル拡張子を通常持った TrueType (もしくは OpenType) フォントファイル。
OpenType はTrueType と PostScript Type 1 の両方を置き換えることを目指しています。
表7.5 PostScript Type 1 フォントへの対応表
フォントパッケージ | ポプコン | サイズ | サンセリフフォント | セリフフォント | モノスペースフォント | フォントの起源 |
---|---|---|---|---|---|---|
PostScript | N/A | N/A | Helvetica | Times | Courier | Adobe |
gsfonts * | V:18, I:66 | 4632 | Nimbus Sans L | Nimbus Roman No9 L | Nimbus Mono L | URW (Adobe 互換サイズ) |
gsfonts-x11 * | I:30 | 116 | Nimbus Sans L | Nimbus Roman No9 L | Nimbus Mono L | PostScript Type 1 フォントでの X フォントサポート。 |
t1-cyrillic * | I:1.9 | 5008 | Free Helvetian | Free Times | Free Courier | 拡張 URW (Adobe 互換サイズ) |
lmodern * | V:2, I:16 | 45644 | LMSans* | LMRoman* | LMTypewriter* | Computer Modern (TeX 由来) に準拠したスケーラブルな PostScript と OpenType のフォント |
表7.6 TrueType フォントへの対応表
フォントパッケージ | ポプコン | サイズ | サンセリフフォント | セリフフォント | モノスペースフォント | フォントの起源 |
---|---|---|---|---|---|---|
ttf-mscorefonts-installer * | I:11 | 200 | Arial | Times New Roman | Courier New | Microsoft (Adobe 互換サイズ) (これは non-free データーをインストールします) |
ttf-liberation * | I:43 | 1724 | Liberation Sans | Liberation Serif | Liberation Mono | Liberation フォントプロジェクト (Microsoft 互換サイズ) |
ttf-freefont * | V:10, I:26 | 4204 | FreeSans | FreeSerif | FreeMono | GNU freefont (Microsoft 互換サイズ) |
ttf-dejavu * | I:77 | 68 | DejaVu Sans | DejaVu Serif | DejaVu Sans Mono | DejaVu、Unicode 対応 Bitstream Vera |
ttf-dejavu-core * | I:72 | 2592 | DejaVu Sans | DejaVu Serif | DejaVu Sans Mono | DejaVu、Unicode 対応 Bitstream Vera (sans, sans-bold, serif, serif-bold, mono, mono-bold) |
ttf-dejavu-extra * | I:69 | 5788 | N/A | N/A | N/A | DejaVu、Unicode 対応 Bitstream Vera (oblique, italic, bold-oblique, bold-italic, condensed) |
ttf-unifont * | I:4 | 16060 | N/A | N/A | unifont | GNU Unifont、Unicode 5.1 基本多言語面 (BMP) 中の全印刷可能文字 |
DejaVu フォントは Bitstream Vera フォントに基づきそれを包含します。
aptitude
(8) を使うと追加のフォントを簡単に見つけられます。
~Gmade-of::data:font
"
を使ってフォントデーターにフィルターされた平坦なパッケージ一覧
~nxfonts-
" を使って BDF (ビットマップ)
フォントパッケージにフィルターされた平坦なパッケージ一覧
~nttf-
" を使って TrueType (アウトライン)
フォントパッケージにフィルターされた平坦なパッケージ一覧
フリーなフォントは限られていることがあるので、Debian ユーザーにとっていくつかの商用 TrueType フォントをインストールする選択肢があります。こういったことをユーザーが簡単しやすいようにいくつかの利便性のためのパッケージが作成されています。
ttf-mathematica4.1
ttf-mscorefonts-installer
あなたのフリーなシステムを non-Free のフォントで汚染する事になるとはいえ、TrueType フォントの選択肢は非常に沢山あります。
CJK (中日韓)文字のフォントに焦点を当てキーポイントを記します。
表7.7 CJK フォント名中でフォントタイプを示すために使われるキーワード表
フォントタイプ | 日本語フォント名 | 中国語フォント名 | 韓国語フォント名 |
---|---|---|---|
サンセリフ | gothic, ゴチック | hei, gothic | dodum, gulim, gothic |
セリフ | mincho, 明朝 | song, ming | batang |
"P" の付いた "VL PGothic" のようなフォント名は、固定幅フォントの "VL Gothic" フォントに対応するプロポーショナルフォントです。
例えば、Shift_JIS コードテーブルには 7070文字があります。それらは次のように分類できます。
2バイト文字は CJK 固定幅フォントを使うコンソールターミナル上で倍の幅を占めます。このような状況に対応するために、ファイル拡張子
".hbf
" を使う Hanzi
ビットマップフォント (HBF) ファイルが1バイトと2バイトの文字を含むフォントのために使えます。
TrueType フォントファイルのための空間を節約するために、ファイル拡張子
".ttc
" を持つ TrueType
フォントコレクションファイルを使う事ができます。
文字の複雑なコード空間をカバーするために、CID でキーされた PostScript
Type 1 フォントは "%!PS-Adobe-3.0 Resource-CMap
" で始まる CMap
ファイルとともに使われます。これは通常の X ディスプレーではほとんど使われませんが PDF のレンダリング等では使われます (「X ユーティリティーアプリケーション」参照)。
基本的なオフィスアプリケーションのリストを記します (OO は OpenOffice.org)。
表7.8 基本的な X オフィスアプリケーションのリスト
著者の目に止まった基本的ユーティリティーアプリケーションのリストを記します。
表7.9 基本的 X ユーティリティーアプリケーションのリスト
パッケージ | ポプコン | パッケージサイズ | タイプ | 説明 |
---|---|---|---|---|
evince *
|
V:26, I:38 | 1116 | GNOME | 文書 (pdf) ビューワー |
okular *
|
V:4, I:6 | 3408 | KDE | 文書 (pdf) ビューワー |
evolution *
|
V:16, I:34 | 4724 | GNOME | 個人情報管理 (グループウエアと電子メール) |
kontact *
|
V:1.3, I:8 | 1326 | KDE | 個人情報管理 (グループウエアと電子メール) |
scribus *
|
V:0.5, I:3 | 26888 | KDE | デスクトップページレイアウトエディター |
glabels *
|
V:0.16, I:0.7 | 1148 | GNOME | ラベルエディター |
kbarcode *
|
V:0.05, I:0.3 | 2180 | KDE | バーコードとラベル印刷アプリケーション |
gnucash *
|
V:0.7, I:2 | 5748 | GNOME | 個人会計 |
homebank *
|
V:0.09, I:0.4 | 1092 | GTK | 個人会計 |
kmymoney2 *
|
V:0.06, I:0.5 | 144 | KDE | 個人会計 |
xsane
*
|
V:5, I:36 | 748 | GTK | スキャナーのフロントエンド |
evince
や okular
によって CJK の PDF 文書を
Cmap データー (「CJK フォント」) を使って表示する際には
poppler-data
パッケージ (以前は non-free だった、「Ghostscript」参照) が必要です。
scribus
(KDE) のようなソフトウエアーを GNOME
デスクトップ環境にインストールすることは、同様の機能が GNOME
デスクトップ環境に無いので、まったく問題ありません。でも機能の重複するたくさんのパッケージをインストールしすぎるとあなたのメニューが忙しくなってしまいます。
xmodmap
(1) は X Window
システム中でのキーマップとポインターボタンのマッピングのためのユーティリティーです。keycode を知るには、X 環境下で xev
(1)
を実行してキーを押さえます。keysym
の意味を知るには、"/usr/include/X11/keysymdef.h
" ファイル
(x11proto-core-dev
パッケージ) 中の MACRO 定義を覗いて下さい。このファイル中の全ての
"#define
" 文は keysym 名に
"XK_
" を前付けして名づけられています。
xterm
(1) のような多くの伝統的 X
クライアントプログラムは、ジオメトリやフォントや表示を規定する標準化されたコマンドラインオプションの組み合わせを使って起動できます。
それらはその見栄えを設定するのに X リソースデーターベースも用います。X リソースのシステム全体のデフォールトは
"/etc/X11/Xresources/*
" の中に保存されており、それらのアプリケーションのデフォールトは
"/etc/X11/app-defaults/*
"
の中に保存されています。これらの設定をスタート点として使います。
"~/.Xresources
"
ファイルはユーザーのリソース規定を保存するために使われます。ログイン時にこのファイルは自動的にデフォールトの X
リソースに合流されます。この設定変更をしてすぐ有効にするには、それを次のコマンドを使ってデーターベースに合流させます。
$ xrdb -merge ~/.Xresources
x
(7) と xrdb
(1) を参照下さい。
xterm
(1) に関することは、http://dickey.his.com/xterm/xterm.faq.html
で学びます。
gdm
のようなディスプレーマネージャーのプロンプトに root
と入力して
X ディスプレー・セッションマネージャーを root
アカウントの下で実行してはいけません。なぜなら、たとえシステム管理業務を行おうとしている時ですら、こういう行為は安全でない (インセキュアー)
と認識されているからです。X アーキテクチャ全てが root
として実行するとインセキュアーと認識されています。通常ユーザーのような、可能な限り最低レベルの特権を使うように常にするべきです。
例えば "foo
" 等の特定の X クライアントを root として実行する最も簡単な方法は次に記すように
sudo
(8) を使うことです。
$ sudo foo &
$ sudo -s # foo &
$ gksu foo &
$ ssh -X root@localhost # foo &
この目的だけのために上記のように ssh
(1) を使うことはリソースの無駄遣いです。
X クライアントが X サーバーに接続するためには次のことに注意下さい。
$XAUTHORITY
" と "$DISPLAY
"
環境変数の値は新たなユーザーの環境変数値にコピーされなければいけません。
$XAUTHORITY
" 環境変数の値で指示されるファイルが新たなユーザーによって読めなければいけません。
gksu
パッケージ (ポプコン: V:23, I:46) はルート特権を獲得することに特化した GTK+ の
GUI パッケージです。それが su
(1) または sudo
(8)
をバックエンドに使うように "/apps/gksu/sudo-mode
" gconf
キーを使って設定できます。gconf キーを編集するには gconf-editor
(1) を使えばできます
(メニュー: "Applications" → "System Tools" → "Configuration Editor")。
アプリケーションソフトの多言語化 (M17N) とかネイティブ言語サポートは2段階で行います。
M17N、I18N、L10N に対応する英語の multilingualization、internationalization、localization の中の "m" と "n"、"i" と "n"、"l" と "n" の間には 17、18、10 の文字があります。
GNOME や KDE 等の現代的なソフトは多言語化されています。UTF-8
データーを扱えるようにすることで国際化され、gettext
(1)
インフラで翻訳されたメッセージを提供することで地域化されています。翻訳されたメッセージは別の地域化パッケージとして供給されているかもしれません。該当する環境変数を適切なロケールに設定することだけで翻訳されたメッセージが選ばれます。
最も簡単なテキストデーターの表現法は ASCII です。これは英語では十分で (7ビットで表現できる) 127文字以下しか使いません。国際化サポートのためにより多くの文字をサポートするために多くの文字の符号化 (エンコーディング) システムが発明されています。現代的かつ賢明な符号化システムは、人類が知っている事実上全ての文字が扱える UTF-8 です (「符号化方式の基本」参照)。
詳細は Introduction to i18n を参照下さい。
国際化ハードウエアーサポートは地域化した設定データーを使って実現されています。
Debian システムは多くのキーボード配列で機能するように設定できます。
表8.1 キーボード再設定方法のリスト
環境 | コマンド |
---|---|
Linux コンソール |
dpkg-reconfigure --priority=low console-data
|
X Window |
dpkg-reconfigure --priority=low xserver-xorg
|
こうすることでデッドキー機能付きで多くの欧州言語に関してアクセント付き文字のキーボード入力をサポートするようにします。アジア言語に関しては次に記す IBus のようなより複雑な インプットメソッドが必要です。
Debian システムための多言語入力の設定は、im-config
パッケージとともに IBus ファミリーのパッケージを使うことで簡素化されました。IBus パッケージのリストは次です。
表8.2 IBus を用いるインプットメソッドサポートのリスト
パッケージ | ポプコン | サイズ | サポートされたロケール |
---|---|---|---|
ibus * | V:0.2, I:0.2 | 4220 | dbus を用いるインプットメソッドのフレームワーク |
ibus-anthy * | V:0.04, I:0.10 | 684 | 日本語 |
ibus-skk * | V:0.00, I:0.03 | 404 | , , |
ibus-pinyin * | V:0.06, I:0.09 | 1184 | 中国語 (zh_CN 用) |
ibus-chewing * | V:0.01, I:0.02 | 252 | , , (zh_TW 用) |
ibus-hangul * | V:0.01, I:0.03 | 216 | 韓国語 |
ibus-table * | V:0.05, I:0.10 | 680 | IBus 用のテーブルエンジン |
ibus-table-thai * | I:0.00 | 156 160 | タイ語 |
ibus-unikey * | V:0.00, I:0.00 | 316 | ベトナム語 |
ibus-m17n * | V:0.02, I:0.05 | 180 | 多言語: インド系言語、アラビア語、他 |
kinput2 法や他のロケール依存のアジアの古典的インプットメソッドはまだありますが、現代的な UTF-8 の X 環境下ではお勧めできません。SCIM や uim ツールチェインは現代的な UTF-8 の X 環境下での国際インプットメソッドの少し古いアプローチです。
日本語インプットメソッドを英語環境 ("en_US.UTF-8
") 下で起動すると非常に便利です。IBus
を使ってこの環境をどう実現したかを以下に記します。
ibus-anthy
を
im-config
等の推奨 (recommended) されたパッケージとともにインストールします。
im-config
" を実行して "ibus
"
を選択します。
im-config
" として設定を確認します。
以下に注意下さい。
im-config
(8) は実行されるのが root からかどうかによって違った挙動をします。
im-config
(8)
はユーザーからのアクション無しにシステム上で最も好ましいインプットメソッドを有効にします。
im-config
(8) のための GUI
メニューエントリーは乱雑になることを防ぐためにデフォルトでは無効にされています。
Linux コンソールは限定された文字しか表示できません。(非 X コンソール上で非ヨーロッパ言語を表示するには
jfbterm
(1) のような特別なターミナルプログラムを使う必要があります。)
X Window は必要なフォントデーターがあれば UTF-8 中の全ての文字を表示できます。(オリジナルフォントデーターで使われた符号化方式は X Window システムが面倒を見るのでユーザーからは直接見えません。)
以下では gdm
(1) から起動された X Window
環境下で実行されるアプリケーションのためのロケールに焦点を当てます。
環境変数 "LANG=xx_YY.ZZZZ
" は、ロケールを言語コード
"xx
" と国コード "yy
" と符号化方式 (エンコーディング)
"ZZZZ
" に設定します (「"$LANG
" 変数」参照)。
現在の Debian システムは通常ロケールを "LANG=xx_YY.UTF-8
" と設定します。これは
Unicode 文字セットとともに UTF-8 符号化方式を使用します。この UTF-8
符号化システムはマルチバイトコードシステムでコードポイントを上手に使います。ASCII
データーは、7ビットのコード域のみで構成されてい、1文字1バイトのみからなる常に有効な UTF-8 データーです。
以前の Debian システムはロケールを "LANG=C
" か
"LANG=xx_YY
" (".UTF-8
" は無しで) 設定していました。
LANG=C
" か
"LANG=POSIX
" の場合に使われます。
LANG=xx_YY
" の場合に使われます。
"LANG=xx_YY
" の場合に実際に使われる符号化方式は
"/usr/share/i18n/SUPPORTED
"
を確認することで識別できます。例えば、"en_US
"
は"ISO-8859-1
" 符号化方式を使い、"fr_FR@euro
"
は"ISO-8859-15
" 符号化方式を使います。
符号化方式の値の意味に関しては、表11.2「符号化方式値とその使い方リスト」を参照下さい。
UTF-8 符号化方式は I18N のための現代的で気の利いた符号化方式で、Unicode 文字である人類が知る実質的に全ての文字を表せます。UTF とは Unicode 変換フォーマット (Unicode Transformation Format: UTF) 方式のことです。
私は例えば "LANG=en_US.UTF-8
" という UTF-8
ロケールをあなたのデスクトップで使うことをお薦めします。ロケールの最初の部分がアプリケーションが提示するメッセージを決めます。例えば、"LANG=fr_FR.UTF-8
"
ロケールの下の gedit
(1) (GNOME デスクトップのテキストエディター)
は、必要なフォントとインプットメソッドがインストールされていれば、メニューをフランス語で提示しながら中国語の文字データーを表示し編集できます。
ロケールを "$LANG
" 環境変数のみを用いて設定する事をお薦めします。UTF-8 ロケールの下で
"LC_*
" 変数 (locale
(1) 参照)
の複雑な組み合わせ設定する意味はあまり無いと考えます。
プレーンな英語のテキストですら非 ASCII 文字を含んでいるかもしれません、例えば左右のクオーテーションマークは ASCII の中にはありません。
“double quoted text” ‘single quoted text’
ASCII のプレーンテキストを UTF-8 のテキストに変換した時には、オリジナルの ASCII のテキストとまったく同じ内容とサイズとなります。ですから、UTF-8 ロケールを採用して何ら失うものはありません。
一部のプログラムは I18N をサポートした後でより多くのメモリーを消費するようになります。それらのプログラムは、実行速度最適化のために内部的に UTF-32 (UCS4) で Unicode のサポートをコードされていて、選ばれたロケールに無関係にそれぞれの ASCII 文字データー毎に4バイトを消費するからです。ここでも、UTF-8 ロケールを使ったからといって何も失うわけではありません。
ベンダー固有の旧式非 UTF-8 の符号化システムは、多くの国でグラフィック文字のような一部文字に関して仔細だが困惑する相違がありがちでした。現代的な OS が UTF-8 システムを採用したことはこのような符号化方式 (エンコーディング) の問題を実質的に解決しました。
システムが特定のロケールにアクセスするために、ロケールデーターはロケールデーターベースにコンパイルされなければいけません。(locales-all
パッケージをインストールしない限り、Debian システムは全てのロケールを事前にコンパイルして提供されません。) コンパイルすることができようにサポートされているロケールの全リストは
"/usr/share/i18n/SUPPORTED
"
に記載されています。全ての正確なロケール名がこのファイルにリストされています。次のようにすると全ての既にバイナリー形式にコンパイルされ使える UTF-8
ロケールがリストされます。
$ locale -a | grep utf8
次のコマンド実行をすると locales
パッケージが再設定されます。
# dpkg-reconfigure locales
このプロセスは3段階あります。
/etc/defaults/locale
" 中のシステム全体のデフォールトのロケール値を設定
使えるロケールには、"en_US.UTF-8
" と "UTF-8
"
付きの全ての関心のある言語が含まれているべきです。
米国英語での推奨のデフォールトロケールは "en_US.UTF-8
" です。他の言語では
"UTF-8
"
付きのロケールを選ぶようにして下さい。これらの設定の内のいずれを使おうとも、いかなる国際化文字でも扱えます。
ロケールを "C
" に設定すると、メッセージは米国英語になりますが、ASCII 文字しか扱えなくなります。
"$LANG
" 環境変数の値は多くのアプリケーションによって設定や変更されます。
login
(1) の PAM 機構によって初期設定
ssh
(1) の PAM 機構によって初期設定
gdm
(1) のような一部ディスプレーマネージャーによって変更
~/.xsessionrc
" を経由する X
セッションの起動コードによって変更 (lenny
の機能)
~/.bashrc
" 等のシェルの起動コードによって変更
互換性を最大限に考えると、システムワイドのデフォールトロケールを "en_US.UTF-8
"
と設定するのが賢明です。
PAM のカスタム化 (「PAM と NSS」参照) を使えば、システムワイドのデフォールトロケールに関わらず、特定のロケールを X Window の下だけで選ぶ事ができます。
この環境は安定度を確保したままあなたに最良のデスクトップ経験を提供します。X Window システムが機能していないときでも読めるメッセージを表示する機能する文字ターミナルに常にアクセス出きます。中国語や日本語や韓国語のように非ローマ文字を使う言語では、これは非常に重要です。
X
セッションマネージャーパッケージが改良されれば別の方法が使えるようになるかもしれませんが、ロケールの一般的かつ基本的なロケールの設定方法として以下をお読み下さい。gdm
(1)
に関して、メニューから X セッションのロケールを選べることは承知しています。
"/etc/pam.d/gdm
" のような PAM
設定ファイル中で言語の環境変数を定義する場所は次の行が定義します。
auth required pam_env.so read_env=1 envfile=/etc/default/locale
これを次のように変更します。
auth required pam_env.so read_env=1 envfile=/etc/default/locale-x
日本語の場合、"-rw-r--r-- 1 root root
" パーミッションで次のように
"/etc/defaults/locale-gdm
" ファイルを作成します。
LANG="ja_JP.UTF-8"
他のプログラムのためにデフォールトの "/etc/defaults/locale
"
ファイルは次のように元のままにします。
LANG="en_US.UTF-8"
これはロケールをカスタム化する最も一般的なテクニックで、gdm
(1)
自身のメニュー選択ダイアローグを地域化します。
この場合の代策として、"~/.xsessionrc
" ファイル使って簡単にロケールを変更してもいいです。
クロスプラットフォームのデーター交換 (「リムーバブルストレージデバイス」参照)
のために、特定の符号化方式 (エンコーディング) でファイルシステムをマウントする必要があるかもしれません。例えば、vfat ファイルシステムに関して mount
(8)
はオプション無しの場合 CP437 とみなします。ファイル名に UTF-8 とか CP932
を使うためには明示的にマウントオプションを提供する必要があります。
GNOME のような現代的なデスクトップ環境の下では、デスクトップアイコンを右クリックし "Drive" タブをクリックし "Setting" を開くようにクリックし "Mount options:" に"utf8" を入力すれば、ホットプラグできる USB メモリーを自動マウントする時のマウントオプションを設定できます。このメモリースティックを次にマウントする機会には UTF-8 でのマウントが有効です。
もしシステムをアップグレードしたり旧式非 UTF-8 システムからディスクを移動したりする場合には、非 ASCII 文字のファイル名は ISO-8859-1 とか eucJP 等の今は非推奨の歴史的符号化方式で符号化をしているかもしれません。テキスト変換ツールの助力を得て、ファイル名を UTF-8 に変換します。「テキストデーター変換ツール」を参照下さい。
Samba は新規クライアント (Windows NT、200x、XP) には Unicode
を使いますが、旧式クライアント (DOS、Windows 9x/Me) には CP850
をデフォールトで使います。この旧式クライアントへのデフォールトは "/etc/samba/smb.conf
"
ファイル中の "dos charset
" を使って例えば日本語なら CP932 等と変更できます。
Debian システム中で表示されるエラーメッセージや標準のプログラムの出力やメニューやマニュアルページ等のテキストメッセージや文書の多くに翻訳があります。ほとんどの翻訳行為のバックエンドツールとして GNU gettext(1) コマンドツールチェインが使われています。
"Tasks" → "Localization" の下の aptitude
(8)
リストは地域化されたメッセージをアプリケーションに追加したり翻訳された文書を提供する有用なバイナリーパッケージの徹底的なリストを提供します。
例えば、manpages-<LANG>
パッケージをインストールするとマンページで地域化したメッセージに使えるようになります。<programname>
に関するイタリア語のマンページを "/usr/share/man/it/
" から読むには、次を実行します。
LANG=it_IT.UTF-8 man <programname>
sort
(1) を使う際のソートオーダー (並べ替え順序)
はロケールの言語選択に影響されます。スペイン語と英語のロケールでは異なる並べ替えが違います。
ls
(1) の日付フォーマットはロケールに影響されます。"LANG=C ls
-l
" と "LANG=en_US.UTF-8
" の日付フォーマットは違います (「時間と日付のカスタム化表示」参照)。
数字の区切り方はロケール毎に異なります。例えば、英語のロケールでは一千一百一点一は "1,000.1
"
と表示されますが、ドイツ語のロケールでは "1.000,1
"
と表示されます。スプレッドシートプログラムでこの違いに出会うかもしれません。
主にコンソールからシステムを設定や管理する基本的なティップを次に記します。
screen
(1)
は、ネットワーク接続中断をサポートするので信頼性が低く断続的な接続経由でリモートサイトをアクセスする人にとっては非常に有用なツールです。
表9.1 ネットワーク切断の中断をサポートするプログラムのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
screen *
|
V:11, I:34 | 952 | VT100/ANSI ターミナルエミュレーションを使ってのターミナルマルチプレクサ |
screen
(1) は複数のプロセスを1つのターミナルウィンドウでうまく動作させるのみならず、接続が中断してもリモートシェルプロセスを生き延びさせる事もできます。screen
(1)
の使われ方の典型的シナリオは次です。
screen
を起動します。
^A c
("Control-A" に続いて "c") によって作られた
screen
のウィンドウ中で複数のプログラムを実行します。
^A n
("Control-A" に続いて "n") によって、複数の
screen
のウィンドウ間を切り替えます。
次のようないかなる方法ででも、screen
のセッションをデタッチできます。
^A d
("Control-A" に続いて "d") とタイプしてリモート接続から手動でログアウト
^A DD
("Control-A" に続いて "DD") とタイプして
screen
をデタッチしてログアウト
screen
を"screen -r
" として起動します。
screen
は全アクティブなプログラムが実行されている過去の全
screen
ウィンドウを魔法のようにリアタッチします。
screen
を使うと、切断してもプロセスをアクティブにしておけその後で再接続した時にリアタッチできるので、ダイヤルアップやパケット接続のような計量されたネットワーク接続での接続料金の節約ができます。
screen
セッションではコマンドキーストローク以外の全てのキーボード入力は現在のウィンドウに送られます。全ての
screen
コマンドキーストロークは ^A
("Control-A")
と単一キー [プラス何らかのパラメーター] をタイプすることによって入力されます。次に覚えておくべき重要なコマンドキーストロークを記します。
表9.2 screen キーバインディングのリスト
キーバインディング | 意味 |
---|---|
^A ?
|
ヘルプスクリーンを表示 (キーバインディングを表示) |
^A c
|
新規ウィンドウを作成しそれに切り替える |
^A n
|
次のウィンドウに切り替える |
^A p
|
前のウィンドウに切り替える |
^A 0
|
0番のウィンドウに切り替える |
^A 1
|
1番のウィンドウに切り替える |
^A w
|
ウィンドウのリストを表示 |
^A a
|
Ctrl-A を現在のウィンドウにキーボード入力として送る |
^A h
|
現在のウィンドウのハードコピーをファイルに書く |
^A H
|
現在のウィンドウのファイルへのロギングを開始/終了する |
^A ^X
|
ターミナルをロック (パスワードで保護) |
^A d
|
ターミナルから screen のセッションをデタッチ |
^A DD
|
screen のセッションをデタッチしてログアウト |
詳細は screen
(1) を参照下さい。
多くのプログラムは "/var/log/
" ディレクトリーの下にそれぞれの活動を記録します。
klogd
(8)
syslogd
(8)
「システムメッセージ」と「カーネルメッセージ」を参照下さい。
注目すべきログアナライザー (aptitude
(8)
で"~Gsecurity::log-analyzer
") を次に記します。
表9.3 システムログアナライザーのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
logwatch *
|
V:3, I:3 | 2592 | 綺麗な出力の Perl で書かれたログアナライザー |
fail2ban *
|
V:4, I:5 | 660 | 複数回の認証エラーを発生させる IP を使用禁止にします |
analog *
|
V:1.0, I:16 | 4520 | ウェッブサーバーのログアナライザー |
awstats *
|
V:1.8, I:3 | 5200 | 強力で機能の多いウェッブサーバーのログアナライザー |
sarg
*
|
V:1.9, I:2 | 644 | squid の分析レポートジェネレター |
pflogsumm *
|
V:0.3, I:0.7 | 160 | Postfix ログ項目サマライザー |
syslog-summary *
|
V:0.2, I:0.9 | 84 | syslog ログファイルの内容をまとめる |
lire
*
|
V:0.15, I:0.17 | 5304 | 機能豊富なログアナライザーとレポートジェネレター |
fwlogwatch *
|
V:0.10, I:0.2 | 440 | ファイアウォールログアナライザー |
squidview *
|
V:0.11, I:0.6 | 244 | squid の access.log ファイルのモニターと分析 |
visitors *
|
V:0.09, I:0.3 | 228 | ウェッブサーバーの高速ログアナライザー |
swatch *
|
V:0.06, I:0.2 | 112 | 正規表現マッチ、ハイライト、フック機能付きログファイルビューワー |
crm114 *
|
V:0.06, I:0.18 | 1300 | 制御可能な正規表現切断機とスパムフィルター (CRM114) |
icmpinfo *
|
V:0.04, I:0.2 | 84 | ICMP メッセージの解釈 |
CRM114 はTRE 正規表現ライブラリーを使うファジーなフィルターを書く言語インフラを提供します。そのよくある応用はスパムメールのフィルターですが、ログアナライザーとしても使えます。
単に script
(1) を使ってシェル活動を記録すると (「シェル活動の記録」参照)、コントロール文字の入ったファイルが生成されます。このような事は次のようにして
col
(1) を使うことで避けられます。
$ script Script started, file is typescript
何なりとします … そして script
から脱出するために Ctrl-D
を押します。
$ col -bx <typescript >cleanedfile $ vim cleanedfile
(例えば、initramfs 中のブートプロセスの途中のように) script
が無い場合には、その代わりに次のようにすれば良いです。
$ sh -i 2>&1 | tee typescript
gnome-terminal
のような一部の
x-terminal-emulator
は記録できます。スクロールバック用バッファーを拡大するのが良いかもしれません。
screen
(1) を"^A H
" と一緒に使っても (「screen コマンドのキーバインディング」参照) コンソールの記録が録れます。
emacs
(1) を"M-x shell
" か "M-x
eshell
" か "M-x term
" と一緒に使ってもコンソールの記録が録れます。後で
"C-x C-w
" とするとバッファーをファイルに書き出せます。
more
(1) や less
(1) 等のページャーツール (「ページャー」参照) や、ハイライトやフォーマット用のカスタムツール (「プレーンテキストデーターをハイライトとフォーマット」参照)
はテキストデーターを綺麗に表示できますが、汎用エディター (「テキストエディター」参照)
が最も汎用性がありカスタム化が可能です。
vim
(1) やそのページャーモードのエリアス view
(1)
では、":set hls
" とするとハイライトサーチが可能になります。
"ls -l
" コマンドによる時間と日付のデフォールトの表示形式はロケール (値は「タイムスタンプ」を参照)
に依存します。"$LANG
" 変数が最初に参照され、それを
"$LC_TIME
" 変数によりオーバーライドする事ができます。
実際の各ロケールでのデフォールトの表示形式は使われた標準 C ライブラリー (libc6
パッケージ)
のバージョンに依存します。つまり Debian の異なるリリースは異なるデフォールトです。
ロケール以上にこの時間や日付の表示フォーマットをカスタム化したいと真摯に望むなら、"--time-style
"
引数か "$TIME_STYLE
" 値を使って時間スタイル値を設定するべきです (ls
(1) と
date
(1) と "info coreutils 'ls
invocation'
" を参照下さい)。
表9.4 lenny
での "ls -l
" コマンドによる時間と日付の表示例
時間スタイル値 | ロケール | 時間と日付の表示 |
---|---|---|
iso
|
any |
01-19 00:15
|
long-iso
|
any |
2009-01-19 00:15
|
full-iso
|
any |
2009-01-19 00:15:16.000000000 +0900
|
locale
|
C
|
Jan 19 00:15
|
locale
|
en_US.UTF-8
|
2009-01-19 00:15
|
locale
|
es_ES.UTF-8
|
ene 19 00:15
|
+%d.%m.%y %H:%M
|
any |
19.01.09 00:15
|
+%d.%b.%y %H:%M
|
C または en_US.UTF-8
|
19.Jan.09 00:15
|
+%d.%b.%y %H:%M
|
es_ES.UTF-8
|
19.ene.09 00:15
|
例えば "alias ls='ls --time-style=+%d.%m.%y\ %H:%M'
"
とするコマンドエリアスを使うことでコマンドライン上に長いオプションを入力しなくてよくなります (「コマンドエリアス」を参照下さい)。
このような iso フォーマットは ISO 8601 に準拠しています。
殆どの現代的なターミナルへのシェル出力は ANSI
エスケープコードを使って着色化できます
("/usr/share/doc/xterm/ctlseqs.txt.gz
" を参照)。
例えば、次を試してみて下さい:
$ RED=$(printf "\x1b[31m") $ NORMAL=$(printf "\x1b[0m") $ REVERSE=$(printf "\x1b[7m") $ echo "${RED}RED-TEXT${NORMAL} ${REVERSE}REVERSE-TEXT${NORMAL}"
着色化されたコマンドは対話環境で出力を検査するのに便利です。私は、私の "~/.bashrc
"
に次を含めています。
if [ "$TERM" != "dumb" ]; then eval "`dircolors -b`" alias ls='ls --color=always' alias ll='ls --color=always -l' alias la='ls --color=always -A' alias less='less -R' alias ls='ls --color=always' alias grep='grep --color=always' alias egrep='egrep --color=always' alias fgrep='fgrep --color=always' alias zgrep='zgrep --color=always' else alias ll='ls -l' alias la='ls -A' fi
エリアスを使うことで色効果を対話コマンド使用時に限定します。こうすると less
(1)
等のページャープログラムの下でも色を見られるので、環境変数 "export
GREP_OPTIONS='--color=auto'
"
をエキスポートするより都合が良いです。他のプログラムにパイプする際に色を使いたくないなら、先ほどの
"~/.bashrc
" 例中で代わりに "--color=auto
"
とします。
このような着色するエリアスは、対話環境でシェルを "TERM=dumb bash
"
として起動することで無効にできます。
複雑な反復のためにエディターでの活動を記録できます。
Vim の場合以下のようにします。
qa
": 名前付きレジスタ "a
" にタイプした文字の記録を開始。
q
": タイプした文字の記録を終了。
@a
": レジスター "a
" の内容を実行。
Emacs の場合は以下のようにします。
C-x (
": キーボードマクロの定義開始。
C-x )
": キーボードマクロの定義終了。
C-x e
": キーボードマクロの実行。
xterm
の表示を含めた、X アプリケーションの画像イメージを記録するにはいくつか方法があります。
表9.5 画像の操作ツールのリスト
パッケージ | ポプコン | サイズ | コマンド |
---|---|---|---|
xbase-clients *
|
V:3, I:47 | 132 |
xwd (1)
|
gimp
*
|
V:12, I:44 | 13560 | GUI メニュー |
imagemagick *
|
V:13, I:35 | 268 |
import (1)
|
scrot
*
|
V:0.3, I:1.4 | 80 |
scrot (1)
|
DVCS システムを使って設定ファイルの変更を記録する専用ツールがあります。
表9.6 VCS 中に設定の履歴を記録するパッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
etckeeper *
|
V:1.0, I:1.5 | 376 | Git (デフォールト) か Mercurial か Bazaar を使って設定ファイルとそのメタデーターを保存 (新規) |
changetrack *
|
V:0.07, I:0.09 | 152 | RCS を使って設定ファイルを保存 (旧式) |
git
(1) which put entire "/etc
" 全てを VCS
のコントロール下に置くように、git
(1) とともに etckeeper
パッケージを使うことをお薦めします。そのインストール案内とチュートリアルは
"/usr/share/doc/etckeeper/README.gz
" にあります。
本質的に "sudo etckeeper init
"
を実行すると、"/etc
" に関する git
レポジトリーが、徹底的な手順を踏む特別のフックスクリプト付きでちょうど「設定履歴記録のための Git」と同様に初期化されます。
あなたが設定を変える毎に、普通に git
(1)
を使って記録できます。パッケージ管理コマンドを使うと、変更に関して上手に毎回自動記録もします。
"/etc
" の変更履歴を閲覧するには、"sudo GIT_DIR=/etc/.git
gitk
" と実行すると、新規インストールされたパッケージや削除されたパッケージやパッケージのバージョンの変化が一目瞭然です。
Linux のlive CDs とかレスキューモードで debian-installer CDs であなたのシステムをブートすることでブートデバイス上のデーターストレージの再設定が簡単にできるようになります。「バイナリーデーター」も参照下さい。
ディスクのパーティションの設定に関して、fdisk
(8)
は標準と考えられてきていますが、parted
(8) も注目に値します。"ディスクパーティションデーター" や
"パーティションテーブル" や "パーティションマップ" や "ディスクラベル" は全て同意語です。
殆どの PC では、ディスクのパーティションデーターが最初のセクターつまり LBA セクター 0 (512バイト) に保持される、古典的なマスターブートレコード (MBR) 方式が使われています。
新規の Intel ベースの Mac のような拡張ファームウェアインターフェイス (EFI) 付きの一部 PC では、ディスクパーティションデーターをセクターの最初以外に保持する GUID Partition Table (GPT) 方式が使われています。
fdisk
(8)
はディスクパーティションツールの標準でしたが、parted
(8) がそれを置き換えつつあります。
表9.7 ディスクパーティション管理パッケージのリスト
パッケージ | ポプコン | サイズ | GPT | 説明 |
---|---|---|---|---|
util-linux *
|
V:91, I:99 | 2216 | 非サポート |
fdisk (8) と cfdisk (8)
を含む雑多なシステムユーティリティー
|
parted *
|
V:1.0, I:9 | 236 | サポート | GNU Parted ディスクパーティションとリサイズのプログラム |
gparted *
|
V:3, I:31 | 4548 | サポート |
libparted ベースの GNOME パーティションエディター
|
qtparted *
|
V:0.10, I:0.9 | NOT_FOUND | サポート |
libparted ベースの KDE パーティションエディター
|
gptsync *
|
V:0.01, I:0.18 | 72 | サポート | 古典的 MBR パーティションテーブルを GPT パーティションテーブルと同期 |
kpartx *
|
V:1.0, I:1.8 | 132 | サポート | パーティション用のデバイスマッピングを作成するプログラム |
parted
(8) はファイルシステムを生成やリサイズも出きるということですが、そのようなことは
mkfs
(8) (mkfs.msdos
(8) と
mkfs.ext2
(8) と mkfs.ext3
(8) と…) とか
resize2fs
(8) 等の最もよくメンテされている専用ツールを使って行う方がより安全です。
GPT と MBR
間で切り替えるには、ディスクの最初数ブロックの内容を直接消去し (「ファイル内容の消去」参照)、"parted /dev/sdx mklabel
gpt
" か "parted /dev/sdx mklabel msdos
"
を使ってそれを設定する必要があります。ここで "msdos
" がMBR のために使われていることを覚えておきます。
あなたのパーティションの再設定やリムーバブルストレージメディアの起動順序はパーティションの名前を変えることになるかもしれませんが、それに首尾一貫してアクセスできます。もしディスクが複数ありあなたの BIOS がそれに首尾一貫したデバイス名をつけない時にも、これは役に立ちます。
-U
" オプションを使って mount
(8) を実行すると
"/dev/sda3
" のようなファイル名を使うのではなく UUID を使ってブロックデバイスをマウントできます。
/etc/fstab
" (fstab
(5) 参照) は UUID を使えます。
ブロックスペシャルデバイスの UUID はblkid
(8)
を使って見極められます。
リムーバブルストレージメディア等のデバイス名は、必要なら udev rules を使って静的になります。「udev システム」を参照下さい。
ext3 ファイルシステム用に e2fsprogs
パッケージは次を提供します。
mkfs
(8) と fsck
(8)
コマンドは各種ファイルシステム依存プログラム (mkfs.fstype
や
fsck.fstype
) のフロントエンドとして e2fsprogs
により提供されています。ext3
ファイルシステム用は、mkfs.ext3
(8) と fsck.ext3
(8)
で、それぞれ mke2fs
(8) と e2fsck
(8)
にハードリンクされています。
類似コマンドが Linux によってサポートされる各ファイルシステム用にあります。
表9.8 ファイルシステム管理用パッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
e2fsprogs *
|
V:60, I:99 | 1924 | ext2/ext3/ext4 ファイルシステムのためのユーティリティー |
reiserfsprogs *
|
V:2, I:8 | 1200 | Reiserfs ファイルシステムのためのユーティリティー |
dosfstools *
|
V:3, I:31 | 192 | FAT ファイルシステムのためのユーティリティー (Microsoft: MS-DOS, Windows) |
xfsprogs *
|
V:2, I:10 | 3272 | XFS ファイルシステムのためのユーティリティー (SGI: IRIX) |
ntfsprogs *
|
V:3, I:20 | 676 | NTFS ファイルシステムのためのユーティリティー (Microsoft: Windows NT, …) |
jfsutils *
|
V:0.5, I:2 | 1112 | JFS ファイルシステムのためのユーティリティー (IBM: AIX, OS/2) |
reiser4progs *
|
V:0.09, I:0.7 | 1264 | Reiser4 ファイルシステムのためのユーティリティー |
hfsprogs *
|
V:0.06, I:0.8 | 316 | HFS と HFS Plus ファイルシステムのためのユーティリティー (Apple: Mac OS) |
btrfs-tools *
|
V:0.3, I:0.6 | 1288 | btrfs ファイルシステムのためのユーティリティー |
zerofree *
|
V:0.10, I:0.7 | 56 | ext2/3 ファイルシステムのフリーブロックをゼロにセットするプログラム |
Ext3 ファイルシステムは Linux
システムのデフォールトのファイルシステムなので、特段使わない理由が無い限りそれを使うことを強くお薦めします。Linux カーネル 2.6.30
(Debian squeeze
) 以降、ext4
ファイルシステムが使えるようになり、Linux システムのデフォールトのファイルシステムとなると期待されています。btrfs ファイルシステムは、Linux システムの ext4 ファイルシステムの次のデフォールトのファイルシステムとなると期待されています。
まだ新しいので ext4 を使うと色々制約があるかもしれません。例えば、ext4 パーティションのサイズ変更をするには Linux カーネルが 2.6.30 以降でなければいけません。
一部のツールはファイルシステムへのアクセスを Linux カーネルのサポート無しでも可能にします (「ディスクをマウントせずに操作」参照)。
mkfs
(8) コマンドは Linux
システム上でファイルシステムを生成します。fsck
(8) コマンドは Linux
システム上でファイルシステムの整合性チェックと修理機能を提供します。
一般的に fsck
をマウントされているファイルシステムに行うことは安全ではありません。
ブートスクリプトから実行される fsck
(8) コマンドの結果を
"/var/log/fsck/
" 中のファイルからチェックします。
"shutdown -F -r now
"
を使うことでリブートの際に強制的にルートファイルシステムを含む全てのファイルシステムに関して fsck
(8)
コマンドを安全に実行します。詳細は shutdown
(8) マンページを参照下さい。
ファイルシステムのパーフォーマンスや性格はそれに使われるマウントオプションによって最適化できます
(fstab
(5) と mount
(8) 参照)。
defaults
" オプションはデフォールトのオプションが次の意味です:
"rw,suid,dev,exec,auto,nouser,async
"。(一般的)
noatime
" もしくは "relatime
"
オプションは読出しアクセスを高速化するのに非常に効果的です。(一般的)
user
" オプションは通常ユーザーがファイルシステムをマウント出来るようにします。このオプションは
"noexec,nosuid,nodev
" オプションの組み合わせの意味です。(一般的、CD や floppy
に使用)
noexec,nodev,nosuid
" オプションの組み合わせはセキュリティーの強化に使われます。(一般的)
noauto
" オプションは明示的操作のみにマウントを制限します。(一般的)
data=journal
"
オプションは、書込み速度を犠牲ににしますが、停電時のデーター整合性を強化します。
ルートファイルシステムに非デフォールトのジャーナルモードを設定するには、例えば
"rootflags=data=journal
" 等の、カーネルブートパラメーター (「2段目: ブートローダー」参照) を与える必要があります。lenny
の場合、デフォールトのジャーナルモードは "rootflags=data=ordered
"
です。squeeze
の場合、デフォールトのジャーナルモードは
"rootflags=data=writeback
" です。
tune2fs
(8) コマンドを用いてファイルシステムのスーパーブロックによってファイルシステムを最適化できます。
sudo tune2fs -l /dev/hda1
"
を実行するとそのファイルシステムスーパーブロックを表示します。
sudo tune2fs -c 50 /dev/hda1
" を実行するとファイルシステムのチェック
(ブートアップ時の fsck
実行) の頻度を50回のブート毎に変更します。
sudo tune2fs -j /dev/hda1
" の実行は ext2 から ext3
へとファイルシステム変換してファイルシステムにジャーナリングの機能を追加します。(アンマウントしたファイルシステムに対して実行します。)
sudo tune2fs -O extents,uninit_bg,dir_index /dev/hda1 &&
fsck -pf /dev/hda1
" の実行はファイルシステムを ext3
から ext4 に変換します。(アンマウントしたファイルシステムに対して実行します。)
ext4 ファイルシステムへのブートデバイスのファイルシステム変換は GRUB ブートローダーが ext4 ファイルシステムをよくサポートしインストールされた Linux カーネルバージョンが 2.6.30 以降となるまではしないでおくべきです。
ハードディスクの設定はデーターの整合性にとって非常に危険な事なので、その設定をさわる前にお使いのハードウエアーをチェックし
hdparam
(8) のマンページをチェックします。
例えば "/dev/hda
" に対して "hdparm -tT
/dev/hda
" とするとハードディスクのアクセス速度をテストできます。(E)IDE
を使って接続された一部のハードディスクでは、"(E)IDE 32ビット I/O サポート" を有効にし "using_dma フラグ" を有効にし
"interrupt-unmask フラグ" を設定し "複数16セクター I/O" を設定するように、"hdparm -q -c3
-d1 -u1 -m16 /dev/hda
" とすると高速化できます (危険です!)。
例えば "/dev/sda" に対して "hdparm -W /dev/sda
"
とするとハードディスクの書込みキャッシュ機能をテストできます。"hdparm -W 0 /dev/sda
"
とするとハードディスクの書込みキャッシュ機能を無効にできます。
不良プレスの CDROM を現代的な高速 CD-ROM ドライブで読むには、"setcd -x 2
"
としてそれを減速して使えば読めるかもしれません。
smartd
(8) デーモンを使うと SMART
に文句を言うハードディスクの監視と記録ができます。
smartmontools
パッケージをインストールします。
df
(1) を使ってリストすることであなたのハードディスクを識別します。
/dev/hda
" と仮定します。
SMART 機能が実際に有効となっているかを "smartctl -a
/dev/hda
" のアウトプットを使ってチェックします。
smartctl -s on -a /dev/hda
" として有効にします。
次のようにして smartd
(8) デーモンを実行します。
/etc/default/smartmontools
" ファイル中の
"start_smartd=yes
" をアンコメントします。
sudo /etc/init.d/smartmontools restart
" として
smartd
(8) デーモンを再実行します。
smartd
(8) デーモンは、警告の通知の仕方を含めて
/etc/smartd.conf
ファイルを用いてカスタム化できます。
インストール時に論理ボリュームマネージャー (LVM) (Linux 機能) 上に作られたパーティションは、大掛かりなシステムの再設定無しに複数のストレージデバイスにまたがる LVM 上のエクステントを継ぎ足したりその上のエクステントを切り捨てることで簡単にサイズ変更が出きます。
現行の LVM システムを採用すると、ハードディスクの書込みキャッシュ機能を無効にしてパーフォーマンスを犠牲にしないと、ext3fs 等のジャーナルファイルシステムによって提供されるファイルシステムの破壊に対する保証を劣化させるかもしれません。
空のパーティションがあれば (例えば "/dev/sdx
")、それを
mkfs.ext3
(1) を使ってフォーマットし、それをあなたが空間をより必要とするディレクトリーに
mount
(8) することができます。(元来あったデーター内容はコピーする必要があります。)
$ sudo mv work-dir old-dir $ sudo mkfs.ext3 /dev/sdx $ sudo mount -t ext3 /dev/sdx work-dir $ sudo cp -a old-dir/* work-dir $ sudo rm -rf old-dir
上記の代わりに、空のディスクイメージファイル (「空のディスクイメージ作成」参照) をループデバイスとしてマウントする (「ディスクイメージファイルをマウント」参照) 事もできます。実際のディスク使用は実際にデーターを溜め込むとともに成長します。
使える空間がある他のパーティション中に空のディレクトリーがあれば (例えば
"/path/to/emp-dir
")、そのディレクトリーへ ln
(8)
を使ってシムリンクを作成することができます。
$ sudo mv work-dir old-dir $ sudo mkdir -p /path/to/emp-dir $ sudo ln -sf /path/to/emp-dir work-dir $ sudo cp -a old-dir/* work-dir $ sudo rm -rf old-dir
一部のプログラムは "ディレクトリーへのシムリンク" ではうまく機能しないかもしれません。
他のパーティション中に使える空間があれば (例えば "/path/to/
")、その中にディレクトリーを作り
aufs を使って空間を必要とするディレクトリー上に積み重ねることができます。
$ sudo mv work-dir old-dir $ sudo mkdir work-dir $ sudo mkdir -p /path/to/emp-dir $ sudo mount -t aufs -o br:/path/to/emp-dir:old-dir none work-dir
aufs を長期間のデーターのストレージに使うのは、まだ開発中でそのデザイン変更が問題を引き起こすかもしれないので感心しません。
あなたの PC への物理的アクセスがあると、誰でも簡単に root 特権を獲得できあなたの PC の全てのファイルにアクセスできます (「root パスワードのセキュリティー確保」参照)。これが意味するところは、あなたの PC が盗まれた場合にログインのパスワードではあなたのプライベートでセンシティブなデーターを守れないと言うことです。それを達成するにはデーターの暗号化技術を適用しなければいけません。GNU プライバシーガード (「データーセキュリティーのインフラ」参照) はファイルを暗号化できますが、少々手間がかかります。
dm-crypt と eCryptfs は最小限のユーザー努力でできる自動的なデーターの暗号化を Linux のカーネルモジュールその物を使って提供します。
表9.9 データー暗号化ユーティリティーのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
cryptsetup *
|
V:3, I:5 | 1172 | 暗号化されたブロックデバイス (dm-crypt / LUKS) のためのユーティリティー |
cryptmount *
|
V:0.2, I:0.5 | 360 | ノーマルユーザーによるマウント/アンマウントに焦点を当てた暗号化されたブロックデバイス (dm-crypt / LUKS) のためのユーティリティー |
ecryptfs-utils *
|
V:0.2, I:0.3 | 416 | 暗号化されたスタックドファイルシステム (eCryptfs) のためのユーティリティー |
Dm-crypt は device-mapper を使う暗号学的ファイルシステムです。Device-mapper は1つのブロックデバイスをもう1つのブロックデバイスにマップします。
eCryptfs はスタックドファイルシステムを使うもう1つのファイルシステムです。スタックドファイルシステムはマウントされたファイルシステム上の既存のディレクトリーの上に重ね合わせます。
データーの暗号化には CPU 時間等の負担がかかります。その利益と負担の両天秤をします。
debian-installer (lenny 以降) を使うと、dm-crypt/LUKS と initramfs を使って、全 Debian システムを暗号化したディスク上にインストールできます。
ユーザー空間での暗号化ユーティリティーに関しては「データーセキュリティーのインフラ」を参照下さい: GNU プライバシーガード。
例えば "/dev/sdx
" にある USB メモリースティックのようなリムーバブルストレージデバイスの内容を
dm-crypt/LUKS
を使って暗号化できます。それを単に次のようにフォーマットします。
# badblocks -c 10240 -s -w -t random -v /dev/sdx # shred -v -n 1 /dev/sdx # fdisk /dev/sdx ... "n" "p" "1" "return" "return" "w" # cryptsetup luksFormat /dev/sdx1 ... # cryptsetup luksOpen /dev/sdx1 sdx1 ... # ls -l /dev/mapper/ total 0 crw-rw---- 1 root root 10, 60 2008-10-04 18:44 control brw-rw---- 1 root disk 254, 0 2008-10-04 23:55 sdx1 # mkfs.vfat /dev/mapper/sdx1 ... # cryptsetup luksClose sdx1
こうすると暗号化されたディスクは、現代的な GNOME のようなデスクトップ環境では gnome-mount
(1)
を使ってパスワードを聞く以外は通常のディスクと同様に "/media/<disk_label>
"
にマウントできます (「リムーバブルストレージデバイス」参照)。全て書込まれるデーターが暗号化されている点が相違点です。上記と違い、例えば
"mkfs.ext3 /dev/sdx1
" を使って ext3
等の異なったフォーマットで記録メディアをフォーマットしても良いです。
もしデーターのセキュリティーが本当に偏執狂的に気になるなら、上記例で複数回の重ね書きをする必要があるかもしれません。でもこの操作は非常に時間がかかります。
オリジナルの "/etc/fstab
" が次の内容と仮定します。
/dev/sda7 swap sw 0 0
dm-crypt を使って swap パーティションの暗号化を次のようにして有効にします
# aptitude install cryptsetup # swapoff -a # echo "cswap /dev/sda7 /dev/urandom swap" >> /etc/crypttab # perl -i -p -e "s/\/dev\/sda7/\/dev\/mapper\/cswap/" /etc/fstab # /etc/init.d/cryptdisks restart ... # swapon -a
eCryptfs と ecryptfs-utils
パッケージを使うことで、"~/Private/
" の下に書かれるファイルを自動的に暗号化できます。
ecryptfs-setup-private
(1) を実行してプロンプトに従って
"~/Private/
" を設定します。
ecryptfs-mount-private
(1) を実行して
"~/Private/
" を有効にします。
センシティブなデーターファイルを "~/Private/
" に移動し、必要に応じてシムリンクを作成します。
~/.fetchmailrc
"、"~/.ssh/identity
"、"~/.ssh/id_rsa
"、"~/.ssh/id_dsa
"、"go-rwx
"
を持つ他のファイル
センシティブなデーターディレクトリーを "~/Private/
"
中のサブディレクトリーに移動し、必要に応じてシムリンクを作成します。
~/.gnupg
"、"go-rwx
" を持つ他のディレクトリー
~/Desktop/Private/
" から
"~/Private/
" までのシムリンクを作成します。
ecryptfs-umount-private
(1) を実行して
"~/Private/
" を無効にします。
ecryptfs-mount-private
" を実行して
"~/Private/
" を有効にします。
もしあなたのログインパスワードを暗号化キーを包むのに使っている場合には、"/etc/pam.d/common-auth
"
中の "pam_permit.so
" のすぐ前に次に記す行があるようにすることで PAM (プラグ可能な認証モジュール: Pluggable
Authentication Modules) を使って eCryptfs を自動的にマウントできます。
"/etc/pam.d/common-auth
" の
"pam_permit.so
" の直前に次の行を挿入します。
auth required pam_ecryptfs.so unwrap
"/etc/pam.d/common-session
" の最後に次の行を挿入します。
session optional pam_ecryptfs.so unwrap
"/etc/pam.d/common-password
" の最初の有効行に次の行を挿入します。
password required pam_ecryptfs.so
これは非常に便利です。
もしあなたのログインパスワードを暗号化キーを包むのに使っている場合には、あなたの暗号化されたデーターのセキュリティーはあなたのユーザーログインパスワードと同程度です (「良好なパスワード」参照)。注意深く強力なパスワードを設定していないと、あなたのラップトップを誰かが盗んだ後にパスワード破りソフトを実行すれば、あなたのデーターは危険にさらされます (「root パスワードのセキュリティー確保」参照)。
プログラム活動は専用ツールを用いて監視と制御できます。
表9.10 プログラム活動の監視と制御のツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
coreutils *
|
V:92, I:99 | 13828 |
nice (1): スケジューリングの優先順位の変更してプログラムを実行
|
bsdutils *
|
V:77, I:99 | 196 |
renice (1): 実行中プロセスのスケジューリングの優先順位を変更
|
procps *
|
V:86, I:99 | 772 |
"/proc " ファイルシステムのユーティリティー: ps (1) と
top (1) と kill (1) と
watch (1) 等
|
psmisc *
|
V:47, I:88 | 716 |
"/proc " ファイルシステムのユーティリティー: killall (1)
と fuser (1) と pstree (1) と
pstree (1)
|
time
*
|
V:6, I:84 | 152 |
time (1): 時間に関するシステムリソース使用状況を報告するためにプログラムを実行
|
sysstat *
|
V:4, I:9 | 872 |
sar (1)、iostat (1)、mpstat (1)、…:
Linux 用のシステムパーフォーマンスツール
|
isag
*
|
V:0.07, I:0.4 | 152 | sysstat の対話型システムアクティビティーグラフ化ソフト |
lsof
*
|
V:16, I:90 | 444 |
lsof (8): "-p "
を使い実行中のプロセスが開いているファイルをリスト
|
strace *
|
V:5, I:39 | 396 |
strace (1): システムコールやシグナルを追跡
|
ltrace *
|
V:0.3, I:2 | 188 |
ltrace (1): ライブラリーコールを追跡
|
xtrace *
|
V:0.02, I:0.18 | 372 |
xtrace (1): X11 のクライアントとサーバーの間の通信を追跡
|
powertop *
|
V:0.7, I:12 | 524 |
powertop (1): Intel を使ったラップトップのシステムの電力情報
|
cron
*
|
V:91, I:99 | 240 |
cron (8) デーモンからバックグランドでスケジュール通りプロセスを実行
|
anacron *
|
V:41, I:44 | 120 | 1日24時間動作でないシステム用の cron 類似のコマンドスケジューラー |
at
*
|
V:50, I:83 | 220 |
at (1) と batch (1) コマンド:
特定の時間や特定のロードレベル以下でジョブを実行
|
procps
パッケージはプログラム活動の監視と制御と起動の基本中の基本を提供します。このすべてを習得するべきです。
コマンドが起動したプロセスにより使われた時間を表示します。
# time some_command >/dev/null real 0m0.035s # 壁時計の時間 (実経過時間) user 0m0.000s # ユーザーモードの時間 sys 0m0.020s # カーネルモードの時間
ナイス値はプロセスのスケジューリングのプライオリティーを制御するのに使われます。
表9.11 スケジューリングのプライオリティーのためのナイス値のリスト
ナイス値 | スケジューリングのプライオリティー |
---|---|
19 | 最低優先順位プロセス (ナイス) |
0 | ユーザーにとっての非常に高優先順位プロセス |
-20 | rootにとっての非常に高優先順位プロセス (非ナイス) |
# nice -19 top # 非常にナイス # nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # 非常に高速
極端なナイス値はシステムに害を与えるかもしれません。本コマンドは注意深く使用下さい、
Debian 上の ps
(1) コマンドは BSD と SystemV
機能の両方をサポートしプロセスの活動を静的に特定するのに有用です。
ゾンビ (動作していない) 子プロセスに関して、"PPID
" フィールドで識別される親プロセス ID
を使ってプロセスを停止できます。
pstree
(1) コマンドはプロセスの木 (ツリー) を表示します。
Debian 上の top
(1)
は機能が豊で、どのプロセスがおかしな動きをしているかを動的に識別することに役立ちます。
表9.13 top のコマンドのリスト
コマンドキー | レスポンスの説明 |
---|---|
h か ?
|
ヘルプの表示 |
f
|
ディスプレーフィールドのセットとリセット |
o
|
表示フィールドの順番変更 |
F
|
ソートキーフィールドの設定 |
k
|
プロセスを停止 |
r
|
プロセスのナイス値を変更 |
q
|
top コマンドを終了
|
プロセス ID (PID)、例えば1を使うプロセスによって開かれている全ファイルは次のようにしてリストできます。
$ sudo lsof -p 1
PID=1 は通常 init
プログラムです。
プラグラムの活動状況は、システムコールとシグナルは strace
(1) で、ライブラリーコールは
ltrace
(1) で、X11 のクライアントとサーバーの通信は
xtrace
(1) でプラグラムの活動状況を追跡できます。
ls
コマンドのシステムコールを次のようにして追跡できます。
$ sudo strace ls
例えば "/var/log/mail.log
" 等のファイルを使っているプロセスは
fuser
(1) によって次のようにして識別できます。
$ sudo fuser -v /var/log/mail.log USER PID ACCESS COMMAND /var/log/mail.log: root 2946 F.... syslogd
"/var/log/mail.log
" ファイルが syslogd
(8)
コマンドによって書込みのために開かれている事が分かります。
例えば "smtp/tcp
" 等のソケットを使っているプロセスは
fuser
(1) によって次のようにして識別できます。
$ sudo fuser -v smtp/tcp USER PID ACCESS COMMAND smtp/tcp: Debian-exim 3379 F.... exim4
SMTP ポート (25) への TCP
接続を処理するためにあなたのシステムでは exim4
(8) が実行されている事がこれで分かります。
watch
(1) はプログラムを一定間隔で反復実行しながらフルスクリーンでその出力を表示します。
$ watch w
こうすると2秒毎更新でシステムに誰がログオンしているかを表示します。
例えばグロブパターン "*.ext
"
へのマッチ等の何らかの条件にマッチするファイルに関してループしながらコマンドを実行する方法がいくつかあります。
for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done
find
(1) と xargs
(1) の組み合わせ:
find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command
-exec
" オプションを使って find
(1):
find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;
-exec
" オプションを使って
find
(1):
find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "command '{}' && echo 'successful'" \;
上記の例はスペースを含む等の変なファイル名でも適正に処理できるように書かれています。find
(1)
に関する上級の使用法の詳細は「ファイル選択の慣用句」を参照下さい。
グラフィカルユーザーインターフェース (GUI) からプロセスをスタートできるように設定できます。
GNOME デスクトップ環境下では、ローンチャアイコンを ダブルクリックしたり、ファイルアイコンをローンチャアイコンへドラッグアンドドロップしたり、ファイルアイコンを右クリックで "Open with …" メニューとしたりしてプログラムを適正な引数とともにスタートできます。KDE でも同様の事ができます。
次は gnome-terminal
(1) 中で mc
(1)
をスタートさせるローンチャアイコンを作る GNOME 下での例です。
実行可能プログラム "mc-term
" を次のように作成。
# cat >/usr/local/bin/mc-term <<EOF #!/bin/sh gnome-terminal -e "mc \$1" EOF # chmod 755 /usr/local/bin/mc-term
ディレクトリーを次のように作成します。
Create Launcher …
" を選択
Application
" と設定します。
mc
" と設定します。
mc-term %f
" と設定します。
open-with との関連付けを作成します。
Open with Other Application …
" を選択します。
mc-term %f
"
を入力します。
ローンチャとは "~/Desktop
" 上の ".desktop
"
と言う拡張子のファイルです。
一部のプログラムは他のプログラムを自動的にスタートします。このプロセスをカスタム化する上でのチェックポイントを次に記します。
アプリケーション設定メニュー:
mc
(1): "/etc/mc/mc.ext
"
$BROWSER
" や "$EDITOR
" や
"$VISUAL
" や "$PAGER
" といった環境変数
(eviron
(7) 参照)
editor
" や "view
" や
"x-www-browser
" や "gnome-www-browser
"
や "www-browser
" 等のプログラムに関する
update-alternatives
(8) システム (「デフォールトのテキストエディターの設定」参照)
~/.mailcap
" や
"/etc/mailcap
" ファイルの内容 (mailcap
(5) 参照)
~/.mime.types
" や
"/etc/mime.types
" ファイルの内容
(run-mailcap
(1) 参照)
update-mime
(8) は"/etc/mailcap.order
"
ファイルを使って "/etc/mailcap
" ファイルを更新します
(mailcap.order
(5) 参照)。
debianutils
パッケージは、どのエディターやページャーやウェッブブラウザーを呼び出すかに関してそれぞれ賢明な判断をする
sensible-browser
(1) や
sensible-editor
(1) や sensible-pager
(1)
を提供します。これらのシェルスクリプトを読む事をお薦めします。
X の下で mutt
のようなコンソールアプリケーションをあなたの好むアプリケーションとして実行するには、次のようにして X
アプリケーションを作成し、前記の方法であなたの好む起動されるアプリケーションとして
"/usr/local/bin/mutt-term
" を設定します。
# cat /usr/local/bin/mutt-term <<EOF #!/bin/sh gnome-terminal -e "mutt \$@" EOF chmod 755 /usr/local/bin/mutt-term
kill
(1) を使ってプロセス ID を使ってプロセスを停止 (プロセスへシグナルを送信) します。
killall
(1) や pkill
(1)
プロセスコマンド名や他の属性を使ってプロセスを停止 (プロセスへシグナルを送信) します。
at
(1) コマンドを次のように実行して1回だけのジョブをスケジュールします。
$ echo 'command -args'| at 3:40 monday
cron
(8)
コマンドを実行して定期的タスクをスケジュールします。crontab
(1) と
crontab
(5) を参照下さい。
もしあなたが crontab
グループのメンバーの場合、例えば foo
というノーマルユーザーとして "crontab -e
" コマンドを使って
"/var/spool/cron/crontabs/foo
" という
crontab
(5) ファイルを作成することでプロセスをスケジュールして実行する事ができます。
crontab
(5) ファイルの例を次に記します。
# use /bin/sh to run commands, no matter what /etc/passwd says SHELL=/bin/sh # mail any output to paul, no matter whose crontab this is MAILTO=paul # Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed) # run at 00:05, every day 5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1 # run at 14:15 on the first of every month -- output mailed to paul 15 14 1 * * $HOME/bin/monthly # run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc: 0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%% 23 */2 1 2 * echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1" 5 4 * * sun echo "run at 04:05 every Sunday" # run at 03:40 on the first Monday of each month 40 3 1-7 * * [ "$(date +%a)" == "Mon" ] && command -args
連続的に稼働していないシステムでは、機器のアップタイム上可能な限り指定間隔に近く定期的にコマンドをスケジュールするために
anacron
パッケージをインストールします。anacron
(8) と
anacrontab
(5) を参照下さい。
スケジュールされたシステムメインテナンススクリプトは、そのようなスクリプトを
"/etc/cron.hourly/
" か
"/etc/cron.daily/
" か
"/etc/cron.weekly/
" か
"/etc/cron.monthly/
" 中に置くことで root
アカウントからそれらを定期的に実行できます。これらのスクリプトの実行時間は "/etc/crontab
" と
"/etc/anacrontab
" でカスタム化できます。
システム異常に対する保険はカーネルコンパイルオプションの "マジック SysRq キー" (SAK キー) によって提供されます。現在の Debian カーネルではこれがデフォールトです。Alt-SysRq に続いて次のキーの中から1つを押すことでシステムのコントロールを救済するマジックが起きます。
表9.15 SAK コマンドキーのリスト
Alt-SysRq に続くキー | アクションの説明 |
---|---|
r
|
X クラッシュの後でキーボードを raw (生コード発生) モードから復旧 |
0
|
エラーメッセージを減らすべくコンソールログレベルを 0 と変更 |
k
|
全ての現仮想ターミナル上の全てのプロセスを停止 (Kll) |
e
|
init (8) 以外の全てのプロセスに、SIGTERM を送信
|
i
|
init (8) 以外の全てのプロセスに、SIGKILL を送信
|
s
|
全てのマウントされたファイルシステムを同期 (Sync) |
u
|
全てのマウントされたファイルシステムを読出し専用で再マウント (アンマウント、umount) |
b
|
同期することもアンマウントする事も無しに、システムをリブート (Reboot) |
"Alt-SysRq s" と "Alt-SysRq u" と "Alt-SysRq r" の組み合わせは、非常に悪い状況からの脱出に有効です。
"/usr/share/doc/linux-doc-2.6.*/Documentation/sysrq.txt.gz
"
を参照下さい。
Alt-SysRq 機能があることはユーザーに root
特権機能をアクセスさせることになるのでセキュリティーリスクと考える事もできます。"/etc/rc.local
"
中に "echo 0 >/proc/sys/kernel/sysrq
" とか
"/etc/sysctl.conf
" 中に "kernel.sysrq =
0
" と置くと Alt-SysRq 機能を無効にできます。
SSH ターミナルなどからは、"/proc/sysrq-trigger
" に書き込むことで Alt-SysRq
機能が使えます。例えば、リモートのシェルプロンプトから "echo s > /proc/sysrq-trigger; echo
u > /proc/sysrq-trigger
" とすると、全てのマウントされたファイルシステムを sync (同期) して umount (アンマウント) します。
だれがシステム上にいるかは、次のようにしてチェックできます。
who
(1) は、誰がログオンしているかを表示します。
w
(1) は、誰がログオンしていて何をしているかを表示します。
last
(1) は、最後にログインしたユーザーのリストを表示します。
lastb
(1) は、最後にログイン失敗したユーザーのリストを表示します。
"/var/run/utmp
" と "/var/log/wtmp
" と
"/var/run/utmp
"
はこのようなユーザー情報を保持します。login
(1) と utmp
(5)
を参照下さい。
wall
(1) を使うと、次のようにしてシステムにログオンしている全員にメッセージを送れます。
$ echo "We are shutting down in 1 hour" | wall
PCI 的デバイス (AGP、PCI-Express、CardBus、ExpressCard、等) では、 (きっと "-nn
"
オプションとともに使う) lspci
(8) がハードウエアー識別の良いスタート点です。
この代わりに、"/proc/bus/pci/devices
"
の内容を読むか、"/sys/bus/pci
"
の下のディレクトリーツリーを閲覧することでハードウエアーの識別ができます (「procfs と sysfs」参照)。
表9.16 ハードウエアー識別ツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
pciutils *
|
V:15, I:92 | 908 |
Linux PCI ユーティリティー: lspci (8)
|
usbutils *
|
V:38, I:97 | 604 |
Linux USB ユーティリティー: lsusb (8)
|
pcmciautils *
|
V:0.8, I:13 | 100 |
Linux 2.6 のための PCMCIA ユーティリティー: pccardctl (8)
|
scsitools *
|
V:0.18, I:1.1 | 484 |
SCSI ハードウエアー管理のためのツール集: lsscsi (8)
|
pnputils *
|
V:0.01, I:0.16 | 108 |
Plug and Play BIOS のためのユーティリティー: lspnp (8)
|
procinfo *
|
V:0.3, I:3 | 164 |
"/proc " から得られるシステム情報: lsdev (8)
|
lshw
*
|
V:1.2, I:7 | 604 |
ハードウエアー設定に関する情報: lshw (1)
|
discover *
|
V:2, I:15 | 120 |
ハードウエアー識別システム: discover (8)
|
GNOME や KDE のような現代的な GUI のデスクトップ環境ではほとんどのハードウエアー設定が付随する GUI 設定ツールを通じて管理できますが、それらの設定の基本的手法を知っておくのは良い事です。
表9.17 ハードウエアー設定ツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
hal
*
|
V:37, I:49 | 1668 |
ハードウエアーアブストラクションレイヤー: lshal (1)
|
console-tools *
|
V:47, I:84 | 956 | Linux コンソールのフォントとキーテーブルユーティリティー |
x11-xserver-utils *
|
V:34, I:51 | 544 |
X サーバーユーティリティー: xset (1)、xmodmap (1)
|
acpid
*
|
V:51, I:91 | 208 | Advanced Configuration and Power Interface (ACPI) によって起こるイベントの管理のためのデーモン |
acpi
*
|
V:4, I:35 | 92 | ACPI デバイス上の情報を表示するユーティリティー |
apmd
*
|
V:1.2, I:11 | 252 | Advanced Power Management (APM) によって起こるイベントの管理のためのデーモン |
noflushd *
|
V:0.04, I:0.09 | 248 | ハードディスクをスピンダウンできるようにするデーモン |
sleepd *
|
V:0.07, I:0.09 | 148 | 非使用状況のときにラップトップをスリープさせるデーモン |
hdparm *
|
V:11, I:38 | 304 | ハードディスクアクセスの最適化 (「ハードディスクの最適化」参照) |
smartmontools *
|
V:7, I:23 | 1076 | S.M.A.R.T. を使ってストレージシステムを制御監視 |
setserial *
|
V:1.5, I:3 | 180 | シリアルポートの管理ツール集 |
memtest86+ *
|
V:0.5, I:5 | 652 | メモリーハードウエアー管理のためのツール集 |
scsitools *
|
V:0.18, I:1.1 | 484 | SCSI ハードウエアー管理のためのツール集 |
tpconfig *
|
V:0.3, I:0.5 | 220 | タッチパッドデバイス設定ユーティリティー |
setcd
*
|
V:0.06, I:0.3 | 28 | コンパクトデバイスアクセス最適化 |
big-cursor *
|
I:0.16 | 68 | X のための大きなマウスカーソール |
上記で、ACPI はAPM より新しい電力管理システムの枠組みです。
最近のシステム上の CPU フリーケンシースケーリングは acpi_cpufreq
のようなカーネルモジュールで管理されています。
以下はシステムとハードウエアーの時間を MM/DD hh:mm, CCYY (月/日 時:分, 年) に設定します。
# date MMDDhhmmCCYY # hwclock --utc --systohc # hwclock --show
Debian システムでは時間は通常地域の時間が表示されますが、ハードウエアーとシステムの時間は通常 UT (GMT) を使います。
ハードウエアー (BIOS) 時間が UT に設定されている場合は、"/etc/default/rcS
"
の中の設定を "UTC=yes
" と変更します。
ネットワーク経由でシステムの時間を更新したい場合には、ntp
や
ntpdate
や chrony
等のパッケージを使って NTP サービスを利用することを考えます。
次を参照下さい。
ntp-doc
パッケージ
ntp
パッケージ中の ntptrace
(8) を使うと、NTP
サービスの継がりを第一義的根源まで溯ることができます。
文字コンソールと ncurses
(3) システム機能を設定するのはいくつかの要素があります。
/etc/terminfo/*/*
" ファイル (terminfo
(5))
$TERM
" 環境変数 (term
(7))
setterm
(1)、stty
(1)、tic
(1)、toe
(1)
もし xterm
用の terminfo
エントリーが非 Debian
のxterm
でうまく機能しない場合には、リモートから Debian
システムにログインする時にターミナルタイプ、"$TERM
"、を
"xterm
" から "xterm-r6
"
のような機能限定版に変更します。詳細は "/usr/share/doc/libncurses5/FAQ
"
を参照下さい。"dumb
" は"$TERM
" の最低機能の共通項です。
現在の Linux 2.6 のためのサウンドカードのためのデバイスドライバーは Advanced Linux Sound Architecture (ALSA) で提供されています。ALSA は過去の Open Sound System (OSS) と互換性のためのエミュレーションモードを提供します。
"dpkg-reconfigure linux-sound-base
"
を実行し、カーネルモジュールをブラックリストすることで ALSA を使うように選択します。非常に新しいサウンドハードウエアーをお持ちで無ければ udev
インフラがあなたのサウンドシステムを設定します。
"cat /dev/urandom > /dev/audio
" か
speaker-test
(1) を使ってスピーカをテストします。(^C で停止)
音が出ない場合ですが、あなたのスピーカーが消音された出力につながっているかもしれません。現代的なサウンドシステムには多くの出力があります。alsa-utils
パッケージ中の alsamixer
(1) は音量や消音の設定をするのに便利です。
アプリケーションソフトはサウンドデバイスに直接アクセスするようにばかりでなく標準的なサウンドサーバーシステム経由で間接的にアクセスするように設定されているかもしれません。
表9.18 サウンドパッケージのリスト
各ポピュラーなデスクトップ環境では普通共通のサウンドエンジンがあります。アプリケーションに使われるそれぞれのサウンドエンジンはそれと異なるサウンドサーバーにつなぐようにもできます。
スクリーンセーバーを無効にするには、次のコマンドを使います。
表9.19 スクリーンセーバーを無効にするコマンドのリスト
環境 | コマンド |
---|---|
Linux コンソール |
setterm -powersave off
|
X Window (スクリーンセーバー消去) |
xset s off
|
X Window (dpms 無効) |
xset -dpms
|
X Window (スクリーンセーバーの GUI 設定) |
xscreensaver-command -prefs
|
PC スピーカーのコネクタを外すとブザー音は確実に無効にできます。pcspkr
カーネルモジュールを削除すると同じ事ができます。
次のようにすると bash
(1) が使う readline
(3)
プログラムが "\a
" (ASCII=7) に出会った際にブザー音を発生するのを防げます。
$ echo "set bell-style none">> ~/.inputrc
"/var/log/dmesg
"
中にあるカーネルブートメッセージに使えるメモリーの正確な全サイズが書かれています。
free
(1) や top
(1)
は稼働中システムのメモリーリソース情報を表示します。
$ grep '\] Memory' /var/log/dmesg [ 0.004000] Memory: 990528k/1016784k available (1975k kernel code, 25868k reserved, 931k data, 296k init) $ free -k total used free shared buffers cached Mem: 997184 976928 20256 0 129592 171932 -/+ buffers/cache: 675404 321780 Swap: 4545576 4 4545572
"Mem:
" 行の "used
" のサイズが大きかったり
"free
" のサイズが小さかったりについて悩まないでおきます。それらの1行下の
(次の例では675404と321780) を読んで安心して下さい。
1GB=1048576k の DRAM (video システムがこのメモリーの一部を使用) が付いている私の MacBook では次のようになっています。
表9.20 レポートされるメモリーサイズのリスト
報告 | サイズ |
---|---|
dmesg 中の全サイズ (Total) | 1016784k = 1GB - 31792k |
dmesg 中の未使用 (free) | 990528k |
shell 下での全 (total) | 997184k |
shell 下での未使用 (free) | 20256k (しかし実質は 321780k) |
ダメなシステム管理をするとあなたのシステムを外界からの攻撃にさらすことになるかもしれません。
システムのセキュリティーと整合性のチェックには、次の事から始めるべきです。
debsums
パッケージ、debsums
(1) と 「トップレベルの "Release" ファイルと信憑性」を参照
chkrootkit
パッケージ、chkrootkit
(1) 参照
clamav
パッケージ類、clamscan
(1) と
freahclam
(1) 参照
表9.21 システムセキュリティーや整合性確認のためのツールリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
logcheck *
|
V:3, I:3 | 152 | システムログの異常を管理者にメールするデーモン |
debsums *
|
V:2, I:3 | 320 | MD5 チェックサムを使ってインストールされたパッケージファイルを検証するユーティリティー |
chkrootkit *
|
V:2, I:6 | 808 | ルートキット検出ソフト |
clamav *
|
V:2, I:11 | 616 | Unix 用アンチウィルスユーティリティー - コマンドラインインターフェース |
tiger
*
|
V:0.8, I:1.0 | 3148 | システムセキュリティーの脆弱性を報告 |
tripwire *
|
V:0.6, I:0.7 | 9456 | ファイルやディレクトリーの整合性チェックソフト |
john
*
|
V:0.7, I:2 | 532 | アクティブなパスワードクラッキングツール |
aide
*
|
V:0.2, I:0.4 | 1213 | 先進的進入検出環境 - 静的ライブラリー |
bastille *
|
V:0.12, I:0.4 | 1960 | セキュリティー強化ツール |
integrit *
|
V:0.08, I:0.16 | 440 | ファイル整合性確認プログラム |
crack
*
|
V:0.03, I:0.2 | 204 | パスワード推定プログラム |
次のシンプルなスクリプトを使うと、典型的な間違いの全員書込み可のファイルパーミッションをチェックできます。
# find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)
debsums
パッケージはローカルに保存された MD5
チェックサムを使うので、悪意ある攻撃に対抗するセキュリティー監査ツールとしては完全には信頼できません。
Debian はモジュール化された Linux カーネルをサポートされるアーキテクチャに対してパッケージとしてディストリブートしています。
Linux カーネル 2.4 と比較して特記すべき Linux カーネル 2.6 の機能がいくつかあります。
ide-scsi
モジュールを使用しません。
iptable
カーネルモジュールを使います。
多くの Linux の機能はカーネル変数を使い次のように設定されます。
syscrl
(8) を用い変更されたカーネル変数
(「procfs と sysfs」参照)
modprobe
(8) の引数により設定されるモジュール変数 (「ディスクイメージファイルをマウント」参照)
linux-doc-2.6.*
パッケージで供給される Linux カーネル文書
("/usr/share/doc/linux-doc-2.6.*/Documentation/filesystems/*
")
中の "kernel-parameters.txt(.gz)
" や関連する他の文書を参照下さい。
ほとんどの普通のプログラムはカーネルヘッダーを必要としませんし、コンパイルするのにそれらを直接用いるとコンパイルがうまくいかないかもしれません。普通のプログラムは
Debian システム上では (glibc
ソースパッケージから生成される)
libc6-dev
パッケージが提供する
"/usr/include/linux
" や
"/usr/include/asm
" 中のヘッダを使ってコンパイルするべきです。
外部ソースからのカーネルモジュールやオートマウンターデーモン (amd
)
のようなカーネル固有の一部プログラムをコンパイルする場合、例えば
"-I/usr/src/linux-particular-version/include/
"
等の対応するカーネルヘッダーへのパスをコマンドラインで指定しなければいけません。module-assistant
(8)
(またはその短縮形 m-a
)
はユーザーが1つ以上のカスタムカーネルに関するモジュールパッケージを簡単にビルドとインストールすることを援助します。
Debian にはカーネルと関連モジュールをコンパイルする独自の方法があります。
表9.22 Debian システム上でカーネルの再コンパイルためにインストールする重要パッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
build-essential *
|
I:47 | 48 |
Debian パッケージをビルドする上で不可欠なパッケージ:
make 、gcc 、…
|
bzip2
*
|
V:51, I:79 | 132 | bz2 ファイルのための圧縮と解凍ユーティリティー |
libncurses5-dev *
|
V:4, I:25 | 6900 | ncurses のためのデベロッパ用ライブラリーと文書 |
git
*
|
V:5, I:17 | 10632 | git: Linux カーネルによって使われている分散型リビジョンコントロールシステム |
fakeroot *
|
V:4, I:32 | 444 | パッケージを非 root としてビルドするための fakeroot 環境を提供 |
initramfs-tools *
|
V:49, I:98 | 468 | initramfs をビルドするツール (Debian 固有) |
kernel-package *
|
V:1.5, I:14 | 2316 | Linux カーネルパッケージをビルドするツール (Debian 固有) |
module-assistant *
|
V:2, I:18 | 568 | モジュールパッケージをビルドするツール (Debian 固有) |
dkms
*
|
V:6, I:9 | 468 | 動的カーネルモジュールサポート (DKMS) (汎用) |
devscripts *
|
V:2, I:11 | 1696 | Debian パッケージメンテナ用ヘルパースクリプト (Debian 固有) |
linux-tree-2.6.*
|
N/A | N/A | Linux カーネルのソースツリーのメタパッケージ (Debian 固有) |
「2段目: ブートローダー」 中で initrd
を使う場合、initramfs-tools
(8) と
update-initramfs
(8) と mkinitramfs
(8) と
initramfs.conf
(5) 中の関連情報をしっかり読んで下さい。
Linux カーネルソースをコンパイルする時にソースツリー中のディレクトリー (例えば
"/usr/src/linux*
") から
"/usr/include/linux
" や
"/usr/include/asm
"
へのシムリンクを張ってはいけません。(古くなった一部文書はまだこれをすることを提案しています。)
Debian の stable
(安定版) システム上で最新の Linux
カーネルをコンパイルする際には、Debian のunstable
(非安定版)
システムからバックポートされた最新のツールが必要かもしれません。
動的カーネルモジュールサポート (DKMS)
は、カーネル全体を変えること無く個別カーネルモジュールをアップグレードできるようにする新しいディストリビューションに依存しない枠組みです。これに
squeeze
でのアウトオブツリーのモジュールの管理方法として承認されます。これはあなたがカーネルをアップグレードする際にモジュールを簡単に再構築できるようにします。
カスタムカーネルパッケージを作るためにカーネルソースをコンパイルする Debian の標準手法は
make-kpkg
(1) を使います。正式の文書は
"/usr/share/doc/kernel-package/README.gz
" (最後の部分)
にあります。カスタム化は kernel-pkg.conf
(5) と
kernel-img.conf
(5) を参照下さい。
amd64 システムの例を次に記します。
# aptitude install linux-tree-<version> $ cd /usr/src $ tar -xjvf linux-source-<version>.tar.bz2 $ cd linux-source-<version> $ cp /boot/config-<oldversion> .config $ make menuconfig ... $ make-kpkg clean $ fakeroot make-kpkg --append_to_version -amd64 --initrd --revision=rev.01 kernel_image modules_image $ cd .. # dpkg -i linux-image*.deb
"shutdown -r now
" としてリブートし、新しいカーネルへ移行します。
1台の機器のためだけにコンパイルされた非モジュール化したカーネルを作りたい際には、initrd を使わないので
make-kpkg
を"--initrd
"
オプション無しで実行します。"make-kpkg kernel_image
" によって
"make oldconfig
" と "make dep
"
が実行されるので、これらを別途実行する必要はありません。
カスタムカーネルパッケージのためのカスタムモジュールパッケージを生成しインストールする Debian 標準手法は
module-assistant
(8) と module
ソースパッケージを使います。例えば次のようにすると、unionfs
カーネルモジュールがビルドされ、それがインストールされます。
$ sudo aptitude install module-assistant ... $ sudo aptitude install unionfs-source unionfs-tools unionfs-utils $ sudo m-a update $ sudo m-a prepare $ sudo m-a auto-install unionfs ... $ sudo apt-get autoremove
加工されていないソースからの Linux カーネルを今でも古典的手法でビルドできます。システムの設定の詳細は手動で面倒を見る必要があります。
$ cd /usr/src $ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-<version>.tar.bz2 $ tar -xjvf linux-<version>.tar.bz2 $ cd linux-<version> $ cp /boot/config-<version> .config $ make menuconfig ... $ make dep; make bzImage $ make modules # cp ./arch/x86_64/boot/bzImage /boot/vmlinuz-<version> # make modules_install # depmod -a # update-initramfs -c -k <version>
ブートローダーは次のように設定します。
lilo
を使う場合には、"/etc/lilo.conf
"
を編集し、"/sbin/lilo
" を実行します。
grub
を使う場合には、"/boot/grub/menu.lst
"
を編集します。
"shutdown -r now
" としてリブートし、新しいカーネルへ移行します。
ほとんどのハードウエアードライバーはフリーソフトウエアーとして入手でき Debian システムの一部となっていますが、あなたのシステム上の Winmodem のような一部の non-free の外部ドライバーをロードする必要があるかもしれません。
該当リソースをチェックします。
仮想化されたシステムを利用すると単一ハード上で同時に複数のシステムのインスタンスを実行することが加能となります。
Debian には、単純な chroot ではない仮想化やエミュレーション関連のパッケージがあります。一部のパッケージはあなたがそのような環境をセットアップする事を援助します。
表9.23 仮想化ツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
schroot *
|
V:1.0, I:1.6 | 2460 | Debian バイナリーパッケージを chroot 中で実行する専用ツール |
sbuild *
|
V:0.11, I:0.3 | 428 | Debian ソースから Debian バイナリーパッケージをビルドするツール |
pbuilder *
|
V:0.5, I:2 | 1192 | Debian パッケージの個人的なパッケージビルドソフト |
debootstrap *
|
V:1.6, I:12 | 268 | 基本的な Debian システムのブートストラップ (sh で書かれている) |
cdebootstrap *
|
V:0.3, I:2 | 116 | Debian システムのブートストラップ (C で書かれている) |
rootstrap *
|
V:0.02, I:0.17 | 156 | 完全な Linux ファイルシステムイメージをビルドするツール |
virt-manager *
|
V:0.5, I:1.6 | 5908 | 仮想マシンマネージャー: 仮想マシンを管理するデスクトップアプリケーション |
libvirt-bin *
|
V:1.4, I:2 | 2240 | libvirt ライブラリー用のプログラム |
user-mode-linux *
|
V:0.07, I:0.3 | 20540 | User-mode Linux (kernel) |
bochs
*
|
V:0.05, I:0.3 | 3280 | Bochs: IA-32 PC エミュレーター |
qemu
*
|
V:0.6, I:6 | 460 | QEMU: 高速で汎用のプロセッサエミュレーター |
qemu-system *
|
V:2, I:3 | 38196 | QEMU: フルシステムエミュレーションのバイナリ |
qemu-user *
|
V:0.3, I:3 | 16716 | QEMU: ユーザーモードエミュレーションのバイナリ |
qemu-utils *
|
V:0.4, I:3 | 756 | QEMU: ユーティリティー |
qemu-kvm *
|
V:1.3, I:2 | 4308 | KVM: ハードウエア補助仮想化を利用する x86 ハードウエア上のフル仮想化 |
virtualbox-ose *
|
V:2, I:4 | 31728 | VirtualBox: i386 と amd64 上での x86 仮想化解決策 |
xen-tools *
|
V:0.2, I:1.9 | 1236 | Debian XEN 仮想サーバーの管理ツール |
wine
*
|
V:1.7, I:13 | 96 | Wine: Windows API の実装 (標準スイート) |
dosbox *
|
V:0.5, I:2 | 2460 | DOSBox: Tandy/Herc/CGA/EGA/VGA/SVGA グラフィクス、サウンド、DOS 付きの x86 エミュレーター |
dosemu *
|
V:0.2, I:1.2 | 5940 | DOSEMU: Linux 用 DOS エミュレーター |
vzctl
*
|
V:0.7, I:1.1 | 1056 | OpenVZ サーバー仮想化策 - コントロールツール |
vzquota *
|
V:0.7, I:1.2 | 204 | OpenVZ サーバー仮想化策 - クオータツール |
lxc
*
|
V:0.05, I:0.2 | 744 | Linux コンテナ - ユーザースペースツール |
異なるプラットフォーム仮想化策の詳細な比較は Wikipedia の記事 Comparison of platform virtual machines を参照下さい。
ここに記載された機能の一部は squeeze
でのみ利用可能です。
lenny
以来の Debian のデフォルトカーネルは KVM をサポートしています
仮想化のための典型的な業務フローにはいくつかの段階があります。
空のファイルシステムの作成 (ファイルツリーもしくはディスクイメージ)。
mkdir -p /path/to/chroot
" として作成できる。
dd
(1) を使って作れます (「ディスクイメージの作成」と「空のディスクイメージ作成」参照)。
qemu-img
(1) はQEMU
によりサポートされたディスクイメージの作成や変換に使えます。
mount
(8) を使ってディスクイメージをファイルシステムにマウントする (任意)。
必要なシステムデーターを用いて対象のファイルシステムを充足。
debootstrap
や cdebootstrap
のようなプログラムがこのプロセスを援助します (「Chroot システム」参照)。
仮想化環境下でプログラムを実行。
raw ディスクイメージファイルに関しては、「ディスクイメージ」を参照下さい。
他の仮想ディスクイメージに関しては、qemu-nbd
(1) を使ってネットワークブロックデバイスプロトコルを用いてそれらをエクスポートし
nbd
カーネルモジュールを使ってそれらをマウントできます。
qemu-nbd
(1) はQEMU
がサポートする次のディスクフォーマットをサポートします: raw、qcow2、qcow、vmdk、vdi、bochs、cow (user-mode
Linux の copy-on-write)、parallels、dmg、cloop、vpc、vvfat (virtual VFAT)、host_device。
ネットワークブロックデバイスはloop デバイスと同様の方法でパーティションをサポートします (「ディスクイメージファイルをマウント」参照)。"image.img
"
の最初のパーティションは次のようにするとマウントできます。
# modprobe nbd max_part=16 # qemu-nbd -v -c /dev/nbd0 disk.img ... # mkdir /mnt/part1 # mount /dev/nbd0p1 /mnt/part1
qemu-nbd
(8) に"-P 1
"
オプションを用いると、"disk.img
" の最初のパーティションだけをエクスポートできます。
chroot
(8) を使うのは、GNU/Linux
環境の異なったインスタンスをリブートすることなく単一システム上で同時に実行する最も基本的な手法です。
次の例は親システムと chroot システムが同じ CPU アーキテクチャを共有していると仮定しています。
pbuilder
(8) プログラムを script
(1)
の下で次のように実行すると chroot
(8) の設定と使い方が学べます。
$ sudo mkdir /sid-root $ sudo pbuilder --create --no-targz --debug --buildplace /sid-root
"sid-root
" の下に sid
環境のためのシステムデーターをどのようにして充足するかは debootstrap
(8) か
cdebootstrap
(1) を見ると分かります。
この debootstrap
(8) と cdebootstrap
(1)
は、Debian インストーラーが Debian
をインストールするのに使われています。これらは Debian のインストールディスクを使わず他の GNU/Linux
ディストリビューションから Debian をインストールするのにも使えます。
$ sudo pbuilder --login --no-targz --debug --buildplace /sid-root
どのようにして sid
環境下で実行されるシステムシェルが作られるかが次で観察できます。
"/etc/hosts
" と
"/etc/hostname
" と "/etc/resolv.conf
")
/proc
" ファイルシステムのマウント
/dev/pts
" ファイルシステムのマウント
/usr/sbin/policy-rc.d
" を作成
chroot /sid-root bin/bash -c 'exec -a -bash bin/bash'
"
を実行
プログラムによっては機能するために chroot の下で pbuilder
が提供するより多くの親システムのファイルへのアクセスする必要があります。例えば、"/sys
" や
"/etc/passwd
" や "/etc/group
" や
"/var/run/utmp
" や "/var/log/wtmp
" 等が
bind マウントもしくはコピーされる必要があるかもしれません。
"/usr/sbin/policy-rc.d
" ファイルは、Debian
システム上でデーモンプログラムが自動的に起動されることを防ぎます。"/usr/share/doc/sysv-rc/README.policy-rc.d.gz
"
を参照下さい。
pbuilder
という特化した chroot パッケージの本来の目的は、chroot システムを作りその
chroot
中でパッケージをビルドすることです。それはパッケージのビルド依存関係が正しいことをチェックし、不必要で間違ったビルド依存関係が出来上がったパッケージに混入しないようにする理想的なシステムです。
類似の schroot
パッケージは i386
の chroot システムを
amd64
の親システムの下で実行方法を教えてくれます。
仮想化を使って複数のデスクトップシステムを安全に実行するには、Debian
安定版 (stable
) システム上で QEMU か
VirtualBox
を使うことをお勧めします。これらを使うと通常ありがちなリスクに晒されずに Debian テスト版
(testing
) や不安定版 (unstable
)
システムのデスクトップアプリケーションを実行できるようになります。
純粋な QEMU は非常に遅いので、ホストシステムがサポートする際には KVM を使って加速することをお勧めします。
QEMU 用の Debian システムを含む仮想ディスクイメージ
"virtdisk.qcow2
" はdebian-installer: 小さな CD
を使って次のように作成できます。
$ wget http://cdimage.debian.org/debian-cd/5.0.3/amd64/iso-cd/debian-503-amd64-netinst.iso $ qemu-img create -f qcow2 virtdisk.qcow2 5G $ qemu -hda virtdisk.qcow2 -cdrom debian-503-amd64-netinst.iso -boot d -m 256 ...
更なるティップに関しては Debian wiki: QEMU を参照下さい。
VirtualBox はQt の GUI ツールとして提供され非常に直感的に理解できます。その GUI とコマンドラインツールは VirtualBox User Manual と VirtualBox User Manual (PDF) で説明されています。
バイナリーとテキストのデーターを Debian システム上で管理するツールとティップを記します。
競合状態とならないようにするために、アクティブにアクセスされているデバイスやファイルに複数プロセスから調整なく書き込みアクセスをしてはいけません。flock
(1)
を使ったファイルロック機構がこの回避に使えます。
データーのセキュリティーとそのコントロールされた共有はいくつかの側面があります。
こういったことは次の組み合わせを使うことで実現できます。
Debian システム上のアーカイブと圧縮ツールのまとめを以下に記します。
表10.1 アーカイブと圧縮ツールのリスト
パッケージ | ポプコン | サイズ | コマンド | 拡張子 | コメント |
---|---|---|---|---|---|
tar
*
|
V:61, I:99 | 2660 |
tar (1)
|
.tar
|
標準アーカイバー (デファクト標準) |
cpio
*
|
V:41, I:99 | 920 |
cpio (1)
|
.cpio
|
Unix System V スタイルのアーカイバー、find (1) とともに使用
|
binutils *
|
V:58, I:74 | 11996 |
ar (1)
|
.ar
|
静的ライブラリー生成用のアーカイバー |
fastjar *
|
V:7, I:31 | 216 |
fastjar (1)
|
.jar
|
Java 用のアーカイバー (zip 類似) |
pax
*
|
V:1.5, I:6 | 172 |
pax (1)
|
.pax
|
新規 POSIX 標準アーカイバー、tar と cpio の間の妥協点
|
afio
*
|
V:0.3, I:1.7 | 240 |
afio (1)
|
.afio
|
ファイル毎の圧縮などの拡張をされた cpio
|
gzip
*
|
V:91, I:99 | 284 |
gzip (1), zcat (1), …
|
.gz
|
GNU LZ77 圧縮ユーティリティー (デファクト標準) |
bzip2
*
|
V:51, I:79 | 132 |
bzip2 (1), bzcat (1), …
|
.bz2
|
gzip (1) より高い圧縮比 (gzip より遅い、類似シンタックス) の
Burrows-Wheeler
ブロック並び替え圧縮ユーティリティー
|
lzma
*
|
V:8, I:80 | 172 |
lzma (1)
|
.lzma
|
gzip (1) より高い圧縮比の LZMA
圧縮ユーティリティー (非推奨)
|
xz-utils *
|
V:5, I:26 | 460 |
xz (1), xzdec (1), …
|
.xz
|
bzip2 (1) より高い圧縮比の XZ 圧縮ユーティリティー
(gzip より遅いが bzip2 より早い、LZMA 圧縮ユーティリティーの代替)
|
p7zip
*
|
V:2, I:23 | 1052 |
7zr (1), p7zip (1)
|
.7z
|
高い圧縮比をもつ 7-Zip 圧縮ユーティリティー (LZMA 圧縮) |
p7zip-full *
|
V:14, I:26 | 3612 |
7z (1), 7za (1)
|
.7z
|
高い圧縮比をもつ 7-Zip 圧縮ユーティリティー (LZMA 圧縮、他) |
lzop
*
|
V:0.7, I:6 | 144 |
lzop (1)
|
.lzo
|
gzip (1) より高い圧縮と解凍の速度 (gzip
より低い圧縮比、類似シンタックス) の LZO 圧縮ユーティリティー
|
zip
*
|
V:8, I:52 | 632 |
zip (1)
|
.zip
|
InfoZIP: DOS アーカイブと圧縮ツール |
unzip
*
|
V:24, I:69 | 408 |
unzip (1)
|
.zip
|
InfoZIP: DOS アーカイブ解凍と圧縮解凍ツール |
何が起こるかを理解せずに "$TAPE
" 変数を設定してはいけません。設定すると
tar
(1) の挙動が変わります。
gzip 圧縮された tar
(1) アーカイブは ".tgz
" とか
".tar.gz
" といったファイル拡張子を使います。
xz 圧縮された tar
(1) アーカイブは ".txz
" とか
".tar.xz
" といったファイル拡張子を使います。
tar
(1) 等の FOSS
ツールでのポピュラーな圧縮方法は次のように変遷しています: gzip
→
bzip2
→ xz
cp
(1) と scp
(1) と
tar
(1)
は特殊ファイルに関して一部制約があるかもしれません。cpio
(1) と
afio
(1) は最も汎用性があります。
cpio
(1) と afio
(1)
はfind
(1)
等のコマンドとともに使うようにできていて、ファイルの選定部分のスクリプトを独立にテストできるのでバックアップスクリプトを作るのに向いています。
afio
(1) はアーカイブ中の各ファイルを圧縮できます。この事実ゆえ
afio
はtar
とか cpio
アーカイブ全体を圧縮するよりファイルの破損に対してずっと安全となり、バックアップスクリプトにとって最良のアーカイブエンジンとなっています。
OpenOffice データーファイルの内部データー構造は ".jar
" ファイルです。
Debian システム上の単純なコピーとバックアップツールのまとめを以下に記します。
表10.2 コピーと同期ツールのリスト
パッケージ | ポプコン | サイズ | ツール | 機能 |
---|---|---|---|---|
coreutils *
|
V:92, I:99 | 13828 | GNU cp | ファイルやディレクトリーのローカルコピー ("-a" で再帰的実行) |
openssh-client *
|
V:52, I:99 | 2104 | scp |
ファイルやディレクトリーのリモートコピー (クライアント、"-r " で再帰実行)
|
openssh-server *
|
V:70, I:83 | 700 | sshd | ファイルやディレクトリーのリモートコピー (リモートサーバー) |
rsync
*
|
V:19, I:52 | 704 | - | 単方向リモート同期とバックアップ |
unison *
|
V:0.9, I:3 | 1816 | - | 双方向リモート同期とバックアップ |
rsync
(8) を使ってのファイルのコピーには他の方法より豊かな機能があります。
tar
(1) 類似の "--exclude
" や
"--exclude-from
" オプション
「データーバックアップ用コピースクリプト」 に記された
bkup
スクリプトを "-gl
" オプションとともに
cron
(8) の下で実行すると静的なデーターアーカイブに関して Plan9 の
dumpfs
と非常に似た機能を実現できます。
表10.16「バージョンコントロールシステムツールのリスト」に記されたバージョンコントロールシステム (VCS) ツールは多方向のコピーと同期のツールとして機能します。
"./source
"
ディレクトリー中の全内容を異なるツールを用いてアーカイブしアーカイブ解凍するいくつかの方法を以下に記します。
GNU tar
(1):
$ tar cvzf archive.tar.gz ./source $ tar xvzf archive.tar.gz
cpio
(1):
$ find ./source -xdev -print0 | cpio -ov --null > archive.cpio; gzip archive.cpio $ zcat archive.cpio.gz | cpio -i
afio
(1):
$ find ./source -xdev -print0 | afio -ovZ0 archive.afio $ afio -ivZ archive.afio
"./source
" ディレクトリー中の全内容を異なるツールを用いてコピーするいくつかの方法を以下に記します。
./source
" ディレクトリー → "/dest
"
ディレクトリー
./source
" ディレクトリー →
"user@host.dom
" ホストの "/dest
" ディレクトリー
rsync
(8):
# cd ./source; rsync -av . /dest # cd ./source; rsync -av . user@host.dom:/dest
「転送元ディレクトリ後スラシュ付加」文法を上記の代わりに使えます。
# rsync -av ./source/ /dest # rsync -av ./source/ user@host.dom:/dest
GNU cp
(1) と openSSH scp
(1):
# cd ./source; cp -a . /dest # cd ./source; scp -pr . user@host.dom:/dest
GNU tar
(1):
# (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - ) # (cd ./source && tar cf - . ) | ssh user@host.dom '(cd /dest && tar xvfp - )'
cpio
(1):
# cd ./source; find . -print0 | cpio -pvdm --null --sparse /dest
afio
(1):
# cd ./source; find . -print0 | afio -pv0a /dest
".
" を含むすべての例で ".
"
は"foo
" で代替でき、ファイルを "./source/foo
"
ディレクトリから "/dest/foo
" ディレクトリにコピーできます。
".
" を含むすべての例で ".
" を絶対パスの
"/path/to/source/foo
" で代替でき、"cd
./source;
" を削除することができます。これらは使うツール次第で異なる場所にファイルをコピーします。
/dest/foo
": rsync
(8)、GNU
cp
(1)、scp
(1)
/dest/path/to/source/foo
": GNU
tar
(1)、cpio
(1)、afio
(1)
rsync
(8) や GNU cp
(1)
には転送先のファイルが新しい場合にスキップする "-u
" オプションがあります。
アーカイブやコピーコマンド (「アーカイブの慣用句」と「コピーの慣用句」参照) のためや xargs
(1) (「ファイルに関してループしながらコマンドを反復実行」参照) のためにファイルを選択するのに
find
(1) が使われます。これの操作は find
(1)
のコマンド引数を使うことで強化できます。
find
(1) の基本シンタックスは次のようにまとめられます。
-o
"
で指定) は、"論理 AND" (条件間に
"-a
" または何もなしで指定) より低い優先順位です。
!
"
で指定) は、"論理 AND" より高い優先順位です。
-prune
" は常に論理真 (TRUE)
を返し、ディレクトリーの場合にはこの点以降のファイル探索を停止します。
-name
" はシェルのグロブ (「シェルグロブ」参照)
を使ってファイル名のベースにマッチし、さらに "*
" and "?
"
等のメタ文字で最初の ".
" ともマッチします。(新規の POSIX 機能)
-regex
" はデフォールトでは emacs スタイルの BRE (「正規表現」参照)
を用いてフルパスをマッチします。
-size
" はファイルサイズ ("+
"
が前に付いた値はより大きい、"-
" が前に付いた値はより小さい) に基づいてファイルをマッチします。
-newer
" はその引数に指定されたファイルより新しいファイルとマッチします。
-print0
" は常に論理真
(TRUE) を返し、フルファイル名を (null
終端処理して) 標準出力へプリントします。
find
(1) はしばしば慣用的なスタイルで使われます。
# find /path/to \ -xdev -regextype posix-extended \ -type f -regex ".*\.afio|.*~" -prune -o \ -type d -regex ".*/\.git" -prune -o \ -type f -size +99M -prune -o \ -type f -newer /path/to/timestamp -print0
これは次のアクションをすることを意味します。
/path/to
" からはじまる全ファイルを探索
.*\.afio
" か ".*~
"
にマッチするファイルを処理停止をすることで探索から除外
.*/\.git
" にマッチするディレクトリーを処理停止をすることで探索から除外
/path/to/timestamp
" より新しいファイル名をプリントします
上記例中でファイルを検索から除外するときの "-prune -o
" の慣用的な使い方に注目して下さい。
非 Debian のUnix 的システムでは、一部のオプションは
find
(1) によってサポートされていないかもしれません。そのような場合には、マッチング方法を調整したり
"-print0
" を"-print
"
で置き換えることを考慮します。これに関連するコマンドも調整する必要があるかもしれません。
コンピューターはいつか壊れるとか、人間によるエラーがシステムやデーターをへの損害を及ぼすことは皆知っています。バックアップと復元の操作は正しいシステム管理の必須構成要素です。考えうる全ての故障モードはいつかの日にやって来ます。
バックアップのシステムは簡単にしておき、システムのバックアップは頻繁にします。バックアップデーターが存在することは、あなたのバックアップ方法が技術的に如何に良いかよりも重要です。
実際のバックアップと復元の方針を決める上で3つの要素があります。
何をバックアップし復元するかを知っていること
~/
" 中のデーター
/var/
"
("/var/cache/
" と "/var/run/
" と
"/var/tmp/
" は除外) 中のデーター
/etc/
" 中のデーター
/usr/local/
" とか "/opt/
"
中のデーター
バックアップと復元の方法を知っていること
関わっているリスクと費用の評価
データーのセキュアーなストレージとして、好ましくはファイルシステム破壊に耐えるように異なるディスクや機器上に、少なくとも異なるディスクパーティション上に、データーはあるべきです。重要データーは上書き事故を防ぐために CD/DVD-R のような1回書込みメディアに貯蔵するのが好ましいです。(シェルコマンドラインからストレージメディアにどうして書き込むかについては「バイナリーデーター」を参照下さい。GNOME デスクトップの GUI 環境ではメニュー: "Places→CD/DVD Creator" で簡単に書込みできます。)
データーをバックアップする際には MTA (「メールトランスポートエージェント (MTA)」参照) 等のアプリケーションデーモンを停止するのも一計です。
"/etc/ssh/ssh_host_dsa_key
" や
"/etc/ssh/ssh_host_rsa_key
" や
"~/.gnupg/*
" や "~/.ssh/*
" や
"/etc/passwd
" や "/etc/shadow
" や
"/etc/fetchmailrc
" や
"popularity-contest.conf
" や
"/etc/ppp/pap-secrets
" や
"/etc/exim4/passwd.client
"
等のアイデンティティ関連のデーターファイルのバックアップと修復には特に注意が必要です。これらのデーターの一部はシステムに同様な入力をしても再生成できません。
ユーザープロセスで cron ジョブを実行している際には、"/var/spool/cron/crontabs
"
ディレクトリー中のファイルを回復し cron
(8)
を再スタートしなければいけません。cron
(8) と crontab
(1)
に関しては「タスク定期実行のスケジュール」を参照下さい。
Debian システム上の目に止まったバックアップユーティリティーのスイートから選んだリストを記します。
表10.3 バックアップスイートのユーティリティーのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
rdiff-backup *
|
V:1.4, I:3 | 804 | (リモート) 増分バックアップ |
dump
*
|
V:0.4, I:1.5 | 716 |
ext2/ext3 ファイルシステム用の
4.4 BSD 由来の dump (8) と
restore (8)
|
xfsdump *
|
V:0.3, I:1.9 | 628 |
GNU/Linux と IRIX 上の XFS ファイルシステム用の xfsdump (8) と
xfsrestore (8) を使う dump と restore
|
backupninja *
|
V:0.5, I:0.6 | 452 | 軽量で拡張可のメタバックアップシステム |
mondo
*
|
V:0.11, I:0.5 | 1168 | Mondo Rescue: 災害復元バックアップスイート |
sbackup *
|
V:0.05, I:0.16 | 488 | GNOME デスクトップ用の簡単なバックアップのスイート |
keep
*
|
V:0.13, I:0.3 | 1232 | KDE 用のバックアップシステム |
bacula-common *
|
V:1.3, I:2 | 1404 | Bacula: ネットワークバックアップ、復元および検証 - 共通のサポートファイル |
bacula-client *
|
I:0.9 | 84 | Bacula: ネットワークバックアップ、復元および検証 - クライアントメタパッケージ |
bacula-console *
|
V:0.3, I:1.2 | 184 | Bacula: ネットワークバックアップ、復元および検証 - テキストコンソール |
bacula-server *
|
I:0.5 | 84 | Bacula: ネットワークバックアップ、復元および検証 - サーバーメタパッケージ |
amanda-common *
|
V:0.4, I:0.8 | 6924 | Amanda: Advanced Maryland Automatic Network Disk Archiver (ライブラリー) |
amanda-client *
|
V:0.4, I:0.8 | 748 | Amanda: Advanced Maryland Automatic Network Disk Archiver (クライアント) |
amanda-server *
|
V:0.11, I:0.3 | 916 | Amanda: Advanced Maryland Automatic Network Disk Archiver (サーバー) |
backuppc *
|
V:0.8, I:1.0 | 2460 | BackupPC は高性能でエンタープライズ級の、PC をバックアップするためのシステム (ディスクベース) |
backup-manager *
|
V:0.4, I:0.6 | 672 | コマンドラインのバックアップツール |
backup2l *
|
V:0.2, I:0.3 | 152 | マウントできるメディアのための低メンテナンスのバックアップ/復旧ツール (ディスクベース) |
バックアップツールにはそれぞれの特別な狙いがあります。
sbackup
や keep
パッケージは、デスクトップユーザーがユーザーデーターの定期的バックアップをする簡単な GUI のフロントエンドを提供します。同様の機能は簡単なスクリプト
(「システムバックアップ用スクリプトの例」) と
cron
(8) で実現できます。
「アーカイブと圧縮ツール」や「コピーと同期ツール」に記された基本的なツールを使うとカスタムスクリプト経由のシステムバックアップができます。そのようなスクリプトは次を使うと強化できます。
rdiff-backup
パッケージは (リモートの) 増分バックアップを可能にします。
dump
パッケージは全ファイルシステムの効率的かつ増分のバックアップと復旧を補助します。
dump
パッケージに関して学ぶには、"/usr/share/doc/dump/
" の中のファイルと "Is dump really deprecated?" を参照下さい。
個人の Debian の unstable
(非安定)
スイートを実行するデスクトップシステムでは、個人的だったりクリティカルなデーターのみを保護する必要しかありません。いずれにせよ1年に1回はシステムを再インストールします。だから全システムをバックアップする理由もありませんし、フル機能のバックアップユーティリティーをインストールする理由もありません。
簡単なスクリプトでバックアップ用アーカイブを作成し、GUI を使って CD/DVD にそれを焼きます。次のこのスクリプトの例を示します。
#!/bin/sh -e # Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain BUUID=1000; USER=osamu # UID and name of a user who accesses backup files BUDIR="/var/backups" XDIR0=".+/Mail|.+/Desktop" XDIR1=".+/\.thumbnails|.+/\.?Trash|.+/\.?[cC]ache|.+/\.gvfs|.+/sessions" XDIR2=".+/CVS|.+/\.git|.+/\.svn|.+/Downloads|.+/Archive|.+/Checkout|.+/tmp" XSFX=".+\.iso|.+\.tgz|.+\.tar\.gz|.+\.tar\.bz2|.+\.afio|.+\.tmp|.+\.swp|.+~" SIZE="+99M" DATE=$(date --utc +"%Y%m%d-%H%M") [ -d "$BUDIR" ] || mkdir -p "BUDIR" umask 077 dpkg --get-selections \* > /var/lib/dpkg/dpkg-selections.list debconf-get-selections > /var/cache/debconf/debconf-selections { find /etc /usr/local /opt /var/lib/dpkg/dpkg-selections.list \ /var/cache/debconf/debconf-selections -xdev -print0 find /home/$USER /root -xdev -regextype posix-extended \ -type d -regex "$XDIR0|$XDIR1" -prune -o -type f -regex "$XSFX" -prune -o \ -type f -size "$SIZE" -prune -o -print0 find /home/$USER/Mail/Inbox /home/$USER/Mail/Outbox -print0 find /home/$USER/Desktop -xdev -regextype posix-extended \ -type d -regex "$XDIR2" -prune -o -type f -regex "$XSFX" -prune -o \ -type f -size "$SIZE" -prune -o -print0 } | cpio -ov --null -O $BUDIR/BU$DATE.cpio chown $BUUID $BUDIR/BU$DATE.cpio touch $BUDIR/backup.stamp
root から実行されるスクリプト断片の例と言う位置づけです。
著者はこれをあなたが次のように変更し実行する事を期待します。
find … -print0
" を、"find … -newer
$BUDIR/backup.stamp -print0
" で置き換えます。
scp
(1) か rsync
(1)
を使ってリモートホストにバックアップファイルを転送したり、それらを更なるデーターセキュリティーのために CD/DVD に焼きます。(私は CD/DVD
に焼くのに GNOME デスクトップの GUI を使っています。更なる冗長性に関しては「zenity を使うシェルスクリプト例」を参照下さい。)
簡潔にしましょう!
debconf の設定データーは "debconf-set-selections
debconf-selections
" で、dpkg の選択データーは "dpkg --set-selection
<dpkg-selections.list
" で復元できます。
ディレクトリーツリーの下のデーターセットは、"cp -a
" としてコピーすると通常のバックアップができます。
"/var/cache/apt/packages/
"
ディレクトリーの下のデーターのようなディレクトリーの下の大きな上書きされない静的なデーターセットは、"cp
-al
" を利用するハードリンクを使うと通常のバックアップに代わるディスク空間を効率的に利用するバックアップができます。
私が bkup
と名付けたデーターバックアップのためのコピースクリプトを次に示します。このスクリプトは現ディレクトリーの下の全ての (非 VCS)
ファイルを親ディレクトリーかリモートホストの日付入りディレクトリーにコピーします。
#!/bin/sh -e # Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain fdot(){ find . -type d \( -iname ".?*" -o -iname "CVS" \) -prune -o -print0;} fall(){ find . -print0;} mkdircd(){ mkdir -p "$1";chmod 700 "$1";cd "$1">/dev/null;} FIND="fdot";OPT="-a";MODE="CPIOP";HOST="localhost";EXTP="$(hostname -f)" BKUP="$(basename $(pwd)).bkup";TIME="$(date +%Y%m%d-%H%M%S)";BU="$BKUP/$TIME" while getopts gcCsStrlLaAxe:h:T f; do case $f in g) MODE="GNUCP";; # cp (GNU) c) MODE="CPIOP";; # cpio -p C) MODE="CPIOI";; # cpio -i s) MODE="CPIOSSH";; # cpio/ssh S) MODE="AFIOSSH";; # afio/ssh t) MODE="TARSSH";; # tar/ssh r) MODE="RSYNCSSH";; # rsync/ssh l) OPT="-alv";; # hardlink (GNU cp) L) OPT="-av";; # copy (GNU cp) a) FIND="fall";; # find all A) FIND="fdot";; # find non CVS/ .???/ x) set -x;; # trace e) EXTP="${OPTARG}";; # hostname -f h) HOST="${OPTARG}";; # user@remotehost.example.com T) MODE="TEST";; # test find mode \?) echo "use -x for trace." esac; done shift $(expr $OPTIND - 1) if [ $# -gt 0 ]; then for x in $@; do cp $OPT $x $x.$TIME; done elif [ $MODE = GNUCP ]; then mkdir -p "../$BU";chmod 700 "../$BU";cp $OPT . "../$BU/" elif [ $MODE = CPIOP ]; then mkdir -p "../$BU";chmod 700 "../$BU" $FIND|cpio --null --sparse -pvd ../$BU elif [ $MODE = CPIOI ]; then $FIND|cpio -ov --null | ( mkdircd "../$BU"&&cpio -i ) elif [ $MODE = CPIOSSH ]; then $FIND|cpio -ov --null|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&&cpio -i )" elif [ $MODE = AFIOSSH ]; then $FIND|afio -ov -0 -|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&&afio -i - )" elif [ $MODE = TARSSH ]; then (tar cvf - . )|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&& tar xvfp - )" elif [ $MODE = RSYNCSSH ]; then rsync -rlpt ./ "${HOST}:${EXTP}-${BKUP}-${TIME}" else echo "Any other idea to backup?" $FIND |xargs -0 -n 1 echo fi
これはコマンド例の位置付けです。スクリプトを読んで自分自身で編集してからご使用下さい。
私はこの bkup
を私の "/usr/local/bin/
"
ディレクトリーに置いています。わたしは一時的スナップショットのバックアップが必要な時に、作業ディレクトリー中で引数無しにこの
bkup
コマンドを実行します。
ソースファイルツリーや設定ファイルツリーのスナップショットの履歴を作成するには、git
(7)
を使うのが簡単でスペースの効率も良ろしいです (「設定履歴記録のための Git」参照)。
リムーバブルストレージデバイスは次の何れも指します。
このようなリムーバブルストレージは、gnome-mount
(1) を使い GNOME
等の現代的なデスクトップ環境では自動的にユーザーとしてマウントできます。
GNOME の下のマウント点は次のようにしてカスタマイズ可能な
"/media/<disk_label>
" と選ばれます。
mlabel
(1) を使います。
genisoimage
(1)
を"-V
" オプションとともに使います。
tune2fs
(1) を"-L
"
オプションとともに使います。
"/etc/fstab
"
にリムーバブルメディアデバイスの記載が無い時のみ、現代的なデスクトップ環境下での自動マウントは起こります。
間違ったマウントオプションにより問題が発生した時には、gconf-editor
(1) を使って
"/system/storage/
" の下の対応する設定を消去します。
表10.4 "/etc/fstab
"
エントリーにマッチが無いリムーバブルデバイスをノーマルユーザーにマウントする事を許すパッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
gnome-mount *
|
V:15, I:28 | NOT_FOUND | ストレージデバイスを (アン)マウントやイジェクトするためのラッパー (GNOME が使用) |
pmount *
|
V:4, I:19 | 548 | ノーマルユーザーとしてリムーバブルデバイスをマウントする (KDE が使用) |
cryptmount *
|
V:0.2, I:0.5 | 360 | 暗号化されたファイルシステムの管理とユーザーモードでのマウント |
usbmount *
|
V:0.4, I:1.4 | 112 | USB ストレージデバイスを自動的にマウントやアンマウント |
リムーバブルストレージデバイスを使ってデーターを共有する際には、両方のシステムにサポートされた共通のファイルシステムでそれをフォーマットするべきです。ファイルシステム選択のリストを次に示します。
表10.5 典型的な使用シナリオに合わせたリムーバブルストレージデバイスのファイルシステムの選択肢のリスト
ファイルシステム | 典型的使用シナリオの説明 |
---|---|
FAT12 | フロッピーディスク上のクロスプラットフォームのデーター共有 (<32MiB) |
FAT16 | 小さなハードディスク類似のデバイス上のクロスプラットフォームのデーター共有 (<2GiB) |
FAT32 | 大きなハードディスク類似のデバイス上のクロスプラットフォームのデーター共有 (<8TiB, MS Windows95 OSR2 以降でサポート有り) |
NTFS | 大きなハードディスク類似のデバイス上のクロスプラットフォームのデーター共有 (MS Windows NT 以降でネイティブにサポート、Linux 上では FUSE 経由の NTFS-3G でサポート) |
ISO9660 | CD-R and DVD+/-R 上の静的データーのクロスプラットフォームの共有 |
UDF | CD-R や DVD+/-R 上への増分データーの書込み (新規) |
MINIX ファイルシステム | フロッピーディスク上へのスペース効率の良い unix ファイルデーターのストレージ |
ext2 ファイルシステム | 古い Linux システムとハードディスク類似デバイス上のデーターを共有 |
ext3 ファイルシステム | 現行の Linux システムとハードディスク類似デバイス上のデーターを共有 (ジャーナリングファイルシステム) |
デバイスレベルの暗号化を使ったクロスプラットフォームのデーター共有に関しては、「dm-crypt/LUKS を使ったリムーバブルディスクの暗号化」を参照下さい。
FAT ファイルシステムはほとんど全ての現代的なオペレーティングシステムでサポートされていて、ハードディスク類似のメディア経由でのデーター交換目的に非常に有用です。
クロスプラットフォームの FAT ファイルシステムを使ったデーター共有にリムーバブルハードディスク類似デバイスをフォーマットする時の安全な選択肢は次です。
fdisk
(8) か cfdisk
(8) か
parted
(8) (「ディスクパーティション設定」参照)
を使ってそれを単一のプライマリパーティションにパーティションしそれを次のようにマークします。
第1パーティションを mkfs.vfat
(8) を使って次のようにフォーマットします。
/dev/sda1
" 等とそのデバイス名だけを使います
-F 32 /dev/sda1
" 等と明示的なオプション指定とそのデバイス名を使います
FAT とか ISO9660 ファイルシステムを使ってデーターを共有する際の安全への配慮を次に記します。
tar
(1) や cpio
(1) や
afio
(1)
を使ってアーカイブファイルに最初にファイルをアーカイブすることで長いファイル名やシンボリックリンクやオリジナルの Unix
ファイルパーミッションとオーナー情報を保持します。
split
(1) コマンドを使ってアーカイブファイルを 2GiB
以下の塊に分割してファイルサイズの制約から保護します。
FAT ファイルシステムはその設計上最大ファイルサイズは (2^32 - 1) bytes = (4GiB - 1
byte)
です。古い 32 ビット OS 上の一部アプリケーションは、最大ファイルサイズはさらに小さく
(2^31 - 1) bytes = (2GiB - 1 byte)
です。Debian
は後者の問題に苦しむことはありません。
Microsoft 自身も 200MB を越すドライブやパーティションに FAT を使うことを勧めていません。マイクロソフトは、彼らの "Overview of FAT, HPFS, and NTFS File Systems" で非効率的なディスク領域の使用等の欠点をハイライトしています。もちろん私たちは Linux では通常 ext3 ファイルシステムを使うべきです。
ファイルシステムとファイルシステムのアクセスに関しての詳細は、"Filesystems HOWTO" を参照下さい。
データーをネットワーク経由で他のシステムと共有するときには、共通のサービスを使うべきです。次に一部のヒントを記します。
表10.6 典型的使用シナリオの場合のネットワークサービスの選択のリスト
ネットワークサービス | 典型的使用シナリオの説明 |
---|---|
Samba を使う SMB/CIFS ネットワーク経由マウントファイルシステム |
"Microsoft Windows Network" 経由でのファイル共有、smb.conf (5) と
The Official Samba 3.2.x
HOWTO and Reference Guide か samba-doc パッケージ参照
|
Linux カーネルを使う NFS ネットワークマウントファイルシステム |
"Unix/Linux Network" 経由のファイル共有、exports (5) と Linux NFS-HOWTO 参照。
|
HTTP サービス | ウェッブサーバー/クライアント間のファイル共有 |
HTTPS サービス | 暗号化されたセキュアーソケットレイヤー (SSL) もしくは Transport Layer Security (TLS) を使ったウェッブサーバー/クライアント間のファイル共有 |
FTP サービス | FTP サーバー/クライアント間のファイル共有 |
このようなネットワーク経由でマウントされたファイルシステムやネットワーク経由のファイル転送法はデーター共有のために非常に便利ですが、インセキュアーかもしれませんこれらのネットワーク接続は次に記すようにしてセキュアーにされなければいけません。
重要なデーターアーカイブのためのコンピューターデーターストレージメディアを選ぶ時にはそれらの限界について注意を払うべきです。小さな個人的なバックアップのためには、著者としては名前が知られている会社の CD-R と DVD-R を使い、クールで日陰の乾燥した埃の無い環境に保存しています。(プロ用途ではテープアーカイブメディアに人気があるようです。)
耐火金庫は紙の文書のためのものです。ほとんどのコンピューターデーターストレージメディアは紙よりも耐熱性がありません。著者は通常複数の安全な場所に保管された複数のセキュアーな暗号化されたコピーに頼っています。
ネット上に散見するアーカイブメディアの楽観的なストレージ寿命 (ほとんどベンダー情報由来)。
これらは取扱いによる機械的故障等は考慮していません。
ネット上に散見するアーカイブメディアの楽観的な書込み回数 (ほとんどベンダー情報由来)。
ここにあるストレージ寿命や書込み回数の数字はクリチカルなデーターストレージに関する決定に使うべきではありません。製造者によって提供される特定の製品情報を参照下さい。
CD/DVD-R や紙は1回しか書けないので、本質的に重ね書きで間違ってデーターを消すことを防げます。これは、利点です!
もし高速で頻繁な大量のデーターのバックアップをする必要がある場合、高速のネットワーク接続でつながっているリモートホスト上のハードディスクが唯一の現実的なオプションかもしれません。
次に、ディスクイメージの操作を論じます。「データー保存のティップ」も参照下さい。
例えば2番目の SCSI ドライブ "/dev/sdb
"
というアンマウントされたドライブのディスクイメージファイル "disk.img
"
はcp
(1) か dd
(1) を用いれば次のようにして作れます。
# cp /dev/sdb disk.img # dd if=/dev/sdb of=disk.img
プライマリ IDE ディスクの最初のセクターにある伝統的 PC のマスターブートレコード (MBR) (「ディスクパーティション設定」参照)
のディスクイメージは、dd
(1) を用いれば次のようにして作れます。
# dd if=/dev/hda of=mbr.img bs=512 count=1 # dd if=/dev/hda of=mbr-nopart.img bs=446 count=1 # dd if=/dev/hda of=mbr-part.img skip=446 bs=1 count=66
mbr.img
": パーティションテーブル付きの MBR
mbr-nopart.img
": パーティションテーブル抜きの MBR。
part.img
": MBR のパーティションテーブルのみ。
ブートディスクとして SCSI ドライブ (最近のシリアル ATA ドライブを含む)
が使われている場合、"/dev/hda
" を"/dev/sda
"
に置き換えて下さい。
オリジナルディスクのパーティションのイメージを作る場合には、"/dev/hda
"
を"/dev/hda1
" 等で置き換えます。
ディスクイメージファイル "disk.img
" はdd
(1)
を使ってサイズがマッチする例えば "/dev/sdb
" という2番目の SCSI
ドライブに次のようにして書き込むことができます。
# dd if=disk.img of=/dev/sdb
同様にディスクパーティションイメージファイル "partition.img
" はサイズがマッチする例えば
"/dev/sdb1
" という2番目の SCSI
ドライブの1番目のパーティションに次のようにして書き込むことができます。
# dd if=partition.img of=/dev/sdb1
単一パーティションイメージを含むディスクイメージ "partition.img
" は次のように loop デバイスを使いマウントしアンマウントできます。
# losetup -v -f partition.img Loop device is /dev/loop0 # mkdir -p /mnt/loop0 # mount -t auto /dev/loop0 /mnt/loop0 ...hack...hack...hack # umount /dev/loop0 # losetup -d /dev/loop0
これは以下のように簡略化出来ます。
# mkdir -p /mnt/loop0 # mount -t auto -o loop partition.img /mnt/loop0 ...hack...hack...hack # umount partition.img
複数のパーティションを含むディスクイメージ "disk.img
" の各パーティションは loop デバイスを使ってマウント出来ます。loop
デバイスはパーティションをデフォルトでは管理しないので、次のようにそれをリセットする必要があります。
# modinfo -p loop # verify kernel capability max_part:Maximum number of partitions per loop device max_loop:Maximum number of loop devices # losetup -a # verify nothing using the loop device # rmmod loop # modprobe loop max_part=16
これで、loop デバイスは16パーティションまで管理出来ます。
# losetup -v -f disk.img Loop device is /dev/loop0 # fdisk -l /dev/loop0 Disk /dev/loop0: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x452b6464 Device Boot Start End Blocks Id System /dev/loop0p1 1 600 4819468+ 83 Linux /dev/loop0p2 601 652 417690 83 Linux # mkdir -p /mnt/loop0p1 # mount -t ext3 /dev/loop0p1 /mnt/loop0p1 # mkdir -p /mnt/loop0p2 # mount -t ext3 /dev/loop0p2 /mnt/loop0p2 ...hack...hack...hack # umount /dev/loop0p1 # umount /dev/loop0p2 # losetup -d /dev/loop0
この他、同様の効果は kpartx
パッケージの kpartx
(8)
により作られるデバイスマッパーデバイスを用いて次のようにして実現も出来ます。
# kpartx -a -v disk.img ... # mkdir -p /mnt/loop0p2 # mount -t ext3 /dev/mapper/loop0p2 /mnt/loop0p2 ... ...hack...hack...hack # umount /dev/mapper/loop0p2 ... # kpartx -d /mnt/loop0
ディスクイメージファイル "disk.img
" は消去済みのファイルを綺麗に無くした綺麗なスパースイメージ
"new.img
" に次のようにしてできます。
# mkdir old; mkdir new # mount -t auto -o loop disk.img old # dd bs=1 count=0 if=/dev/zero of=new.img seek=5G # mount -t auto -o loop new.img new # cd old # cp -a --sparse=always ./ ../new/ # cd .. # umount new.img # umount disk.img
もし "disk.img
" が ext2 か ext3
の場合には、zerofree
パッケージの zerofree
(8)
を使うことも出来ます。
# losetup -f -v disk.img Loop device is /dev/loop3 # zerofree /dev/loop3 # cp --sparse=always disk.img new.img
5GiB まで成長可能な空のディスクイメージファイル "disk.img
"
はdd
(1) と mke2fs
(8) を使って次のようにして作成できます。
$ dd bs=1 count=0 if=/dev/zero of=disk.img seek=5G
loop デバイスを使ってこのディスクイメージ
"disk.img
" 上に ext3 ファイルシステムを作成できます。
# losetup -f -v disk.img Loop device is /dev/loop1 # mkfs.ext3 /dev/loop1 ...hack...hack...hack # losetup -d /dev/loop1 $ du --apparent-size -h disk.img 5.0G disk.img $ du -h disk.img 83M disk.img
"sparse
" に関して、そのファイルサイズは 5.0GiB でその実ディスク使用はたったの 83MiB
です。この相違は ext2fs がスパースファイルを保持できるから可能となっています。
スパースファイルによる実際のディスク使用はそこに書かれるデーターとともに成長します。
「ディスクイメージファイルをマウント」にあるように loop デバイスまたはデバイスマッパーデバイスによりデバイスに同様の操作をすることで、このディスクイメージ
"disk.img
" をparted
(8) または
fdisk
(8) を使ってパーティションし mkfs.ext3
(8) や
mkswap
(8) 等を使ってファイルシステムを作れます。
"source_directory
" のソースディレクトリーツリーから作られる ISO9660 イメージファイル"cd.iso
" はcdrkit が提供する genisoimage
(1)
を使って次のようにして作成できます。
# genisoimage -r -J -T -V volume_id -o cd.iso source_directory
同様に、ブート可能な ISO9660 イメージファイル "cdboot.iso
"
は、debian-installer
のような
"source_directory
" にあるディレクトリーツリーから次のようにして作成できます。
# genisoimage -r -o cdboot.iso -V volume_id \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table source_directory
上記では、Isolinux ブートローダー (「2段目: ブートローダー」参照) がブートに使われています。
次のようにすると CD-ROM デバイスから直接 md5sum 値を計算し ISO9660 イメージを作成できます。
$ isoinfo -d -i /dev/cdrom CD-ROM is in ISO 9660 format ... Logical block size is: 2048 Volume size is: 23150592 ... # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso
正しい結果を得るために上記のように Linux の ISO9660 ファイルシステム先読みバグを注意深く避けなければいけません。
DVD は、cdrkit が提供する wodim
(1)
にとっては単に大きな CD です。
使えるデバイスは次のようにするとみつかります。
# wodim --devices
そしてブランクの CD-R をドライブに挿入して、例えば "/dev/hda
" というこのデバイスに
ISO9660 イメージファイル "cd.iso
" にwodim
(1)
を使って次のようにして書込みます。
# wodim -v -eject dev=/dev/hda cd.iso
もし CD-R ではなく CD-RW が使われている場合には、次を代わりに実行して下さい。
# wodim -v -eject blank=fast dev=/dev/hda cd.iso
もしあなたのデスクトップシステムが CD を自動的にマウントする場合、wodim
(1) を使う前に
"sudo unmount /dev/hda
" として CD をアンマウントします。
もし "cd.iso
" の内容が ISO9660 イメージの場合、次のようにするとそれを
"/cdrom
" に手動でマウントできます。
# mount -t iso9660 -o ro,loop cd.iso /cdrom
現代的なデスクトップシステムではリムーバブルメディアを自動的にマウントします (「リムーバブルストレージデバイス」参照)。
次に、ストレージメディア上のバイナリーデーターを直接操作することを論じます。「データー保存のティップ」も参照下さい。
もっとも基本的なバイナリーファイルを閲覧方法は "od -t x1
" コマンドを使うことです。
表10.7 バイナリーデーターを閲覧や編集するパッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
coreutils *
|
V:92, I:99 | 13828 |
ファイルをダンプする od (1) がある基本パッケージ (HEX, ASCII, OCTAL, …)
|
bsdmainutils *
|
V:81, I:99 | 768 |
ファイルをダンプする hd (1) があるユーティリティーパッケージ (HEX, ASCII, OCTAL, …)
|
hexedit *
|
V:0.3, I:1.9 | 108 | バイナリーエディターとビューワー (HEX, ASCII) |
bless
*
|
V:0.08, I:0.3 | 1232 | フル機能の16進エディター (GNOME) |
okteta *
|
V:0.4, I:3 | 2528 | フル機能の16進エディター (KDE4) |
ncurses-hexedit *
|
V:0.07, I:0.5 | 192 | バイナリーエディターとビューワー (HEX, ASCII, EBCDIC) |
lde
*
|
V:0.04, I:0.3 | 992 | Linux ディスクエディター |
beav
*
|
V:0.03, I:0.3 | 164 | バイナリーエディターとビューワー (HEX, ASCII, EBCDIC, OCTAL, …) |
hex
*
|
V:0.01, I:0.09 | 84 | 16進ダンプツール (日本語2バイトコードをサポート) |
HEX は底が16の16進フォーマットです。OCTAL は底が8の8進フォーマットです。ASCII (アスキー) は情報交換用アメリカ標準コードで、通常の英文テキストです。EBCDIC (エビシディック) は IBM メインフレームオペレーティングシステム上で使われる拡張二進化十進数互換コードです。
Linux カーネルが提供するソフトウエアー RAID システムは高いレベルのストレージ信頼性を達成するためにカーネルのファイルシステムのレベルでデーターの冗長性を提供します。
アプリケーションプログラムレベルでストレージの高い信頼性を達成するようにデーター冗長性を付加するツールもあります。
表10.9 ファイルにデーターの冗長性を追加するツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
par2
*
|
V:0.5, I:1.7 | 272 | ファイルのチェックと修理のためのパリティーアーカイブセット |
dvdisaster *
|
V:0.14, I:0.7 | 1388 | CD/DVD メディアのデーターロス/傷つき/老化の防止 |
dvbackup *
|
V:0.01, I:0.09 | 544 |
MiniDV カメラレコーダを使うバックアップツール (rsbep (1) を提供)
|
vdmfec *
|
V:0.00, I:0.02 | 88 | 前方エラー修正を使って失われたブロックの復元 |
データーファイルの復元と事故の証拠解析のツールがあります。
表10.10 データーファイルの復元と事故の証拠解析のリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
testdisk *
|
V:0.3, I:3 | 4620 | パーティションのスキャンとディスク復元のためのユーティリティー |
magicrescue *
|
V:0.07, I:0.5 | 344 | マジックバイトを探してファイルを復元するユーティリティー |
scalpel *
|
V:0.03, I:0.2 | 124 | 質素で高性能なファイル彫刻刀 |
myrescue *
|
V:0.02, I:0.18 | 84 | 破壊したハードディスクからデーターを救出 |
recover *
|
V:0.07, I:0.6 | 104 | ext2 ファイルシステム上のファイルの削除復元ユーティリティー |
e2undel *
|
V:0.07, I:0.5 | 244 | ext2 ファイルシステム上のファイルの削除復元ユーティリティー |
ext3grep *
|
V:0.08, I:0.6 | 300 | ext3 ファイルシステム上のファイルの削除復元ヘルプツール |
scrounge-ntfs *
|
V:0.03, I:0.4 | 80 | NTFS ファイルシステム上のデーター復元プログラム |
gzrt
*
|
V:0.01, I:0.12 | 68 | gzip 復元ツールキット |
sleuthkit *
|
V:0.13, I:0.7 | 540 | 証拠解析のためのツール (Sleuthkit) |
autopsy *
|
V:0.07, I:0.4 | 1372 | SleuthKit のための GUI |
foremost *
|
V:0.11, I:0.8 | 140 | データー復元のための証拠解析アプリケーション |
guymager *
|
V:0.00, I:0.02 | 688 | Qt 使用の証拠解析用イメージ作成ソフト |
tct
*
|
V:0.03, I:0.2 | 604 | 証拠解析関連ユーティリティー |
dcfldd *
|
V:0.03, I:0.2 | 124 |
証拠解析とセキュリティーのための dd の強化版
|
rdd
*
|
V:0.01, I:0.11 | 200 | 証拠解析のためのコピープログラム |
単一ファイルでバックアップするにはデーターが大きすぎる場合、そのファイル内容を例えば 2000MiB の断片にしてバックアップし、それらの断片を後日マージしてオリジナルのファイルに戻せます。
$ split -b 2000m large_file $ cat x* >large_file
名前がかち合わないように "x
" で始まるファイル名のファイルが無いようにします。
ログファイルのようなファイルの内容を消去するためには、rm
(1)
を使ってファイルを消去しその後新しい空ファイルを作成することは止めましょう。コマンド実行間にファイルがアクセスされているかもしれないのがこの理由です。次のようにするのがファイル内容を消去する安全な方法です。
$ :>file_to_be_cleared
次のコマンドはダミーや空のファイルを作成します。
$ dd if=/dev/zero of=5kb.file bs=1k count=5 $ dd if=/dev/urandom of=7mb.file bs=1M count=7 $ touch zero.file $ : > alwayszero.file
次のファイルを見つかります。
5kb.file
" は5KB のゼロの連続です。
7mb.file
" は7MB のランダムなデーターです。
zero.file
" は0バイト長のファイルかもしれません。もしファイルが存在する時は、その
mtime
を更新しその内容と長さを保持します。
alwayszero.file
" は常に0バイト長ファイルです。もしファイルが存在する時は
mtime
を更新しファイル内容をリセットします。
"/dev/sda
" にある USB
メモリースティック等のハードディスク類似デバイス全体のデーターを完全に消すいくつかの方法があります。
次のコマンドを実行する前にまず USB メモリースティックの場所を mount
(8)
を使ってチェックします。"/dev/sda
" によって指し示されるデバイスは SCSI
ハードディスクかも知れませんしあなたの全システムのあるシリアル ATA ハードディスクかも知れません。
次のようにしてデーターを0にリセットして全消去します。
# dd if=/dev/zero of=/dev/sda
次のようにしてランダムデーターを上書きして全消去します。
# dd if=/dev/urandom of=/dev/sda
次のようにしてランダムデーターを非常に効率的に上書きして全消去します。
# shred -v -n 1 /dev/sda
Debian インストーラ CD 等の多くのブート可能な Linux の CD のシェルから dd
(1)
が利用可能ですから、"/dev/hda
" や "/dev/sda
"
等のシステムハードディスクに対して同類のメディアから消去コマンドを実行することでインストールされたシステムを完全に消去することができます。
データーの消去はファイルシステムからアンリンクされているだけなので、例えば "/dev/sdb1
"
のようなハードディスク (USB メモリースティック)
上の使用されていない領域には消去されたデーター自身が含まれているかもしれません。これらに上書きすることで綺麗に消去できます。
# mount -t auto /dev/sdb1 /mnt/foo # cd /mnt/foo # dd if=/dev/zero of=junk dd: writing to `junk': No space left on device ... # sync # umount /dev/sdb1
あなたの USB メモリースティックにとってはこれで通常十分です。でもこれは完璧ではありません。消去されたファイル名や属性はファイルシステム中に隠れて残っているかもしれません。
ファイルをうっかり消去しても、そのファイルが何らかのアプリケーション (読出しか書込み) によって使われている限り、そのようなファイルを回復出来ます。
例えば、次を試してみて下さい:
$ echo foo > bar $ less bar $ ps aux | grep ' less[ ]' bozo 4775 0.0 0.0 92200 884 pts/8 S+ 00:18 0:00 less bar $ rm bar $ ls -l /proc/4775/fd | grep bar lr-x------ 1 bozo bozo 64 2008-05-09 00:19 4 -> /home/bozo/bar (deleted) $ cat /proc/4775/fd/4 >bar $ ls -l -rw-r--r-- 1 bozo bozo 4 2008-05-09 00:25 bar $ cat bar foo
この代わりに、(lsof
パッケージがインストールされている時) もう一つのターミナルで次のように実行します。
$ ls -li bar 2228329 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:02 bar $ lsof |grep bar|grep less less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar $ rm bar $ lsof |grep bar|grep less less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar (deleted) $ cat /proc/4775/fd/4 >bar $ ls -li bar 2228302 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:05 bar $ cat bar foo
ハードリンクのあるファイルは "ls -li
" を使って確認できます、
$ ls -li total 0 2738405 -rw-r--r-- 1 root root 0 2008-09-15 20:21 bar 2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 baz 2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 foo
"baz
" も "foo
" もリンク数が "2" (>1)
でハードリンクがある事を示しています。これらの inode 番号は共通の "2738404"
です。これはこれらがハードリンクされた同じファイルということを意味します。ハードリンクされた全てのファイルを偶然うまく見つけられない場合は、それを例えば
"2738404" という inode で次のようにして探せます。
# find /path/to/mount/point -xdev -inum 2738404
データーのセキュリティーのインフラはデーターの暗号化のツールとメッセージダイジェストのツールと署名ツールの組み合わせで提供されます。
表10.11 データーセキュリティーインフラツールのリスト
コマンド | パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|---|
gpg (1)
|
gnupg
*
|
V:43, I:99 | 5288 | GNU プライバシーガード - OpenPGP 暗号化ト署名ツール |
N/A |
gnupg-doc *
|
I:1.1 | 4124 | GNU プライバシガード文書 |
gpgv (1)
|
gpgv
*
|
V:59, I:99 | 436 | GNU プライバシガード - 署名確認ツール |
paperkey (1)
|
paperkey *
|
V:0.01, I:0.10 | 88 | OpenPGP の秘密キーから秘密の情報だけを抜粋 |
cryptsetup (8), …
|
cryptsetup *
|
V:3, I:5 | 1172 | 暗号化されたブロックデバイス (dm-crypt / LUKS) のためのユーティリティー |
ecryptfs (7), …
|
ecryptfs-utils *
|
V:0.2, I:0.3 | 416 | ecryptfs スタックドファイルシステム暗号化のためのユーティリティー |
md5sum (1)
|
coreutils *
|
V:92, I:99 | 13828 | MD5 メッセージダイジェストを計算やチェック |
sha1sum (1)
|
coreutils *
|
V:92, I:99 | 13828 | SHA1 メッセージダイジェストを計算やチェック |
openssl (1ssl)
|
openssl *
|
V:56, I:91 | 2380 |
"openssl dgst " を使ってメッセージダイジェストを計算やチェック (OpenSSL)
|
Linux カーネルモジュール経由で自動的データー暗号化のインフラを実現する dm-crypto と ecryptfs に関しては 「データー暗号化ティップ」を参照下さい。
基本的なキー管理に関する GNU プライバシガードコマンドを次に記します。
表10.12 キー管理のための GNU プライバシガードコマンドのリスト
コマンド | 説明 |
---|---|
gpg --gen-key
|
新規キーの生成 |
gpg --gen-revoke my_user_ID
|
my_user_ID に関するリボークキーを生成 |
gpg --edit-key user_ID
|
インタラクティブにキーを編集、ヘルプは "help" |
gpg -o file --exports
|
全てのキーをファイルにエクスポート |
gpg --imports file
|
全てのキーをファイルからインポート |
gpg --send-keys user_ID
|
user_ID のキーをキーサーバーに送信 |
gpg --recv-keys user_ID
|
user_ID のキーをキーサーバーから受信 |
gpg --list-keys user_ID
|
user_ID のキーをリスト |
gpg --list-sigs user_ID
|
user_ID の署名をリスト |
gpg --check-sigs user_ID
|
user_ID の署名をチェック |
gpg --fingerprint user_ID
|
user_ID のフィンガープリントをチェック |
gpg --refresh-keys
|
ローカルキーリングをアップデート |
トラストコードの意味を次に記します。
表10.13 トラストコードの意味のリスト
コード | 信用の説明 |
---|---|
-
|
所有者への信用未付与/未計算 |
e
|
信用計算に失敗 |
q
|
計算用の情報不十分 |
n
|
このキーを信用不可 |
m
|
スレスレの信用 |
f
|
フルに信用 |
u
|
究極の信用 |
次のようにすると私のキー "1DD8D791
" をポピュラーなキーサーバー
"hkp://keys.gnupg.net
" にアップロード出来ます。
$ gpg --keyserver hkp://keys.gnupg.net --send-keys 1DD8D791
"~/.gnupg/gpg.conf
" (もしくは古い場所
"~/.gnupg/options
") 中の良いデフォールトのキーサーバーの設定は次を含みます。
keyserver hkp://keys.gnupg.net
次によってキーサーバーから知らないキーが獲得できます。
$ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\ cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys
OpenPGP 公開キーサーバー
(バージョン0.9.6以前) に2つ以上サブキーのあるキーを壊すバグがありました。新しい gnupg
(>1.2.1-2) パッケージはこのような壊れたサブキーを取り扱えます。gpg
(1)
の"--repair-pks-subkey-bug
" オプションの説明を参照下さい。
基本的なキー管理に関する GNU プライバシガードコマンドを次に記します。
表10.14 ファイルに使用する GNU プライバシーガードコマンドのリスト
コマンド | 説明 |
---|---|
gpg -a -s file
|
ファイルを ASCII 文字化した file.asc と署名 |
gpg --armor --sign file
|
, , |
gpg --clearsign file
|
メッセージをクリアサイン |
gpg --clearsign file|mail foo@example.org
|
foo@example.org にクリアサインされたメッセージをメールする
|
gpg --clearsign --not-dash-escaped patchfile
|
パッチファイルをクリアサイン |
gpg --verify file
|
クリアサインされたファイルを確認 |
gpg -o file.sig -b file
|
署名を別ファイルで作成 |
gpg -o file.sig --detach-sig file
|
, , |
gpg --verify file.sig file
|
file.sig を使ってファイルを確認 |
gpg -o crypt_file.gpg -r name -e file
|
file からバイナリー crypt_file.gpg への name 宛公開キー暗号化 |
gpg -o crypt_file.gpg --recipient name --encrypt file
|
, , |
gpg -o crypt_file.asc -a -r name -e file
|
file から ASCII 文字化された crypt_file.asc への name 宛公開キー暗号化 |
gpg -o crypt_file.gpg -c file
|
file からバイナリー crypt_file.gpg への対称暗号化 |
gpg -o crypt_file.gpg --symmetric file
|
, , |
gpg -o crypt_file.asc -a -c file
|
file から ASCII 文字化された crypt_file.asc への対称暗号化 |
gpg -o file -d crypt_file.gpg -r name
|
暗号解読 |
gpg -o file --decrypt crypt_file.gpg
|
, , |
インデックスメニュー上で "S
" とすれば GnuPG が使えるようにしておきながら、遅い GnuPG
が自動的に起動しないように "~/.muttrc
" に次の内容を追加します。
macro index S ":toggle pgp_verify_sig\n" set pgp_verify_sig=no
gnupg
のプラグインを使うと ".gpg
" や
".asc
" や ".ppg
"
というファイル拡張子のファイルに対して透過的に GnuPG を実行できます。
# aptitude install vim-scripts vim-addon-manager $ vim-addons install gnupg
md5sum
(1) はrfc1321
の方法を使ってダイジェストファイルを作成し各ファイルをそれで確認するユーティリティーを提供します。
$ md5sum foo bar >baz.md5 $ cat baz.md5 d3b07384d113edec49eaa6238ad5ff00 foo c157a79031e1c40f85931829bc5fc552 bar $ md5sum -c baz.md5 foo: OK bar: OK
MD5 和の計算は GNU プライバシーガード (GnuPG) による暗号学的署名の計算より CPU への負荷がかかりません。通常、一番上のレベルのダイジェストファイルだけがデーターの整合性のために暗号学的に署名されます。
ソースコードをマージする多くのツールがあります。次のコマンドが著者の目に止まりました。
表10.15 ソースコードマージツールのリスト
コマンド | パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|---|
diff (1)
|
diff
*
|
V:68, I:85 | 36 | 1行ごとにファイルを比較 |
diff3 (1)
|
diff
*
|
V:68, I:85 | 36 | 1行ごとにファイルを比較やマージ |
vimdiff (1)
|
vim
*
|
V:15, I:33 | 1792 | vim で2つのファイルを並べて比較 |
patch (1)
|
patch
*
|
V:10, I:92 | 244 | 差分ファイルをオリジナルに適用 |
dpatch (1)
|
dpatch *
|
V:1.4, I:11 | 344 | Debian パッケージのためにパッチのシリーズを管理 |
diffstat (1)
|
diffstat *
|
V:2, I:15 | 92 | 差分ファイルによる変化のヒストグラム作成 |
combinediff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | 2つの積み重ねパッチから1つの合計パッチを生成 |
dehtmldiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | HTML ページから差分ファイルを抽出 |
filterdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | 差分ファイルから差分ファイルを抽出や削除 |
fixcvsdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 |
CVS により作成された patch (1) が誤解する差分ファイルを修正
|
flipdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | 古い2つのパッチを交換 |
grepdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | 正規表現にマッチするパッチによって変更されるファイルを表示 |
interdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | 2つのユニファイド差分ファイル間の違いを表示 |
lsdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | どのファイルがパッチによって変更されるかを表示 |
recountdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | ユニファイドコンテキスト差分ファイルのカウントやオフセットを再計算 |
rediff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | 手編集された差分ファイルのカウントやオフセットを再計算 |
splitdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | 増分パッチの分離 |
unwrapdiff (1)
|
patchutils *
|
V:1.8, I:14 | 292 | ワードラップされたパッチを復元 |
wiggle (1)
|
wiggle *
|
V:0.01, I:0.11 | 232 | リジェクトされたパッチを適用 |
quilt (1)
|
quilt
*
|
V:1.5, I:9 | 872 | パッチのシリーズを管理 |
meld (1)
|
meld
*
|
V:0.7, I:2 | 2576 | ファイルを比較やマージ (GTK) |
xxdiff (1)
|
xxdiff *
|
V:0.2, I:1.3 | 1352 | ファイルを比較やマージ (プレーン X) |
dirdiff (1)
|
dirdiff *
|
V:0.08, I:0.6 | 224 | ディレクトリーツリー間で相違点の表示と変更のマージ |
docdiff (1)
|
docdiff *
|
V:0.01, I:0.14 | 688 | 2つのファイルをワード毎/文字毎に比較 |
imediff2 (1)
|
imediff2 *
|
V:0.02, I:0.10 | 76 | 対話型フルスクリーンの2方マージツール |
makepatch (1)
|
makepatch *
|
V:0.01, I:0.17 | 148 | 拡張パッチファイルの生成 |
applypatch (1)
|
makepatch *
|
V:0.01, I:0.17 | 148 | 拡張パッチファイルの適用 |
wdiff (1)
|
wdiff
*
|
V:1.6, I:14 | 1024 | テキストファイル間のワードの相違表示 |
ファイルの場所次第で次の手順のひとつに従うとふたつのソースファイル間の相違を抽出しユニファイド差分ファイル
"file.patch0
" か "file.patch1
" を作成します。
$ diff -u file.old file.new > file.patch0 $ diff -u old/file new/file > file.patch1
差分ファイル (別名、パッチファイル) はプログラム更新を送るのに使われます。受け取った側はこの更新を別のファイルに次のようにして適用します。
$ patch -p0 file < file.patch0 $ patch -p1 file < file.patch1
Debian システム上のバージョンコントロールシステム (VCS) のまとめを次に記します。
VCS システムを今始めて学ぶ場合には、人気が出て来ている Git から学び出すことをお薦めします。
表10.16 バージョンコントロールシステムツールのリスト
パッケージ | ポプコン | サイズ | ツール | VCS タイプ | コメント |
---|---|---|---|---|---|
cssc
*
|
V:0.00, I:0.04 | 2240 | CSSC | ローカル | Unix SCCS のクローン (非推奨) |
rcs
*
|
V:1.3, I:7 | 772 | RCS | ローカル | "Unix SCCS の本来あるべき姿" |
cvs
*
|
V:3, I:21 | 3660 | CVS | リモート | リモート VCS の過去の標準 |
subversion *
|
V:10, I:31 | 4288 | Subversion | リモート | "良く出来た CVS"、新しいリモート VCS のデファクト標準 |
git
*
|
V:5, I:17 | 10632 | Git | 分散型 | C で書かれた高速 DVCS (Linux カーネル他が利用) |
mercurial *
|
V:1.8, I:6 | 368 | Mercurial | 分散型 | Python と一部 C で書かれた DVCS |
bzr
*
|
V:1.1, I:3 | 16220 | Bazaar | 分散型 |
tla に影響され Python で書かれた DVCS (Ubuntu が使用)
|
darcs
*
|
V:0.19, I:1.4 | 9504 | Darcs | 分散型 | パッチに関して賢い計算をする DVCS (遅い) |
tla
*
|
V:0.17, I:1.4 | 932 | GNU arch | 分散型 | 主に Tom Lord による DVCS (歴史的) |
monotone *
|
V:0.04, I:0.3 | 5272 | Monotone | 分散型 | C++ で書かれた DVCS |
tkcvs
*
|
V:0.08, I:0.4 | 2476 | CVS, … | リモート | VCS (CVS, Subversion, RCS) レポジトリーツリーの GUI 表示 |
gitk
*
|
V:0.8, I:4 | 900 | Git | 分散型 | VCS (Git) レポジトリーツリーの GUI 表示 |
VCS はリビジョンコントロールシステム (RCS) とかソフトウエアー設定管理 (SCM) という別名もあります。
Git のような分散 VCS が最近一番人気のツールです。CVS や Subversion は既存のオープンソースプログラム活動に参加するのにまだ有用かもしれません。
Debian はDebian Alioth サービス経由でフリーの VCS サービスを提供します。それは実質的に全ての VCS をサポートします。その説明文書は http://wiki.debian.org/Alioth にあります。
git
パッケージは DVCS ではない "GNU インタラクティブツール"
です。lenny
では、git
パッケージは "GNU
インタラクティブツール" で、git-core
パッケージが DVCS でした。
VCS アーカイブへの共有アクセスを作るための基本が数点あります。
umask 002
" を使用 (「新規作成ファイルのパーミッションのコントロール: umask」参照)
次に全体像を提供するべく元来の VCS コマンドを極端に簡略化した比較を示します。典型的なコマンド文字列はオプションや引数が必要となるかもしれません。
表10.17 本来の VCS コマンドの比較
CVS | Subversion | Git | 機能 |
---|---|---|---|
cvs init
|
svn create
|
git init
|
(ローカル) レポジトリーを作成 |
cvs login
|
- | - | リモートレポジトリーにログイン |
cvs co
|
svn co
|
git clone
|
リモートレポジトリーをワーキングツリーとしてチェックアウト |
cvs up
|
svn up
|
git pull
|
リモートレポジトリーをマージしてワーキングツリーを更新 |
cvs add
|
svn add
|
git add .
|
VCS にワーキングツリー中のファイルを追加 |
cvs rm
|
svn rm
|
git rm
|
VCS からワーキングツリー中のファイルを削除 |
cvs ci
|
svn ci
|
- | リモートレポジトリーに変更をコミット |
- | - |
git commit -a
|
ローカルレポジトリーに変更をコミット |
- | - |
git push
|
ローカルレポジトリーでリモートレポジトリーを更新 |
cvs status
|
svn status
|
git status
|
VCS に対するワーキングツリーの状態を表示 |
cvs diff
|
svn diff
|
git diff
|
diff <参照レポジトリー> <ワーキングツリー> |
- | - |
git repack -a -d; git prune
|
ローカルレポジトリーを単一パックにリパック |
tkcvs
|
tkcvs
|
gitk
|
VCS レポジトリーツリーの GUI 表示 |
git
サブコマンドを直接 "git-xyz
"
としてコマンドラインから起動するのは2006年初以来推奨されません。
tkcvs
(1) や gitk
(1) 等の GUI
ツールはファイルの変更履歴を追跡するのに本当に役立ちます。多くの公開アーカイブが彼らのレポジトリーの中を閲覧するための提供しているウェッブインターフェースもまた非常に有用です。
Git はgit-cvs
や git-svn
パッケージを使って CVS や
Subversion によって提供されるレポジトリー等の他の VCS
レポジトリーを直接処理したり、ローカル変更のためのローカルレポジトリーを提供します。git
for CVS users や 「Subversion レポジトリー用の Git」を参照下さい。
CVS や Subversion に等価コマンドが無いコマンドが Git にあります: "fetch"、"rebase"、"cherry-pick"、…
次を参照下さい。
cvs
(1)
/usr/share/doc/cvs/html-cvsclient
"
/usr/share/doc/cvs/html-info
"
/usr/share/doc/cvsbook
"
info cvs
"
CVS レポジトリーへのコミットを "src
" グループメンバに限定し許可し、CVS の管理を
"staff
" グループメンバに限定し許可するように次の設定をすることでうっかりミスを予防できます。
# cd /var/lib; umask 002; mkdir cvs # export CVSROOT=/srv/cvs/project # cd $CVSROOT # chown root:src . # chmod 2775 . # cvs -d $CVSROOT init # cd CVSROOT # chown -R root:staff . # chmod 2775 . # touch val-tags # chmod 664 history val-tags # chown root:src history val-tags
"$CVSROOT
" ディレクトリーの所有者を "root:staff
"
とし、そのパーミッションを "3775
" と変更すると新規プロジェクトの作成を制限できます。
デフォールトの CVS レポジトリーは "$CVSROOT
" で指示されます。次はローカルアクセスのための
"$CVSROOT
" を設定します。
$ export CVSROOT=/srv/cvs/project
多くの公開 CVS サーバーはアカウント名 "anonymous
" で pserver
サービス経由の読出しのみアクセスを提供します。例えば、Debian ウェッブサイト内容は webwml プロジェクトは Debian alioth サービスでの CVS
を使ってメンテされています。次はこの CVS レポジトリーへのリモートアクセスのための "$CVSROOT
"
を設定します。
$ export CVSROOT=:pserver:anonymous@cvs.alioth.debian.org:/cvsroot/webwml $ cvs login
pserver は盗聴攻撃されやすくインセキュアーなので、書込みアクセスはサーバーの管理者によって通常無効にされています。
次は SSH を使い webwml プロジェクトの CVS
レポジトリーをリモートアクセスするために "$CVS_RSH
" と
"$CVSROOT
" を設定します。
$ export CVS_RSH=ssh $ export CVSROOT=:ext:account@cvs.alioth.debian.org:/cvs/webwml
リモートパスワードプロンプトを無くすのに SSH を使ったパブリックキー認証を使えます。
"~/path/to/module1
" で新規のローカルソースツリーの場所を作成。
$ mkdir -p ~/path/to/module1; cd ~/path/to/module1
"~/path/to/module1
" の下の新規のローカルソースツリーを埋める。
次のパラメーターを使って CVS にインポートします。
module1
"
Main-branch
(全ブランチへのタグ)
Release-initial
(特定リリースタグ)
$ cd ~/path/to/module1 $ cvs import -m "Start module1" module1 Main-branch Release-initial $ rm -Rf . # optional
CVS
は現レポジトリーファイルを上書きせず他のファイルで置き換えます。だからレポジトリーディレクトリーへの書込みパーミッションはクリチカルです。"module1
"
という新規レポジトリーを "/srv/cvs/project
"
に作成の際毎に、必要ならこの条件を満たすために次を実行します。
# cd /srv/cvs/project # chown -R root:src module1 # chmod -R ug+rwX module1 # chmod 2775 module1
次に CVS を使う典型的なワークフローを記します。
"$CVSROOT
" で指される CVS プロジェクトから得られる全てのモジュールを次のようにしてチェックします。
$ cvs rls CVSROOT module1 module2 ...
"module1
" をそのデフォールトディレクトリーの
"./module1
" に次のようにしてチェックアウトします。
$ cd ~/path/to $ cvs co module1 $ cd module1
必要に応じ内容に変更を加える。
次のようにして "diff -u [repository] [local]
" と等価を作成し変更をチェックします。
$ cvs diff -u
あるファイル "file_to_undo
" をひどく壊したが他のファイルは大丈夫な事に気づきます。
次のようにして "file_to_undo
" ファイルを CVS からのクリーンコピーで上書きします。
$ cvs up -C file_to_undo
次のようにして更新されたローカルソースツリーを CVS に保存します。
$ cvs ci -m "Describe change"
次のようにして "file_to_add
" ファイルを作成し CVS に追加します。
$ vi file_to_add $ cvs add file_to_add $ cvs ci -m "Added file_to_add"
次のようにして CVS から最新バージョンをマージします。
$ cvs up -d
コンフリクトある変更を意味する "C filename
" で始まる行に注意します。
".#filename.version
" 中の変更されていないコードを探します。
コンフリクトある変更はファイル中の "<<<<<<<
" や
">>>>>>>
" を探索します。
必要に応じコンフリクト解消のためにファイルを編集します。
次のようにしてリリースタグ "Release-1
" を追加します。
$ cvs ci -m "last commit for Release-1" $ cvs tag Release-1
さらに編集します。
次のようにリリースタグ "Release-1
" を削除します。
$ cvs tag -d Release-1
次のように CVS へ変更をチェックインします。
$ cvs ci -m "real last commit for Release-1"
リリースタグ "Release-1
" を更新した CVS の main の HEAD
に次のようにして再付加します。
$ cvs tag Release-1
次のようにして "Release-initial
"
タグによってで指定されるオリジナルのバージョンから、スティッキーブランチタグが
"Release-initial-bugfixes
"
のブランチを作成し、"~/path/to/old
" ディレクトリーにチェックアウトします。
$ cvs rtag -b -r Release-initial Release-initial-bugfixes module1 $ cd ~/path/to $ cvs co -r Release-initial-bugfixes -d old module1 $ cd old
ブランチポイントとして特定の日付を指定するには "-r Release-initial
" の代わりに
"-D 2005-12-20
" (ISO 8601
日付フォーマット) を使います。
オリジナルバージョンに基づいたスティッキータグ "Release-initial-bugfixes
"
が付いているこのローカルのソースツリーで作業をします。
このブランチで一人で作業をします … 誰か他の人がこの "Release-initial-bugfixes
"
ブランチに合流するまで。
次のようにして必要に応じて新規ディレクトリーを作りながらこのブランチ上の他の人が変更したファイルと同期します。
$ cvs up -d
必要に応じコンフリクト解消のためにファイルを編集します。
次のように CVS へ変更をチェックインします。
$ cvs ci -m "checked into this branch"
次のようにしてスティッキータグを削除し ("-A
")、キーワード展開せずに
("-kk
")、main の HEAD (最新版) をつかってローカルのツリーを更新します。
$ cvs up -d -kk -A
次のようにしてキーワード展開せずに
("-kk
")、"Release-initial-bugfixes
"
ブランチをマージしてローカルのツリー (内容 = main の HEAD) を更新します。
$ cvs up -d -kk -j Release-initial-bugfixes
エディターを使ってコンフリクト解消します。
次のように CVS へ変更をチェックインします。
$ cvs ci -m "merged Release-initial-bugfixes"
次のようにしてアーカイブを作成します。
$ cd .. $ mv old old-module1-bugfixes $ tar -cvzf old-module1-bugfixes.tar.gz old-module1-bugfixes $ rm -rf old-module1-bugfixes
"cvs up
" コマンドには、新規ディレクトリー作成には "-d
"
オプションを、また空ディレクトリーの摘み取りには "-P
" オプションを指定できます。
"cvs co module1/subdir
"
とサブディレクトリーの名前を提供して、"module1
"
のサブディレクトリーだけをチェックアウトすることが出来ます。
CVS から最新ファイルを取り込むには、次のように "tomorrow
" (明日) を使います:
$ cvs ex -D tomorrow module_name
モジュールのエリアス "mx
" を CVS プロジェクト (ローカルサーバー) に追加します。
$ export CVSROOT=/srv/cvs/project $ cvs co CVSROOT/modules $ cd CVSROOT $ echo "mx -a module1" >>modules $ cvs ci -m "Now mx is an alias for module1" $ cvs release -d .
さて、CVS から "new
" ディレクトリーに "module1
"
(エリアス: "mx
") を次のようにしてチェックアウトします。
$ cvs co -d new mx $ cd new
上記プロシージャを行うには、適切なファイルパーミッションが設定されているべきです。
Subversion は旧来の CVS を置き換える最近の世代のバージョンコントロールシステムです。Subversion にはタグとブランチを除く CVS のほとんどの機能をあります。
Subversion のサーバーをセットアップするには、subversion
と
libapache2-svn
と subversion-tools
パッケージをインストールする必要があります。
現状の subversion
パッケージはレポジトリーの設定はしないので手動で設定を行う必要があります。レポジトリーを置く可能な場所の1つは
"/srv/svn/project
" 中です。
ディレクトリーを次のように作成します。
# mkdir -p /srv/svn/project
レポジトリーデーターベースを次のように作成します。
# svnadmin create /srv/svn/project
Apache2 サーバー経由で Subversion レポジトリーにアクセスするだけなら、レポジトリーを次に記すように WWW サーバーのみによって書込み可とするだけが必要です。
# chown -R www-data:www-data /srv/svn/project
ユーザー認証経由でレポジトリーにアクセス許可するために
"/etc/apache2/mods-available/dav_svn.conf
" 中の次の部分を追加
(もしくはアンコメント) します。
<Location /project> DAV svn SVNPath /srv/svn/project AuthType Basic AuthName "Subversion repository" AuthUserFile /etc/subversion/passwd <LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept> </Location>
次のコマンドでユーザー認証ファイルを作成します。
# htpasswd2 -c /etc/subversion/passwd some-username
Apach2 を再スタート
あなたの新規の Subversion レポジトリーは "http://localhost/project
" と
(ウェッブサーバーの URL が"http://example.com/
" と仮定すると)
"http://example.com/project
" の URL にてアクセスできます。
次は Subversion レポジトリーを例えば project
というグループによってローカルアクセス出きるようにする設定です。
# chmod 2775 /srv/svn/project # chown -R root:src /srv/svn/project # chmod -R ug+rwX /srv/svn/project
あなたの新しい Subversion レポジトリーは、project
グループに属するローカルユーザーにとって
svn
(1) から
"file:///localhost/srv/svn/project
" か
"file:///srv/svn/project
" の URL
からグループアクセスできます。グループアクセスを確実にするために、svn
や
svnserve
や svnlook
や
svnadmin
等のコマンドを "umask 002
"
の下で実行しなければいけません。
SSH から "example.com:/srv/svn/project
" の URL
にあるグループアクセス可能な Subversion レポジトリーは、svn
(1) を使って
"svn+ssh://example.com:/srv/svn/project
" にてアクセスできます。
Subversion のブランチやタグの機能を欠くことを補うべく、多くのプロジェクトは次と似たようなディレクトリーツリーを使っています。
----- module1 | |-- branches | |-- tags | | |-- release-1.0 | | `-- release-2.0 | | | `-- trunk | |-- file1 | |-- file2 | `-- file3 | `-- module2
ブランチやタグをマークするためには "svn copy …
" コマンドを使わなければいけません。こうすることで
Subversion がファイルの変更履歴を適正な記録を確実にするとともに記録容量を節約できます。
"~/path/to/module1
" で新規のローカルソースツリーの場所を作成。
$ mkdir -p ~/path/to/module1; cd ~/path/to/module1
"~/path/to/module1
" の下の新規のローカルソースツリーを埋める。
ソースを次のパラメーターを使って Subversion にインポートします。
module1
"
file:///srv/svn/project
",
module1/trunk
":
module1/tags/Release-initial
"
$ cd ~/path/to/module1 $ svn import file:///srv/svn/project/module1/trunk -m "Start module1" $ svn cp file:///srv/svn/project/module1/trunk file:///srv/svn/project/module1/tags/Release-initial
この代わりに、次のようにも出来ます。
$ svn import ~/path/to/module1 file:///srv/svn/project/module1/trunk -m "Start module1" $ svn cp file:///srv/svn/project/module1/trunk file:///srv/svn/project/module1/tags/Release-initial
"file:///…
" といった URL は、"http://…
" や
"svn+ssh://…
" といったいかなる他形式の URL ででも置き換えられます。
次に Subversion をその本来のクライアントとともに使う典型的なワークフローを記します。
git-svn
パッケージによって提供されるクライアントコマンドは git
コマンドを使う Subversion の代替ワークフローを提供します。「Subversion レポジトリー用の Git」を参照下さい。
"file:///srv/svn/project
" の URL で指定される Subversion
プロジェクトから得られる全てのモジュールを次のようにしてチェックします。
$ svn list file:///srv/svn/project module1 module2 ...
次のようにして "module1/trunk
" を"module1
"
ディレクトリーにチェックアウトします。
$ cd ~/path/to $ svn co file:///srv/svn/project/module1/trunk module1 $ cd module1
必要に応じ内容に変更を加える。
次のようにして "diff -u [repository] [local]
" と等価を作成し変更をチェックします。
$ svn diff
あるファイル "file_to_undo
" をひどく壊したが他のファイルは大丈夫な事に気づきます。
次のようにして "file_to_undo
" ファイルを Subversion
からのクリーンコピーで上書きします。
$ svn revert file_to_undo
更新されたローカルソースツリーを次のようにして Subversion に保存します。
$ svn ci -m "Describe change"
次のようにして "file_to_add
" ファイルを作成し Subversion に追加します。
$ vi file_to_add $ svn add file_to_add $ svn ci -m "Added file_to_add"
次のようにして Subversion から最新バージョンをマージします。
$ svn up
コンフリクトある変更を意味する "C filename
" で始まる行に注意します。
"filename.r6
" と "filename.r9
" と
"filename.mine
" 等中の変更されていないコードを探します。
コンフリクトある変更はファイル中の "<<<<<<<
" や
">>>>>>>
" を探索します。
必要に応じコンフリクト解消のためにファイルを編集します。
次のようにしてリリースタグ "Release-1
" を追加します。
$ svn ci -m "last commit for Release-1" $ svn cp file:///srv/svn/project/module1/trunk file:///srv/svn/project/module1/tags/Release-1
さらに編集します。
次のようにリリースタグ "Release-1
" を削除します。
$ svn rm file:///srv/svn/project/module1/tags/Release-1
次のようにして変更を Subversion にチェックインします。
$ svn ci -m "real last commit for Release-1"
リリースタグ "Release-1
" を更新した Subversion の trunk の HEAD
に再付加します。
$ svn cp file:///srv/svn/project/module1/trunk file:///srv/svn/project/module1/tags/Release-1
次のようにして "module1/tags/Release-initial
"
というパスで指定されるオリジナルのバージョンから、パスが
"module1/branches/Release-initial-bugfixes
"
のブランチを作成し、"~/path/to/old
" ディレクトリーにチェックアウトします。
$ svn cp file:///srv/svn/project/module1/tags/Release-initial file:///srv/svn/project/module1/branches/Release-initial-bugfixes $ cd ~/path/to $ svn co file:///srv/svn/project/module1/branches/Release-initial-bugfixes old $ cd old
ブランチポイントとして特定の日付を指定するには "module1/tags/Release-initial
"
の代わりに "module1/trunk@{2005-12-20}
" (ISO 8601 日付フォーマット) を使います。
オリジナルバージョンに基づいたブランチ "Release-initial-bugfixes
"
を指定しているローカルのソースツリーで作業します。
このブランチで一人で作業をします … 誰か他の人がこの "Release-initial-bugfixes
"
ブランチに合流するまで。
次のようにしてこのブランチ上の他の人が変更したファイルと同期します。
$ svn up
必要に応じコンフリクト解消のためにファイルを編集します。
次のようにして変更を Subversion にチェックインします。
$ svn ci -m "checked into this branch"
trunk の HEAD を使って次のようにローカルツリーを更新します。
$ svn switch file:///srv/svn/project/module1/trunk
次のようにして "Release-initial-bugfixes
" ブランチをマージしてローカルのツリー (内容
= trunk の HEAD) を更新します。
$ svn merge file:///srv/svn/project/module1/branches/Release-initial-bugfixes
エディターを使ってコンフリクト解消します。
次のようにして変更を Subversion にチェックインします。
$ svn ci -m "merged Release-initial-bugfixes"
次のようにしてアーカイブを作成します。
$ cd .. $ mv old old-module1-bugfixes $ tar -cvzf old-module1-bugfixes.tar.gz old-module1-bugfixes $ rm -rf old-module1-bugfixes
"file:///…
" といった URL は、"http://…
" や
"svn+ssh://…
" といったいかなる他形式の URL ででも置き換えられます。
"svn co file:///srv/svn/project/module1/trunk/subdir
module1/subdir
" とサブディレクトリーの名前を提供して、"module1
"
のサブディレクトリーだけをチェックアウトすることが出来ます。
表10.19 Subversion コマンドの特記すべきオプション (svn
(1) の最初の引数として使用)
オプション | 意味 |
---|---|
--dry-run
|
空実行、効果無し |
-v
|
svn 活動の詳細なメッセージを表示 |
Git はローカルとリモートのソースコード管理の全機能があります。これはリモートレポジトリーとのネットワーク接続なしにソースコードへの変更を記録できるといことです。
Git は使うあなたの名前や email アドレス等を "~/.gitconfig
"
中のいくつかのグローバル設定に設定したいなら次のようにします。
$ git config --global user.name "Name Surname" $ git config --global user.email yourname@example.com
もしあなたが CVS や Subversion コマンドに慣れ過ぎている場合には、いくつかのコマンドエリアスの設定を次のようにするのも一計です。
$ git config --global alias.ci "commit -a" $ git config --global alias.co checkout
あなたのグローバル設定は次のようにするとチェックできます。
$ git config --global --list
次を参照下さい。
/usr/share/doc/git-doc/git.html
)
/usr/share/doc/git-doc/user-manual.html
)
/usr/share/doc/git-doc/gittutorial.html
)
/usr/share/doc/git-doc/gittutorial-2.html
)
/usr/share/doc/git-doc/everyday.html
)
CVS ユーザーのための git
(/usr/share/doc/git-doc/gitcvs-migration.html
)
/usr/share/doc/gitmagic/html/index.html
)
git-gui
(1) と gitk
(1) コマンドは簡単に Git
が利用出来るようにします。
たとえ gitk
(1) 等の一部ツールが受け付けるからといって、タグ文字列中にスペースを使ってはいけません。他の
git
コマンドで支障が起こるかもしれません。
アップストリームが異なる VCS を使っていようと、アップストリームへのネットワーク接続無しにローカルコピーを管理できるので、ローカル活動に
git
(1) を使うのは良い考えかもしれません。次は git
(1)
とともに使われるパッケージとコマンドのリストです。
表10.20 git 関連のパッケージとコマンドのリスト
コマンド | パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|---|
N/A |
git-doc *
|
I:3 | 7436 | 正式 Git 文書 |
N/A |
gitmagic *
|
I:0.3 | 920 | "Git マジック"、Git に関する分かり易いガイド |
git (7)
|
git
*
|
V:5, I:17 | 10632 | git: 高速、スケーラブル、分散型リビジョンコントロールシステム |
gitk (1)
|
gitk
*
|
V:0.8, I:4 | 900 | GUI による履歴付き Git レポジトリーブラウザー |
git-gui (1)
|
git-gui *
|
V:0.3, I:2 | 1612 | Git 用の GUI (履歴無し) |
git-svnimport (1)
|
git-svn *
|
V:0.5, I:3 | 552 | Subversion から Git へのデーターのインポート |
git-svn (1)
|
git-svn *
|
V:0.5, I:3 | 552 | Subversion と Git 間での双方向操作を提供 |
git-cvsimport (1)
|
git-cvs *
|
V:0.17, I:1.6 | 676 | CVS から Git へのデーターのインポート |
git-cvsexportcommit (1)
|
git-cvs *
|
V:0.17, I:1.6 | 676 | Git から CVS チェックアウトに1コミットエキスポート |
git-cvsserver (1)
|
git-cvs *
|
V:0.17, I:1.6 | 676 | Git 用 CVS サーバーエミュレーター |
git-send-email (1)
|
git-email *
|
V:0.12, I:1.7 | 404 | Git からパッチの集合の email として送信 |
stg (1)
|
stgit
*
|
V:0.07, I:0.7 | 1864 | Git 上の quilt (Python) |
git-buildpackage (1)
|
git-buildpackage *
|
V:0.2, I:1.1 | 596 | Git を使って Debian パッケージ化を自動化 |
guilt (7)
|
guilt
*
|
V:0.01, I:0.11 | 336 | Git 上の quilt (SH/AWK/SED/…) |
git
(1) では、多くのコミットをしながらローカルブランチ上で仕事をして "git
rebase -i master
"
等を使って後から変更履歴を整理します。こうすると綺麗な変更履歴が作れます。git-rebase
(1) と
git-cherry-pick
(1) を参照下さい。
作業中のディレクトリの現状を失わずにクリーンな作業ディレクトリを取り戻すには "git stash
"
を使えばできます。git-stash
(1) を参照ください。
"svn+ssh://svn.example.org/project/module/trunk
" にある
Subversion のレポジトリを "./dest
" にあるローカルの Git
レポジトリにチェックアウトでき、また Subversion レポジトリに戻すコミットができます。例えば:
$ git svn clone -s -rHEAD svn+ssh://svn.example.org/project dest $ cd dest ... make changes $ git commit -a ... keep working locally with git $ git svn dcommit
"-rHEAD
" を使うことにより Subversion
のレポジトリから過去の全コンテントを複製することが避けられます。
Git ツールを使い設定の経時履歴をマニュアルで記録できます。次は
"/etc/apt/
" の内容を記録する単純な練習例です。
$ cd /etc/apt/ $ sudo git init $ sudo chmod 700 .git $ sudo git add . $ sudo git commit -a
設定を説明とともにコミットします。
設定ファイルへの変更をします。
$ cd /etc/apt/ $ sudo git commit -a
設定を説明とともにコミットしそのままいろいろ作業をしていきます。
$ cd /etc/apt/ $ sudo gitk --all
フルの履歴を手中しています。
設定データーのどのファイルパーミッションでも機能するためには sudo
(8)
が必要です。ユーザーの設定データーの場合 sudo
をスキップ出来るかもしれません。
上記例での "chmod 700 .git
"
コマンドはアーカイブデーターを不正読出しアクセスから守るために必要です。
設定履歴の記録に関するより完全なセットアップは、etckeeper
パッケージを見て下さい: 「設定ファイルの変更記録」。
Debian システム上のデーターフォーマット変換のツールとティップを記します。
標準に準拠したツールは非常に良い状態ですが、プロプライエタリデーターフォーマットのサポートは限定的です。
テキストデーター変換のための次のパッケージが著者の目に止まりました。
表11.1 テキストデーター変換ツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
libc6
*
|
V:97, I:99 | 10012 | 文字セット |
iconv (1) によるロケール間のテキスト符号化方式変換ソフト (基本的)
|
recode *
|
V:1.5, I:7 | 772 | 文字セット + 行末文字 | ロケール間のテキスト符号化方式変換ソフト (機能豊富、より多いエリアスと機能) |
konwert *
|
V:0.4, I:4 | 192 | 文字セット | ロケール間のテキスト符号化方式変換ソフト (高級機能) |
nkf
*
|
V:0.2, I:2 | 300 | 文字セット | 日本語のための文字セット翻訳ソフト |
tcs
*
|
V:0.02, I:0.14 | 544 | 文字セット | 文字セット翻訳ソフト |
unaccent *
|
V:0.01, I:0.09 | 76 | 文字セット | アクセント付き文字をアクセントの無しの等価文字に置換 |
tofrodos *
|
V:1.1, I:7 | 48 | 行末文字 |
DOS と Unix 間のテキストフォーマット変換ソフト: fromdos (1) と
todos (1)
|
macutils *
|
V:0.05, I:0.5 | 320 | 行末文字 |
Macintosh と Unix 間のテキストフォーマット変換ソフト: frommac (1) and
tomac (1)
|
iconv
(1) はlibc6
パッケージの一部として提供されていて、文字の符号化方式変換のために実質的に全てのシステムで常に使用可能です。
次のようにするとテキストファイルを iconv
(1) を使って変換できます。
$ iconv -f encoding1 -t encoding2 input.txt >output.txt
符号化方式 (エンコーディング) 値をマッチングする際には、大文字小文字の区別は無く、"-
" や
"_
" を無視します。"iconv -l
"
コマンドにより、サポートされている符号化方法が確認できます。
表11.2 符号化方式値とその使い方リスト
符号化方式値 | 使い方 |
---|---|
ASCII. | 情報交換用米国標準コード (ASCII); アクセント文字無しの7ビットコード |
UTF-8 | 全現代的 OS のための現行多言語標準 |
ISO-8859-1 | 西欧州言語用の旧標準、ASCII + アクセント文字 |
ISO-8859-2 | 東欧州言語用の旧標準、ASCII + アクセント文字 |
ISO-8859-15 | 西欧州言語用の旧標準、ユーロ文字付き ISO-8859-1 |
CP850 | コードページ 850、西欧州言語用グラフィック文字付き Microsoft DOS 文字、ISO-8859-1 の変種 |
CP932 | コードページ 932、日本語用 Microsoft Windows スタイル Shift-JIS の変種 |
CP936 | コードページ 936、簡体中国語用 Microsoft Windows スタイル GB2312 か GBK か GB18030 の変種 |
CP949 | コードページ 949、韓国語用 Microsoft Windows スタイル EUC-KR か統一ハングルコードの変種 |
CP950 | コードページ 950、繁体中国語用 Microsoft Windows スタイル Big5 の変種 |
CP1251 | コードページ 1251、キリル文字用 Microsoft Windows スタイル符号化方式 |
CP1252 | コードページ 1252、西欧州言語用 Microsoft Windows スタイル ISO-8859-15 の変種 |
KOI8-R | キリル文字用の旧ロシアの UNIX 標準 |
ISO-2022-JP | 7ビットコードのみを用いる日本語 email の標準符号化方式 |
eucJP | Shift-JIS とはまったく違う、旧日本の UNIX 標準8ビットコード |
Shift-JIS | 日本語のための JIS X 0208 Appendix 1 標準 (CP932 参照) |
一部の符号化方式 (エンコーディング) はデーター変換のみサポートされており、ロケール値としては使われません (「符号化方式の基本」参照)。
ASCII や ISO-8859 文字セットのような1バイトに収まる文字セットに付いては、文字の符号化方式 (エンコーディング) とは文字セットとほとんど同じ事を意味します。
日本語のための JIS X 0213 や実質的に全ての言語のためのユニコード文字セット (UCS, Unicode, ISO-10646-1) のような多くの文字を含む文字セットの場合には、バイトデーター列に落とし込む多くの符号化手法があります。
これらに関しては、文字セットと文字符号化方式の間にはっきりとした区別があります。
コードページは、一部のベンダー固有のコードページで文字符号化テーブルと同義語として使用されています。
ほとんどの符号化システムが7ビット文字に関して ASCII と同じコードを共有している事を覚えておいて下さい。もちろん例外はありますが。もし古い日本語の
C プログラムや URL のデーターをカジュアルにシフト JIS と呼ばれている符号化フォーマットから UTF-8
フォーマットに変換する際には、期待される結果を得るために "shift-JIS
" ではなく
"CP932
" を使いましょう: 0x5C
→
"\
" と 0x7E
→
"~
"。こうしないと、これらが間違った文字に変換されます。
recode
(1) は、十分使えますし、iconv
(1) と
fromdos
(1) と todos
(1) と
frommac
(1) と tomac
(1)
を組み合わせ以上の機能を提供します。詳しくは "info recode
" を参照下さい。
次のようにするとテキストファイルが UTF-8 でエンコードされていると iconv
(1) を使って確認できます。
$ iconv -f utf8 -t utf8 input.txt >/dev/null || echo "non-UTF-8 found"
最初の非 UTF-8 文字を見つけるには上記例中で "--verbose
" オプションを使います。
次に、単一ディレクトリー中の旧 OS 下で作成されたファイル名から現代的な UTF-8 のファイル名に符号化方式を変換するスクリプト例を示します。
#!/bin/sh ENCDN=iso-8859-1 for x in *; do mv "$x" $(echo "$x" | iconv -f $ENCDN -t utf-8) done
"$ENCDN
" 変数値は、表11.2「符号化方式値とその使い方リスト」中の符号化方式 (エンコーディング) 値によって設定されるべきです。
もっと複雑な場合にはそのようなファイル名を含有するファイルシステム (ディスクドライブ上のパーティション等) を
mount
(8) オプションに適正な符号化方式 (エンコーディング) (「ファイル名の符号化方式」参照) を指定してマウントし、その全内容を他の UTF-8
でマウントされたファイルシステムに "cp -a
" コマンドを使ってコピーします。
テキストファイルのフォーマット、特に行末 (EOL) コード、はプラットフォーム依存です。
表11.3 異なるプラットフォーム上での行末スタイルのリスト
プラットフォーム | 行末コード | コントロール | 10進数 | 16進数 |
---|---|---|---|---|
Debian (unix) | LF |
^J
|
10 | 0A |
MSDOS と Windows | CR-LF |
^M^J
|
13 10 | 0D 0A |
Apple の Macintosh | CR |
^M
|
13 | 0D |
行末 (EOL) フォーマット変換プログラムに関して、fromdos
(1) と
todos
(1) と frommac
(1) と
tomac
(1) は非常に便利です。recode
(1) もまた役に立ちます。
python-moinmoin
パッケージ用の wiki のデーター等の Debian
システム上の一部データーは、MSDOS スタイルの CR-LF を行末コードとして用います。あくまで上記は一般則と言うだけです。
ほとんどのエディター (例えば vim
や emacs
や
gedit
等) は MSDOS スタイルの行末を透過的に取り扱えます。
MSDOS と Unix スタイルが混在する行末スタイルを MSDOS スタイルに統一するには、todos
(1)
を使う代わりに "sed -e '/\r$/!s/$/\r/'
" を使う方がより好ましいです。(例えば、2つの
MSDOS スタイルファイルを diff3
(1) を使ってマージした後。)
todos
は全ての行に CR を追加するというのがこの理由です。
タブコードを変換するための良く使われる専用プログラムがいくつかあります。
表11.4 bsdmainutils
と coreutils
パッケージ中のタブ変換コマンドのリスト
機能 |
bsdmainutils
|
coreutils
|
---|---|---|
タブからスペースに展開する |
"col -x "
|
expand
|
スペースからタブに逆展開する |
"col -h "
|
unexpand
|
indent
パッケージにある indent
(1) コマンドは C
プログラム中のホワイトスペースを完全にリフォーマットします。
vim
や emacs
等のエディタープログラムもまたタブ変換に使えます。例えば vim
を使うと、":set
expandtab
" として ":%retab
"
するコマンドシーケンスでタブ変換が出来ます。これを元に戻すのは、":set noexpandtab
" として
":%retab!
" とするコマンドシーケンスです。
vim
プログラムなどのインテリジェントな現代的なエディターは大変良く出来ていていかなる符号化方式やいかなるファイルフォーマットでも機能します。これらのエディターを
UTF-8 ロケール下で UTF-8 を扱えるコンソール中で使用することで最良の互換性が得られます。
latin1 (iso-8859-1) 符号化方式で保存された古い西欧州の Unix テキストファイル
"u-file.txt
" は、単純に vim
を使って次のようにして編集出来ます。
$ vim u-file.txt
vim
中の符号化方式自動判定機構が、最初は UTF-8 符号化方式を仮定し、それが上手く行かなかった際に
latin1 を仮定するから可能です。
latin2 (iso-8859-2) 符号化方式で保存された古いポーランドの Unix テキストファイル
"pu-file.txt
" は、vim
を使って次のようにして編集出来ます。
$ vim '+e ++enc=latin2 pu-file.txt'
eucJP 符号化方式で保存された古い日本の Unix テキストファイル "ju-file.txt
"
は、vim
を使って次のようにして編集出来ます。
$ vim '+e ++enc=eucJP ju-file.txt'
shift-JIS 符号化方式 (より正確には: CP932) で保存された古い日本の MS-Windows テキストファイル
"jw-file.txt
" は、vim
を使って次のようにして編集出来ます。
$ vim '+e ++enc=CP932 ++ff=dos jw-file.txt'
"++enc
" や "++ff
"
オプションを使ってファイルが開かれた時は、Vim コマンドライン中の ":w
"
がオリジナルのファイルフォーマットでオリジナルのファイルを上書きします。例えば ":w ++enc=utf8
new.txt
" 等と Vim コマンドライン中で保存フォーマットや保存ファイル名を指定することも出来ます。
vim
オンラインヘルプ中の mbyte.txt "multi-byte text support"
と、"++enc
" に使われるロケール値に関する表11.2「符号化方式値とその使い方リスト」を参照下さい。
emacs
ファミリーのプログラムもまた同様の機能の実行ができます。
以下はウェッブページを読みテキストファイルに落とします。ウェッブから設定を取ってくる時や grep
(1)
等の基本的な Unix テキストツールをウェッブページに適用するときに非常に有用です。
$ w3m -dump http://www.remote-site.com/help-info.html >textfile
同様に、次を用いることで他のフォーマットからプレーンテキストデーターを抽出出来ます。
表11.5 プレーンテキストデーター抽出ツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 機能 |
---|---|---|---|---|
w3m
*
|
V:24, I:84 | 1992 | html→text |
"w3m -dump " コマンドを使う HTML からテキストへの変換ソフト
|
html2text *
|
V:15, I:37 | 248 | html→text | 先進的 HTML からテキストへの変換ソフト (ISO 8859-1) |
lynx
*
|
I:22 | 252 | html→text |
"lynx -dump " コマンドを使う HTML からテキストへの変換ソフト
|
elinks *
|
V:2, I:5 | 1448 | html→text |
"elinks -dump " コマンドを使う HTML からテキストへの変換ソフト
|
links
*
|
V:3, I:9 | 1380 | html→text |
"links -dump " コマンドを使う HTML からテキストへの変換ソフト
|
links2 *
|
V:0.7, I:3 | 3288 | html→text |
"links2 -dump " コマンドを使う HTML からテキストへの変換ソフト
|
antiword *
|
V:1.3, I:2 | 796 | MSWord→text,ps | MSWord ファイルをプレーンテキストか ps に変換 |
catdoc *
|
V:1.0, I:2 | 2580 | MSWord→text,TeX | MSWord ファイルをプレーンテキストか TeX に変換 |
pstotext *
|
V:0.8, I:1.4 | 148 | ps/pdf→text | PostScript と PDF ファイルからテキストを抽出 |
unhtml *
|
V:0.02, I:0.14 | 76 | html→text | HTML ファイルからマークアップタグを削除 |
odt2txt *
|
V:0.8, I:1.4 | 100 | odt→text | OpenDocument テキストからテキストへの変換ソフト |
wpd2sxw *
|
V:0.02, I:0.13 | 156 | WordPerfect→sxw | WordPerfect から OpenOffice.org/StarOffice writer への文書変換ソフト |
次のようにしてプレーンテキストデーターをハイライトとフォーマット出来ます。
表11.6 プレーンテキストデーターをハイライトするツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
vim-runtime *
|
V:3, I:38 | 25864 | ハイライト |
":source $VIMRUNTIME/syntax/html.vim " を使ってソースコードを HTML
に変換するための Vim MACRO
|
cxref
*
|
V:0.05, I:0.4 | 1252 | c→html | C プログラムから latex か HTML への変換ソフト (C 言語) |
src2tex *
|
V:0.03, I:0.2 | 1968 | ハイライト | 多くのソースコードの TeX への変換ソフト (C 言語) |
source-highlight *
|
V:0.14, I:1.1 | 2164 | ハイライト | 多くのソースコードを HTML と XHTML と LaTeX と Texinfo と ANSI カラーエスケープシーケンスと DocBook にハイライト付きで変換 (C++) |
highlight *
|
V:0.2, I:1.3 | 756 | ハイライト | 多くのソースコードを HTML と XHTML と LaTeX と Tex と AXSL-FO にハイライト付きで変換 (C++) |
grc
*
|
V:0.05, I:0.12 | 164 | text→color | 汎用着色化ソフト (Python) |
txt2html *
|
V:0.08, I:0.5 | 296 | text→html | テキストから HTML への変換ソフト (Perl) |
markdown *
|
V:0.07, I:0.4 | 96 | text→html | markdown テキスト文書の (X)HTML へのフォーマット化ソフト (Perl) |
asciidoc *
|
V:0.15, I:1.1 | 3028 | text→any | AsciiDoc テキスト文書の XML/HTML へのフォーマット化ソフト (Python) |
python-docutils *
|
V:0.4, I:3 | 5740 | text→any | ReStructured テキスト文書の XML へのフォーマット化ソフト (Python) |
txt2tags *
|
V:0.06, I:0.3 | 1028 | text→any | テキストから HTML と SGML と LaTeX と man page と MoinMoin と Magic Point と PageMaker への文書変換 (Python) |
udo
*
|
V:0.01, I:0.07 | 556 | text→any | 汎用文書 - テキスト処理ユーティリティー (C 言語) |
stx2any *
|
V:0.00, I:0.04 | 484 | text→any | 構造化プレーンテキストからたのフォーマットへの文書変換ソフト (m4) |
rest2web *
|
V:0.01, I:0.08 | 576 | text→html | ReStructured Text から html への文書変換ソフト (Python) |
aft
*
|
V:0.01, I:0.06 | 340 | text→any | "自由フォーム" 文書準備システム (Perl) |
yodl
*
|
V:0.01, I:0.06 | 564 | text→any | プリ文書言語とその処理用のツール (C 言語) |
sdf
*
|
V:0.01, I:0.08 | 1940 | text→any | 単純文書処理ソフト (Perl) |
sisu
*
|
V:0.01, I:0.07 | 14384 | text→any | 文書の構造化と出版と探索の枠組み (Ruby) |
Extensible Markup Language (XML) は構造化情報を含む文書のためのマークアップ言語です。
XML.COM にある入門情報を参照下さい。
XML テキストはちょっと HTML
のようにも見えます。これを使うと一つの文書から複数のフォーマットのアウトプット管理できるようになります。簡単な XML システムの一つはここで使っている
docbook-xsl
パッケージです。
各 XML ファイルは次のような標準的な XML 宣言でスタートします。
<?xml version="1.0" encoding="UTF-8"?>
XML 要素の基本的シンタックスは次のようにマークアップされます。
<name attribute="value">content</name>
空の XML 要素は次の短縮形を使ってマークアップされます。
<name attribute="value"/>
上記例中の "attribute="value"
" はオプションです。
XML 中のコメントセクションは次のようにマークアップされます。
<!-- comment -->
マークアップを追加する以外に、XML は次の文字に関して事前定義されたエンティティを使い内容を少し改変する必要があります。
表11.7 XML で事前定義されているエントリーのリスト
事前定義されたエンティティ | 変換される前の文字 |
---|---|
"
|
" : 引用符
|
'
|
' : アポストロフィ
|
<
|
< : 以下
|
>
|
> : 以上
|
&
|
& : アンパサンド
|
"<
" と "&
"
はアトリビュートやエレメントには使えません。
例えば "&some-tag:
" 等の SGML
スタイルのユーザー定義エンティティが使われた場合、他の定義は無効で最初の定義が有効です。エンティティ定義は "<!ENTITY
何らかのタグ " エンティティ値 ">
" と表現されます。
XML のマークアップがタグ名の何らかの組み合わせで (あるデーターを内容としてであれアトリビュート値としてであれ) 整合性を持ってされている限り、他の XML の変換は拡張可能スタイルシート言語変換 (XSLT) を使うととっても簡単な作業です。
拡張可能スタイルシート言語 (XSL) のような XML ファイルを処理するツールは沢山あります。
基本的に、良くできた XML ファイルを一度作ると、いかなるフォーマットへも拡張可能なスタイルシート言語変換 (XSLT) を使って変換できます。
フォーマットオブジェクト用拡張可能スタイルシート言語
(XSL-FO) がフォーマットのための答えとなるはずです。fop
パッケージはまだ Debian
の (main
ではなく) contrib
アーカイブにまだあります。このため。通常 XSLT を使って LaTeX コードが XML から作成され、LaTeX システムを使って DVI や
PostScript や PDF 等のプリンタブルなファイルが作成されます。
表11.8 XML ツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
docbook-xml *
|
I:47 | 2488 | xml | DocBook 用 XML ドキュメントタイプ定義 (DTD) |
xsltproc *
|
V:4, I:46 | 152 | xslt | XSLT コマンドラインプロセスソフト (XML→ XML, HTML, plain text, 他) |
docbook-xsl *
|
V:0.5, I:7 | 12792 | xml/xslt | DocBook XML を XSLT を使って各種アウトプットへ処理する XSL スタイルシート |
xmlto
*
|
V:0.3, I:2 | 268 | xml/xslt | XSLT を用いて XML から全てへの変換ソフト |
dblatex *
|
V:0.2, I:2 | 7340 | xml/xslt | XSLT を使って Docbook ファイルを DVI, PostScript, PDF 文書へ変換 |
fop
*
|
V:0.3, I:2 | 2280 | xml/xsl-fo | Docbook XML ファイルを PDF に変換 |
XML は標準一般化マークアップ言語 (SGML) のサブセットなので、ドキュメントスタイル構文規程言語 (DSSSL) 等の SGML 用の広範なツールで処理できます。
表11.9 仮想化ツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
openjade *
|
V:0.4, I:3 | 1212 | dsssl | ISO/IEC 10179: 1996 標準 DSSSL プロセッサ (最新版) |
openjade1.3 *
|
V:0.02, I:0.14 | 2336 | dsssl | ISO/IEC 10179: 1996 標準 DSSSL プロセッサ (1.3.x版 ) |
jade
*
|
V:0.3, I:2 | 1056 | dsssl | James Clark の標準 DSSSL プロセッサ (1.2.x版 ) |
docbook-dsssl *
|
V:0.5, I:4 | 3100 | xml/dsssl | DocBook XML を各種出力フォーマットに DSSSL を使って処理するための DSSSL スタイルシート |
docbook-utils *
|
V:0.2, I:2 | 440 | xml/dsssl |
docbook2* コマンドで DSSSL を使って DocBook ファイルを他のフォーマットに (HTML,
RTF, PS, man, PDF) 変換するなどのユーティリティー
|
sgml2x *
|
V:0.00, I:0.06 | 216 | SGML/dsssl | DSSSL スタイルシートを使う SGML や XML からの変換ソフト |
他のフォーマットから以下を使うと HTML とか XML のデーターを抽出出来ます。
表11.10 テキストデーター変換ツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
wv
*
|
V:1.3, I:2 | 2116 | MSWord→any | Microsoft Word から HTML や LaTeX 等への文書変換ソフト |
texi2html *
|
V:0.3, I:2 | 2076 | texi→html | Texinfo から HTML への変換ソフト |
man2html *
|
V:0.2, I:1.2 | 372 | manpage→html | manpage から HTML への変換ソフト (CGI サポート) |
tex4ht *
|
V:0.3, I:2 | 924 | tex↔html | (La)TeX と HTML 間の変換ソフト |
xlhtml *
|
V:0.5, I:1.1 | 184 | MSExcel→html | MSExcel .xls から HTML への変換ソフト |
ppthtml *
|
V:0.5, I:1.1 | 120 | MSPowerPoint→html | MSPowerPoint から HTML への変換ソフト |
unrtf
*
|
V:0.4, I:0.9 | 224 | rtf→html | RTF から HTML 等への文書変換ソフト |
info2www *
|
V:0.6, I:1.2 | 156 | info→html | GNU info から HTML への変換ソフト (CGI サポート) |
ooo2dbk *
|
V:0.03, I:0.16 | 941 | sxw→xml | OpenOffice.org SXW 文書から DocBook XML への変換ソフト |
wp2x
*
|
V:0.01, I:0.07 | 240 | WordPerfect→any | WordPerfect 5.0 と 5.1 ファイルから TeX と LaTeX と troff と GML と HTML への変換ソフト |
doclifter *
|
V:0.00, I:0.03 | 424 | troff→xml | troff から DocBook XML への変換ソフト |
非 XML の HTML ファイルの場合は、これらを整合性ある XML である XHTML に変換できます。XHTML は XML ツールで処理できます。
表11.11 仮想化ツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
libxml2-utils *
|
V:3, I:49 | 160 | xml↔html↔xhtml |
xmllint (1) (シンタクスチェック、リフォーマット、整形、他) を含むコマンドライン XML ツール
|
tidy
*
|
V:1.0, I:9 | 108 | xml↔html↔xhtml | HTML シンタックスチェックソフトとリフォーッマトソフト |
一度適正な XML が生成されれば、XSLT 技術を使ってマークアップコンテキスト等に基づいてデーターを抽出出来ます。
Debian システム上では印刷可能なデーターは PostScript フォーマットで表現されます。共通 Unix 印刷システム (CUPS) は非 PostScript プリンタ用のラスタ化のバックエンドプログラムとして Ghostscript を使用します。
印刷データー処理の核心はラスタ画像を生成する Ghostscript という PostScript (PS) インタープリタです。
最新の Artifex からのアップストリーム版 Ghostscript は統合リリースである 8.60 リリースにて AFPL から GPL にライセンス変更され最新の ESP バージョンによる CUPS 関連等の変更をマージしました。
表11.12 Ghostscript PostScript インタープリタのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
ghostscript *
|
V:18, I:56 | 6716 | GPL 版 Ghostscript PostScript/PDF インタープリタ |
ghostscript-x *
|
V:13, I:28 | 220 | GPL 版 Ghostscript PostScript/PDF インタープリタ - X ディスプレーサポート |
gs-cjk-resource *
|
V:0.04, I:0.4 | 4528 | gs-cjk 用リソースファイル、Ghostscript CJK-TrueType 拡張 |
cmap-adobe-cns1 *
|
V:0.03, I:0.3 | 1572 | Adobe-CNS1 用 CMaps (繁体中国語サポート) |
cmap-adobe-gb1 *
|
V:0.03, I:0.3 | 1552 | Adobe-GB1 用 CMaps (簡体中国語サポート) |
cmap-adobe-japan1 *
|
V:0.08, I:0.7 | 2428 | Adobe-Japan1 用 CMaps (日本語標準サポート) |
cmap-adobe-japan2 *
|
I:0.4 | 416 | Adobe-Japan2 用 CMaps (日本語拡張サポート) |
cmap-adobe-korea1 *
|
V:0.01, I:0.19 | 872 | Adobe-Korea1 用 CMaps (韓国語サポート) |
libpoppler5 *
|
V:4, I:21 | 2368 | xpdf PDF ビューワー準拠 PDF レンダリングライブラリー |
libpoppler-glib4 *
|
V:7, I:19 | 504 | PDF レンダリングライブラリー (GLib 準拠共有ライブラリー) |
poppler-data *
|
I:3 | 12232 | PDF レンダリングライブラリー用 CMaps (CJK サポート: Adobe-*) |
"gs -h
" とすると Ghostscript の設定が表示されます。
2つの PostScript (PS) や Portable Document Format (PDF)
ファイルは Ghostscript のgs
(1) をつかってマージできます。
$ 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
コマンドラインの場合、psutils
パッケージ中の psmerge
(1)
等のコマンドは PostScript 文書を操作するのに便利です。pdfjam
パッケージ中のコマンドは PDF
文書を操作するのに便利です。pdftk
パッケージの pdftk
(1) も
PDF 文書を操作するのに便利です。
印刷可能なデーターに用いる次のパッケージが著者の目に止まりました。
表11.13 プリントできるデーターのユーティリティーのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
poppler-utils *
|
V:8, I:49 | 536 | pdf→ps,text,… |
PDF ユーティリティー: pdftops , pdfinfo ,
pdfimages , pdftotext ,
pdffonts
|
psutils *
|
V:3, I:21 | 380 | ps→ps | PostScript 文書変換ツール |
poster *
|
V:1.2, I:9 | 80 | ps→ps | PostScript ページから大きなポスターを作る |
xpdf-utils *
|
V:0.9, I:4 | 76 | pdf→ps,text,… |
PDF ユーティリティー: pdftops , pdfinfo ,
pdfimages , pdftotext ,
pdffonts
|
enscript *
|
V:1.6, I:14 | 2464 | text→ps, html, rtf | ASCII テキストから PostScript か HTML か RTF か Pretty-Print への変換 |
a2ps
*
|
V:1.7, I:8 | 4292 | text→ps | 全てを PostScript に変換するソフトと綺麗印刷ソフト |
pdftk
*
|
V:1.0, I:5 | 200 | pdf→pdf |
PDF 文書変換ツール: pdftk
|
mpage
*
|
V:0.18, I:1.5 | 224 | text,ps→ps | シートに複数ページを印刷 |
html2ps *
|
V:0.2, I:1.7 | 260 | html→ps | HTML から PostScript への変換ソフト |
pdfjam *
|
V:0.2, I:1.8 | 228 | pdf→pdf |
PDF 文書変換ツール: pdf90 , pdfjoin ,
pdfnup
|
gnuhtml2latex *
|
V:0.07, I:0.6 | 60 | html→latex | html から latex への変換ソフト |
latex2rtf *
|
V:0.14, I:1.0 | 508 | latex→rtf | LaTeX から MS Word で読める RTF へと文書変換 |
ps2eps *
|
V:1.3, I:12 | 116 | ps→eps | PostScript から EPS (カプセル化済み PostScript) への変換ソフト |
e2ps
*
|
V:0.01, I:0.10 | 188 | text→ps | 日本語符号化サポート付きの Text から PostScript への変換ソフト |
impose+ *
|
V:0.03, I:0.2 | 180 | ps→ps | PostScript ユーティリティー |
trueprint *
|
V:0.02, I:0.13 | 188 | text→ps | 多くのソースコード (C, C++, Java, Pascal, Perl, Pike, Sh, Verilog) の PostScript への綺麗印刷 (C 言語) |
pdf2svg *
|
V:0.10, I:0.5 | 60 | ps→svg | PDF からスケール可のベクトルグラフィクス (SVG) フォーマットへの変換ソフト |
pdftoipe *
|
V:0.02, I:0.16 | 88 | ps→ipe | PDF から IPE の XML フォーマットへの変換ソフト |
Common Unix Printing System
(CUPS) が提供する、lp
(1) と lpr
(1)
コマンドの両方が印刷可能なデーターの印刷をカスタム化するオプションを提供します。
このエディターは次のコマンドの内のひとつを使いファイルに対し直接起動できます。
$ lp -n 3 -o Collate=True filename
$ lpr -#3 -o Collate=True filename
さらに、コマンドライン印刷とオプションに書かれているように
"-o number-up=2
" や "-o page-set=even
",
"-o page-set=odd
" や "-o scaling=200
" や
"-o natural-scaling=200
" 等の印刷オプションを使ってカスタム化できます。
Unix のtroff プログラムは最初 AT&T で開発されました。それはマンページを作成するのに通常使われます。
Donald Knuth 氏によって作成された TeX は非常に強力な組版ツールでデファクト標準です。最初 Leslie Lamport 氏によって書かれた LaTeX は TeX の力への高レベルアクセスを可能にします。
表11.14 タイプ設定ツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
texlive *
|
V:0.5, I:9 | 124 | (La)TeX | 組版、校正、印刷のための TeX システム |
groff
*
|
V:0.9, I:7 | 9116 | troff | GNU troff テキストフォーマティングシステム |
伝統的には、roff が主な Unix
テキスト処理システムです。roff
(7) と groff
(7) と
groff
(1) と grotty
(1) と
troff
(1) と groff_mdoc
(7) と
groff_man
(7) と groff_ms
(7) と
groff_me
(7) と groff_mm
(7) と
"info groff
" を参照下さい。
groff
パッケージをインストールすると
"/usr/share/doc/groff/
" 中に "-me
"マクロに関する良い入門書や参考書が読めます。
"groff -Tascii -me -
" はANSI
エスケープコードを含むプレーンテキストを生成します。もしマンページのような多くの "^H" や "_"
を含む出力が欲しい場合には、この代わりに "GROFF_NO_SGR=1 groff -Tascii -me -
"
を使います。
groff
が生成した "^H" や "_" をテキストから削除するには、それを "col -b
-x
" でフィルターします。
TeX Live ソフトウエアーディストリビューションは完全な TeX
システムを提供します。texlive
メタパッケージは、ほとんどの一般的タスクに十分な TeX Live パッケージのまともな選択を提供します。
tex
(1)
latex
(1)
これはもっとも強力な組版環境です。多くの SGML
処理ソフトはこれをバックエンドのテキスト処理ソフトとしています。多くの人が Emacs や
Vim をソースのエディターとして使う一方、lyx
パッケージが提供する Lyx と texmacs
パッケージが提供する GNU TeXmacs は洒落た LaTeX のWYSIWYG
編集環境を提供します。
多くのオンラインリソースが利用可能です。
/usr/share/doc/texlive-doc-base/english/texlive-en/live.html
")
(texlive-doc-base
パッケージ)
文書が大きくなると、TeX はエラーを発生する事があります。この問題の解決には (正しくは
"/etc/texmf/texmf.d/95NonPath
" を編集し
update-texmf
(8) を実行することで)
"/etc/texmf/texmf.cnf
" 中のプールの数を増やし修正しなければいけません。
"The TeXbook" の TeX ソースは http://tug.ctan.org/tex-archive/systems/knuth/dist/tex/texbook.tex にあります。
このファイルには必要なマクロのほとんど全てが含まれます。この文書は7から10行をコメントして "\input manmac
\proofmodefalse
" を追加すると tex
(1)
で処理できると聞いた事があります。オンラインバージョンを使うのではなくこの本 (さらに Donald E. Knuth 氏による全ての本)
を購入される事を強く勧めます。しかし、ソースは TeX の入力の非常に良い例です!
次のコマンドでマンページを PostScript で上手く印刷できます。
$ man -Tps some_manpage | lpr
$ man -Tps some_manpage | mpage -2 | lpr
二番目の例は一枚のシートに2ページ印刷します。
プレーンな troff フォーマットでマンページ (マニュアル ページ) を書く事は可能ですが、それを作成するヘルパーパッケージがあります。
表11.15 マンページ作成を補助するパッケージのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
docbook-to-man *
|
V:0.3, I:2 | 240 | SGML→manpage | DocBook SGML から roff man マクロへの変換ソフト |
help2man *
|
V:0.13, I:1.1 | 376 | text→manpage | --help からの自動マンページ生成ソフト |
info2man *
|
V:0.02, I:0.15 | 204 | info→manpage | GNU info から POD かマンページへの変換ソフト |
txt2man *
|
V:0.02, I:0.2 | 88 | text→manpage | ベタの ASCII テキストからマンページ形式へ変換 |
テキストデーター変換のための次のパッケージが著者の目に止まりました。
表11.16 メールデーター変換を補助するパッケージのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
sharutils *
|
V:2, I:32 | 904 | メール |
shar (1) と unshar (1) と
uuencode (1) と uudecode (1)
|
mpack
*
|
V:1.5, I:23 | 84 | MIME |
MIME メッセージの符号化と逆符号化のソフト:
mpack (1) と munpack (1)
|
tnef
*
|
V:0.8, I:1.5 | 164 | ms-tnef | Microsoft のみのフォーマットの "application/ms-tnef" タイプの MIME アタッチメントを開梱 |
uudeview *
|
V:0.17, I:1.6 | 132 | メール | 次のフォーマットのエンコーダーとデコーダー: uuencode, xxencode, BASE64, quoted printable, BinHex |
readpst *
|
V:0.04, I:0.3 | 228 | PST | Microsoft のOutlook PST ファイルから mbox フォーマットへ変換 |
インターネットメッセージアクセスプロトコル バージョン4 (IMAP4) サーバー (「POP3/IMAP4 サーバー」参照) は、プロプライエタリメールシステムのクライアントソフトが IMAP4 サーバーも使えるように設定できる場合、プロプライエタリメールシステムからメールを取り出すのに利用できるかもしれません。
Mail (SMTP) データーは7ビットに限定されるべきです。だからバイナリーデーターや8ビットテキストデーターは7ビットのフォーマットに Multipurpose Internet Mail Extensions (MIME) と選択された文字セット (「符号化方式の基本」参照) を使ってエンコードされます。
標準のメールストレージフォーマットは RFC2822 (RFC822
の更新版) により定義される mbox フォーマットです。mbox
(5)
(mutt
パッケージが提供) を参照下さい。
欧州言語の場合、ほとんど8ビット文字が無いので ISO-8859-1 文字セットとともに
"Content-Transfer-Encoding: quoted-printable
"
が通常メールに使われます。欧州のテキストが UTF-8 符号化された場合、ほとんどが7ビット文字なので
"Content-Transfer-Encoding: quoted-printable
" が大体使われます。
日本語には、テキストを7ビットにしておくために伝統的に "Content-Type: text/plain;
charset=ISO-2022-JP
" がメールに使われます。しかし、古い Microsoft システムは適正な宣言無しに
Shift-JIS でメールデーターを送るかもしれません。日本語のテキストが UTF-8 で符号化される場合、多くの8ビットデーターを含むので
Base64 が大体使われます。他のアジアの言語でも状況は同様です。
もし IMAP4 サーバー (「POP3/IMAP4 サーバー」参照) と話せる非 Debian クライアントからあなたの非 Unix メールデーターがアクセス出きるなら、あなた自身の IMAP4 サーバーを実行することでメールデーターを引き出せるかもしれません。
もし他のメールストレージフォーマットを使っている場合、mbox
フォーマットに移動するのが良い第一歩です。mutt
(1)
のような汎用クライアントプログラムはこれに非常に便利です。
メールボックスの内容は procmail
(1) と formail
(1)
を使って各メッセージに分割できます。
各メールメッセージは mpack
パッケージにある munpack
(1)
(または他の専用ツール) を使って開梱して MIME 符号化された内容を取り出せます。
印刷可能なデーターに用いる次のパッケージが著者の目に止まりました。
表11.17 画像データーツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
gimp
*
|
V:12, I:44 | 13560 | 画像 (bitmap) | GNU イメージ操作プログラム |
imagemagick *
|
V:13, I:35 | 268 | 画像 (bitmap) | 画像操作プログラム |
graphicsmagick *
|
V:1.6, I:3 | 4532 | 画像 (bitmap) |
画像操作プログラム (imagemagick のフォーク)
|
xsane
*
|
V:5, I:36 | 748 | 画像 (bitmap) | GTK+ に基づく SANE (Scanner Access Now Easy) 用の X11 フロントエンド |
netpbm *
|
V:4, I:29 | 4612 | 画像 (bitmap) | 画像変換ツール |
icoutils *
|
V:0.3, I:1.3 | 200 | png↔ico(bitmap) | MS Windows のアイコンやカーソールと PNG フォーマット間の変換 (favicon.ico) |
scribus *
|
V:0.5, I:3 | 26888 | ps/pdf/SVG/… | Scribus DTP エディター |
openoffice.org-draw *
|
V:18, I:40 | 10720 | 画像 (vector) | OpenOffice.org office スイート - ドロー |
inkscape *
|
V:15, I:32 | 87436 | 画像 (vector) | SVG (スケーラブルベクトルグラフィクス) エディター |
dia-gnome *
|
V:1.4, I:2 | 576 | 画像 (vector) | ダイアグラムエディター (GNOME) |
dia
*
|
V:3, I:5 | 572 | 画像 (vector) | ダイアグラムエディター (Gtk) |
xfig
*
|
V:2, I:4 | 1676 | 画像 (vector) | X11 下でインテラクティブ生成するソフト |
pstoedit *
|
V:1.9, I:16 | 708 | ps/pdf→画像(vector) | PostScript と PDF ファイルから編集可能なベクトルグラフィクスへの変換ソフト (SVG) |
libwmf-bin *
|
V:1.4, I:13 | 68 | Windows/画像(vector) | Windows メタファイル (ベクトル画像データー) 変換ツール |
fig2sxd *
|
V:0.03, I:0.2 | 200 | fig→sxd(vector) | XFig ファイルを OpenOffice.org Draw フォーマットに変換 |
unpaper *
|
V:0.2, I:1.7 | 736 | 画像→画像 | OCR 用のスキャンしたページの後処理ツール |
tesseract-ocr *
|
V:0.7, I:3 | 3196 | 画像→テキスト | HP の商用 OCR エンジンの基づくフリーの OCR ソフトウエアー |
tesseract-ocr-eng *
|
V:0.2, I:2 | 1752 | 画像→テキスト | OCR エンジンデーター: tesseract-ocr の英文用言語ファイル |
gocr
*
|
V:0.8, I:5 | 492 | 画像→テキスト | フリー OCR ソフト |
ocrad
*
|
V:0.4, I:4 | 364 | 画像→テキスト | フリー OCR ソフト |
gtkam
*
|
V:0.3, I:1.7 | 1100 | 画像(Exif) | デジタルカメラ写真を操作 (GNOME) - GUI |
gphoto2 *
|
V:0.3, I:2 | 1008 | 画像(Exif) | デジタルカメラ写真ファイルを操作 (GNOME) - コマンドライン |
kamera *
|
V:0.7, I:13 | 312 | 画像(Exif) | デジタルカメラ写真を操作 (KDE) |
jhead
*
|
V:0.5, I:3 | 132 | 画像(Exif) | Exif に準拠の JPEG (デジタルカメラ写真) ファイルの非画像部を操作 |
exif
*
|
V:0.2, I:1.7 | 184 | 画像(Exif) | JPEG ファイル中の EXIF 情報を表示するコマンドラインユーティリティー |
exiftags *
|
V:0.14, I:0.9 | 248 | 画像(Exif) | デジタルカメラの JPEG ファイルから Exif タグを読むユーティリティー |
exiftran *
|
V:0.4, I:3 | 56 | 画像(Exif) | デジタルカメラの jpeg 画像を変換 |
exifprobe *
|
V:0.08, I:0.5 | 484 | 画像(Exif) | デジタル写真からメタデーターを読み出す |
dcraw
*
|
V:0.9, I:5 | 444 | 画像(Raw)→ppm | 生のデジタルカメラ画像のデコード |
findimagedupes *
|
V:0.06, I:0.4 | 140 | 画像→fingerprint | 視覚的に類似もしくは複製の画像を発見 |
ale
*
|
V:0.02, I:0.17 | 768 | 画像→画像 | 忠実度を上げたりモザイクを作成するための画像のマージ |
imageindex *
|
V:0.03, I:0.2 | 192 | 画像(Exif)→html | イメージから静的な HTML ギャラリーを生成 |
f-spot *
|
V:0.5, I:1.8 | 9488 | 画像(Exif) | 個人写真管理アプリケーション (GNOME) |
bins
*
|
V:0.02, I:0.15 | 2008 | 画像(Exif)→html | XML と EXIF タグを使って静的 HTML 写真アルバムを作成 |
gallery2 *
|
V:0.2, I:0.4 | 62548 | 画像(Exif)→html | 閲覧可能なサムネイル付き HTML 写真アルバム生成 |
outguess *
|
V:0.02, I:0.14 | 252 | jpeg,png | 普遍的 Steganographic ツール |
qcad
*
|
V:1.5, I:2 | 3944 | DXF | CAD データーエディター (KDE) |
blender *
|
V:0.5, I:3 | 28336 | blend, TIFF, VRML, … | アニメーション等用の 3D コンテントエディター |
mm3d
*
|
V:0.04, I:0.3 | 4536 | ms3d, obj, dxf, … | OpenGL 準拠の 3D モデルエディター |
open-font-design-toolkit *
|
I:0.03 | 36 | ttf, ps, … | オープンフォントデザイン用のメタパッケージ |
fontforge *
|
V:0.2, I:1.7 | 6612 | ttf, ps, … | PS と TrueType と OpenType のフォント用フォントエディター |
xgridfit *
|
V:0.01, I:0.07 | 1060 | ttf | TrueType フォントをグリッドフィッティングとヒンティング用のプログラム |
gbdfed *
|
V:0.01, I:0.11 | 496 | bdf | BDF フォント用エディター |
aptitude
(8) の正規表現
"~Gworks-with::image
" (「aptitude を使った探索方法」参照) を使ってさらなる画像ツールを探しましょう。
gimp
(1) のような GUI
プログラムは非常に強力ですが、imagemagick
(1)
等のコマンドラインツールはスクリプトでイメージ操作を自動化するのに非常に便利です。
デジタルカメラのファイルフォーマットのデファクト標準は、追加のメタデーター付きの JPEG 画像ファイルフォーマットである交換可能な画像ファイルフォーマット (EXIF) です。EXIF は日付や時間やカメラ設定等の情報を保持できます。
Lempel-Ziv-Welch (LZW) ロス無しデーター圧縮特許の期限は切れました。LZW データー圧縮を使う画像交換フォーマット (GIF) ユーティリティーは Debian システム上でフリーに使えるようになりました。
リムーバブル記録メディア付きのどのデジタルカメラやスキャナーも、カメラファイルシステム用デザインルール に準拠し FAT ファイルシステムを使っているので USB ストレージ読取り機を経由すれば Linux で必ず機能します。「リムーバブルストレージデバイス」参照下さい。
多くのデーター変換プログラムがあります。aptitude
(8)
で"~Guse::converting
" という正規表現 (「aptitude を使った探索方法」参照) を使い次のプログラムが私の目に止まりました。
表11.18 その他のデーター変換ツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
alien
*
|
V:1.2, I:11 | 244 | rpm/tgz→deb | 外来のパッケージの Debian パッケージへの変換ソフト |
freepwing *
|
V:0.00, I:0.03 | 568 | EB→EPWING | "Electric Book" (日本で人気) から単一の JIS X 4081 フォーマット (EPWING V1 のサブセット) への変換ソフト |
RPM フォーマットからのデーター抽出もまた次のようにするとできます。
$ rpm2cpio file.src.rpm | cpio --extract
パッケージされたソースコードを追跡するのに十分な範囲で Debian システム上でプログラムを学ぶ人への指針を示します。次はプログラムの関して特記すべきパッケージと対応する文書パッケージです。
表12.1 プログラムをすることを補助するパッケージのリスト
パッケージ | ポプコン | サイズ | 文書 |
---|---|---|---|
autoconf *
|
V:4, I:25 | 2256 |
autoconf-doc が提供する "info autoconf
|
automake *
|
V:3, I:21 | 1812 |
automake1.10-doc が提供する "info automake "
|
bash
*
|
V:91, I:99 | 3536 |
bash-doc が提供する "info bash "
|
bison
*
|
V:2, I:15 | 1504 |
bison-doc が提供する "info bison "
|
cpp
*
|
V:38, I:82 | 32 |
cpp-doc が提供する "info cpp "
|
ddd
*
|
V:0.3, I:2 | 3852 |
ddd-doc が提供する "info ddd "
|
exuberant-ctags *
|
V:1.2, I:5 | 284 |
exuberant-ctags (1)
|
flex
*
|
V:2, I:15 | 1352 |
flex-doc が提供する "info flex "
|
gawk
*
|
V:28, I:32 | 2172 |
gawk-doc が提供する "info gawk "
|
gcc
*
|
V:17, I:67 | 28 |
gcc-doc が提供する "info gcc "
|
gdb
*
|
V:4, I:22 | 4812 |
gdb-doc が提供する "info gdb "
|
gettext *
|
V:8, I:46 | 7272 |
gettext-doc が提供する "info gettext "
|
gfortran *
|
V:0.9, I:6 | 8 |
gfortran-doc が提供する "info gfortran "
(Fortran 95)
|
gpc
*
|
V:0.07, I:0.5 | 8 |
gcc-doc が提供する "info gcc " (Pascal)
|
fpc
*
|
I:0.4 | 40 |
python-doc が提供する python (1) と html ページ
(Pascal)
|
glade
*
|
V:0.3, I:2 | 1652 | メニューが提供するヘルプ (UI Builder) |
glade-gnome *
|
V:0.09, I:1.2 | 508 | メニューが提供するヘルプ (UI Builder) |
libc6
*
|
V:97, I:99 | 10012 |
glibc-doc と glibc-doc-reference が提供する
"info libc "
|
make
*
|
V:21, I:72 | 1220 |
make-doc が提供する "info make "
|
xutils-dev *
|
V:1.7, I:15 | 1728 |
imake (1), xmkmf (1), 他
|
mawk
*
|
V:66, I:99 | 244 |
mawk (1)
|
perl
*
|
V:88, I:99 | 18528 |
perl-doc と perl-doc-html が提供する
perl (1) と html
|
python *
|
V:62, I:97 | 736 |
python-doc が提供する python (1) と html ページ |
tcl8.4 *
|
V:8, I:46 | 3332 |
tcl8.4-doc が提供する tcl (3) と詳細なマンページ |
tk8.4
*
|
V:5, I:34 | 2712 |
tk8.4-doc が提供する tk (3) と詳細なマンページ |
ruby
*
|
V:9, I:24 | 120 |
ri が提供する ruby (1) と詳細なマンページ |
vim
*
|
V:15, I:33 | 1792 |
vim-doc が提供するヘルプ (F1) メニュー
|
susv2
*
|
I:0.03 | 48 | "The Single Unix Specifications v2" を取得 |
susv3
*
|
I:0.07 | 48 | "The Single Unix Specifications v3" を取得 |
オンラインリファレンスは manpages
と manpages-dev
パッケージをインストールした後で "man name
" とタイプすると使えます。GNU
ツールのオンラインリファレンスは該当する文書パッケージをインストールした後で "info
program_name
" とタイプすると使えます。一部の GFDL 文書は DSFG に準拠していないと考えられているので
main
アーカイブに加えて contrib
や
non-free
アーカイブを含める必要があるかもしれません。
"test
"
を実行可能なテストファイルの名前に用いてはいけません。"test
" はシェルのビルトインです。
ソースから直接コンパイルしたソフトウエアープログラムは、システムプログラムとかち合わないように、"/usr/local
"
か "/opt
" の中にインストールします。
"99ボトルのビールの歌" 作成のコード例はほとんど全てのプログラム言語に関する理解のための非常に好適です。
シェルスクリプトは実行ビットがセットされたテキストファイルで、以下に示すフォーマットのコマンドを含んでいます。
#!/bin/sh ... コマンド行
最初の行はこのファイル内容を読み実行するシェルインタープリタを指定します。
シェルスクリプトを読むのは Unix 的なシステムがどのように機能しているのかを理解する最良の方法です。ここでは、シェルプログラムに関する指針や心がけを記します。失敗から学ぶために "シェルの失敗" (http://www.greenend.org.uk/rjk/2001/04/shell.html) を参照下さい。
シェル対話モード (「シェルプロンプト」と「Unix 的テキスト処理」参照) と異なり、シェルスクリプトは変数や条件文やループを繁用します。
多くのシステムスクリプトは POSIX シェル (表1.13「シェルプログラムのリスト」参照)
のどれで解釈されるか分かりません。システムのデフォールトシェルは実際のプログラムをさしているシムリンクである
"/bin/sh
" です。
bash
(1)、lenny
以前の場合
dash
(1)、squeeze
以降の場合
全ての POSIX シェル間でポータブルとするために bashisms や
zshisms
を使うシェルスクリプトを書くのを避けましょう。checkbashisms
(1) を使うとこれがチェックできます。
表12.2 典型的 bashizms のリスト
推薦: POSIX | 回避すべき: bashism |
---|---|
if [ "$foo" = "$bar" ] ; then …
|
if [ "$foo" == "$bar" ] ; then …
|
diff -u file.c.orig file.c
|
diff -u file.c{.orig,}
|
mkdir /foobar /foobaz
|
mkdir /foo{bar,baz}
|
funcname() { … }
|
function funcname() { … }
|
8進表記: "\377 "
|
16進表記: "\xff "
|
"echo
"
コマンドはその実装がシェルビルトインや外部コマンド間で相違しているので次の注意点を守って使わなければいけません。
-e
" と "-E
" のコマンドオプション使用を回避します。
-n
" 以外のどのコマンドオプション使用をも回避します。
"-n
" オプションは実は POSIX シンタックスではありませんが、一般的に許容されています。
出力文字列にエスケープシーケンスを埋め込む必要がある場合には、"echo
" コマンドの代わりに
"printf
" コマンドを使います。
特別なシェルパラメーターがシェルスクリプト中ではよく使われます。
表12.3 シェル変数のリスト
シェル変数 | 変数値 |
---|---|
$0
|
シェルまたはシェルスクリプトの名前 |
$1
|
最初 (1番目) のシェル引数 |
$9
|
9番目のシェル引数 |
$#
|
シェル引数の数 |
"$*"
|
"$1 $2 $3 $4 … "
|
"$@"
|
"$1" "$2" "$3" "$4" …
|
$?
|
最近実行のコマンドの終了状態 |
$$
|
このシェルスクリプトの PID |
$!
|
最近スタートしたバックグラウンドジョブの PID |
覚えておくべき基本的なパラメーター展開を次に記します。
表12.4 シェル変数展開のリスト
パラメーター式形 |
var が設定されていればの値
|
var が設定されていなければの値
|
---|---|---|
${var:-string}
|
"$var "
|
"string "
|
${var:+string}
|
"string "
|
"null "
|
${var:=string}
|
"$var "
|
"string " (合わせて "var=string " を実行)
|
${var:?string}
|
"$var "
|
"string " をstderr に出力
(エラーとともに exit する)
|
ここで、これら全てのオペレーターのコロン ":
" は実際はオプションです。
:
" 付き = 存在と非ヌル文字列をテストするオペレータ
:
" 無し = 存在のみをテストするオペレータ
表12.5 重要なシェル変数置換のリスト
パラメーター置換形 | 結果 |
---|---|
${var%suffix}
|
最短のサフィクスパターンを削除 |
${var%%suffix}
|
最長のサフィクスパターンを削除 |
${var#prefix}
|
最短のプリフィクスパターンを削除 |
${var##prefix}
|
最長のプリフィクスパターンを削除 |
各コマンドは条件式に使えるエグジットステイタスを返します。
シェル条件文の文脈中の "0" は "真" を意味します、一方 C 条件文の文脈中の "0" は "偽" を意味します。
"[
" は、"]
"
までの引数を条件式として評価する、test
コマンドと等価です。
覚えておくべき基本的な条件文の慣用句は次です。
<command> && <成功したらこのcommandも実行> ||
true
"
<command> || <もしcommandが成功しないとこのコマンドも実行> ||
true
"
if [ <条件式> ]; then <成功ならこのコマンドを実行> else <成功でばいならこのコマンドを実行> fi
ここで、シェルスクリプトが "-e
" フラグ付きで起動された際にシェルスクリプトがこの行で exit
しないようにするために末尾の "|| true
" が必要です。
表12.6 条件式中のファイル比較オペレーター
式 | 論理真を返す条件 |
---|---|
-e <file>
|
<file> 存在する |
-d <file>
|
<file> 存在しディレクトリーである |
-f <file>
|
<file> 存在し通常ファイルである |
-w <file>
|
<file> 存在し書込み可 |
-x <file>
|
<file> 存在し実行可 |
<file1> -nt <file2>
|
<file1> は <file2> より新しい (変更) |
<file1> -ot <file2>
|
<file1> は <file2> より古い (変更) |
<file1> -ef <file2>
|
<file1> と <file2> は同デバイス上の同 inode 番号 |
表12.7 条件式中での文字列比較オペレータのリスト
式 | 論理真を返す条件 |
---|---|
-z <str>
|
<str> の長さがゼロ |
-n <str>
|
<str> の長さが非ゼロ |
<str1> = <str2>
|
<str1> と <str2> は等しい |
<str1> != <str2>
|
<str1> と <str2> は等しく無い |
<str1> < <str2>
|
<str1> は<str2> より前 (ロケール依存) |
<str1> > <str2>
|
<str1> は<str2> より後 (ロケール依存) |
条件式中の算術整数比較演算子は "-eq
"
と "-ne
" と "-lt
" と
"-le
" と "-gt
" と
"-ge
" です。
POSIX シェル中で使われるループの慣用句があります。
for x in foo1 foo2 … ; do コマンド ; done
" は"foo1
foo2 …
" リストの項目を変数 "x
" にアサインし
"コマンド
" を実行してループします。
while 条件 ; do コマンド ; done
" は"条件
"
が真の場合 "コマンド
" を繰り返します。
until 条件 ; do コマンド ; done
" は"条件
"
が真でない場合 "コマンド
" を繰り返します。
break
" に出会うと、ループからの脱出が出来ます。
continue
" に出会うと、次のループ初めに戻りループを再開します。
C 言語のような数字の繰り返しは "foo1 foo2 ...
"
生成に seq
(1) 使って実現します。
「ファイルに関してループしながらコマンドを反復実行」を参照下さい。
シェルはおおよそ次のシーケンスでスクリプトを処理します。
"…"
や '…'
の中なら、行の一部を1つのトークンとしてグループします。
シェルは1行を次のによってトークンに分割します。
<space> <tab> <newline>
< > | ; & ( )
シェルは、もし "…"
や '…'
の中でないなら、各トークンを予約語に対してチェックしその挙動を調整します。
if then elif else fi for in
while unless do done case esac
"…"
や '…'
の中でないなら、エリアスを展開します。
シェルは、もし"…"
や'…'
の中でないなら、ティルドを展開します。
~
" → 現ユーザーのホームディレクトリー
~<user>
" → <user>
のホームディレクトリー
シェルは、もし '…'
の中でないなら、パラメーター"をその値に展開します。
$PARAMETER
"
or "${PARAMETER}
"
シェルは、もし '…'
の中でないなら、コマンドの置き換えを展開します。
$( command )
" → "command
" の出力
` command `
" → "command
" の出力
シェルは、もし "…"
や '…'
の中でないなら、パス名のグロブを展開します。
*
→ いかなる文字
?
→ 1文字
[…]
→ "…
" 中の1つ
シェルはコマンドを次から検索して実行します。
$PATH
" 中の実行ファイル
ダブルクォートの中のシングルクォートは特段の効果はありません。
シェル環境中で "set -x
" を実行したり、シェルを "-x
"
オプションで起動すると、シェルは実行するコマンドを全てプリントするようになります。これはデバグをするのに非常に便利です。
Debian システム上でできるだけポータブルなシェルプログラムとするには、ユーティリティープログラムを essential パッケージで提供されるプログラムだけに制約するのが賢明です。
aptitude search ~E
" はessential (必須) パッケージをリストします。
dpkg -L <パッケージ名> |grep '/man/man.*/'
" は
<パッケージ名>
パッケージによって提供されるコマンドのマンページをリストします。
表12.8 シェルスクリプト用の小さなユーティリティープログラムを含むパッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
coreutils *
|
V:92, I:99 | 13828 | GNU コアユーティリティー |
debianutils *
|
V:93, I:99 | 260 | Debian 限定の雑ユーティリティー |
bsdmainutils *
|
V:81, I:99 | 768 | FreeBSD 由来の追加ユーティリティー集 |
bsdutils *
|
V:77, I:99 | 196 | 4.4BSD-Lite 由来の基本ユーティリティー |
moreutils *
|
V:0.3, I:1.5 | 220 | 追加の Unix ユーティリティー |
moreutils
は Debian
の外では存在しないかも知れませんが、興味深い小さなプログラムを提供します。もっとも特記すべきは、sponge
(8)
です。「正規表現を使ったグローバル置換」を参照下さい。
簡単なシェルプログラムのユーザーインターフェースは、echo
や read
コマンドを使った退屈な相互作用からいわゆる対話 (dialog) プログラム等の一つを使うことでよりよい相互作用になります。
表12.9 ユーザーインターフェースプログラムのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
x11-utils *
|
V:26, I:53 | 652 |
xmessage (1): window 中にメッセージや質問を表示 (X)
|
whiptail *
|
V:42, I:99 | 104 | シェルスクリプトからユーザーフレンリーなダイアログボックスを表示 (newt) |
dialog *
|
V:4, I:25 | 1592 | シェルスクリプトからユーザーフレンリーなダイアログボックスを表示 (ncurses) |
zenity *
|
V:8, I:41 | 4992 | シェルスクリプトからグラフィカルなダイアログボックスを表示 (gtk2.0) |
ssft
*
|
V:0.01, I:0.11 | 152 | シェルスクリプトフロントエンドツール (gettext を使った zenity や kdialog や dialog のラッパー) |
gettext *
|
V:8, I:46 | 7272 |
"/usr/bin/gettext.sh ": メッセージ翻訳
|
dvdisaster
(1) によって RS02 データーを補足した ISO
イメージを生成する簡単なスクリプトの例を次に示します。
#!/bin/sh -e # gmkrs02 : Copyright (C) 2007 Osamu Aoki <osamu@debian.org>, Public Domain #set -x error_exit() { echo "$1" >&2 exit 1 } # Initialize variables DATA_ISO="$HOME/Desktop/iso-$$.img" LABEL=$(date +%Y%m%d-%H%M%S-%Z) if [ $# != 0 ] && [ -d "$1" ]; then DATA_SRC="$1" else # Select directory for creating ISO image from folder on desktop DATA_SRC=$(zenity --file-selection --directory \ --title="Select the directory tree root to create ISO image") \ || error_exit "Exit on directory selection" fi # Check size of archive xterm -T "Check size $DATA_SRC" -e du -s $DATA_SRC/* SIZE=$(($(du -s $DATA_SRC | awk '{print $1}')/1024)) if [ $SIZE -le 520 ] ; then zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="The data size is good for CD backup:\\n $SIZE MB" elif [ $SIZE -le 3500 ]; then zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="The data size is good for DVD backup :\\n $SIZE MB" else zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="The data size is too big to backup : $SIZE MB" error_exit "The data size is too big to backup :\\n $SIZE MB" fi # only xterm is sure to have working -e option # Create raw ISO image rm -f "$DATA_ISO" || true xterm -T "genisoimage $DATA_ISO" \ -e genisoimage -r -J -V "$LABEL" -o "$DATA_ISO" "$DATA_SRC" # Create RS02 supplemental redundancy xterm -T "dvdisaster $DATA_ISO" -e dvdisaster -i "$DATA_ISO" -mRS02 -c zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="ISO/RS02 data ($SIZE MB) \\n created at: $DATA_ISO" # EOF
デスクトップに "/usr/local/bin/gmkrs02 %d
"
のようなコマンド設定をしたローンチャを作るのも面白いかもしれません。
Make
はプログラムのグループを管理するためのユーティリティーです。make
(1)
を実行すると、make
は"Makefile
"
というルールファイルを読み、ターゲットが最後に変更された後で変更された前提ファイルにターゲットが依存している場合やターゲットが存在しない場合にはターゲットを更新します。このような更新は同時並行的にされるかもしれません。
ルールファイルのシンタックスは次です。
ターゲット: [ 前提 ... ] [TAB] command1 [TAB] -command2 # エラー無視 [TAB] @command3 # エコー抑制
上記で、" [TAB]
" は TAB コードです。各行は make
による変数置換後シェルによって解釈されます。スクリプトを継続する行末には "\
"
を使います。シェルスクリプトの環境変数のための "$
" を入力するためには
"$$
" を使います。
ターゲットや前提に関するインプリシット (暗黙) ルールは、例えば次のように書けます。
%.o: %.c header.h
上記で、ターゲットは "%
" という文字を (1つだけ)
含んでいます。"%
"
は実際のターゲットファイル名の空でないいかなる部分文字列ともマッチします。前提もまた同様にそれらの名前が実際のターゲットファイル名にどう関連するかを示すために
"%
" を用いることができます。
表12.10 make の自動変数のリスト
自動変数 | 変数値 |
---|---|
$@
|
ターゲット |
$<
|
最初の前提条件 |
$?
|
全ての新規の前提条件 |
$^
|
全ての前提条件 |
$*
|
"% " はターゲットパターンの軸にマッチします
|
"make -p -f/dev/null
" を実行して自動的な内部ルールを確認下さい。
C プログラム言語で書かれたプログラムをコンパイルする適正な環境を次のようにして設定できます。
# apt-get install glibc-doc manpages-dev libc6-dev gcc build-essential
GNU C ライブラリーパッケージである libc6-dev
パッケージは、C
プログラム言語で使われるヘッダーファイルやライブラリールーチンの集合である C
標準ライブラリーを提供します。
C のリファレンスは以下を参照下さい。
info libc
" (C ライブラリー関数リファレンス)
gcc
(1) と "info gcc
"
各 C ライブラリー関数名
(3)
簡単な例の "example.c
" は"libm
"
ライブラリーを使って実行プログラム "run_example
" に次のようにしてコンパイル出来ます。
$ cat > example.c << EOF #include <stdio.h> #include <math.h> #include <string.h> int main(int argc, char **argv, char **envp){ double x; char y[11]; x=sqrt(argc+7.5); strncpy(y, argv[0], 10); /* prevent buffer overflow */ y[10] = '\0'; /* fill to make sure string ends with '\0' */ printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]); return 0; } EOF $ gcc -Wall -g -o run_example example.c -lm $ ./run_example 1, 2.915, ./run_exam, (null) $ ./run_example 1234567890qwerty 2, 3.082, ./run_exam, 1234567890qwerty
ここで、"-lm
" はsqrt
(3) のために
libc6
パッケージで提供されるライブラリー
"/usr/lib/libm.so
" をリンクするのに必要です。実際のライブラリーは
"/lib/
" 中にあるファイル名 "libm.so.6
" で、それは
"libm-2.7.so
" にシムリンクされています。
出力テキスト中の最後のパラメーターを良く見ましょう。"%10s
"
が指定されているにもかかわらず10文字以上あります。
上記のオーバーラン効果を悪用するバッファーオーバーフロー攻撃を防止のために、sprintf
(3) や
strcpy
(3) 等の境界チェック無しのポインターメモリー操作関数の使用は推奨できません。これに代えて
snprintf
(3) や strncpy
(3) を使います。
デバグは重要なプログラム活動です。プログラムのデバグをどうしてするかを知っていることで、あなたも意味あるバグリポートを作成できる良い Debian ユーザーになれます。
Debian 上の第一義的デバッガは、実行中のプログラムを検査できるようにする
gdb
(1) です。
gdb
と関連プログラムを次のようにインストールしましょう。
# apt-get install gdb gdb-doc build-essential devscripts
gdb
の良い入門書は "info gdb
" とかネット上に色々あります。次は gdb
(1)
を"-g
" を使ってデバグ情報を付けてコンパイルされた "program
"
に使う簡単な例です。
$ gdb program (gdb) b 1 # set break point at line 1 (gdb) run args # run program with args (gdb) next # next line ... (gdb) step # step forward ... (gdb) p parm # print parm ... (gdb) p parm=12 # set value to 12 ... (gdb) quit
多くの gdb
(1) コマンドは省略できます。タブ展開はシェル同様に機能します。
Debian
システムではデフォールトではインストールされたバイナリーはストリップされているべきなので、通常のパッケージではほとんどのデバグシンボルが削除されています。gdb
(1)
を使って Debian パッケージをデバグするには、対応する *-dbg
パッケージをインストールする必要があります (例えば libc6
の場合
libc6-dbg
)。
デバグしようとしているパッケージに *-dbg
パッケージが無い場合は、次のようにしてリビルドした後でインストールする必要があります。
$ mkdir /path/new ; cd /path/new $ sudo apt-get update $ sudo apt-get dist-upgrade $ sudo apt-get install fakeroot devscripts build-essential $ sudo apt-get build-dep source_package_name $ apt-get source package_name $ cd package_name*
必要に応じてバグを修正します。
例えば次のように、既存パッケージを再コンパイルする時は "+debug1
"
を後ろに付けたり、リリース前のパッケージをコンパイルする時は "~pre1
" を後ろに付けたりと、正規の
Debian バージョンとかち合わないようにパッケージバージョンを増やします。
$ dch -i
次のようにしてデバグシンボル付きでパッケージをコンパイルしてインストールします。
$ export DEB_BUILD_OPTIONS=nostrip,noopt $ debuild $ cd .. $ sudo debi package_name*.changes
パッケージのビルドスクリプトを確認して、バイナリーのコンパイルに確実に "CFLAGS=-g -Wall
"
が使われているようにします。
プログラムがクラッシュするのに出会った場合に、バックトレース情報をバグレポートに切り貼りして報告するのは良い考えです。
バックトレースは次のような段取りで得られます。
gdb
(1) の下でプログラム実行します。
クラッシュを再現します。
gdb
プロンプトに落ちて戻るようになります。
gdb
プロンプトで "bt
" とタイプします。
プログラムがフリーズした場合には、gdb
を実行しているターミナルで
Ctrl-C
を押すことでプログラムをクラッシュさせて gdb
プロンプトが得られます。
しばしば、一番上数行が "malloc()
" か "g_malloc()
"
中にあるバックトレースを見かけます。こういったことが起こる場合は、大体あまりあなたのバックトレースは役に立ちません。有用な情報を見つけるもっとも簡単な方法は環境変数
"$MALLOC_CHECK_
" の値を 2と設定することです
(malloc
(3))。gdb
を実行しながらこれを実行するには次のようにします。
$ MALLOC_CHECK_=2 gdb hello
表12.12 上級 gdb コマンドのリスト
コマンド | コマンド目的の説明 |
---|---|
(gdb) thread apply all bt
|
マルチスレッドプログラムの全てのスレッドのバックトレースを取得 |
(gdb) bt full
|
関数コールのスタック上に来たパラメーターを取得 |
(gdb) thread apply all bt full
|
異常のオプションの組み合わせでバックトレースとパラメーターを取得 |
(gdb) thread apply all bt full 10
|
無関係の出力を切り最後の10のコールに関するバックトレースとパラメーターを取得 |
(gdb) set logging on
|
gdb アウトプットをファイルに書き出す (デフォールトは
"gdb.txt ")
|
GNOME プログラム preview1
が X エラーを受けると、次のようなメッセージが見つかります。
The program 'preview1' received an X Window System error.
このような場合には、プログラムを "--sync
" 付きで実行して、バックトレースを得るために
"gdk_x_error
" 関数上で停止するようにしてみましょう。
次のように ldd
(1) を使ってプログラムのライブラリーへの依存関係をみつけだします。
$ ldd /bin/ls librt.so.1 => /lib/librt.so.1 (0x4001e000) libc.so.6 => /lib/libc.so.6 (0x40030000) libpthread.so.0 => /lib/libpthread.so.0 (0x40153000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
`chroot` された環境下で ls
(1) が機能するには、上記ライブラリーがあなたの `chroot`
された環境内で使える必要があります。
「プログラム活動の追跡」を参照下さい。
Debian にはメモリーリークを検出するプログラムがいくつか存在します。
表12.13 メモリーリーク検出ツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
libc6-dev *
|
V:46, I:68 | 11292 |
mtrace (1): glibc 中の malloc デバッグ機能
|
valgrind *
|
V:1.3, I:6 | 136416 | メモリーデバッガとプロファイラ |
kmtrace *
|
V:0.3, I:2 | 324 |
glibc のmtrace (1) を使う KDE メモリーリークトレースソフト
|
alleyoop *
|
V:0.05, I:0.3 | 596 | メモリーチェックソフトの GNOME フロントエンド |
electric-fence *
|
V:0.05, I:0.8 | 120 |
malloc (3) デバッガ
|
leaktracer *
|
V:0.01, I:0.11 | 116 | C++ プログラム用のメモリーリーク追跡ソフト |
libdmalloc5 *
|
V:0.01, I:0.2 | 356 | メモリーアロケーションのデバグ用ライブラリー |
mpatrolc2 *
|
V:0.00, I:0.01 | 3592 | メモリーアロケーションをデバグするライブラリー |
表12.14 静的コード分析ツールのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
splint *
|
V:0.06, I:0.5 | 1836 | C プログラムを静的にバグのチェックするためのツール |
rats
*
|
V:0.06, I:0.2 | 876 | セキュリティーの大まかな監査ツール (C, C++, PHP, Perl, Python コード) |
flawfinder *
|
V:0.01, I:0.15 | 192 | C/C++ ソースコードを検査してセキュリティーの脆弱性を探すツール |
perl
*
|
V:88, I:99 | 18528 |
静的コードチェックソフト付きのインタープリタ: B::Lint (3perl)
|
pylint *
|
V:0.2, I:0.7 | 576 | Python コード静的チェックソフト |
jlint
*
|
V:0.01, I:0.09 | 156 | Java プログラム静的チェックソフト |
weblint-perl *
|
V:0.10, I:0.7 | 28 | HTML 用のシンタックス最小限の文体チェックソフト |
linklint *
|
V:0.05, I:0.3 | 432 | 高速リンクチェックソフトとウェッブサイトメンテツール |
libxml2-utils *
|
V:3, I:49 | 160 |
XML ファイルを検証する xmllint (1) を含むユーティリティー
|
flex
(1) の入門書は "info flex
" の中にあります。
自分で作った "main()
" と "yywrap()
"
を供給する必要があります。そうでない場合にはあなたの flex プログラムは次のようでなければライブラリー無しにコンパイル出来ません。これというのは
"yywrap
" はマクロで、"%option main
" とすると
"%option noyywrap
" が暗示的に有効になるからです。
%option main %% .|\n ECHO ; %%
上記の代わりにとして、cc
(1) のコマンドラインの最後に (ちょうど AT&T-Lex
が"-ll
" 付きであるように) "-lfl
"
リンカーオプションを使いコンパイルすることが出来ます。この場合、"%option
" は必要なくなります。
Yacc 互換の前方参照可能な LR パーサーとか LALR パーサー生成ソフトは、いくつかのパッケージによって Debian 上で提供されています。
表12.15 Yacc 互換の LALR パーサー生成ソフトのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
bison
*
|
V:2, I:15 | 1504 | GNU LALR パーサー生成ソフト |
byacc
*
|
V:0.09, I:1.2 | 168 | Berkeley LALR パーサー生成ソフト |
btyacc *
|
V:0.00, I:0.07 | 248 |
byacc に基づいたバックトラッキング機能付きパーサー生成ソフト
|
bison
(1) の入門書は "info bison
" の中にあります。
あなた自身の "main()
" と "yyerror()
"
を供給する必要があります。"main()
" は、しばしば Flex によって提供される
"yylex()
" を呼び出す "yyparse()
" を呼び出します。
%% %%
Autoconf は自動的にソフトウエアーのソースコードパッケージを GNU のビルドシステムを使って種々様々な Unix 的システムに適応させるためのシェルスクリプトを作成するツールです。
autoconf
(1) は"configure
"
という設定プログラムを作成します。"configure
"
は"Makefile.in
" を雛形として使って自動的にカスタム化した
"Makefile
" を作成します。
システムファイルをあなたがコンパイルしたプログラムでインストールする時に上書きしてはいけません。
Debian は"/usr/local/
" とか "/opt
"
中のファイルに触れません。プログラムをソースからコンパイルする場合、Debian とかち合わないようにそれを
"/usr/local/
" の中にインストールします。
$ cd src $ ./configure --prefix=/usr/local $ make $ make install # this puts the files in the system
オリジナルのソースを保有し、それが
autoconf
(1)/automake
(1)
と使用しあなたがそれをどう設定したかを覚えているなら、次のように実行してソフトウエアーをアンイストールします。
$ ./configure ''all-of-the-options-you-gave-it'' # make uninstall
この代わりに、"/usr/local/
"
の下にだけインストールプロセスがファイルを置いたことが絶対に確実でそこに重要なものが無いなら、次のようにしてその内容を消すことが出来ます。
# find /usr/local -type f -print0 | xargs -0 rm -f
どこにファイルがインストールされるか良く分からない場合には、checkinstall
パッケージにある
checkinstall
(8)
を使いアンインストールする場合クリーンなパスとなるようにすることを考えましょう。これは "-D
"
オプションを使うと Debian パッケージを作成できます。
どんな AWK スクリプトでも a2p
(1)
を使えば自動的に Perl に書き換えられますが、1行 AWK スクリプトから1行 Perl
スクリプトへの変換は手動変換するのが最良です。
次の AWK スクリプト断片を考えます。
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 -lane 'print$F[2]if$F[1]eq+1957' |
最後のスクリプトは謎々状態です。Perl の次の機能を利用しています。
コマンドラインオプションに関しては perlrun
(1) を参照下さい。もっとクレージーな Perl
スクリプトに関しては、Perl ゴルフが面白いです。
基本的な対話式動的ウェッブページは次のようにして作られます。
フォームのエントリーを埋めたりクリックすることによって次の符号化されたパラメーター付きの URL 文字列をブラウザーからウェッブサーバーに送信します。
http://www.foo.dom/cgi-bin/program.pl?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
"
http://www.foo.dom/cgi-bin/program.py?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
"
http://www.foo.dom/program.php?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
"
%nn
" は16進数で nn
の値の文字と置き換えられます。
QUERY_STRING="VAR1=VAL1 VAR2=VAL2
VAR3=VAL3"
".
program.*
" のいずれでも) が環境変数
"$QUERY_STRING
" とともに起動されます。
STDOUT
(標準出力)
がウエブブラウザーに送られ対話式の動的なウェッブページとして表示されます。
セキュリティー上、CGI パラメーターを解釈する手作りの急ごしらえのプログラムは作らない方が賢明です。Perl や Python にはこのための確立したモジュールが存在します。PHP はこの様な機能とともに提供されます。クライアントでのデーターのストレージの必要がある場合、HTTP クッキーが使われます。クライアントサイドのデーター処理が必要な場合、Javascript が良く使われます。
詳しくは、Common Gateway Interface や The Apache Software Foundation や JavaScript を参照下さい。
http://www.google.com/search?hl=en&ie=UTF-8&q=CGI+tutorial を URL として直接ブラウザーのアドレスに入れ Google で"CGI tutorial" を検索するとグーグルサーバー上の CGI スクリプトが動いているのを観察する良い例です。
ソースコード変換するプログラムがあります。
表12.16 ソースコード変換ツールのリスト
パッケージ | ポプコン | サイズ | キーワード | 説明 |
---|---|---|---|---|
perl
*
|
V:88, I:99 | 18528 | AWK→PERL |
AWK から PERL へのソースコード変換シフト: a2p (1)
|
f2c
*
|
V:0.12, I:1.2 | 448 | FORTRAN→C |
FORTRAN 77 から C/C++ へのソースコード変換ソフト: f2c (1)
|
protoize *
|
V:0.00, I:0.09 | 100 | ANSI C | C コードから ANSI プロトタイプを生成/削除 |
intel2gas *
|
V:0.01, I:0.07 | 344 | intel→gas | NASM (Intel フォーマット) から GNU Assembler (GAS) への変換ソフト |
Debian パッケージを作りたい場合には、次を読みましょう。
debuild
(1) と pbuilder
(1) と
pdebuild
(1)
maint-guide
パッケージ)
developers-reference
パッケージ)
debian-policy
パッケージ)
dh-make
や dh-make-perl
等のようなパッケージングを補助するパッケージもあります。
以下が本文書の背景です。
Linux システムはネットワーク化されたコンピューターのための非常にパワフルなコンピュータープラットフォームです。しかし、Linux の全能力を利用する方法を学ぶことはたやすいことではありません。非 PostScript プリンタが接続された LPR プリンタの設定がこんなつまずく点の良い例でした。(新規インストレーションでは CUPS システムが使われるのでもうこの様な問題はありません。)
"ソースコード" という完全かつ詳細なマップが存在します。これは非常に正確ですが理解することが難しいものです。また、HOWTO や mini-HOWTO と呼ばれるリファレンスもあります。これらは理解はしやすいのですが、詳細過ぎて全体像を失いがちです。ちょっとコマンドを実行する必要がある時に、長大な HOWTO の該当する章を探すのには骨が折れることが時々あります。
この "Debian リファレンス (第2版)" が Debian 迷路の真っ只中にいる皆様にとって解決の糸口となることを望みます。
Debian リファレンスは青木 修 <osamu at debian dot org> が自分のためのシステム管理メモとして書きはじめました。多くの内容が debian-user メーリングリストや他の Debian のリソースから得られた知識由来です。
当時 Debian Documentation Project で非常にアクティブであった、Josip Rodin 氏の助言に従い、 DDP 文書の一部として "Debian リファレンス (第1版、2001-2007)"を作りました。
6年経った時点で、青木はオリジナルの "Debian リファレンス (第1版、2001-2007)" が時代遅れとなっている事に気づき多くの内容を書き換え始めました。新たな "Debian リファレンス (第2版)" が2008年にリリースされました。
チュートリアルの内容はその内容とインスピレーションを次から得ました。
"Linux User's Guide" Larry Greenfield 著 (1996年12月)
"Debian Tutorial" Havoc Pennington 著。 (1998年12年11日)
"Debian GNU/Linux: Guide to Installation and Usage" John Goerzen and Ossama Othman 著(1999年)
パッケージやアーカイブに関する記述はそのオリジンやインスピレーションの一部を次に遡ることができます。
他の内容はそのオリジンやインスピレーションを次に遡ることができます。
"Debian リファレンス (第1版)" 青木 修著 (2001年〜2007年)
以前の "Debian リファレンス (第1版)" は次によって作られました。
Debian システム上の多くのマニュアルページや info ページが本文書を書く上での第一義的参照情報として使われました。青木 修が公正な使用と考える範囲内で、それらの多くの部分、特にコマンドの定義が、本文書の文体と目的に合うように注意深い編集をした後、断片的文言として使われました。
gdb デバッガーに関する記述は Arii Pollak と Loïc Minier と Dafydd Harries の了承のもと backtrace に関する Debian wiki の内容を拡張して使いました。
既に上記で触れた項目を除くほとんどの "Debian リファレンス (第2版)" の内容は私自身の仕事です。これらはコントリビュータ−によっても更新されています。
"Debian リファレンス (第1版)" は、角田 慎一さんがすべて日本語訳しました。
"Debian リファレンス (第2版)" は、英文原著者の青木修自身がすべてを日本語訳しました。その際に "Debian リファレンス (第1版)" から内容が比較的変更されていない「第1章 GNU/Linux チュートリアル」等では、角田さんの旧訳文を青木が文体や内容を調整した上で一部再利用させて頂きました。
著者である青木 修は本文書を世に送ることにご助力戴いた皆様に感謝いたします。
英語のオリジナル文書のソースは AsciiDoc のテキストファイルを用いて書かれました。AsciiDoc は直接 XML を書くより手間がかからないのとテーブルを分かりやすいフォーマットで入力出きるので使われています。XML と PO ファイルを真のソースファイルと考えて下さい。ビルドスクリプトによって DocBook XML ソースに変換され、更に自動的に生成されるデーターを埋め込み最終的な DocBook XML ソースとされました。本文書は HTML とプレーンテキストと PostScript と PDF として見ることができます。現在は HTML とプレーンテキストへの変換のみが有効とされています。