Debianリファレンス

青木 [FAMILY Given]

本Debianリファレンス(第2版) (2010-01-18 09:25:10 UTC) はシステムインストール後のユーザー案内書として、Debian システムの広範な概論を提供します。本書は非開発者を対象にシェルコマンド例を通してシステム管理の多くの局面を説明します。

概要

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の条件の下ででも再配布や改変をすることを許可します。)


目次

序章
1. 免責事項
2. Debianとはなにか
3. 本書について
3.1. 編集指針
3.2. 前提条件
3.3. 文書様式
3.4. Debian BTS
3.5. ポプコン
3.6. パッケージサイズ
3.7. 本書へのバグ報告
4. 新規ユーザーへの引用文
1. GNU/Linuxチュートリアル
1.1. コンソールの基礎
1.1.1. シェルプロンプト
1.1.2. Xの下でのシェルプロンプト
1.1.3. rootアカウント
1.1.4. rootシェルプロンプト
1.1.5. GUIのシステム管理ツール
1.1.6. 仮想コンソール
1.1.7. コマンドプロンプトからの退出方法
1.1.8. システムをシャットダウンする方法
1.1.9. まともなコンソールの復元
1.1.10. 初心者向け追加パッケージの提案
1.1.11. 追加のユーザーアカウント
1.1.12. sudoの設定
1.1.13. お遊びの時間
1.2. Unix-likeファイルシステム
1.2.1. Unixファイルの基礎
1.2.2. ファイルシステムの内側
1.2.3. ファイルシステムのパーミッション
1.2.4. 新規作成ファイルのパーミッションのコントロール:umask
1.2.5. ユーザーのグループ(group)のパーミッション
1.2.6. タイムスタンプ
1.2.7. リンク
1.2.8. 名前付きパイプ(FIFO)
1.2.9. ソケット
1.2.10. デバイスファイル
1.2.11. 特別なデバイスファイル
1.2.12. procfsとsysfs
1.3. ミッドナイトコマンダー(MC)
1.3.1. MCのカスタム化
1.3.2. MCの始動
1.3.3. MCのファイルマネージャー
1.3.4. MC のコマンドライントリック
1.3.5. MCの内部エディター
1.3.6. MCの内部ビューワー
1.3.7. MCの自動起動機能
1.3.8. MCのFTP仮想ファイルシステム
1.4. 基本のUnix的作業環境
1.4.1. loginシェル
1.4.2. Bashのカスタム化
1.4.3. 特別のキーストローク
1.4.4. Unix流のマウス操作
1.4.5. ページャー
1.4.6. テキストエディター
1.4.7. デフォールトのテキストエディターの設定
1.4.8. Vimのカスタム化
1.4.9. シェル活動の記録
1.4.10. 基本Unixコマンド
1.5. シェルプロンプト
1.5.1. コマンド実行と環境変数
1.5.2. "$LANG"変数
1.5.3. "$PATH"変数
1.5.4. "$HOME"変数
1.5.5. コマンドラインオプション
1.5.6. シェルグロブ
1.5.7. コマンドの戻り値
1.5.8. 典型的なコマンドシーケンスとシェルリディレクション
1.5.9. コマンドエリアス
1.6. Unix的テキスト処理
1.6.1. Unixテキストツール
1.6.2. 正規表現
1.6.3. 置換式
1.6.4. 正規表現を使ったグローバル置換
1.6.5. テキストファイルからのデーター抽出
1.6.6. コマンドをパイプするためのスクリプト断片
2. Debianパッケージ管理
2.1. Debainパッケージ管理の前提条件
2.1.1. パッケージ設定
2.1.2. 基本的な注意事項
2.1.3. 永遠のアップグレード人生
2.1.4. Debianアーカイブの基本
2.1.5. パッケージ依存関係
2.1.6. パッケージ管理のイベントの流れ
2.1.7. パッケージ管理のトラブルへの応急対処法
2.2. 基本的パッケージ管理操作
2.2.1. コマンドラインによる基本的なパッケージ管理操作
2.2.2. aptitudeのインタラクティブな使用
2.2.3. aptitudeのキーバインディング
2.2.4. aptitudeの下でのパッケージの表示
2.2.5. aptitudeを使った探索方法
2.2.6. aptitudeのregex式
2.2.7. aptitudeによる依存関係の解決
2.2.8. パッケージアクティビティーログ
2.2.9. Aptitudeの長所
2.3. aptitude操作例
2.3.1. regexにマッチするパッケージ名のパッケージをリスト
2.3.2. regexマッチをしての閲覧
2.3.3. パッケージの完全削除
2.3.4. 自動/手動インストール状態の整理
2.3.5. aptitudeを使ったシステム全体のアップグレード
2.4. 高度なパッケージ管理操作
2.4.1. コマンドラインによる高度なパッケージ管理操作
2.4.2. インストールされたパッケージファイルの検証
2.4.3. パッケージ問題からの防御
2.4.4. パッケージメタデーターの検索
2.5. Debianパッケージ管理の内部
2.5.1. アーカイブのメタデーター
2.5.2. トップレベルの"Release"ファイルと信憑性
2.5.3. アーカイブレベルの"Release"ファイル
2.5.4. パッケージメタデーターの取得
2.5.5. APTに関するパッケージ状態
2.5.6. aptitudeに関するパッケージ状態
2.5.7. 取得したパッケージのローカルコピー
2.5.8. Debianパッケージファイル名
2.5.9. dpkgコマンド
2.5.10. update-alternativeコマンド
2.5.11. dpkg-statoverrideコマンド
2.5.12. dpkg-divertコマンド
2.6. 壊れたシステムからの復元
2.6.1. 古いユーザーの設定との非互換性
2.6.2. 重複するファイルを持つ相異なるパッケージ
2.6.3. 壊れたパッケージスクリプトの修正
2.6.4. dpkgコマンドを使っての救済
2.6.5. パッケージセレクションの復元
2.7. パッケージ管理のヒント
2.7.1. Debianパッケージの選択方法
2.7.2. 混合したアーカイブソースからのパッケージ
2.7.3. 候補バージョンの調整
2.7.4. VolatileとBackports.org
2.7.5. パッケージの自動ダウンロードとアップグレード
2.7.6. APTのよるダウンロードバンド幅の制限
2.7.7. 緊急ダウングレード
2.7.8. 誰がパッケージをアップロードしたのか?
2.7.9. equivsパッケージ
2.7.10. 安定版システムへのパッケージ移植
2.7.11. APTのためのプロキシサーバー
2.7.12. 小さな公開パッケージアーカイブ
2.7.13. システム設定の記録とコピー
2.7.14. 外来のバイナリーパッケージの変換やインストール
2.7.15. dpkgを使わないパッケージの開梱
2.7.16. パッケージ管理の追加参考文書
3. システムの初期化
3.1. ブートストラッププロセスの概要
3.2. 1段目: BIOS
3.3. 2段目: ブートローダー
3.4. 3段目: ミニDebianシステム
3.5. 4段目: 通常のDebianシステム
3.5.1. ランレベルの意味
3.5.2. ランレベルの設定
3.5.3. ランレベル管理例
3.5.4. 各initスクリプトのデフォールトのパラメーター
3.5.5. ホスト名
3.5.6. ファイルシステム
3.5.7. ネットワークインターフェースの初期化
3.5.8. ネットワークサービスの初期化
3.5.9. システムメッセージ
3.5.10. カーネルメッセージ
3.5.11. udevシステム
3.5.12. カーネルモジュール初期化
4. 認証
4.1. 通常のUnix認証
4.2. アカウントとパスワードの情報管理
4.3. 良好なパスワード
4.4. 暗号化されたパスワード作成
4.5. PAM と NSS
4.5.1. PAMとNSSによってアクセスされる設定ファイル
4.5.2. 最新の集中システム管理
4.5.3. 「どうしてGNUのsuはwheelグループをサポートしないのか」
4.5.4. パスワード規則強化
4.6. 他のアクセスコントロール
4.6.1. sudo
4.6.2. SELinux
4.6.3. サーバーのサービスへのアクセスの制限
4.7. 認証のセキュリティー
4.7.1. インターネット経由のセキュアーなパスワード
4.7.2. セキュアーシェル
4.7.3. インターネットのためのセキュリティー強化策
4.7.4. rootパスワードのセキュリティー確保
5. ネットワークの設定
5.1. 基本的ネットワークインフラ
5.1.1. ドメイン名
5.1.2. ホスト名の解決
5.1.3. ネットワークインターフェース名
5.1.4. LANのためのネットワークアドレス範囲
5.1.5. ネットワーク設定インフラ
5.1.6. ネットワークデバイスサポート
5.2. ネットワーク接続方法
5.2.1. イーサーネットを使ってのDHCP接続
5.2.2. イーサーネットを使っての静的IP接続
5.2.3. pppconfigを使ってのPPP接続
5.2.4. wvdialconfを使った代替PPP接続
5.2.5. pppoeconfを使ったPPPoE接続
5.3. ifupdownを使った基本的なネットワーク設定
5.3.1. 簡略化されたコマンドシンタックス
5.3.2. "/etc/network/interfaces"の基本的なシンタックス
5.3.3. ループバックネットワークインターフェース
5.3.4. DHCPサービスを受けるネットワークインターフェース
5.3.5. 静的IPを使うネットワークインターフェース
5.3.6. ワイアレスLANインターフェースの基本
5.3.7. WPA/WPA2を使うワイアレスLANインターフェース
5.3.8. WEPを使うワイアレスLANインターフェース
5.3.9. PPP接続
5.3.10. 代替のPPP接続
5.3.11. PPPoE接続
5.3.12. ifupdownのネットワーク設定状態
5.3.13. 基本ネットワーク設定
5.3.14. ifupdown-extraパッケージ
5.4. ifupdownを使う上級ネットワーク設定
5.4.1. ifplugdパッケージ
5.4.2. ifmetricパッケージ
5.4.3. 仮想インターフェース
5.4.4. 上級コマンドシンタックス
5.4.5. mappingスタンザ
5.4.6. 手動切り替え可能なネットワーク設定
5.4.7. ifupdownシステムを使うスクリプト
5.4.8. guessnetを使うmapping
5.5. デスクトップのためのネットワーク設定
5.5.1. GUIのネットワーク設定ツール
5.5.2. 自動ネットワーク設定
5.6. 低レベルネットワーク設定
5.6.1. Iproute2コマンド
5.6.2. 安全な低レベルネットワーク操作
5.7. ネットワークの最適化
5.7.1. 最適MTUの発見
5.7.2. MTUの設定
5.7.3. WAN TCPの最適化
5.8. Netfilterインフラ
6. ネットワークアプリケーション
6.1. ウェッブブラウザー
6.1.1. ブラウザー設定
6.2. メールシステム
6.2.1. 近代的メールサービスの基礎
6.2.2. ワークステーションのメール設定戦略
6.3. メールトランスポートエージェント(MTA)
6.3.1. exim4設定
6.3.2. SASLを使うpostfixの設定
6.3.3. メールアドレス設定
6.3.4. 基本的なMTAの操作
6.4. メールユーザーエージェント(MUA)
6.4.1. 基本MUA — Mutt
6.5. リモートメールの取得および転送ユーティリティー
6.5.1. getmailの設定
6.5.2. fetchmailの設定
6.6. フィルター付きのメールデリバリーエージェント(MDA)
6.6.1. maildropの設定
6.6.2. procmailの設定
6.6.3. mboxの内容の再配達
6.7. POP3/IMAP4サーバー
6.8. プリントサーバーとユーティリティー
6.9. リーモートアクセスサーバーとユーティリティー(SSH)
6.9.1. SSHの基本
6.9.2. SMTP/POP3トンネルをするためのポートフォワーディング
6.9.3. リモートパスワード無しでの接続
6.9.4. 外部SSHクライアントへの対処法
6.9.5. ssh-agentの設定
6.9.6. SSH上のリモートシステムをシャットダウンする方法
6.9.7. SSHのトラブルシュート
6.10. 他のネットワークアプリケーションサーバー
6.11. 他のネットワークアプリケーションクライアント
6.12. システムデーモンの診断
7. X Windowシステム
7.1. 重要パッケージ
7.2. デスクトップ環境の設定
7.2.1. Debianメニュー
7.2.2. Freedesktop.orgメニュー
7.2.3. GNOMEデスクトップ環境下のDebianメニュー
7.3. サーバー/クライアント関係
7.4. Xサーバー
7.4.1. Xサーバーの(再)設定
7.4.2. Xサーバーへの接続方法
7.5. X Windowシステムの起動
7.5.1. gdmでXセッションをスタート
7.5.2. Xセッションのカスタム化(古典的方法)
7.5.3. Xセッションのカスタム化(新方法)
7.5.4. リモートXクライアントをSSH経由で接続
7.5.5. インターネット経由のセキュアーなXターミナル
7.6. X Windowでのフォント
7.6.1. 基本的フォント
7.6.2. 追加のフォント
7.6.3. CJKフォント
7.7. Xアプリケーション
7.7.1. Xオフィスアプリケーション
7.7.2. Xユーティリティーアプリケーション
7.8. Xトリビア
7.8.1. Xでのキーマップとポインターボタンのマッピング
7.8.2. 古典的Xクライアント
7.8.3. Xターミナルエミュレーター — xterm
7.8.4. Xクライアントをrootで実行
8. I18NとL10N
8.1. キーボード入力
8.1.1. SCIMを使うインプットメソッドのサポート
8.1.2. 日本語の例
8.1.3. インプットメソッドを無効化
8.2. ディスプレー出力
8.3. ロケール
8.3.1. 符号化方式の基本
8.3.2. UTF-8ロケールを使う根拠
8.3.3. ロケールの再設定
8.3.4. "$LANG"環境変数の値
8.3.5. X Windowの下でのみ特定ロケール
8.3.6. ファイル名の符号化方式
8.3.7. 地域化されたメッセージと翻訳された文書
8.3.8. ロケールの効果
9. システムに関するティップ
9.1. screenプログラム
9.1.1. screen(1)の使い方のシナリオ
9.1.2. screenコマンドのキーバインディング
9.2. データーの記録と表現
9.2.1. ログデーモン
9.2.2. ログアナライザー
9.2.3. シェルの活動を綺麗に記録
9.2.4. テキストデーターのカスタム化表示
9.2.5. 時間と日付のカスタム化表示
9.2.6. 着色化されたシェル出力
9.2.7. 着色化されたコマンド
9.2.8. Xアプリケーションの画像イメージの記録
9.2.9. 設定ファイルの変更記録
9.3. データー保存のティップ
9.3.1. ディスクパーティション設定
9.3.2. UUIDを使ってパーティションをアクセス
9.3.3. ファイルシステム設定
9.3.4. ファイルシステムの生成と整合性チェック
9.3.5. マウントオプションによるファイルシステムの最適化
9.3.6. スーパーブロックによるファイルシステムの最適化
9.3.7. ハードディスクの最適化
9.3.8. SMARTを用いたハードディスクの破壊の予測
9.3.9. LVMを使う使用可能なストレージ空間の拡張
9.3.10. 他パーティションをマウントする使用可能なストレージ空間の拡張
9.3.11. シムリンクを使う使用可能なストレージ空間の拡張
9.3.12. aufsを使う使用可能なストレージ空間の拡張
9.4. データー暗号化ティップ
9.4.1. dm-crypt/LUKSを使ったリムーバブルディスクの暗号化
9.4.2. dm-cryptを使ってswapパーティションを暗号化
9.4.3. eCryptfsを使って自動的にファイルを暗号化
9.4.4. eCryptfsを自動的にマウント
9.5. プログラム活動の監視と制御と起動
9.5.1. プロセスの時間計測
9.5.2. スケジューリングのプライオリティー
9.5.3. psコマンド
9.5.4. topコマンド
9.5.5. プロセスによって開かれているファイルのリスト
9.5.6. プログラム活動の追跡
9.5.7. ファイルやソケットを使っているプロセスの識別
9.5.8. 一定間隔でコマンドを反復実行
9.5.9. ファイルに関してループしながらコマンドを反復実行
9.5.10. GUIからプログラムをスタート
9.5.11. スタートするプログラムのカスタム化
9.5.12. プロセスの停止
9.5.13. タスク1回実行のスケジュール
9.5.14. タスク定期実行のスケジュール
9.5.15. Alt-SysRqキー
9.6. システム管理ティップ
9.6.1. だれがシステム上にいる?
9.6.2. 全員への警告
9.6.3. ハードウエアーの識別
9.6.4. ハードウエアー設定
9.6.5. システムとハードウエアーの時間
9.6.6. ターミナルの設定
9.6.7. 音のインフラ
9.6.8. スクリーンセーバーの無効化
9.6.9. ブザー音の無効化
9.6.10. 使用メモリー
9.6.11. システムのセキュリティーと整合性のチェック
9.7. カーネル
9.7.1. Linuxカーネル2.6
9.7.2. カーネル変数
9.7.3. カーネルヘッダー
9.7.4. カーネルと関連モジュールのコンパイル
9.7.5. カーネルソースのコンパイル: Debian標準手法
9.7.6. モジュールソースのコンパイル: Debian標準手法
9.7.7. カーネルソースのコンパイル:古典的方法
9.7.8. Non-freeハードウエアードライバー
9.8. 仮想化システム
9.8.1. 仮想化ツール
9.8.2. 仮想化の業務フロー
9.8.3. 仮想ディスクイメージファイルをマウント。
9.8.4. Chrootシステム
9.8.5. 複数のデスクトップシステム
10. データー管理
10.1. 共有とコピーとアーカイブ
10.1.1. アーカイブと圧縮ツール
10.1.2. コピーと同期ツール
10.1.3. アーカイブの慣用句
10.1.4. コピーの慣用句
10.1.5. ファイル選択の慣用句
10.1.6. バックアップと復元
10.1.7. バックアプユーティリティーのスイート
10.1.8. システムバックアップ用スクリプトの例
10.1.9. データーバックアップ用コピースクリプト
10.1.10. リムーバブルストレージデバイス
10.1.11. ネットワーク経由でのデーター共有
10.1.12. アーカイブメディア
10.2. ディスクイメージ
10.2.1. ディスクイメージの作成
10.2.2. ディスクに直接書込み
10.2.3. ディスクイメージファイルをマウント
10.2.4. ディスクイメージのクリーニング
10.2.5. 空のディスクイメージ作成
10.2.6. ISO9660イメージファイル作成
10.2.7. CD/DVD-R/RWに直接書込み
10.2.8. ISO9660イメージファイルをマウント
10.3. バイナリーデーター
10.3.1. バイナリーデーターの閲覧と編集
10.3.2. ディスクをマウントせずに操作
10.3.3. データーの冗長性
10.3.4. データーファイルの復元と事故の証拠解析
10.3.5. 大きなファイルを小さなファイルに分割
10.3.6. ファイル内容の消去
10.3.7. ダミーファイル
10.3.8. ハードディスクの全消去
10.3.9. ハードディスク未使用部分の全消去
10.3.10. 削除されたがまだオープン中のファイルの復活法
10.3.11. 全てのハードリンクを検索
10.3.12. 見えないディスクスペースの消費
10.4. データーセキュリティーのインフラ
10.4.1. Gnupgのためのキー管理
10.4.2. GnuPGをファイルに使用
10.4.3. MuttでGnuPGを使用
10.4.4. VimでGnuPGを使用
10.4.5. MD5和
10.5. ソースコードマージツール
10.5.1. ソースファイル間の相違の抽出
10.5.2. ソースファイルに更新をマージ
10.5.3. 3方マージによる更新
10.6. バージョンコントロールシステム
10.6.1. VCSコマンドの比較
10.7. CVS
10.7.1. CVSレポジトリーの設定
10.7.2. CVSへのローカルアクセス
10.7.3. pserverを使ったCVSへのリモートアクセス
10.7.4. sshを使ったCVSへのリモートアクセス
10.7.5. 新規ソースをCVSにインポート
10.7.6. CVSレポジトリーのファイルパーミッション
10.7.7. CVSのワークフロー
10.7.8. CVSから最新ファイル
10.7.9. CVSの管理運営
10.7.10. CVSチェックアウトの実行ビット
10.8. Subversion
10.8.1. Subversionレポジトリーの設定
10.8.2. Apach2サーバーの経由のSubversionアクセス
10.8.3. グループによるSubversionへのローカルアクセス
10.8.4. グループによるSubversionへのSSH経由のリモートアクセス
10.8.5. Subversionディレクトリー構造
10.8.6. 新規ソースをSubversionにインポート
10.8.7. Subversionのワークフロー
10.9. Git
10.9.1. Gitクライアントの設定
10.9.2. Gitリファレンス
10.9.3. Gitコマンド
10.9.4. 設定履歴記録のためのGit
11. データー変換
11.1. テキストデーター変換ツール
11.1.1. テキストファイルをiconvを使って変換
11.1.2. ファイルがUTF-8であるとiconvを使い確認
11.1.3. iconvを使ってファイル名変換
11.1.4. 行末変換
11.1.5. タブ変換
11.1.6. 自動変換付きエディター
11.1.7. プレーンテキスト抽出
11.1.8. プレーンテキストデーターをハイライトとフォーマット
11.2. XMLデーター
11.2.1. XMLに関する基本ヒント
11.2.2. XML処理
11.2.3. XMLデーター抽出
11.3. 印刷可能データー
11.3.1. Ghostscript
11.3.2. 2つのPSやPDFファイルをマージ
11.3.3. 印刷可能データーユーティリティー
11.3.4. CUPSを使って印刷
11.4. タイプセッティング
11.4.1. roffタイプセッティング
11.4.2. TeX/LaTeX
11.4.3. マニュアルページを綺麗に印刷
11.4.4. マニュアルページの作成
11.5. メールデーター変換
11.5.1. メールデーターの基本
11.6. グラフィクスデーターツール
11.7. その他のデーター変換
12. プログラミング
12.1. シェルスクリプト
12.1.1. POSIXシェル互換性
12.1.2. シェル変数
12.1.3. シェル条件式
12.1.4. シェルループ
12.1.5. シェルコマンドライン処理シーケンス
12.1.6. シェルスクリプトのためのユーティリティープログラム
12.1.7. シェルスクリプトダイアログ
12.1.8. zenityを使うシェルスクリプト例
12.2. Make
12.3. C
12.3.1. 単純なCプログラム(gcc)
12.4. デバグ
12.4.1. 基本的なgdb実行
12.4.2. Debianパッケージのデバグ
12.4.3. バックトレースの収集
12.4.4. 上級gdbコマンド
12.4.5. Xエラーのデバグ
12.4.6. ライブラリーへの依存の確認
12.4.7. メモリーリーク検出ツール
12.4.8. 静的コード分析ツール
12.4.9. バイナリーのディスアッセンブリー
12.5. Flex — 改良版Lex
12.6. Bison — 改良版Yacc
12.7. Autoconf
12.7.1. プログラムをコンパイルとインストール
12.7.2. プログラムのアンインストール
12.8. 究極の短いPerlスクリプト
12.9. ウェッブ
12.10. ソースコード変換
12.11. Debianパッケージ作成
A. 補遺
A.1. Debian迷路
A.2. 著作権の経緯
A.3. 文書のフォーマット

表目次

1.1. 興味あるテキストモードのプログラムパッケージのリスト
1.2. 有用な文書パッケージのリスト
1.3. 重要ディレクトリーの使い方のリスト
1.4. "ls -l"の出力の最初の文字のリスト
1.5. chmod(1)コマンドで用いられるファイルパーミッションの数字モード
1.6. umask値の例
1.7. ファイルアクセスのためにシステムが供給する特記すべきグループのリスト
1.8. 特定コマンド実行のためにシステムが供給する特記すべきグループのリスト
1.9. タイムスタンプのタイプのリスト
1.10. スペシャルなデバイスファイルのリスト
1.11. MCのキーバインディング
1.12. enterキー入力へのMCの反応
1.13. シェルプログラムのリスト
1.14. Bashのキーバインディングのリスト
1.15. Unix流のマウス操作
1.16. 基本のUnixコマンドのリスト
1.17. ロケールの値の3つの部分
1.18. 推奨ロケール
1.19. "$HOME"の値のリスト
1.20. シェルグロブパターン
1.21. コマンドの終了コード
1.22. シェルコマンドの慣用句
1.23. 事前定義されたファイルデスクリプタ
1.24. BREとEREのメタ文字
1.25. 置換式
1.26. コマンドをパイプするためのスクリプト断片
2.1. Debianのパッケージ管理ツールのリスト
2.2. Debianアーカイブサイトのリスト
2.3. Debianアーカイブコンポーネントのリスト
2.4. スイーツとコード名の関係
2.5. 特定パッケージの問題解決のためのキーとなるウェッブサイトのリスト
2.6. aptitude(8)やapt-get(8) /apt-cache(8)を使うコマンドラインによる基本パッケージ管理操作を次に記します。
2.7. aptitude(8)に関する特記すべきコマンドオプション
2.8. aptitudeのキーバインディングのリスト
2.9. aptitudeの表示のリスト
2.10. 標準パッケージ画面の分類
2.11. aptitudeのregex式のリスト
2.12. パッケージアクティビティーのログファイル
2.13. 高度なパッケージ管理操作
2.14. Debianアーカイブのメタデーターの内容
2.15. Debianパッケージの名前の構造
2.16. Debianパッケージ名の各部分に使用可能な文字
2.17. dpkgが作成する特記すべきファイル
2.18. 各パッケージソースタイプ毎のデフォールトPin-Priority値のリスト
2.19. Debianアーカイブ専用のプロキシツールのリスト
3.1. ブートローダーのリスト
3.2. GRUBパラメーターの意味
3.3. ランレベルとその用途説明のリスト
3.4. カーネルエラーレベルのリスト
4.1. 3つのpam_unix(8)に関する重要な設定ファイル
4.2. "/etc/passwd"の2番目のエントリーの内容
4.3. アカウント情報を管理するコマンドのリスト
4.4. パスワード生成ツールのリスト
4.5. 特記すべきPAMとNSSシステムのリスト
4.6. PAMによりアクセスされる設定ファイルのリスト
4.7. インセキュアーとセキュアーのサービスとポートのリスト
4.8. 追加セキュリティー策を提供するツールのリスト
5.1. ネットワークアドレス範囲のリスト
5.2. GUIのネットワーク設定ツール
5.3. 典型的なネットワーク接続方法と接続経路のリスト
5.4. ネットワーク接続設定のリスト
5.5. ネットワーク接続の省略語のリスト
5.6. pppconfigを使ってのPPP接続のための設定ファイルのリスト
5.7. wvdialconfでPPP接続する際の設定ファイルリスト
5.8. pppoeconfを用いてPPPoE接続する際の設定ファイルのリスト
5.9. ifupdownを使う基本的なネットワーク設定コマンドのリスト
5.10. "/etc/network/interfaces"のスタンザのリスト
5.11. WLANの略語のリスト
5.12. ネットワークデバイスの用語法のリスト
5.13. ifupdownを使う上級ネットワーク設定コマンドのリスト
5.14. ifupdownシステムが引き渡す環境変数のリスト
5.15. 型遅れとなったnet-toolsコマンドと新しいiproute2コマンド等との翻訳表
5.16. 低レベルネットワークコマンドのリスト
5.17. ネットワーク最適化ツールのリスト
5.18. 最適MTU値の基本的なガイドライン
5.19. ファイアーウォールツールのリスト
6.1. ウェッブブラウザーのリスト
6.2. ブラウザープラグインのリスト
6.3. ワークステーションでの基本的メールトランスポートエージェント関連パッケージのリスト
6.4. Debianアーカイブ中のメールトランスポートエージェント(MTA)パッケージに関する選択肢リスト
6.5. 重要postfixマニュアルページのリスト
6.6. メールアドレス関連のファイルのリスト
6.7. 基本的MTA操作のリスト
6.8. メールユーザーエージェント(MUA)のリスト
6.9. リモートメールの取得および転送ユーティリティーのリスト
6.10. フィルター付きのMDAのリスト
6.11. POP3/IMAPサーバーのリスト
6.12. プリントサーバーとユーティリティーのリスト
6.13. リモートアクセスサーバーとユーティリティーのリスト
6.14. SSHの認証プロトコルと方法のリスト
6.15. SSH設定ファイルのリスト
6.16. SSHクライアント起動例のリスト
6.17. 他のプラットフォーム上で使えるフリーなSSHクライアントのリスト
6.18. 他のネットワークアプリケーションサーバー
6.19. 他のネットワークアプリケーションクライアント
6.20. よく使われるRFCのリスト
7.1. X Windowのためのキーとなる(メタ)パッケージのリスト
7.2. サーバー/クライアントの用語法のリスト
7.3. Xサーバーへの接続方法のリスト
7.4. X Windowフォントシステムをサポートするパッケージのテーブル
7.5. PostScript Type 1フォントへの対応表
7.6. TrueTypeフォントへの対応表
7.7. CJKフォント名中でフォントタイプを示すために使われるキーワード表
7.8. 基本的なXオフィスアプリケーションのリスト
7.9. 基本的Xユーティリティーアプリケーションのリスト
8.1. キーボード再設定方法のリスト
8.2. SCIMを用いるインプットメソッドサポートのリスト
9.1. ネットワーク切断の中断をサポートするプログラムのリスト
9.2. screenキーバインディングのリスト
9.3. システムログアナライザーのリスト
9.4. lennyでの"ls -l"コマンドによる時間と日付の表示例
9.5. 画像の操作ツールのリスト
9.6. VCS中に設定の履歴を記録するパッケージのリスト
9.7. ディスクパーティション管理パッケージのリスト
9.8. ファイルシステム管理用パッケージのリスト
9.9. データー暗号化ユーティリティーのリスト
9.10. プログラム活動の監視と制御のツールのリスト
9.11. スケジューリングのプライオリティーのためのナイス値のリスト
9.12. psコマンドのスタイルのリスト
9.13. topのコマンドのリスト
9.14. killコマンドが良く使うシグナルのリスト
9.15. SAKコマンドキーのリスト
9.16. ハードウエアー識別ツールのリスト
9.17. ハードウエアー設定ツールのリスト
9.18. サウンドパッケージのリスト
9.19. スクリーンセーバーを無効にするコマンドのリスト
9.20. レポートされるメモリーサイズのリスト
9.21. システムセキュリティーや整合性確認のためのツールリスト
9.22. Debianシステム上でカーネルの再コンパイルためにインストールする重要パッケージのリスト
9.23. 仮想化ツールのリスト
10.1. アーカイブと圧縮ツールのリスト
10.2. コピーと同期ツールのリスト
10.3. バックアップスイートのユーティリティーのリスト
10.4. "/etc/fstab"エントリーにマッチが無いリムーバブルデバイスをノーマルユーザーにマウントする事を許すパッケージのリスト
10.5. 典型的な使用シナリオに合わせたリムーバブルストレージデバイスのファイルシステムの選択肢のリスト
10.6. 典型的使用シナリオの場合のネットワークサービスの選択のリスト
10.7. バイナリーデーターを閲覧や編集するパッケージのリスト
10.8. ディスクをマウントせずに操作するパッケージのリスト
10.9. ファイルにデーターの冗長性を追加するツールのリスト
10.10. データーファイルの復元と事故の証拠解析のリスト
10.11. データーセキュリティーインフラツールのリスト
10.12. キー管理のためのGNUプライバシガードコマンドのリスト
10.13. トラストコードの意味のリスト
10.14. ファイルに使用するGNUプライバシーガードコマンドのリスト
10.15. ソースコードマージツールのリスト
10.16. バージョンコントロールシステムツールのリスト
10.17. 本来のVCSコマンドの比較
10.18. CVSコマンドの特記すべきオプション(cvs(1)の最初の引数として使用)
10.19. Subversionコマンドの特記すべきオプション(svn(1)の最初の引数として使用)
10.20. git関連のパッケージとコマンドのリスト
11.1. テキストデーター変換ツールのリスト
11.2. 符号化方式値とその使い方リスト
11.3. 異なるプラットフォーム上での行末スタイルのリスト
11.4. bsdmainutilscoreutilsパッケージ中のタブ変換コマンドのリスト
11.5. プレーンテキストデーター抽出ツールのリスト
11.6. プレーンテキストデーターをハイライトするツールのリスト
11.7. XMLで事前定義されているエントリーのリスト
11.8. XMLツールのリスト
11.9. 仮想化ツールのリスト
11.10. テキストデーター変換ツールのリスト
11.11. 仮想化ツールのリスト
11.12. Ghostscript PostScriptインタープリタのリスト
11.13. プリントできるデーターのユーティリティーのリスト
11.14. タイプ設定ツールのリスト
11.15. マンページ作成を補助するパッケージのリスト
11.16. メールデーター変換を補助するパッケージのリスト
11.17. 画像データーツールのリスト
11.18. その他のデーター変換ツールのリスト
12.1. プログラムをすることを補助するパッケージのリスト
12.2. 典型的bashizmsのリスト
12.3. シェル変数のリスト
12.4. シェル変数展開のリスト
12.5. 重要なシェル変数置換のリスト
12.6. 条件式中のファイル比較オペレーター
12.7. 条件式中での文字列比較オペレータのリスト
12.8. シェルスクリプト用の小さなユーティリティープログラムを含むパッケージのリスト
12.9. ユーザーインターフェースプログラムのリスト
12.10. makeの自動変数のリスト
12.11. make変数の展開のリスト
12.12. 上級gdbコマンドのリスト
12.13. メモリーリーク検出ツールのリスト
12.14. 静的コード分析ツールのリスト
12.15. Yacc互換のLALRパーサー生成ソフトのリスト
12.16. ソースコード変換ツールのリスト

序章

このDebianリファレンス(第2版)(2010-01-18 09:25:10 UTC)はシステムインストール後のユーザー向け案内書としてDebianのシステム管理に関する概論の提供を目指しています。

本書が対象とする読者は、GNU/Linuxシステムがどう機能するかを理解するのに、シェルスクリプトぐらいは学ぶ気はあるが、全てのCのソースまで読む気がない人です。

1. 免責事項

一切保証は致しません。全ての商標はそれぞれの商標の所有者の財産です。

Debianシステム自体は動く標的です。このため最新状況を反映した正確な記述は困難です。現行の不安定版のDebianシステムを用いて本書は記していますが、皆様が読まれる時点ではすでに記載内容が古くなっているでしょう。

本書はあくまで二次的参考文献として扱って下さい。本書は正式の案内書を置き換えません。著者及び本書への貢献者は本書中の誤謬や欠落や曖昧さが引き起こす結果に一切責任を負いません。

2. Debianとはなにか

Debianプロジェクトはフリーなオペレーティングシステムを作ろうという共通目的を持った個人の集団です。そのディストリビューションは次の特徴があります。

  • ソフトウェアの自由へのコミットメント: Debian社会契約とDebianフリーソフトウエアーガイドライン(DFSG)
  • インターネット上の分散型の無償ボランティア活動: http://www.debian.org
  • 多数のプリコンパイルされた高品質のソフトウエアー
  • セキュリティーアップデートへの平易なアクセス提供による、安定性とセキュリティーの重視
  • 不安定版unstableやテスト版testingアーカイブによる、最新のソフトウエアーへの円滑なアップグレードの重視
  • 多数のサポートされたハードウエアーアーキテクチャー

Debianの中のフリーソフトウエアー構成要素は、GNULinuxBSDXISCApacheGhostscriptCommon Unix Printing System SambaGNOMEKDEMozillaOpenOffice.orgVimTeXLaTeXDocBookPerlPythonTclJavaRubyPHPBerkeley DBMySQLPostgreSQLEximPostfixMuttFreeBSDOpenBSDPlan 9やその他の多くの独立のフリーソフトウエアーのプロジェクトに由来します。Debianはこの多種多様なフリーソフトウエアーを1つのシステムにまとめ上げます。

3. 本書について

3.1. 編集指針

本書の作成にあたり次の編集指針を守りました。

  • 概論を提供し枝葉末節は省略します。(全体像)
  • 簡潔を心がけました(KISS)
  • 車輪の再発明をしません。(既存の参考文献へのポインターの利用)
  • 非GUIツールとコンソールを重視します。(シェル例示を使用)
  • 客観的であるようにします。(ポプコン等の利用)

ティップ

私はシステムの階層的側面やシステムの低レベルを明らかにしようとしました。

3.2. 前提条件

警告

本文書だけに頼らず自分で答えを見出す努力をしっかりすることを期待します。本文書は効率的なスタートポイントを提供するだけです。

一義的情報源から自分自身で解決策を探し出すべきです。

注記

詳細な文書を読むには、"-doc"をサフィクスとする対応する文書パッケージをインストールする必要があるかもしれません。

3.3. 文書様式

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"のように表現されたり、その場所のURLhttp://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"

3.4. Debian BTS

各パッケージの後ろについている"*"は、各パッケージのDebianバグトラッキングシステム(BTS)にリンクされています。

3.5. ポプコン

ポプコンのデーターは各パッケージの客観的人気の指標として提示されいます。それがダウンロードされた日付は2010-01-03 08:47:39 UTCで、 101488を越すバイナリーパッケージ数と19のアーキテクチャーにまたがる87850つの提出レポートからなります。

注記

amd64の不安定版unstableアーカイブは現在高々27561つのパッケージしか含みません。ポプコンデーターは多くの旧式設置システムからのレポートを含みます。

"votes"を意味する"V:"が前についたポプコンの数は"100 * (PCで最近実行されたパッケージに関するポプコン提出)/(全ポプコン提出)"として計算される。

"installs"を意味する"I:"が前についたポプコンの数は"100 * (PCにインストールされているパッケージに関するポプコン提出)/(全ポプコン提出)"として計算される。

注記

Popconの数字はパッケージの重要性の絶対指標と考えるべきでません。統計を曲げる多くの因子があります。例えば、Popconに参加しているシステムの一部は"/bin"などのディレクトリーをシステム性能向上のために"noatime"オプションでマウントすることで当該システムから"vote"することを実質的に禁止しているかもしれません。

3.6. パッケージサイズ

各パッケージの客観的指標としてパッケージサイズデーターも提供されます。それは"apt-cache show"や"aptitude show"コマンドが(現在のamd64アーキテクチャー上のunstableリリース上で)表示する"Installed-Size:"です。サイズはKiB(Kibibyte = 1024バイト単位)で表示されます。

注記

小さなパッケージサイズのパッケージはunstableリリース中の当該パッケージが内容のある他パッケージを依存関係でインストールするためのダミーパッケージだからかもしれません。

注記

"(*)"が後ろについたパッケージのサイズは、unstableリリース中にパッケージが無くexperimentalリリース中のパッケージサイズが代用されたことを示します。

3.7. 本書へのバグ報告

何かこの文書に問題を発見した場合には、debian-referenceパッケージに対してreportbug(1)を用いてバグ報告をして下さい。プレーンテキストバージョンかソースに対する"diff -u"による修正提案を含めて下さい。

4. 新規ユーザーへの引用文

新規ユーザーを啓蒙するDebianのメーリングリストで見つけた興味深い引用文を記します。

  • "This is Unix. It gives you enough rope to hang yourself." 「これはUnixです。首を括るのに十分なロープをあてがってくれますよ。」 --- Miquel van Smoorenburg <miquels at cistron.nl>
  • "Unix IS user friendly... It's just selective about who its friends are." 「Unixはユーザーフレンドリー(使う人に優しい)です... 誰にフレンドリー(優しく)にするかの人見知りするだけです。」 --- Tollef Fog Heen <tollef at add.no>

第1章 GNU/Linuxチュートリアル

コンピューターシステムを学ぶことは新しい外国語を学ぶことに似ていると考えます。チュートリアルブックは有用ですが、実際に自ら使って学ぶことが必要です。円滑なスタートが出きるように、いくつかの基本的なポイントを説明します。

Debian GNU/Linuxの強力なデザインはマルチユーザーマルチタスクというUnixオペレーティングシステムに由来します。これらUnixとGNU/Linuxの特徴や類似点の強力さを活用することを覚えましょう。

Unix対象の文書を避けたり、GNU/Linuxに関する文書だけに頼ることは、有用な情報を見逃すことになるので止めましょう。

一般的なシステム管理に関する良好なオンラインリソースは、Debianのnon-freeアーカイブにrutebookパッケージ (ポプコン: I:0.2)としてある"Ruteユーザーのためのチュートリアルと解説書(Rute User's Tutorial and Exposition)" が提供しています。

注記

Unix的システムをコマンドラインツールで少々使った経験があれば、私がここで説明することはすべてご存知でしょう。リアリティーチェックと記憶を呼び戻すのにこれを使って下さい。

1.1. コンソールの基礎

1.1.1. シェルプロンプト

X Windowシステムgdm等のディスプレーマネージャーとともにインストールした場合以外には、システム起動の際に文字のloginスクリーンが現れます。あなたのホスト名がfooと仮定すると、loginプロンプトは次に示すような見えます。

foo login:

GNOMEKDEのような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"用いたシステム情報から生成されます。

これであなたはシェルの中にいます。シェルはあなたからのコマンドを解釈します。

1.1.2. Xの下でのシェルプロンプト

インストールの際に"Desktop environment"タスクを選定しGNOMEgdmとともにX Windowシステムをインストールした場合には、システムの起動するとグラフィカルなloginプロンプトのスクリーンが表示されます。あなたのユーザー名とパスワードを入力することで非特権ユーザーアカウントにloginできます。タブ(tab)を用いたりマウスの第一クリックを用いるとユーザー名とパスワードの間を行き来できます。

gnome-terminal(1)やrxvt(1)やxterm(1)のようなx-terminal-emulatorプログラムをXの下で起動するとシェルプロンプトが得られます。GNOMEデスクトップ環境下では、"Applications" → "Accessories" → "Terminal"とクリックしてもうまくいきます。

次の「仮想コンソール」も参照下さい.

デスクトップ環境(例えばfluxbox)次第ではメニューの起点がよく分からないことがあります。そんな時はスクリーンの中央を(右)クリックしてメニューが表示されることを期待しましょう。

1.1.3. rootアカウント

rootアカウントはスーパーユーザーとか特権ユーザーとも呼ばれます。このアカウントからは次のようなシステム管理活動ができます。

  • ファイルパーミッションによらずシステム上の任意ファイルに関しての、読出し・書込み・削除
  • システム上のいかなるファイルに関して、ファイルの所有者やパーミッション設定
  • システム上の非特権ユーザーのパスワードを設定
  • パスワード無しに任意アカウントへのlogin

rootアカウントの権限を使うには、この無制限の権限ゆえ配慮と責任ある行動が求められます。

警告

rootのパスワードを他人に決して教えてはいけません。

注記

ファイル(Debianシステムにとってはファイルの一種であるCD-ROM等のハードウエアーデバイスも含む)パーミッションは、非rootユーザーによるそのファイルの使用やアクセスをできなくなくすることがあります。この様な状況の下ではrootアカウントを使うことが簡便なテスト法ですが、問題解決はファイルパーミッションとユーザーのグループのメンバーシップを適切に設定する必要があります(「ファイルシステムのパーミッション」参照)。

1.1.4. rootシェルプロンプト

rootのパスワードを使ってrootのシェルプロンプトを使えるようにする基本的な方法を次に記します。

  • 文字ベースのログインプロンプトにrootと入力します。
  • GNOMEデスクトップ環境下で、"Applications" → "Accessories" → "Root Terminal"とクリックします。
  • どのユーザーシェルプロンプトからでも"su -l"と入力します。

    • 現ユーザーの環境を一切引き継がません。
  • どのユーザーシェルプロンプトからでも"su"と入力します。

    • 現ユーザーの環境を一部引き継ぐ。

1.1.5. GUIのシステム管理ツール

デスクトップのメニューがGUIのシステム管理ツールを適切な権限とともに自動的に起動しない場合、gnome-terminal(1)やrxvt(1)やxterm(1)のようなXターミナルエミュレーターのrootシェルプロンプトから起動できます。「rootシェルプロンプト」 and 「Xクライアントをrootで実行」を参照下さい。

警告

gdm(1)等のディスプレーマネージャーのプロンプトにrootと入力して、Xディスプレー/セッションマネージャーをrootアカウントのもとで決して起動してはいけません。

警告

クリチカルな情報が表示されている際には、あなたのXスクリーンを覗き見られるかもしれないのでリモートの信頼できないGUIプログラムを決して実行してはいけません。

1.1.6. 仮想コンソール

デフォールトのDebianシステムでは、6つの切り替え可能なVT100様の文字コンソールがあり、Linuxホスト上で直接コマンドシェルを起動できるようになっています。GUI環境下でない場合は、Left-Alt-keyF1F6の中の一つのキーを同時に押すことで仮想コンソール間の切り替えができます。仮想ターミナルそれぞれに独立したアカウントでログインすることができ、。マルチユーザー環境を提供します。このマルチユーザー環境はUnixの偉大な機能で、癖になります。

X Windowシステムの下では、Ctrl-Alt-F1キーを押す、つまりleft-Ctrl-keyleft-Alt-keyF1-keyキーを同時に押すと文字コンソール1にアクセスできます。通常仮想コンソール7で実行されているX WindowシステムへはAlt-F7を押すことにより戻れます。

これとは別の方法で、例えば仮想ターミナル1という今とは違う仮想ターミナルへの変更がコマンドラインから出来ます。

# chvt 1

1.1.7. コマンドプロンプトからの退出方法

コマンドプロンプトでCtrl-D、つまりleft-Ctrl-keyd-keyの同時押しをするとシェルでのアクティビティーを終了できます。文字コンソールの場合は、こうするとloginプロンプト戻ります。これらのコントロール文字は通常"control D"と大文字を使って表記されますが、Shiftキーを押す必要はありません。またCtrl-Dに関する簡略表記^Dも使われます。この代わりに"exit"とタイプすることができます。

x-terminal-emulator(1)にあっては、このようにすることでx-terminal-emulator のウィンドウが閉じることができます。

1.1.8. システムをシャットダウンする方法

ファイル操作の際にパーフォーマンス向上のためにメモリーへのデーターのキャッシュがされる他の現代的なOSと同様に、Debianシステムでも電源を安全に切る前に適切なシャットダウン手順を取る必要があります。これはすべてのメモリー上の変更を強制的にディスクに書き出しすことで、ファイルの完全性を維持するためです。ソフトウエアーによる電源コントロールができる場合、シャットダウン手続きはシステムの電源を自動的に落とします。(これがうまくいかない時には、シャットダウン手続きの後で数秒間電源ボタンを押す必要があるかもしれません。)

通常のマルチユーザーモードからのシステムのシャットダウンがコマンドラインから出来ます。

# shutdown -h now

シングルユーザーモードからのシステムのシャットダウンがコマンドラインから出来ます。

# poweroff -i -f

この他に、"/etc/inittab"に"ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now"と書かれていれば、Ctrl-Alt-Delete(left-Ctrl-keyleft-Alt-KeyDeleteの同時押し)を入力するシャットダウン方法もあります。

「SSH上のリモートシステムをシャットダウンする方法」を参照下さい。

1.1.9. まともなコンソールの復元

例えば"cat <some-binary-file>"のような変な事をした後でスクリーンが無茶苦茶になった場合、コマンドプロンプトに"reset"と入力して下さい。このときコマンドを入力してもスクリーンには読み取れる表示がされないかもしれません。"clear"とすればスクリーンが消去できます。

1.1.10. 初心者向け追加パッケージの提案

デスクトップ環境タスク抜きの最小限インストレーションDebianシステムですら基本的なUnix機能は提供されますが、コマンドラインやcursesに基づくmcvim等のいくつかの文字ターミナルパッケージをaptitude(8)を使って次のように追加インストールすることから始めることを初心者にお薦めします。

# aptitude update
 ...
# aptitude install mc vim sudo
 ...

既にこれらのパッケージがインストールされている場合には、新しいパッケージはインストールされません。

表1.1 興味あるテキストモードのプログラムパッケージのリスト

パッケージ ポプコン サイズ 説明
mc * V:12, I:28 6452 テキストモードの全画面ファイルマネージャー
sudo * V:43, I:73 612 ユーザーに限定的なroot権限を与えるプログラム
vim * V:14, I:31 1732 UnixテキストエディターVi IMproved(改良版Vi)、プログラマーのためのテキストエディター(標準版)
vim-tiny * V:17, I:91 824 UnixテキストエディターVi IMproved(改良版Vi)、プログラマーのためのテキストエディター(軽量版)
emacs22 * V:3, I:7 11020 GNUプロジェクトEmacs、Lispに基づく拡張可能なテキストエディター(22版)
emacs23 * V:1.6, I:2 13272 GNUプロジェクトEmacs、Lispに基づく拡張可能なテキストエディター(23版)
w3m * V:22, I:84 1964 テキストモードWWWブラウザー
gpm * V:3, I:4 564 テキストコンソール上のUnix式のカットアンドペースト(daemon)

いくつかの参考資料を読むのも良いことです。

表1.2 有用な文書パッケージのリスト

パッケージ ポプコン サイズ 説明
doc-debian * I:83 376 Debianプロジェクトの文書、(Debian FAQ)他
debian-policy * I:3 2748 Debianポリシーマニュアルと関連文書
developers-reference * I:1.1 1352 Debian開発者のためのガイドラインと情報
maint-guide * I:0.8 644 Debian新メンテナ向けガイド
debian-history * I:0.3 2544 Debianプロジェクトの歴史
debian-faq * I:56 1190 Debian FAQ(よくある質問集)
doc-linux-text * I:82 8616 Linux HOWTOとFAQ(テキスト版)
doc-linux-html * I:0.9 62564 Linux HOWTOとFAQ(HTML版)
sysadmin-guide * I:0.3 964 Linuxシステム管理者ガイド
rutebook * I:0.2 8264 Linux: Ruteユーザーのためのチュートリアルと解説書(non-free)

これらのパッケージの一部を次のようにしてインストールします。

# aptitude install package_name

1.1.11. 追加のユーザーアカウント

次の練習のためにあなたのメインのユーザーアカウントを使いたくない場合には、例えばfishという追加のユーザーアカウントを作成できます。rootシェルプロンプトで次のように入力します。

# adduser fish

すべての質問に返事をします。

こうすることでfishという名前の新規アカウントが作られます。練習の後で、このユーザーとそのホームディレクトリーは次のようのすれば削除できます。

# deluser --remove-home fish

1.1.12. sudoの設定

ラップトップPC上のデスクトップのDebianシステム等のような典型的単一ユーザーワークステーションでは次のような単純なsudo(8)の設定をして、非特権ユーザー(例えばpenguin)に管理者権限を(rootパスワードではなく)ユーザー自身のパスワードで与えることがよくあります。

# echo "penguin  ALL=(ALL) ALL" >> /etc/sudoers

このトリックの使用は、単一ユーザーワークステーション上であなた自身が管理者でユーザーである際のみに限るべきです。

警告

システムセキュリティー上非常に悪い事態を招くので、マルチユーザーワークステーション上の通常ユーザーアカウントに対してこの様な設定をしてはいけません。

注意

上記例のようなpenguinのパスワードとアカウントはrootパスワードやrootアカウント同様の保護が必要です。

注意

この文脈上の管理者権限はワークステーションに関するシステム管理業務をする権限を与えられた人に属します。そのような権限と能力を持っていなければ、あなたの会社の管理部門の管理職や上司とはいえこのような権限を与えてはいけません。

注記

特定デバイスや特定ファイルへのアクセスの権限を与えるには、sudo(8)をつかって得たroot権限を用いるのではなく、groupを使って限定的アクセス与えることを考えるべきです。

注記

sudo(8)を使ってもう少し工夫された注意深い設定をすれば、共有システム上の他のユーザーにrootパスワードを教えること無く限定的管理権限を許可することができます。こうすることは、誰が何をしたかを明らかにするので、複数の管理者がいるホストにおける責任の所在を明らかにします。ただ、誰にもそんな権限を与えたく無いかもしれません。

1.1.13. お遊びの時間

非特権ユーザーアカウントを使う限り全くリスク無くDebianシステムでお遊びをする準備万端です。

何故なら、たとえデフォールトのインストール後ですらDebianシステムは非特権ユーザーがシステムに損害を与えられないように的確なファイルパーミッションが設定されているからです。もちろん悪用可能な穴が残っているかもしれませんが、こんな問題まで心配する人はこのセクションを読んでいるべきではなく、Securing Debian Manualを読むべきです。

DebianシステムをUnix的システムとして次に学びましょう:

1.2. Unix-likeファイルシステム

GNU/Linuxや他のUnix的オペレーティングシステムでは、ファイルディレクトリーに整理されています。すべてのファイルやディレクトリーは、"/"を根(root)に持つ一本の大きな木(ツリー)のようにアレンジされています。

このようなファイルやディレクトリーはいくつかのデバイスに展開することができます。あるデバイス上にあるファイルシステムを大きなファイルツリーにマウントするのにmount(8)が使われます。その逆に、それを切り離すのにumount(8)が使われます。最近のLinuxカーネルでは、mount(8)をオプションとともに用いると、ファイルツリーの一部を別のところと結びつけたり、共有・非共有・従属・バインド不可としてファイルシステムをマウントもできます。各ファイルシステムごとの使用可能なマウントオプションは"/share/doc/linux-doc-2.6.*/Documentation/filesystems/"にあります。

Unixシステム上のディレクトリーは、一部の他システム上ではフォルダと呼ばれます。Unixシステム上では"A:"のようなドライブというコンセプトが無いこと覚えておいて下さい。単一のファイルシステムがあって、そこにすべてが含まれています。これはWindowsと比べた際の大きな利点です。

1.2.1. Unixファイルの基礎

Unixファイルの基礎は以下です。

  • ファイル名は大文字と小文字を区別します。"MYFILE"と"MyFile"は異なるファイルです。
  • ルートディレクトリーはフィルシステムの根(ルート、root)を意味して、単に"/"と記載されます。これをrootユーザーのホームディレクトリー"/root"とは混同しないで下さい。
  • 全てのディレクトリーには"/"以外の文字・記号からなる名前がついています。ルートディレクトリーは例外で、その名前は"/"("スラッシュ"とか"ルートディレクトリー"と読まれます)でその名前を変えることはできません。
  • 各ファイルやディレクトリーは、たどっていくとファイルに到達するディレクトリーの列が示される、完全に記述したファイル名とか絶対ファイル名とかパスにより指定されます。これらの3つの表現は同義語です。
  • 全ての完全に記述したファイル名は"/"ディレクトリーで始まり、ファイル名中の各ディレクトリーやファイル名の間には"/"がはさまります。最初の"/"は ディレクトリー名です。その他の"/"は、次のサブディレクトリーとの区別をします。そして最後には実際のファイルの名前がきます。ちょっと混乱しそうですので、次の完全に記述したファイル名 の例をご覧下さい: "/usr/share/keytables/us.map.gz"。 一方このベース名である、"us.map.gz"だけをファイル名と呼ぶ人もあります。
  • ルートファイルシステムは"/etc/"や"/usr/"のような複数の枝を持ちます。これらのサブディレクトリーもまた"/etc/init.d/"や"/usr/local/"のように、さらにサブディレクトリーに枝別れします。これらの全体をまとめてディレクトリーツリーと呼びます。絶対ファイル名はツリーの根元("/")から枝の先 (ファイル) までの経路として考えることもできます。また、あたかもディレクトリーツリーを家系図のように人が話すのを聞いたことがあるでしょう。あたかもそれぞれのサブディレクトリーにがあるとし、パスはファイルの完全な祖先の系図のように表現します。ルートディレクトリーではない他の場所から始まる相対パスもあります。ディレクトリー"../"は親ディレクトリーを参照していることを覚えておきましょう。このような呼び方はディレクトリーのような構造を持つ他の階層的ツリー状のデーター構造体でもよく使われます。
  • ハードディスクのような物理デバイスに対応したパス名の要素は存在しません。ここが、パス名に"C:\"のようなデバイス名が含まれるRT-11CP/MOpenVMSMS-DOSAmigaOSMicrosoft 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/ 全ての非特権ユーザーのホームディレクトリー

1.2.2. ファイルシステムの内側

Unixの伝統に従い、Debian/Linux システムはハードディスクや他のストレージデバイス上に存在する物理データーを表すファイルシステムを提供し、コンソールスクリーンやリモートのシリアルコンソールなどのハードウェアデバイスとの相互作用が"/dev/"の下に統一された形式で表されています。

Debian/Linuxシステム上の、各々のファイルやディレクトリーや名前付きパイプ(2つのプログラムがデーターを共有する方法)や物理デバイスは、それぞれの所有者(owner)やデーターが所属するグループ(group)や最終アクセス時間などの付帯属性(attribute)を記述するinodeと呼ばれるデーター構造を持ちます。 Debian GNU/Linux システムでの inode 構造 の正確な定義を知るには、"/usr/include/linux/fs.h" をご覧下さい。 ほとんど全てをファイルシステム表現しようというアイデアはUnixの発明でしたし、現代的なLinuxカーネルはこのアイデアを一歩進めています。コンピューター上で実行されているプロセス情報さえファイルシステム中に見つけられます。

このような物理的実体と内部プロセスの抽象的かつ統一された表現は非常にパワフルなので、多くの全く異なるデバイスに同じコマンドを使用して同種の操作が行えます。実行中のプロセスに繋がった特殊なファイルにデーターを書き込むことでカーネルが如何に動作するかまで変更できます。

ティップ

ファイルツリーや物理的実体の間の関係を確認する必要がある際には、mount(8)を引数無しで実行して下さい。

1.2.3. ファイルシステムのパーミッション

Unix的システムのファイルシステムのパーミッションは次の3つの影響されるユーザーのカテゴリーのために定義されています。

  • ファイルを所有するユーザー(user)(u)
  • ファイルが所属するグループ(group)中の他ユーザー(g)
  • "世界"や"全員"とも呼ばれる、全他ユーザー(other)(o)

ファイルでは、それぞれに対応するパーミッションは次のようになります。

  • 読出し(read)(r)パーミッションはファイル内容確認を可能にします。
  • 書込み(write)(w)パーミッションはファイル内容変更を可能にします。
  • 実行(execute)(x)パーミッションはファイルをコマンド実行を可能にします。

ディレクトリーでは、対応するパーミッションはそれぞれ次のようになります。

  • 読出し(read)(r)パーミッションはディレクトリー内容リストを可能にします。
  • 書込み(write)(w)パーミッションはディレクトリーへのファイルの追加削除を可能にします。
  • 実行(execute)(x)パーミッションはディレクトリー内のファイルへのアクセスを可能にします。

ここで、ディレクトリーに関する実行(execute)パーミッションとはディレクトリー内のファイルへの読出しを許可するのみならず、サイズや変更時間のようなアトリビュート閲覧を許可します。

ファイルやディレクトリーのパーミッション情報他を表示するには、ls(1)が使われます。"-l"オプション付きでこれを実行すると、次の情報がこの順序で表示されます。

  • ファイルのタイプ(最初の文字)
  • ファイルのアクセスパーミッション(次の9文字。ユーザーとグループと他者の順にそれぞれに対して3文字から構成されている)
  • ファイルへのハードリンク数
  • ファイルを所有するユ-ザー(user)の名前
  • ファイルが所属するグループ(group)
  • ファイルのサイズ(文字数、バイト)
  • ファイルの日時(mtime)
  • ファイルの名前

表1.4 "ls -l"の出力の最初の文字のリスト

文字 意味
- 通常ファイル
d ディレクトリー
l シムリンク
c 文字デバイス名
b ブロックデバイス名
p 名前付きパイプ
s ソケット

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つ存在します。

  • セットユーザーIDビット(ユーザーのxに代えてsS)
  • セットグループIDビット(グループのxに代えてsS)
  • スティッキビット(他ユーザーのxに代えてtT)

ここで、これらのビットの"ls -l"のアウトプットはこれらの出力によってかくされた実行ビットが非設定(unset)の場合大文字となります。

セットユーザーIDを実行ファイルにセットすると、ユーザーはファイルの所有者ID(例えば、root) を使って実行ファイルを実行することを許可されます。同様に、セットグループIDを実行ファイルにセットすると、ユーザーはファイルのグループID(例えば、root) を使って実行ファイルを実行することを許可されます。これらの設定はセキュリティーを破壊するリスクを引き起こすので、これらのビットを有効にするには特別な注意が必要です。

セットグループIDsをディレクトリーに対して有効にすると、ディレクトリーに作成した全ファイルがディレクトリーのグループに所属するという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"を使うのも手です。

1.2.4. 新規作成ファイルのパーミッションのコントロール:umask

新規作成ファイルのやディレクトリーに適用されるパーミッションは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を設定します。)

1.2.5. ユーザーのグループ(group)のパーミッション

グループパーミッションを特定ユーザーに適用するには、"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)を参照下さい。

1.2.6. タイムスタンプ

GNU/Linuxファイルのタイムスタンプには3種類あります。

表1.9 タイムスタンプのタイプのリスト

タイプ 意味
mtime ファイル内容変更時間(ls -l)
ctime ファイル状態変更時間(ls -lc)
atime ファイル最終アクセス時間 (ls -lu)

注記

ctimeはファイル作成日時ではありません。

  • ファイルが上書きされると、ファイルのmtimectimeatimeの属性すべてが変更されます。
  • ファイルの所有者やパーミッションの変更をすると、ファイルのctimeatime アトリビュートを変えます。
  • ファイルを読むとファイルのatimeが変更されます。

注記

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"の出力のカスタム化は「時間と日付のカスタム化表示」を参照下さい。

1.2.7. リンク

"foo"というファイルを異なるファイル名"bar"に結びつけるのには2つの方法があります。

リンク数の変化と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"との比較で如何にうまくできているかにすぐ気づくでしょう。ファイルシステム中に実装されているのでアプリケーションからはリンクされたファイルなのかオリジナルなのかの区別がつきません。ハードリンクの場合は実際全く違いはありません。

1.2.8. 名前付きパイプ(FIFO)

名前付きパイプは、パイプのように働くファイルです。何かをファイルに入れると、もう一方の端からそれが出てきます。こうしてこれは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

1.2.9. ソケット

ソケットはインターネットのコミュニケーションやデーターベースやオペレーティングシステム自身によって頻繁に使われます。ソケットは名前つきパイプ(FIFO)に似ており、異なるコンピューター間でさえプロセス間の情報交換を可能にします。ソケットにとって、これらのプロセスは同時に実行する必要も、同じ祖先プロセスの子供である必要もありません。これはプロセス間通信(IPC)の終端点です。ネットワーク越しで異なるホストの間で情報の交換をすることも可能です。2つの典型的なソケットは、インターネットソケットUnixドメインソケットです。

ティップ

"netstat -an"を実行すると特定のシステム上のソケットの全般状況がよく分かります。

1.2.10. デバイスファイル

デバイスファイルは、システム上のハードディスク、ビデオカード、ディスプレー、キーボードなどの物理デバイス又は仮想デバイス等を意味します。仮想デバイスの例として"/dev/console"として表されるコンソールがあります。

2タイプのデバイスファイルがあります。

  • 文字デバイス

    • 1文字毎にアクセス可能
    • 1文字 = 1バイト
    • 例: キーボードデバイス、シリアルポート等
  • ブロックデバイス

    • 比較的大きなブロック単位でアクセス可能
    • 1ブロック > 1バイト
    • 例: ハードディスク等

デバイスファイルの読出し書込みが可能ですが、人間にとっては意味不明のバイナリーデーターがファイル中に多分含まれています。データーを直接デバイスファイルに書き込むことは時々ハードウェアの接続に関するトラブルシュートに役立ちます。例えば、プリンタデバイス"/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.2.11. 特別なデバイスファイル

いくつかの特別なデバイスファイルがあります。

表1.10 スペシャルなデバイスファイルのリスト

デバイスファイル アクション レスポンスの説明
/dev/null 読出し "行末(EOF)文字"を返す
/dev/null 書込み 何も返さず(底なしのデーターのゴミ捨て場)
/dev/zero 読出し "\0 (NUL)文字"を返す(ASCIIの数字のゼロとは違う)
/dev/random 読出し 真の乱数発生機から真のエントロピーのあるランダムな文字を返す(遅い)
/dev/urandom 読出し 暗号学的にセキュアーな擬似乱数発生機からランダムな文字を返す
/dev/full 書込み ディスクフル(ENOSPC)エラーを返す

以上はシェルのリディレクションとともによく使われます。(「典型的なコマンドシーケンスとシェルリディレクション」参照)。

1.2.12. procfsとsysfs

procfssysfsは"/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)"や関連する他の文書を参照下さい。

1.3. ミッドナイトコマンダー(MC)

Midnight Commander (MC)はLinux コンソールや他の端末環境のためのGNU製"スイス軍ナイフ"です。標準Unixコマンドを習うよりもより簡単なメニューを使ったコンソール経験が初心者にもできます。

"mc"と名づけられたMidnight Commanderパッケージを次のようにしてインストールする必要があります。

$ sudo aptitude install mc

Debian システムを探検するためにmc(1)コマンドを使います。これは学習するための最良の方法です。カーソールキーとエンターキーを使うだけで興味深い場所をちょっと探検します。

  • "/etc"とサブディレクトリー
  • "/var/log"とサブディレクトリー
  • "/usr/share/doc"とサブディレクトリー
  • "/sbin"と"/bin"。

1.3.1. MCのカスタム化

終了時に作業ディレクトリーをMCに変更させそのディレクトリーへcdさせるためには、mcパッケージが提供するスクリプトを"~/.bashrc"が含むように変更します。

. /usr/share/mc/bin/mc.sh

この理由はmc(1) ("-P"オプション項目) を参照下さい(今言っていることがよく分からないなら、これは後日しても大丈夫です。)

1.3.2. MCの始動

MCは次のようにして起動します。

$ mc

MCを使うとメニューを通じた最小限のユーザーの努力で全てのファイル操作の面倒が見られます。ヘルプ表示を出すには、ただF1を押すだけです。カーソールキーとファンクションキーの操作だけでMCを使えます。

注記

gnome-terminal(1)のようなコンソールでは、ファンクションキーのキーストロークがコンソールプログラムに横取りされる事があります。gnome-terminalの場合、"Edit" → "Keyboard Shortcuts"とするとこの機能を無効にできます。

もし文字化け表示がされる文字符号化(エンコーディング)問題に出会った際には、MCのコマンドラインに"-a"を加えると解消する事があります。

これでもMCの表示の問題が解消しない際には、「ターミナルの設定」を参照下さい。

1.3.3. MCのファイルマネージャー

2つのディレクトリーパネルがありそれぞれファイルリストを含むのが標準です。他の便利なモードとしては、右側のウィンドウを"information" とセットしてファイルアクセス権情報などを表示するモードがあります。次にいくつかの不可欠なキーストロークを示します。gpm(8)デーモンを実行すると、Linuxの文字ターミナルでマウスも使えます。(MC で通常の挙動のカットアンドペーストをさせるには、shiftキーを押して下さい。)

表1.11 MCのキーバインディング

キー キーバインディング
F1 ヘルプメニュー
F3 内部ファイルビューワー
F4 内部エディター
F9 プルダウンメニュー有効
F10 MCを終了
Tab 二つのウィンドウの間を移動
InsertもしくはCtrl-T コピーのような複数ファイル操作のためにファイルをマーク
Del ファイルの削除(気をつけましょう -- MCを安全削除モードに設定)
カーソールキー 自明

1.3.4. MC のコマンドライントリック

  • cdコマンドは選択されたスクリーンに表示されたディレクトリーを変更します。
  • Ctrl-EnterAlt-Enterはファイル名をコマンドラインにコピーします。コマンドライン編集と一緒にcp(1)やmv(1)コマンドで御使用下さい。
  • Alt-Tabはシェルファイル名の自動展開の選択肢を表示します。
  • MCの引数で両ウィンドウのスタートディレクトリーを指定できます。例えば"mc /etc /root"。
  • Esc + n-keyFn (つまり、Esc + 1F1、等々、Esc + 0F10)
  • Escをキーの前に押すのはAltをキーと同時に押すのと同様の効果があります。つまり、Esc + cAlt-Cと同じです。Escはメタキーとよばれ時々"M-"と表記されます。

1.3.5. MCの内部エディター

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)をほとんどのシステム管理業務のために使い続けられます。

1.3.6. MCの内部ビューワー

MCは非常に賢明なビューワーです。文書内の単語を検索するための素晴らしいツールです。私は"/usr/share/doc"ディレクトリー内のファイルに対していつもこれを使います。これは 大量にあるLinux情報を閲覧する最速の方法です。このビューワーは次のコマンドの内のひとつを使い直接起動できます。

$ mc -v path/to/filename_to_view
$ mcview path/to/filename_to_view

1.3.7. MCの自動起動機能

ファイルの上でEnterを押すと、適切なプログラムがファイル内容を処理します(「スタートするプログラムのカスタム化」参照)。これは非常に便利な MC の機能です。

表1.12 enterキー入力へのMCの反応

ファイルタイプ enterキーへの反応
実行ファイル コマンド実行
manファイル ビューワーソフトに内容をパイプ
htmlファイル ウェッブブラウザーに内容をパイプ
"*.tar.gz"や"*.deb"ファイル サブディレクトリーであるかのように内容を表示

これらのビューワーや仮想ファイルの機能を有効にするためには、閲覧可能なファイルには実行可能と設定されていてはいけません。chmod(1)コマンドを使うか、MC のファイルメニュー経由で状態を変更して下さい。

1.3.8. MCのFTP仮想ファイルシステム

MCをInternet越しでのFTPを用いたファイルアクセスに使えます。F9を押してメニューに行き、"p"を押してFTP仮想ファイルシステムを有効にします。"username:passwd@hostname.domainname"の形式でURLを入力すると、あたかもローカルにあるかのようにリモートディレクトリーを取得します。

"[http.us.debian.org/debian]"をURLとしてDebianアーカイブを閲覧します。

1.4. 基本のUnix的作業環境

MCはほとんど全てのことを可能にしますが、シェルプロンプトから実行されるコマンドラインツールの使用方法について学び、Unix的な作業環境に親しむのは非常に重要なことです。

1.4.1. loginシェル

ログインシェルはchsh(1)を使えば選択できます。

表1.13 シェルプログラムのリスト

パッケージ ポプコン サイズ POSIXシェル 説明
bash * V:91, I:99 3596 はい Bash: GNU Bourne Again SHell(事実上の標準シェル)
tcsh * V:6, I:40 736 いいえ TENEX C Shell: 拡張バージョンのBerkeley csh
dash * V:15, I:22 236 はい DebianのAlmquistシェル、シェルスクリプトに好適
zsh * V:2, I:5 12952 はい Z shell: 多くの拡張された標準シェル
pdksh * V:0.2, I:1.2 468 はい パブリックドメインバージョンのKornシェル
csh * V:0.6, I:2 404 いいえ OpenBSDのCシェル、Berkeley cshの派生
sash * V:0.2, I:1.0 848 はい 組み込みコマンド付きの独立シェル(標準の"/bin/sh"には不向き)
ksh * V:0.4, I:1.7 2860 はい 真のAT&TバージョンのKornシェル
rc * V:0.11, I:1.0 204 いいえ AT&T Plan 9rcシェルの実装
posh * V:0.01, I:0.13 228 はい ポリシー準拠の通常シェル(pdkshの派生)

このチュートリアル章内では、インタラクティブなシェルは常にbashです。

1.4.2. Bashのカスタム化

vim(1)の挙動は"~/.vimrc"を使ってカスタム化できます。

例えば、次を試してみて下さい。

# CD upon exiting MC
. /usr/share/mc/bin/mc.sh

# set CDPATH to good one
CDPATH=.:/usr/share/doc:~/Desktop/src:~/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章システムに関するティップ中の「着色化されたコマンド」等にあります。

1.4.3. 特別のキーストローク

Unix的環境下では、特別の意味を持ったいくつかのキーストロークがあります。通常のLinuxの文字ターミナルでは左側のCtrlAltキーのみが期待にそって機能することに配慮下さい。次に特記すべき暗記するべきキーストロークを記します。

表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)で無効にできます。

1.4.4. Unix流のマウス操作

Unix流のマウス操作は3ボタンマウスが基本です。

表1.15 Unix流のマウス操作

アクション 反応
マウスの左クリックアンドドラッグ 選択とクリップボードへのコピー
左クリック 選択スタート点の選択
右クリック 選択エンド点の選択とクリップボードへのコピー
中クリック クリップボードをカーソール位置に挿入(ペースト)

現代的なホイールマウスの真ん中のホイールは中マウスボタンと見なされ、中クリックに使えます。2ボタンマウス状況では左右のボタンの同時押しが中クリックとして使えます。Linuxの文字コンソールでマウスを使うにはgpm(8)をデーモンで実行する必要があります。

1.4.5. ページャー

less(1)は機能拡張されたページャー(ファイル内容のブラウザー)です。"h" と入力するとヘルプが表示されます。これは、more(1) よりもはるかに機能があり、"eval $(lesspipe)"または"eval $(lessfile)"とシェルのスタートスクリプト中で実行することで更に機能拡充されます。詳しくは、"/usr/share/doc/lessf/LESSOPEN"を参照下さい。"-R"オプションを用いると生の option allows raw文字出力が許可され、ANSIカラーエスケープシーケンスが有効になります。less(1)を参照下さい。

1.4.6. テキストエディター

Unix的システムで人気のある、VimEmacsプログラムのいずれかのバリアントに習熟するべきです。

著者としてはVimコマンドに慣れることは正しいことだと考えています。なぜならViエディターはLinux/Unixの世界では必ず存在するからです。(実際はオリジナルのviか、新しいnviがどこででも見つけられるプログラムです。これにもかかわらずVimを著者が初心者のために選んだのは、より強力かつ動作が充分似ているのと、F1キーを通じてヘルプが表示されるからです。)

これとは違い、EmacsXEmacsをエディターとして選ぶのも、特にプログラムをするには、非常に良い選択です。Emacsには、ニュースリーダ機能、ディレクトリーの編集機能、メール機能他の、過多な機能があります。プログラミングやシェルスクリプトの編集に使うときは、作業中のフォーマットをインテリジェントに認識し助力をしようとします。Linux上で必要なプログラムはEmacsだけと考える人もいます。Emacsを今10分間学ぶことは将来何時間もの節約になります。Emacsを学ぶ際にはGNUのEmacsマニュアルを持っておくことを高く推薦します。

これら全てのプログラムには練習しながら学べるようにチュータリングプログラムが普通付いてきます。Vimを"vim"とタイプして起動し、F1キーを押します。最初の35行を読みます。カーソールを"|tutor|"に移動しCtrl-]を押してオンラインの訓練コースを始めます。

注記

VimやEmacsのような良いエディターは、正しいフォント設定がされたUTF-8ロケールの下の正しいオプションを使ったx-terminal-emulatorを使うと、UTF-8や他のエギゾチックな符号化方式(エンコーディング)のテキストを正しく扱えます。マルチバイトテキストに関するそれぞれの文書を参照下さい。

1.4.7. デフォールトのテキストエディターの設定

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"でした。)

1.4.8. Vimのカスタム化

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

1.4.9. シェル活動の記録

シェルコマンドの出力はスクリーンから押し出されると永久に無くなってしまうかもしれません。シェルでの活動を後で見直せるようにファイルに記録しておくのは良いことです。この種の記録は何らかのシステム管理作業をする際には非常に重要です。

シェル活動の記録の基本方法はscript(1)の下で実行することです。

例えば、次を試してみて下さい:

$ script
Script started, file is typescript

scriptの下で何なりのシェルコマンドを実行します。

Ctrl-Dを押してscriptから脱出します。

$ vim typescript

「シェルの活動を綺麗に記録」を参照下さい。

1.4.10. 基本Unixコマンド

基本的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>"を作成
tar -xvf <foo>.tar "<foo>.tar"アーカイブからファイルを展開
tar -xvzf <foo>.tar.gz gzip圧縮された"<foo>.tar.gz"アーカイブからファイルを展開
tar -xvf -j <foo>.tar.bz2 "<foo>.tar.bz2"アーカイブからファイルを展開
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"アーカイブに圧縮アーカイブ
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パッケージを"aptitude 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

1.5. シェルプロンプト

Debianシステムの使い方が少し分かったでしょう。Debianシステム上でのコマンド実行のメカニズムを掘り下げます。初心者のためにちょっと簡略化してみました。正確な説明はbash(1)を参照下さい。

シンプルなコマンドは、次の要素のシーケンスとなります。

  1. 変数代入(任意)
  2. コマンド名
  3. 引数(任意)
  4. リダイレクト(任意:>>><<<等。)
  5. 制御演算子(任意:&&||と<改行>と;&())

1.5.1. コマンド実行と環境変数

環境変数の値はUnixコマンドの挙動を変えます。

環境変数のデフォールト値はPAMシステムが初期設定されます。その後次のような何らかのアプリケーションプログラムにより再設定されているかもしれません。

  • gdmのようなディスプレーマネージャーは環境変数を再設定します。
  • "~/bash_profile"や"~/.bashrc"にあるシェル起動コードの中でシェルは環境変数を再設定します。

1.5.2. "$LANG"変数

"$LANG"変数に与えられる完全なロケール値は3つの部分からなります:"xx_YY.ZZZZ"。


言語コードと国コードは"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"はシステムでフォルトのロケール値"en_US.UTF-8"に設定されます。
  • 二番目のコマンドでは、"$LANG"はフランス語のUTF-8ロケール値"fr_FR.UTF-8"に設定されます。

ほとんどのコマンド実行は頭に環境変数定義をつけないのが普通です。上記の例の代わりに次のように実行します。

$ 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"変数のみを用いてシステム環境設定する事をお薦めします。

1.5.3. "$PATH"変数

シェルにコマンドを打ち込んだ際に、シェルは"$PATH"環境変数にリストされたディレクトリーのリストから検索します。"$PATH"環境変数の値は、シェルの検索パスとも呼ばれます。

標準のDebianインストールでは、ユーザーアカウントの"$PATH"環境変数には"/sbin"や"/usr/sbin"が含まれないかもしれません。例えば、ifconfigコマンドは"/sbin/ifconfig"とフルパスを使って実行する必要があります。(類似のipコマンドは"/bin"にあります。)

Bashシェルの"$PATH"環境変数は、"~/.bash_profile"か"~/.bashrc"ファイルで変更できます。

1.5.4. "$HOME"変数

多くのコマンドはユーザー特定の設定をホームディレクトリーに保存し、その内容でコマンドの挙動が変わります。ホームディレクトリーは"$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/"へと展開します。

1.5.5. コマンドラインオプション

プログラムコマンドによっては引数があります。引数は"-"か"--"で始まり、オプションと呼ばれ、コマンドの挙動をコントロールします。

$ date
Mon Oct 27 23:02:09 CET 2003
$ date -R
Mon, 27 Oct 2003 23:02:40 +0100

上記で、コマンドライン引数"-R"がdate(1)の挙動をRFC2822準拠の日付文字列出力と変えています。

1.5.6. シェルグロブ

ファイル名を全てタイプせずにファイルのグループをコマンド処理したいことがよくあります。シェルのグロブ(ワイルドカードとも時々呼ばれる)を用いたファイル名のパターン展開を用いるとこのニーズに答えられます。

表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.5.7. コマンドの戻り値

各コマンドは終了ステータスを戻り値(変数:"$?")として返します。

表1.21 コマンドの終了コード

コマンドの終了状態 戻り値の数値 戻り値の論理値
成功 ゼロ、0
失敗 非ゼロ、-1

例えば、次を試してみて下さい。

$ [ 1 = 1 ] ; echo $?
0
$ [ 1 = 2 ] ; echo $?
1

注記

シェルの論理的な観点では、成功は、0(ゼロ)の値を持つ論理的として扱われることに注意して下さい。少々これは非直感的なのでここで再確認する必要があります。

1.5.8. 典型的なコマンドシーケンスとシェルリディレクション

次に挙げるシェルコマンドの一部として一行でタイプするシェルコマンドの慣用句を覚えましょう。

表1.22 シェルコマンドの慣用句

コマンドの慣用句 説明
command & commandをサブシェル中でバックグラウンド実行
command1 | command2 command1の標準出力をcommand2の標準入力にパイプ(同時並行で実行)
command1 2>&1 | command2 command1の標準出力と標準エラー出力をcommand2の標準入力にパイプ(同時進行で実行)
command1 ; command2 command1を実行し、後に続いてcommand2を実行
command1 && command2 command1を実行; もし成功したら、後に続いてcommand2を実行(command1command2の両方が成功したら、正常終了を返す)
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システムはマルチタスクシステムです。バックグラウンドジョブを使うと単一シェルの下で複数プログラムを実行可能にします。バックグラウンドジョブの管理にはシェル内部組み込みコマンドのjobsfgbgkillを使います。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は事前定義されています。

表1.23 事前定義されたファイルデスクリプタ

デバイス 説明 ファイルデスクリプタ
stdin 標準出力 0
stdout 標準出力 1
stderr 標準エラー出力 2

1.5.9. コマンドエリアス

良く使うコマンドにエイリアスを設定できます。

例えば、次を試してみて下さい:

$ 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"コマンドの場所を高速アクセスのために内部記録していると表示されます。

ティップ

「着色化されたコマンド」を参照下さい。

1.6. Unix的テキスト処理

Unix的作業環境では、テキスト処理はテキストを標準テキスト処理ツールの連鎖パイプを通す行います。これは決定的なUnixの発明です。

1.6.1. 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に多くの共通の拡張をしています。

1.6.2. 正規表現

正規表現は多くのテキスト処理ツールで使われています。シェルグロブに類似していますがより複雑で強力です。

正規表現はマッチするパターンを表現し、テキスト文字とメタ文字からなっています。

メタ文字は特別な意味を持った文字です。上記のようにテキストツールによって、BREEREの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

ティップ

「着色化されたコマンド」を参照下さい。

1.6.3. 置換式

置換式の場合、一部の文字に特別な意味があります

表1.25 置換式

置換式 置換式を置換する文字の説明
& 正規表現がマッチしたもの(emacsでは\&を使用)
\n n番目の括弧で囲まれた正規表現にマッチしたもの("n" は数字)

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=&=

ここで、括弧で囲まれた正規表現のスタイルと、マッチした文字列が異なるツール上でテキスト置換処理にどう使われるかとに注目下さい。

これらの正規表現は一部エディター内でカーソールの動きやテキスト置換アクションに対しても使えます。

シェルコマンドラインの行末のバックスラッシュ"\"は改行をホワイトスペース文字としてエスケープするので、シェルコマンドライン入力を次行に継続させます。

これらのコマンドを習うために、関連するマニュアルページを全て読んで下さい。

1.6.4. 正規表現を使ったグローバル置換

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です。

1.6.5. テキストファイルからのデーター抽出

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.6.6. コマンドをパイプするためのスクリプト断片

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

表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)を使って非常に複雑な操作を多くのファイルに繰り返し実行できます。「ファイル選択の慣用句」「ファイルに関してループしながらコマンドを反復実行」を参照下さい。

シェルの対話モードを使うのが複雑過ぎるようになったときには、シェルのスクリプトを書くのも一計です(「シェルスクリプト」参照)。

第2章 Debianパッケージ管理

注記

本章は最新安定版リリースがコード名:lennyと言う前提で書かれています。

Debianは、フリーソフトウエアーのコンパイル済みバイナリーパッケージからなる整合性あるディストリビューションを作り、そのアーカイブを通じてそれらを頒布するボランティア組織です。

Debianのアーカイブは、HTTPやFTP法によるアクセスされるための多くのリモートのミラーサイトとして提供されています。それは、CD-ROM/DVDによっても提供されています。

Debianのパッケージ管理システムは、適切に使われればバイナリーパッケージの整合性ある組み合わせがアーカイブからシステムにインストールされるようになっています。現在、amd64アーキテクチャーには27561つのパッケージがあります。

Debianのパッケージ管理システムは、多彩な歴史があり、使用されるフロントエンドのユーザープログラムやバックエンドのアーカイブへのアクセス方法に多くの選択肢があります。現在はDebianのパッケージ管理活動のメインフロントエンドプログラムとしてaptitude(8)を推薦します。

表2.1 Debianのパッケージ管理ツールのリスト

パッケージ ポプコン サイズ 説明
aptitude * V:26, I:98 11544 ターミナルベースのパッケージマネージャー(現在の標準、aptのフロントエンド)
apt * V:90, I:99 5320 アドバンスドパッケージツール(APT)、"http"や"ftp"や"file"というアーカイブへのアクセス方法をdpkgに提供するフロントエンド(apt-get/apt-cacheコマンドを含む)
tasksel * V:7, I:94 904 Debianシステムにタスクをインストールするための選択ツール(APTのフロントエンド)
unattended-upgrades * V:3, I:23 216 セキュリティーアップデートの自動インストールを可能にするAPTの拡張パッケージ
dselect * V:3, I:43 2288 ターミナルベースのパッケージマネージャー(過去の標準、APTや他の旧式のアクセス法のフロントエンド)
dpkg * V:92, I:99 6688 Debianのためのパッケージ管理システム
synaptic * V:17, I:44 6164 グラフィカルなパッケージマネージャー(APTのGNOMEフロントエンド)
kpackage * V:4, I:12 936 グラフィカルなパッケージマネージャー(APTのKDEフロントエンド)
apt-utils * V:52, I:99 524 APTユーティリティープログラム: apt-extracttemplates(1)とapt-ftparchive(1)とapt-sortpkgs(1)
apt-listchanges * V:6, I:9 504 パッケージ変更履歴の通知ツール
apt-listbugs * V:1.5, I:2 508 APTによる各インストール前にクリチカルバグをリストする
apt-file * V:1.7, I:9 184 APTパッケージ探索ユーティリティー -- コマンドラインインターフェース
apt-rdepends * V:0.14, I:0.9 92 パッケージの依存関係を再帰的にリスト

注記

aptitudeapt-getコマンドの両方を混用する際に迷惑だったバグ #411123は解決されました。もし本件のためにaptitude(8)を使うことに躊躇しているなら、御再考下さい。

2.1. Debainパッケージ管理の前提条件

2.1.1. パッケージ設定

Debianシステム上でのパッケージ設定の要点を次に記します。

  • システム管理者による手動の設定は尊重されます。言い換えれば、パッケージ設定システムは利便性のために勝手な設定をしません。
  • 各パッケージは、パッケージの初期インストールプロセスを助けるためのdebconf(7)と呼ばれる標準化されたユーザーインターフェースを使用し、それぞれ毎の設定スクリプトとともに提供されます。
  • Debianの開発者はパッケージの設定スクリプトによりユーザーのアップグレードが滞りなく進むように最大限の努力を行います。
  • システム管理者にはパッケージされたソフトウエアーの全機能が使用可能です。ただしセキュリティーリスクのある機能はデフォールトのインストール状態では無効にされています。
  • セキュリティーリスクのあるサービスを手動でアクティベートした場合は、リスクの封じ込めはあなたの責任です。
  • システム管理者は難解奇異な設定を手動で有効にできます。ただこんなことをすればポピュラーな一般の補助プログラムとは干渉してしまうかもしれません。

2.1.2. 基本的な注意事項

警告

ランダムな混合のスイーツからパッケージをインストールしてはいけません。コンパイラーの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システムの長い安定性の歴史それ自体は何の保証でもありません。

2.1.3. 永遠のアップグレード人生

私が上記で警告したとはいえ、自分自身で管理するデスクトップ環境ではDebianのテスト版testingや不安定版unstableのスイーツを自分のメインのシステムとして使おうと多くの本書の読者が望むことは分かっています。システムは非常に快調に動くし、頻繁に更新されるし、最新の機能が提供されるからです。

注意

あなたの業務サーバーには、セキュリティーアップデートをした安定版stableスイーツを推薦します。例えばあなたの母親のPCのように、管理に限られた時間しか割けないデスクトップPCに関しても同様の事が言えます。

"/etc/apt/sources.list"の中のディストリビューション文字列を、"testing"とか"unstable"というスイーツ名、もしくは"squeezeとか"sid"というコード名に単に設定するだけで十分です。

testingunstableを使うことは大変楽しいけれど、リスクがついてきます。Debianシステムのunstableスイーツさえおおむね非常に安定に見えますが、Debianシステムのtestingunstableスイーツでは過去パッケージ上の問題をいくつか経験して来てるし、その一部は簡単には解決できないものでした。結構痛い目に会うことになるかもしれませんよ。時々、壊れたパッケージや機能の欠損が数週間続くことが起こります。

Debianパッケージのバグからの早急かつ簡単な復元を確実にするいくつかのアイデアがここにあります。

  • Debianシステムの安定版stableスイーツを別のパーティションにインストールし、システムをヂュアルブータブル
  • レスキューブートのためのインストール用CDを手元に確保
  • apt-listbugsをインストールしてアップグレードの前にDebianバグトラッキングシステム(BTS)をチェックを考慮
  • 問題回避するのに十分なだけのパッケージシステムの基盤を学習
  • chrootか類似の環境を作り事前に最新のシステムを実行(「仮想化システム」参照)

(これらの用心のための方策の何れもできないなら、テスト版testingや不安定版unstableスイーツを使うのにはあなたはきっと準備不足です。)

以下に記すことにより悟りを開けば、アップグレード地獄という果てしない因果応報の葛藤から人は解脱し、Debianの涅槃の境地に到達できます。

2.1.4. Debianアーカイブの基本

Debianアーカイブをシステムユーザーの視点から見てみます。

ティップ

Debianアーカイブの正式のポリシーはDebianポリシーマニュアル、第2章 - Debianアーカイブに規定されています。

典型的なHTTPアクセスの場合、現在の安定版stable=lennyシステムを例にとると、次の様に"/etc/apt/sources.list"ファイルの中にアーカイブは規定されています。

deb http://ftp.XX.debian.org/debian/ lenny main contrib non-free
deb-src http://ftp.XX.debian.org/debian/ lenny main contrib non-free

deb http://security.debian.org/ lenny/updates main contrib
deb-src http://security.debian.org/ lenny/updates main contrib

"ftp.XX.debian.org"はあなたの所在場所に合う、Debianの全世界ミラーサイトリスト中に見つかるミラーサイトのURL、例えば日本なら "ftp.jp.debian.org"、に置き換えなければいけません。これらのサーバーの状況はDebianミラー確認サイトで確認できます。

上記で、次の安定版stableがリリースされて驚かされ無いように、私はスイート名の"stable"でなくコード名の"lenny"を使います。

"/etc/apt/sources.list"の意味はsources.list(5)に記載されていて、要点は以下です。

  • "deb"行がバイナリーパッケージのための定義です。
  • "deb-src"行がソースパッケージのための定義です。
  • 一番目の引数は、Debianアーカイブのroot URLです。
  • 二番目の引数は、スイーツ名かコード名のどちらかで与えられるディストリビューション名です。
  • 三番目次の引数は、Debianアーカイブの中の有効なアーカイブのコンポーネント名のリストです。

ソース関連のメタデーターにアクセスしないaptitudeのためだけなら"deb-src"行は安全に省略(もしくは"#"を行頭に挿入してコメントアウト)することができます。こうするとアーカイブのメタデーターの更新速度が向上します。URLは"http://"や"ftp://"や"file://"等々の何れも可能です。

ティップ

もし上記の例で"lenny"ではなく"sid"が使われる場合には、セキュリティーアップデートのための"deb: http://security.debian.org/ ..."行は不要です。安定版stableとテスト版testing(即ちlennysqueeze)にのみセキュリティーアップデートがあります。

次は設定ファイル内に用いられるDebianアーカイブサイトのURLとスイーツ名もしくはコード名です。

表2.2 Debianアーカイブサイトのリスト

アーカイブのURL スイート名(コード名) 目的
http://ftp.XX.debian.org/debian/ stable (lenny) 安定版(lenny)のリリース
http://ftp.XX.debian.org/debian/ testing (squeeze) テスト版(squeeze)のリリース
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://volatile.debian.org/debian-volatile/ volatile スパムフィルターやIMクライアント他用のコンパチブルなアップデート
http://volatile.debian.org/debian-volatile/ volatile-sloppy スパムフィルターやIMクライアント他用のノンコンパチブルなアップデート
http://backports.org/debian/ lenny-backports lennyのためのバックポートされたパッケージ(非正規、任意)

注意

セキュリティーアップデートされた純粋な安定版stableリリースのみが最善の安定性を提供します。一部testingunstable由来のパッケージを混用してほとんどstableリリースを走らせることは、純粋なunstableリリースを走らせるよりリスクがあります。stableリリースの下で最新バージョンのいくつかのプログラムが本当に必要なら、debian-volatileプロジェクトbackports.org(「VolatileとBackports.org」参照)サービスからのパッケージを使って下さい。これらのサービスは細心の注意を持って使う必要があります。

注意

基本的に、stabletestingunstableのスイーツの内の1つだけを"deb"行に書くべきです。もし、stabletestingunstableのスイーツの何らかの組み合わせを"deb"行に書けば、APTプログラムは、最新のアーカイブのみが有効であるにもかかわらず、実行速度が低下します。"/etc/apt/preferences"ファイルがはっきりとした目的を持って使われている場合(「候補バージョンの調整」)のみ複数のリストに意味があります。

注記

stabletestingスイーツのDebianシステムでは、上記の例のようにセキュリティーアップデートを有効とするように"/etc/apt/sources.list"の中に"http://security.debian.org/"の行を含めることはいいことです。

各Debianアーカイブは3つのコンポーネントから成り立っています。コンポーネントには"Debianポリシー"ではカテゴリーとか"Debian社会契約"ではエリアという別名が使われています。コンポーネントは"Debianフリーソフトウエアーガイドライン" (DFSG)に準拠しているかどうかによって分類されています。

表2.3 Debianアーカイブコンポーネントのリスト

コンポーネント パッケージ数 パッケージのクライテリア
main 26980 DSFGに完全準拠し、non-freeのパッケージに非依存(main=主要)
contrib 180 DSFGに完全準拠だがnon-freeのパッケージに依存有り(contrib=寄与)
non-free 401 非DSFG準拠

ここで、上記にあるパッケージ数はamd64アーキテクチャーに関する数字です。厳密に言うなら、mainコンポーネントのアーカイブのみをDebianシステムと考えるべきです。

Debianアーカイブの構成は、各アーカイブのURLの後ろにdistspoolをつけたURLにブラウザーを向ければ学習できます。

ディストリビューションは、スイーツとコード名の2つの方法で言及されます。この他にディストリビューションと言う言葉は多くの文書でスイーツの同義語としても使われています。スイーツとコード名の関係は次のようにまとめられます。

表2.4 スイーツとコード名の関係

タイミング スイーツ = 安定版 stable スイーツ = テスト版 testing スイーツ = 不安定版 unstable
lennyリリース後 コード名 = lenny コード名 = squeeze コード名 = sid
squeezeリリース後 コード名 = squeeze コード名 = squeeze+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にて)
  • アーカイブの同期のタイミング問題(testingunstableの両方にて)。
  • パッケージの除去などのアーカイブへの手動の介入(どちらかといえばtestingにて)、等。

もしこれらのアーカイブを使おうと考えるなら、この種の細かな問題の修復や回避は必須技能です。

注意

たとえいつも非安定版unstableやテスト版testingアーカイブを使っていようとも、ほとんどのデスクトップユーザーは新たな安定版stableリリースの後約数ヶ月はセキュリティーアップデートされた安定版stableアーカイブを使うべきです。この移行期は、非安定版unstableもテスト版testingアーカイブの何れももほとんどの人に良いものではありません。非安定版unstableアーカイブを使おうとすると、核となるパッケージが大アップグレードの嵐に見舞われるので、あなたのシステムをうまく使える状態に保つのは困難です。テスト版testingアーカイブを使おうとしても、安定版stableアーカイブとほとんど同じ内容でセキュリティーサポートはありません(Debian testing-security-announce 2008-12)。1ヶ月ほど経てば、非安定版unstableアーカイブなら注意を払えば使えるかもしれません。

ティップ

テスト版testingアーカイブを追跡している際には、除去されたパッケージによって引き起こされる問題は該当するバグ修正のためにアップロードされたパッケージを非安定版unstableアーカイブからインストールすれば通常回避できます。

アーカイブの定義は、Debianポリシーマニュアルを参照下さい。

2.1.5. パッケージ依存関係

Debianシステムはコントロールファイル中のバージョン情報付きのバイナリー依存関係宣言を通して整合性のあるバイナリーパッケージの集合を提供します。ここにその少々簡素化し過ぎの定義を示します。

  • "Depends"

    • これは絶対依存を宣言し、このフィールドにリストされた全てのパッケージは同時または事前にインストールされていなければいけません。
  • "Pre-Depends"

    • これは、リストされたパッケージが事前にインストールを完了している必要がある以外は、Dependsと同様です。
  • "Recommends"

    • これは強いが絶対でない依存を宣言します。多くのユーザーはこのフィールドにリストされたパッケージ全てがインストールされていなければ、当該パッケージを望まないでしょう。
  • "Suggests"

    • これは弱い依存を宣言します。このパッケージの多くのユーザーはこのフィールドにリストされたパッケージをインストールすればメリットを享受できるとは言え、それら抜きでも十分な機能が得られます。
  • "Enhances"

    • これはSuggests同様の弱い依存を宣言しますが、依存作用の方向が逆です。
  • "Conflicts"

    • これは絶対的排他関係を宣言します。このフィールドにリストされた全てのパッケージを除去しない限り当該パッケージをインストールできません。
  • "Replaces"

    • 当該パッケージによりインストールされるファイルがこのフィールドにリストされたパッケージのファイルを置き換える際にこれを宣言します。
  • "Provides"

    • 当該パッケージがこのフィールドにリストされたパッケージのファイルと機能の全てを提供する際にこれを宣言します。

注記

正常な設定として"Provides"と"Conflicts"と"Replaces"とを単一バーチャルパッケージに対し同時宣言することがあります。こうするといかなる時にも当該バーチャルパッケージを提供する実パッケージのうち確実に一つだけがインストールされます。

ソースの依存関係をも含む正式の定義はthe Policy Manual: Chapter 7 - Declaring relationships between packagesにあります。

2.1.6. パッケージ管理のイベントの流れ

パッケージ管理の簡略化されたイベントの流れをまとめると次のようになります。

  • 更新 ("aptitude update"か"apt-get update"):

    1. アーカイブメタデーターをリモートアーカイブから取得
    2. APTが使えるようローカルメタデーターの再構築と更新
  • アップグレード("aptitude safe-upgrade"と"aptitude full-upgrade"か、"apt-get upgrade"と"apt-get dist-upgrade"):

    1. 全てのインストール済みパッケージに関して、通常最新バージョンが選ばれる候補バージョンを選択(例外については「候補バージョンの調整」参照)
    2. パッケージ依存関係解決の実行
    3. もし候補バージョンがインストール済みバージョンと異なる際には、選ばれたバイナリーパッケージをリモートアーカイブから取得
    4. 取得バイナリーパッケージの開梱
    5. preinstスクリプトの実行
    6. バイナリーファイルのインストール
    7. postinstスクリプトの実行
  • インストール ("aptitude install ..."か"apt-get install ..."):

    1. コマンドラインにリストされたパッケージの選択
    2. パッケージ依存関係解決の実行
    3. 選ばれたバイナリーパッケージをリモートアーカイブから取得
    4. 取得バイナリーパッケージの開梱
    5. preinstスクリプトの実行
    6. バイナリーファイルのインストール
    7. postinstスクリプトの実行
  • 削除 ("aptitude remove ..."か"apt-get remove ..."):

    1. コマンドラインにリストされたパッケージの選択
    2. パッケージ依存関係解決の実行
    3. prermスクリプトの実行
    4. 設定ファイル以外のインストール済みファイルの削除
    5. postrmスクリプトの実行
  • 完全削除 ("aptitude purge ..."か"apt-get purge ..."):

    1. コマンドラインにリストされたパッケージの選択
    2. パッケージ依存関係解決の実行
    3. prermスクリプトの実行
    4. 設定ファイルを含めたインストール済みファイルの削除
    5. postrmスクリプトの実行

上記では全体像の理解のためにわざと技術詳細を端折っています。

2.1.7. パッケージ管理のトラブルへの応急対処法

内容が正確な正式文書を読むように心がけるべきです。まず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)コマンドを使います。

2.2. 基本的パッケージ管理操作

AptitudeはDebianシステムで現在推薦されるパッケージ管理ツールです。apt-get / apt-cacheをコマンドラインで代替もしますし、またフルスクリーンのインタラクティブなパッケージ管理ツールとしても使えます。

パッケージをインストールしたりパッケージのメタデーターを更新するようなパッケージ管理操作にはroot権限が必要です。

2.2.1. コマンドラインによる基本的なパッケージ管理操作

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>とマッチするパッケージがインストールされないのかを説明

Debianシステム上の異なったパッケージツールを混用しても問題が起こらなくなりましたが、できるだけaptitudeを使い続けるのが最善です。

"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パッケージは、過去のリリースでは推薦されたフルスクリーンのインタラクティブなパッケージ管理ツールでした。

2.2.2. aptitudeのインタラクティブな使用

インタラクティブなパッケージ管理のためにはaptitudeをインタラクティブモードでコンソールのシェルプロンプトから次のように立ち上げます。

$ sudo aptitude -u
Password:

これによりアーカイブ情報のローカルコピーは更新され、フルスクリーンのパッケージリストがメニュー付きで表示されます。Aptitudeの設定ファイルは"~/.aptitude/config"にあります。

ティップ

userの設定ファイルでなくrootの設定ファイルを使いたい際には、上記の例で"sudo aptitude ..."の代わりに"sudo -H aptitude ..."を使います。

ティップ

Aptitudeはインタラクティブに起動されると次にするアクションを自動的に設定します。その設定が好ましくない場合はメニュー:"Action" → "Cancel pending actions"からリセットすることができます。

2.2.3. aptitudeのキーバインディング

パッケージの状態を閲覧し、"予定のアクション"の設定をこのフルスクリーンモードで各パッケージするための重要なキーを次に記します。

表2.8 aptitudeのキーバインディングのリスト

キー キーバインディング
F10もしくくはCtrl-t メニュー
? (より詳細な)キーの意味のヘルプの表示
F10 → ヘルプ → ユーザーマニュアル ユーザーマニュアルの表示
u パッケージアーカイブ情報の更新
+ パッケージをアップグレードまたはインストールするとマーク
- パッケージを削除するとマーク(設定ファイルは温存)
_ パッケージを完全削除するとマーク(設定ファイルも削除)
= パッケージをホールド
U 全てのアップグレード可能なパッケージをマーク(full-upgradeとして機能)
g 選ばれたパッケージのダウンロードインストールをスタート
q 現在のスクリーンを終了し変更を保存
x 現在のスクリーンを終了し変更を廃棄
Enter パッケージに関する情報閲覧
C パッケージの変更履歴を閲覧
l 表示されるパッケージの制限を変更
/ 最初のマッチを検索
\ 最終検索の反復

コマンドラインのファイル名の規定や、"l"や"/"を押した後のメニュープロンプトは次に記すaptitudeのregex(正規表現)が使われます。aptitudeのregexは"~n"で始めそれにパッケージ名を続けた文字列を使うことで明示的にパッケージ名とマッチさせられます。

ティップ

ビジュアルインターフェースで全てのインストール済みパッケージを候補バージョンにアップグレードさせるには"U"を押さなければいけません。これをしないと選ばれたパッケージとそれにバージョン付きの依存関係のある特定のパッケージのみがアップグレードされます。

2.2.4. aptitudeの下でのパッケージの表示

インタラクティブなフルスクリーンモードのaptitude(8)はパッケージリスト中のパッケージは次の例のように表示されます。

idA   libsmbclient                             -2220kB 3.0.25a-1  3.0.25a-2

上記の行は左から次に記すような意味です。

  • "現状"フラグ(1番目の文字)
  • "予定のアクション"フラグ(2番目の文字)
  • "自動"フラグ(3番目の文字)
  • パッケージ名
  • "予定のアクション"に帰属されるディスク空間の使用の変化
  • パッケージの現バージョン
  • パッケージの候補バージョン

ティップ

"?"を押して表示されるヘルプスクリーンの一番下に全フラグのリストがあります。

現在のローカルの環境設定によって候補バージョンは選ばれます(apt_preferences(5)と「候補バージョンの調整」を参照)。

"表示"メニューの下に数種のパッケージ表示があります。

表2.9 aptitudeの表示のリスト

表示 状況 ビューの説明
パッケージ画面 良好 表2.10「標準パッケージ画面の分類」参照(デフォールト)
推奨を監査 良好 何らかのインストール済みパッケージによって推薦されているがインストールされていないパッケージをリスト
平坦なパッケージリスト 良好 パッケージを分類せずにリスト(regexとともに使用)
Debtags表示 十分使える パッケージのdebtagsのエントリーにより分類したパッケージをリスト
カテゴリー別表示 非推奨 パッケージのカテゴリー別に分類してパッケージをリスト(これに代えてDebtags表示を利用しましょう)

標準"パッケージ画面"はパッケージをdselectにいくつかの機能を加えた感じで分類します。

表2.10 標準パッケージ画面の分類

分類 ビューの説明
更新可能なパッケージ sectioncomponentpackageと整理してパッケージをリスト
新規パッケージ , ,
インストール済みのパッケージ , ,
インストールされていないパッケージ , ,
廃止された、またはローカルで作成されたパッケージ , ,
仮想パッケージ 同一機能のパッケージをリスト
タスク タスクに一般的に必要な機能を持つパッケージのリスト

ティップ

Tasksビューはあなたのタスクに使うパッケージをいいとこ取りするのに使えます。

2.2.5. aptitudeを使った探索方法

Aptitudeはそのregex式機能を通してパッケージを探索する方法をいくつか提供します。

  • シェルコマンドライン:

    • マッチするパッケージのインストール状態やパッケージ名や短い説明をリストをする、"aptitude search '<aptitude_regex>'"
    • パッケージの詳細説明のリストをする、"aptitude show '<package_name>'"
  • 対話型フルスクリーンモード:

    • マッチするパッケージにパッケージビューを絞る、"l"
    • マッチするパッケージを探す、"/"
    • マッチするパッケージを逆方向に探す、"\"
    • 次を探す、"n"
    • 次を逆方向に探す、"N"

ティップ

<package_name>という文字列は、"~"で始めてregex式と明示されていない限り、パッケージ名との完全な一致検索として扱います。

2.2.6. aptitudeの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

  • regex部分は、"^"や".*"や"$"などを使うegrep(1)やawk(1)やperl(1)といった典型的なUnix的テキストツールで使われるEREと同様です。
  • 依存関係を表す<type>は(depends, predepends, recommends, suggests, conflicts, replaces, provides)の内の1つです。
  • デフォールトの依存関係は"depends"です。

ティップ

<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"を参照下さい。

2.2.7. aptitudeによる依存関係の解決

aptitudeによるパッケージの選択は、"F10 → Options → Dependency handling"のメニュー設定に従って、"Depends:"リストに規定されたパッケージばかりでは無く"Recommends:"リストに規定されたパッケージも引き込みます。このような自動的にインストールされたパッケージは不要になるとaptitudeが自動的に削除します。

注記

lennyリリース以前は、apt-get等の他の標準的なAPTツールは自動的削除機能がありませんでした。

2.2.8. パッケージアクティビティーログ

パッケージアクティビティーの履歴はログファイルで確認できます。

表2.12 パッケージアクティビティーのログファイル

ファイル 内容
/var/log/dpkg.log 全パッケージアクティビティのdpkgレベルのアクティビティーのログ
/var/log/apt/term.log APTアクティビティのログ
/var/log/aptitude aptitudeコマンドアクティビティのログ

これらのログから意味のある理解を迅速に得るのは実際には難しいです。より簡単な方法については「設定ファイルの変更記録」を参照下さい。

2.2.9. Aptitudeの長所

Aptitudeは他のAPT準拠のパッケージシステム(apt-get, apt-cache, synaptic, …)と比べて次の有利な点があります。

  • aptitudeは独自の追加層(/var/lib/aptitude/pkgstates)を使用して自動インストールされ使われなくなったパッケージを自動的に削除します。(新しいlennyでは、他のAPTも同様のことをします。)
  • aptitudeを使うことでパッケージ間のコンフリクト解消や推薦パッケージの追加がしやすくなります。
  • aptitudeを使うことで"廃止された、またはローカルで作成されたパッケージ"の下にリストすることで廃止ソフトウェアを追跡がしやすくなります。
  • aptitudeは"/var/log/aptitudeにその履歴記録を残します。
  • aptitudeを使うことで利用可能な全てのバージョンのパッケージにアクセスできます。
  • aptitudeには特定パッケージを探したり表示を制限するためのかなり強力なregexシステムがあります。
  • フルスクリーンモードのaptitudesu機能がついているので本当に管理権限が必要になるまでは通常のユーザーからの実行ができます。

旧式のetchリリースのバージョンでは、synapticも履歴記録がありました。またapt-getには履歴記録がありませんでしたが、dpkgの記録に頼れました。

何れにせよaptitudeはコンソールでのインタラクティブな使用に好適です。

2.3. aptitude操作例

aptitude(8)操作例を次に示します。

2.3.1. regexにマッチするパッケージ名のパッケージをリスト

次のコマンドはパッケージの名前が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

これはパッケージの正確な名前を探すときに非常に便利です。

2.3.2. regexマッチをしての閲覧

"平坦なパッケージリスト"のビューで"l"のプロンプトにregex"~dipv6"を入れるとその意味にマッチするパッケージにビューが制限され、その情報をインタラクティブに閲覧できます。

2.3.3. パッケージの完全削除

削除したパッケージが残した全ての設定ファイルを次のようにして完全削除できます。

次のコマンドの結果をチェックします。

# aptitude search '~c'

もしリストされたパッケージが完全削除されても問題ないなら、次のコマンドを実行します。

# aptitude purge '~c'

同様のことをインタラクティブにすればよりきめの細かい結果が得られます。

"平坦なパッケージリスト"のビューで"l"のプロンプトにregex"~c"を入れるとregexにマッチする"削除されたが完全さ駆除されていない"パッケージにビューが制限されます。トップレベルの見出しの上で"["を押すとregexにマッチする全てのパッケージが表示されます。

次に"インストール済みのパッケージ"等のトップレベルの見出しの上で"_"を押します。その見出しの下のregexにマッチするパッケージだけが完全削除と設定されます。インタラクティブに個々のパッケージの上で"="を押せばそれらのパッケージを完全削除対象から外せます。

このテクニックは非常に便利で、他の多くのコマンドキーでも使えます。

2.3.4. 自動/手動インストール状態の整理

(非aptitudeのパッケージインストーラー等を使った後で)パッケージの自動/手動インストールの状態を整理する私の方法を次に記します。

  1. aptitudeをrootとしてインタラクティブに起動します。
  2. "u"と"U"と"f"と"g"とタイプしてパッケージリストを更新しパッケージをアップグレードします。
  3. パッケージ表示制限を"~i(~R~i|~Rrecommends:~i)"と入力するために"l"とタイプし、自動インストールとなるよう"M"と"インストール済みのパッケージ"の上でタイプします。
  4. パッケージ表示制限を"~prequired|~pimportant|~pstandard|~E"と入力するために"l"とタイプし、手動インストールとなるよう"m"と"インストール済みのパッケージ"の上でタイプします。
  5. パッケージ表示制限を"~i!~M"と入力するために"l"とタイプし、"インストール済みのパッケージ"の上で"["とタイプしてパッケージを見えるようにした後で個々のパッケージの上で"-"とタイプして使っていないパッケージを削除します。
  6. パッケージ表示制限を"~i(~R~i|~Rrecommends:~i)"と入力するように"l"とタイプし、"インストール済みのパッケージ"の上で自動インストールとなるよう"M"とタイプします。
  7. aptitudeを終了します。
  8. "apt-get -s autoremove|less"とrootから起動して何が使われていないのか確認します。
  9. aptitudeとインタラクティブモードで再起動して必要なパッケージを"m"でマークします。
  10. "apt-get -s autoremove|less"とrootから再起動して削除対象が期待にかなっていることを再確認します。
  11. "apt-get autoremove|less"とrootから起動して使用していないパッケージを自動削除します。

"Tasks"の上で"m"を押すのも一案で、大量ファイル除去となる事態が回避できます。

2.3.5. aptitudeを使ったシステム全体のアップグレード

注記

新規リリース等への移行は、Debianでは下記のようにアップグレードできるのですが、新たなシステムをクリーンインストールすることを考えるべきです。こうすると溜めてきたゴミの除去ができる上に最新のパッケージの最良の組み合わせも分かります。もちろん安全な場所に完全なシステムのバックアップ(「バックアップと復元」参照)を事前にしなくてはいけません。異なったパーティションを使ったデュアルブート設定をすることをスムーズな移行をするためにお薦めします。

"/etc/apt/sources.list"ファイルの内容を新規リリースへと向けるように変更し、"aptitude update; aptitude full-upgrade"コマンドを実行することでシステム全体のアップグレードができます。

安定版stableからテスト版testingや不安定版unstableにアップグレードするには、「Debianアーカイブの基本」にある"/etc/apt/sources.list"例の"lenny"を"squeeze"か"sid"に置き換えます。

一部のパッケージで移行に関して支障をきたすことが実際には起こるかもしれません。これは大体パッケージ依存関係に起因します。アップグレードする差が大きければ大きいほど比較的大きな問題似合う可能性がより大きくなります。以前の安定版stableからリリース後の新規安定版stableへの移行では新規リリースノートを読んでそこに記載された手続き通りに完全にすれば問題発生を防げます。

安定版stableからテスト版testingへ移行すると決めた時には頼りにするリリースノートはありません。前回の安定版stableのリリースの後で安定版stableとテスト版testingの差がかなり大きくなっているかもしれません。そうだとアップグレードをする状況は複雑になっています。

メーリングリストから最新情報を収集するとか常識を使うといった予防措置をしながらフルアップグレードをするべきです。

  1. 前回の"リリースノート"を読みます。
  2. 全システム(特にデーターや設定情報)をバックアップします。
  3. ブートローダーが壊れたときのためにブートできるメディアを確保します。
  4. システムを使っているユーザーに十分事前に通告します。
  5. script(1)を使ってアップグレード活動を記録します。
  6. 削除をされないように"aptitude unmarkauto vim"等として、"unmarkauto"を重要なパッケージに適用します。
  7. デスクトップタスクにあるパッケージ等を削除して、インストールされたパッケージを減らしてパッケージがコンフリクトする可能性を減らします。
  8. "/etc/apt/preferences"ファイルを削除します(apt-pinningを無効化)。
  9. 段階的にアップグレードしましょう: 旧安定版oldstable → 安定版stable → テスト版testing → 不安定版unstable
  10. "/etc/apt/sources.list"ファイルを更新して新アーカイブ対象に"aptitude update"を実行します。
  11. "aptitude install perl"等として、先に新規の中核的パッケージを必要に応じてインストールします。
  12. "aptitude full-upgrade -s"コマンドを実行して影響を確認します。
  13. 最後に"aptitude full-upgrade"コマンドを実行します。

注意

stableリリース間でアップグレードする際にDebianのメジャーリリースを飛ばすのは賢明ではありません。

注意

過去の"リリースノート"ではシステム全体のアップグレードをするのにGCCやLinuxカーネルやinitrd-toolsやGlibcやPerlやAPT tool chain等には特別な配慮が必要でした。

unstableでの毎日のアップグレードは「パッケージ問題からの防御」を参照下さい。

2.4. 高度なパッケージ管理操作

2.4.1. コマンドラインによる高度なパッケージ管理操作

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"と"*.diff.gz")からソースツリーをビルド
debuild binary ローカルのソースツリーからパッケージをビルド
make-kpkg kernel_image カーネルソースツリーからカーネルパッケージをビルド
make-kpkg --initrd kernel_image カーネルソースツリーからinitramfsを有効にしてカーネルパッケージをビルド
dpkg -i <パッケージ名>_<バージョン>-<debianバージョン>_<アーキテクチャー名>.deb ローカルパッケージをシステムにインストール
debi <パッケージ名>_<バージョン>-<debianバージョン>_<アーキテクチャー名>.dsc ローカルパッケージ(複数)をシステムにインストール
dpkg --get-selection '*' >selection.txt dpkgレベルのパッケージ選択状態情報を保存
dpkg --set-selection <selection.txt dpkgレベルのパッケージ選択状態情報を設定

注意

"dpkg -i …"や"debi …"といった低いレベルのパッケージツールはシステム管理者によって注意深く使われなければいけません。必要なパッケージ依存関係を自動的に面倒見てくれません。Dpkgの"--force-all"や類似のコマンドラインオプション(dpkg(1)参照)はエキスパートだけが使うようにできています。十分にその影響を理解せずに使うとシステム全体を壊してしまうかもしれません。

以下に注意下さい。

  • 全てのシステム設定やインストールコマンドはrootから実行なければいけません。
  • regex(「正規表現」参照)を使う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パッケージが必要です(「カーネル」参照)。
  • 一般的なパッケージ化に関しては「Debianパッケージ作成」を参照下さい。

ティップ

ソースパッケージの組としてここで説明したソースパッケージのフォーマット("*.tar.gz"と"*.diff.gz")はまだ主流の1.0フォーマットです。他の新規フォーマットに関しての詳細はdpkg-source(1)を参照下さい。

2.4.2. インストールされたパッケージファイルの検証

debsumsをインストールするとdebsums(1)を使って"/var/lib/dpkg/info/*.md5sums"ファイル中のMD5sum値との比較でインストールされたパッケージファイルを検証できます。MD5sumがどのような仕組かは「MD5和」参照下さい。

注記

侵入者によってMD5sumのデーターベースが改竄されているかもしれないのでdebsums(1)はセキュリティーツールとしては限定的有用性しかありません。管理者によるローカルの変更や記憶メディアのエラーによる損傷を点検するぐらいには有用です。

2.4.3. パッケージ問題からの防御

多くのユーザーは新規機能やパッケージを求めてDebianシステムの非安定版unstableリリースを追いかけることを好みます。こういうことをするとクリティカルなパッケージのバグにシステムが遭遇しやすくなります。

apt-listbugsパッケージをインストールすれば、APTシステムを使ってアップグレードする時にDebianのBTSを自動的にクリティカルなバグに関して点検することで、クリティカルなバグからあなたのシステムを防御できます。

apt-listchangesパッケージをインストールすれば、APTシステムを使ってアップグレードする時にNEWS.Debian中の重要ニュースを表示します。

2.4.4. パッケージメタデーターの検索

最近は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)を使います。

2.5. Debianパッケージ管理の内部

Debianのパッケージ管理システムが内部的のどのように機能するのかを学びます。何らかのパッケージ問題が発生した際にあなた自身の解決を見出すのに役立つでしょう。

2.5.1. アーカイブのメタデーター

各ディストリビューションのメタデーターのファイルは例えば"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を連結

最近のアーカイブではネットワークトラフィックを減らすべく圧縮された差分ファイルとしてこれらのメタデーターは保存されています。

2.5.2. トップレベルの"Release"ファイルと信憑性

ティップ

セキュアー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)"や"コンポーネント(component)"を使う理由はこれを見れば分かるでしょう。"ディストリビューション"は"スイーツ"と"コード名"との両方を指したい際に用いられます。

トップレベルの"Release"ファイルの整合性は セキュアーaptという暗号学手法インフラストラクチャーによって検証されます。

  • 暗号手法による署名ファイル"Release.gpg"は真正のトップレベルの"Release"ファイルと秘密のDebianアーカイブキーから作成されます。
  • 公開のDebianアーカイブキーは"/etc/apt/trusted.gpg"に取り込むには次のようにします。

  • セキュアーAPTシステムはこの"Release.gpg"ファイルと"/etc/apt/trusted.gpg"中の公開アーカイブキーを用いてダウンロードされたトップレベルの"Release"ファイルの整合性を暗号学手法を用いて検証します。

"全てのPackages"と"Sourcesファイルの整合性はそのトップレベルの"Release"ファイル中のMD5sum値を用いて検証します。"パッケージファイルの整合性は"Packages"や"Sources"ファイル中のMD5sum値を用いて検証します。debsums(1)と「インストールされたパッケージファイルの検証」を参照下さい。

暗号学手法を用いた署名の検証はMD5sum値の計算よりも非常にCPUを使うプロセスなので、トップレベルの"Release"ファイルには暗号学手法を用いた署名を使いつつ各パッケージにはMD5sum値を用いることでパーフォーマンスを保ったまま良好なセキュリティーが確保できます(「データーセキュリティーのインフラ」参照)。

2.5.3. アーカイブレベルの"Release"ファイル

ティップ

アーカイブレベルの"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"等)が使われます。

experimentalvolatile-sloppylenny-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)と「候補バージョンの調整」参照)。

2.5.4. パッケージメタデーターの取得

aptitudeapt-getsynapticapt-fileauto-apt等のAPTツールが使われる際にはDebianアーカイブ情報を含むメタデーターのローカルコピーを更新する必要があります。この様なローカルのコピーは"/etc/apt/sources.list"中のディストリビューションコンポーネントアーキテクチャーの名前に対応する次のファイル名です(「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"のローカルコピーがデフォールトでは異なるところにあります。)

2.5.5. APTに関するパッケージ状態

lenny以降のAPTツールではリモートから取得したメタデーターに追加でローカルで生成されるインストール状態情報を"/var/lib/apt/extended_states"に保存して、自動インストールされた全パッケージを全てのAPTツールで追跡するのに用います。

2.5.6. aptitudeに関するパッケージ状態

aptitudeコマンドではリモートから取得したメタデーターに追加でローカルで生成されるインストール状態情報を"/var/lib/aptitude/pkgstates"に保存して用いています。

2.5.7. 取得したパッケージのローカルコピー

APTメカニズムでリモートから取得されたパッケージは消去されるまでは"/var/cache/apt/packages"に貯蔵されます。

2.5.8. Debianパッケージファイル名

Debianのパッケージファイルには特定の名前の構造があります。

表2.15 Debianパッケージの名前の構造

パッケージタイプ 名前の構造
バイナリーパッケージ(所謂deb) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>-<アーキテクチャー>.deb
debianインストーラーのためのバイナリーパッケージ(所謂udeb) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>-<アーキテクチャー>.udeb
ソースパッケージ(アップストリームのソース) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.tar.gz
ソースパッケージ(Debianの変更部分) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.diff.gz
ソースパッケージ(内容記述) <パッケージ名>_<エポック>:<アップストリームのバージョン>-<debianのバージョン>.dsc

表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パッケージです。debudebパッケージは同一のパッケージ構造を共有しています。"u"はマイクロと言う意味で使っています。

2.5.9. dpkgコマンド

dpkg(1)はDebianパッケージ管理の最も低レベルのツールです。非常に強力ですから気をつけて使う必要があります。

"<パッケージ名>"というパッケージをインストールする際に、dpkgは次に記す順番でパッケージを処理します。

  1. debファイルを解凍("ar -x"と等価)
  2. debconf(1)を使い"<package_name>.preinst"を実行
  3. システムにパッケージ内容をインストール("tar -x"と等価)
  4. 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コマンドです。

2.5.10. update-alternativeコマンド

Debianシステムにはupdate-alternatives(8)を用いて何らかの重畳するプログラムを平和裏にインストールするメカニズムがあります。例えばvimnviの両方のパッケージがインストールされた状況下で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/"の中の対応するファイルが使われます。

2.5.11. dpkg-statoverrideコマンド

dpkg-statoverride(8)コマンドで提供される状態の上書きは、パッケージをインストールする際にファイルに関して異なる所有者やモードを使うようdpkg(1)に指示する方法です。もし"--update"が指定されファイルが存在すれば、即座に新たな所有者やモードに設定されます。

注意

パッケージが所有するファイルの所有者やモードをシステム管理者がchmodchownコマンドを用いて直接変更しても次のパッケージアップグレードがリセットします。

注記

ここでファイルと言いましたが、実際にはdpkgが扱うディレクトリーやデバイス等のいかなるファイルシステムオブジェクトであってもいいです。

2.5.12. dpkg-divertコマンド

dpkg-divert(8)コマンドによって提供されるファイル迂回は、ファイルをデフォールトの場所ではなく迂回した場所にインストールするようにdpkg(1)にさせます。dpkg-divertは本来パッケージメインテナンススクリプトのためのものです。システム管理者がこれを軽々に使うのはお薦めできません。

2.6. 壊れたシステムからの復元

非安定(unstable)システムを動かす時には、管理者には壊れたパッケージ管理状況から復元できることが望まれます。

注意

ここで説明するいくつかの方法は非常にリスクが高いアクションです。警告しましたよ!

2.6.1. 古いユーザーの設定との非互換性

もしデスクトップGUIプログラムが上流の大きなバージョンアップグレードの後に不安定性を経験した際には、そのプログラムが作った古いローカル設定ファイルとの干渉を疑うべきです。もし新規作成したユーザーアカウントでそのプログラムが安定なら、この仮説が裏付けられます。(これはパッケージングのバグで、通常パッケージャーによって回避されます。)

安定性を復元するには、対応するローカル設定ファイルを移動しGUIプログラムを再スタートします。後日設定情報を回復するために古い設定ファイルの内容を読む必要があるかもしれません。(あまり慌てて消去しないようにしましょう。)

2.6.2. 重複するファイルを持つ相異なるパッケージ

aptitude(8)やapt-get(1)等の、アーカイブレベルのパッケージ管理システムはパッケージの依存関係を使って重複するファイルを持つファイルのインストールしようとさえしません(「パッケージ依存関係」参照)。

パッケージメインテナによるエラーや、システム管理者による不整合な混合ソースのアーカイブの採用(「混合したアーカイブソースからのパッケージ」参照)があった場合には、パッケージ依存関係が誤って定義される事態が発生するかもしれません。そういう状況下で重複するファイルを持つパッケージをaptitude(8)やapt-get(1)を使ってインストールしようとすると、パッケージを展開するdpkg(1)は既存ファイルを上書きすることなく呼ばれたプログラムにエラーを確実に返します。

注意

第三者が作成したパッケージを使うと、root権限で実行されるシステムに関して何でもできるメンテナスクリプトが実行されるので、システムが重大なリスクにさらされます。dpkg(1)はパッケージを展開するするさいに上書きする事を防止するだけです。

そのような壊れたインストール状況は、まず古い問題原因となっているパッケージ<old-package>を削除すれば回避できます。

$ sudo dpkg -P <old-package>

2.6.3. 壊れたパッケージスクリプトの修正

パッケージスクリプト内のコマンドが何らかの理由でエラーを返しスクリプトがエラーで終了した場合には、パッケージ管理システムは動作を途中終了するので部分的にインストールされたパッケージのある状況が生まれます。パッケージがその削除スクリプト内にバグを持つ場合には、パッケージが削除不能になりうるので大変厄介です。

"<パッケージ名>"のパッケージスクリプトの問題に関しては、次のパッケージスクリプトの内容を確認するべきです。

  • "/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

2.6.4. dpkgコマンドを使っての救済

dpkgは非常に低レベルのパッケージツールなのでネットワーク接続もないブート不能な非常に劣悪な状況下でも機能します。fooパッケージが壊れていて置き換える必要があると仮定します。

バグの無い古いバージョンのfooパッケージが"/var/cache/apt/archives/"にあるパッケージキャッシュの中に見つかるかもしれません。(ここにみつからなければ、http://snapshot.debian.net/アーカイブからダウンロードしたり、機能している機器のパッケージキャッシュからコピーできます。)

もしブート不可能な場合には、次のコマンドを使ってインストールすることもできます。

# dpkg -i /path/to/foo_<old_version>_<arch>.deb

ティップ

システムがそれほど壊れていないなら、「緊急ダウングレード」に書かれているようにして、より高レベルのAPTシステムを通じてシステム全体をダウングレードする手もあります。

ハードディスクからブートできない場合は、他の方法でのブート方法を考えるべきです。

  1. デビアンインストーラー(debian-installer)のCDを使ってレスキューモードでブートします。
  2. ブートできないハードディスク上のシステムを"/target"にマウントします。
  3. 古いバージョンの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)を参照下さい。

注記

システムがひどく壊れた場合には、システムを安全な場所に完全バックアップし(「バックアップと復元」参照)、クリー(see 「バックアップと復元」)ンインストールを実行するべきです。こうすることは時間お節約でもあり最終的に良い結果に結びつきます。

2.6.5. パッケージセレクションの復元

もし何らかの理由で"/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"のようなパッケージ名以外が一部あるかもしれません。)

2.7. パッケージ管理のヒント

2.7.1. Debianパッケージの選択方法

パッケージの説明や"Tasks"の下のリストを使ってあなたが必要なパッケージをaptitudeで見つけることができます。

2つ以上の似たパッケージに出会いが"試行錯誤"の努力無しにどのパッケージをインストールするか迷った際には、常識を使って下さい。次に示す点は好ましいパッケージの良い指標と考えます。

  • 必須(essential): yes > no
  • コンポーネント(component): メイン(main) > contrib > non-free
  • 優先度(priority): 必須(required) > 重要(important) > 標準(standard) > 任意(optional) > 特別(extra)
  • タスク(tasks): "デスクトップ環境"のようなタスクにリストされたパッケージ
  • 依存パッケージにより選ばれたパッケージ(例えば、pythonによるpython2.4)
  • ポプコン: 投票やインストールの数が多い
  • changelog: メンテナによる定期的アップデート
  • BTS: RC bugが無いこと (criticalもgraveもseriousもいずれのバグも無い)
  • BTS: バグレポートに反応の良いメンテナ
  • BTS: 最近修正されたバグの数が多い
  • BTS: wishlist以外のバグが少ない

Debianは分散型の開発モデルのボランティアプロジェクトですので、そのアーカイブには目指すところや品質の異なる多くのパッケージがあります。これらをどうするかは自己判断をして下さい。

2.7.2. 混合したアーカイブソースからのパッケージ

注意

安定版(stable)security updatesvolatile updatesのような公式にサポートされた特定の組み合わせ以外は、混合したアーカイブソースからのパッケージをインストールすることを、公式にはDebianディストリビューションとしてサポートしていません。

testingを追跡しながら、unstableにある特定の新規アップストリームバージョンのパッケージを1回だけ取り入れる操作例を次に示します。

  1. "/etc/apt/sources.list"ファイルを変更し、単一の"unstable"エントリーのみにします。
  2. "aptitude update"を実行します。
  3. "aptitude install <パッケージ名>"の実行します。
  4. testingのためのオリジナルの"/etc/apt/sources.list"ファイルを復元します。
  5. "aptitude update"を実行します。

この様な手動のアプローチをすると"/etc/apt/preferences"ファイルを作ることもないし、またapt-pinningについて悩むこともありません。でもこれではとても面倒です。

注意

混合したアーカイブソースを使うことをDebianが保証していないので、その場合にはパッケージ間の互換性は自分自身で確保しなければいけません。もしパッケージに互換性がないと、システムを壊すことになるかもしれません。この様な技術的要件を判断できる必要があります。ランダムな混合したアーカイブソースを使うことは全く任意の操作ですが、私としてはこの操作はお薦めできません。

異なるアーカイブからパッケージをインストールするための一般ルールは以下です。

  • 非バイナリーパッケージのインストールは比較的安全です。

    • 文書パッケージ: 特段の要件無し
    • インタープリタプログラムパッケージ: 互換性あるインタープリタ環境が必要
  • バイナリーパッケージ(非"Architecture: all")のインストールは、通常多くの障害があり、安全ではありません

    • ライブラリー("libc"等)のバージョン互換性
    • 関連ユーティリティープログラムのバージョン互換性
    • カーネルABI互換性
    • C++のABI互換性

注記

パッケージを比較的安全にインストールできるようにするために、一部の商用non-freeバイナリープログラムパッケージは完全に静的にリンクされたライブラリーとともに提供される事があります。そんなパッケージに関してもABI互換性等の問題は確認するべきです。

注記

壊れたパッケージを短期的に避ける場合以外では、公式にサポートされていないアーカイブからバイナリーパッケージをインストールするのは一般的には賢明ではありません。たとえapt-pinning(「候補バージョンの調整」参照)を使った場合にもこれは当てはまります。chrootや類似のテクニック(「仮想化システム」参照)使って、他のアーカイブからのプログラムを実行するよう検討するべきです。

2.7.3. 候補バージョンの調整

警告

lennyaptitude(8)には、"/etc/apt/preferences"ファイルの扱いにバグ(Bug#514930参照)があります。

"/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 archivessecurity 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>とのみの関連付けが定義されていない場合には、"Package pin:"という行はありません。
  • <package>とのみの関連付けが定義されている場合のPin-Priority値は、全バージョン文字列の右側に"0.181 700"等としてリストされます。
  • <package>とのみの関連付けが定義されていない場合には、全バージョン文字列の右側に"0"が"0.181 0"等としてリストされます。
  • アーカイブのPin-Priority値("/etc/apt/preferences"ファイル中に"Package: *"として定義)はアーカイブへのパスの左側に、"200 http://backports.org etch-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" (もしくはsqueezeの場合、"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値を明示的に設定する必要はありません。

2.7.4. VolatileとBackports.org

stableのためのアップグレードパッケージを提供する、debian-volatile projectbackports.orgアーカイブがあります。

警告

lenny-backportsvolatile-sloppy等のNotAutomaticアーカイブの中にあるパッケージ全てを使ってはいけません。あなたの必要性に適合する選択されたパッケージだけを使います。

注意

backports.orgは、提供しているパッケージがDebian開発者によってサインされているとはいえ、非Debianアーカイブです。

注意

アーカイブレベルのReleaseファイル(「アーカイブレベルの"Release"ファイル」参照)がapt_preferences(5)のルールで使われます。だからvolatile Debianアーカイブではapt-pinningは"コード"名を使って機能します。これは他のDebianアーカイブと異なります。例えばvolatile Debianアーカイブのための"/etc/apt/preferences"の中で、"Pin: release a=lenny"とできますが、"Pin: release a=stable"とはできません。

次にlennyvolatileを追跡しながらlenny-backportsにある特定の新規アップストリームバージョンのパッケージを取り込むapt-pinningテクニックの例を示します。すべての必要なアーカイブを"/etc/apt/sources.list"ファイルに次のようにリストします。

deb http://ftp.us.debian.org/debian/ lenny main contrib non-free
deb http://security.debian.org/ lenny/updates main contrib
deb http://volatile.debian.org/debian-volatile/ lenny/volatile main contrib non-free
deb http://volatile.debian.org/debian-volatile/ lenny/volatile-sloppy main contrib non-free
deb http://backports.org/debian/ lenny-backports main contrib non-free

backports.orgvolatile-sloppyアーカイブのデフォールトのPin-Priority値は、NotAutomaticアーカイブ(「アーカイブレベルの"Release"ファイル」参照)なので、常に1(<<100)です。experimentalアーカイブにある特定パッケージを次回アップグレード時に自動的に追跡しようとしない限り、"/etc/apt/preferences"ファイル中でbackports.orgvolatile-sloppyアーカイブを使うためにPin-Priority値を明示的に設定する必要はありません。

"<package-name>"という名前のパッケージをその依存関係ともどもlenny-backportsアーカイブからインストールしたい時には、"-t"オプションでターゲットリリースを切り替えながら次のコマンドを使います。

$ sudo apt-get install -t lenny-backports <package-name>

特定のパッケージをアップグレードしたいときには、"/etc/apt/preferences"ファイルを作成しその中に全てのパッケージを次のように明示的にリストしなければいけません。

Package: <package-1>
Pin: release o=Backports.org archive
Pin-Priority: 700

Package: <package-2>
Pin: release o=volatile.debian.org
Pin-Priority: 700

また、"/etc/apt/preferences"ファイルを次のようにしてもよい。

Package: *
Pin: release a=stable , o=Debian
Pin-Priority: 500

Package: *
Pin: release a=lenny, o=volatile.debian.org
Pin-Priority: 500

Package: *
Pin: release a=lenny-backports, o=Backports.org archive
Pin-Priority: 200

Package: *
Pin: release a=lenny-sloppy, o=volatile.debian.org
Pin-Priority: 200

"apt-get upgrade"と"apt-get dist-upgrade" (もしくは、squeezeでは"aptitude safe-upgrade"と"aptitude full-upgrade")の実行は、stableアーカイブからインストールされたパッケージを最新のstableアーカイブを使ってアップグレードし、他のアーカイブからインストールされたパッケージを最新の"/etc/apt/sources.list"ファイルに記載された全てのアーカイブの最新の対応するアーカイブを使ってアップグレードします。

2.7.5. パッケージの自動ダウンロードとアップグレード

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";

2.7.6. APTのよるダウンロードバンド幅の制限

APTによるダウンロードのバンド幅を例えば800Kib/sec (=100kiB/sec)に制限したい場合には、APTのパラメーターを次のように設定します。

APT::Acquire::http::Dl-Limit "800";

2.7.7. 緊急ダウングレード

注意

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/ squeeze 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やネットワーク関係のパッケージやそれらの設定ファイルには特に注意が必要です。

2.7.8. 誰がパッケージをアップロードしたのか?

"/var/lib/dpkg/available"や"/usr/share/doc/package_name/changelog"の中にリストされたメンテナの名前は"誰がパッケージ化活動の背後にいるのか"に関していくばくかの情報を提供しますが、パッケージを実際にアップロードをした人がはっきりしません。devscriptsパッケージ中のwho-uploads(1)はDebianのソースパッケージを実際にアップロードした人を確定します。

2.7.9. equivsパッケージ

ソースからプログラムをコンパイルして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.

2.7.10. 安定版システムへのパッケージ移植

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

2.7.11. APTのためのプロキシサーバー

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.2, I:0.3 3868 Debianアーカイブファイルのキャッシュプロキシサーバー(コンパイルされたOCamlプログラム)
apt-proxy * V:0.3, I:0.4 396 Debianアーカイブプロキシと部分ミラー作成機(Pythonプログラム)
apt-cacher * V:0.3, I:0.5 308 Debianパッケージとソースファイルのキャッシュプロキシ(Perlプログラム)
apt-cacher-ng * V:0.2, I:0.2 768 ソフトウエアーパッケージの頒布ためのキャッシュプロキシ(コンパイルされたC++プログラム)
debtorrent * V:0.12, I:0.2 1173 Debianパッケージのためのbittorrentプロキシ(Pythonプログラム)

注意

Debianがそのアーカイブ構造を再編した際に、このような専用のプロキシツールはパッケージメンテナによるコードの修正が必要で、一定期間使えなくなることがあります。一方、汎用のウェッブ(http)プロキシは比較的堅牢ですしそのような変化に合わすのも簡単です。

2.7.12. 小さな公開パッケージアーカイブ

近代的なセキュアーAPTシステム(「トップレベルの"Release"ファイルと信憑性」参照)と互換性のある小規模のパブリックアーカイブを作る例を次に示します。まず、いくつかの仮定をします。

  • アカウント名: "foo"
  • ホスト名: "www.example.com"
  • 必要なパッケージ: apt-utilsgnupg等のパッケージ
  • URL: "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/ …"が使えます。

2.7.13. システム設定の記録とコピー

パッケージと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等を使って全システムを管理することを考えます。

2.7.14. 外来のバイナリーパッケージの変換やインストール

alien(1)を使うと、Red HatのrpmやStampedeのslpやSlackwareのtgzやSolarisのpkgファイルフォーマットをDebianのdebパッケージに変換できます。あなたのシステムにインストールしたパッケージに替えて他のLinuxディストリビューション由来のパッケージを使いたい際には、alienを使って変換しインストールします。alienはLSBパッケージをサポートします。

警告

alien(1)はsysvinitlibc6libpam-modules等の必須のシステムパッケージを置き換えるために使うべきではありません。実質的にはalien(1)は、LSB準拠か静的にリンクされたnon-freeのバイナリーのみで提供されるパッケージにのみ使われるべきです。フリーソフトの場合は、ソースパッケージを使い本物のDebianパッケージを作るべきです。

2.7.15. dpkgを使わないパッケージの開梱

現行の"*.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コマンドを使っても閲覧できます。

2.7.16. パッケージ管理の追加参考文書

パッケージ管理に関しては次の文書からさらに学習できます。

第3章 システムの初期化

Debianシステムが以下に起動され設定されるかの知っていることはシステム管理者として賢明です。正確で詳細な情報がインストールされたパッケージのソースや文書中にあるとは言え、我々ほとんどにとってちょっと大変過ぎます。

著者などの過去の知見に基づきDebianシステムの要点とそれらの設定の簡単な参考となる概論を提供するように勤めました。Debianシステムは動く標的なので、システムの状況が変わっているかもしれません。システムに変更を加える前に、各パッケージの最新文書を参照下さい。

3.1. ブートストラッププロセスの概要

コンピューターシステムは、電源投入イベントからユーザーに機能の完備したオペレーティングシステム(OS)を提供するまでブートストラッププロセスを数段通過します。

単純化のため、デフォールトのインストールをした典型的なPCプラットフォームに限定し議論します。

典型的なブートストラッププロセスは4段ロケットのようです。各段のロケットは次の段のロケットにシステムのコントロールを引き継ぎます。

もちろん、これらに関して異なる設定をすることはできます。例えば、自分自身で専用カーネルをコンパイルした場合、ミニDebianシステムのステップをスキップできます。自分自身で確認するまでは、あなたのシステムがこの様になっていると決めつけないで下さい。

注記

伝統的なPCプラットフォームでないSUNとかMacintoshシステム等では、ROM上のBIOSやディスク上のパーティション(「ディスクパーティション設定」)が非常に異なっているかもしれません。そのような場合にはプラットフォーム特定の文書をどこかで求めて下さい。

3.2. 1段目: BIOS

BIOSは電源投入イベントが引き起こすブートプロセスの1段目です。CPUのプログラムカウンターが電源投入イベントで初期化され、読出し専用メモリー(ROM)上にあるBIOSが特定のメモリーアドレスから実行されます。

BIOSはハードウエアーの基本的な初期化(POST: 電源投入時自己診断)を行い、システムのコントロールをあなたが提供する次のステップにシステムのコントロールを引き継ぎます。BIOSは通常ハードウエアーによって供給されます。

BIOS初期画面はどのキーを押すとBIOS設定画面に入ってBIOSの挙動を設定できるかを通常表示しています。よく使われるキーはF1やF2やF10やEscやInsやDelです。もしBIOS初期画面が洒落た画像表示で隠されている場合、Esc等の何らかのキーをおすとこれを無効にできます。こういったキーはハードウエアーに大いに依存します。

BIOSが起動するコードのハードウエアー上の場所や優先順位はBIOS設定画面から選択できます。典型的には最初に見つかった選択されたデバイス(ハードディスクやフロッピーディスクやCD-ROM等)の最初の数セクターがメモリー上にロードされこの初期コードが実行されます。この初期コードは次のいずれでもよろしい。

  • ブートローダーコード
  • FreeDOSのような踏み石OSのカーネルコード
  • この小さな空間に収まればターゲットOSのカーネルコード

典型的にはプライマリハードディスクの指定されたパーティションからシステムが起動されます。伝統的PCのハードディスクの最初の2セクターにマスターブートレコード(MBR)が含まれます。ブート選択に含まれるディスクのパーティション情報はこのMBRの最後に記録されています。BIOSから実行される最初のブートローダーコードは残りの部分を占めます。

3.3. 2段目: ブートローダー

ブートローダーは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 * V:10, I:86 168 サポート ディスクパーティションやvfatやext3等のファイルシステムを理解するぐらいスマートです。(lennyのデフォールト)
GRUB 2 grub-pc * V:3, I:14 1796 サポート ディスクパーティションやvfatやext3等のファイルシステムを理解するぐらいスマートです。
GRUB 2 grub-rescue-pc * V:0.03, I:0.5 276 サポート GRUB 2のブート可能なレスキューイメージ(CDとフロッピー) (PC/BIOSバージョン)
Lilo lilo * V:0.5, I:3 1124 サポート ハードディスク上のセクター位置に依存します。(旧式)
Isolinux syslinux * V:1.1, I:7 160 サポート ISO9660ファイルシステムを理解します。ブートCDに使われています。
Syslinux syslinux * V:1.1, I:7 160 サポート 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)を参照下さい。

3.4. 3段目: ミニDebianシステム

ミニDebianシステムはブートローダーによって起動されるブートプロセスの3段目です。メモリー上でルートファイルシステムとともにシステムカーネルを実行します。これはオプションの起動プロセスの準備段階です。

注記

"ミニDebianシステム"は著者がこの3段目のブートプロセスを本文書中で記述するために作った言葉です。このシステムは一般にinitrdとかinitramfsシステムと呼ばれています。類似のメモリー上のシステムはDebianインストーラーでも使われています。

"/init"スクリプトはこのメモリー上のルートファイルシステムで最初に実行されるプログラムです。それはユーザー空間でカーネルを初期化し次の段階にコントロールを引き継ぐシェルプログラムです。このミニDebianシステムは、メインのブートプロセス始まる前にカーネルモジュールを追加したり、ルートファイルシステムを暗号化されたファイルシステムとしてマウントする等のブートプロセスの柔軟性を提供します。

"break=init" 等をカーネルブートパラメーターとして与えると、本部分のブートプロセスに割り込みrootシェルを獲得できます。この他の割り込み条件は"/init"スクリプトを参照下さい。このシェル環境はあなたの機器のハードウエアーを詳細に検査できるだけ十分洗練されています。

ミニDebianシステムは機能を削ったシステムで、主にbusybox(1)というGNUツールで提供されます。

注意

読出しのみのルートファイルシステム上では、mountコマンドには"-n"オプションを使う必要があります。

3.5. 4段目: 通常のDebianシステム

注記

本セクションは、古典的System Vスタイルのlenny上のブートシステムについての記述です。Debianはイベントドリブンのブートシステムに移行中です。The future of the boot system in DebianDependency based boot sequenceを参照下さい。

通常のDebianシステムはミニDebianシステムによって起動されるブートプロセスの4段目です。ミニDebianシステムのシステムカーネルはこの環境ででも実行され続けます。ルートファイルシステムはメモリー上から本当にハードディスク上にあるファイルシステムに切り替えられます。

"/sbin/init"プログラムが最初のプログラムとして実行され、メインのブートプロセス遂行します。Debianは通常sysv-rcによる伝統的なsysvinitスキームを使います。詳細な説明は、init(8)とinittab(5)と"/usr/share/doc/sysv-rc/README.runlevels.gz"を参照下さい。次にこのメインのブートプロセスの簡略化した概論を記します。

  1. Debianシステムはランレベル N(無し)に入り、"/etc/inittab"の記述にしたがいシステムを初期化します。
  2. Debianシステムはランレベル Sに入り、シングルユーザーモード下でハードウエアーの初期化等を完了するシステム初期化をします。
  3. Debianシステムは指定されたマルチユーザーランレベル (2〜5)の内の1つに入り、システムサービスをスタートします。

マルチユーザーモードで使われる最初のランレベルランレベルは、"init="というカーネルブートパラメーターもしくは"/etc/inittab"の"initdefault"行で指定されます。インストールされたままのDebianシステムはランレベル 2でスタートします。

initシステムが実行する全ての実際のスクリプトファイルは"/etc/init.d/"ディレクトリーの中にあります。

ティップ

単一の設定ファイル"/etc/runlevel.conf"を使うsysv-rcパッケージ提供のブートメカニズム代替のブートメカニズムに関しては、file-rcパッケージを参照下さい。"/etc/init.d/rc"と"/etc/init.d/rcS"と"/usr/sbin/update-rc.d"と"/usr/sbin/invoke-rc.d"のスクリプトによって両メカニズムには互換性があります。

3.5.1. ランレベルの意味

ランレベルはその設定に1つのディレクトリーを使い次に記す特定の意味があります。

表3.3 ランレベルとその用途説明のリスト

ランレベル ディレクトリー ランレベル用途の説明
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バリアントはこれらのランレベルを使いません。

3.5.2. ランレベルの設定

ランレベルのディレクトリー中のシムリンク名前は、"S<2-digit-number><original-name>"か"K<2-digit-number><original-name>"という形式となっています。2桁数字はスクリプトの実行順序決定に使われます。"S"は"スタート(Start)"と言う意味で、"K"は"停止(Kill)"と言う意味です。

init(8)かtelinit(8)コマンドがランレベルを"<n>"に変更すると、次のスクリプトを実行します。

  1. "/etc/rc<n>.d/"中の"K"で始まるスクリプト名が、引数"stop"1つつけてアルファベット順に実行されます。(サービス停止)
  2. "/etc/rc<n>.d/"中の"S"で始まるスクリプト名が、引数"start"1つつけてアルファベット順に実行されます。(サービス開始)

例えば、ランレベルのディレクトリーに"S10sysklogd"と"S20exim4"があった時に、"../init.d/exim4"にシムリンクされた"S20exim4"の前に、"../init.d/sysklogd"にシムリンクされた"S10sysklogd"が実行されます。

警告

メンテナよりあなたのほうが知識があるのでもなければ"/etc/rcS.d/"の中のシムリンクに変更を加えようとするのはお勧めできません。

3.5.3. ランレベル管理例

例えば、次に示すRed Hat Linuxのようなランレベルを設定してみます。

  • initはデフォールトとしてランレベル=3でシステムを起動します。
  • initはランレベル=(0,1,2,6)でgdm(1)を起動しません。
  • initはランレベル=(3,4,5)でgdm(1)を起動します。

これは、"/etc/inittab"ファイルをエディターで変更して起動するランレベル変更し、sysv-rc-confbum等の使いやすいランレベル管理ツールを使ってランレベルを編集することでできます。こうする代わりにコマンドラインだけを使うなら、(gdmパッケージをデフォールトでインストールしディスプレーマネージャーとして選択した後に)次に示すようにします。

# cd /etc/rc2.d ; mv S21gdm K21gdm
# cd /etc ; perl -i -p -e 's/^id:.:/id:3:/' inittab

ディスプレーマネージャーデーモン(xdmgdmkdmwdm)が起動される際には、"/etc/X11/default-display-manager"ファイル内容を確認する事を覚えておいて下さい。

注記

startx(1)コマンドを使えば、どのコンソールシェルからもXが起動できます。

3.5.4. 各initスクリプトのデフォールトのパラメーター

"/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スクリプト自体を変更することができます。これらスクリプトは管理者が編集可能な設定ファイルです。

3.5.5. ホスト名

カーネルがシステムのホスト名を維持管理します。ランレベル Sの"/etc/init.d/hostname.sh"にシムリンクされたinitスクリプトは、(hostnameコマンドを使って)"/etc/hostname"に保存された名前を使ってブート時にホスト名を設定します。このファイルには、完全修飾ドメイン名ではなく、システムのホスト名のみが含まれているべきです。

現在のホスト名を確認するには、hostname(1)を引数無しで実行します。

3.5.6. ファイルシステム

ルートファイルシステムはカーネル起動時にカーネルによってマウントされますが、他のファイルシステムは次の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"中の一時ファイルはクリーンされます。

3.5.7. ネットワークインターフェースの初期化

ネットワークインターフェースはランレベル Sで"/etc/init.d/ifupdown-clean"と"/etc/init.d/ifupdown"にシムリンクされたinitスクリプトよって初期化されます。それらの設定に関しては、5章ネットワークの設定を参照下さい。

3.5.8. ネットワークサービスの初期化

多くのネットワークサービス(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"を参照下さい。

3.5.9. システムメッセージ

ログファイルとスクリーン上の両方のシステムメッセージに関して、 "/etc/default/syslogd"と"/etc/syslog.conf"によってカスタム化できます。syslogd(8)とsyslog.conf(5)を参照下さい。さらに「ログアナライザー」を参照下さい。

3.5.10. カーネルメッセージ

ログファイルとスクリーン上の両方のカーネルメッセージに関して、"/etc/default/klogd"によってカスタム化できます。このファイル中に"KLOGD='-c 3'"と設定し"/etc/init.d/klogd restart"を実行します。klogd(8)を参照下さい。

エラーメッセージのレベルを次に記すように直接変更してもいいです。

# dmesg -n3

表3.4 カーネルエラーレベルのリスト

エラーレベル値 エラーレベル名 意味
0 KERN_EMERG システムは不安定
1 KERN_ALERT 直ぐアクションが必要
2 KERN_CRIT クリチカルなコンディション
3 KERN_ERR エラーコンディション
4 KERN_WARNING 警告コンディション
5 KERN_NOTICE ノーマルだが重要なコンディション
6 KERN_INFO 情報
7 KERN_DEBUG デバグレベルのメッセージ

3.5.11. udevシステム

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を使ってパーティションをアクセス」を参照下さい。

3.5.12. カーネルモジュール初期化

modprobe(8)プログラムは、ユーザープロセスからカーネルモジュールを追加や削除することで実行中のLinuxカーネルの設定を可能にします。udevシステム(「udevシステム」参照)は、その起動を自動化しカーネルモジュールの初期化を補助します。

"/etc/modules"ファイル中にリストしてプリロードする必要のある(modules(5)参照)次に記すような非ハードウエアーや特殊ハードウエアーのドライバーモジュールがあります。

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"の内容を読みやすい形式にして、どのカーネルモジュールが現在ロードされているかを表示します。

ティップ

あなたのシステム上の正確なハードウエアーを特定します。「ハードウエアーの識別」を参照下さい。

ティップ

ブート時に期待されるハードウエアー機能を有効となるように設定もできます。「ハードウエアー設定」を参照下さい。

ティップ

あなたのデバイスのサポートは、カーネルを再コンパイルすれば追加できます。「カーネル」を参照下さい。

第4章 認証

人(またはプログラム)がシステムへのアクセスの要求をした際に、認証はその正体が信頼できるものだと確認します。

警告

PAMの設定のエラーはあなたをあなた自身のシステムから締め出すかも知れません。レスキューCDを手元に置くか代替ブートパーティション設定を必ずします。復元するには、それらを使ってシステムをブートしそこから修正します。

4.1. 通常のUnix認証

通常の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) に説明されているように、このファイルの ":" で分離されたエントリーそれぞれは次の意味です。

  • ログイン名
  • パスワード規定エントリー
  • 数値のユーザーID
  • 数値のグループID
  • ユーザー名またはコメント領域
  • ユーザーのホームディレクトリー
  • ユーザーのコマンドインタープリター(無いこともある)

"/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暗号化が使われていることを示します。"*"はログイン不可を示します。)
  • 1970年1月1日から、最後にパスワードが変更された日までの日数
  • パスワードが変更可能となるまでの日数
  • パスワードを変更しなくてはならなくなる日までの日数
  • パスワード有効期限が来る前に、ユーザーが警告を受ける日数

"/etc/group"のファイル内容は次です。

group1:x:20:user1,user2

shadow(5)で説明されているように、このファイルの":"で分離されたエントリーそれぞれは次の意味です。

  • グループ名
  • 暗号化されたパスワード(実際は使われていない)
  • 数値のグループID
  • ","で分離されたユーザー名のリスト

注記

"/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.2. アカウントとパスワードの情報管理

アカウント情報管理のための重要コマンドを記します。

表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"の内容がシステムにアクティブに利用されていないことがあります。

4.3. 良好なパスワード

passwd(1)によるとシステムインストール時やpasswd(1)コマンドによってアカウント作成する際には、次に記すようなセットからなる6から8文字の良好なパスワードを選択するべきです。

  • 小文字のアルファベット
  • 数字の0から9
  • 句読点

警告

想像できるような単語はパスワードに選択禁止。

4.4. 暗号化されたパスワード作成

ソルトを使って暗号化されたパスワードを生成する独立のツールがあります。

表4.4 パスワード生成ツールのリスト

パッケージ ポプコン サイズ コマンド 機能
whois * V:10, I:88 372 mkpasswd crypt(3)ライブラリーの充実しすぎたフロントエンド
openssl * V:36, I:90 2352 openssl passwd パスワードハッシュの計算(OpenSSL)。passwd(1ssl)

4.5. PAM と NSS

Debianシステムのような最新のUnix的システムはPAM(プラグ可能な認証モジュール: Pluggable Authentication Modules)NSS(ネームサービススイッチ: Name Service Switch)メカニズムをローカルのシステム管理者がそのシステム管理用に提供します。それらの役割をまとめると次の様になります。

  • PAM は、アプリケーションソフトウエアーが使う柔軟な認証メカニズムを提供し、パスワードデーターの交換に関与します。
  • NSSは、ls(1)andid(1)等のプログラムがユーザーやグループの名前を得ためにC標準ライブラリー経由で頻用する柔軟なネームサービスメカニズムを提供します。

これらのPAMとNSSシステムは一貫した設定が必要です。

PAMとNSSシステムに関する注目のパッケージは次です。

表4.5 特記すべきPAMとNSSシステムのリスト

パッケージ ポプコン サイズ 説明
libpam-modules * V:84, I:99 1080 差し替え可能な認証モジュール(基本サービス)
libpam-ldap * V:2, I:4 380 LDAPインターフェースを可能にする差し替え可能な認証モジュール
libpam-cracklib * V:0.9, I:1.6 148 cracklibのサポートを可能にする差し替え可能な認証モジュール
libpam-doc * I:0.7 1208 差し替え可能な認証モジュール(htmlとtextの文書)
libc6 * V:96, I:99 9932 GNU Cライブラリー: "ネームサービススイッチ"も提供する共有ライブラリー
glibc-doc * I:3 1984 GNU C ライブラリー: マンページ
glibc-doc-reference * I:1.5 12016 GNU C ライブラリー: infoとpdfとhtmlフォーマットでのリファレンスマニュアル(non-free)
libnss-mdns * I:52 116 マルチキャストDNSを使った名前解決のためのNSSモジュール
libnss-ldap * I:4 312 LDAPをネームサービスとして使うNSSモジュール
libnss-ldapd * V:0.11, I:0.3 140 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は個別プログラムに関する環境変数をシステム全体のデフォールト値に初期化する最も基本的な手段です。

4.5.1. PAMとNSSによってアクセスされる設定ファイル

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"を使います。

4.5.2. 最新の集中システム管理

集中化された軽量ディレクトリーアクセスプロトコル(LDAP)を採用することで多くのネットワーク上のUnix的や非Unix的システムを最新の集中システム管理が実現できます。軽量ディレクトリーアクセスプロトコルのオープンソース実装はOpenLDAPソフトウエアーです。

LDAPサーバーは、libpam-ldaplibnss-ldapパッケージで提供されるPAMとNSSを使うことでDebianシステムにアカウント情報を提供します。この実現ためにはいくつかの設定が必要です(著者は本設定を使っていないため、次の情報は完全に二次情報です。ご理解の上お読み下さい。)。

  • スタンドアローンのLDAPデーモンであるslapd(8)等のプログラムを走らせることで集中化されたLDAPサーバーを設置します。
  • デフォールトの"pam_unix.so"に代えて"pam_ldap.so"を使うには"/etc/pam.d/"ディレクトリー中のPAM設定ファイルを変更します。

    • Debianでは、"/etc/pam_ldap.conf"をlibpam-ldapの設定ファイル、"/etc/pam_ldap.secret"をrootのパスワードを保存するファイルとして使っています。
  • デフォールト("compat"または"file")に代えて"ldap"を使うには"/etc/nsswitch.conf"ファイル中のNSS設定を変更します。

    • Debianでは、"/etc/libnss-ldap.conf"をlibnss-ldapの設定ファイルとして使っています。
  • パスワードのセキュリティー確保のためにlibpam-ldapSSL(もしくはTLS)接続を使うよう設定しなければいけません。
  • LDAPのネットワークオバーヘッドの犠牲はあるとはいえ、データーの整合性確保のためにlibnss-ldapSSL(もしくはTLS)接続を使うように設定できます。
  • LDAP のネットワークトラフィックを減少させるためにLDAPサーチ結果を一時保持するためのnscd(8)をローカルで走らせるべきです。

libpam-docパッケージで提供されるpam_ldap.conf(5)や"/usr/share/doc/libpam-doc/html/"やglibc-docパッケージで提供される"infolibc'NameServiceSwitch'"といった文書を参照下さい。

同様に、これに代わる集中化されたシステムは他の方法を使っても設定できます。

4.5.3. 「どうしてGNUのsuはwheelグループをサポートしないのか」

これはRichard M. Stallmanが書いた昔の"info su"の最後に書かれていた有名な文言です。ご心配は無用です。現在DebianにあるsuはPAMを使っているので"/etc/pam.d/su"の中の"pam_wheel.so"の行をエネーブルすることでsuを使えるのをrootグループに限定できます。

4.5.4. パスワード規則強化

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

4.6. 他のアクセスコントロール

注記

カーネルのセキュアーアテンションキー(SAK)機能の制限は「Alt-SysRqキー」を参照下さい。

4.6.1. sudo

sudoはシステム管理者がユーザーに制限付きのroot権限を与え、そのroot活動を記録するように設計されたプログラムです。sudoはユーザーの通常パスワードだけが必要です。sudoパッケージをインストールし、"/etc/sudoers"の中のオプションを設定することによりアクティベートして下さい。"/usr/share/doc/sudo/examples/sudoersの設定例を参照下さい。

単一ユーザーシステムにおける私のsudoの使い方(see「sudoの設定」)は自分自身の失敗からの防衛を目指しています。sudoを使うことは、常にrootアカウントからシステムを使うよりは良い方法だと個人的には考えます。例えば、次は"<some_file>"の所有者を"<my_name>"に変更します。

$ sudo chown <my_name> <some_file>

rootのパスワード(自分でシステムインストールをしたDebianユーザーなら当然知っています)を知っていれば、どのユーザーアカウントからいかなるコマンドも"su -c"とすればrootもとで実行できます。

4.6.2. SELinux

セキュリティー強化したLinux(SELinux)強制アクセス制御(MAC)ポリシーのある通常のUnix的な権限モデルより厳格な枠組みです。ある条件下ではrootの権限すら制限を受けます。

4.6.3. サーバーのサービスへのアクセスの制限

システムのセキュリティーのためにできるだけ多くのサーバープログラムを無効とするのは良い考えです。このことはネットワークサーバーの場合は決定的です。直接デーモンとしてであれスーパーサーバープログラム経由であれ有効にされている使っていないサーバーがあることはセキュリティーリスクと考えられます。

sshd(8)等の多くのプログラムがPAMを使ったアクセスコントロールを使っています。サーバーサービスへのアクセスを制限するには多くの方法があります。

「ランレベル管理例」「各initスクリプトのデフォールトのパラメーター」「PAMとNSSによってアクセスされる設定ファイル」「ネットワークサービスの初期化」「Netfilterインフラ」を参照下さい。

ティップ

NFS他のRPCを使うプログラムためにはSun RPCサービスはアクティブにする必要があります。

ティップ

もし現代的なDebianシステムでリモートアクセスで問題に会った場合には、"/etc/hosts.deny"中に"ALL:PARANOID"等の問題となっている設定があればコメントアウトします。(ただしこの種の行為に関するセキュリティーリスクに注意を払わなければいけません。)

4.7. 認証のセキュリティー

ここに書かれている情報はあなたのセキュリティーのニーズに充分ではないかもしれませんが、良いスタートです。

4.7.1. インターネット経由のセキュアーなパスワード

多くのトランスポーテーションレイヤーサービスはパスワード認証も含めて暗号化せずにメッセージをプレーンテキストで通信します。途中で傍受されかねないインターネットの荒野を経由して暗号化せずパスワードを送ることは非常によくない考えです。これらに関しては、"トランスポーテーションレイヤーセキュリティー"(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を使うことがよく行われます。)

4.7.2. セキュアーシェル

セキュアーシェル(SSH)プログラムはセキュアーな認証とともにインセキュアーなネットワークを通過したお互いに信頼し合っていないホスト間のセキュアーで暗号化された通信を可能にします。OpenSSHクライアントssh(1)とOpenSSHデーモンsshd(8)から成り立っています。SSHはポートフォーワーディング機能を使いPOPやXのようなインセキュアープロトコルの通信をインターネット経由でトンネルするのに使えます。

クライアントは、ホストベースド認証、公開鍵認証、チャレンジレスポンス認証、パスワード認証を使って認証をとろうとします。公開鍵認証を利用すると、リモートからのパスワード無しログインができるようになります。「リーモートアクセスサーバーとユーティリティー(SSH)」を参照下さい。

4.7.3. インターネットのためのセキュリティー強化策

たとえ、セキュアーシェル (SSH)ポイントツーポイントトンネリングプロトコル(PPTP)サーバーのようなセキュアーサービスを走らせる場合でも、ブルートフォースのパスワード推測等による侵入の可能性は残っています。次のようなセキュリティーのためのツールとともに、ファイアーウォールポリシー(「Netfilterインフラ」参照)を使うのはセキュリティー状況を向上させることが期待できます。

表4.8 追加セキュリティー策を提供するツールのリスト

パッケージ ポプコン サイズ 説明
knockd * V:0.14, I:0.4 164 小さなポートノックのデーモンknockd(1)とクライアントkonck
denyhosts * V:1.8, I:2 432 sshからの侵入者をシステム管理者が排除することを助けるユーティリティー
fail2ban * V:3, I:4 660 複数回の認証エラーを発生させるIPを使用禁止にします
libpam-shield * V:0.01, I:0.06 104 パスワード推測によるリモートからの攻撃者を締め出す

4.7.4. rootパスワードのセキュリティー確保

あなたの機器に他人がroot権限を持ってアクセスするのを阻止するには、次のアクションが必要です。

  • ハードディスクへの物理的アクセスを阻止
  • BIOSに鍵を書け、リムーバブルメディアからの起動を阻止
  • GRUBのインタラクティブセッションのパスワードを設定
  • GRUBのメニュー項目編集に施錠

ハードディスクへの物理的アクセスがあれば、パスワードをリセットすることは次の手順を使うと比較的簡単です。

  1. ハードディスクをCDから起動可能なBIOSのついたPCに移動します。
  2. レスキューメディア(Debianブートディスク、Knopix CD、GRUB CD、...)でシステムを起動します。
  3. ルートパーティションを読出し/書込みアクセスでマウントします。
  4. ルートパーティションの"/etc/passwd"を編集し、rootアカウントの2番目の項目を空にします。

grub-rescue-pcの起動時にGRUBのメニュー項目を編集可能(「2段目: ブートローダー」参照)なら、次の手順を使えてさらに簡単です。

  1. カーネルパラメーターを"root=/dev/hda6 rw init=/bin/sh"のような感じに変更してシステムを起動します。
  2. "/etc/passwd"を編集し、rootアカウントの2番目の項目を空にします。
  3. システム再起動します。

これで、システムのrootシェルにパスワード無しに入れるようになりました。

注記

rootシェルにアクセスさえできれば、システム上の全てにアクセスできシステム上のどのパスワードでもリセットできます。さらに。johnとかcrackパッケージ(「システムのセキュリティーと整合性のチェック」参照)のようなブルートフォースのパスワードクラッキングツールを使ってすべてのユーザーアカウントのパスワードが破られるかもしれません。こうして破られたパスワードは他のシステムへの侵入を引き起こしかねません。

この様な懸念を回避できる唯一の合理的なソフトウエアー的解決法は、dm-cryptとinitramfs(「データー暗号化ティップ」参照)をつかう、ソフトウエアー暗号化されたルートパーティション(もしくは"/etc" パーティション)を使うことです。でも、パスワードがシステム起動毎に必要になってしまいます。

第5章 ネットワークの設定

ティップ

GNU/Linuxのネットワーク設定の一般的ガイドはLinux Network Administrators Guideを参照下さい。

Debianシステム上の伝統的なTCP/IPネットワークのセットアップはifupdownパッケージをよる高レベルのツールとして使います。2つの場合があります。

ここでは伝統的な場合を詳細に説明します。

また、ワイヤレスネットワークの設定を容易にするnetwork-managerwicdのような代替の高レベルツールにもここで少し触れていきます(「自動ネットワーク設定」参照)。

5.1. 基本的ネットワークインフラ

現代的なDebianシステムの基本的ネットワークインフラをレビューします。

5.1.1. ドメイン名

ドメイン名を名付けるのは通常PCワークステーションのユーザーにとってはトリッキーです。PCワークステーションは、ネットワークを渡り歩く可動PCかもしれないし、インターネットからアクセスできないNATファイアーウォールの背後にあるかもしれません。そのような場合、ドメイン名がかち合うのを避けるために有効なドメイン名をドメイン名として選びたくないでしょう。

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"のようです。

5.1.2. ホスト名の解決

ホスト名の解決もまた、現在NSS (ネームサービススイッチ、Name Service Switch)メカニズムによってサポートされています。この解決の流れは次です。

  1. "hosts: files dns"のようなスタンザのある"/etc/nsswitch.conf"ファイルがホスト名の解消の順序を規定します。(これは、"/etc/host.conf"ファイル中の"order"スタンザの機能を置換します。)
  2. filesメソッドが最初に発動されます。ホスト名が"/etc/hosts"ファイルに見つかると、それに対応する全ての有効アドレスを返し終了します。("/etc/host.conf"ファイルは"multi on"を含みます。)
  3. 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"のようなスタンザが必要です。

5.1.3. ネットワークインターフェース名

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番目のネットワークインターフェースとして設定したいでしょう。

5.1.4. LANのためのネットワークアドレス範囲

rfc1918によってローカルエリアネットワーク(LAN)での使用に予約されている各クラス毎のIPv4 32ビットアドレス範囲を確認します。これらのアドレスは本来のインターネット上のアドレスとかち合う事が無いことが保証されています。

表5.1 ネットワークアドレス範囲のリスト

クラス ネットワークアドレス ネットマスク ネットマスク/ビット サブネットの数
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を行います。

5.1.5. ネットワーク設定インフラ

Linuxのネットワークシステムには2タイプの低レベルネットワークプログラムがあります(「Iproute2コマンド」参照)。

  • 旧式のnet-toolsプログラム(ifconfig(8)、…)はLinux NET-3ネットワークシステム由来です。これらの多くはすでに時代遅れです。
  • 新規のLinux iproute2プログラム(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"参照)。

ifplugdguessnetifscheme等のifupdownパッケージの補助スクリプトが有線LAN上の可動PCのためのネットワーク環境設定のようなネットワーク環境の動的設定を自動化するために作られています。これらはちょっと使い難いですが、既存のifupdownシステムとは反りが合います。

ifupdownシステムと独立な、network-managerwicd等の代替となる高レベルネットワーク設定システムはワイアレスネットワーク上の可動PCも含めたネットワーク環境を楽に設定するために作られました。これらは比較的新しくそのDebianシステムへの統合は進行中なので、これらとifupdownがかち合うことを避けるために"/etc/network/interfaces"中の対応するネットワークインターフェースを手動で無効にする必要があるかもしれません。(「自動ネットワーク設定」参照)。

表5.2 GUIのネットワーク設定ツール

パッケージ ポプコン サイズ タイプ 説明
ifupdown * V:60, I:99 148 設定::ifupdown ネットワークを接続したり切断したりする標準化されたツール(Debian特定)
ifplugd * V:0.4, I:0.9 344 , , 有線ネットワークを自動的に管理
ifupdown-extra * V:0.05, I:0.2 124 , , "ifupdown"パッケージを強化するネットワークテストスクリプト
ifmetric * V:0.02, I:0.10 100 , , ネットワークインターフェースの経路メトリック設定
guessnet * V:0.09, I:0.4 496 , , "/etc/network/interfaces"ファイル経由で"ifupdown"パッケージを補強するmappingスクリプト
ifscheme * V:0.02, I:0.10 132 , , "ifupdown"パッケージを補強するmappingスクリプト
ifupdown-scripts-zg2 * V:0.00, I:0.05 220 , , Zugschlusさんのifupdownの手動方法のインターフェーススクリプト
network-manager * V:25, I:34 1696 設定::NM NetworkManager (デーモン): ネットワークを自動管理
network-manager-gnome * V:17, I:31 3312 , , NetworkManager (GNOMEフロントエンド)
network-manager-kde * V:2, I:4 3088 , , NetworkManager (KDEフロントエンド)
wicd * V:1.6, I:2 2528 設定::wicd 有線と無線のネットワークマネージャー
iptables * V:24, I:99 1236 設定::Netfilter パケットフィルターとNATのための管理ツール(Netfilter)
iproute * V:36, I:81 1020 設定::iproute2 iproute2、IPv6や他の上級ネットワーク設定: ip(8)やtc(8)等
ifrename * V:0.2, I:0.7 236 , , 各種の静的クライテリアに基づきネットワークインターフェースを改名します: ifrename(8)
ethtool * V:3, I:12 260 , , Ethernetデバイス設定の表示と変更
iputils-ping * V:37, I:99 140 test::iproute2 ホスト名IPアドレスによってリモートホストのネットワークからの到達性をテスト(旧来、GNU)
iputils-arping * V:0.7, I:11 84 , , ARPアドレスによって特定されるリモートホストのネットワークからの到達性をテスト
iputils-tracepath * V:0.4, I:2 120 , , リモートホストへのネットワークパスを追跡
net-tools * V:70, I:99 1016 設定::net-tools NET-3ネットワーキングツールキット(net-tools、IPv4ネットワーク設定): ifconfig(8)等
inetutils-ping * V:0.04, I:0.12 268 テスト::net-tools ホスト名IPアドレスによってリモートホストのネットワークからの到達性をテスト(旧来、GNU)
arping * V:0.5, I:3 64 , , ARPアドレスによって特定されるリモートホストのネットワークからの到達性をテスト(旧来)
traceroute * V:13, I:98 192 , , リモートホストへのネットワークパスを追跡(旧来、コンソール)
dhcp3-client * V:47, I:94 608 設定::低レベル DHCPクライアント
wpasupplicant * V:29, I:41 960 , , WPAとWPA2 (IEEE 802.11i)のためのクライアントサポート
wireless-tools * V:8, I:25 420 , , Linuxのワイアレス拡張を操作するツール
ppp * V:7, I:26 1100 , , chatによるPPP/PPPoEコネクション
pppoeconf * V:0.5, I:4 344 設定::ヘルパー PPPoEコネクションの設定ヘルパー
pppconfig * V:0.3, I:2 900 , , chatによるPPPコネクションの設定ヘルパー
wvdial * V:0.6, I:2 484 , , wvdialpppによるPPPコネクションの設定ヘルパー
mtr-tiny * V:3, I:40 120 テスト::低レベル リモートホストへのネットワークパスを追跡するツール(curses)
mtr * V:0.6, I:2 176 , , リモートホストへのネットワークパスを追跡するツール(cursesとGTK+)
gnome-nettool * V:3, I:36 1955 , , 共通のネットワーク情報操作のためのツール(GNOME)
nmap * V:6, I:31 6220 , , ネットワークマッパー/ポートスキャナー(Nmap、コンソール)
zenmap * V:0.3, I:1.2 1784 , , ネットワークマッパー/ポートスキャナー(GTK+)
knmap * V:0.14, I:0.7 804 , , ネットワークマッパー/ポートスキャナー(KDE)
tcpdump * V:3, I:23 980 , , ネットワークトラフィックアナライザー(Tcpdump、コンソール)
wireshark * V:1.6, I:9 2096 , , ネットワークトラフィックアナライザー(Wireshark、GTK+)
tshark * V:0.5, I:3 320 , , ネットワークトラフィックアナライザー(コンソール)
nagios3 * V:0.8, I:1.4 32 , , ホストとサービスとネットワークを監視や管理するシステム(Nagios)
tcptrace * V:0.06, I:0.4 436 , , tcpdumpの出力から接続状況のまとめを作成
snort * V:0.6, I:0.9 8392 , , 柔軟なネットワーク侵入検知システム(Snort)
ntop * V:1.1, I:2 11288 , , ネットワークの使用状況をウェッブブラウザーで表示
dnsutils * V:12, I:91 396 , , BINDによって提供されるネットワーククライアント: nslookup(8)とnsupdate(8)とdig(8)
dlint * V:0.5, I:7 96 , , ネームサーバーの閲覧でDNSのゾーン情報をチェック
dnstracer * V:0.10, I:0.5 88 , , DNSサーバーをその源流まで追跡

5.1.6. ネットワークデバイスサポート

Debianシステムによってほとんどのハードウエアーデバイスはサポートされていますが、一部のネットワークデバイスはそのサポートのためにDSFG non-freeのドライバーが必要です。「Non-freeハードウエアードライバー」を参照下さい。

5.2. ネットワーク接続方法

注意

本セクションで説明されている接続テスト方法はあくまでテスト目的のためのものです。毎日のネットワーク接続のために使うためではありません。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の作成 pppconfigppp
PPP(代替) wvdialconfはヒューリスティックのあるchatの作成 pppwvdial
PPPoE pppoeconf決定論的chatの作成 pppoeconfppp
DHCP "/etc/dhcp3/dhclient.conf"中に記述されています dhcp3-client
静的IP (IPv4) "/etc/network/interfaces"中に記述されています net-tools
静的IP (IPv6) "/etc/network/interfaces"中に記述されています iproute

ネットワーク接続の省略語は次の意味です。

表5.5 ネットワーク接続の省略語のリスト

省略語 意味
POTS 旧来型電話サービス
BB ブロードバンド
BBサービス 例: デジタルサブスクラーバーライン(DSL)やケーブルテレビや家庭向け光ファイバー(FTTP)
BBモデム 例: DSLモデムケーブルモデム光ファイバー端末(ONT)
LAN ローカルエリアネットワーク
WAN 広域ネットワーク
DHCP 動的ホスト設定プロトコル
PPP ポイント間接続プロトコル
PPPoE Ethernet経由のポイント間接続プロトコル
ISP インターネットサービス供給者

注記

ケーブルTV経由のWAN接続サービスは大体DHCPかPPPoEでサービスを受けます。ADSLとFTTPの接続サービスは大体PPPoEでサービスを受けます。WAN接続の正確な設定要件はあなたのISPにご確認下さい。

注記

BBルータが家庭内LAN環境を作るのに使われる時には、LAN上のPCはネットワークアドレス変換(NAT)をしてBBルーター経由でWANに接続されます。そのような場合、LAN上のPCのネットワークインターフェースは静的IPかBBルーターからのDHCPでサービスを受けます。BBルーターはあなたのISPによる指示にしたがってWANに接続されるよう設定しなければいけません。

5.2.1. イーサーネットを使ってのDHCP接続

典型的な現代的な家庭内や小規模ビジネスネットワークのLANはWAN(インターネット)に何らかの消費者向けブロードバンドルーターを使って接続されています。このルーターの後ろのLANは通常ルーター上で稼働する動的ホスト設定プロトコル(DHCP)サーバーによりサービスを受けています。

動的ホスト設定プロトコル(DHCP)サービスを受けるイーサーネットでは、dhcp3-clientパッケージをインストールするだけです。

5.2.2. イーサーネットを使っての静的IP接続

静的IPサービスを受けるイーサーネットでは、特段何をする必要もありません。

5.2.3. pppconfigを使ってのPPP接続

設定スクリプトpppconfigPPP接続を次の選択をすることで対話式で設定します。

  • 電話番号
  • ISPでのユーザー名
  • ISPのパスワード
  • ポートの速度
  • モデム通信のポート
  • 認証方法

表5.6 pppconfigを使ってのPPP接続のための設定ファイルのリスト

ファイル 機能
/etc/ppp/peers/<isp_name> pppconfigによって生成された<isp_name>に特定なpppdのための設定ファイル
/etc/chatscripts/<isp_name> pppconfigによって生成された<isp_name>に特定なchatのための設定ファイル
/etc/ppp/options pppdのための一般的な実行パラメーター
/etc/ppp/pap-secret PAPのための認証データー(安全上問題あり)
/etc/ppp/chap-secret CHAPのための認証データー(比較的安全)

注意

もしponpoffコマンドが引数無しに起動された場合には、"<isp_name>"の値として"provider"が使われます。

低レベルのネットワーク設定ツールを使って次に記すように設定の確認ができます。

$ sudo pon <isp_name>
...
$ sudo poff <isp_name>

"/usr/share/doc/ppp/README.Debian.gz"を参照下さい。

5.2.4. wvdialconfを使った代替PPP接続

pppd(8)を使う異なるアプローチは、wvdialパッケージが提供するwvdial(1)からそれを実行することです。電話を掛け接続の交渉をするためにpppdchat(8)を実行するのではなく、wvdialが電話を掛け接続の交渉をした後にpppdを始動し後を任せます。

設定スクリプトwvdialconfはPPP接続を次の選択をすることで対話式で設定します。

  • 電話番号
  • ISPでのユーザー名
  • ISPのパスワード

ほとんどの場合wvdialは接続をすることに成功し、自動的に認証データーのリストを管理します。

表5.7 wvdialconfでPPP接続する際の設定ファイルリスト

ファイル 機能
/etc/ppp/peers/wvdial wvdialconfwvdialに合わせて生成したpppdの設定ファイル
/etc/wvdial.conf wvdialconfが生成した設定ファイル
/etc/ppp/options pppdのための一般的な実行パラメーター
/etc/ppp/pap-secret PAPのための認証データー(安全上問題あり)
/etc/ppp/chap-secret CHAPのための認証データー(比較的安全)

低レベルのネットワーク設定ツールを使って次に記すように設定の確認ができます。

$ sudo wvdial
...
$ sudo killall wvdial

wvdial(1)とwvdial.conf(5)を参照下さい。

5.2.5. pppoeconfを使ったPPPoE接続

あなたのISPがPPPoE接続を提供し、あなたのPCを直接WANに接続すると決めた際には、あなたのPCのネットワークはPPPoEで設定しないといけません。PPPoEとはイーサーネット経由のPPPの意味です。設定スクリプトpppoeconfはPPPoE接続を対話式で設定します。

設定ファイルは以下。

表5.8 pppoeconfを用いてPPPoE接続する際の設定ファイルのリスト

ファイル 機能
/etc/ppp/peers/dsl-provider pppoeconfpppoeに合わせて生成したpppdの設定ファイル
/etc/ppp/options pppdのための一般的な実行パラメーター
/etc/ppp/pap-secret PAPのための認証データー(安全上問題あり)
/etc/ppp/chap-secret CHAPのための認証データー(比較的安全)

低レベルのネットワーク設定ツールを使って次に記すように設定の確認ができます。

$ sudo /sbin/ifconfig eth0 up
$ sudo pon dsl-provider
...
$ sudo poff dsl-provider
$ sudo /sbin/ifconfig eth0 down

"/usr/share/doc/pppoeconf/README.Debian"を参照下さい。

5.3. ifupdownを使った基本的なネットワーク設定

ifupdownパッケージはDebianシステムでの高レベルネットワーク設定の標準化された枠組みを提供します。このセクションでは、簡略化された紹介と多くの典型例でifupdownを使った基本的なネットワーク設定を学びます。

5.3.1. 簡略化されたコマンドシンタックス

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というコマンドはありません。

5.3.2. "/etc/network/interfaces"の基本的なシンタックス

"/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"スタンザの重複定義をしてはいけません。

5.3.3. ループバックネットワークインターフェース

"/etc/network/interfaces"ファイルに次の設定をすることでシステムブート時にループバックネットワークインターフェースloが起動されます(autoスタンザ経由)。

auto lo
iface lo inet loopback

この設定は、"/etc/network/interfaces"ファイル中にいつも存在します。

5.3.4. DHCPサービスを受けるネットワークインターフェース

「イーサーネットを使ってのDHCP接続」によりシステムの準備をした後、DHCPによってサービスされるネットワークインターフェースは"/etc/network/interfaces"ファイルの中に次のような設定エントリーを設定します。

allow-hotplug eth0
iface eth0 inet dhcp
 hostname "mymachine"

Linuxカーネルが物理インターフェースeth0を認識した場合、allow-hotplugスタンザはifupによりそのインターフェースが起動させられるようにし、ifaceスタンザがifupがインターフェースがDHCPを使うように設定します。

5.3.5. 静的IPを使うネットワークインターフェース

静的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を使うように設定します。

ここでは次を仮定しています。

  • LANネットワークのIPアドレス範囲: 192.168.11.0 - 192.168.11.255
  • ゲートウエーのIPアドレス: 192.168.11.1
  • PCのIPアドレス: 192.168.11.100
  • resolvconfパッケージ: インストール済み
  • ドメイン名: "lan"
  • DNSサーバーのIPアドレス: 192.168.11.1

resolvconfパッケージがインストールされていないと、DNS関係の設定は手動で"/etc/resolv.conf"を次のように編集する必要があります。

nameserver 192.168.11.1
domain lan

注意

上記例で用いたIPアドレスはそのままコピーされるべきものではありません。IP番号はあなたの実際のネットワーク設定に合わせなければいけません。

5.3.6. ワイアレスLANインターフェースの基本

ワイアレスLAN (省略するとWLAN)IEEE 802.11という標準群に基づく特別な免許なく使える無線を使う帯域拡散通信を経由の高速ワイアレス接続を提供します。

WLANインターフェースは通常のEthernetインターフェースと非常に似ていますが、始動時にネットワークIDと暗号キーデーターを必要とします。インターフェース名が使われるカーネルドライバーによってeth1wlan0ath0wifi0等とインターフェース名が少々異なる以外は、それらに使われる高レベルのネットワークツールは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保護アクセス(Protected Access)2 第3世代の、WEPとの互換性のないワイアレス暗号化標準(完全に802.11i)

実際のプロトコルの選択肢は採用しているワイアレスルーターによって普通制約されます。

5.3.7. WPA/WPA2を使うワイアレスLANインターフェース

新規の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"を参照下さい。

5.3.8. WEPを使うワイアレスLANインターフェース

旧式の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"を参照下さい。

5.3.9. PPP接続

以前説明したようにPPP接続を設定する必要があります(「pppconfigを使ってのPPP接続」参照)。さらに、第1番目のPPPデバイスppp0のための"/etc/network/interfaces"ファイルのエントリーを次のように追加します。

iface ppp0 inet ppp
 provider <isp_name>

5.3.10. 代替のPPP接続

以前説明したようにwvdialを使う代替PPP接続をまず設定する必要があります(「wvdialconfを使った代替PPP接続」参照)。さらに、第1番目のPPPデバイスppp0のための"/etc/network/interfaces"ファイルのエントリーを次のように追加します。

iface ppp0 inet wvdial

5.3.11. PPPoE接続

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

5.3.12. ifupdownのネットワーク設定状態

"/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)コマンドのアウトプットは上記例のような行を欠いています。

5.3.13. 基本ネットワーク設定

例えばeth0というインターフェースを再設定したい際には、まず"sudo ifdown eth0"コマンドを実行してそれを無効にしなければいけません。こうすることでeth0のエントリーが"/etc/network/run/ifstate"ファイルから削除されます。(もしeth0が有効でなかったりそれにたいして過去に間違った設定がされている際には、こうするとエラーメッセージを発することになるかもしれません。シンプルな単一ユーザーのワークステーションではいつも問題なことは知る限り起こらないようです。)

こうすることで、必要に応じてネットワークインターフェースeth0を自由に再設定するために"/etc/network/interfaces"の内容を自由に書き換えられます。

こうした後で、eth0を"sudo ifup eth0"コマンドを使って再起動できます。

ティップ

ネットワークインターフェースは、"sudo ifdown eth0;sudo ifup eth0"とすることで(再)初期化できます。

5.3.14. ifupdown-extraパッケージ

ifupdown-extraパッケージは、ifupdownとともに使う使いやすいネットワーク接続テストを提供します。

  • network-test(1)コマンドはシェルから実行できます。
  • 自動スクリプトは各ifupコマンド実行毎に実行されます。

network-testコマンドをつかうことで面倒な低レベルコマンドを使ってネットワーク問題を分析する手間を省けます。

自動スクリプトは"/etc/network/*/"にインストールされ、次の機能があります。

  • ネットワークケーブルの接続の確認
  • IPアドレスの重複使用の確認
  • "/etc/network/routes"の定義に従った静的ルートの設定
  • ネットワークのゲートウエーが到達可能かの確認
  • 結果を"/var/log/syslog"ファイルに記録

このsyslog記録はリモートシステムのネットワーク問題を管理する上で非常に有用です。

ティップ

ifupdown-extraパッケージの自動的な挙動は"/etc/default/network-test"によって設定可能です。これらの自動テストの一部はARPからの返答を聞くのでシステムのブートプロセスを少々遅らせます。

5.4. ifupdownを使う上級ネットワーク設定

ifupdownパッケージの機能は、上級知識を使うと「ifupdownを使った基本的なネットワーク設定」に書かれているよりも向上します。

ここに記述されている機能は全く任意のものです。著者自身、怠け者で面倒な事が嫌いなために、ここに書かれたことを使うことは滅多にありません。

注意

「ifupdownを使った基本的なネットワーク設定」に書かれた情報でネットワーク接続をうまく設定できないのに、次の情報を使うと状況は更に悪くなります。

5.4.1. ifplugdパッケージ

ifplugdパッケージはイーサーネット接続のみを管理する旧式の自動ネットワーク設定ツールです。これによって可動PC等のイーサーネットケーブルの脱着問題を解決します。もしNetworkManagerWicd (「自動ネットワーク設定」参照)がインストールされている場合は、このパッケージは必要ありません。

このパッケージはデーモンとして実行され、autoとかallow-hotplugという機能(表5.10「"/etc/network/interfaces"のスタンザのリスト」)を置き換え、インターフェースがネットワークに繋がれるとインターフェースを起動します。

例えばeth0という内部イーサーネットポートに対するifplugdパッケージの利用方法は次です。

  1. "/etc/network/interfaces"の中のスタンザを削除しましょう: "auto eth0"または"allow-hotplug eth0"、
  2. "/etc/network/interfaces"の中のスタンザを残しましょう: "iface eth0 inet …"と"mapping …"、
  3. ifplugdパッケージをインストールします。
  4. "sudo dpkg-reconfigure ifplugd"の実行します。
  5. eth0を"ifplugdにより監視される静的インターフェース"とします。

こうするとお望みどおりのネットワーク設定が機能します。

  • 電源投入もしくはハードウエアーの発見時に、インターフェースは自動的に起動されます。

  • イーサーネットケーブルを発見時にインターフェースが起動されます。
  • イーサーネットケーブルを外して少し経った時点でインターフェースが自動的に停止されます。
  • イーサーネットケーブルを接続した時点でインターフェースが新規ネットワーク環境下で起動されます。

ティップ

The arguments for the ifplugd(8)コマンドの引数はインターフェースの再設定の遅延時間などの挙動を設定します。

5.4.2. ifmetricパッケージ

ifmericパッケージを使うと、DHCPでもルートのメトリクスを事後操作できます。

次のようにするとeth0インターフェースをwlan0インターフェースより優先するように設定できます。

  1. ifmetricパッケージをインストールします。
  2. "iface eth0 inet dhcp"行のすぐ下に"metric 0"というオプション行を追加します。
  3. "iface wlan0 inet dhcp"行のすぐ下に"metric 1"というオプション行を追加します。

メトリック0とは最高優先順位のルートでデフォールトのルートということを意味します.大きなメトリック値は低い優先順位を意味します。最低のメトリック値をもつ有効なインターフェースのIPアドレスが発信源となるインターフェースになります。ifmetric(8)を参照下さい。

5.4.3. 仮想インターフェース

物理的には単一のイーサーネットインターフェースは異なるIPアドレスをもつ複数の仮想インターフェースとして設定できます。いくつかのIPサブネットワークにインターフェースを繋ぐのが通常こうする目的です。例えば、単一ネットワークインターフェースを使ったIPアドレスに基づく仮想ウェッブホスティングがその適用例です。

例えば、次を仮定します。

  • あなたのホスト上の単一のイーサーネットインターフェースが(ブロードバンドルーターではなく)イーサーネットハブに接続されています。
  • イーサーネットハブはインターネットとLANネットワークの両方に接続されています。
  • LANネットワークはサブネット192.168.0.x/24を使います。
  • あなたのホストはインターネットに関しては物理インターフェースeth0をDHCPが提供するIPアドレスで使います。
  • あなたのホストはLANに関しては仮想インターフェースeth0:0192.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を使ってインターネットからローカルネットワークをセキュアーするべきです。

5.4.4. 上級コマンドシンタックス

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を停止

5.4.5. mappingスタンザ

「"/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スタンザのグロッブはシェルのファイル名グロブのように機能します(「シェルグロブ」参照)。

5.4.6. 手動切り替え可能なネットワーク設定

「基本ネットワーク設定」でしたように"/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*等の最後の数字を調整する必要があります。

5.4.7. ifupdownシステムを使うスクリプト

ifupdownシステムはスクリプトに環境変数を引き渡して"/etc/network/*/"中にインストールされたスクリプトを自動実行します。

表5.14 ifupdownシステムが引き渡す環境変数のリスト

環境変数 引き渡す変数値
"$IFACE" 処理対象のインターフェースの物理名(インターフェース名)
"$LOGICAL" 処理対象のインターフェースの論理名(設定名)
"$ADDRFAM" インターフェースの<address_family>
"$METHOD" インターフェースの<method_name>。(例えば"static")
"$MODE" ifupから実行されると"start"、ifdownから実行されると"stop"
"$PHASE" "$MODE"と同じ、ただしpre-uppost-uppre-downpost-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/*"中の例示スクリプトやifschemeifupdown-scripts-zg2パッケージで使われているスクリプトを確認して下さい。このような追加スクリプトは基本的なifupdown-extraguessnetパッケージと機能の重複があります。このような追加スクリプトをインストールしたら、干渉しないようにこのようなスクリプトをカスタム化するべきです。

5.4.8. guessnetを使うmapping

「手動切り替え可能なネットワーク設定」に記述されたように手動で設定選択する代わりに、「mappingスタンザ」に記述されたmappingメカニズムをつかってカスタムスクリプトでネットワーク設定を自動的に選択できます。

guessnetパッケージにより提供されるguessnet-ifupdown(8)コマンドはmappingスクリプトとして使われるように設計されてい、ifupdownシステムを拡張する強力な枠組みを提供します。

  • ifaceスタンザの下の各ネットワーク設定毎にguessnetオプションの値としてテスト条件をリストします。
  • mappingは最初のエラーを返さないifaceをネットワーク設定として選択します。

guessnetオプションはifupdownシステムにより実行されるスクリプトに追加の環境変数をエクスポートするだけなので、"/etc/network/interfaces"ファイルをmappingスクリプトとguessnet-ifupdownとオリジナルのネットワーク設定インフラであるifupdownとで重複して利用することで特に支障は起こりません。詳細はguessnet-ifupdown(8)を参照下さい。

注記

"/etc/network/interfaces"中に複数のguessnetオプション行が必要な時には、オプション行の開始文字列重複をifupdownパッケージは許さないので、guessnet1guessnet2等で始まるオプション行を使います。

5.5. デスクトップのためのネットワーク設定

5.5.1. GUIのネットワーク設定ツール

GNOMEのような各デスクトップ環境が提供するデフォールトのGUIのネットワーク設定ツールの能力は静的IPやDHCPのような基本設定に限られています。あなたが見ていないところで"/etc/network/interfaces"ファイルの内容を上書きしています。自分自身で実際どのように"/etc/network/interfaces"ファイルが書き換えられているか確認して下さい。

注意

それらは手動でされた"/etc/network/interfaces"ファイルへの複雑な上級設定を理解しないかもしれません。

5.5.2. 自動ネットワーク設定

ifupdownパッケージと独立なデーモンを通してネットワーク接続を管理する、NetworkManager (NM) (network-managerと関連パッケージ)や、Wicd (wicdパッケージ) 等の、独立の自動ネットワーク設定ツールがあります。これらによってワイアレス接続が簡単にできます。これらには洒落たGUIユーザーインターフェースが付いてきます。

警告

サーバーにはこの様な自動ネットワーク設定を使わないで下さい。これらはラップトップ上のモービルデスクトップを主対象としています。

警告

これらの自動ネットワーク設定ツールは動く標的で、ここに書かれている事はsqueezeでは正しくないかもしれません。お気をつけ下さい。

注意

こういった自動ネットワーク設定は、「ifupdownを使った基本的なネットワーク設定」「ifupdownを使う上級ネットワーク設定」のような"/etc/network/interfaces"への凝ったifupdown設定と互換性がないかも知れません。lennyでは、「DHCPサービスを受けるネットワークインターフェース」に書かれたようなDHCPでコントロールされているインターフェースに"hostname"スタンザがあることだけでNMがそのインターフェースを無視するようになってしまいます。最新の問題や制約条件に関してはnetwork-managerのBTSwicdのBTSを参照下さい。

NMの設定は"/usr/share/doc/network-manager/README.Debian"に記されています。その要点を次に記します。

  1. 次のようにして、例えばfooというデスクトップユーザーを"netdev"グループに属するようにします。

    $ sudo adduser foo netdev
  2. "/etc/network/interfaces"の設定を次のようにできるだけ簡単にします。

    auto lo
    iface lo inet loopback
    
    auto eth0
    iface eth0 inet dhcp
  3. 次のようにしてNMを再起動します。

    $ sudo /etc/init.d/network-manager restart

注記

ifupdownとの干渉を避けるために、"/etc/network/interfaces"にリストされてないインターフェースか、"auto …"または"allow-hotplug …"を使いかつ(他のオプション無しで)"iface … inet dhcp"を使って設定されているインターフェースのみがNMによって管理されます。

Wicdの設定は、"/usr/share/doc/wicd/README.Debian"に記されています。その要点を以下に記します。

  1. "/etc/network/interfaces"中の設定を次のようにだけとします。

    auto lo
    iface lo inet loopback
  2. 次のようにしてWicdを再起動します。

    $ sudo /etc/init.d/wicd restart

5.6. 低レベルネットワーク設定

5.6.1. Iproute2コマンド

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.6.2. 安全な低レベルネットワーク操作

次の低レベルネットワークコマンドは、ネットワーク設定を変更しないので安全に使えます。

表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.org"のDNSゾーン情報を確認

ティップ

これらの低レベルネットワーク設定ツールは"/sbin/"中にあります。"/sbin/ifconfig"等のような完全コマンドパスを使うか、 "~/.bashrc"中の"$PATH"リストに"/sbin"を追加する必要があるかもしれません。

5.7. ネットワークの最適化

一般的なネットワークの最適化は本書の射程外です。ここでは消費者用の接続に関する課題にのみ触れます。

表5.17 ネットワーク最適化ツールのリスト

パッケージ ポプコン サイズ 説明
iftop * V:1.1, I:6 108 ネットワークインターフェースの帯域利用情報を表示
iperf * V:0.4, I:3 200 インターネットプロトコルのバンド幅測定ツール
apt-spy * V:0.2, I:1.4 204 バンド幅テストに基づき"/etc/apt/sources.list"ファイルを作成
ifstat * V:0.2, I:1.1 88 インターフェース統計モニター
bmon * V:0.2, I:0.8 188 可搬型バンド幅モニター兼速度推定機
ethstatus * V:0.12, I:0.7 84 ネットワークデバイスのスループットを迅速に測定するスクリプト
bing * V:0.09, I:0.7 96 経験則的確率バンド幅試験ソフト
bwm-ng * V:0.2, I:1.0 152 簡単軽量のコンソール式のバンド幅モニター
ethstats * V:0.06, I:0.3 52 コンソール式のイーサーネット統計モニター
ipfm * V:0.05, I:0.17 156 帯域分析ツール

5.7.1. 最適MTUの発見

最大送信単位(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"参照

これらの基本的なガイドラインに加えて、次を覚えておきます。

  • 何らかのトンネル手法(VPN等)を使うと、それらのオーバーヘッドのために最適MTUを更に減らすかもしれません。
  • MTU値は実験的に決定されるPMTU値を越すべきではありません。
  • もし他の制約条件を満たすなら、MTU値は一般的に大きい方がいいです。

5.7.2. MTUの設定

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の関係は次です。

  • IPv4ではMSS = MTU - 40
  • IPv6ではMSS = MTU - 60

注記

iptables(8)(「Netfilterインフラ」参照)を使う最適化はMSSを使ってパッケットサイズを制約できるのでルーターとして有用です。

5.7.3. WAN TCPの最適化

現代的な高帯域でレイテンシーの大きなWANでは、TCPのスループットはTCPバッファーサイズパラメーターを"TCP Tuning Guide"や"TCP tuning"に書かれている手順で調整することで最大化できます。今のところ現在のDebianのデフォールトは高速の1G bpsのFTTPサービスでつながっている私のLANでも十分機能しています。

5.8. Netfilterインフラ

NetfilterLinuxカーネルのモジュール(「カーネルモジュール初期化」参照)を利用するステートフルファイアーウォールネットワークアドレス変換(NAT) のインフラを提供します。

表5.19 ファイアーウォールツールのリスト

パッケージ ポプコン サイズ 説明
iptables * V:24, I:99 1236 netfilterのための管理ツール
iptstate * V:0.15, I:0.9 156 netfilterの状態を常時モニター(top(1)と類似)
shorewall-perl * V:0.15, I:0.5 60 Shorelineファイアーウォールnetfilter設定ファイル生成システム(Perlベース、lennyで推薦)
shorewall-shell * I:1.8 60 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にもあてはまります。

第6章 ネットワークアプリケーション

ネットワーク接続を確立した(5章ネットワークの設定参照)あとで、各種のネットワークアプリケーションを実行できます。

6.1. ウェッブブラウザー

多くのウェッブブラウザーパッケージがハイパーテキストトランスファープロトコル(HTTP)を使って遠隔コンテントにアクセスするために存在します。

表6.1 ウェッブブラウザーのリスト

パッケージ ポプコン サイズ タイプ ウェッブブラウザーの説明
iceweasel * V:30, I:52 3852 X ブランドを外した Mozilla Firefox
iceape-browser * V:1.6, I:2 36424 , , 非商標化されたMozillabug#505565というセキュリティー問題で削除済
epiphany-browser * V:15, I:37 1036 , , GNOME HIG準拠、Epiphany
galeon * V:1.1, I:1.8 1684 , , GNOMEGaleonEpiphanyが継承
konqueror * V:10, I:18 3248 , , KDEKonqueror
w3m * V:22, I:84 1964 テキスト w3m
lynx * I:24 248 , , Lynx
elinks * V:2, I:6 1444 , , ELinks
links * V:3, I:9 1372 , , Links (テキストのみ)
links2 * V:0.9, I:4 3280 グラフィクス Links (Xを使わないコンソールグラフィクス)

6.1.1. ブラウザー設定

次に示す特別のURL文字列を使うと一部のブラウザーでその設定値を確認する事ができます。

  • "about:"
  • "about:config"
  • "about:plugins"

Debianは、Java (ソフトウエアープラットフォーム)Flashのみならず、MPEGMPEG2MPEG4DivXWindows Media Video (.wmv)QuickTime (.mov)MP3 (.mp3)Ogg/VorbisファイルやDVDsやVCDs等を取り扱えるブラウザーのプラグインコンポーネントを提供します。Debianではnon-freeのブラウザープラグインパッケージをcontribかnon-freeのコンポーネントのブラウザープラグインとしてインストールできます。

表6.2 ブラウザープラグインのリスト

パッケージ ポプコン サイズ コンポーネント 説明
icedtea-gcjwebplugin * V:0.5, I:0.7 204 main Hotspot JITを使うJavaプラグイン
sun-java6-plugin * I:10 52 non-free SunのJava SE 6(i386専用)のためのJavaプラグイン
swfdec-mozilla * V:10, I:23 244 main libswfdecに基づくFlashのプラグイン
mozilla-plugin-gnash * V:0.4, I:1.8 164 main Gnashに基づくFlashのプラグイン
flashplugin-nonfree * V:1.4, I:13 132 contrib Adobe Flash Player (i386とamd64専用)をインストールするFlashのプラグインヘルパー
mozilla-plugin-vlc * V:3, I:4 140 main VLCメディアプレイヤーに基づくマルチメディアプラグイン
totem-mozilla * V:21, I:37 600 main GNOME's Totemメディアプレイヤーに基づくマルチメディアプラグイン
gecko-mediaplayer * V:0.4, I:0.5 716 main (GNOME) MPlayerに基づくマルチメディアプラグイン
nspluginwrapper * V:1.2, I:2 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に対して良からぬ副次効果を引き起こすかもしれません。

6.2. メールシステム

注意

もしインターネットと直接メール交換するメールサーバーを設定するなら、このような初歩的文書が不要なぐらいシステムを熟知しているべきです。

6.2.1. 近代的メールサービスの基礎

スパム(望みも頼みもしないe-mail)問題を封じ込めるために、多くの消費者用インターネット接続を提供するISPは対抗措置を実施しています。

  • 彼らの顧客がメッセージを送信するためのスマートホストサービスは、rfc4954で規定される(SMTP AUTHサービスの)パスワードを使いrfc4409で規定されるメッセージサブミッションポート(587)を使います。
  • ISPのネットワーク内部(但しISP自身の送信メールサーバーを除く)からのSMTPポート(25)からインターネットへの接続はブロックされます。
  • 外部ネットワークの怪しげなホストからISPの受信メールサーバーへのSMTPポート(25)接続はブロックされます。(ダイヤルアップ接続等の消費者用インターネット接続に用いられる動的IPアドレス範囲上のホストからの接続はほぼ確実にブロックされます。)

メールシステムを設定したりメール配達問題を解決する際には、こうした新たな制約に配慮しなければいけません。

このような敵意のあるインターネットの状況と制約を考慮して、Yahoo.comやGmail.com等の独立インターネットメールISPはトランスポートレイヤーセキュリティー(TLS)やその前駆者であるセキュアーソケットレイヤー(SSL)を使ってインターネット上のどこからでも接続できるセキュアーなメールサービスを提供しています。

  • 彼らの顧客がメッセージを送信するためのスマートホストサービスはパスワード(SMTP AUTHサービス)を使いSMTP/SSLポート(465)かメッセージサブミッションポート(587)を使います。
  • 受信メールにはPOP3を使ってTLS/POP3ポート(995)でアクセスできます。

注意

リモートホストに確実にメールを直接送るために、消費者用インターネット接続上でSMTPサーバーを実行するのは現実的ではありません。メールは拒否されるでしょう。あなたの接続ISPもしくは独立メールISPが提供する何らかのスマートホストサービスを使わなければいけません。次の文章では簡単のために、そのスマートホストが"smtp.hostname.dom"にあり、SMTP AUTHを必要とし、メッセージサブミッションポート(587)を使うと仮定します。

6.2.2. ワークステーションのメール設定戦略

最も簡単なメール設定は、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)」参照)でよく使われます。がある際にはMUAのフィルター機能を使う必要があります。このような場合にはローカルのMTA(「メールトランスポートエージェント(MTA)」参照)はスマートホストへの配送とローカル配送の両方をする必要があります。

6.3. メールトランスポートエージェント(MTA)

普通のワークステーションでは、メールトランスポートエージェント(MTA)にexim4-*postfixパッケージのどちらがよく選ばれます。この選択は全くあなた次第です。

表6.3 ワークステーションでの基本的メールトランスポートエージェント関連パッケージのリスト

パッケージ ポプコン サイズ 説明
exim4-daemon-light * V:60, I:66 944 Exim4メールトランスポートエージェント(MTA: Debianのデフォールト)
exim4-base * V:62, I:68 1576 Exim4文書(text)と共通ファイル
exim4-doc-html * I:0.7 3452 Exim4文書(html)
exim4-doc-info * I:0.4 556 Exim4文書(info)
postfix * V:17, I:19 3236 Postfixメールトランスポートエージェント(MTA: Debianの代替候補)
postfix-doc * I:2 3336 Postfix文書(html+text)
sasl2-bin * V:2, I:5 448 Cyrus SASL APIの実装(SMTP AUTHについてpostfixを補完)
cyrus-sasl2-doc * I:3 284 Cyrus SASL - 文書

ポプコンの投票数ではexim4-*postfixより何倍も人気があるようですが、postfixがDebianのデベロッパーに人気がないということではありません。Debianのサーバーシステムはexim4postfixも使っています。目立つDebianのデベロッパーからのメーリングリスト投稿メールのヘッダーの分析は、これら両方のMTAがともに人気があることを示唆しています。

exim4-*パッケージは非常に小さなメモリー消費とその設定が非常にフレキシブルであることで知られています。postfixパッケージは非常にコンパクトで高速で単純でセキュアーであることで知られています。両ソフトウエアーは十分な文書とともに提供され、品質とライセンスでもともに良好です。

Debianアーカイブ中には異なった能力と狙いを持ったメールトランスポートエージェント(MTA)パッケージに関して多くの選択肢があります。

表6.4 Debianアーカイブ中のメールトランスポートエージェント(MTA)パッケージに関する選択肢リスト

パッケージ ポプコン サイズ 能力と狙い
exim4-daemon-light * V:60, I:66 944 高機能
postfix * V:17, I:19 3236 高機能(セキュリティー)
exim4-daemon-heavy * V:1.8, I:2 1056 高機能(柔軟性)
sendmail-bin * V:2, I:2 2080 高機能(既に慣れている場合)
nullmailer * V:0.6, I:0.8 436 超軽量、ローカルメール無し
ssmtp * V:0.9, I:1.5 0 超軽量、ローカルメール無し
courier-mta * V:0.17, I:0.2 4032 超高機能
xmail * V:0.16, I:0.19 836 軽量
masqmail * V:0.04, I:0.06 556 軽量
esmtp * V:0.10, I:0.2 152 軽量
esmtp-run * V:0.07, I:0.12 60 軽量(esmtpのsendmail互換性拡張)
msmtp * V:0.2, I:0.7 328 軽量
msmtp-mta * V:0.09, I:0.12 32 軽量(msmtpのsendmail互換性拡張)

6.3.1. exim4設定

スマートホスト経由のインターネットメールに関しては、exim4-*パッケージを次のように(再)設定します。

$ sudo /etc/init.d/exim4 stop
$ sudo dpkg-reconfigure exim4-conf

"スマートホストでメール送信; SMTP または fetchmail で受信する"を選択します。

"送出スマートホストの IP アドレスまたはホスト名:"を"smtp.hostname.dom:587"と設定します。

"DNSクエリの数を最小限に留めますか(ダイヤルオンデマンド)?"に次の内のひとつの返答をします。

  • 起動時にインターネットに接続されている場合は、"No"。
  • 起動時にインターネットに接続されていない場合は、"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='nodaemon'"等とする事を考慮するべきです。

6.3.2. SASLを使うpostfixの設定

スマートホスト経由のインターネットメールに関してはpostfix文書と重要マニュアルページを読むことから始めるべきです。

表6.5 重要postfixマニュアルページのリスト

コマンド 機能
postfix(1) Postfixコントロールプログラム
postconf(1) Postfixの設定ユーティリティー
postconf(5) Postfix設定パラメーター
postmap(1) Postfix検索テーブルのメンテナンス
postalias(1) Postfixエリアスデーターベースのメンテナンス

postfixsasl2-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.3.3. メールアドレス設定

メールのトランスポートとデリバリーとユーザーのエージェントが使うメールアドレス設定ファイルが少々存在します。

表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"をエキスポートしてその値をオーバーライドします。

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/"を参照下さい。

6.3.4. 基本的なMTAの操作

基本的な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/*"中のスクリプトで全メールを排出するのは良い考えかも知れません。

6.4. メールユーザーエージェント(MUA)

Debian関連のメーリングリストを購読する場合、参加者のデファクトスタンダードで期待通り挙動をするmuttgnus等のMUAを使うのは良い考えかも知れません。

表6.8 メールユーザーエージェント(MUA)のリスト

パッケージ ポプコン サイズ タイプ
iceweasel * V:30, I:52 3852 X GUIプログラム(ブランドを外した Mozilla Firefox)
evolution * V:22, I:37 11180 X GUIプログラム(グループウエアスイートの一部)
icedove * V:10, I:14 38048 X GUIプログラム(ブランドを外した Mozilla Thunderbird)
mutt * V:20, I:83 5996 きっとvimとともに使われるキャラクターターミナルプログラム
gnus * V:0.05, I:0.4 6421 (x)emacsの下でキャラクターターミナルプログラム

6.4.1. 基本MUA — Mutt

vimと組み合わせてmuttをメールユーザーエージェント(MUA)として使うように"~/.muttrc"を使って次に示すようにカスタム化します。

# use visual mode and "gq" to reformat quotes
set editor="vim -c 'set tw=72 et ft=mail'"
#
# header weeding taken from the manual (Sven's Draconian header weeding)
#
ignore *
unignore from: date subject to cc
unignore user-agent x-mailer
hdr_order from subject to cc date user-agent x-mailer
set hostname=spoof.example.org
set from="First Last <username@example.org>"
....

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

6.5. リモートメールの取得および転送ユーティリティー

fetchmail(1)はGNU/Linux上のリモートメールの取得のデファクト標準でしたが、著者は現在getmail(1)が気に入っています。もしバンド幅を節約するためにメールをダウンロードする前に拒否したいなら、mailfiltermpopが役に立つかもしれません。どのメールの取得ユーティリティーを使おうとも、取得したメールをパイプ経由でmaildrop等のMDAに配送するようにシステム設定をすることをお勧めします。

表6.9 リモートメールの取得および転送ユーティリティーのリスト

パッケージ ポプコン サイズ 説明
fetchmail * V:2, I:6 1816 メール取得ユーティリティー(POP3、APOP、IMAP) (旧式)
getmail4 * V:0.3, I:0.8 648 メール取得ユーティリティー(POP3、IMAP4、SDPS) (単純、セキュアー、高信頼)
mailfilter * V:0.01, I:0.07 332 メール取得ユーティリティー(POP3)、regexフィルター機能付き
mpop * V:0.01, I:0.07 264 メール取得ユーティリティー(POP3)かつMDA、フィルター機能付き

6.5.1. getmailの設定

getmail(1)の設定はgetmail文書に記載されています。次に示すのがユーザーとして複数のPOP3アカウントにアクセスする著者の設定です。

"/usr/local/bin/getmails"を次のように作成します。

#!/bin/sh
set -e
rcfiles="/usr/bin/getmail"
for file in $HOME/.getmail/config/* ; do
  rcfiles="$rcfiles --rcfile $file"
done
exec $rcfiles $@

次のように設定します。

$ 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"を参照下さい。

6.5.2. fetchmailの設定

fetchmail(1)を設定するには、"/etc/default/fetchmail"や"/etc/fetchmailrc"や"$HOME/.fetchmailrc"を設定します。"/usr/share/doc/fetchmail/examples/fetchmailrc.example"中の例を参照下さい。

6.6. フィルター付きのメールデリバリーエージェント(MDA)

postfixexim4等のほとんどのMTAプログラムは、MDA(メールデリバリーエージェント)として機能します。フィルター機能のある専門のMDAがあります。

procmail(1)はGNU/Linux上のフィルター付きのMDAのデファクト標準でしたが、著者は現在maildrop(1)が気に入っています。どのフィルターユーティリティーを使おうとも、フィルターされたメールをqmailスタイルのMaildirにデリバリーするようにシステムを設定します。

表6.10 フィルター付きのMDAのリスト

パッケージ ポプコン サイズ 説明
procmail * V:17, I:85 364 フィルター付きMDA(旧式)
mailagent * V:0.4, I:6 1692 Perlフィルター付きMDA
maildrop * V:0.3, I:0.8 1060 構造化フィルター言語付きMDA

6.6.1. maildropの設定

maildrop(1)の設定はmaildropfilter文書に記載されています。次に"$HOME/.mailfilter"の設定例を示します。

logfile $HOME/.maildroplog
# clearly bad looking mails: drop them into X-trash and exit
if (    /^X-Advertisement/ ||\
        /^Subject:.*BUSINESS PROPOSAL/ ||\
        /^Subject:.*URGENT.*ASISSTANCE/ ||\
        /^Subject: *I NEED YOUR ASSISTANCE/ )
    to "$HOME/Maildir/X-trash/"

# Delivering mailinglist messages using automatically generated mailbox
if (    /^Precedence:.*list/ || /^Precedence:.*bulk/ )
{
    if ( /^List-Id:[ <]*([^<>]*)[ >]*/)
    {
        MAILBOX="$MATCH1"
    }
    else
    {
        if ( /^X-Loop: *(.*)@(.*)/)
        {
            MAILBOX="$MATCH1.$MATCH2"
        }
        else
        {
            if (    /Return-Path:.*\.debian\.org/ )
            {
                MAILBOX="automatic.debian.org"
            }
            else
            {
                MAILBOX="unknown-list"
            }
        }
    }
    `test -d $MAILROOT/$MAILBOX`
    if ( $RETURNCODE == 1 )
        `maildirmake $MAILROOT/$MAILBOX`
    to "$MAILROOT/$MAILBOX/"
}
to "$HOME/Maildir/Inbox/"
exit

警告

procmailと違い、maildropは欠落したmaildirディレクトリーを自動的に作りません。"$HOME/.mailfilter"の例中のように事前にmaildirmake(1)を使ってディレクトリーを作らなければいけません。

6.6.2. procmailの設定

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/

6.6.3. mboxの内容の再配達

もしあなたのホームディレクトリーが一杯になりprocmail(1)がうまく機能しなかった場合には、"/var/mail/<username>"からホームディレクトリー内の仕分けられたメールボックスの中に手動でメールを配達しなければいけません。ディスク空間を確保した後に、次を実行します。

# /etc/init.d/${MAILDAEMON} stop
# formail -s procmail </var/mail/<username>
# /etc/init.d/${MAILDAEMON} start

6.7. POP3/IMAP4サーバー

LAN上でプライベートのサーバーを実行する場合、LANクライアントにメールを配達するためにPOP3 / IMAP4サーバーを実行することを考えます。

表6.11 POP3/IMAPサーバーのリスト

パッケージ ポプコン サイズ タイプ 説明
qpopper * V:1.1, I:5 644 POP3 Qualcomm拡張のBSD POP3サーバー
courier-pop * V:1.5, I:2 244 POP3 Courierメールサーバー - POP3サーバー(maildirフォーマットのみ)
ipopd * V:0.11, I:0.2 212 POP3 Washington大学POP2とPOP3サーバー
cyrus-pop3d-2.2 * V:0.18, I:0.3 852 POP3 Cyrusメールシステム(POP3サポート)
xmail * V:0.16, I:0.19 836 POP3 ESMTP/POP3メールサーバー
courier-imap * V:3, I:4 1616 IMAP Courierメールサーバー - IMAPサーバー(maildirフォーマットのみ)
uw-imapd * V:0.8, I:5 272 IMAP Washington大学IMAPサーバー
cyrus-imapd-2.2 * V:0.5, I:0.7 2632 IMAP Cyrusメールシステム(IMAPサポート)

6.8. プリントサーバーとユーティリティー

旧来の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では、lprcups-bsdパッケージをインストールすると有効となります。)

Debianシステムには、プリントサーバーやユーティリティーで留意すべきパッケージがいくつかあります。

表6.12 プリントサーバーとユーティリティーのリスト

パッケージ ポプコン サイズ ポート 説明
lpr * V:2, I:3 440 printer (515) BSD lpr/lpd (ラインプリンターデーモン)
lprng * V:0.8, I:1.1 2904 , , , , (拡張)
cups * V:33, I:43 7584 IPP (631) インターネット印刷CUPSサーバー
cups-client * V:15, I:45 440 , , CUPS用System Vプリンターコマンド: lp(1)とlpstat(1)とlpoptions(1)とcancel(1)とlpmove(8)とlpinfo(8)とlpadmin(8)等
cups-bsd * V:8, I:40 180 , , CUPS用BSDプリンターコマンド: lpr(1)とlpq(1)とlprm(1)とlpc(8)等
cups-driver-gutenprint * V:10, I:37 1292 非該当 CUPS用のプリンタードライバー

ティップ

CUPSシステムはウェッブブラウザーを"http://localhost:631/" に向けることで設定できます。

6.9. リーモートアクセスサーバーとユーティリティー(SSH)

セキュアーシェル(SSH)はインターネット経由で接続するセキュアーな方法です。Debianでは、OpenSSHと呼ばれるSSHのフリーバージョンがopenssh-clientopenssh-serverパッケージとして提供されています。

表6.13 リモートアクセスサーバーとユーティリティーのリスト

パッケージ ポプコン サイズ ツール 説明
openssh-client * V:52, I:99 2076 ssh(1) セキュアーシェルクライアント
openssh-server * V:67, I:80 808 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:4 156 ssh-askpass(1) ユーザーにssh-add用のパスフレーズを質問する(プレーンX)

注意

あなたのSSHがインターネットからアクセスできる場合には、「インターネットのためのセキュリティー強化策」を参照下さい。

ティップ

リモートのシェルプロセスが回線接続の中断の際にも継続するようにするためにscreen(1)プログラムを使いましょう(「screenプログラム」参照)。

6.9.1. SSHの基本

警告

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-])に出会うことで中断される事がありません。

6.9.2. SMTP/POP3トンネルをするためのポートフォワーディング

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"と設定します。

6.9.3. リモートパスワード無しでの接続

"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"と調節する必要があります。

6.9.4. 外部SSHクライアントへの対処法

他のプラットフォーム上で使えるフリーな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)

6.9.5. ssh-agentの設定

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)and ssh-add(1)を参照下さい。

6.9.6. SSH上のリモートシステムをシャットダウンする方法

You need to protect the process doing "shutdown -h now"(「システムをシャットダウンする方法」参照)を実行しているプロセスをat(1)コマンド(「タスク1回実行のスケジュール」参照)を使って次のようにしてSSHが終了することから守る必要がある。

# echo "shutdown -h now" | at now

"shutdown -h now"をscreen(1)(「screenプログラム」参照)セッション中で実行しても同様のことができます。

6.9.7. SSHのトラブルシュート

問題に出会ったら、設定ファイルのパーミッションを確認し、sshを"-v"オプションとともに実行します。

rootでファイアーウォールと問題を起こした場合には、"-P"オプションを使いましょう; こうするとサーバーポートの 1 — 1023 を使うのを回避します。

リモートサイトへのssh接続が急に動作し無くなった際は、システム管理者による変更、特に可能性が高いのはシステムメンテナンス中に"host_key"が変更された結果かもしれません。実際にこういう状況で誰も洒落たハックでリモートホストとしてなりすまそうとしていないことを確認した後に、"host_key"エントリーをローカルホストの"~/.ssh/known_hosts"から削除すると再び接続できるようになります。

6.10. 他のネットワークアプリケーションサーバー

他のネットワークアプリケーションサーバーを次に示します。

表6.18 他のネットワークアプリケーションサーバー

パッケージ ポプコン サイズ プロトコル 説明
telnetd * V:0.4, I:1.2 156 TELNET TELNETサーバー
telnetd-ssl * V:0.15, I:0.4 152 , , , , (SSLサポート)
nfs-kernel-server * V:13, I:22 328 NFS Unix式ファイル共有
samba * V:20, I:33 17348 SMB Windowsのファイルとプリンター共有
netatalk * V:5, I:10 2452 ATP Apple/Macのファイルとプリンター共有(AppleTalk)
proftpd-basic * V:4, I:6 2008 FTP 汎用ファイルダウンロード
wu-ftpd * V:0.3, I:0.7 820 , , , ,
apache2-mpm-prefork * V:37, I:42 80 HTTP 汎用ウェッブサーバー
apache2-mpm-worker * V:6, I:7 80 , , , ,
squid * V:6, I:7 1840 , , 汎用ウェッブプロキシサーバー
squid3 * V:1.3, I:1.5 2452 , , , ,
slpd * V:0.17, I:0.3 228 SLP LDAP サーバーとしてのOpenSLP サーバー
bind9 * V:9, I:18 864 DNS 他のホストのIPアドレス
dhcp3-server * V:5, I:9 808 DHCP クライアント自身のIPアドレス

コモンインターネットファイルシステムプロトコル(CIFS)はサーバーメッセージブロック(SMB)と同じプロトコルでMicrosoft Windowsで広く使われています。

ティップ

Debianアーカイブの全内容のローカルのミラーサーバーを使うより、squid等のプロキシサーバーを使う方がはるかにバンド幅を節約上ではるかに効率的です。

6.11. 他のネットワークアプリケーションクライアント

他のネットワークアプリケーションクライアントを次に示します。

表6.19 他のネットワークアプリケーションクライアント

パッケージ ポプコン サイズ プロトコル 説明
netcat * I:42 36 TCP/IP TCP/IP用万能ツール(スイス陸軍ナイフ)
stunnel4 * V:0.5, I:1.9 512 SSL 万能SSLラッパー
telnet * V:14, I:90 200 TELNET TELNETクライアント
telnet-ssl * V:0.3, I:1.2 208 , , , , (SSLサポート)
nfs-common * V:48, I:81 516 NFS Unix式ファイル共有
smbclient * V:6, I:38 34220 SMB MS Windowsのファイルとプリンター共有
smbfs * V:5, I:26 5400 , , リモートのMS Windowsファイルをマウントやアンマウントするコマンド
ftp * V:10, I:86 120 FTP FTPクライアント
lftp * V:1.4, I:6 1864 , , , ,
ncftp * V:1.6, I:8 1212 , , フルスクリーンのFTPクライアント
wget * V:29, I:99 2356 HTTPFTP ウェッブダウンローダー
curl * V:6, I:21 324 , , , ,
bind9-host * V:41, I:90 180 DNS bind9由来のhost(1)コマンド、"Priority: standard"
dnsutils * V:12, I:91 396 , , bind由来のdig(1)コマンド、"Priority: standard"
dhcp3-client * V:47, I:94 608 DHCP IPアドレス獲得
ldap-utils * V:1.5, I:7 696 LDAP LDAPサーバーからデーター獲得

6.12. システムデーモンの診断

telnetプログラムを使うとシステムデーモンへの手動接続とその診断ができます。

例えば、次を試してみて下さい:

$ telnet mail.ispname.net pop3

次のRFCは各システムデーモンに関する必要な知見を提供します。

表6.20 よく使われるRFCのリスト

RFC 説明
rfc1939rfc2449 POP3サービス
rfc3501 IMAP4サービス
rfc2821 (rfc821) SMTPサービス
rfc2822 (rfc822) メールファイルフォーマット
rfc2045 Multipurpose Internet Mail Extensions (MIME)
rfc819 DNSサービス
rfc2616 HTTPサービス
rfc2396 URI定義

"/etc/services"の中にポートの使用され方が記載されています。

注記

HTTPS等のTLS/SSLサービスをテストするには、TLS/SSLを有効にしたtelnetプログラムが必要です。

第7章 X Windowシステム

Debianシステム上のX WindowシステムX.Org由来のソースに基づいています。2009年7月現在、それはX11R7.1(etch)とX11R7.3(lenny)とX11R7.3(squeeze)とX11R7.4(sid)です。

7.1. 重要パッケージ

インストールを簡略化するための(メタ)パッケージが少々あります。

表7.1 X Windowのためのキーとなる(メタ)パッケージのリスト

(メタ)パッケージ ポプコン サイズ 説明
xorg * I:48 56 Xライブラリー、Xサーバー、フォントセット、基本的なXクライアントとユーティリティーの集合(メタパッケージ)
xserver-xorg * V:33, I:55 276 このパッケージはXサーバーのフルスイーツとその設定
xbase-clients * V:7, I:52 140 Xクライアントの雑多な集合
x11-common * V:46, I:92 568 X Windowシステムのためのファイルシステムインフラ
xorg-docs * I:9 5124 X.Orgソフトウエアースイーツの雑多な文書
xspecs * I:1.3 6504 Xプロトコルや拡張やライブラリーの技術スペック
menu * V:28, I:55 2028 メニューに対応しているアプリケーションに関してDebianメニューを生成
gksu * V:25, I:49 176 su(1)かsudo(8)のGtk+フロントエンド
menu-xdg * I:52 76 Debianメニュー構造をfreedesktop.orgのxdgメニュー構造に変換
xdg-utils * V:14, I:48 256 freedesktop.orgによって提供される統合デスクトップ環境のためのユーティリティー
gnome-desktop-environment * I:30 20 標準のGNOMEデスクトップ環境(メタパッケージ)
kde-core * I:8 NOT_FOUND コアのKDEデスクトップ環境(メタパッケージ)
xfce4 * I:5 40 Xfce軽量デスクトップ環境(メタパッケージ)
lxde-core * I:2 36 LXDE軽量デスクトップ環境(メタパッケージ)
fluxbox * V:0.9, I:3 4280 Fluxbox: 自由自在に設定可能でリソース消費が少ないXウィンドウマネージャー

Xの基本に関しては、X(7)とthe LDP XWindow-User-HOWTOを参照下さい。

7.2. デスクトップ環境の設定

デスクトップ環境は、通常Xウィンドウマネージャーとファイルマネージャーと互換性あるユーティリティープログラムのスイートの組み合わせです。

GNOMEKDEXfceLXDE等の充実したデスクトップ環境aptitudeのタスクメニューを使って設定できます。

ティップ

タスクメニューはDebianのunstable/testing環境下では最新のパッケージの変遷状態を反映していないかもしれません。そのような状況ではパッケージ間のコンフリクトを避けるためにaptitude(8)のタスクメニューの下でいくつかの(メタ)パッケージを非選択にする必要があります。(メタ)パッケージを非選択にする場合には、それらに依存関係を提供しているパッケージが自動削除されないように特定のパッケージを手動選択しなければいけません。

上記と違う方法として、Fluxbox等のXウィンドウマネージャーだけを使って簡単な環境を設定する事もできます。

Xウィンドウマネージャーやデスクトップ環境のガイドはXのためのウィンドウマネージャーを参照下さい。

7.2.1. Debianメニュー

Debianメニューシステムmenuパッケージのupdate-menus(1)を使って、テキストとXの両指向のプログラムに関して一般化されたインターフェースを提供します。各パッケージは"/usr/share/menu/"ディレクトリーにメニューデーターをインストールします。"/usr/share/menu/README"を参照下さい。

7.2.2. Freedesktop.orgメニュー

Freedesktop.orgのxdgメニューシステム対応の各パッケージは"/usr/share/applications/"の下の"*.desktop"で提供されるそのメニューデーターをインストールします。Freedesktop.orgスタンダード対応の現代的デスクトップ環境はxdg-utilsパッケージを使ってこれらのデーターからそれぞれのメニューを生成します。"/usr/share/doc/xdg-utils/README"を参照下さい。

7.2.3. GNOMEデスクトップ環境下のDebianメニュー

GNOMEデスクトップ環境下で伝統的なDebianメニューにアクセスするにはmenu-xdgをインストールし、"System" → "Preference" → "Main Menu"とし、"Debian"のボックスをチェックします。

ティップ

Freedesktop.orgスタンダード対応の他の現代的デスクトップ環境でも同様の対応が必要かもしれません。

7.3. サーバー/クライアント関係

X Windowシステムはサーバーとクライアントのプログラムの組み合わせとして起動されます。ローカルリモートと言う言葉に対応するサーバークライアントと言う言葉の意味に注意を払う必要があります。

表7.2 サーバー/クライアントの用語法のリスト

タイプ 説明
Xサーバー ユーザーのディスプレーや入力デバイスが接続されたローカルホスト上で実行されるプログラム。
Xクライアント データーを処理しXサーバーへ話しかけるリモートホスト上で実行されるプログラム。
アプリケーションサーバー データーを処理しクライアントへ話しかけるリモートホスト上で実行されるプログラム。
アプリケーションクライアント ユーザーのディスプレーや入力デバイスが接続されたローカルホスト上で実行されるプログラム。

7.4. Xサーバー

Xサーバーの情報はxorg(1)を参照下さい。

7.4.1. Xサーバーの(再)設定

注記

Xサーバー(lenny以降)は、その設定に"/etc/X11/xorg.conf"からの情報よりHALD-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)設定で通常問題はありません。

注記

あなたのモニターシステムのハードウエアーを破壊するかもしれないので、高過ぎるリフレッシュレートを使わないように注意して下さい。

7.4.2. Xサーバーへの接続方法

"Xサーバー" (ディスプレー側)が"Xクライアント" (アプリケーション側)からの接続を許可するようにするにはいくつかの方法があります。

表7.3 Xサーバーへの接続方法のリスト

方法 パッケージ ポプコン サイズ ユーザー 暗号化 適切な用途
xhostコマンド xbase-clients * V:7, I:52 140 非確認 いいえ 非推奨
xauthコマンド xbase-clients * V:7, I:52 140 確認済み いいえ パイプ経由のローカル接続用
ssh -Xコマンド openssh-client * V:52, I:99 2076 確認済み はい リモートネットワーク接続用
GNOMEディスプレーマネージャー gdm * V:29, I:41 15207 確認済み いいえ(XDMCP) パイプ経由のローカル接続用
KDEディスプレーマネージャー kdm * V:9, I:13 4116 確認済み いいえ(XDMCP) パイプ経由のローカル接続用
Xディスプレーマネージャー xdm * V:0.7, I:2 688 確認済み いいえ(XDMCP) パイプ経由のローカル接続用
WindowMakerディスプレーマネージャー wdm * V:22, I:84 1964 確認済み いいえ(XDMCP) パイプ経由のローカル接続用
LTSPディスプレーマネージャー ldm * V:0.02, I:0.11 308 確認済み はい リモートSSHネットワーク接続用(シンクライアント)

警告

暗号手法を使っている等といった非常に良い理由無しには、X接続のためにセキュアーされていないネットワーク経由のリモートTCP/IP接続を使ってはいけません。暗号化無しのリモートTCP/IPソケット接続は盗聴の被害に会いやすく、Debianシステムではデフォールトで無効化されています。"ssh -X"を使います。

警告

セキュアーされていないネットワーク経由でXDMCP接続も使ってはいけません。XDMCP接続は、UDP/IP経由で暗号化せずデーターを送信するので盗聴攻撃を受けやすいです。

ティップ

もし完全にセキュアーな環境の中では、"/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ターミナルサーバープロジェクトのことです。

7.5. X Windowシステムの起動

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コマンドで実行することです。

  1. もし定義されていた場合には、Xディスプレーマネージャーにより"/etc/X11/Xsession"の引数として指定されたスクリプト。
  2. もし定義されていた場合には、"~/.xsession"か"~/.Xsession"スクリプト。
  3. もし定義されていた場合には、"/usr/bin/x-session-manager"コマンド。
  4. もし定義されていた場合には、"/usr/bin/x-window-manager"コマンド。
  5. もし定義されていた場合には、"/usr/bin/x-terminal-emulator"コマンド。

このプロセスは"/etc/X11/Xsession.options"の内容に影響されます。これらの"/usr/bin/x-*"コマンドが指し示すプログラムが正確に何であるかはDebianのalternativeシステムにより決定され、"update-alternatives --config x-session-manager"等によって変更されます。

7.5.1. gdmでXセッションをスタート

gdm(1)はメニューからXセッションのセッションのタイプ(デスクトップ環境: 「デスクトップ環境の設定」)とか、言語(ロカール: 「ロケール」)を選択できるようにします。それは"~/.dmrc"の中に選択されたデフォールト値を次のように保存します。

[Desktop]
Session=default
Language=ja_JP.UTF-8

7.5.2. Xセッションのカスタム化(古典的方法)

"/etc/X11/Xsession.options"が、"#"文字が前に付いていない"allow-user-xsession"と言う行を含んでいるシステム上では、誰でも"~/.xsession"か"~/.Xsession"を定義することでシステムコードを完全にオーバーライドして"/etc/X11/Xsession"の挙動をカスタム化できます。"~/.xsession"ファイル中の最後のコマンドはあなたの最も好むX window/セッションマネージャーを起動するように"exec some-window/session-manager"という形式の使う必要があります。

7.5.3. Xセッションのカスタム化(新方法)

上記のように完全にシステムコードをオーバーライドすること無しにXセッションをカスタム化する新方法を次に示します。

  • ディスプレーマネージャーgdmは特定のセッションを選択する事ができて、それを"/etc/X11/Xsession"の引数に設定できます。
  • "~/.xsessionrc"ファイルが起動プロセスの一部として実行されます。(デスクトップ非依存)
  • "~/.gnomerc"ファイルが起動プロセスの一部として実行されます。(GNOMEデスクトップのみ)
  • GUIプログラムで提供されるセッション管理ソフトが"~/.gnome2/session"ファイルなどを使うかもしれません。

7.5.4. リモートXクライアントをSSH経由で接続

"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クライアントからの出力を表示できるようにします。

7.5.5. インターネット経由のセキュアーな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

7.6. X Windowでのフォント

Debianシステム上のフォント設定は歴史的視点で次のように要約できます。

  • woody以前は、インストールされたフォントを設定するのに特定のマニュアル操作が各アプリケーション毎に必要でした。
  • 2000年に、このフォント設定の自動化のために、Debian固有の接着層を提供するDebianフォントマネージャー(defoma)が作成されました。

    • 各フォントパッケージはアプリケーションに依存しないフォントデーターをdefomaに開示します。
    • 各アプリケーションはそれぞれのパッケージスクリプト経由でこれらのデーターを使いインストールされた各フォントを設定します。
    • Xサーバーに関して、TrueTypeフォントやCIDフォント(CMapsも含めて)を設定するプログラムはx-ttcidfont-confとしてパッケージされています。
  • 2002年に、Fontconfig 2.0がフォントアクセスの設定とカスタム化のためのディストリビューション非依存のライブラリーとして作られました。

    • lennyリリースの時点では、フォントデーターにアクセスするほとんど全てのプログラムがこのシステムを使っているようです。
    • squeeze以降、DebianはFontconfig 2.0のみを使用し、Debian Font Manager (defoma)を廃止します。

X Windowシステムのフォントサポートは次のように要約できます。

  • 旧来のXサーバー側フォントサポートシステム

    • 旧式バージョンのXクライアントアプリケーションとの下位互換性ためにオリジナルの中核X11フォントシステムが提供されています。
    • オリジナルの中核X11フォントはXサーバーにインストールされます。
  • 現代的なXクライアント側フォントサポートシステム

表7.4 X Windowフォントシステムをサポートするパッケージのテーブル

パッケージ ポプコン サイズ 説明
xfonts-utils * V:30, I:71 516 X Windowシステムフォントユーティリティープログラム
libxft2 * V:44, I:75 148 Xft、XアプリケーションとFreeTypeフォントラスター化ライブラリーをつなげるライブラリー
libfreetype6 * V:57, I:87 796 FreeType 2.0フォントラスター化ライブラリー
fontconfig * V:33, I:74 536 Fontconfig、汎用フォント設定ライブラリー — サポートバイナリー
fontconfig-config * I:82 440 Fontconfig、汎用フォント設定ライブラリー — 設定データー
defoma * V:24, I:84 564 Debianフォントマネージャー — 自動フォント設定フレームワーク (lenny)
x-ttcidfont-conf * I:45 156 XのためのTrueTypeとCIDフォンとの設定 (CJKサポート付き)

フォント設定情報は次のようにして確認できます。

  • 中核X11フォントパスに関しては"xset q"
  • fontconfigのフォントデフォールトに関しては"fc-match"
  • fontconfigで利用可能なフォントに関しては"fc-list"

ティップ

"The Penguin and Unicode"は現代的なX Windowシステムの良い概論です。http://unifont.org/にある他の文書もUnicodeフォントやUnicode化されたソフトや国際化やUnicodeのフリー(英語で自由と無償という意味)/リブレ(仏語等で自由の意味、無償という意味は無い)/オープンソース(FLOSS)オペレーティングシステム上での使い勝手の問題に関する良い情報源です。

ティップ

Debianシステム上でフォント設定をするのにはfontconfigインフラを使うべきです。Debianフォントマネージャー(defoma(1))はlennyでのフォントのインストールやX論理フォント記述(XLFD)データーの登録等のみにしか役立ちません。

7.6.1. 基本的フォント

コンピューターフォントには大きくわけて2つのタイプがあります。

  • ビットマップフォント(低解像度のラスター化で良好)
  • アウトラインやストロークフォント(高解像度ラスター化で良好)

ビットマップフォントを拡大するとギザギザのイメージになってしまいますが、アウトラインやストロークフォント拡大するとスムーズなイメージになります。

Debianシステム上のビットマップフォントは、".pcf.gz"というファイル拡張子を持った圧縮されたX11 pcf ビットマップフォントファイルとして提供されます。

Debianシステム上のアウトラインフォントは次で提供されます。

  • ".pfb" (バイナリーフォントファイル)と".afm" (フォントメトリクスファイル)というファイル拡張子を持ったPostScript Type 1フォントファイル。
  • ".ttf"というファイル拡張子を通常持ったTrueType(もしくはOpenType)フォントファイル。

ティップ

OpenTypeTrueTypePostScript Type 1の両方を置き換えることを目指しています。

表7.5 PostScript Type 1フォントへの対応表

フォントパッケージ ポプコン サイズ サンセリフフォント セリフフォント モノスペースフォント フォントの起源
PostScript N/A N/A Helvetica Times Courier Adobe
gsfonts * V:19, I:68 4792 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:2 5008 Free Helvetian Free Times Free Courier 拡張URW(Adobe互換サイズ)
lmodern * V:4, I:16 45644 LMSans* LMRoman* LMTypewriter* Computer Modern (TeX由来)に準拠したスケーラブルなPostScriptとOpenTypeのフォント

表7.6 TrueTypeフォントへの対応表

フォントパッケージ ポプコン サイズ サンセリフフォント セリフフォント モノスペースフォント フォントの起源
ttf-mscorefonts-installer * I:11 196 Arial Times New Roman Courier New Microsoft (Adobe互換サイズ) (これはnon-freeデーターをインストールします)
ttf-liberation * I:42 1724 Liberation Sans Liberation Serif Liberation Mono Liberationフォントプロジェクト (Microsoft互換サイズ)
ttf-freefont * I:22 4204 FreeSans FreeSerif FreeMono GNU freefont (Microsoft互換サイズ)
ttf-dejavu * I:81 68 DejaVu Sans DejaVu Serif DejaVu Sans Mono DejaVu、Unicode 対応Bitstream Vera
ttf-dejavu-core * I:64 2564 DejaVu Sans DejaVu Serif DejaVu Sans Mono DejaVu、Unicode対応Bitstream Vera (sans, sans-bold, serif, serif-bold, mono, mono-bold)
ttf-dejavu-extra * I:64 5744 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フォントに基づきそれを包含します。

7.6.2. 追加のフォント

aptitude(8)を使うと追加のフォントを簡単に見つけられます。

  • "Tasks" → "Localization"の下の短いパッケージ一覧
  • debtagへの正規表現: "~Gmade-of::data:font"を使ってフォントデーターにフィルターされた平坦なパッケージ一覧
  • パッケージ名への正規表現: "~nxfonts-"を使ってBDF (ビットマップ)フォントパッケージにフィルターされた平坦なパッケージ一覧
  • パッケージ名への正規表現: "~nttf-"を使ってTrueType (アウトライン)フォントパッケージにフィルターされた平坦なパッケージ一覧

フリーなフォントは限られていることがあるので、Debianユーザーにとっていくつかの商用TrueTypeフォントをインストールする選択肢があります。こういったことをユーザーが簡単しやすいようにいくつかの利便性のためのパッケージが作成されています。

  • ttf-mathematica4.1
  • ttf-mscorefonts-installer

あなたのフリーなシステムをnon-Freeのフォントで汚染する事になるとはいえ、TrueTypeフォントの選択肢は非常に沢山あります。

7.6.3. CJKフォント

CJK(中日韓)文字のフォントに焦点を当てキーポイントを記します。

表7.7 CJKフォント名中でフォントタイプを示すために使われるキーワード表

フォントタイプ 日本語フォント名 中国語フォント名 韓国語フォント名
サンセリフ gothic, ゴチック hei, gothic dodu m, gulim, gothic
セリフ mincho, 明朝 so ng, ming ba tang

"P"の付いた"VL PGothic"のようなフォント名は、固定幅フォントの"VL Gothic"フォントに対応するプロポーショナルフォントです。

例えば、Shift_JISコードテーブルには7070文字があります。それらは次のように分類できます。

  • JIS X 0201 1バイト文字(191文字、別名: 半角文字)
  • JIS X 0208 2バイト文字(6879文字、別名: 全角文字)

2バイト文字はCJK固定幅フォントを使うコンソールターミナル上で倍の幅を占めます。このような状況に対応するために、ファイル拡張子".hbf"を使うHanziビットマップフォント(HBF)ファイルが1バイトと2バイトの文字を含むフォントのために使えます。

TrueTypeフォントファイルのための空間を節約するために、ファイル拡張子".ttc"を持つTrueTypeフォントコレクションファイルを使う事ができます。

文字の複雑なコード空間をカバーするために、CIDでキーされたPostScript Type 1フォントは"%!PS-Adobe-3.0 Resource-CMap"で始まるCMapファイルとともに使われます。これは通常のXディスプレーではほとんど使われませんがPDFのレンダリング等では使われます(「Xユーティリティーアプリケーション」参照)。

ティップ

ハン(漢)統一のために複数のグリフがいくつかのUnicodeコードポイントに対して期待されています。最も気になることの一つはCJK国間で文字の位置が異なる"U+3001 IDEOGRAPHIC COMMA"と"U+3002 IDEOGRAPHIC FULL STOP"です。"~/.fonts.conf"を使って日本語中心のフォントを中国語中心のフォントより優先順位を上げるよう設定することで日本人は安心できるようになります。

7.7. Xアプリケーション

7.7.1. Xオフィスアプリケーション

基本的なオフィスアプリケーションのリストを記します(OOはOpenOffice.org)。

表7.8 基本的なXオフィスアプリケーションのリスト

パッケージ ポプコン パッケージサイズ タイプ 説明
openoffice.org-writer * V:22, I:44 26468 OO ワードプロセッサ
openoffice.org-calc * V:22, I:44 19632 OO スプレッドシート
openoffice.org-impress * V:18, I:43 2956 OO プレゼンテーション
openoffice.org-base * V:16, I:43 9440 OO データーベース管理
openoffice.org-draw * V:19, I:43 9256 OO ベクトル画像エディター(ドロー)
openoffice.org-math * V:16, I:43 1504 OO 数式エディター
abiword * V:4, I:8 4748 GNOME ワードプロセッサ
gnumeric * V:4, I:9 8108 GNOME スプレッドシート
gimp * V:12, I:47 13472 GTK ビットマップ画像エディター(ペイント)
inkscape * V:11, I:30 87444 GNOME ベクトル画像エディター(ドロー)
dia-gnome * V:1.4, I:3 620 GNOME フローチャートやダイアグラムエディター
planner * V:0.8, I:7 7468 GNOME プロジェクト管理
kword * V:0.8, I:1.9 3744(*) KDE ワードプロセッサ
kspread * V:0.7, I:2 8748(*) KDE スプレッドシート
kpresenter * V:0.5, I:1.6 2184(*) KDE プレゼンテーション
kexi * V:0.2, I:1.9 NOT_FOUND KDE データーベース管理
kivio * V:0.6, I:1.8 NOT_FOUND KDE フローチャートやダイアグラムエディター
karbon * V:0.6, I:1.7 2816(*) KDE ベクトル画像エディター(ドロー)
krita * V:0.7, I:2 11488(*) KDE ビットマップ画像エディター(ペイント)
kplato * V:0.2, I:1.7 6372(*) KDE プロジェクト管理
kchart * V:0.5, I:1.7 2688(*) KDE 画像と図表ドロープログラム
kformula * V:0.4, I:1.4 NOT_FOUND KDE 数式エディター
kugar * V:0.4, I:1.4 NOT_FOUND KDE ビジネスクオリティーのレポートジェネレータ

7.7.2. Xユーティリティーアプリケーション

著者の目に止まった基本的ユーティリティーアプリケーションのリストを記します。

表7.9 基本的Xユーティリティーアプリケーションのリスト

パッケージ ポプコン パッケージサイズ タイプ 説明
evince * V:26, I:40 1104 GNOME 文書(pdf)ビューワー
kpdf * V:6, I:12 NOT_FOUND KDE3 文書(pdf)ビューワー
okular * V:3, I:5 3116 KDE4 文書(pdf)ビューワー
evolution * V:22, I:37 11180 GNOME 個人情報管理(グループウエアと電子メール)
kontact * V:1.8, I:11 1336 KDE 個人情報管理(グループウエアと電子メール)
scribus * V:0.5, I:3 26864 KDE デスクトップページレイアウトエディター
glabels * V:0.2, I:0.8 1088 GNOME ラベルエディター
kbarcode * V:0.06, I:0.4 2176 KDE バーコードとラベル印刷アプリケーション
gnucash * V:0.7, I:2 5912 GNOME 個人会計
homebank * V:0.08, I:0.4 904 GTK 個人会計
kmymoney2 * V:0.2, I:0.9 9504 KDE 個人会計
xsane * V:6, I:39 748 GTK スキャナーのフロントエンド
kooka * V:1.0, I:9 NOT_FOUND KDE スキャナーのフロントエンド

注意

evinceokularによってCJKのPDF文書をCmapデーター(「CJKフォント」)を使って表示する際にはpoppler-dataパッケージ(以前はnon-freeだった、「Ghostscript」参照)が必要です。

注記

scribus (KDE)のようなソフトウエアーをGNOMEデスクトップ環境にインストールすることは、同様の機能がGNOMEデスクトップ環境に無いので、まったく問題ありません。でも機能の重複するたくさんのパッケージをインストールしすぎるとあなたのメニューが忙しくなってしまいます。

7.8. Xトリビア

7.8.1. Xでのキーマップとポインターボタンのマッピング

xmodmap(1)はX Windowシステム中でのキーマップとポインターボタンのマッピングのためのユーティリティーです。keycodeを知るには、X環境下でxev(1)を実行してキーを押さえます。keysymの意味を知るには、"/usr/include/X11/keysymdef.h"ファイル(x11proto-core-devパッケージ)中のMACRO定義を覗いて下さい。このファイル中の全ての"#define"文はkeysym名に"XK_"を前付けして名づけられています。

7.8.2. 古典的Xクライアント

xterm(1)のような多くの伝統的Xクライアントプログラムは、ジオメトリやフォントや表示を規定する標準化されたコマンドラインオプションの組み合わせを使って起動できます。

それらはその見栄えを設定するのにXリソースデーターベースも用います。Xリソースのシステム全体のデフォールトは"/etc/X11/Xresources/*"の中に保存されており、それらのアプリケーションのデフォールトは"/etc/X11/app-defaults/*"の中に保存されています。これらの設定をスタート点として使います。

"~/.Xresources"ファイルはユーザーのリソース規定を保存するために使われます。ログイン時にこのファイルは自動的にデフォールトのXリソースに合流されます。この設定変更をしてすぐ有効にするには、それを次のコマンドを使ってデーターベースに合流させます。

$ xrdb -merge ~/.Xresources

x(7)とxrdb(1)を参照下さい。

7.8.3. Xターミナルエミュレーター — xterm

xterm(1)に関することは、http://dickey.his.com/xterm/xterm.faq.htmlで学びます。

7.8.4. Xクライアントをrootで実行

警告

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:25, I:49)はルート特権を獲得することに特化したGTK+のGUIパッケージです。それがsu(1)またはsudo(8)をバックエンドに使うように"/apps/gksu/sudo-mode" gconfキーを使って設定できます。gconfキーを編集するにはgconf-editor(1)を使えばできます(メニュー: "Applications" → "System Tools" → "Configuration Editor")。

第8章 I18NとL10N

アプリケーションソフトの多言語化(M17N)とかネイティブ言語サポートは2段階で行います。

  • 国際化(I18N): ソフトが複数のロケール(地域)を扱えるようにします。
  • 地域化(L10N): 特定のロケール(地域)を扱えるようにします。

ティップ

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を参照下さい。

国際化ハードウエアーサポートは地域化した設定データーを使って実現されています。

8.1. キーボード入力

Debianシステムは多くのキーボード配列で機能するように設定できます。

表8.1 キーボード再設定方法のリスト

環境 コマンド
Linuxコンソール dpkg-reconfigure --priority=low console-data
X Window dpkg-reconfigure --priority=low xserver-xorg

こうすることでデッドキー機能付きで多くの欧州言語に関してアクセント付き文字のキーボード入力をサポートするようにします。アジア言語に関しては次に記すSCIMのようなより複雑なインプットメソッドが必要です。

8.1.1. SCIMを使うインプットメソッドのサポート

Debianシステムための多言語入力の設定は、im-switchパッケージとともにスマート共通インプットメソッド(SCIM)ファミリーのパッケージを使うことで簡素化されました。SCIMパッケージのリストは次です。

表8.2 SCIMを用いるインプットメソッドサポートのリスト

パッケージ ポプコン サイズ サポートされたロケール
scim-anthy * V:0.2, I:0.6 2996 日本語
scim-canna * V:0.07, I:0.3 376 , ,
scim-skk * V:0.05, I:0.2 1060 , ,
scim-prime * V:0.04, I:0.2 912 , ,
scim-tables-ja * I:0.5 380 , , (実用性無し)
scim-tables-zh * I:0.7 11676 中国語(zh_*用)
scim-pinyin * V:0.3, I:0.7 5324 , , (zh_CN用)
scim-chewing * V:0.13, I:0.4 264 , , (zh_TW用)
scim-hangul * V:0.04, I:0.08 288 韓国語
scim-tables-ko * I:0.08 472 , ,
scim-thai * V:0.01, I:0.04 140 タイ
scim-m17n * V:0.06, I:0.13 92 多言語: インド系言語、アラビア語、他
scim-tables-additional * I:0.17 336 , ,
scim-uim * V:0.06, I:0.2 140 , ,

kinput2法や他のロケール依存のアジアの古典的インプットメソッドはまだありますが、現代的なUTF-8のX環境下ではお勧めできません。現代的なUTF-8のX環境下でのインプットメソッドの代替アプローチとしては、非X環境下でも実行できるuimツールチェインがあります。

8.1.2. 日本語の例

日本語インプットメソッドを英語環境 ("en_US.UTF-8")下で起動すると非常に便利です。SCIMを使ってこの環境をどう実現したかを以下に記します。

  1. 日本語インプットツールパッケージのscim-anthyim-switch等の推奨(recommended)されたパッケージとともにインストールします。
  2. ユーザーのシェルから"im-switch -c"を実行して"scim"を選択します。
  3. ユーザーアカウントへの再ログイン
  4. "im-switch -l"として設定を確認します。
  5. GUIツールバーを右クリックしてインプットメソッドとモードを設定します。(インプットメソッドのメニュー選択肢を減らす事ができます)
  6. CTRL-SPACEによってSCIMインプットメソッドを起動します。

注記

non-CJKかつnon-en_USのロケールの下でSCIMを起動するには、 "~/.scim/global"か"/etc/scim/global"ファイルにUTF-8中のそれらのロケールを次のように追加しなければいけません。

/SupportedUnicodeLocales = en_US.UTF-8,en_GB.UTF_8,fr_FR.UTF-8

以下に注意下さい。

  • im-switch(8)は実行されるのがrootからかどうかによって違った挙動をします。
  • im-switchによって起動されるインプットメソッドはロケールに依存します。
  • 新しい("$GTK_IM_MODULE"とか"$QT_IM_MODULE"の設定による)immoduleメカニズムを使うと、unstableではライブラリー移行の期間に不安定性に会うかもしれません。

設定の詳細は、"/usr/share/doc/im-switch/README.Debian.gz"か"/usr/share/doc/scim/README.Debian.gz"か"/usr/share/doc/uim/README.Debian.gz"を参照下さい。要点をここに記します。

8.1.3. インプットメソッドを無効化

XIMを経由せずに入力したい場合には、プログラムを起動する際に"$XMODIFIERS"の値を"none"と設定します。もしemacs(1)上で日本語入力インフラeggを使う場合にはこれが当てはまるかもしれません。シェルから、次を実行します。

$ XMODIFIERS=none emacs

Debianメニューによって実行されるコマンドを調整するには、"/usr/share/doc/menu/html"に記された方法にしたがって"/etc/menu/"中にカスタム化した設定を置きます。

8.2. ディスプレー出力

Linuxコンソールは限定された文字しか表示できません。(非Xコンソール上で非ヨーロッパ言語を表示するにはjfbterm(1)のような特別なターミナルプログラムを使う必要があります。)

X Windowは必要なフォントデーターがあればUTF-8中の全ての文字を表示できます。(オリジナルフォントデーターで使われた符号化方式はX Windowシステムが面倒を見るのでユーザーからは直接見えません。)

8.3. ロケール

以下ではgdm(1)から起動されたX Window環境下で実行されるアプリケーションのためのロケールに焦点を当てます。

8.3.1. 符号化方式の基本

環境変数"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"は無しで)設定していました。

  • ASCII文字セットが"LANG=C"か"LANG=POSIX"の場合に使われます。
  • 伝統的なUnixでの符号化方式が"LANG=xx_YY"の場合に使われます。

"LANG=xx_YY"の場合に実際に使われる符号化方式は"/usr/share/i18n/SUPPORTED"を確認することで識別できます。例えば、"en_US"は"ISO-8859-1"符号化方式を使い、"fr_FR@euro"は"ISO-8859-15"符号化方式を使います。

ティップ

符号化方式の値の意味に関しては、表11.2「符号化方式値とその使い方リスト」を参照下さい。

8.3.2. UTF-8ロケールを使う根拠

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システムを採用したことはこのような符号化方式(エンコーディング)の問題を実質的に解決しました。

8.3.3. ロケールの再設定

システムが特定のロケールにアクセスするために、ロケールデーターはロケールデーターベースにコンパイルされなければいけません。(locales-allパッケージをインストールしない限り、Debianシステムは全てのロケールを事前にコンパイルして提供されません。)コンパイルすることができようにサポートされているロケールの全リストは"/usr/share/i18n/SUPPORTED"中にリストされています。このファイルは全ての適切なロケール名をリストします。次のようにすると全ての既にバイナリー形式にコンパイルされ使えるUTF-8ロケールがリストされます。

$ locale -a | grep utf8

次のコマンド実行をするとlocalesパッケージが再設定されます。

# dpkg-reconfigure locales

このプロセスは3段階あります。

  1. 使えるロケールのリストを更新
  2. それをバイナリー形式にコンパイル
  3. PAM (「PAM と NSS」参照)によって使われるように"/etc/defaults/locale"中のシステム全体のデフォールトのロケール値を設定

使えるロケールには、"en_US.UTF-8"と"UTF-8"付きの全ての関心のある言語が含まれているべきです。

米国英語での推奨のデフォールトロケールは"en_US.UTF-8"です。他の言語では"UTF-8"付きのロケールを選ぶようにして下さい。これらの設定の内のいずれを使おうとも、いかなる国際化文字でも扱えます。

注記

ロケールを"C"に設定すると、メッセージは米国英語になりますが、ASCII文字しか扱えなくなります。

8.3.4. "$LANG"環境変数の値

"$LANG"環境変数の値は多くのアプリケーションによって設定や変更されます。

  • Linuxコンソールプログラムに関しては、login(1)のPAM機構によって初期設定
  • 全てのXプログラムに関しては、ディスプレーマネージャーのPAM機構によって初期設定
  • リモートコンソールプログラムに関しては、ssh(1)のPAM機構によって初期設定
  • 全てのXプログラムに関しては、gdm(1)のような一部ディスプレーマネージャーによって変更
  • 全てのXプログラムに関しては、 "~/.xsessionrc"を経由するXセッションの起動コードによって変更(lennyの機能)
  • 全てのコンソールプログラムに関しては、 "~/.bashrc"等のシェルの起動コードによって変更

ティップ

互換性を最大限に考えると、システムワイドのデフォールトロケールを"en_US.UTF-8"と設定するのが賢明です。

8.3.5. X Windowの下でのみ特定ロケール

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"ファイル使って簡単にロケールを変更してもいいです。

8.3.6. ファイル名の符号化方式

クロスプラットフォームのデーター交換(「リムーバブルストレージデバイス」参照)のために、特定の符号化方式(エンコーディング)でファイルシステムをマウントする必要があるかもしれません。例えば、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等と変更できます。

8.3.7. 地域化されたメッセージと翻訳された文書

Debianシステム中で表示されるエラーメッセージや標準のプログラムの出力やメニューやマニュアルページ等のテキストメッセージや文書の多くに翻訳があります。ほとんどの翻訳行為のバックエンドツールとしてGNU gettext(1)コマンドツールチェインが使われています。

"Tasks" → "Localization"の下のaptitude(8)リストは地域化されたメッセージをアプリケーションに追加したり翻訳された文書を提供する有用なバイナリーパッケージの徹底的なリストを提供します。

例えば、manpages-<LANG>パッケージをインストールするとマンページで地域化したメッセージに使えるようになります。<programname>に関するイタリア語のマンページを"/usr/share/man/it/"から読むには、次を実行します。

LANG=it_IT.UTF-8 man <programname>

8.3.8. ロケールの効果

sort(1)を使う際のソートオーダー(並べ替え順序)はロケールの言語選択に影響されます。スペイン語と英語のロケールでは異なる並べ替えが違います。

ls(1)の日付フォーマットはロケールに影響されます。"LANG=C ls -l"と"LANG=en_US.UTF-8"の日付フォーマットは違います(「時間と日付のカスタム化表示」参照)。

数字の区切り方はロケール毎に異なります。例えば、英語のロケールでは一千一百一点一は"1,000.1"と表示されますが、ドイツ語のロケールでは"1.000,1"と表示されます。スプレッドシートプログラムでこの違いに出会うかもしれません。

第9章 システムに関するティップ

主にコンソールからシステムを設定や管理する基本的なティップを次に記します。

9.1. screenプログラム

screen(1)は、ネットワーク接続中断をサポートするので信頼性が低く断続的な接続経由でリモートサイトをアクセスする人にとっては非常に有用なツールです。

表9.1 ネットワーク切断の中断をサポートするプログラムのリスト

パッケージ ポプコン サイズ 説明
screen * V:11, I:33 952 VT100/ANSIターミナルエミュレーションを使ってのターミナルマルチプレクサ

9.1.1. screen(1)の使い方のシナリオ

screen(1)は複数のプロセスを1つのターミナルウィンドウでうまく動作させるのみならず、接続が中断してもリモートシェルプロセスを生き延びさせる事もできます。screen(1)の使われ方の典型的シナリオは次です。

  1. リモート機器にログインします。
  2. 単一のコンソール上でscreenを起動します。
  3. ^A c ("Control-A"に続いて"c")によって作られたscreenのウィンドウ中で複数のプログラムを実行します。
  4. ^A n ("Control-A"に続いて"n")によって、複数のscreenのウィンドウ間を切り替えます。
  5. 突然ターミナルを離れる必要ができたけれども、接続を継続してあなたが実行中の作業を失いたくありません。
  6. 次のようないかなる方法ででも、screenのセッションをデタッチできます。

    • 暴力的にネットワーク接続を引き抜く
    • ^A d ("Control-A"に続いて"d")とタイプしてリモート接続から手動でログアウト
    • ^A DD ("Control-A"に続いて"DD")とタイプしてscreenをデタッチしてログアウト
  7. 同じリモート機器に(たとえ異なるターミナルからでも)再びログインします。
  8. screenを"screen -r"として起動します。
  9. screenは全アクティブなプログラムが実行されている過去の全screenウィンドウを魔法のようにリアタッチします。

ティップ

screenを使うと、切断してもプロセスをアクティブにしておけその後で再接続した時にリアタッチできるので、ダイヤルアップやパケット接続のような計量されたネットワーク接続での接続料金の節約ができます。

9.1.2. 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)を参照下さい。

9.2. データーの記録と表現

9.2.1. ログデーモン

多くのプログラムは"/var/log/"ディレクトリーの下にそれぞれの活動を記録します。

  • カーネルログデーモン: klogd(8)
  • システムログデーモン: syslogd(8)

「システムメッセージ」「カーネルメッセージ」を参照下さい。

9.2.2. ログアナライザー

注目すべきログアナライザー(aptitude(8)で"~Gsecurity::log-analyzer")を次に記します。

表9.3 システムログアナライザーのリスト

パッケージ ポプコン サイズ 説明
logwatch * V:2, I:3 2592 綺麗な出力のPerlで書かれたログアナライザー
fail2ban * V:3, I:4 660 複数回の認証エラーを発生させるIPを使用禁止にします
analog * V:1.2, I:16 4612 ウェッブサーバーのログアナライザー
awstats * V:1.7, I:3 5100 強力で機能の多いウェッブサーバーのログアナライザー
sarg * V:1.8, I:1.9 1448 squidの分析レポートジェネレター
pflogsumm * V:0.3, I:0.7 156 Postfixログ項目サマライザー
syslog-summary * V:0.2, I:1.0 84 syslogログファイルの内容をまとめる
lire * V:0.16, I:0.18 5056 機能豊富なログアナライザーとレポートジェネレター
fwlogwatch * V:0.11, I:0.2 420 ファイアウォールログアナライザー
squidview * V:0.11, I:0.7 200 squidのaccess.logファイルのモニターと分析
visitors * V:0.08, I:0.3 228 ウェッブサーバーの高速ログアナライザー
swatch * V:0.07, I:0.2 112 正規表現マッチ、ハイライト、フック機能付きログファイルビューワー
crm114 * V:0.07, I:0.2 1300 制御可能な正規表現切断機とスパムフィルター(CRM114)
icmpinfo * V:0.05, I:0.3 84 ICMPメッセージの解釈

注記

CRM114TRE正規表現ライブラリーを使うファジーなフィルターを書く言語インフラを提供します。そのよくある応用はスパムメールのフィルターですが、ログアナライザーとしても使えます。

9.2.3. シェルの活動を綺麗に記録

単に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"とするとバッファーをファイルに書き出せます。

9.2.4. テキストデーターのカスタム化表示

more(1)やless(1)等のページャーツール(「ページャー」参照)や、ハイライトやフォーマット用のカスタムツール(「プレーンテキストデーターをハイライトとフォーマット」参照)はテキストデーターを綺麗に表示できますが、汎用エディター(「テキストエディター」参照)が最も汎用性がありカスタム化が可能です。

ティップ

vim(1)やそのページャーモードのエリアスview(1)では、":set hls"とするとハイライトサーチが可能になります。

9.2.5. 時間と日付のカスタム化表示

"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に準拠しています。

9.2.6. 着色化されたシェル出力

殆どの現代的なターミナルへのシェル出力は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}"

9.2.7. 着色化されたコマンド

着色化されたコマンドは対話環境で出力を検査するのに便利です。私は、私の"~/.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"として起動することで無効にできます。

9.2.8. Xアプリケーションの画像イメージの記録

xtermの表示を含めた、Xアプリケーションの画像イメージを記録するにはいくつか方法があります。

表9.5 画像の操作ツールのリスト

パッケージ ポプコン サイズ コマンド
xbase-clients * V:7, I:52 140 xwd(1)
gimp * V:12, I:47 13472 GUIメニュー
imagemagick * V:14, I:34 316 import(1)
scrot * V:0.3, I:1.4 80 scrot(1)

9.2.9. 設定ファイルの変更記録

DVCSシステムを使って設定ファイルの変更を記録する専用ツールがあります。

表9.6 VCS中に設定の履歴を記録するパッケージのリスト

パッケージ ポプコン サイズ 説明
etckeeper * V:0.6, I:1.0 372 Git (デフォールト)かMercurialBazaarを使って設定ファイルとそのメタデーターを保存(新規)
changetrack * V:0.07, I:0.10 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"と実行すると、新規インストールされたパッケージや削除されたパッケージやパッケージのバージョンの変化が一目瞭然です。

9.3. データー保存のティップ

Linuxのlive CDsとかレスキューモードでdebian-installer CDsであなたのシステムをブートすることでブートデバイス上のデーターストレージの再設定が簡単にできるようになります。「バイナリーデーター」も参照下さい。

9.3.1. ディスクパーティション設定

ディスクのパーティションの設定に関して、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:90, I:99 2292 非サポート fdisk(8)とcfdisk(8)を含む雑多なシステムユーティリティー
parted * V:1.1, I:8 164 サポート GNU Parted ディスクパーティションとリサイズのプログラム
gparted * V:3, I:37 3404 サポート libpartedベースのGNOMEパーティションエディター
qtparted * V:0.18, I:1.3 764 サポート libpartedベースのKDEパーティションエディター
gptsync * V:0.01, I:0.15 72 サポート 古典的MBRパーティションテーブルをGPTパーティションテーブルと同期
kpartx * V:1.2, I:2 132 サポート パーティション用のデバイスマッピングを作成するプログラム

注意

parted(8)はファイルシステムを生成やリサイズも出きるということですが、そのようなことはmkfs(8) (mkfs.msdos(8)とmkfs.ext2(8)とmkfs.ext3(8)と…)とかresize2fs(8)等の最もよくメンテされている専用ツールを使って行う方がより安全です。

注記

GPTMBR間で切り替えるには、ディスクの最初数ブロックの内容を直接消去し(「ファイル内容の消去」参照)、"parted /dev/sdx mklabel gpt"か"parted /dev/sdx mklabel msdos"を使ってそれを設定する必要があります。ここで"msdos"がMBRのために使われていることを覚えておきます。

9.3.2. UUIDを使ってパーティションをアクセス

あなたのパーティションの再設定やリムーバブルストレージメディアの起動順序はパーティションの名前を変えることになるかもしれませんが、それに首尾一貫してアクセスできます。もしディスクが複数ありあなたのBIOSがそれに首尾一貫したデバイス名をつけない時にも、これは役に立ちます。

  • "-U"オプションを使ってmount(8)を実行すると"/dev/sda3"のようなファイル名を使うのではなくUUIDを使ってブロックデバイスをマウントできます。
  • "/etc/fstab"(fstab(5)参照)はUUIDを使えます。
  • ブートローダー(「2段目: ブートローダー」)もまたUUID を使えます。

ティップ

ブロックスペシャルデバイスのUUIDvol_id(8)を使って見極められます。

ティップ

リムーバブルストレージメディア等のデバイス名は、必要ならudev rulesを使って静的になります。「udevシステム」を参照下さい。

9.3.3. ファイルシステム設定

ext3ファイルシステム用にe2fsprogsパッケージは次を提供します。

  • 新規のext3ファイルシステムを作成するためのmkfs.ext3(8)
  • 既存のext3ファイルシステムをチェックと修理するためのfsck.ext3(8)
  • ext3ファイルシステムのスーパーブロックを設定するためのtune2fs(8)

mkfs(8)とfsck(8)コマンドは各種ファイルシステム依存プログラム(mkfs.fstypefsck.fstype)のフロントエンドとしてe2fsprogsにより提供されています。ext3ファイルシステム用は、mkfs.ext3(8)とfsck.ext3(8)で、それぞれmke2fs(8)とe2fsck(8)にハードリンクされています。

類似コマンドがLinuxによってサポートされる各ファイルシステム用にあります。

表9.8 ファイルシステム管理用パッケージのリスト

パッケージ ポプコン サイズ 説明
e2fsprogs * V:59, I:99 2104 ext2/ext3/ext4ファイルシステムのためのユーティリティー
reiserfsprogs * V:3, I:10 1200 Reiserfsファイルシステムのためのユーティリティー
dosfstools * V:3, I:27 224 FAT ファイルシステムのためのユーティリティー(Microsoft: MS-DOS, Windows)
xfsprogs * V:2, I:11 3036 XFSファイルシステムのためのユーティリティー(SGI: IRIX)
ntfsprogs * V:2, I:14 676 NTFSファイルシステムのためのユーティリティー(Microsoft: Windows NT, …)
jfsutils * V:0.6, I:3 1112 JFSファイルシステムのためのユーティリティー(IBM: AIX, OS/2)
reiser4progs * V:0.08, I:0.7 1268 Reiser4ファイルシステムのためのユーティリティー
hfsprogs * V:0.07, I:0.7 284 HFSHFS Plusファイルシステムのためのユーティリティー(Apple: Mac OS)
btrfs-tools * V:0.04, I:0.2 1024 btrfsファイルシステムのためのユーティリティー
zerofree * V:0.07, I:0.6 56 ext2/3ファイルシステムのフリーブロックをゼロにセットするプログラム

ティップ

Ext3ファイルシステムはLinuxシステムのデフォールトので、特段使わない理由が無い限りそれを使うことを強くお薦めします。Linuxカーネル2.6.30(Debian squeeze)以降、ext4ファイルシステムが使えるようになり、Linuxシステムのデフォールトのファイルシステムとなると期待されています。btrfsファイルシステムは、Linuxシステムのext4ファイルシステムの次のデフォールトのファイルシステムとなると期待されています。

警告

まだ新しいのでext4を使うと色々制約があるかもしれません。例えば、ext4パーティションのサイズ変更をするにはLinuxカーネルが2.6.30以降でなければいけません。

ティップ

一部のツールはファイルシステムへのアクセスをLinuxカーネルのサポート無しでも可能にします(「ディスクをマウントせずに操作」参照)。

9.3.4. ファイルシステムの生成と整合性チェック

mkfs(8)コマンドはLinuxシステム上でファイルシステムを生成します。fsck(8)コマンドはLinuxシステム上でファイルシステムの整合性チェックと修理機能を提供します。

注意

一般的にfsckマウントされているファイルシステムに行うことは安全ではありません。

ティップ

ブートスクリプトから実行されるfsck(8)コマンドの結果を"/var/log/fsck/"中のファイルからチェックします。

ティップ

"shutdown -F -r now"を使うことでリブートの際に強制的にルートファイルシステムを含む全てのファイルシステムに関してfsck(8)コマンドを安全に実行します。詳細はshutdown(8)マンページを参照下さい。

9.3.5. マウントオプションによるファイルシステムの最適化

ファイルシステムのパーフォーマンスや性格はそれに使われるマウントオプションによって最適化できます(fstab(5)とmount(8)参照)。

  • "defaults"オプションはデフォールトのオプションが次の意味です: "rw,suid,dev,exec,auto,nouser,async"。(一般的)
  • "noatime"もしくは"relatime"オプションは読出しアクセスを高速化するのに非常に効果的です。(一般的)
  • "user"オプションは通常ユーザーがファイルシステムをマウント出来るようにします。このオプションは"noexec,nosuid,nodev" オプションの組み合わせの意味です。(一般的、CDやfloppyに使用)
  • "noexec,nodev,nosuid"generalオプションの組み合わせはセキュリティーの強化に使われます。(一般的)
  • "noauto"オプションは明示的操作のみにマウントを制限します。(一般的)
  • ext3fsへの"data=journal"オプションは、書込み速度を犠牲ににしますが、停電時のデーター整合性を強化します。

ティップ

ルートファイルシステムに非デフォールトのジャーナルモードを設定するには、例えば"rootflags=data=journal"等の、カーネルブートパラメーター(「2段目: ブートローダー」参照)を与える必要があります。lennyの場合、デフォールトのジャーナルモードは"rootflags=data=ordered"です。squeezeの場合、デフォールトのジャーナルモードは"rootflags=data=writeback"です。

9.3.6. スーパーブロックによるファイルシステムの最適化

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以降となるまではしないでおくべきです。

ティップ

tune2fs(8)は、その名前にもかかわらず、ext2ファイルシステムに機能するだけでなくext3とかext4ファイルシステムに関しても機能します。

9.3.7. ハードディスクの最適化

警告

ハードディスクの設定はデーターの整合性にとって非常に危険な事なので、その設定をさわる前にお使いのハードウエアーをチェックし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"としてそれを減速して使えば読めるかもしれません。

9.3.8. SMARTを用いたハードディスクの破壊の予測

smartd(8)デーモンを使うとSMARTに文句を言うハードディスクの監視と記録ができます。

  1. BIOSSMART機能を有効にします。
  2. smartmontoolsパッケージをインストールします。
  3. df(1)を使ってリストすることであなたのハードディスクを識別します。

    • 監視対象のハードディスクを"/dev/hda"と仮定します。
  4. SMART機能が実際に有効となっているかを"smartctl -a /dev/hda"のアウトプットを使ってチェックします。

    • もし有効でない場合には、"smartctl -s on -a /dev/hda"として有効にします。
  5. 次のようにしてsmartd(8)デーモンを実行します。

    • "/etc/default/smartmontools"ファイル中の"start_smartd=yes"をアンコメントします。
    • "sudo /etc/init.d/smartmontools restart"としてsmartd(8)デーモンを再実行します。

ティップ

smartd(8)デーモンは、警告の通知の仕方を含めて/etc/smartd.confファイルを用いてカスタム化できます。

9.3.9. LVMを使う使用可能なストレージ空間の拡張

インストール時に論理ボリュームマネージャー(LVM)(Linux機能)上に作られたパーティションは、大掛かりなシステムの再設定無しに複数のストレージデバイスにまたがるLVM上のエクステントを継ぎ足したりその上のエクステントを切り捨てることで簡単にサイズ変更が出きます。

注意

現行のLVMシステムを採用すると、ハードディスクの書込みキャッシュ機能を無効にしてパーフォーマンスを犠牲にしないと、ext3fs等のジャーナルファイルシステムによって提供されるファイルシステムの破壊に対する保証を劣化させるかもしれません。

9.3.10. 他パーティションをマウントする使用可能なストレージ空間の拡張

空のパーティションがあれば(例えば"/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

ティップ

上記の代わりに、空のディスクイメージファイル(「空のディスクイメージ作成」参照)をループデバイスとしてマウントする(「ディスクイメージファイルをマウント」参照)事もできます。実際のディスク使用は実際にデーターを溜め込むとともに成長します。

9.3.11. シムリンクを使う使用可能なストレージ空間の拡張

使える空間がある他のパーティション中に空のディレクトリーがあれば(例えば"/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

注意

一部のプログラムは"ディレクトリーへのシムリンク"ではうまく機能しないかもしれません。

9.3.12. aufsを使う使用可能なストレージ空間の拡張

他のパーティション中に使える空間があれば(例えば"/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を長期間のデーターのストレージに使うのは、まだ開発中でそのデザイン変更が問題を引き起こすかもしれないので感心しません。

ティップ

aufsを使うには、そのユーティリティーパッケージaufs-toolsaufs-modules-2.6-amd64等のaufsのためのカーネルモジュールパッケージをインストールする必要があります。

ティップ

aufsは多くの現代的ライブCDプロジェクトによって書込み可能なルートファイルシステムを提供するのに使われています。

9.4. データー暗号化ティップ

あなたのPCへの物理的アクセスがあると、誰でも簡単にroot特権を獲得できあなたのPCの全てのファイルにアクセスできます(「rootパスワードのセキュリティー確保」参照)。これが意味するところは、あなたのPCが盗まれた場合にログインのパスワードではあなたのプライベートでセンシティブなデーターを守れないと言うことです。それを達成するにはデーターの暗号化技術を適用しなければいけません。GNUプライバシーガード (「データーセキュリティーのインフラ」参照)はファイルを暗号化できますが、少々手間がかかります。

dm-crypteCryptfsは最小限のユーザー努力でできる自動的なデーターの暗号化をLinuxのカーネルモジュールその物を使って提供します。

表9.9 データー暗号化ユーティリティーのリスト

パッケージ ポプコン サイズ 説明
cryptsetup * V:3, I:5 952 暗号化されたブロックデバイス(dm-crypt / LUKS)のためのユーティリティー
cryptmount * V:0.15, I:0.5 308 ノーマルユーザーによるマウント/アンマウントに焦点を当てた暗号化されたブロックデバイス(dm-crypt / LUKS)のためのユーティリティー
ecryptfs-utils * V:0.16, I:0.2 464 暗号化されたスタックドファイルシステム(eCryptfs)のためのユーティリティー

Dm-cryptdevice-mapperを使う暗号学的ファイルシステムです。Device-mapperは1つのブロックデバイスをもう1つのブロックデバイスにマップします。

eCryptfsはスタックドファイルシステムを使うもう1つのファイルシステムです。スタックドファイルシステムはマウントされたファイルシステム上の既存のディレクトリーの上に重ね合わせます。

注意

データーの暗号化にはCPU時間等の負担がかかります。その利益と負担の両天秤をします。

注記

debian-installer (lenny以降)を使うと、dm-crypt/LUKSとinitramfsを使って、全Debianシステムを暗号化したディスク上にインストールできます。

ティップ

ユーザー空間での暗号化ユーティリティーに関しては「データーセキュリティーのインフラ」を参照下さい: GNUプライバシーガード

9.4.1. dm-crypt/LUKSを使ったリムーバブルディスクの暗号化

例えば"/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等の異なったフォーマットで記録メディアをフォーマットしても良いです。

注記

もしデーターのセキュリティーが本当に偏執狂的に気になるなら、上記例で複数回の重ね書きをする必要があるかもしれません。でもこの操作は非常に時間がかかります。

9.4.2. dm-cryptを使ってswapパーティションを暗号化

オリジナルの"/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

9.4.3. eCryptfsを使って自動的にファイルを暗号化

eCryptfsecryptfs-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/"を有効にします。

ティップ

eCryptfsはセンシティブなファイルのみを選択的に暗号化するので、そのシステムへの負担はdm-cryptを全ルートとか"/home"デバイスとかに使うよりはるかに少ないです。eCryptfsは特段のディスク上のストレージの割り当て努力の必要はありませんが、全てのファイルシステムメタデーターを秘匿することはできません。

9.4.4. eCryptfsを自動的にマウント

もしあなたのログインパスワードを暗号化キーを包むのに使っている場合には、"/etc/pam.d/common-auth"中の"pam_permit.so"のすぐ前に次に記す行があるようにすることでPAM (プラグ可能な認証モジュール: Pluggable Authentication Modules)を使ってeCryptfsを自動的にマウントできます。

stableシステムのための"/etc/apt/sources.list"ファイルに次の行を追加します。

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

これは非常に便利です。

警告

PAMの設定エラーをすると、あなた自身のシステムからあなたを締め出すかもしれません。4章認証を参照下さい。

注意

もしあなたのログインパスワードを暗号化キーを包むのに使っている場合には、あなたの暗号化されたデーターのセキュリティーはあなたのユーザーログインパスワードと同程度です(「良好なパスワード」参照)。注意深く強力なパスワードを設定していないと、あなたのラップトップを誰かが盗んだ後にパスワード破りソフトを実行すれば、あなたのデーターは危険にさらされます(「rootパスワードのセキュリティー確保」参照)。

9.5. プログラム活動の監視と制御と起動

プログラム活動は専用ツールを用いて監視と制御できます。

表9.10 プログラム活動の監視と制御のツールのリスト

パッケージ ポプコン サイズ 説明
coreutils * V:91, I:99 11792 nice(1): スケジューリングの優先順位の変更してプログラムを実行
bsdutils * V:72, I:99 184 renice(1): 実行中プロセスのスケジューリングの優先順位を変更
procps * V:86, I:99 656 "/proc"ファイルシステムのユーティリティー: ps(1)とtop(1)とkill(1)とwatch(1)等
psmisc * V:49, I:86 548 "/proc"ファイルシステムのユーティリティー: killall(1)とfuser(1)とpstree(1)とpstree(1)
time * V:6, I:85 152 time(1): 時間に関するシステムリソース使用状況を報告するためにプログラムを実行
sysstat * V:3, I:7 1172 sar(1)、iostat(1)、mpstat(1)、…: Linux用のシステムパーフォーマンスツール
isag * V:0.05, I:0.4 152 sysstatの対話型システムアクティビティーグラフ化ソフト
lsof * V:17, I:91 444 lsof(8): "-p" を使い実行中のプロセスが開いているファイルをリスト
strace * V:6, I:51 376 strace(1): システムコールやシグナルを追跡
ltrace * V:0.3, I:2 188 ltrace(1): ライブラリーコールを追跡
xtrace * V:0.03, I:0.17 344 xtrace(1): X11のクライアントとサーバーの間の通信を追跡
powertop * V:0.8, I:12 424 powertop(1): Intelを使ったラップトップのシステムの電力情報
cron * V:91, I:99 324 cron(8)デーモンからバックグランドでスケジュール通りプロセスを実行
anacron * V:42, I:46 120 1日24時間動作でないシステム用のcron類似のコマンドスケジューラー
at * V:50, I:83 220 at(1)とbatch(1)コマンド: 特定の時間や特定のロードレベル以下でジョブを実行

ティップ

procpsパッケージはプログラム活動の監視と制御と起動の基本中の基本を提供します。このすべてを習得するべきです。

9.5.1. プロセスの時間計測

コマンドが起動したプロセスにより使われた時間を表示します。

# time some_command >/dev/null
real    0m0.035s       # 壁時計の時間(実経過時間)
user    0m0.000s       # ユーザーモードの時間
sys     0m0.020s       # カーネルモードの時間

9.5.2. スケジューリングのプライオリティー

ナイス値はプロセスのスケジューリングのプライオリティーを制御するのに使われます。

表9.11 スケジューリングのプライオリティーのためのナイス値のリスト

ナイス値 スケジューリングのプライオリティー
19 最低優先順位プロセス(ナイス)
0 ユーザーにとっての非常に高優先順位プロセス
-20 rootにとっての非常に高優先順位プロセス(非ナイス)

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

極端なナイス値はシステムに害を与えるかもしれません。本コマンドは注意深く使用下さい、

9.5.3. psコマンド

Debian上のps(1)コマンドはBSDとSystemV機能の両方をサポートしプロセスの活動を静的に特定するのに有用です。

表9.12 psコマンドのスタイルのリスト

スタイル 典型的コマンド 特徴
BSD ps aux %CPU %MEMを表示
System V ps -efH PPIDを表示

ゾンビ(動作していない)子プロセスに関して、"PPID"フィールドで識別される親プロセスIDを使ってプロセスを停止できます。

pstree(1)コマンドはプロセスの木(ツリー)を表示します。

9.5.4. topコマンド

Debian上のtop(1)は機能が豊で、どのプロセスがおかしな動きをしているかを動的に識別することに役立ちます。

表9.13 topのコマンドのリスト

コマンドキー レスポンスの説明
h? ヘルプの表示
f ディスプレーフィールドのセットとリセット
o 表示フィールドの順番変更
F ソートキーフィールドの設定
k プロセスを停止
r プロセスのナイス値を変更
q topコマンドを終了

9.5.5. プロセスによって開かれているファイルのリスト

プロセスID (PID)、例えば1を使うプロセスによって開かれている全ファイルは次のようにしてリストできます。

$ sudo lsof -p 1

PID=1は通常initプログラムです。

9.5.6. プログラム活動の追跡

プラグラムの活動状況は、システムコールとシグナルはstrace(1)で、ライブラリーコールはltrace(1)で、X11のクライアントとサーバーの通信はxtrace(1)でプラグラムの活動状況を追跡できます。

lsコマンドのシステムコールを次のようにして追跡できます。

$ sudo strace ls

9.5.7. ファイルやソケットを使っているプロセスの識別

ファイルかソケットを使っているプロセスは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)コマンドによって書込みのために開かれている事が分かります。

ファイルかソケットを使っているプロセスはfuser(1)によって次のようにして識別できます。

$ sudo fuser -v smtp/tcp
                     USER        PID ACCESS COMMAND
smtp/tcp:            Debian-exim   3379 F.... exim4

SMTPポート(25)へのTCP接続を処理するためにあなたのシステムではexim4(8)が実行されている事がこれで分かります。

9.5.8. 一定間隔でコマンドを反復実行

watch(1)はプログラムを一定間隔で反復実行しながらフルスクリーンでその出力を表示します。

$ watch w

こうすると2秒毎更新でシステムに誰がログオンしているかを表示します。

9.5.9. ファイルに関してループしながらコマンドを反復実行

例えばグロブパターン"*.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)に関する上級の使用法の詳細は「ファイル選択の慣用句」を参照下さい。

9.5.10. GUIからプログラムをスタート

グラフィカルユーザーインターフェース(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

ディレクトリーを次のように作成します。

  1. デスクトップを右クリックして"Create Launcher …"を選択
  2. "Type"を"Application"と設定します。
  3. "Name"を"mc"と設定します。
  4. "Command"を"mc-term %f"と設定します。
  5. "OK"をクリックします。

open-withとの関連付けを作成します。

  1. フォルダを右クリックして"Open with Other Application …"を選択します。
  2. "Use a custom command"ダイアログをクリックして開き、"mc-term %f"を入力します。
  3. "Open"をクリックします。

ティップ

ローンチャとは"~/Desktop"上の".desktop"と言う拡張子のファイルです。

9.5.11. スタートするプログラムのカスタム化

一部のプログラムは他のプログラムを自動的にスタートします。このプロセスをカスタム化する上でのチェックポイントを次に記します。

  • アプリケーション設定メニュー:

    • GNOMEデスクトップ: "System" → "Preferences" → "Preferred Application"
    • KDEデスクトップ: "K" → "Control Center" → "KDE Components" → "Component Chooser"
    • Iceweasleブラウザー: "Edit" → "Preferences" → "Applications"
    • 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)システム(「デフォールトのテキストエディターの設定」参照)
  • MIMEタイプとプログラムと関係づける、"~/.mailcap"や"/etc/mailcap"ファイルの内容(mailcap(5)参照)
  • ファイル拡張子とMIMEタイプとプログラムと関係づける、"~/.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

9.5.12. プロセスの停止

kill(1)を使ってプロセスIDを使ってプロセスを停止(プロセスへシグナルを送信)します。

killall(1)やpkill(1)プロセスコマンド名や他の属性を使ってプロセスを停止(プロセスへシグナルを送信)します。

表9.14 killコマンドが良く使うシグナルのリスト

シグナル値 シグナル名 機能
1 HUP デーモンの再スタートします
15 TERM 普通に停止します
9 KILL 徹底的に停止します

9.5.13. タスク1回実行のスケジュール

at(1)コマンドを次のように実行して1回だけのジョブをスケジュールします。

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

9.5.14. タスク定期実行のスケジュール

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"でカスタム化できます。

9.5.15. Alt-SysRqキー

システム異常に対する保険はカーネルコンパイルオプションの"マジック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(アンマウント)します。

9.6. システム管理ティップ

9.6.1. だれがシステム上にいる?

だれがシステム上にいるかは、次のようにしてチェックできます。

  • who(1)は、誰がログオンしているかを表示します。
  • w(1)は、誰がログオンしていて何をしているかを表示します。
  • lastb(1)は、最後にログイン失敗したユーザーのリストを表示します。
  • lastb(1)は、最後にログイン失敗したユーザーのリストを表示します。

ティップ

"/var/run/utmp"と"/var/log/wtmp"と"/var/run/utmp"はこのようなユーザー情報を保持します。login(1)とutmp(5)を参照下さい。

9.6.2. 全員への警告

wall(1)を使うと、次のようにしてシステムにログオンしている全員にメッセージを送れます。

$ echo "We are shutting down in 1 hour" | wall

9.6.3. ハードウエアーの識別

PCI的デバイス(AGPPCI-ExpressCardBusExpressCard,等)では、 (きっと"-nn"オプションとともに使う)lspci(8)がハードウエアー識別の良いスタート点です。

この代わりに、"/proc/bus/pci/devices"の内容を読むか、"/sys/bus/pci"の下のディレクトリーツリーを閲覧することでハードウエアーの識別ができます(「procfsとsysfs」参照)。

表9.16 ハードウエアー識別ツールのリスト

パッケージ ポプコン サイズ 説明
pciutils * V:15, I:92 804 Linux PCIユーティリティー: lspci(8)
usbutils * V:40, I:98 560 Linux USBユーティリティー: lsusb(8)
pcmciautils * V:0.9, I:14 100 Linux 2.6のためのPCMCIAユーティリティー: pccardctl(8)
scsitools * V:0.19, I:1.3 484 SCSIハードウエアー管理のためのツール集: lsscsi(8)
pnputils * V:0.02, I:0.19 108 Plug and Play BIOSのためにユーティリティー: lspnp(8)
procinfo * V:0.4, I:3 164 下級管理業務のためのディレクトリー: "/usr/local"、"/home"
lshw * V:1.1, I:6 604 ハードウエアー設定に関する情報: lshw(1)
discover * V:3, I:12 928 ハードウエアー識別システム: discover(8)

9.6.4. ハードウエアー設定

GNOMEやKDEのような現代的なGUIのデスクトップ環境ではほとんどのハードウエアー設定が付随するGUI設定ツールを通じて管理できますが、それらの設定の基本的手法を知っておくのは良い事です。

表9.17 ハードウエアー設定ツールのリスト

パッケージ ポプコン サイズ 説明
hal * V:42, I:55 1680 ハードウエアーアブストラクションレイヤー: lshal(1)
console-tools * V:54, I:94 956 Linuxコンソールのフォントとキーテーブルユーティリティー
x11-xserver-utils * V:33, I:50 544 Xサーバーユーティリティー: xset(1)、xmodmap(1)
acpid * V:47, I:90 204 Advanced Configuration and Power Interface (ACPI)によって起こるイベントの管理のためのデーモン
acpi * V:4, I:33 92 ACPIデバイス上の情報を表示するユーティリティー
apmd * V:1.4, I:12 252 Advanced Power Management (APM)によって起こるイベントの管理のためのデーモン
noflushd * V:0.07, I:0.12 244 ハードディスクをスピンダウンできるようにするデーモン
sleepd * V:0.06, I:0.09 92 非使用状況のときにラップトップをスリープさせるデーモン
hdparm * V:13, I:36 284 ハードディスクアクセスの最適化(「ハードディスクの最適化」参照)
smartmontools * V:6, I:21 1028 S.M.A.R.T.を使ってストレージシステムを制御監視
setserial * V:1.9, I:4 180 シリアルポートの管理ツール集
memtest86+ * V:0.5, I:4 500 メモリーハードウエアー管理のためのツール集
scsitools * V:0.19, I:1.3 484 SCSIハードウエアー管理のためのツール集
tpconfig * V:0.4, I:0.5 208 タッチパッドデバイス設定ユーティリティー
setcd * V:0.07, I:0.4 28 コンパクトデバイスアクセス最適化
big-cursor * I:0.2 68 Xのための大きなマウスカーソール

上記で、ACPIAPMより新しい電力管理システムの枠組みです。

ティップ

最近のシステム上のCPUフリーケンシシースケーリングはacpi_cpufreqのようなカーネルモジュールで管理されています。

9.6.5. システムとハードウエアーの時間

以下はシステムとハードウエアーの時間をMM/DD hh:mm, CCYY (月/日 時:分, 年)に設定します。

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

Debianシステムでは時間は通常地域の時間が表示されますが、ハードウエアーとシステムの時間は通常UT(GMT)を使います。

ハードウエアー(BIOS)時間がUTに設定されている場合は、"/etc/default/rcS"の中の設定を"UTC=yes"と変更します。

ネットワーク経由でシステムの時間を更新したい場合には、ntpntpdatechrony等のパッケージを使ってNTPサービスを利用することを考えます。

次を参照下さい。

ティップ

ntpパッケージ中のntptrace(8)を使うと、NTPサービスの継がりを第一義的根源まで溯ることができます。

9.6.6. ターミナルの設定

文字コンソールと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"の最低機能の共通項です。

9.6.7. 音のインフラ

現在の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 サウンドパッケージのリスト

パッケージ ポプコン サイズ 説明
linux-sound-base * V:40, I:51 136 ALSAとOSSサウンドシステムの基本パッケージ
alsa-base * V:3, I:51 480 ALSAドライバー設定ファイル
alsa-utils * V:35, I:51 1876 ALSAを設定し使用するユーティリティー
oss-compat * V:28, I:35 60 ALSAの下で"/dev/dsp not found"エラーを防ぐOSS互換性
esound-common * V:14, I:60 193 Enlightened Sound Daemon (ESD)共通(EnlightenmentとGNOME)
esound * V:1.2, I:11 48 Enlightened Sound Daemon (ESD)サーバー(EnlightenmentとGNOME)
esound-clients * V:9, I:23 140 Enlightened Sound Daemon (ESD)クライアント(EnlightenmentとGNOME)
libesd0 * V:13, I:57 60 Enlightened Sound Daemon (ESD)ライブラリー(EnlightenmentとGNOME)
arts * I:10 40 aRtsサーバー(KDE)
libarts1c2a * V:18, I:32 6064 aRtsライブラリー(KDE)
libartsc0 * V:15, I:38 76 aRtsライブラリー(KDE)
jackd * V:1.8, I:4 532 JACK Audio Connection Kit. (JACK) サーバー(低遅延)
libjack0 * V:12, I:41 504 JACK Audio Connection Kit. (JACK) ライブラリー(低遅延)
nas * V:0.17, I:0.2 328 Network Audio System (NAS)サーバー
libaudio2 * V:27, I:50 204 Network Audio System (NAS)ライブラリー
pulseaudio * V:3, I:5 4500 PulseAudioサーバー、ESD代替
libpulse0 * V:8, I:35 840 PulseAudioクライアント、ESD代替
libgstreamer0.10-0 * V:29, I:54 3168 GStreamer: GNOMEサウンドエンジン
libxine1 * V:6, I:34 36 xine: KDE旧サウンドエンジン
libphonon4 * V:1.2, I:13 548 Phonon: KDE新サウンドエンジン

各ポピュラーなデスクトップ環境では普通共通のサウンドエンジンがあります。アプリケーションに使われるそれぞれのサウンドエンジンはそれと異なるサウンドサーバーにつなぐようにもできます。

9.6.8. スクリーンセーバーの無効化

スクリーンセーバーを無効にするには、次のコマンドを使います。

表9.19 スクリーンセーバーを無効にするコマンドのリスト

環境 コマンド
Linuxコンソール setterm -powersave off
X Window(スクリーンセーバー消去) xset s off
X Window(dpms無効) xset -dpms
X Window(スクリーンセーバーのGUI設定) xscreensaver-command -prefs

9.6.9. ブザー音の無効化

PCスピーカーのコネクタを外すとブザー音は確実に無効にできます。pcspkrカーネルモジュールを削除すると同じ事ができます。

次のようにするとbash(1)が使うreadline(3)プログラムが"\a" (ASCII=7)に出会った際にブザー音を発生するのを防げます。

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

9.6.10. 使用メモリー

"/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)

9.6.11. システムのセキュリティーと整合性のチェック

ダメなシステム管理をするとあなたのシステムを外界からの攻撃にさらすことになるかもしれません。

システムのセキュリティーと整合性のチェックには、次の事から始めるべきです。

表9.21 システムセキュリティーや整合性確認のためのツールリスト

パッケージ ポプコン サイズ 説明
logcheck * V:3, I:4 260 システムログの異常を管理者にメールするデーモン
debsums * V:2, I:3 268 MD5チェックサムを使ってインストールされたパッケージファイルを検証するユーティリティー
chkrootkit * V:2, I:6 868 ルートキット検出ソフト
clamav * V:2, I:11 508 Unix用アンチウィルスユーティリティー - コマンドラインインターフェース
tiger * V:0.8, I:1.1 3088 システムセキュリティーの脆弱性を報告
tripwire * V:0.6, I:0.7 4608 ファイルやディレクトリーの整合性チェックソフト
john * V:0.6, I:2 532 アクティブなパスワードクラッキングツール
aide * V:0.3, I:0.5 1112 先進的進入検出環境 - 静的ライブラリー
bastille * V:0.17, I:0.5 1960 セキュリティー強化ツール
integrit * V:0.09, I:0.19 440 ファイル整合性確認プログラム
crack * V:0.04, I:0.3 204 パスワード推定プログラム

次のシンプルなスクリプトを使うと、典型的な間違いの全員書込み可のファイルパーミッションをチェックできます。

# find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)

注意

debsumsパッケージはローカルに保存されたMD5チェックサムを使うので、悪意ある攻撃に対抗するセキュリティー監査ツールとしては完全には信頼できません。

9.7. カーネル

Debianはモジュール化されたLinuxカーネルをサポートされるアーキテクチャに対してパッケージとしてディストリブートしています。

9.7.1. Linuxカーネル2.6

Linuxカーネル2.4と比較して特記すべきLinuxカーネル2.6の機能がいくつかあります。

  • デバイスはudevシステムで生成されます(「udevシステム」参照)。
  • IDE CD/DVDデバイスへの読出し/書込みアクセスはide-scsiモジュールを使用しません。
  • ネットワークのパケットフィルター機能はiptableカーネルモジュールを使います。

9.7.2. カーネル変数

多くのLinuxの機能はカーネル変数を使い次のように設定されます。

linux-doc-2.6.*パッケージで供給されるLinuxカーネル文書("/usr/share/doc/linux-doc-2.6.*/Documentation/filesystems/*")中の"kernel-parameters.txt(.gz)"や関連する他の文書を参照下さい。

9.7.3. カーネルヘッダー

ほとんどの普通のプログラムはカーネルヘッダーを必要としませんし、コンパイルするのにそれらを直接用いるとコンパイルがうまくいかないかもしれません。普通のプログラムはDebianシステム上では(glibcソースパッケージから生成される)libc6-devパッケージが提供する"/usr/include/linux"や"/usr/include/asm"中のヘッダを使ってコンパイルするべきです。

注記

外部ソースからのカーネルモジュールやオートマウンターデーモン(amd)のようなカーネル固有の一部プログラムをコンパイルする場合、例えば"-I/usr/src/linux-particular-version/include/"等の対応するカーネルヘッダーへのパスをコマンドラインで指定しなければいけません。module-assistant(8)(またはその短縮形m-a)はユーザーが1つ以上のカスタムカーネルに関するモジュールパッケージを簡単にビルドとインストールすることを援助します。

9.7.4. カーネルと関連モジュールのコンパイル

Debianにはカーネルと関連モジュールをコンパイルする独自の方法があります。

表9.22 Debianシステム上でカーネルの再コンパイルためにインストールする重要パッケージのリスト

パッケージ ポプコン サイズ 説明
build-essential * I:47 48 Debianパッケージをビルドする上で不可欠なパッケージ: makegcc、…
bzip2 * V:55, I:79 132 bz2ファイルのための圧縮と解凍ユーティリティー
libncurses5-dev * V:4, I:27 6836 ncursesのためのデベロッパ用ライブラリーと文書
git-core * V:7, I:12 15056 git: Linuxカーネルによって使われている分散型リビジョンコントロールシステム
fakeroot * V:5, I:30 376 パッケージを非rootとしてビルドするためのfakeroot環境を提供
initramfs-tools * V:41, I:97 420 initramfsをビルドするツール(Debian固有)
kernel-package * V:2, I:17 2308 Linuxカーネルパッケージをビルドするツール(Debian固有)
module-assistant * V:3, I:21 540 モジュールパッケージをビルドするツール(Debian固有)
dkms * V:1.6, I:2 416 動的カーネルモジュールサポート(DKMS) (汎用)
devscripts * V:2, I:14 1712 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でのアウトオブツリーのモジュールの管理方法として承認されます。これはあなたがカーネルをアップグレードする際にモジュールを簡単に再構築できるようにします。

9.7.5. カーネルソースのコンパイル: Debian標準手法

カスタムカーネルパッケージを作るためにカーネルソースをコンパイルする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"が実行されるので、これらを別途実行する必要はありません。

9.7.6. モジュールソースのコンパイル: Debian標準手法

カスタムカーネルパッケージのためのカスタムモジュールパッケージを生成しインストールする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

9.7.7. カーネルソースのコンパイル:古典的方法

加工されていないソースからの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"としてリブートし、新しいカーネルへ移行します。

9.7.8. Non-freeハードウエアードライバー

ほとんどのハードウエアードライバーはフリーソフトウエアーとして入手できDebianシステムの一部となっていますが、あなたのシステム上のWinmodemのような一部のnon-freeの外部ドライバーをロードする必要があるかもしれません。

該当リソースをチェックします。

9.8. 仮想化システム

仮想化されたシステムを利用すると単一ハード上で同時に複数のシステムのインスタンスを実行することが加能となります。

ティップ

http://wiki.debian.org/SystemVirtualizationを参照下さい。

9.8.1. 仮想化ツール

Debianには、単純なchrootではない仮想化エミュレーション関連のパッケージがあります。一部のパッケージはあなたがそのような環境をセットアップする事を援助します。

表9.23 仮想化ツールのリスト

パッケージ ポプコン サイズ 説明
schroot * V:1.0, I:1.6 1860 Debianバイナリーパッケージをchroot中で実行する専用ツール
sbuild * V:0.08, I:0.3 412 DebianソースからDebianバイナリーパッケージをビルドするツール
pbuilder * V:0.4, I:2 1132 Debianパッケージの個人的なパッケージビルドソフト
debootstrap * V:1.6, I:12 264 基本的なDebianシステムのブートストラップ(shで書かれている)
cdebootstrap * V:0.5, I:2 112 Debianシステムのブートストラップ(Cで書かれている)
rootstrap * V:0.03, I:0.2 156 完全なLinuxファイルシステムイメージをビルドするツール
virt-manager * V:0.2, I:1.1 5324 仮想マシンマネージャー: 仮想マシンを管理するデスクトップアプリケーション
libvirt-bin * V:0.9, I:1.5 1540 libvirtライブラリー用のプログラム
user-mode-linux * V:0.08, I:0.4 19796 User-mode Linux (kernel)
bochs * V:0.06, I:0.4 3236 Bochs: IA-32 PCエミュレーター
qemu * V:0.9, I:6 468 QEMU: 高速で汎用のプロセッサエミュレーター
qemu-system * V:0.4, I:1.7 36692 QEMU: フルシステムエミュレーションのバイナリ
qemu-user * V:0.2, I:1.8 16844 QEMU: ユーザーモードエミュレーションのバイナリ
qemu-utils * V:0.2, I:1.7 624 QEMU: ユーティリティー
qemu-kvm * V:0.14, I:0.2 3892 KVM: ハードウエア補助仮想化を利用するx86ハードウエア上のフル仮想化
virtualbox-ose * V:1.9, I:3 25236 VirtualBox: i386とamd64上でのx86仮想化解決策
wine * V:1.7, I:15 64 Wine: Windows APIの実装 (標準スイート)
dosbox * V:0.5, I:3 2584 DOSBox: Tandy/Herc/CGA/EGA/VGA/SVGAグラフィクス、サウンド、DOS付きのx86エミュレーター
dosemu * V:0.5, I:1.4 5936 DOSEMU: Linux用DOSエミュレーター
vzctl * V:0.5, I:1.0 1136 OpenVZ サーバー仮想化策 - コントロールツール
vzquota * V:0.5, I:1.1 252 OpenVZ サーバー仮想化策 - クオータツール
lxc * V:0.02, I:0.11 844 Linuxコンテナ - ユーザースペースツール

異なるプラットフォーム仮想化策の詳細な比較はWikipediaの記事Comparison of platform virtual machinesを参照下さい。

9.8.2. 仮想化の業務フロー

注記

ここに記載された機能の一部はsqueezeでのみ利用可能です。

注記

lenny以来のDebianのデフォルトカーネルはKVMをサポートしています

仮想化のための典型的な業務フローにはいくつかの段階があります。

9.8.3. 仮想ディスクイメージファイルをマウント。

rawディスクイメージファイルに関しては、「ディスクイメージ」を参照下さい。

他の仮想ディスクイメージに関しては、qemu-nbd(1)を使ってネットワークブロックデバイスプロトコルを用いてそれらをエクスポートしnbdカーネルモジュールを使ってそれらをマウントできます。

qemu-nbd(1)はQEMUがサポートする次のディスクフォーマットをサポートします: raw、qcow2、qcowvmdkvdibochs、cow (user-mode Linuxのcopy-on-write)、parallelsdmgcloopvpc、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"の最初のパーティションだけをエクスポートできます。

9.8.4. Chrootシステム

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環境下で実行されるシステムシェルが作られるかが次で観察できます。

  1. ローカル設定のコピー("/etc/hosts"と"/etc/hostname"と"/etc/resolv.conf")
  2. "/proc"ファイルシステムのマウント
  3. "/dev/pts"ファイルシステムのマウント
  4. 常に101でプログラム終了する"/usr/sbin/policy-rc.d"を作成
  5. "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の親システムの下で実行方法を教えてくれます。

9.8.5. 複数のデスクトップシステム

仮想化を使って複数のデスクトップシステムを安全に実行するには、Debian安定版(stable)システム上でQEMUVirtualBoxを使うことをお勧めします。これらを使うと通常ありがちなリスクに晒されずに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を参照下さい。

VirtualBoxQtのGUIツールとして提供され非常に直感的に理解できます。そのGUIとコマンドラインツールはVirtualBox User ManualVirtualBox User Manual (PDF)で説明されています。

ティップ

UbuntuFedra等のGNU/Linuxディストリビューションを仮想化の下で実行するのは設定ティップを学ぶ非常に良い方法です。他のプロプライエタリなOSもこのGNU/Linuxの仮想化の下で上手く実行できます。

第10章 データー管理

バイナリーとテキストのデーターをDebianシステム上で管理するツールとティップを記します。

警告

競合状態とならないようにするために、アクティブにアクセスされているデバイスやファイルに複数プロセスから調整なく書き込みアクセスをしてはいけません。flock(1)を使ったファイルロック機構がこの回避に使えます。

10.1. 共有とコピーとアーカイブ

データーのセキュリティーとそのコントロールされた共有はいくつかの側面があります。

  • データーアーカイブの作成
  • 遠隔ストレージアクセス
  • 複製
  • 変更履歴の追跡
  • データー共有のアシスト
  • 不正なファイルへのアクセスの防止
  • 不正なファイルの改変の検出

こういったことは次の組み合わせを使うことで実現できます。

  • アーカイブと圧縮ツール
  • コピーと同期ツール
  • ネットワークファイルシステム
  • リムーバブルストレージメディア
  • セキュアーシェル
  • 認証システム
  • バージョンコントロールシステムツール
  • ハッシュや暗号学的暗号化ツール

10.1.1. アーカイブと圧縮ツール

Debianシステム上のアーカイブと圧縮ツールのまとめを以下に記します。

表10.1 アーカイブと圧縮ツールのリスト

パッケージ ポプコン サイズ コマンド 拡張子 コメント
tar * V:62, I:99 2044 tar(1) .tar 標準アーカイバー(デファクト標準)
cpio * V:34, I:99 664 cpio(1) .cpio Unix System Vスタイルのアーカイバー、find(1)とともに使用
binutils * V:53, I:76 10160 ar(1) .ar 静的ライブラリー生成用のアーカイバー
fastjar * V:4, I:39 220 fastjar(1) .jar Java用のアーカイバー(zip類似)
pax * V:1.5, I:5 172 pax(1) .pax 新規POSIX標準アーカイバー、tarcpioの間の妥協点
afio * V:0.3, I:1.5 240 afio(1) .afio ファイル毎の圧縮などの拡張をされたcpio
gzip * V:91, I:99 292 gzip(1), zcat(1), … .gz GNU LZ77圧縮ユーティリティー(デファクト標準)
bzip2 * V:55, I:79 132 bzip2(1), bzcat(1), … .bz2 gzip(1)より高い圧縮比(gzipより遅い、類似シンタックス)のBurrows-Wheelerブロック並び替え圧縮ユーティリティー
lzma * V:10, I:76 172 lzma(1) .lzma gzip(1)より高い圧縮比(gzipより遅い、類似シンタックス)のLZMA圧縮ユーティリティー
p7zip * V:2, I:25 1052 7zr(1), p7zip(1) .7z 高い圧縮比をもつ7-Zip圧縮ユーティリティー(LZMA圧縮)
p7zip-full * V:11, I:22 3612 7z(1), 7za(1) .7z 高い圧縮比をもつ7-Zip圧縮ユーティリティー(LZMA圧縮、他)
lzop * V:0.8, I:7 144 lzop(1) .lzo gzip(1)より高い圧縮と解凍の速度(gzipより低い圧縮比、類似シンタックス)のLZO圧縮ユーティリティー
zip * V:9, I:57 628 zip(1) .zip InfoZIP: DOSアーカイブと圧縮ツール
unzip * V:20, I:70 384 unzip(1) .zip InfoZIP: DOSアーカイブ解凍と圧縮解凍ツール

警告

何が起こるかを理解せずに"$TAPE"変数を設定してはいけません。設定するとtar(1)の挙動が変わります。

注記

gzip圧縮されたtar(1)アーカイブは".tgz"とか".tar.gz"といったファイル拡張子を使います。

注記

cp(1)とscp(1)とtar(1)は特殊ファイルに関して一部制約があるかもしれません。cpio(1)とafio(1)は最も汎用性があります。

注記

cpio(1)とafio(1)はfind(1)等のコマンドとともに使うようにできていて、ファイルの選定部分のスクリプトを独立にテストできるのでバックアップスクリプトを作るのに向いています。

注記

afio(1)はアーカイブ中の各ファイルを圧縮できます。この事実ゆえafiotarとかcpioアーカイブ全体を圧縮するよりファイルの破損に対してずっと安全となり、バックアップスクリプトにとって最良のアーカイブエンジンとなっています。

注記

OpenOfficeデーターファイルの内部データー構造は".jar"ファイルです。

10.1.2. コピーと同期ツール

Debianシステム上の単純なコピーとバックアップツールのまとめを以下に記します。

表10.2 コピーと同期ツールのリスト

パッケージ ポプコン サイズ ツール 機能
coreutils * V:91, I:99 11792 GNU cp ファイルやディレクトリーのローカルコピー("-a"で再帰的実行)
openssh-client * V:52, I:99 2076 scp ファイルやディレクトリーのリモートコピー(クライアント、"-r"で再帰実行)
openssh-server * V:67, I:80 808 sshd ファイルやディレクトリーのリモートコピー(リモートサーバー)
rsync * V:17, I:44 640 - 単方向リモート同期とバックアップ
unison * V:1.0, I:3 1644 - 双方向リモート同期とバックアップ
pdumpfs * V:0.05, I:0.15 148 - ハードリンクを使った毎日のローカルバックアップ(Plan9のdumpfs類似)

rsync(8)を使ってのファイルのコピーには他の方法より豊かな機能があります。

  • 転送元のファイルと転送先の既存ファイル間の相違のみを送信する差分転送アルゴリズム
  • サイズか最終変更時間に変更があったファイルのみを探す(デフォルトで採用される)急速確認アルゴリズム
  • tar(1)類似の"--exclude"や"--exclude-from"オプション
  • 転送先に追加ディレクトリレベルを作成しなくする「転送元ディレクトリ後スラシュ(/)付加」文法

ティップ

「データーバックアップ用コピースクリプト」に記されたbkupスクリプトを"-gl"オプションとともにcron(8)の下で実行すると静的なデーターアーカイブに関してpdumpfsと非常に似た機能を実現できます。

ティップ

表10.16「バージョンコントロールシステムツールのリスト」に記されたバージョンコントロールシステム(VCS)ツールは多方向のコピーと同期のツールとして機能します。

10.1.3. アーカイブの慣用句

"./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

10.1.4. コピーの慣用句

"./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"オプションがあります。

10.1.5. ファイル選択の慣用句

アーカイブやコピーコマンド(「アーカイブの慣用句」「コピーの慣用句」参照)のためやxargs(1) (「ファイルに関してループしながらコマンドを反復実行」参照)のためにファイルを選択するのにfind(1)が使われます。これの操作はfind(1)のコマンド引数を使うことで強化できます。

find(1)の基本シンタックスは次のようにまとめられます。

  • 条件の引数は左から右へと評価されます。
  • 結果が決まった時点で評価は終了します。
  • "論理OR" (条件間に"-o"で指定)は、"論理AND" (条件間に"-a"または何もなしで指定)より低い優先順位です。
  • "論理NOT" (条件前に"!"で指定)は、"論理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

これは次のアクションをすることを意味します。

  1. "/path/to"からはじまる全ファイルを探索
  2. 探索開始したファイルシステムに探索を全体的に制約し、デフォールトの代わりにERE(「正規表現」参照)を使用
  3. 正規表現".*\.afio"か".*~"にマッチするファイルを処理停止をすることで探索から除外
  4. 正規表現".*/\.git"にマッチするディレクトリーを処理停止をすることで探索から除外
  5. 9MiB(1048576バイトの単位)より大きいファイルを処理停止をすることで探索から除外
  6. 上記の探索条件に合致し"/path/to/timestamp"より新しいファイル名をプリントします

上記例中でファイルを検索から除外するときの"-prune -o"の慣用的な使い方に注目して下さい。

注記

非DebianのUnix的システムでは、一部のオプションはfind(1)によってサポートされていないかもしれません。そのような場合には、マッチング方法を調整したり"-print0"を"-print"で置き換えることを考慮します。これに関連するコマンドも調整するの必要があるかもしれません。

10.1.6. バックアップと復元

コンピューターはいつか壊れるとか、人間によるエラーがシステムやデーターをへの損害を及ぼすことは皆知っています。バックアップと復元の操作は正しいシステム管理の必須構成要素です。考えうる全ての故障モードはいつかの日にやって来ます。

ティップ

バックアップのシステムは簡単にしておき、システムのバックアップは頻繁にします。バックアップデーターが存在することは、あなたのバックアップ方法が技術的に如何に良いかよりも重要です。

実際のバックアップと復元の方針を決める上で3つの要素があります。

  1. 何をバックアップし復元するかを知っていること

    • あなた自身が作成したデーターファイル: "~/"中のデーター
    • あなた自身が使用したアプリケーションが作成したデーターファイル: "/var/"("/var/cache/"と"/var/run/"と"/var/tmp/"は除外)中のデーター
    • システム設定ファイル: "/etc/"中のデーター
    • ローカルデーター: "/usr/local/"とか"/opt/"中のデーター
    • システムインストール情報: 要点(パーティション、…)をプレーンテキストで書いたメモ
    • 実証済みのデーターセット: 事前に実験的復元操作をして確認済み
  2. バックアップと復元の方法を知っていること

    • セキュアーなデーターのストレージ: 上書きやシステム障害の防止
    • 頻繁なバックアップ: スケジュールされたバックアップ
    • 冗長なバックアップ: データーのミラーリング
    • フルプルーフなプロセス: 簡単な単一コマンドバックアップ
  3. 関わっているリスクと費用の評価

    • データーがなくなった際の価値
    • バックアップに必要なリソース: 人的、ハードウエアー、ソフトウエアー、…
    • 故障モードとその確率

データーのセキュアーなストレージとして、好ましくはファイルシステム破壊に耐えるように異なるディスクや機器上に、少なくとも異なるディスクパーティション上に、データーはあるべきです。重要データーは上書き事故を防ぐために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)に関しては「タスク定期実行のスケジュール」を参照下さい。

10.1.7. バックアプユーティリティーのスイート

Debianシステム上の目に止まったバックアップユーティリティーのスイートから選んだリストを記します。

表10.3 バックアップスイートのユーティリティーのリスト

パッケージ ポプコン サイズ 説明
rdiff-backup * V:1.3, I:3 768 (リモート)増分バックアップ
dump * V:0.4, I:1.6 712 ext2/ext3ファイルシステム用の4.4 BSD由来のdump(8)とrestore(8)
xfsdump * V:0.3, I:2 684 GNU/LinuxとIRIX上のXFSファイルシステム用のxfsdump(8)とxfsrestore(8)を使うdumpとrestore
backupninja * V:0.4, I:0.5 408 軽量で拡張可のメタバックアップシステム
mondo * V:0.11, I:0.7 1168 Mondo Rescue: 災害復元バックアップスイート
sbackup * V:0.08, I:0.2 488 GNOMEデスクトップ用の簡単なバックアップのスイート
keep * V:0.19, I:0.4 1196 KDE用のバックアップシステム
bacula-common * V:1.2, I:2 1360 Bacula: ネットワークバックアップ、復元および検証 - 共通のサポートファイル
bacula-client * I:0.9 52 Bacula: ネットワークバックアップ、復元および検証 - クライアントメタパッケージ
bacula-console * V:0.3, I:1.2 168 Bacula: ネットワークバックアップ、復元および検証 - テキストコンソール
bacula-server * I:0.5 52 Bacula: ネットワークバックアップ、復元および検証 - サーバーメタパッケージ
amanda-common * V:0.4, I:0.9 5308 Amanda: Advanced Maryland Automatic Network Disk Archiver (ライブラリー)
amanda-client * V:0.4, I:0.8 628 Amanda: Advanced Maryland Automatic Network Disk Archiver (クライアント)
amanda-server * V:0.13, I:0.3 1348 Amanda: Advanced Maryland Automatic Network Disk Archiver (サーバー)
backuppc * V:0.7, I:0.9 2170 BackupPCは高性能でエンタープライズ級の、PCをバックアップするためのシステム(ディスクベース)
backup-manager * V:0.4, I:0.5 660 コマンドラインのバックアップツール
backup2l * V:0.2, I:0.3 140 マウントできるメディアのための低メンテナンスのバックアップ/復旧ツール(ディスクベース)
faubackup * V:0.19, I:0.2 156 ストレージにファイルシステムを使うバックアップシステム(ディスクベース)

バックアップツールにはそれぞれの特別な狙いがあります。

  • Mondo Rescueを使うと、通常のインストールプロセスを経ずにバックアップCD/DVD等から完全なシステムを迅速に復旧できます。
  • sbackupkeepパッケージは、デスクトップユーザーがユーザーデーターの定期的バックアップをする簡単なGUIのフロントエンドを提供します。同様の機能は簡単なスクリプト(「システムバックアップ用スクリプトの例」)とcron(8)で実現できます。
  • BaculaAmandaBackupPCは、ネットワーク越しの定期的バックアップに焦点のあるフル機能のバックアップスイートです。

「アーカイブと圧縮ツール」「コピーと同期ツール」に記された基本的なツールを使うとカスタムスクリプト経由のシステムバックアップができます。そのようなスクリプトは次を使うと強化できます。

  • rdiff-backupパッケージは(リモートの)増分バックアップを可能にします。
  • dumpパッケージは全ファイルシステムの効率的かつ増分のバックアップと復旧を補助します。

ティップ

dumpパッケージに関して学ぶには、"/usr/share/doc/dump/"の中のファイルと"Is dump really deprecated?"を参照下さい。

10.1.8. システムバックアップ用スクリプトの例

個人の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"で復元できます。

10.1.9. データーバックアップ用コピースクリプト

ディレクトリーツリーの下のデーターセットは、"cp -a"としてコピーすると通常のバックアップができます。

"/var/cache/apt/packages/"ディレクトリーの下のデーターのようなディレクトリーの下の大きな上書きされない静的なデーターセットは、"cp -al"を利用するハードリンクを使うと通常のバックアップに代わるディスク空間を効率的に利用するバックアップができます。

私がbkupと名付けたデーターバックアップのためのコピースクリプトを次に示します。このスクリプトは現ディレクトリーの下の全ての(非VCS)ファイルを親ディレクトリーかリモートホストの日付入りディレクトリーにコピーします。

#!/bin/sh -e
# Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain
function fdot(){ find . -type d \( -iname ".?*" -o -iname "CVS" \) -prune -o -print0;}
function fall(){ find . -print0;}
function 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」参照)。

10.1.10. リムーバブルストレージデバイス

リムーバブルストレージデバイスは次の何れも指します。

  • ハードディスク
  • フラッシュメモリーのすべてのフォーマット
  • USBIEEE 1394 / FirewirePC Card等経由でつながれたデジタルカメラ

このようなリムーバブルストレージは、gnome-mount(1)を使いGNOME等の現代的なデスクトップ環境では自動的にユーザーとしてマウントできます。

  • GNOMEの下のマウント点は次のようにしてカスタマイズ可能な"/media/<disk_label>"と選ばれます。

    • FATファイルシステムでは、mlabel(1)を使います。
    • ISO9660ファイルシステムでは、genisoimage(1)を"-V"オプションとともに使います。
    • ext2/ext3ファイルシステムでは、tune2fs(1)を"-L"オプションとともに使います。
  • 符号化方式(エンコーディング)の選択をマウントオプションとして与える必要があるかもしれません(「ファイル名の符号化方式」参照)。
  • マウントされたファイルシステムのオーナーシップはノーマルユーザーが使えるように調整する必要があるかもしれません。

注記

"/etc/fstab"にリムーバブルメディアデバイスの記載が無い時のみ、現代的なデスクトップ環境下での自動マウントは起こります。

ティップ

間違ったマウントオプションにより問題が発生した時には、gconf-editor(1)を使って"/system/storage/"の下の対応する設定を消去します。

表10.4 "/etc/fstab"エントリーにマッチが無いリムーバブルデバイスをノーマルユーザーにマウントする事を許すパッケージのリスト

パッケージ ポプコン サイズ 説明
gnome-mount * V:23, I:42 968 ストレージデバイスを(アン)マウントやイジェクトするためのラッパー(GNOMEが使用)
pmount * V:9, I:32 868 ノーマルユーザーとしてリムーバブルデバイスをマウントする(KDEが使用)
cryptmount * V:0.15, I:0.5 308 暗号化されたファイルシステムの管理とユーザーモードでのマウント
usbmount * I:1.7 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)(「ディスクパーティション設定」参照)を使ってそれを単一のプライマリパーティションにパーティションしそれを次のようにマークします。

    • 2GBより小さなメディアにはFAT16となるように"6"とタイプします
    • type "c" for FAT32 (LBA) for larger media.大きなメディアにはFAT32 (LBA)となるように"c"とタイプします
  • 第1パーティションをmkfs.vfat(8)を使って次のようにフォーマットします。

    • FAT16となるように"/dev/sda1"等とそのデバイス名だけを使います
    • FAT32となるように"-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 = (42GiB - 1 byte)です。Debianは後者の問題に苦しむことはありません。

注記

Microsoft自身も200MBを越すドライブやパーティションにFATを使うことを勧めていません。マイクロソフトは、彼らの"Overview of FAT, HPFS, and NTFS File Systems"で非効率的なディスク領域の使用等の欠点をハイライトしています。もちろん私たちはLinuxでは通常ext3ファイルシステムを使うべきです。

ティップ

ファイルシステムとファイルシステムのアクセスに関しての詳細は、"Filesystems HOWTO"を参照下さい。

10.1.11. ネットワーク経由でのデーター共有

データーをネットワーク経由で他のシステムと共有するときには、共通のサービスを使うべきです。次に一部のヒントを記します。

表10.6 典型的使用シナリオの場合のネットワークサービスの選択のリスト

ネットワークサービス 典型的使用シナリオの説明
Sambaを使うSMB/CIFSネットワーク経由マウントファイルシステム "Microsoft Windows Network"経由でのファイル共有、smb.conf(5)とThe Official Samba 3.2.x HOWTO and Reference Guidesamba-docパッケージ参照
Linuxカーネルを使うNFSネットワークマウントファイルシステム "Unix/Linux Network"経由のファイル共有、exports(5)とLinux NFS-HOWTO参照。
HTTPサービス ウェッブサーバー/クライアント間のファイル共有
HTTPSサービス 暗号化されたセキュアーソケットレイヤー(SSL)もしくはTransport Layer Security (TLS)を使ったウェッブサーバー/クライアント間のファイル共有
FTPサービス FTPサーバー/クライアント間のファイル共有

このようなネットワーク経由でマウントされたファイルシステムやネットワーク経由のファイル転送法はデーター共有のために非常に便利ですが、インセキュアーかもしれませんこれらのネットワーク接続は次に記すようにしてセキュアーにされなければいけません。

  • SSL/TLSを使い暗号化
  • SSH経由でそれをトンネル
  • VPN経由でそれをトンネル
  • セキュアーファイアウォールの背後に限定

さらに「他のネットワークアプリケーションサーバー」「他のネットワークアプリケーションクライアント」を参照下さい。

10.1.12. アーカイブメディア

重要なデーターアーカイブのためのコンピューターデーターストレージメディアを選ぶ時にはそれらの限界について注意を払うべきです。小さな個人的なバックアップのためには、著者としては名前が知られている会社のCD-RとDVD-Rを使い、クールで日陰の乾燥した埃の無い環境に保存しています。(プロ用途ではテープアーカイブメディアに人気があるようです。)

注記

耐火金庫は紙の文書のためのものです。ほとんどのコンピューターデーターストレージメディアは紙よりも耐熱性がありません。著者は通常複数の安全な場所に保管された複数のセキュアーな暗号化されたコピーに頼っています。

ネット上に散見するアーカイブメディアの楽観的なストレージ寿命(ほとんどベンダー情報由来)。

  • 100+年: インクと中性紙
  • 100年: オプティカルストレージ(CD/DVD、CD/DVD-R)
  • 30年: 磁気ストレージ(テープ、フロッピー)
  • 20年: 相変化オプティカルストレージ(CD-RW)

これらは取扱いによる機械的故障等は考慮していません。

ネット上に散見するアーカイブメディアの楽観的な書込み回数(ほとんどベンダー情報由来)。

  • 250,000+回: ハードディスク
  • 10,000+回: フラッシュメモリー
  • 1,000回: CD/DVD-RW
  • 1回: CD/DVD-R、紙

注意

ここにあるストレージ寿命や書込み回数の数字はクリチカルなデーターストレージに関する決定に使うべきではありません。製造者によって提供される特定の製品情報を参照下さい。

ティップ

CD/DVD-Rや紙は1回しか書けないので、本質的に重ね書きで間違ってデーターを消すことを防げます。これは、利点です!

ティップ

もし高速で頻繁な大量のデーターのバックアップをする必要がある場合、高速のネットワーク接続でつながっているリモートホスト上のハードディスクが唯一の現実的なオプションかもしれません。

10.2. ディスクイメージ

次に、ディスクイメージの操作を論じます。「データー保存のティップ」も参照下さい。

10.2.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"等で置き換えます。

10.2.2. ディスクに直接書込み

ディスクイメージファイル"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

10.2.3. ディスクイメージファイルをマウント

単一パーティションイメージを含むディスクイメージ"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

注記

MBR等をスキップするオフセットを使ったloopデバイスによっても、このようなディスクイメージの単一パーティションをマウント出来ます。しかしこれは失敗しがちです。

10.2.4. ディスクイメージのクリーニング

ディスクイメージファイル"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

10.2.5. 空のディスクイメージ作成

5MiBまで成長可能な空のディスクイメージファイル"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)等を使ってファイルシステムを作れます。

10.2.6. ISO9660イメージファイル作成

"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ファイルシステム先読みバグを注意深く避けなければいけません。

10.2.7. CD/DVD-R/RWに直接書込み

ティップ

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をアンマウントします。

10.2.8. ISO9660イメージファイルをマウント

もし"cd.iso"の内容がISO9660イメージの場合、次のようにするとそれを"/cdrom"に手動でマウントできます。

# mount -t iso9660 -o ro,loop cd.iso /cdrom

ティップ

現代的なデスクトップシステムではリムーバブルメディアを自動的にマウントします(「リムーバブルストレージデバイス」参照)。

10.3. バイナリーデーター

次に、ストレージメディア上のバイナリーデーターを直接操作することを論じます。「データー保存のティップ」も参照下さい。

10.3.1. バイナリーデーターの閲覧と編集

もっとも基本的なバイナリーファイルを閲覧方法は"od -t x1"コマンドを使うことです。

表10.7 バイナリーデーターを閲覧や編集するパッケージのリスト

パッケージ ポプコン サイズ 説明
coreutils * V:91, I:99 11792 ファイルをダンプするod(1)がある基本パッケージ(HEX, ASCII, OCTAL, …)
bsdmainutils * V:73, I:99 756 ファイルをダンプするhd(1)があるユーティリティーパッケージ(HEX, ASCII, OCTAL, …)
hexedit * V:0.3, I:1.9 108 バイナリーエディターとビューワー(HEX, ASCII)
bless * V:0.05, I:0.3 1240 フル機能の16進エディター(GNOME)
okteta * V:0.3, I:3 1392 フル機能の16進エディター(KDE4)
ncurses-hexedit * V:0.09, I:0.5 192 バイナリーエディターとビューワー(HEX, ASCII, EBCDIC)
lde * V:0.04, I:0.4 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メインフレームオペレーティングシステム上で使われる拡張二進化十進数互換コードです。

10.3.2. ディスクをマウントせずに操作

ディスクをマウントせずに読出しや書込みをするツールがあります。

表10.8 ディスクをマウントせずに操作するパッケージのリスト

パッケージ ポプコン サイズ 説明
mtools * V:4, I:48 412 MSDOSファイルをマウントせずに使うツール
hfsutils * V:0.2, I:1.7 236 HFSやHFS+ファイルをマウントせずに使うツール

10.3.3. データーの冗長性

Linuxカーネルが提供するソフトウエアーRAIDシステムは高いレベルのストレージ信頼性を達成するためにカーネルのファイルシステムのレベルでデーターの冗長性を提供します。

アプリケーションプログラムレベルでストレージの高い信頼性を達成するようにデーター冗長性を付加するツールもあります。

表10.9 ファイルにデーターの冗長性を追加するツールのリスト

パッケージ ポプコン サイズ 説明
par2 * V:0.5, I:1.7 272 ファイルのチェックと修理のためのパリティーアーカイブセット
dvdisaster * V:0.19, I:0.8 1420 CD/DVDメディアのデーターロス/傷つき/老化の防止
dvbackup * V:0.01, I:0.12 544 MiniDVカメラレコーダを使うバックアップツール(rsbep(1)を提供)
vdmfec * V:0.00, I:0.03 88 前方エラー修正を使って失われたブロックの復元

10.3.4. データーファイルの復元と事故の証拠解析

データーファイルの復元と事故の証拠解析のツールがあります。

表10.10 データーファイルの復元と事故の証拠解析のリスト

パッケージ ポプコン サイズ 説明
testdisk * V:0.3, I:3 4616 パーティションのスキャンとディスク復元のためのユーティリティー
magicrescue * V:0.10, I:0.6 344 マジックバイトを探してファイルを復元するユーティリティー
scalpel * V:0.05, I:0.2 124 質素で高性能なファイル彫刻刀
recover * V:0.08, I:0.8 104 ext2ファイルシステム上のファイルの削除復元ユーティリティー
e2undel * V:0.07, I:0.6 244 ext2ファイルシステム上のファイルの削除復元ユーティリティー
ext3grep * V:0.09, I:0.5 300 ext3ファイルシステム上のファイルの削除復元ヘルプツール
scrounge-ntfs * V:0.04, I:0.5 80 NTFSファイルシステム上のデーター復元プログラム
gzrt * V:0.03, I:0.16 68 gzip復元ツールキット
sleuthkit * V:0.15, I:0.7 5016 証拠解析のためのツール(Sleuthkit)
autopsy * V:0.08, I:0.4 1368 SleuthKitのためのGUI
foremost * V:0.11, I:0.7 140 データー復元のための証拠解析アプリケーション
tct * V:0.04, I:0.2 604 証拠解析関連ユーティリティー
dcfldd * V:0.03, I:0.19 124 証拠解析とセキュリティーのためのddの強化版
rdd * V:0.02, I:0.12 200 証拠解析のためのコピープログラム

10.3.5. 大きなファイルを小さなファイルに分割

単一ファイルでバックアップするにはデーターが大きすぎる場合、そのファイル内容を例えば2000MiBの断片にしてバックアップし、それらの断片を後日マージしてオリジナルのファイルに戻せます。

$ split -b 2000m large_file
$ cat x* >large_file

注意

名前がかち合わないように"x"で始まるファイル名のファイルが無いようにします。

10.3.6. ファイル内容の消去

そのようなログファイルの内容を消去するために、rm(1)を使ってファイルを消去しその後新しい空ファイルを作成しないようにします。こうするとコマンド実行間にファイルがアクセスされているかもしれないのがお勧めできない理由です。次のようにするのがファイル内容を消去する安全な方法です。

$ :>file_to_be_cleared

10.3.7. ダミーファイル

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

$ 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を更新しファイル内容をリセットします。

10.3.8. ハードディスクの全消去

"/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"等のシステムハードディスクに対して同類のメディアから消去コマンドを実行することでインストールされたシステムを完全に消去することができます。

10.3.9. ハードディスク未使用部分の全消去

データーの消去はファイルシステムからアンリンクされているだけなので、例えば"/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メモリースティックにとってはこれで通常十分です。でもこれは完璧ではありません。消去されたファイル名や属性はファイルシステム中に隠れて残っているかもしれません。

10.3.10. 削除されたがまだオープン中のファイルの復活法

ファイルをうっかり消去しても、そのファイルが何らかのアプリケーション(読出しか書込み)によって使われている限り、そのようなファイルを回復出来ます。

例えば、次を試してみて下さい:

$ 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

10.3.11. 全てのハードリンクを検索

ハードリンクのあるファイルは"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.3.12. 見えないディスクスペースの消費

削除されたがオープンされたままのファイルは、通常のdu(1)では見えませんが、ディスクスペースを消費します。これらは次のようにすればそのサイズとともにリストできます。

# lsof -s -X / |grep deleted

10.4. データーセキュリティーのインフラ

データーのセキュリティーのインフラはデーターの暗号化のツールとメッセージダイジェストのツールと署名ツールの組み合わせで提供されます。

表10.11 データーセキュリティーインフラツールのリスト

コマンド パッケージ ポプコン サイズ 説明
gpg(1) gnupg * V:40, I:99 5288 GNUプライバシーガード - OpenPGP 暗号化ト署名ツール
N/A gnupg-doc * I:1.3 4124 GNUプライバシガード文書
gpgv(1) gpgv * V:59, I:99 436 GNUプライバシガード - 署名確認ツール
paperkey(1) paperkey * V:0.01, I:0.13 88 OpenPGPの秘密キーから秘密の情報だけを抜粋
cryptsetup(8), … cryptsetup * V:3, I:5 952 暗号化されたブロックデバイス(dm-crypt / LUKS)のためのユーティリティー
ecryptfs(7), … ecryptfs-utils * V:0.16, I:0.2 464 ecryptfsスタックドファイルシステム暗号化のためのユーティリティー
md5sum(1) coreutils * V:91, I:99 11792 MD5メッセージダイジェストを計算やチェック
sha1sum(1) coreutils * V:91, I:99 11792 SHA1メッセージダイジェストを計算やチェック
openssl(1ssl) openssl * V:36, I:90 2352 "openssl dgst"を使ってメッセージダイジェストを計算やチェック(OpenSSL)

Linuxカーネルモジュール経由で自動的データー暗号化のインフラを実現するdm-cryptoecryptfsに関しては「データー暗号化ティップ」を参照下さい。

10.4.1. Gnupgのためのキー管理

基本的なキー管理に関する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 究極の信用

次のようにすると私のキー"A8061F32"をポピュラーなキーサーバー"hkp://subkeys.pgp.net"にアップロード出来ます。

$ gpg --keyserver hkp://subkeys.pgp.net --send-keys A8061F32

"~/.gnupg/gpg.conf"(もしくは古い場所"~/.gnupg/options")中の良いデフォールトのキーサーバーの設定は次を含みます。

keyserver hkp://subkeys.pgp.net

次によってキーサーバーから知らないキーが獲得できます。

$ gpg --list-sigs | \
  sed -n '/^sig.*\[User ID not found\]/s/^sig..........\(\w\w*\)\W.*/\1/p' |\
  sort | uniq | xargs gpg --recv-keys

OpenPGP公開キーサーバー(バージョン0.9.6以前)に2つ以上サブキーのあるキーを壊すバグがありました。新しいgnupg (>1.2.1-2)パッケージはこのような壊れたサブキーを取り扱えます。gpg(1)の"--repair-pks-subkey-bug"オプションの説明を参照下さい。

10.4.2. GnuPGをファイルに使用

基本的なキー管理に関するGNUプライバシガードコマンドを次に記します。

表10.14 ファイルに使用するGNUプライバシーガードコマンドのリスト

コマンド 説明
gpg -a -s file ファイルをASCII文字化したfile.ascと署名
gpg --armor --sign file , ,
gpg --clearsign file メッセージをクリアサイン
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 , ,

10.4.3. MuttでGnuPGを使用

インデックスメニュー上で"S"とすればGnuPGが使えるようにしておきながら、遅いGnuPGが自動的に起動しないように"~/.muttrc"に次の内容を追加します。

macro index S ":toggle pgp_verify_sig\n"
set pgp_verify_sig=no

10.4.4. VimでGnuPGを使用

gnupgのプラグインを使うと".gpg"や".asc"や".ppg"というファイル拡張子のファイルに対して透過的にGnuPGを実行できます。

# aptitude install vim-scripts vim-addon-manager
$ vim-addons install gnupg

10.4.5. MD5和

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.5. ソースコードマージツール

ソースコードをマージする多くのツールがあります。次のコマンドが著者の目に止まりました。

表10.15 ソースコードマージツールのリスト

コマンド パッケージ ポプコン サイズ 説明
diff(1) diff * V:77, I:95 32 1行ごとにファイルを比較
diff3(1) diff * V:77, I:95 32 1行ごとにファイルを比較やマージ
vimdiff(1) vim * V:14, I:31 1732 vimで2つのファイルを並べて比較
patch(1) patch * V:10, I:93 244 差分ファイルをオリジナルに適用
dpatch(1) dpatch * V:2, I:15 344 Debianパッケージのためにパッチのシリーズを管理
diffstat(1) diffstat * V:2, I:15 84 差分ファイルによる変化のヒストグラム作成
combinediff(1) patchutils * V:2, I:16 292 2つの積み重ねパッチから1つの合計パッチを生成
dehtmldiff(1) patchutils * V:2, I:16 292 HTMLページから差分ファイルを抽出
filterdiff(1) patchutils * V:2, I:16 292 差分ファイルから差分ファイルを抽出や削除
fixcvsdiff(1) patchutils * V:2, I:16 292 CVSにより作成されたpatch(1)が誤解する差分ファイルを修正
flipdiff(1) patchutils * V:2, I:16 292 古い2つのパッチを交換
grepdiff(1) patchutils * V:2, I:16 292 正規表現にマッチするパッチによって変更されるファイルを表示
interdiff(1) patchutils * V:2, I:16 292 2つのユニファイド差分ファイル間の違いを表示
lsdiff(1) patchutils * V:2, I:16 292 どのファイルがパッチによって変更されるかを表示
recountdiff(1) patchutils * V:2, I:16 292 ユニファイドコンテキスト差分ファイルのカウントやオフセットを再計算
rediff(1) patchutils * V:2, I:16 292 手編集された差分ファイルのカウントやオフセットを再計算
splitdiff(1) patchutils * V:2, I:16 292 増分パッチの分離
unwrapdiff(1) patchutils * V:2, I:16 292 ワードラップされたパッチを復元
wiggle(1) wiggle * V:0.02, I:0.11 204 リジェクトされたパッチを適用
quilt(1) quilt * V:1.0, I:7 856 パッチのシリーズを管理
meld(1) meld * V:0.6, I:2 2304 ファイルを比較やマージ(GTK)
xxdiff(1) xxdiff * V:0.2, I:1.2 1352 ファイルを比較やマージ(プレーンX)
dirdiff(1) dirdiff * V:0.08, I:0.5 224 ディレクトリーツリー間で相違点の表示と変更のマージ
docdiff(1) docdiff * V:0.01, I:0.16 688 2つのファイルをワード毎/文字毎に比較
imediff2(1) imediff2 * V:0.01, I:0.10 76 対話型フルスクリーンの2方マージツール
makepatch(1) makepatch * V:0.02, I:0.19 148 拡張パッチファイルの生成
applypatch(1) makepatch * V:0.02, I:0.19 148 拡張パッチファイルの適用
wdiff(1) wdiff * V:1.9, I:15 116 テキストファイル間のワードの相違表示

10.5.1. ソースファイル間の相違の抽出

ファイルの場所次第で次の手順のひとつに従うとふたつのソースファイル間の相違を抽出しユニファイド差分ファイル"file.patch0"か"file.patch1"を作成します。

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

10.5.2. ソースファイルに更新をマージ

差分ファイル(別名、パッチファイル)はプログラム更新を送るのに使われます。受け取った側はこの更新を別のファイルに次のようにして適用します。

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

10.5.3. 3方マージによる更新

3つのバージョンのソースコードがある場合、diff3(1)を使って効率的に3方マージを次のように実行できます。

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

10.6. バージョンコントロールシステム

Debianシステム上のバージョンコントロールシステム(VCS)のまとめを次に記します。

注記

VCSシステムを今始めて学ぶ場合には、人気が出て来ているGitから学び出すことをお薦めします。

表10.16 バージョンコントロールシステムツールのリスト

パッケージ ポプコン サイズ ツール VCSタイプ コメント
cssc * V:0.00, I:0.05 2168 CSSC ローカル Unix SCCSのクローン(非推薦)
rcs * V:1.4, I:8 772 RCS ローカル "Unix SCCSの本来あるべき姿"
cvs * V:4, I:28 3660 CVS リモート リモートVCSの過去の標準
subversion * V:10, I:32 4284 Subversion リモート "良く出来たCVS"、新しいリモートVCSのデファクト標準
git-core * V:7, I:12 15056 Git 分散型 C で書かれた高速DVCS(Linuxカーネル他が利用)
mercurial * V:1.2, I:5 332 Mercurial 分散型 Pythonと一部Cで書かれたDVCS
bzr * V:0.5, I:2 15200 Bazaar 分散型 tlaに影響されPythonで書かれたDVCS(Ubuntuが使用)
darcs * V:0.2, I:1.5 8120 Darcs 分散型 パッチに関して賢い計算をするDVCS(遅い)
tla * V:0.16, I:1.3 1100 GNU arch 分散型 主にTom LordによるDVCS(歴史的)
monotone * V:0.06, I:0.3 4836 Monotone 分散型 C++で書かれたDVCS
tkcvs * V:0.06, I:0.4 2384 CVS, … リモート VCS (CVS, Subversion, RCS)レポジトリーツリーのGUI表示
gitk * V:0.7, I:3 796 Git 分散型 VCS (Git)レポジトリーツリーのGUI表示

VCSはリビジョンコントロールシステム(RCS)とかソフトウエアー設定管理(SCM)という別名もあります。

Gitのような分散VCSが最近一番人気のツールです。CVSやSubversionは既存のオープンソースプログラム活動に参加するのにまだ有用かもしれません。

DebianはDebian Aliothサービス経由でフリーのVCSサービスを提供します。それは実質的に全てのVCSをサポートします。その説明文書はhttp://wiki.debian.org/Aliothにあります。

注意

gitパッケージはDVCSではない"GNUインタラクティブツール"です。

VCSアーカイブへの共有アクセスを作るための基本が数点あります。

10.6.1. VCSコマンドの比較

次に全体像を提供するべく元来の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-cvsgit-svnパッケージを使ってCVSやSubversionによって提供されるレポジトリー等の他のVCSレポジトリーを直接処理したり、ローカル変更のためのローカルレポジトリーを提供します。git for CVS usersGit for GNOME developers「Git」を参照下さい。

ティップ

CVSやSubversionに等価コマンドが無いコマンドがGitにあります: "fetch"、"rebase"、"cherrypick"、…

10.7. CVS

次を参照下さい。

  • cvs(1)
  • "/usr/share/doc/cvs/html-cvsclient"
  • "/usr/share/doc/cvs/html-info"
  • "/usr/share/doc/cvsbook"
  • "info cvs"

10.7.1. 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"と変更すると新規プロジェクトの作成を制限できます。

10.7.2. CVSへのローカルアクセス

デフォールトのCVSレポジトリーは"$CVSROOT"で指示されます。次はローカルアクセスのための"$CVSROOT"を設定します。

$ export CVSROOT=/srv/cvs/project

10.7.3. pserverを使ったCVSへのリモートアクセス

多くの公開CVSサーバーはアカウント名"anonymous"でpserverサービス経由の読出しのみアクセスを提供します。例えば、Debianウェッブサイト内容はwebwmlプロジェクトはDebian aliothサービスでのCVSを使ってメンテされています。次はこのCVSレポジトリーへのリモートアクセスのための"$CVSROOT"を設定します。

$ export CVSROOT=:pserver:anonymous@cvs.alioth.debian.org:/cvsroot/webwml
$ cvs login

注記

pserverは盗聴攻撃されやすくインセキュアーなので、書込みアクセスはサーバーの管理者によって通常無効にされています。

10.7.4. sshを使ったCVSへのリモートアクセス

次はSSHを使いwebwml プロジェクトのCVSレポジトリーをリモートアクセスするために"$CVS_RSH"と"$CVSROOT"を設定します。

$ export CVS_RSH=ssh
$ export CVSROOT=:ext:account@cvs.alioth.debian.org:/cvs/webwml

リモートパスワードプロンプトを無くすのにSSHを使ったパブリックキー認証を使えます。

10.7.5. 新規ソースをCVSにインポート

"~/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

10.7.6. CVSレポジトリーのファイルパーミッション

CVSは現レポジトリーファイルを上書きせず他のファイルで置き換えます。だからレポジトリーディレクトリーへの書込みパーミッションはクリチカルです。"module1"という新規レポジトリーを"/srv/cvs/project"に作成の際毎に、必要ならこの条件を満たすために次を実行します。

# cd /srv/cvs/project
# chown -R root:src module1
# chmod -R ug+rwX   module1
# chmod    2775     module1

10.7.7. CVSのワークフロー

次に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"のサブディレクトリーだけをチェックアウトすることが出来ます。

表10.18 CVSコマンドの特記すべきオプション(cvs(1)の最初の引数として使用)

オプション 意味
-n 空実行、効果無し
-t 各段階のCVS活動が分かるようにメッセージを表示

10.7.8. CVSから最新ファイル

CVSから最新ファイルを取り込むには、次のように"tomorrow"(明日)を使います:

$ cvs ex -D tomorrow module_name

10.7.9. CVSの管理運営

モジュールのエリアス"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

注記

上記プロシージャを行うには、適切なファイルパーミッションが設定されているべきです。

10.7.10. CVSチェックアウトの実行ビット

CVSからファイルをチェックアウトする時に、その実行パーミッションビットは保持されます。

チェックアウトされた例えば"filename"ファイルで実行ビットの問題にあった際には、次のコマンドを使いCVSレポジトリー中のそのパーミッションを変更します。

# chmod ugo-x filename

10.8. Subversion

Subversionは旧来のCVSを置き換える最近の世代のバージョンコントロールシステムです。Subversionにはタグとブランチを除くCVSのほとんどの機能をあります。

Subversionのサーバーをセットアップするには、subversionlibapache2-svnsubversion-toolsパッケージをインストールする必要があります。

10.8.1. Subversionレポジトリーの設定

現状のsubversionパッケージはレポジトリーの設定はしないので手動で設定を行う必要があります。レポジトリーを置く可能な場所の1つは"/srv/svn/project"中です。

ディレクトリーを次のように作成します。

# mkdir -p        /srv/svn/project

レポジトリーデーターベースを次のように作成します。

# svnadmin create /srv/svn/project

10.8.2. Apach2サーバーの経由のSubversionアクセス

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にてアクセスできます。

10.8.3. グループによるSubversionへのローカルアクセス

次は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からグループアクセスできます。グループアクセスを確実にするために、svnsvnservesvnlooksvnadmin等のコマンドを"umask 002"の下で実行しなければいけません。

10.8.4. グループによるSubversionへのSSH経由のリモートアクセス

SSHから"example.com:/srv/svn/project"のURLにあるグループアクセス可能なSubversionレポジトリーは、svn(1)を使って"svn+ssh://example.com:/srv/svn/project"にてアクセスできます。

10.8.5. Subversionディレクトリー構造

Subversionのブランチやタグの機能を欠くことを補うべく、多くのプロジェクトは次と似たようなディレクトリーツリーを使っています。

  ----- module1
    |   |-- branches
    |   |-- tags
    |   |   |-- release-1.0
    |   |   `-- release-2.0
    |   |
    |   `-- trunk
    |       |-- file1
    |       |-- file2
    |       `-- file3
    |
    `-- module2

ティップ

ブランチやタグをマークするためには"svn copy …"コマンドを使わなければいけません。こうすることでSubversionがファイルの変更履歴を適切な記録を確実にするとともに記録容量を節約できます。

10.8.6. 新規ソースをSubversionにインポート

"~/path/to/module1"で新規のローカルソースツリーの場所を作成。

$ mkdir -p ~/path/to/module1; cd ~/path/to/module1

"~/path/to/module1"の下の新規のローカルソースツリーを埋める。

ソースを次のパラメーターを使ってSubversionにインポートします。

  • モジュール名: "module1"
  • SubversionサイトのURL: "file:///srv/svn/project",
  • Subversionディレクトリー: "module1/trunk":
  • Subversionタグ: "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ででも置き換えられます。

10.8.7. Subversionのワークフロー

次にSubversionを使う典型的なワークフローを記します。

"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活動の詳細なメッセージを表示

10.9. Git

Gitはローカルとリモートのソースコード管理の全機能があります。これはリモートレポジトリーとのネットワーク接続なしにソースコードへの変更を記録できるといことです。

10.9.1. 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

10.9.2. Gitリファレンス

次を参照下さい。

git-gui(1)とgitk(1)コマンドは簡単にGitが利用出来るようにします。

警告

たとえgitk(1)等の一部ツールが受け付けるからといって、タグ文字列中にスペースを使ってはいけません。他のgitコマンドで支障が起こるかもしれません。

10.9.3. Gitコマンド

アップストリームが異なるVCSを使っていようと、アップストリームへのネットワーク接続無しにローカルコピーを管理できるので、ローカル活動にgit(1)を使うのは良い考えかもしれません。次はgit(1)とともに使われるパッケージとコマンドのリストです。

表10.20 git関連のパッケージとコマンドのリスト

コマンド パッケージ ポプコン サイズ 説明
N/A git-doc * I:2 6860 正式Git文書
N/A gitmagic * I:0.3 876 "Gitマジック"、Gitに関する分かり易いガイド
git(7) git-core * V:7, I:12 15056 git: 高速、スケーラブル、分散型リビジョンコントロールシステム
gitk(1) gitk * V:0.7, I:3 796 GUIによる履歴付きGitレポジトリーブラウザー
git-gui(1) git-gui * V:0.3, I:2 1456 Git用のGUI(履歴無し)
git-svnimport(1) git-svn * V:0.5, I:3 524 SubversionからGitへのデーターのインポート
git-svn(1) git-svn * V:0.5, I:3 524 SubversionとGit間での双方向操作を提供
git-cvsimport(1) git-cvs * V:0.15, I:1.4 656 CVSからiGitへのデーターのインポート
git-cvsexportcommit(1) git-cvs * V:0.15, I:1.4 656 GitからCVSチェックアウトに1コミットエキスポート
git-cvsserver(1) git-cvs * V:0.15, I:1.4 656 Git用CVSサーバーエミュレーター
git-send-email(1) git-email * V:0.09, I:1.4 392 Gitからパッチの集合のemailとして送信
stg(1) stgit * V:0.09, I:0.7 1864 Git上のquilt(Python)
git-buildpackage(1) git-buildpackage * V:0.12, I:1.0 508 Gitを使ってDebianパッケージ化を自動化
guilt(7) guilt * V:0.02, I:0.12 336 Git上のquilt(SH/AWK/SED/…)

10.9.4. 設定履歴記録のためのGit

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パッケージを見て下さい: 「設定ファイルの変更記録」

第11章 データー変換

Debianシステム上のデーターフォーマット変換のツールとティップを記します。

標準に準拠したツールは非常に良い状態ですが、プロプライタリデーターフォーマットのサポートは限定的です。

11.1. テキストデーター変換ツール

テキストデーター変換のための次のパッケージが著者の目に止まりました。

表11.1 テキストデーター変換ツールのリスト

パッケージ ポプコン サイズ キーワード 説明
libc6 * V:96, I:99 9932 文字セット iconv(1)によるロケール間のテキスト符号化方式変換ソフト(基本的)
recode * V:1.5, I:7 772 文字セット+行末文字 ロケール間のテキスト符号化方式変換ソフト(機能豊富、より多いエリアスと機能)
konwert * V:0.4, I:4 192 文字セット ロケール間のテキスト符号化方式変換ソフト(高級機能)
nkf * V:0.3, I:2 300 文字セット 日本語のための文字セット翻訳ソフト
tcs * V:0.02, I:0.16 544 文字セット 文字セット翻訳ソフト
unaccent * V:0.02, I:0.09 60 文字セット アクセント付き文字をアクセントの無しの等価文字に置換
tofrodos * V:1.3, I:8 80 行末文字 DOSとUnix間のテキストフォーマット変換ソフト: fromdos(1)とtodos(1)
macutils * V:0.07, I:0.7 356 行末文字 MacintoshとUnix間のテキストフォーマット変換ソフト: frommac(1) and tomac(1)

11.1.1. テキストファイルをiconvを使って変換

ティップ

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スタイルGB2312GBKGB18030の変種
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ビットコードのみを用いる日本語e-mailの標準符号化方式
eucJP Shift-JISとはまったく違う、旧日本のUNIX標準8ビットコード
Shift-JIS 日本語のためのJIS X 0208 Appendix 1標準(CP932参照)

注記

一部の符号化方式(エンコーディング)はデーター変換のみサポートされており、ロケール値としては使われません(「符号化方式の基本」参照)。

ASCIIISO-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"を参照下さい。

11.1.2. ファイルがUTF-8であるとiconvを使い確認

次のようにするとテキストファイルがUTF-8でエンコードされているとiconv(1)を使って確認できます。

$ iconv -f utf8 -t utf8 input.txt >/dev/null || echo "non-UTF-8 found"

ティップ

最初の非UTF-8文字を見つけるには上記例中で"--verbose"オプションを使います。

11.1.3. iconvを使ってファイル名変換

次に、単一ディレクトリー中の旧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"コマンドを使ってコピーします。

11.1.4. 行末変換

テキストファイルのフォーマット、特に行末(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を行末コードとして用います。あくまで上記は一般則と言うだけです。

注記

ほとんどのエディター(例えばvimemacsgedit等)はMSDOSスタイルの行末を透過的に取り扱えます。

ティップ

MSDOSとUnixスタイルが混在する行末スタイルをMSDOSスタイルに統一するには、todos(1)を使う代わりに"sed -e '/\r$/!s/$/\r/'"を使う方がより好ましいです。(例えば、2つのMSDOSスタイルファイルをdiff3(1)を使ってマージした後。) todosは全ての行にCRを追加するというのがこの理由です。

11.1.5. タブ変換

タブコードを変換するための良く使われる専用プログラムがいくつかあります。

表11.4 bsdmainutilscoreutilsパッケージ中のタブ変換コマンドのリスト

機能 bsdmainutils coreutils
タブからスペースに展開する "col -x" expand
スペースからタブに逆展開する "col -h" unexpand

indentパッケージにあるindent(1)コマンドはCプログラム中のホワイトスペースを完全にリフォーマットします。

Editor programs such as vim and やemacs等のエディタープログラムもまたタブ変換に使えます。例えばvimを使うと、":set expandtab"として":%retab"するコマンドシーケンスでタブ変換が出来ます。これを元に戻すのは、":set noexpandtab"として":%retab!"とするコマンドシーケンスです。

11.1.6. 自動変換付きエディター

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ファミリーのプログラムもまた同様の機能の実行ができます。

11.1.7. プレーンテキスト抽出

以下はウェッブページを読みテキストファイルに落とします。ウェッブから設定を取ってくる時やgrep(1)等の基本的なUnixテキストツールをウェッブページに適用するときに非常に有用です。

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

同様に、次を用いることで他のフォーマットからプレーンテキストデーターを抽出出来ます。

表11.5 プレーンテキストデーター抽出ツールのリスト

パッケージ ポプコン サイズ キーワード 機能
w3m * V:22, I:84 1964 html→text "w3m -dump"コマンドを使うHTMLからテキストへの変換ソフト
html2text * V:13, I:39 308 html→text 先進的HTMLからテキストへの変換ソフト(ISO 8859-1)
lynx * I:24 248 html→text "lynx -dump"コマンドを使うHTMLからテキストへの変換ソフト
elinks * V:2, I:6 1444 html→text "elinks -dump"コマンドを使うHTMLからテキストへの変換ソフト
links * V:3, I:9 1372 html→text "links -dump"コマンドを使うHTMLからテキストへの変換ソフト
links2 * V:0.9, I:4 3280 html→text "links2 -dump"コマンドを使うHTMLからテキストへの変換ソフト
antiword * V:1.1, I:2 796 MSWord→text,ps MSWordファイルをプレーンテキストかpsに変換
catdoc * V:0.8, I:2 2664 MSWord→text,TeX MSWordファイルをプレーンテキストかTeXに変換
pstotext * V:0.8, I:1.4 160 ps/pdf→text PostScriptとPDFファイルからテキストを抽出
unhtml * V:0.02, I:0.17 76 html→text HTMLファイルからマークアップタグを削除
odt2txt * V:0.7, I:1.3 104 odt→text OpenDocumentテキストからテキストへの変換ソフト
wpd2sxw * V:0.02, I:0.13 156 WordPerfect→sxw WordPerfectからOpenOffice.org/StarOffice writerへの文書変換ソフト

11.1.8. プレーンテキストデーターをハイライトとフォーマット

次のようにしてプレーンテキストデーターをハイライトとフォーマット出来ます。

表11.6 プレーンテキストデーターをハイライトするツールのリスト

パッケージ ポプコン サイズ キーワード 説明
vim-runtime * V:3, I:37 24572 ハイライト ":source $VIMRUNTIME/syntax/html.vim"を使ってソースコードをHTMLに変換するためのVim MACRO
cxref * V:0.07, I:0.5 1104 c→html CプログラムからlatexかHTMLへの変換ソフト(C言語)
src2tex * V:0.02, I:0.2 1968 ハイライト 多くのソースコードのTeXへの変換ソフト(C言語)
source-highlight * V:0.14, I:1.0 3520 ハイライト 多くのソースコードをHTMLとXHTMLとLaTeXとTexinfoとANSIカラーエスケープシーケンスとDocBookにハイライト付きで変換(C++)
highlight * V:0.06, I:0.3 732 ハイライト 多くのソースコードをHTMLとXHTMLとLaTeXとTexとAXSL-FOにハイライト付きで変換(C++)
grc * V:0.03, I:0.13 164 text→color 汎用着色化ソフト(Python)
txt2html * V:0.07, I:0.4 296 text→html テキストからHTMLへの変換ソフト(Perl)
markdown * V:0.08, I:0.5 96 text→html markdownテキスト文書の(X)HTMLへのフォーマット化ソフト(Perl)
asciidoc * V:0.15, I:0.9 4644 text→any AsciiDocテキスト文書のXML/HTMLへのフォーマット化ソフト(Python)
python-docutils * V:0.3, I:3 5508 text→any ReStructuredテキスト文書のXMLへのフォーマット化ソフト(Python)
txt2tags * V:0.07, I:0.4 1028 text→any テキストからHTMLとSGMLとLaTeXとman pageとMoinMoinとMagic PointとPageMakerへの文書変換(Python)
udo * V:0.01, I:0.08 556 text→any 汎用文書-テキスト処理ユーティリティー(C言語)
stx2any * V:0.00, I:0.06 484 text→any 構造化プレーンテキストからたのフォーマットへの文書変換ソフト(m4)
rest2web * V:0.01, I:0.11 576 text→html ReStructured Textからhtmlへの文書変換ソフト(Python)
aft * V:0.01, I:0.07 340 text→any "自由フォーム"文書準備システム(Perl)
yodl * V:0.01, I:0.06 520 text→any プリ文書言語とその処理用のツール(C言語)
sdf * V:0.01, I:0.09 1940 text→any 単純文書処理ソフト(Perl)
sisu * V:0.00, I:0.07 7524 text→any 文書の構造化と出版と探索の枠組み(Ruby)

11.2. XMLデーター

Extensible Markup Language (XML)は構造化情報を含む文書のためのマークアップ言語です。

XML.COMにある入門情報を参照下さい。

11.2.1. XMLに関する基本ヒント

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で事前定義されているエントリーのリスト

事前定義されたエンティティ 変換される前の文字
&quot; " : 引用符
&apos; ' : アポストロフィ
&lt; < : 以下
&gt; > : 以上
&amp; & : アンパサンド

注意

"<"と"&"はアトリビュートやエレメントには使えません。

注記

例えば"&some-tag:"等のSGMLスタイルのユーザー定義エンティティが使われた場合、他の定義は無効で最初の定義が有効です。エンティティ定義は"<!ENTITY 何らかのタグ "エンティティ値">"と表現されます。

注記

As long as the XMLのマークアップがタグ名の何らかの組み合わせで(あるデーターを内容としてであれアトリビュート値としてであれ)整合性を持ってされている限り、他のXMLの変換は拡張可能スタイルシート言語変換(XSLT)を使うととっても簡単な作業です。

11.2.2. XML処理

拡張可能スタイルシート言語(XSL)のようなXMLファイルを処理するツールは沢山あります。

基本的に、良くできたXMLファイルを一度作ると、いかなるフォーマットへも拡張可能なスタイルシート言語変換(XSLT)を使って変換できます。

フォーマットオブジェクト用拡張可能スタイルシート言語(XSL-FO)がフォーマットのための答えとなるはずです。fopパッケージはまだDebianの(mainではなく)contribアーカイブにまだあります。このため。通常XSLTを使ってLaTeXコードがXMLから作成され、LaTeXシステムを使ってDVIやPostScriptやPDF等のプリンタブルなファイルが作成されます。

表11.8 XMLツールのリスト

パッケージ ポプコン サイズ キーワード 説明
docbook-xml * I:51 2488 xml DocBook用XMLドキュメントタイプ定義(DTD)
xsltproc * V:5, I:49 152 xslt XSLTコマンドラインプロセスソフト(XML→ XML, HTML, plain text, 他)
docbook-xsl * V:0.7, I:7 12792 xml/xslt DocBook XMLをXSLTを使って各種アウトプットへ処理するXSLスタイルシート
xmlto * V:0.3, I:2 268 xml/xslt XSLTを用いてXMLから全てへの変換ソフト
dblatex * V:0.3, I:1.9 6820 xml/xslt XSLTを使ってDocbookファイルをDVI, PostScript, PDF文書へ変換
fop * V:0.19, I:1.4 2296 xml/xsl-fo Docbook XMLファイルをPDFに変換

XMLは標準一般化マークアップ言語(SGML)のサブセットなので、ドキュメントスタイル構文規程言語(DSSSL)等のSGML用の広範なツールで処理できます。

表11.9 仮想化ツールのリスト

パッケージ ポプコン サイズ キーワード 説明
openjade * V:0.5, I:3 1212 dsssl ISO/IEC 10179:1996標準DSSSLプロセッサ(最新版)
openjade1.3 * V:0.02, I:0.18 2336 dsssl ISO/IEC 10179:1996標準DSSSLプロセッサ(1.3.x版)
jade * V:0.5, I:2 1056 dsssl James Clarkの標準DSSSLプロセッサ(1.2.x版)
docbook-dsssl * V:0.7, 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.09 216 SGML/dsssl DSSSLスタイルシートを使うSGMLやXMLからの変換ソフト

ティップ

GNOMEyelp is sometimes handy to read DocBook XML files directly since it renders decently on X.

11.2.3. XMLデーター抽出

他のフォーマットから以下を使うとHTMLとかXMLのデーターを抽出出来ます。

表11.10 テキストデーター変換ツールのリスト

パッケージ ポプコン サイズ キーワード 説明
wv * V:1.3, I:3 2136 MSWord→any Microsoft WordからHTMLやLaTeX等への文書変換ソフト
texi2html * V:0.4, I:3 2076 texi→html TexinfoからHTMLへの変換ソフト
man2html * V:0.2, I:1.4 372 manpage→html manpageからHTMLへの変換ソフト(CGIサポート)
tex4ht * V:0.3, I:2 932 tex↔html (La)TeXとHTML間の変換ソフト
xlhtml * V:0.5, I:1.4 184 MSExcel→html MSExcel .xlsからHTMLへの変換ソフト
ppthtml * V:0.5, I:1.4 120 MSPowerPoint→html MSPowerPointからHTMLへの変換ソフト
unrtf * V:0.4, I:1.0 276 rtf→html RTFからHTML等への文書変換ソフト
info2www * V:0.5, I:1.3 156 info→html GNU infoからHTMLへの変換ソフト(CGIサポート)
ooo2dbk * V:0.03, I:0.2 941 sxw→xml OpenOffice.org SXW文書からDocBook XMLへの変換ソフト
wp2x * V:0.01, I:0.08 240 WordPerfect→any WordPerfect 5.0と5.1ファイルからTeXとLaTeXとtroffとGMLとHTMLへの変換ソフト
doclifter * V:0.00, I:0.04 420 troff→xml troffからDocBook XMLへの変換ソフト

非XMLのHTMLファイルの場合は、これらを整合性あるXMLであるXHTMLに変換できます。XHTMLはXMLツールで処理できます。

表11.11 仮想化ツールのリスト

パッケージ ポプコン サイズ キーワード 説明
libxml2-utils * V:5, I:51 156 xml↔html↔xhtml xmllint(1) (シンタクスチェック、リフォーマット、整形、他)を含むコマンドラインXMLツール
tidy * V:1.4, I:12 108 xml↔html↔xhtml HTMLシンタックスチェックソフトとリフォーッマトソフト

一度訂正なXMLが生成されれば、XSLT技術を使ってマークアップの文脈他に基づきデーターを抽出出来ます。

11.3. 印刷可能データー

Debianシステム上では印刷可能なデーターはPostScriptフォーマットで表現されます。共通Unix印刷システム(CUPS)は非PostScriptプリンタ用のラスタ化のバックエンドプログラムとしてGhostscriptを使用します。

11.3.1. Ghostscript

印刷データー処理の核心はラスタ画像を生成するGhostscriptというPostScript (PS)インタープリタです。

最新のArtifexからのアップストリーム版Ghostscriptは統合リリースである8.60リリースにてAFPLからGPLにライセンス変更され最新のESPバージョンによるCUPS関連等の変更をマージしました。

表11.12 Ghostscript PostScriptインタープリタのリスト

パッケージ ポプコン サイズ 説明
ghostscript * V:18, I:53 3180 GPL版Ghostscript PostScript/PDFインタープリタ
ghostscript-x * V:14, I:32 176 GPL版Ghostscript PostScript/PDFインタープリタ - Xディスプレーサポート
gs-cjk-resource * I:0.4 4652 gs-cjk用リソースファイル、Ghostscript CJK-TrueType拡張
cmap-adobe-cns1 * I:0.4 1620 Adobe-CNS1用CMaps(繁体中国語サポート)
cmap-adobe-gb1 * I:0.4 1612 Adobe-GB1用CMaps(簡体中国語サポート)
cmap-adobe-japan1 * I:0.9 2508 Adobe-Japan1用CMaps(日本語標準サポート)
cmap-adobe-japan2 * I:0.4 444 Adobe-Japan2用CMaps(日本語拡張サポート)
cmap-adobe-korea1 * I:0.2 920 Adobe-Korea1用CMaps(韓国語サポート)
libpoppler5 * I:11 2352 xpdf PDFビューワー準拠PDFレンダリングライブラリー
libpoppler-glib4 * V:5, I:13 492 PDFレンダリングライブラリー (GLib準拠共有ライブラリー)
poppler-data * I:0.5 12488 PDFレンダリングライブラリー用CMaps(CJKサポート: Adobe-*)

ティップ

"gs -h"とするとGhostscriptの設定が表示されます。

11.3.2. 2つのPSやPDFファイルをマージ

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

注記

PDFは、クロスプラットフォームの印刷可能フォーマットとして広範に使われていて、本質的にいくつかの追加機能や拡張された圧縮されたPSフォーマットです。

ティップ

コマンドラインの場合、psutilsパッケージ中のpsmerge(1)等のコマンドはPostScript文書を操作するのに便利です。pdfjamパッケージ中のコマンドはPDF文書を操作するのに便利です。pdftkパッケージのpdftk(1)もPDF文書を操作するのに便利です。

11.3.3. 印刷可能データーユーティリティー

印刷可能なデーターに用いる次のパッケージが著者の目に止まりました。

表11.13 プリントできるデーターのユーティリティーのリスト

パッケージ ポプコン サイズ キーワード 説明
poppler-utils * V:7, I:50 524 pdf→ps,text,… PDFユーティリティー: pdftops, pdfinfo, pdfimages, pdftotext, pdffonts
psutils * V:3, I:24 408 ps→ps PostScript文書変換ツール
poster * V:2, I:13 80 ps→ps PostScriptページから大きなポスターを作る
xpdf-utils * V:1.4, I:6 4688 pdf→ps,text,… PDFユーティリティー: pdftops, pdfinfo, pdfimages, pdftotext, pdffonts
enscript * V:2, I:18 2444 text→ps, html, rtf ASCIIテキストからPostScriptかHTMLかRTFかPretty-Printへの変換
a2ps * V:1.7, I:9 4288 text→ps 全てをPostScriptに変換するソフトと綺麗印刷ソフト
pdftk * V:0.8, I:4 192 pdf→pdf PDF文書変換ツール: pdftk
mpage * V:0.2, I:1.8 224 text,ps→ps シートに複数ページを印刷
html2ps * V:0.2, I:1.9 260 html→ps HTMLからPostScriptへの変換ソフト
pdfjam * V:0.3, I:1.8 112 pdf→pdf PDF文書変換ツール: pdf90, pdfjoin, pdfnup
gnuhtml2latex * V:0.09, I:0.7 24 html→latex html からlatexへの変換ソフト
latex2rtf * V:0.16, I:1.0 544 latex→rtf LaTeXからMS Wordで読めるRTFへと文書変換
ps2eps * V:1.3, I:11 116 ps→eps PostScriptからEPS(カプセル化済みPostScript)への変換ソフト
e2ps * V:0.02, I:0.14 188 text→ps 日本語符号化サポート付きのTextからPostScriptへの変換ソフト
impose+ * V:0.03, I:0.19 180 ps→ps PostScriptユーティリティー
trueprint * V:0.03, I:0.16 188 text→ps 多くのソースコード(C, C++, Java, Pascal, Perl, Pike, Sh, Verilog)のPostScriptへの綺麗印刷(C言語)
pdf2svg * V:0.08, I:0.4 60 ps→svg PDFからスケール可のベクトルグラフィクス(SVG)フォーマットへの変換ソフト
pdftoipe * V:0.02, I:0.18 648 ps→ipe PDFからIPEのXMLフォーマットへの変換ソフト

11.3.4. CUPSを使って印刷

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"等の印刷オプションを使ってカスタム化できます。

11.4. タイプセッティング

Unixのtroffプログラムは最初AT&Tで開発されました。それはマンページを作成するのに通常使われます。

Donald Knuth氏によって作成されたTeXは非常に強力な組版ツールでデファクト標準です。最初Leslie Lamport氏によって書かれたLaTeXはTeXの力への高レベルアクセスそ可能にします。

表11.14 タイプ設定ツールのリスト

パッケージ ポプコン サイズ キーワード 説明
texlive * I:10 120 (La)TeX 組版、校正、印刷のためのTeXシステム
groff * V:0.9, I:7 9352 troff GNU troff テキストフォーマティングシステム

11.4.1. roffタイプセッティング

伝統的には、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"でフィルターします。

11.4.2. TeX/LaTeX

TeX Liveソフトウエアーディストリビューションは完全なTeXシステムを提供します。texliveメタパッケージは、ほとんどの一般的タスクに十分なTeX Liveパッケージのまともな選択を提供します。

There are many references available for TeXLaTeXに関する多くの参考書があります。

  • The teTeX HOWTO: The Linux-teTeX Local Guide
  • tex(1)
  • latex(1)
  • "The TeXbook"、Donald E. Knuth著(Addison-Wesley)
  • "LaTeX - A Document Preparation System"、Leslie Lamport著(Addison-Wesley)
  • "The LaTeX Companion"、GoossensとMittelbachとSamarin著(Addison-Wesley)

これはもっとも強力な組版環境です。多くのSGML処理ソフトはこれをバックエンドのテキスト処理ソフトとしています。多くの人がEmacsVimをソースのエディターとして使う一方、lyxパッケージが提供するLyxtexmacsパッケージが提供するGNU TeXmacsは洒落たLaTeXWYSIWYG編集環境を提供します。

多くのオンラインリソースが利用可能です。

文書が大きくなると、TeXはエラーを発生する事があります。この問題の解決には"/etc/texmf/texmf.cnf" (or more appropriately edit "/etc/texmf/texmf.d/95NonPath"中のプールの数を増やしupdate-texmf(8))を実行しなければいけません。

注記

"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の入力の非常に良い例です!

11.4.3. マニュアルページを綺麗に印刷

次のコマンドでマンページをPostScriptで上手く印刷できます。

$ man -Tps some_manpage | lpr
$ man -Tps some_manpage | mpage -2 | lpr

二番目の例は一枚のシートに2ページ印刷します。

11.4.4. マニュアルページの作成

Although writing a manual page (manpage) in the plain プレーンなtroffフォーマットでマンページ(マニュアル ページ)を書く事は可能ですが、それを作成するヘルパーパッケージがあります。

表11.15 マンページ作成を補助するパッケージのリスト

パッケージ ポプコン サイズ キーワード 説明
docbook-to-man * V:0.5, I:3 248 SGML→manpage DocBook SGMLからroff manマクロへの変換ソフト
help2man * V:0.14, I:1.1 276 text→manpage --helpからの自動マンページ生成ソフト
info2man * V:0.02, I:0.15 204 info→manpage GNU infoからPODかマンページへの変換ソフト
txt2man * V:0.03, I:0.2 88 text→manpage ベタのASCIIテキストからマンページ形式へ変換

11.5. メールデーター変換

テキストデーター変換のための次のパッケージが著者の目に止まりました。

表11.16 メールデーター変換を補助するパッケージのリスト

パッケージ ポプコン サイズ キーワード 説明
sharutils * V:3, I:46 948 メール shar(1)とunshar(1)とuuencode(1)とuudecode(1)
mpack * V:2, I:37 84 MIME MIMEメッセージの符号化と逆符号化のソフト: mpack(1)とmunpack(1)
tnef * V:0.5, I:1.5 164 ms-tnef Microsoftのみのフォーマットの"application/ms-tnef"タイプのMIMEアタッチメントを開梱
uudeview * V:0.2, I:1.3 132 メール 次のフォーマットのエンコーダーとデコーダー: uuencode, xxencode, BASE64, quoted printable, BinHex
readpst * V:0.05, I:0.3 228 PST MicrosoftのOutlook PSTファイルからmboxフォーマットへ変換

ティップ

インターネットメッセージアクセスプロトコル バージョン4(IMAP4)サーバー(「POP3/IMAP4サーバー」参照)は、プロプライエタリメールシステムのクライアントソフトがIMAP4サーバーも使えるように設定できる場合、プロプライエタリメールシステムからメールを取り出すのに利用できるかもしれません。

11.5.1. メールデーターの基本

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.6. グラフィクスデーターツール

印刷可能なデーターに用いる次のパッケージが著者の目に止まりました。

表11.17 画像データーツールのリスト

パッケージ ポプコン サイズ キーワード 説明
gimp * V:12, I:47 13472 画像(bitmap) GNUイメージ操作プログラム
imagemagick * V:14, I:34 316 画像(bitmap) 画像操作プログラム
graphicsmagick * V:1.5, I:3 3696 画像(bitmap) 画像操作プログラム(imagemagickのフォーク)
xsane * V:6, I:39 748 画像(bitmap) GTK+に基づくSANE(Scanner Access Now Easy)用のX11フロントエンド
netpbm * V:4, I:25 4408 画像(bitmap) 画像変換ツール
icoutils * V:0.06, I:0.4 200 png↔ico(bitmap) MS WindowsのアイコンやカーソールとPNGフォーマット間の変換(favicon.ico)
xpm2wico * V:0.02, I:0.11 80 xpm→ico(bitmap) XPMからMS Windowsアイコンフォーマットへの変換
scribus * V:0.5, I:3 26864 ps/pdf/SVG/… Scribus DTPエディター
openoffice.org-draw * V:19, I:43 9256 画像(vector) OpenOffice.org office スイート - ドロー
inkscape * V:11, I:30 87444 画像(vector) SVG(スケーラブルベクトルグラフィクス)エディター
dia-gnome * V:1.4, I:3 620 画像(vector) ダイアグラムエディター(GNOME)
dia * V:2, I:5 620 画像(vector) ダイアグラムエディター(Gtk)
xfig * V:1.8, I:4 1684 画像(vector) X11下でインテラクティブ生成するソフト
pstoedit * V:1.3, I:10 880 ps/pdf→画像(vector) PostScriptとPDFファイルから編集可能なベクトルグラフィクスへの変換ソフト(SVG)
libwmf-bin * V:1.1, I:9 88 Windows/画像(vector) Windowsメタファイル(ベクトル画像データー)変換ツール
fig2sxd * V:0.04, I:0.2 200 fig→sxd(vector) XFigファイルをOpenOffice.org Drawフォーマットに変換
unpaper * V:0.2, I:1.5 736 画像→画像 OCR用のスキャンしたページの後処理ツール
tesseract-ocr * V:0.5, I:2 3200 画像→テキスト HPの商用OCRエンジンの基づくフリーのOCRソフトウエアー
tesseract-ocr-eng * V:0.2, I:1.3 1760 画像→テキスト OCRエンジンデーター: tesseract-ocrの英文用言語ファイル
gocr * V:1.0, I:6 480 画像→テキスト フリーOCRソフト
ocrad * V:0.7, I:6 364 画像→テキスト フリーOCRソフト
gtkam * V:0.3, I:1.9 1348 画像(Exif) デジタルカメラ写真を操作(GNOME) - GUI
gphoto2 * V:0.4, I:2 1008 画像(Exif) デジタルカメラ写真ファイルを操作(GNOME) - コマンドライン
kamera * V:0.9, I:18 236 画像(Exif) デジタルカメラ写真を操作(KDE)
jhead * V:0.6, I:3 128 画像(Exif) Exifに準拠のJPEG(デジタルカメラ写真)ファイルの非画像部を操作
exif * V:0.2, I:1.7 184 画像(Exif) JPEGファイル中のEXIF情報を表示するコマンドラインユーティリティー
exiftags * V:0.16, I:1.0 248 画像(Exif) デジタルカメラのJPEGファイルからExifタグを読むユーティリティー
exiftran * V:0.4, I:2 92 画像(Exif) デジタルカメラのjpeg画像を変換
exifprobe * V:0.08, I:0.5 484 画像(Exif) デジタル写真からメタデーターを読み出す
dcraw * V:1.1, I:6 408 画像(Raw)→ppm 生のデジタルカメラ画像のデコード
findimagedupes * V:0.07, I:0.4 140 画像→fingerprint 視覚的に類似もしくは複製の画像を発見
ale * V:0.02, I:0.18 768 画像→画像 忠実度を上げたりモザイクを作成するための画像のマージ
imageindex * V:0.03, I:0.3 192 画像(Exif)→html イメージから静的なHTMLギャラリーを生成
f-spot * V:0.6, I:1.9 8972 画像(Exif) 個人写真管理アプリケーション(GNOME)
bins * V:0.03, I:0.2 2008 画像(Exif)→html XMLとEXIFタグを使って静的HTML写真アルバムを作成
galrey * V:0.01, I:0.15 116 画像(Exif)→html 閲覧可能なサムネイル付きHTML写真アルバム生成
outguess * V:0.03, I:0.14 252 jpeg,png 普遍的Steganographicツール
qcad * V:1.1, I:2 3828 DXF CADデーターエディター(KDE)
blender * V:0.6, I:3 28952 blend, TIFF, VRML, … アニメーション等用の3Dコンテントエディター
open-font-design-toolkit * I:0.02 36 ttf, ps, … オープンフォントデザイン用のメタパッケージ
fontforge * V:0.3, I:1.9 6436 ttf, ps, … PSとTrueTypeとOpenTypeのフォント用フォントエディター
xgridfit * V:0.00, I:0.06 972 ttf TrueTypeフォントをグリッドフィッティングヒンティング用のプログラム
gbdfed * V:0.01, I:0.13 536 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で必ず機能します。「リムーバブルストレージデバイス」参照下さい。

11.7. その他のデーター変換

多くのデーター変換プログラムがあります。aptitude(8)で"~Guse::converting"という正規表現(「aptitudeを使った探索方法」参照)を使い次のプログラムが私の目に止まりました。

表11.18 その他のデーター変換ツールのリスト

パッケージ ポプコン サイズ キーワード 説明
alien * V:1.4, I:11 248 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

第12章 プログラミング

パッケージされたソースコードを追跡するのに十分な範囲でDebianシステム上でプログラムを学ぶ人への指針を示します。次はプログラムの関して特記すべきパッケージと対応する文書パッケージです。

表12.1 プログラムをすることを補助するパッケージのリスト

パッケージ ポプコン サイズ 文書
autoconf * V:4, I:27 2220 autoconf-docが提供する"info autoconf
automake * V:3, I:20 1840 automake1.10-docが提供する"info automake"
bash * V:91, I:99 3596 bash-docが提供する"info bash"
bison * V:2, I:16 1504 bison-docが提供する"info bison"
cpp * V:43, I:84 76 cpp-docが提供する"info cpp"
ddd * V:0.4, I:3 3848 ddd-docが提供する"info ddd"
exuberant-ctags * V:1.2, I:6 324 exuberant-ctags(1)
flex * V:2, I:16 1004 flex-docが提供する"info flex"
gawk * V:28, I:32 2112 gawk-docが提供する"info gawk"
gcc * V:16, I:69 64 gcc-docが提供する"info gcc"
gdb * V:5, I:28 4584 gdb-docが提供する"info gdb"
gettext * V:8, I:49 7368 gettext-docが提供する"info gettext"
gfortran * V:1.1, I:6 40 gfortran-docが提供する"info gfortran"
glade * V:0.4, I:2 1405 メニューが提供するヘルプ
glade-gnome * V:0.12, I:1.3 434 メニューが提供するヘルプ
libc6 * V:96, I:99 9932 glibc-docglibc-doc-referenceが提供する"info libc"
make * V:21, I:75 1588 make-docが提供する"info make"
mawk * V:66, I:99 244 mawk(1)
perl * V:89, I:99 18368 perl-docperl-doc-htmlが提供するperl(1)とhtml
python * V:60, I:97 636 python-docが提供するpython(1)とhtmlページ
tcl8.4 * V:6, I:45 3332 tcl8.4-docが提供するtcl(3)と詳細なマンページ
tk8.4 * V:5, I:35 2712 tk8.4-docが提供するtk(3)と詳細なマンページ
ruby * V:8, I:23 100 riが提供するruby(1)と詳細なマンページ
vim * V:14, I:31 1732 vim-docが提供するヘルプ(F1)メニュー
susv2 * I:0.03 48 "The Single Unix Specifications v2"を取得
susv3 * I:0.08 48 "The Single Unix Specifications v3"を取得

オンラインリファレンスはmanpagesmanpages-devパッケージをインストールした後で"man name"とタイプすると使えます。GNUツールのオンラインリファレンスは該当する文書パッケージをインストールした後で"info program_name"とタイプすると使えます。一部のGFDL文書はDSFGに準拠していないと考えられているのでmainアーカイブに加えてcontribnon-freeアーカイブを含める必要があるかもしれません。

警告

"test"を実行可能なテストファイルの名前に用いてはいけません。"test"はシェルのビルトインです。

注意

ソースから直接コンパイルしたソフトウエアープログラムは、システムプログラムとかち合わないように、"/usr/local"か"/opt"の中にインストールします。

ティップ

"99ボトルのビールの歌"作成のコード例はほとんど全てのプログラム言語に関する理解のための非常に好適です。

12.1. シェルスクリプト

シェルスクリプトは実行ビットがセットされたテキストファイルで、以下に示すフォーマットのコマンドを含んでいます。

#!/bin/sh
 ... コマンド行

最初の行はこのファイル内容を読み実行するシェルインタープリタを指定します。

シェルスクリプトを読むのはUnix的なシステムがどのように機能しているのかを理解する最良の方法です。ここでは、シェルプログラムに関する指針や心がけを記します。失敗から学ぶために"シェルの失敗" (http://www.greenend.org.uk/rjk/2001/04/shell.html)を参照下さい。

シェル対話モード(「シェルプロンプト」「Unix的テキスト処理」参照)と異なり、シェルスクリプトは変数や条件文やループを繁用します。

12.1.1. POSIXシェル互換性

多くのシステムスクリプトはPOSIXシェル(表1.13「シェルプログラムのリスト」参照)のどれで解釈されるか分かりません。システムのデフォールトシェルは実際のプログラムをさしているシムリンクである"/bin/sh"です。

  • bash(1)、lenny以前の場合
  • dash(1)、squeeze以降の場合

全てのPOSIXシェル間でポータブルとするためにbashismszshismsを使うシェルスクリプトを書くのを避けましょう。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}
8進表記: "\377" 16進表記: "\xff"

"echo"コマンドはその実装がシェルビルトインや外部コマンド間で相違しているので次の注意点を守って使わなければいけません。

  • 特に"-e"と"-E"のコマンドオプション使用を回避します。
  • "-n"以外のどのコマンドオプション使用をも回避します。
  • 文字列中にエスケープシーケンスはその取扱いに相違があるので使用をを避けます。

注記

"-nオプションは実はPOSIXシンタックスではありませんが、一般的に許容されています。

ティップ

出力文字列にエスケープシーケンスを埋め込む必要がある場合には、"echo"コマンドの代わりに"printf"コマンドを使います。

12.1.2. シェル変数

特別なシェルパラメーターがシェルスクリプト中ではよく使われます。

表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} 最長のプリフィクスパターンを削除

12.1.3. シェル条件式

各コマンドは条件式に使えるエグジットステイタスを返します。

  • 成功: 0 ("真")
  • エラー: 非0 ("偽")

注記

シェル条件文の文脈中の"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"です。

12.1.4. シェルループ

POSIXシェル中で使われるループの慣用句があります。

  • "for x in foo1 foo2 … ; do コマンド ; done"は"foo1 foo2 …"リストの項目を変数"x"にアサインし"コマンド"を実行してループします。
  • "while 条件 ; do コマンド ; done"は"条件"が真の場合"コマンド"を繰り返します。
  • "until 条件 ; do コマンド ; done"は"条件"が真でない場合"コマンド"を繰り返します。
  • "break"に出会うと、ループからの脱出が出来ます。
  • "continue"に出会うと、次のループ初めに戻りループを再開する。

ティップ

C言語のような数字の繰り返しは"foo1 foo2 ..."生成にseq(1)使って実現します。

12.1.5. シェルコマンドライン処理シーケンス

シェルはおおよそ次のシーケンスでスクリプトを処理します。

  • シェルは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"オプションで起動すると、シェルは実行するコマンドを全てプリントするようになります。これはデバグをするのに非常に便利です。

12.1.6. シェルスクリプトのためのユーティリティープログラム

Debianシステム上でできるだけポータブルなシェルプログラムとするにはessentialパッケージで提供されるユーティリティープログラムだけにユーティリティープログラムを制約するのが賢明です。

  • "aptitude search ~E"はessential(必須)パッケージをリストします。
  • "dpkg -L <パッケージ名> |grep '/man/man.*/'"は<パッケージ名>パッケージによって提供されるコマンドのマンページをリストします。

表12.8 シェルスクリプト用の小さなユーティリティープログラムを含むパッケージのリスト

パッケージ ポプコン サイズ 説明
coreutils * V:91, I:99 11792 GNUコアユーティリティー
debianutils * V:92, I:99 220 Debian限定の雑ユーティリティー
bsdmainutils * V:73, I:99 756 FreeBSD由来の追加ユーティリティー集
bsdutils * V:72, I:99 184 4.4BSD-Lite由来の基本ユーティリティー
moreutils * V:0.2, I:1.4 208 追加のUnixユーティリティー

ティップ

moreutilsはDebianの外では存在しないかも知れませんが、興味深い小さなプログラムを提供します。もっとも特記すべきは、sponge(8)です。「正規表現を使ったグローバル置換」を参照下さい。

12.1.7. シェルスクリプトダイアログ

簡単なシェルプログラムのユーザーインターフェースは、echoreadコマンドを使った退屈な相互作用からいわゆる対話(dialog)プログラム等の一つを使うことでよりよい相互作用になります。

表12.9 ユーザーインターフェースプログラムのリスト

パッケージ ポプコン サイズ 説明
x11-utils * V:24, I:51 592 xmessage(1): window中にメッセージや質問を表示(X)
whiptail * V:45, I:99 100 シェルスクリプトからユーザーフレンリーなダイアログボックスを表示(newt)
dialog * V:5, I:26 1508 シェルスクリプトからユーザーフレンリーなダイアログボックスを表示(ncurses)
zenity * V:8, I:44 4952 シェルスクリプトからグラフィカルなダイアログボックスを表示(gtk2.0)
ssft * V:0.01, I:0.11 152 シェルスクリプトフロントエンドツール(gettextを使ったzenityやkdialogやdialogのラッパー)
gettext * V:8, I:49 7368 "/usr/bin/gettext.sh": メッセージ翻訳

12.1.8. zenityを使うシェルスクリプト例

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"のようなコマンド設定をしたローンチャを作るのも面白いかもしれません。

12.2. Make

Makeはプログラムのグループを管理するためのユーティリティーです。make(1)を実行すると、makeは"Makefile"というルールーファイルを読み、ターゲットが最後に変更された後で変更された前提ファイルにターゲットが依存している場合やターゲットが存在しない場合にはターゲットを更新します。このような更新は同時並行的にされるかもしれません。

ルールファイルのシンタックスは次です。

ターゲット: [ 前提 ... ]
 [TAB]  command1
 [TAB]  -command2 # エラー無視
 [TAB]  @command3 # エコー抑制

上記で、" [TAB] "はTABコードです。各行はmakeによる変数置換後シェルによって解釈されます。スクリプトを継続する行末には"\"を使います。シェルスクリプトの環境変数のための"$"を入力するためには"$$"を使います。

ターゲットや前提に関するインプリシット(暗黙)ルールは、例えば次のように書けます。

%.o: %.c header.h

上記で、ターゲットは"%" という文字を(1つだけ)含んでいます。"%"は実際のターゲットファイル名の空でないいかなる部分文字列ともマッチします。前提もまた同様にそれらの名前が実際のターゲットファイル名にどう関連するかを示すために"%"を用いることができます。

表12.10 makeの自動変数のリスト

自動変数 変数値
$@ ターゲット
$< 最初の前提条件
$? 全ての新規の前提条件
$^ 全ての前提条件
$* "%"はターゲットパターンの軸にマッチします

表12.11 make変数の展開のリスト

変数展開 説明
foo1 := bar 一回だけの展開
foo2 = bar 再帰的展開
foo3 += bar 後ろに追加

"make -p -f/dev/null"を実行して自動的な内部ルールを確認下さい。

12.3. C

Cプログラム言語で書かれたプログラムをコンパイルする適切な環境を次のようにして設定できます。

# aptitude 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)
  • Kernighan &amp; Ritchie著, "The C Programming Language", 第2版(Prentice Hall)

12.3.1. 単純なCプログラム(gcc)

簡単な例の"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)を使います。

12.4. デバグ

デバグは重要なプログラム活動です。プログラムのデバグをどうしてするかを知っていることで、あなたも意味あるバグリポートを作成できる良いDebianユーザーになれます。

12.4.1. 基本的なgdb実行

Debian上の第一義的デバッガは、実行中のプログラムを検査できるようにするgdb(1)です。

gdbと関連プログラムを次のようにインストールしましょう。

# aptitude 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)コマンドは省略できます。タブ展開はシェル同様に機能します。

12.4.2. Debianパッケージのデバグ

Debianシステムではデフォールトではインストールされたバイナリーはストリップされているべきなので、通常のパッケージではほとんどのデバグシンボルが削除されています。gdb(1)を使ってDebianパッケージをデバグするには、対応する*-dbgパッケージをインストールする必要があります(例えばlibc6の場合libc6-dbg)。

デバグしようとしているパッケージに*-dbgパッケージが無い場合は、次のようにしてリビルドした後でインストールする必要があります。

$ mkdir /path/new ; cd /path/new
$ sudo aptitude update
$ sudo aptitude dist-upgrade
$ sudo aptitude 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"が使われているようにします。

12.4.3. バックトレースの収集

プログラムがクラッシュするのに出会った場合に、バックトレース情報をバグレポートに切り貼りして報告するのは良い考えです。

バックトレースは次のような段取りで得られます。

  • gdb(1)の下でプログラム実行します。
  • クラッシュを再現します。

    • gdbプロンプトに落ちて戻るようになります。
  • gdbプロンプトで "bt"とタイプします。

プログラムがフリーズした場合には、gdbを実行しているターミナルでCtrl-Cを押すことでプログラムをクラッシュさせてgdbプロンプトが得られます。

ティップ

しばしば、一番上数行が"malloc()"か"g_malloc()"中にあるバックトレースを見かけます。こういったことが起こる場合は、大体あまりあなたのバックトレースは役に立ちません。有用な情報を見つけるもっとも簡単な方法は環境変数"$MALLOC_CHECK_"の値を2と設定することです(malloc(3))。gdbを実行しながらこれを実行するには次のようにします。

 $ MALLOC_CHECK_=2 gdb hello

12.4.4. 上級gdbコマンド

表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")

12.4.5. Xエラーのデバグ

GNOMEプログラムpreview1がXエラーを受けると、次のようなメッセージが見つかります。

The program 'preview1' received an X Window System error.

このような場合には、プログラムを"--sync"付きで実行して、バックトレースを得るために"gdk_x_error"関数上で停止するようにしてみましょう。

12.4.6. ライブラリーへの依存の確認

次のように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`された環境内で使える必要があります。

「プログラム活動の追跡」を参照下さい。

12.4.7. メモリーリーク検出ツール

Debianにはメモリーリークを検出するプログラムがいくつか存在します。

表12.13 メモリーリーク検出ツールのリスト

パッケージ ポプコン サイズ 説明
libc6-dev * V:43, I:68 11088 mtrace(1): glibc中のmallocデバッグ機能
valgrind * V:1.2, I:6 142954 メモリーデバッガとプロファイラ
kmtrace * V:0.3, I:2 264 glibcのmtrace(1)を使うKDEメモリーリークトレースソフト
alleyoop * V:0.06, I:0.4 1000 メモリーチェックソフトのGNOMEフロントエンド
electric-fence * V:0.06, I:0.9 108 malloc(3)デバッガ
leaktracer * V:0.01, I:0.11 116 C++プログラム用のメモリーリーク追跡ソフト
libdmalloc5 * V:0.01, I:0.2 356 メモリーアロケーションのデバグ用ライブラリー
mpatrolc2 * V:0.01, I:0.02 3592 メモリーアロケーションをデバグするライブラリー

12.4.8. 静的コード分析ツール

静的コード分析用のlintのようなツールがあります。

表12.14 静的コード分析ツールのリスト

パッケージ ポプコン サイズ 説明
splint * V:0.07, I:0.5 1836 Cプログラムを静的にバグのチェックするためのツール
rats * V:0.05, I:0.2 876 セキュリティーの大まかな監査ツール(C, C++, PHP, Perl, Python コード)
flawfinder * V:0.02, I:0.19 192 C/C++ソースコードを検査してセキュリティーの脆弱性を探すツール
perl * V:89, I:99 18368 静的コードチェックソフト付きのインタープリタ: B::Lint(3perl)
pylint * V:0.10, I:0.5 552 Pythonコード静的チェックソフト
jlint * V:0.01, I:0.10 184 Javaプログラム静的チェックソフト
weblint-perl * V:0.12, I:0.8 28 HTML用のシンタックス最小限の文体チェックソフト
linklint * V:0.05, I:0.3 432 高速リンクチェックソフトとウェッブサイトメンテツール
libxml2-utils * V:5, I:51 156 XMLファイルを検証するxmllint(1)を含むユーティリティー

12.4.9. バイナリーのディスアッセンブリー

次のようにobjdump(1)を使ってバイナリーコードをディスアッセンブルできます。

$  objdump -m i386 -b binary -D /usr/lib/grub/x86_64-pc/stage1

注記

gdb(1)は対話的にコードをディスアッセンブルするのに使えます。

12.5. Flex — 改良版Lex

FlexLex互換の高速字句解析生成ソフトです。

flex(1)の入門書は"info flex"の中にあります。

自分で作った"main()"と"yywrap()"を供給する必要があります。そうでない場合にはあなたのflexプログラムは次のようでなければライブラリー無しにコンパイル出来ません。これというのは"yywrap"はマクロで、"%option main"とすると"%option noyywrap"が暗示的に有効になるからです。

%option main
%%
.|\n    ECHO ;
%%

上記の代わりにとして、cc(1)のコマンドラインの最後に(ちょうどAT&T-Lexが"-ll"付きであるように)"-lfl"リンカーオプションを使いコンパイルすることが出来ます。この場合、"%option"は必要なくなります。

12.6. Bison — 改良版Yacc

Yacc互換の前方参照可能なLRパーサーとかLALRパーサー生成ソフトは、いくつかのパッケージによってDebian上で提供されています。

表12.15 Yacc互換のLALRパーサー生成ソフトのリスト

パッケージ ポプコン サイズ 説明
bison * V:2, I:16 1504 GNU LALRパーサー生成ソフト
byacc * V:0.12, I:1.2 160 Berkeley LALRパーサー生成ソフト
btyacc * V:0.00, I:0.06 248 byaccに基づいたバックトラッキング機能付きパーサー生成ソフト

bison(1)の入門書は"info bison"の中にあります。

あなた自身の"main()"と"yyerror()"を供給する必要があります。"main()"は、しばしばFlexによって提供される"yylex()"を呼び出す"yyparse()"を呼び出します。

%%

%%

12.7. Autoconf

Autoconfは自動的にソフトウエアーのソースコードパッケージをGNUのビルドシステムを使って種々様々なUnix的システムに適応させるためのシェルスクリプトを作成するツールです。

autoconf(1)は"configure"という設定プログラムを作成します。"configure"は"Makefile.in"を雛形として使って自動的にカスタム化した"Makefile"を作成します。

12.7.1. プログラムをコンパイルとインストール

警告

システムファイルをあなたがコンパイルしたプログラムでインストールする時に上書きしてはいけません。

Debianは"/usr/local/"とか"/opt"中のファイルに触れません。プログラムをソースからコンパイルする場合、Debianとかち合わないようにそれを"/usr/local/"の中にインストールします。

$ cd src
$ ./configure --prefix=/usr/local
$ make
$ make install # this puts the files in the system

12.7.2. プログラムのアンインストール

オリジナルのソースを保有し、それがautoconf(1)/automake(1)と使用しあなたがそれをどう設定したかを覚えているなら、次のように実行してソフトウエアーをアンイストールします。

$ ./configure ''all-of-the-options-you-gave-it''
# make uninstall

この代わりに、"/usr/local/"の下にだけインストールプロセスがファイルを置いたことが絶対に確実frそこに重要なものが無いなら、次のようにしてその内容を消すことが出来ます。

# find /usr/local -type f -print0 | xargs -0 rm -f

どこにファイルがインストールされるか良く分からない場合には、checkinstallパッケージにあるcheckinstall(8)を使いアンインストールする場合クリーンなパスとなるようにすることを考えましょう。これは"-D"オプションを使うとDebianパッケージを作成できます。

12.8. 究極の短いPerlスクリプト

どんな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ゴルフが面白いです。

12.9. ウェッブ

基本的な対話式動的ウェッブページは次のようにして作られます。

  • 質問(クエリー)はブラウザーのユーザーにHTMLフォームを使って提示されます。
  • フォームのエントリーを埋めたりクリックすることによって次の符号化されたパラメーター付きの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"
  • URL中の"%nn"は16進数でnnの値の文字と置き換えられます。
  • 環境変通は次のように設定されます: "QUERY_STRING="VAR1=VAL1 VAR2=VAL2 VAR3=VAL3"".
  • ウェッブサーバー上のCGIプログラム("program.*"のいずれでも)が環境変数"$QUERY_STRING"とともに起動されます。
  • CGIプログラムのiSTDOUT(標準出力)がウエブブラウザーに送られ対話式の動的なウェッブページとして表示されます。

セキュリティー上、CGIパラメーターを解釈する手作りの急ごしらえのプログラムは作らない方が賢明です。PerlやPythonにはこのための確立したモジュールが存在します。PHPはこの様な機能とともに提供されます。クライアントでのデーターのストレージの必要がある場合、HTTPクッキーが使われます。クライアント再度のデーター処理が必要な場合、Javascriptが良く使われます。

詳しくは、Common Gateway InterfaceThe Apache Software FoundationJavaScriptを参照下さい。

http://www.google.com/search?hl=en&ie=UTF-8&q=CGI+tutorialをURLとして直接ブラウザーのアドレスに入れGoogleで"CGI tutorial"を検索するとグーグルサーバー上のCGIスクリプトが動いているのを観察する良い例です。

12.10. ソースコード変換

ソースコード変換するプログラムがあります。

表12.16 ソースコード変換ツールのリスト

パッケージ ポプコン サイズ キーワード 説明
perl * V:89, I:99 18368 AWK→PERL AWからPERLへのソースコード変換シフト: a2p(1)
f2c * V:0.15, I:1.1 448 FORTRAN→C FORTRAN 77からC/C++へのソースコード変換ソフト: f2c(1)
protoize * V:0.00, I:0.06 132 ANSI C CコードからANSIプロトタイプを生成/削除
intel2gas * V:0.01, I:0.08 344 intel→gas NASM (Intelフォーマット)からGNU Assembler (GAS)への変換ソフト

12.11. Debianパッケージ作成

Debianパッケージを作りたい場合には、次を読みましょう。

dh-makedh-make-perl等のようなパッケージングを補助するパッケージもあります。

付録A 補遺

以下が本文書の背景です。

A.1. Debian迷路

Linuxシステムはネットワーク化されたコンピューターのための非常にパワフルなコンピュータープラットフォームです。しかし、Linuxの全能力を利用する方法を学ぶことはたやすいことではありません。非PostScriptプリンタが接続されたLPRプリンタの設定がこんなつまずく点の良い例でした。(新規インストレーションではCUPSシステムが使われるのでもうこの様な問題はありません。)

"ソースコード"という完全かつ詳細なマップが存在します。これは非常に正確ですが理解することが難しいものです。また、HOWTOやmini-HOWTOと呼ばれるリファレンスもあります。これらは理解はしやすいのですが、詳細過ぎて全体像を失いがちです。ちょっとコマンドを実行する必要がある時に、長大なHOWTOの該当する章を探すのには骨が折れることが時々あります。

この"Debianリファレンス(第2版)"がDebian迷路の真っ只中にいる皆様にとって解決の糸口となることを望みます。

A.2. 著作権の経緯

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"によって陳腐化
  • "Debian Tutorial" Havoc Pennington著。 (1998年12年11日)

    • Oliver ElphickとOle TetlieとJames TreacyとCraig SawyerとIvan E. Moore IIによる一部著作
    • "Debian GNU/Linux: Guide to Installation and Usage"によって陳腐化
  • "Debian GNU/Linux: Guide to Installation and Usage" John Goerzen and Ossama Othman著(1999年)

    • "Debianリファレンス(第1版)"によって陳腐化

パッケージやアーカイブに関する記述はそのオリジンやインスピレーションの一部を次に遡ることができます。

  • "Debian FAQ" (Josip Rodinが維持していた2002年3月版)

他の内容はそのオリジンやインスピレーションを次に遡ることができます。

  • "Debianリファレンス (第1版)" 青木 修著 (2001年〜2007年)

    • この新しい "Debianリファレンス(第2版)"によって陳腐化

以前の "Debianリファレンス(第1版)" は次によって作られました。

  • ネットワーク設定に関する大部分の内容はThomas Hoodが寄稿
  • X と VCS に関連するかなりの内容は Brian Nelson が寄稿
  • ビルドスクリプトや多くの内容に関する訂正で Jens Seidel が寄与
  • David Sewell による徹底的な校正
  • 翻訳者やコントリビューターやバグ報告者達による多くの寄与

Debianシステム上の多くのマニュアルページやinfoページが本文書を書く上での第一義的参照情報として使われました。青木 修が公正な使用と考える範囲内で、それらの多くの部分、特にコマンドの定義が、本文書の文体と目的に合うように注意深い編集をした後、断片的文言として使われました。

gdbデバッガーに関する記述はArii PollakとLoïc MinierとDafydd Harriesの了承のもとbacktraceに関するDebian wikiの内容を拡張して使いました。

既に上記で触れた項目を除くほとんどの"Debianリファレンス(第2版)"の内容は私自身の仕事です。これらはコントリビュータ−によっても更新されています。

"Debianリファレンス(第1版)"は、角田 慎一さんがすべて日本語訳しました。

"Debianリファレンス(第2版)"は、英文原著者の青木修自身がすべてを日本語訳しました。その際に"Debianリファレンス(第1版)"から内容が比較的変更されていない「第1章 GNU/Linuxチュートリアル」等では、角田さんの旧訳文を青木が文体や内容を調整した上で一部再利用させて頂きました。

著者である青木 修は本文書を世に送ることにご助力戴いた皆様に感謝いたします。

A.3. 文書のフォーマット

英語のオリジナル文書のソースはAsciiDocのテキストファイルを用いて書かれました。AsciiDocは直接XMLを書くより手間がかからないのとテーブルを分かりやすいフォーマットで入力出きるので使われています。XMLとPOファイルを真のソースファイルと考えて下さい。ビルドスクリプトによってDocBook XMLソースに変換され、更に自動的に生成されるデーターを埋め込み最終的なDocBook XMLソースとされました。本文書はHTML,plaintext,PostScriptと,PDFとして見ることができます。現在はHTMLとプレーンテキストへの変換のみが有効とされています。