Debianリファレンス 青木修 [FAMILY Given] 製作著作 © 2007-2009 Osamu Aoki(青木修) 本Debianリファレンス(第2版) (2009-10-24 04:04:08 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. カーネルソースのコンパイル: Debian標準手法 9.7.5. モジュールソースのコンパイル: Debian標準手法 9.7.6. カーネルソースのコンパイル:古典的方法 9.7.7. Non-freeハードウエアードライバー 9.8. 仮想化システム 9.8.1. 仮想化ツール 9.8.2. Chrootシステム 9.8.3. chrootのためのloginの設定 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. ディスクをマウントせずに操作 10.2.7. データーの冗長性 10.2.8. データーファイルの復元と事故の証拠解析 10.2.9. ISO9660イメージファイル作成 10.2.10. CD/DVD-R/RWに直接書込み 10.2.11. ISO9660イメージファイルをマウント 10.2.12. 大きなファイルを小さなファイルに分割 10.2.13. ファイル内容の消去 10.2.14. ダミーファイル 10.2.15. ハードディスクの全消去 10.2.16. 削除されたがまだオープン中のファイルの復活法 10.2.17. 全てのハードリンクを検索 10.2.18. 見えないディスクスペースの消費 10.3. データーセキュリティーのインフラ 10.3.1. Gnupgのためのキー管理 10.3.2. GnuPGをファイルに使用 10.3.3. MuttでGnuPGを使用 10.3.4. VimでGnuPGを使用 10.3.5. MD5和 10.4. ソースコードマージツール 10.4.1. ソースファイル間の相違の抽出 10.4.2. ソースファイルに更新をマージ 10.4.3. 3方マージによる更新 10.5. バージョンコントロールシステム 10.5.1. VCSコマンドの比較 10.6. CVS 10.6.1. CVSレポジトリーの設定 10.6.2. CVSへのローカルアクセス 10.6.3. pserverを使ったCVSへのリモートアクセス 10.6.4. sshを使ったCVSへのリモートアクセス 10.6.5. 新規ソースをCVSにインポート 10.6.6. CVSレポジトリーのファイルパーミッション 10.6.7. CVSのワークフロー 10.6.8. CVSから最新ファイル 10.6.9. CVSの管理運営 10.6.10. CVSチェックアウトの実行ビット 10.7. Subversion 10.7.1. Subversionレポジトリーの設定 10.7.2. Apach2サーバーの経由のSubversionアクセス 10.7.3. グループによるSubversionへのローカルアクセス 10.7.4. グループによるSubversionへのSSH経由のリモートア クセス 10.7.5. Subversionディレクトリー構造 10.7.6. 新規ソースをSubversionにインポート 10.7.7. Subversionのワークフロー 10.8. Git 10.8.1. Gitクライアントの設定 10.8.2. Gitリファレンス 10.8.3. Gitコマンド 10.8.4. 設定履歴記録のためのGit 11. データー変換 11.1. テキストデーター変換ツール 11.1.1. テキストファイルをiconvを使って変換 11.1.2. iconvを使ってファイル名変換 11.1.3. 行末変換 11.1.4. タブ変換 11.1.5. 自動変換付きエディター 11.1.6. プレーンテキスト抽出 11.1.7. プレーンテキストデーターをハイライトとフォーマッ ト 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. bsdmainutilsとcoreutilsパッケージ中のタブ変換コマンドのリ スト 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版)(2009-10-24 04:04:08 UTC)はシステム インストール後のユーザー向け案内書としてDebianのシステム管理に関 する概論の提供を目指しています。 本書が対象とする読者は、GNU/Linuxシステムがどう機能するかを理解 するのに、シェルスクリプトぐらいは学ぶ気はあるが、全てのCのソー スまで読む気がない人です。 1. 免責事項 一切保証は致しません。全ての商標はそれぞれの商標の所有者の財産で す。 Debianシステム自体は動く標的です。このため最新状況を反映した正確 な記述は困難です。現行の不安定版のDebianシステムを用いて本書は記 していますが、皆様が読まれる時点ではすでに記載内容が古くなってい るでしょう。 本書はあくまで二次的参考文献として扱って下さい。本書は正式の案内 書を置き換えません。著者及び本書への貢献者は本書中の誤謬や欠落や 曖昧さが引き起こす結果に一切責任を負いません。 2. Debianとはなにか Debianプロジェクトはフリーなオペレーティングシステムを作ろうとい う共通目的を持った個人の集団です。そのディストリビューションは次 の特徴があります。 ● ソフトウェアの自由へのコミットメント: Debian社会契約とDebian フリーソフトウエアーガイドライン(DFSG) ● インターネット上の分散型の無償ボランティア活動: http:// www.debian.org ● 多数のプリコンパイルされた高品質のソフトウエアー ● セキュリティーアップデートへの平易なアクセス提供による、安定 性とセキュリティーの重視 ● 不安定版unstableやテスト版testingアーカイブによる、最新のソ フトウエアーへの円滑なアップグレードの重視 ● 多数のサポートされたハードウエアーアーキテクチャー Debianの中のフリーソフトウエアー構成要素は、GNUやLinuxやBSDやXや ISCやApacheやGhostscriptやCommon Unix Printing System やSambaや GNOMEやKDEやMozillaやOpenOffice.orgやVimやTeXやLaTeXやDocBookや PerlやPythonやTclやJavaやRubyやPHPやBerkeley DBやMySQLや PostgreSQLやEximやPostfixやMuttやFreeBSDやOpenBSDやPlan 9やその 他の多くの独立のフリーソフトウエアーのプロジェクトに由来します。 Debianはこの多種多様なフリーソフトウエアーを1つのシステムにまと め上げます。 3. 本書について 3.1. 編集指針 本書の作成にあたり次の編集指針を守りました。 ● 概論を提供し枝葉末節は省略します。(全体像) ● 簡潔を心がけました(KISS) ● 車輪の再発明をしません。(既存の参考文献へのポインターの利用) ● 非GUIツールとコンソールを重視します。(シェル例示を使用) ● 客観的であるようにします。(ポプコン等の利用) ティップ 私はシステムの階層的側面やシステムの低レベルを明らかにしようとし ました。 3.2. 前提条件 警告 本文書だけに頼らず自分で答えを見出す努力をしっかりすることを期待 します。本文書は効率的なスタートポイントを提供するだけです。 一義的情報源から自分自身で解決策を探し出すべきです。 ● 一般的情報はhttp://www.debian.orgにあるDebianサイト ● "/usr/share/doc/"ディレクトリー下にある文書 ● Unixスタイルのマンページ: "dpkg -L |grep '/ man/man.*/'" ● GNUスタイルのinfoページ: "dpkg -L |grep '/ info/'" ● バグレポート: http://bugs.debian.org/ ● 変化中の事や特定案件に関しては、http://wiki.debian.org/にあ るDebianのWiki ● http://tldp.org/ にあるLinux文書プロジェクト(TLDP)のHOWTO文 書 ● http://www.unix.org/にあるOpen GroupのThe UNIX System Home PageにあるSingle UNIX Specification ● http://wikipedia.org/にあるWikipediaのフリーの百科事典 注意 詳細な文書を読むには、"-doc"をサフィクスとする対応する文書パッケ ージをインストールする必要があるかもしれません。 3.3. 文書様式 bash(1)シェルコマンドの例示をする次のような簡略化した表現スタイ ルで本書は情報を提供します。 # $ <ユーザーアカウントからのコマンド> これらのシェルプロンプトは使われるアカウントを区別します。これは ちょうど環境変数として: "PS1='\$'"と"PS2=' '"を設定した場合に相 当します。これらの環境変数値はあくまで本書の読みやすさのためで、 実際のインストール済みシステではほとんど見かけません。 注意 "PS1='\$'"と"PS2=' '"という環境変数値の意味はbash(1)を参照下さい 。 システム管理者が行うべきアクションは命令文で書かれています: 例え ば、「シェルに各コマンド文字列をタイプ後毎にエンターキーをタイプ します。」(必ずしも「〜しましょう。」とはせず簡潔に訳しています 。) 英語では、テーブル中の説明や類似のコラムには、パッケージ説明の慣 習に従い、定冠詞抜も不定冠詞も抜きの名詞句が入ります。これらには 、マンページのコマンドの短い説明の慣習に従った頭の"to"抜きの不定 詞句が代わりに名詞句として入ることもあります。変だなとお考えの方 もあるとは存じますが、これは本文書をできるだけ簡潔にするための著 者の恣意的な文体の選択です。(対応部分を文切り型の名詞句的表現に 訳しています。) 注意 コマンド名を含めて固有名詞はその位置によらず大文字・小文字の区別 を保持します。 本文中に引用されるコマンドの断片はダブルクォーテションマーク間に タイプライターフォントで書き"aptitude safe-upgrade"のように表現 されます。 本文中に設定ファイルから引用された文字データーはダブルクォーテシ ョンマーク間にタイプライターフォントで書き"deb-src"のように表現 されます。 コマンドはその名前をタイプライターフォントで書き、場合によっては その後ろにマンページのセクション番号を括弧中に入れて書きbash(1) のように表現されます。読者は次の様にタイプして情報を得るように心 がけて下さい。 $ man 1 bash マンページはその名前をタイプライターフォントで書き、その後ろにマ ンページのセクション番号を括弧中に入れて書きsources.list(5)のよ うに表現されます。読者は次の様にタイプして情報を得るように心がけ て下さい。 $ man 5 sources.list infoページはダブルクォーテションマーク間にタイプライターフォント というコマンドの断片形式で書き"info make"のように表現されます。 読者は次の様にタイプして情報を得るように心がけて下さい。 $ info make ファイル名はダブルクォーテションマーク間にタイプライターフォント で書き"/etc/passwd"のように表現されます。読者は次の様にタイプし て情報を得るように心がけて下さい。 $ sensible-pager "/etc/passwd" ディレクトリー名はダブルクォーテションマーク間にタイプライターフ ォントで書き"/etc/init.d/"のように表現されます。読者は次の様にタ イプして情報を得るように心がけて下さい。 $ mc "/etc/init.d/" パッケージ名はその名をタイプライターフォントで書き"vim"のように 表現されます。読者は次の様にタイプして情報を得るように心がけて下 さい。 $ dpkg -L vim $ apt-cache show vim $ aptitude show vim 文書は、その場所のファイル名でダブルクォーテションマーク間にタイ プライターフォントで書き"/usr/share/doc/sysv-rc/ README.runlevels.gz"や"/usr/share/doc/base-passwd/ users-and-groups.html"のように表現されたり、その場所のURLでhttp: //www.debian.orgのように表現されます。読者は次の様にタイプして情 報を得るように心がけて下さい。 $ zcat "/usr/share/doc/sysv-rc/README.runlevels.gz" | sensible-pager $ sensible-browser "/usr/share/doc/base-passwd/users-and-groups.html" $ sensible-browse "http://www.debian.org" 環境変数は、頭に"$"がついた名前をダブルクォーテションマーク間に タイプライターフォントで書き、"$TERM"のように表現されます。読者 は次の様にタイプして情報を得るように心がけて下さい。 $ echo "$TERM" 3.4. Debian BTS 各パッケージの後ろについている"*"は、各パッケージのDebianバグト ラッキングシステム(BTS)にリンクされています。 3.5. ポプコン ポプコンのデーターは各パッケージの客観的人気の指標として提示され います。それがダウンロードされた日付は2009-10-02 17:49:56 UTCで 、 98248を越すバイナリーパッケージ数と19のアーキテクチャーにまた がる86828つの提出レポートからなります。 注意 amd64の不安定版unstableアーカイブは現在高々26849つのパッケージし か含みません。ポプコンデーターは多くの旧式設置システムからのレポ ートを含みます。 "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 ● "Unix IS user friendly... It's just selective about who its friends are." 「Unixはユーザーフレンドリー(使う人に優しい)で す... 誰にフレンドリー(優しく)にするかの人見知りするだけです 。」 --- Tollef Fog Heen 第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: GNOMEやKDEのようなGUI環境をインストールした場合には、Ctrl-Alt-F1 とすることでloginプロンプトが出て、Alt-F7とすることでGUI環境に戻 れます(詳細は下記の項1.1.6. 「仮想コンソール」参照)。 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"タスクを選定しGNOMEのgdm とともにX Windowシステムをインストールした場合には、システムの起 動するとグラフィカルなloginプロンプトのスクリーンが表示されます 。あなたのユーザー名とパスワードを入力することで非特権ユーザーア カウントにloginできます。タブ(tab)を用いたりマウスの第一クリック を用いるとユーザー名とパスワードの間を行き来できます。 gnome-terminal(1)やrxvt(1)やxterm(1)のようなx-terminal-emulator プログラムをXの下で起動するとシェルプロンプトが得られます。GNOME デスクトップ環境下では、"Applications" → "Accessories" → "Terminal"とクリックしてもうまくいきます。 次の項1.1.6. 「仮想コンソール」も参照下さい. デスクトップ環境(例えばfluxbox)次第ではメニューの起点がよく分か らないことがあります。そんな時はスクリーンの中央を(右)クリックし てメニューが表示されることを期待しましょう。 1.1.3. rootアカウント rootアカウントはスーパーユーザーとか特権ユーザーとも呼ばれます。 このアカウントからは次のようなシステム管理活動ができます。 ● ファイルパーミッションによらずシステム上の任意ファイルに関し ての、読出し・書込み・削除 ● システム上のいかなるファイルに関して、ファイルの所有者やパー ミッション設定 ● システム上の非特権ユーザーのパスワードを設定 ● パスワード無しに任意アカウントへのlogin rootアカウントの権限を使うには、この無制限の権限ゆえ配慮と責任あ る行動が求められます。 警告 rootのパスワードを他人に決して教えてはいけません。 注意 ファイル(Debianシステムにとってはファイルの一種であるCD-ROM等の ハードウエアーデバイスも含む)パーミッションは、非rootユーザーに よるそのファイルの使用やアクセスをできなくなくすることがあります 。この様な状況の下ではrootアカウントを使うことが簡便なテスト法で すが、問題解決はファイルパーミッションとユーザーのグループのメン バーシップを適切に設定する必要があります(項1.2.3. 「ファイルシス テムのパーミッション」参照)。 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シェルプロンプトから起動 できます。項1.1.4. 「rootシェルプロンプト」 and 項7.8.4. 「Xクラ イアントをrootで実行」を参照下さい。 警告 gdm(1)等のディスプレーマネージャーのプロンプトにrootと入力して、 Xディスプレー/セッションマネージャーをrootアカウントのもとで決し て起動してはいけません。 警告 クリチカルな情報が表示されている際には、あなたのXスクリーンを覗 き見られるかもしれないのでリモートの信頼できないGUIプログラムを 決して実行してはいけません。 1.1.6. 仮想コンソール デフォールトのDebianシステムでは、6つの切り替え可能なVT100様の文 字コンソールがあり、Linuxホスト上で直接コマンドシェルを起動でき るようになっています。GUI環境下でない場合は、Left-Alt-keyとF1 — F6の中の一つのキーを同時に押すことで仮想コンソール間の切り替えが できます。仮想ターミナルそれぞれに独立したアカウントでログインす ることができ、。マルチユーザー環境を提供します。このマルチユーザ ー環境はUnixの偉大な機能で、癖になります。 X Windowシステムの下では、Ctrl-Alt-F1キーを押す、つまり left-Ctrl-keyとleft-Alt-keyとF1-keyキーを同時に押すと文字コンソ ール1にアクセスできます。通常仮想コンソール7で実行されているX WindowシステムへはAlt-F7を押すことにより戻れます。 これとは別の方法で、例えば仮想ターミナル1という今とは違う仮想タ ーミナルへの変更がコマンドラインから出来ます。 # chvt 1 1.1.7. コマンドプロンプトからの退出方法 コマンドプロンプトでCtrl-D、つまりleft-Ctrl-keyとd-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-keyと left-Alt-KeyとDeleteの同時押し)を入力するシャットダウン方法もあ ります。 項6.9.6. 「SSH上のリモートシステムをシャットダウンする方法」を参 照下さい。 1.1.9. まともなコンソールの復元 例えば"cat "のような変な事をした後でスクリーン が無茶苦茶になった場合、コマンドプロンプトに"reset"と入力して下 さい。このときコマンドを入力してもスクリーンには読み取れる表示が されないかもしれません。"clear"とすればスクリーンが消去できます 。 1.1.10. 初心者向け追加パッケージの提案 デスクトップ環境タスク抜きの最小限インストレーションDebianシステ ムですら基本的なUnix機能は提供されますが、コマンドラインやcurses に基づくmcやvim等のいくつかの文字ターミナルパッケージをaptitude (8)を使って次のように追加インストールすることから始めることを初 心者にお薦めします。 # aptitude update ... # aptitude install mc vim sudo ... 既にこれらのパッケージがインストールされている場合には、新しいパ ッケージはインストールされません。 表 1.1. 興味あるテキストモードのプログラムパッケージのリスト ┌────────┬──────┬─────┬────────────────────────────────────────┐ │パッケー│ポプコ│サイ │説明 │ │ジ │ン │ズ │ │ ├────────┼──────┼─────┼────────────────────────────────────────┤ │mc * │V:12, │6452 │テキストモードの全画面ファイルマネージャ│ │ │I:27 │ │ー │ ├────────┼──────┼─────┼────────────────────────────────────────┤ │sudo * │V:43, │612 │ユーザーに限定的なroot権限を与えるプログ│ │ │I:73 │ │ラム │ ├────────┼──────┼─────┼────────────────────────────────────────┤ │ │V:14, │ │UnixテキストエディターVi IMproved(改良版│ │vim * │I:30 │1684 │Vi)、プログラマーのためのテキストエディ │ │ │ │ │ター(標準版) │ ├────────┼──────┼─────┼────────────────────────────────────────┤ │vim-tiny│V:18, │ │UnixテキストエディターVi IMproved(改良版│ │* │I:91 │760 │Vi)、プログラマーのためのテキストエディ │ │ │ │ │ター(軽量版) │ ├────────┼──────┼─────┼────────────────────────────────────────┤ │emacs22 │V:4, │11020│GNUプロジェクトEmacs、Lispに基づく拡張可│ │* │I:7 │ │能なテキストエディター(22版) │ ├────────┼──────┼─────┼────────────────────────────────────────┤ │emacs23 │V:1.0,│13272│GNUプロジェクトEmacs、Lispに基づく拡張可│ │* │I:1.8 │ │能なテキストエディター(23版) │ ├────────┼──────┼─────┼────────────────────────────────────────┤ │w3m * │V:29, │1964 │テキストモードWWWブラウザー │ │ │I:84 │ │ │ ├────────┼──────┼─────┼────────────────────────────────────────┤ │gpm * │V:3, │564 │テキストコンソール上のUnix式のカットアン│ │ │I:4 │ │ドペースト(daemon) │ └────────┴──────┴─────┴────────────────────────────────────────┘ いくつかの参考資料を読むのも良いことです。 表 1.2. 有用な文書パッケージのリスト ┌────────────────────┬─────┬─────┬─────────────────────────────┐ │パッケージ │ポプ │サイ │説明 │ │ │コン │ズ │ │ ├────────────────────┼─────┼─────┼─────────────────────────────┤ │doc-debian * │I:83 │376 │Debianプロジェクトの文書、 │ │ │ │ │(Debian FAQ)他 │ ├────────────────────┼─────┼─────┼─────────────────────────────┤ │debian-policy * │I:3 │2748 │Debianポリシーマニュアルと関 │ │ │ │ │連文書 │ ├────────────────────┼─────┼─────┼─────────────────────────────┤ │developers-reference│I:1.2│1352 │Debian開発者のためのガイドラ │ │* │ │ │インと情報 │ ├────────────────────┼─────┼─────┼─────────────────────────────┤ │maint-guide * │I:0.8│644 │Debian新メンテナ向けガイド │ ├────────────────────┼─────┼─────┼─────────────────────────────┤ │debian-history * │I:0.4│2544 │Debianプロジェクトの歴史 │ ├────────────────────┼─────┼─────┼─────────────────────────────┤ │debian-faq * │I:52 │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システム管理者ガイド │ ├────────────────────┼─────┼─────┼─────────────────────────────┤ │ │ │ │Linux: Ruteユーザーのためのチ│ │rutebook * │I:0.2│8264 │ュートリアルと解説書 │ │ │ │ │(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ファイルシステム」(基本コンセプト) ● 項1.3. 「ミッドナイトコマンダー(MC)」(サバイバル手法) ● 項1.4. 「基本のUnix的作業環境」(基本手法) ● 項1.5. 「シェルプロンプト」(シェルのメカニズム) ● 項1.6. 「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-11やCP/MやOpenVMSやMS-DOSやAmigaOSやMicrosoft Windowsと 違う点です。(但し、通常のファイルシステム中に物理デバイスを 示すディレクトリー項目はあります。項1.2.2. 「ファイルシステ ムの内側」参照。) 注意 ほとんど全ての文字や記号をファイル名中に使えますが、実際そうする ことは賢明ではありません。スペースやタブや改行や他の特殊文字:{ } ( ) [ ] ' ` " \ / > < | ; ! # & ^ * % @ $はコマンドラインで特別 な意味を持つので避けるべきです。名前の中の単語間には、ピリオドや ハイフンや下線を選んで区別します。各語頭を"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 foo # chgrp foo # chmod [ugoa][+-=][rwxXst][,...] foo 例えば次のようにするとディレクトリーツリーの所有者をユーザーfoo に変更しグループbarで共有できます。 # cd /some/location/ # chown -R foo:bar . # chmod -R ug+rwX,o=rX . 更に特殊なパーミッションビットが3つ存在します。 ● セットユーザーIDビット(ユーザーのxに代えてsかS) ● セットグループIDビット(グループのxに代えてsかS) ● スティッキビット(他ユーザーのxに代えてtかT) ここで、これらのビットの"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はファイル作成日時ではありません。 ● ファイルが上書きされると、ファイルのmtimeとctimeとatimeの属 性すべてが変更されます。 ● ファイルの所有者やパーミッションの変更をすると、ファイルの ctimeやatime アトリビュートを変えます。 ● ファイルを読むとファイルの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"の出力のカスタム化は項9.2.5. 「時間と日付のカスタム化表示 」を参照下さい。 1.2.7. リンク "foo"というファイルを異なるファイル名"bar"に結びつけるのには2つ の方法があります。 ● ハードリンク ○ 既存ファイルの重複名 ○ "ln foo bar" ● シンボリックリンクもしくはシムリンク ○ 他のファイルをその名前で指す特殊ファイル ○ "ln -s foo bar" リンク数の変化とrmコマンドの結果の微妙な違いについての次の例をご 覧下さい。 $ echo "Original Content" > foo $ ls -li foo 2398521 -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:15 foo $ ln foo bar # hard link $ ln -s foo baz # symlink $ ls -li foo bar baz 2398521 -rw-r--r-- 2 penguin penguin 17 2007-04-29 08:15 bar 2398538 lrwxrwxrwx 1 penguin penguin 3 2007-04-29 08:16 baz -> foo 2398521 -rw-r--r-- 2 penguin penguin 17 2007-04-29 08:15 foo $ rm foo $ echo "New Content" > foo $ ls -li foo bar baz 2398521 -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:15 bar 2398538 lrwxrwxrwx 1 penguin penguin 3 2007-04-29 08:16 baz -> foo 2398540 -rw-r--r-- 1 penguin penguin 12 2007-04-29 08:17 foo $ cat bar Original Content $ cat baz New Content ハードリンクは同一ファイルシステム内に作れ、ls(1)コマンドに"-i" オプションを使って表示されるinode番号が同じです。 シンボリックリンクは上の例に示したように、常にファイルアクセスパ ーミッション"rwxrwxrwx"を持ちますので、シンボリックリンクが指す ファイルのアクセスパーミッションが有効ファイルアクセスパーミッシ ョンとなります。 注意 もし特段の理由がないなら複雑なシンボリックリンクやハードリンクを 作らない方が一般的には良いでしょう。シンボリックリンクの論理的組 み合わせがファイルシステム中でループになっているという悪夢を引き 起こすかもしれません。 注意 もしハードリンクを使う特段の理由がなければ、ハードリンクよりシン ボリックリンクを使う方が一般的には良いでしょう。 "."ディレクトリーは、それ自身が中にあるディレクトリーとリンクし ていますので、新規ディレクトリーのリンク数は2から始まります。 ".."ディレクトリーは親ディレクトリーとリンクしているので、ディレ クトリーのリンク数は新規サブディレクトリーの増加に伴い増加します 。 もし最近あなたがWindowsからLinuxに移動してきたなら、Unixのファイ ル名のリンクはWindows上でもっとも似ている"shortcuts"との比較で如 何にうまくできているかにすぐ気づくでしょう。ファイルシステム中に 実装されているのでアプリケーションからはリンクされたファイルなの かオリジナルなのかの区別がつきません。ハードリンクの場合は実際全 く違いはありません。 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.5.8. 「典型的なコマンドシーケンスとシェルリディレクション」参照)。 1.2.12. procfsとsysfs procfsとsysfsは"/proc"や"/sys"上にマウントされる仮想ファイルシス テムであり、カーネルの内部データー構造をユーザー空間にさらけ出し ます。言い換えると、オペレーティングシステムのオペレーションへの 便利なのぞき窓となると言う意味で仮想といえます。 "/proc"ディレクトリー中には、システム上で実行されている各プロセ スに対応したそのプロセスID(PID)の名前がついたサブディレクトリー 他があります。プロセス情報をアクセスするps(1)のようなシステムユ ーティリティーはこのディレクトリー構造からその情報を得ています。 "/proc/sys/"の下のディレクトリーには実行時のカーネル変数を変更す るインターフェースがあります。(専用のsysctl(8)コマンドもしくはそ の起動/設定ファイル"/etc/sysctrl.conf"によっても同様のことができ ます。) 注意 Linuxカーネルが"Too many open files"とエラーを出力することがあり ます。rootのシェルから、例えば"echo "65536" > /proc/sys/fs/ file-max"等と"file-max"の値をより大きな値に増加することで解決で きます。(旧式カーネルではこれが必要でした。) 特にあるファイル - "/proc/kcore" - に気づくと、パニックになる人 がよくいます。これは一般に巨大です。これは(おおよそ)コンピュータ ーのメモリーの内容のコピーです。これは kernel をデバッグするのに 用いられます。コンピューターのメモリーを指す仮想ファイルなので、 そのサイズに関して心配する必要は全くありません。 "/sys"の下のディレクトリーはカーネルから引き出されたデーター構造 、その属性、それらの関連を含んでいます。一部カーネル変数を実行時 に変更する機構もまた含まれたりします。 linux-doc-2.6.*パッケージで供給されるLinuxカーネル文書("/usr/ share/doc/linux-doc-2.6.*/Documentation/filesystems/*")中の "proc.txt(.gz)"や"sysfs.txt(.gz)"や関連する他の文書を参照下さい 。 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の表示の問題が解消しない際には、項9.6.6. 「ターミナル の設定」を参照下さい。 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-EnterとAlt-Enterはファイル名をコマンドラインにコピーし ます。コマンドライン編集と一緒にcp(1)やmv(1)コマンドで御使用 下さい。 ● Alt-Tabはシェルファイル名の自動展開の選択肢を表示します。 ● MCの引数で両ウィンドウのスタートディレクトリーを指定できます 。例えば"mc /etc /root"。 ● Esc + n-key → Fn (つまり、Esc + 1 → F1、等々、Esc + 0 → F10) ● Escをキーの前に押すのはAltをキーと同時に押すのと同様の効果が あります。つまり、Esc + c はAlt-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-キーを押して仮想コンソールを切替えて、 "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を押すと、適切なプログラムがファイル内容を処 理します(項9.5.11. 「スタートするプログラムのカスタム化」参照)。 これは非常に便利な 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, │3100 │はい │Bash: GNU Bourne Again SHell(事実│ │ │I:99 │ │ │上の標準シェル) │ ├──────┼────────┼─────┼──────┼─────────────────────────────────┤ │tcsh *│V:7, │736 │いいえ│TENEX C Shell: 拡張バージョンの │ │ │I:46 │ │ │Berkeley csh │ ├──────┼────────┼─────┼──────┼─────────────────────────────────┤ │dash *│V:13, │236 │はい │DebianのAlmquistシェル、シェルス │ │ │I:21 │ │ │クリプトに好適 │ ├──────┼────────┼─────┼──────┼─────────────────────────────────┤ │zsh * │V:2, I:5│12960│はい │Z shell: 多くの拡張された標準シェ│ │ │ │ │ │ル │ ├──────┼────────┼─────┼──────┼─────────────────────────────────┤ │pdksh │V:0.2, │468 │はい │パブリックドメインバージョンの │ │* │I:1.2 │ │ │Kornシェル │ ├──────┼────────┼─────┼──────┼─────────────────────────────────┤ │csh * │V:0.5, │404 │いいえ│OpenBSDのCシェル、Berkeley cshの │ │ │I:1.8 │ │ │派生 │ ├──────┼────────┼─────┼──────┼─────────────────────────────────┤ │sash *│V:0.2, │836 │はい │組み込みコマンド付きの独立シェル │ │ │I:1.0 │ │ │(標準の"/bin/sh"には不向き) │ ├──────┼────────┼─────┼──────┼─────────────────────────────────┤ │ksh * │V:0.4, │2860 │はい │真のAT&TバージョンのKornシェル │ │ │I:1.5 │ │ │ │ ├──────┼────────┼─────┼──────┼─────────────────────────────────┤ │rc * │V:0.11, │204 │いいえ│AT&T Plan 9のrcシェルの実装 │ │ │I:0.8 │ │ │ │ ├──────┼────────┼─────┼──────┼─────────────────────────────────┤ │posh *│V:0.01, │232 │はい │ポリシー準拠の通常シェル(pdkshの │ │ │I:0.13 │ │ │派生) │ └──────┴────────┴─────┴──────┴─────────────────────────────────┘ このチュートリアル章内では、インタラクティブなシェルは常に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章中の項9.2.7. 「着色化さ れたコマンド」等にあります。 1.4.3. 特別のキーストローク Unix的環境下では、特別の意味を持ったいくつかのキーストロークがあ ります。通常のLinuxの文字ターミナルでは左側のCtrlやAltキーのみが 期待にそって機能することに配慮下さい。次に特記すべき暗記するべき キーストロークを記します。 表 1.14. Bashのキーバインディングのリスト ┌──────────────────────────┬───────────────────────────────────┐ │キー │キーバインディングの説明 │ ├──────────────────────────┼───────────────────────────────────┤ │Ctrl-U │カーソールの前の1行を消去 │ ├──────────────────────────┼───────────────────────────────────┤ │Ctrl-H │カーソールの前の1文字を削除 │ ├──────────────────────────┼───────────────────────────────────┤ │Ctrl-D │入力を終了(シェルを使用中の場合、シ│ │ │ェルを終了) │ ├──────────────────────────┼───────────────────────────────────┤ │Ctrl-C │実行中のプログラムを終了 │ ├──────────────────────────┼───────────────────────────────────┤ │Ctrl-Z │プログラムをバックグラウンドジョブ │ │ │に移動し一時停止 │ ├──────────────────────────┼───────────────────────────────────┤ │Ctrl-S │スクリーンへの出力を停止 │ ├──────────────────────────┼───────────────────────────────────┤ │Ctrl-Q │スクリーンへの出力を再開 │ ├──────────────────────────┼───────────────────────────────────┤ │Ctrl-Alt-Del │システムをリブート/停止、inittab(5)│ │ │参照 │ ├──────────────────────────┼───────────────────────────────────┤ │Left-Altキー (もしくは、 │Emacsおよび同様のUIでのメタキー │ │Windowsキー) │ │ ├──────────────────────────┼───────────────────────────────────┤ │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的システムで人気のある、VimかEmacsプログラムのいずれかのバリ アントに習熟するべきです。 著者としてはVimコマンドに慣れることは正しいことだと考えています 。なぜならViエディターはLinux/Unixの世界では必ず存在するからです 。(実際はオリジナルのviか、新しいnviがどこででも見つけられるプロ グラムです。これにもかかわらずVimを著者が初心者のために選んだの は、より強力かつ動作が充分似ているのと、F1キーを通じてヘルプが表 示されるからです。) これとは違い、EmacsかXEmacsをエディターとして選ぶのも、特にプロ グラムをするには、非常に良い選択です。Emacsには、ニュースリーダ 機能、ディレクトリーの編集機能、メール機能他の、過多な機能があり ます。プログラミングやシェルスクリプトの編集に使うときは、作業中 のフォーマットをインテリジェントに認識し助力をしようとします。 Linux上で必要なプログラムはEmacsだけと考える人もいます。Emacsを 今10分間学ぶことは将来何時間もの節約になります。Emacsを学ぶ際に はGNUのEmacsマニュアルを持っておくことを高く推薦します。 これら全てのプログラムには練習しながら学べるようにチュータリング プログラムが普通付いてきます。Vimを"vim"とタイプして起動し、F1キ ーを押します。最初の35行を読みます。カーソールを"|tutor|"に移動 しCtrl-]を押してオンラインの訓練コースを始めます。 注意 VimやEmacsのような良いエディターは、正しいフォント設定がされた UTF-8ロケールの下の正しいオプションを使ったx-terminal-emulatorを 使うと、UTF-8や他のエギゾチックな符号化方式(エンコーディング)の テキストを正しく扱えます。マルチバイトテキストに関するそれぞれの 文書を参照下さい。 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"という環境変数を使ってどの エディターを使うかを決めます(項1.3.5. 「MCの内部エディター」と項 9.5.11. 「スタートするプログラムのカスタム化」参照)。Debianシス テムの整合性のために、これらを"/usr/bin/editor"と設定しましょう 。(歴史的には"$EDITOR"は"ed"で、"$VISUAL"は"vi"でした。) 1.4.8. Vimのカスタム化 vim(1)の挙動は"~/.vimrc"を使ってカスタム化できます。 例えば、次を試してみて下さい: " ------------------------------- " Local configuration " set nocompatible set nopaste set pastetoggle= 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 項9.2.3. 「シェルの活動を綺麗に記録」を参照下さい。 1.4.10. 基本Unixコマンド 基本的Unixコマンドを学びます。ここでは一般的意味で"Unix"を使って います。いかなるUnixクローンのOSも等価なコマンドを提供します。 Debianシステムも例外ではありません。今一部コマンドが思うように機 能しなくても心配しないで下さい。エアリアスがシェルで使われた場合 は、対応するコマンドの出力は変わります。次は順番に実行すると言う 意味の例ではありません。 非特権ユーザーのアカウントから次のコマンドを全て実行します。 表 1.16. 基本のUnixコマンドのリスト ┌─────────────┬────────────────────────────────────────────────┐ │コマンド │説明 │ ├─────────────┼────────────────────────────────────────────────┤ │pwd │カレント/ワーキングディレクトリーの名前を表示 │ ├─────────────┼────────────────────────────────────────────────┤ │whoami │現在のユーザー名を表示 │ ├─────────────┼────────────────────────────────────────────────┤ │id │現在のユーザーのアイデンティティ(名前とuidとgid │ │ │と関連するgroup)を表示 │ ├─────────────┼────────────────────────────────────────────────┤ │file │""ファイルのファイルタイプを表示 │ ├─────────────┼────────────────────────────────────────────────┤ │type -p │""コマンドのファイルの位置を表示 │ ││ │ ├─────────────┼────────────────────────────────────────────────┤ │which │, , │ ││ │ ├─────────────┼────────────────────────────────────────────────┤ │type │""コマンドに関する情報を表示 │ ││ │ ├─────────────┼────────────────────────────────────────────────┤ │apropos │""に関連したコマンドを発見 │ │ │ │ ├─────────────┼────────────────────────────────────────────────┤ │man -k │, , │ │ │ │ ├─────────────┼────────────────────────────────────────────────┤ │whatis │""コマンドに関する1行の説明を表示 │ ││ │ ├─────────────┼────────────────────────────────────────────────┤ │man -a │""コマンドに関する説明を表示(Unixス│ ││タイル) │ ├─────────────┼────────────────────────────────────────────────┤ │info │""コマンドに関する比較的長い説明を │ ││表示(GNUスタイル) │ ├─────────────┼────────────────────────────────────────────────┤ │ls │ディレクトリーの内容をリスト(非ドットファイルお │ │ │よびディレクトリー) │ ├─────────────┼────────────────────────────────────────────────┤ │ls -a │ディレクトリーの内容をリスト(全ファイルおよびデ │ │ │ィレクトリー) │ ├─────────────┼────────────────────────────────────────────────┤ │ls -A │ディレクトリーの内容をリスト(ほとんど全ファイル │ │ │およびディレクトリー、".."と"."をスキップ) │ ├─────────────┼────────────────────────────────────────────────┤ │ls -la │ディレクトリーの内容を詳細情報とともにリスト │ ├─────────────┼────────────────────────────────────────────────┤ │ls -lai │ディレクトリーの内容をinode番号と詳細情報ととも │ │ │にリスト │ ├─────────────┼────────────────────────────────────────────────┤ │ls -d │現ディレクトリーの中の全ディレクトリーをリスト │ ├─────────────┼────────────────────────────────────────────────┤ │tree │ファイルツリーの内容を表示 │ ├─────────────┼────────────────────────────────────────────────┤ │lsof │""ファイルのオープンの状態をリスト │ ├─────────────┼────────────────────────────────────────────────┤ │lsof -p │プロセスID: ""によってオープンされたファイ │ │ │ルをリスト │ ├─────────────┼────────────────────────────────────────────────┤ │mkdir │現ディレクトリー中に""という新規ディレクト │ │ │リー作成 │ ├─────────────┼────────────────────────────────────────────────┤ │rmdir │現ディレクトリー中の""というディレクトリー │ │ │を削除 │ ├─────────────┼────────────────────────────────────────────────┤ │ │現ディレクトリー中もしくは"$CDPATH"変数中にリス │ │cd │トされたディレクトリー中の""というディレク │ │ │トリーにディレクトリーを変更 │ ├─────────────┼────────────────────────────────────────────────┤ │cd / │ディレクトリーをルートディレクトリーに変更 │ ├─────────────┼────────────────────────────────────────────────┤ │cd │現在のユーザーのホームディレクトリーにディレクト│ │ │リーを変更 │ ├─────────────┼────────────────────────────────────────────────┤ │cd / │絶対ディレクトリーパス"/"にディレクトリーを│ │ │変更 │ ├─────────────┼────────────────────────────────────────────────┤ │cd .. │親ディレクトリーにディレクトリーを変更 │ ├─────────────┼────────────────────────────────────────────────┤ │cd ~ │ユーザー""のホームディレクトリーにディレク │ │ │トリーを変更 │ ├─────────────┼────────────────────────────────────────────────┤ │cd - │一つ前のディレクトリーにディレクトリーを変更 │ ├─────────────┼────────────────────────────────────────────────┤ │"を作成 │ │ │ │ ├─────────────┼────────────────────────────────────────────────┤ │cp │既存のファイル""を新規ファイル""にコピ│ │ │ー │ ├─────────────┼────────────────────────────────────────────────┤ │rm │ファイル""を削除 │ ├─────────────┼────────────────────────────────────────────────┤ │mv │既存のファイル""の名前を新しい名前""に│ │ │変更(ディレクトリー""が存在不可) │ ├─────────────┼────────────────────────────────────────────────┤ │mv │既存のファイル""を新しい場所"/"に│ │ │移動(ディレクトリー""が存在しなければいけな│ │ │い) │ ├─────────────┼────────────────────────────────────────────────┤ │ │既存のファイル""を新しい場所の新しい名前の │ │mv │ファイル"/"に移動(ディレクトリー"│ │/ │"が存在しなければいけないが、ディレクトリー" │ │ │/"は存在してはいけない) │ ├─────────────┼────────────────────────────────────────────────┤ │chmod 600 │既存のファイル""を他人から読出し不可かつ書 │ │ │込み不可(全員実行不可) │ ├─────────────┼────────────────────────────────────────────────┤ │chmod 644 │既存のファイル""を他人からは読出し可だが書 │ │ │込み不可(全員実行不可) │ ├─────────────┼────────────────────────────────────────────────┤ │chmod 755 │既存のファイル""を他人からは読出し可だが書 │ │ │込み不可(全員実行可能) │ ├─────────────┼────────────────────────────────────────────────┤ │find . -name │シェルで""にマッチするファイル名を探索 │ │ │(比較的遅い) │ ├─────────────┼────────────────────────────────────────────────┤ │locate -d . │シェルで""にマッチするファイル名を探索 │ │ │(定期的に生成されるデーターベースを使い比較的早 │ │ │い) │ ├─────────────┼────────────────────────────────────────────────┤ │grep -e " │現ディレクトリーにある".html"で終わる全ファイル │ │" │から""のパターンを検索し、該当する全フ │ │*.html │ァイルを表示 │ ├─────────────┼────────────────────────────────────────────────┤ │top │フルスクリーンを用いてプロセス情報を表示し、"q" │ │ │と押して終了 │ ├─────────────┼────────────────────────────────────────────────┤ │ps aux | │起動中の全プロセスの情報をBSDスタイルの出力を用 │ │pager │いて表示 │ ├─────────────┼────────────────────────────────────────────────┤ │ps -ef | │起動中の全プロセスの情報をSystem-Vスタイルの出力│ │pager │を用いて表示 │ ├─────────────┼────────────────────────────────────────────────┤ │ps aux | grep│"exim"もしくは"exim4"の起動中の全プロセスを表示 │ │-e "[e]xim4*"│ │ ├─────────────┼────────────────────────────────────────────────┤ │ps axf | │起動中の全プロセスの情報をASCIIアート出力を用い │ │pager │て表示 │ ├─────────────┼────────────────────────────────────────────────┤ │kill <1234> │プロセスID"<1234>"により識別されるプロセスを停止│ ├─────────────┼────────────────────────────────────────────────┤ │gzip │Lempel-Zivコーディング(LZ77)を用いて""を圧 │ │ │縮し".gz"を作成 │ ├─────────────┼────────────────────────────────────────────────┤ │gunzip │".gz"を解凍して""を作成 │ │.gz │ │ ├─────────────┼────────────────────────────────────────────────┤ │ │Burrows-Wheelerブロックソートテキスト圧縮アルゴ │ │bzip2 │リズムとHuffmanコーディングを用いて""を圧縮│ │ │し".bz2"を作成(gzipより高圧縮率) │ ├─────────────┼────────────────────────────────────────────────┤ │bunzip2 │".bz2"を解凍して""を作成 │ │.bz2 │ │ ├─────────────┼────────────────────────────────────────────────┤ │tar -xvf │".tar"アーカイブからファイルを展開 │ │.tar │ │ ├─────────────┼────────────────────────────────────────────────┤ │tar -xvzf │gzip圧縮された".tar.gz"アーカイブからファイ│ │.tar.gz │ルを展開 │ ├─────────────┼────────────────────────────────────────────────┤ │tar -xvf -j │".tar.bz2"アーカイブからファイルを展開 │ │.tar.bz2│ │ ├─────────────┼────────────────────────────────────────────────┤ │tar -cvf │フォルダ"/"の内容を".tar"アーカイブに │ │.tar │アーカイブ │ │/ │ │ ├─────────────┼────────────────────────────────────────────────┤ │tar -cvzf │フォルダ"/"の内容を".tar.gz"アーカイブ│ │.tar.gz │に圧縮アーカイブ │ │/ │ │ ├─────────────┼────────────────────────────────────────────────┤ │tar -cvjf │フォルダ"/"の内容を".tar.bz2"アーカイ │ │.tar.bz2│ブに圧縮アーカイブ │ │/ │ │ ├─────────────┼────────────────────────────────────────────────┤ │zcat │標準のページャーを用いて圧縮された"README.gz"の │ │README.gz | │内容を表示 │ │pager │ │ ├─────────────┼────────────────────────────────────────────────┤ │zcat │ │ │README.gz > │"README.gz"の内容を解凍してファイル"foo"を作成 │ │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"。 表 1.17. ロケールの値の3つの部分 ┌────────────┬─────────────────────────────────────┐ │ロケールの値│意味 │ ├────────────┼─────────────────────────────────────┤ │xx │ISO 639言語コード(小文字)、例えば"en"│ ├────────────┼─────────────────────────────────────┤ │YY │ISO 3166国コード(大文字)、例えば"US" │ ├────────────┼─────────────────────────────────────┤ │ZZZZ │コードセット、常に"UTF-8"と設定 │ └────────────┴─────────────────────────────────────┘ 言語コードと国コードは"info gettext"中の該当記述を参照下さい。 現代的なDebianシステム上では、十分な理由と必要な知見をもって歴史 的なコードセットを特段希望しない限り、常にコードセットをUTF-8と 設定すべきです。 ロケールの詳細に関しては、項8.3. 「ロケール」を参照下さい。 注意 "LANG=en_US"は、"LANG=C"でも、"LANG=en_US.UTF-8"でもありません。 それは"LANG=en_US.ISO-8859-1"です(項8.3.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/ │通常のユーザーシェルから実行されるプログラム │ │ │ │ ├──────────────┼───────────────────────────────────────────────┤ │/home/ │通常のユーザーのGUIデスクトップメニューから実行│ │ │されるプログラム │ ├──────────────┼───────────────────────────────────────────────┤ │/home/ │"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 | │command1の標準出力をcommand2の標準入力にパイプ(同 │ │command2 │時並行で実行) │ ├───────────┼──────────────────────────────────────────────────┤ │command1 2>│command1の標準出力と標準エラー出力をcommand2の標準│ │&1 | │入力にパイプ(同時進行で実行) │ │command2 │ │ ├───────────┼──────────────────────────────────────────────────┤ │command1 ; │command1を実行し、後に続いてcommand2を実行 │ │command2 │ │ ├───────────┼──────────────────────────────────────────────────┤ │command1 &&│command1を実行; もし成功したら、後に続いてcommand2│ │command2 │を実行(command1とcommand2の両方が成功したら、正常 │ │ │終了を返す) │ ├───────────┼──────────────────────────────────────────────────┤ │command1 ||│command1を実行; もし成功しなかったら、後に続いて │ │command2 │command2を実行(command1 か command2のどちらかが成 │ │ │功したら、正常終了を返す) │ ├───────────┼──────────────────────────────────────────────────┤ │command > │commandの標準出力をfooファイルにリダイレクト (上書│ │foo │き) │ ├───────────┼──────────────────────────────────────────────────┤ │command 2> │commandの標準エラー出力をfooファイルにリダイレクト│ │foo │(上書き) │ ├───────────┼──────────────────────────────────────────────────┤ │command >> │commandの標準出力をfooファイルにリダイレクト (追 │ │foo │記) │ ├───────────┼──────────────────────────────────────────────────┤ │command 2>>│commandの標準エラー出力をfooファイルにリダイレクト│ │foo │(追記) │ ├───────────┼──────────────────────────────────────────────────┤ │command > │commandの標準出力と標準エラー出力をfooファイルにリ│ │foo 2>&1 │ダイレクト │ ├───────────┼──────────────────────────────────────────────────┤ │command < │commandの標準入力をfooファイルからリダイレクト │ │foo │ │ ├───────────┼──────────────────────────────────────────────────┤ │command << │commandの標準入力を"delimiter"に出会うまでのこれに│ │delimiter │続く行からリダイレクト(ヒアドキュメント) │ ├───────────┼──────────────────────────────────────────────────┤ │command <<-│commandの標準入力を"delimiter"に出会うまでのこれに│ │delimiter │続く行からリダイレクト(ヒアドキュメント、行頭のタ │ │ │ブ文字は入力から削除) │ └───────────┴──────────────────────────────────────────────────┘ Debianシステムはマルチタスクシステムです。バックグラウンドジョブ を使うと単一シェルの下で複数プログラムを実行可能にします。バック グラウンドジョブの管理にはシェル内部組み込みコマンドのjobsやfgや bgやkillを使います。bash(1)マンページ中の"SIGNALS"と"JOB CONTROL"セクションやbuiltins(1)を参照下さい。 例えば、次を試してみて下さい: $ foo $ exec 3bar # 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"コマンドの場所を高 速アクセスのために内部記録していると表示されます。 ティップ 項9.2.7. 「着色化されたコマンド」を参照下さい。 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ロケールでコマンドを使います。(項1.5.2. 「"$LANG"変数」と項 8.3. 「ロケール」を参照)。 注意 Perl正規表現(perlre(1))とPerl互換正規表現(PCRE)とreモジュールで 提供されるPython正規表現はEREに多くの共通の拡張をしています。 1.6.2. 正規表現 正規表現は多くのテキスト処理ツールで使われています。シェルグロブ に類似していますがより複雑で強力です。 正規表現はマッチするパターンを表現し、テキスト文字とメタ文字から なっています。 メタ文字は特別な意味を持った文字です。上記のようにテキストツール によって、BREとEREの2つの主要なスタイルがあります。 表 1.24. BREとEREのメタ文字 ┌───────────┬───────┬──────────────────────────────────────────┐ │BRE │ERE │正規表現の説明 │ ├───────────┼───────┼──────────────────────────────────────────┤ │\ . [ ] ^ $│\ . [ ]│共通のメタ文字 │ │* │^ $ * │ │ ├───────────┼───────┼──────────────────────────────────────────┤ │\+ \? \( \)│  │"\"でエスケープされた、BREのみで用いるメタ│ │\{ \} \| │ │文字 │ ├───────────┼───────┼──────────────────────────────────────────┤ │  │+ ? ( )│"\"でエスケープされ無い、EREのみで用いるメ│ │ │{ } | │タ文字 │ ├───────────┼───────┼──────────────────────────────────────────┤ │c │c │非メタ文字 "c"にマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │\c │\c │c"自身がメタ文字でも"c"というそのままの文 │ │ │ │字とマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │. │. │改行を含めた如何なる文字ともマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │^ │^ │文字列の最初とマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │$ │$ │文字列の最後とマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │\< │\< │単語先頭とマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │\> │\> │単語末尾とマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │\[abc…\] │[abc…] │"abc…"のいずれかの文字にマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │\[^abc…\] │[^abc…]│"abc…"以外の文字にマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │r* │r* │"r"という正規表現の0回以上にマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │r\+ │r+ │"r"という正規表現の1回以上にマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │r\? │r? │"r"という正規表現の0回か1回にマッチ │ ├───────────┼───────┼──────────────────────────────────────────┤ │r1\|r2 │r1|r2 │"r1"か"r2"という正規表現のいずれかにマッチ│ ├───────────┼───────┼──────────────────────────────────────────┤ │\(r1\|r2\) │(r1|r2)│"r1"か"r2"という正規表現のいずれかにマッチ│ │ │ │し、それを括弧で囲まれた正規表現と見なす │ └───────────┴───────┴──────────────────────────────────────────┘ emacsの正規表現は、ERE同様の"+"と"?"をメタ文字と扱う拡張をしては ありますが、基本的にBREです。これら文字をemacsの正規表現で"\"で エスケープする必要はありません。 grep(1)をつかうと正規表現を使って文字列探索ができます。 例えば、次を試してみて下さい: $ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE Yoyodyne, Inc., hereby disclaims all copyright interest in the program ティップ 項9.2.7. 「着色化されたコマンド」を参照下さい。 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 <の組合せです。 シェルの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 │パイプからの各項目を引数としてコマンドを │ │ │反復実行 │ ├────────────────────┼─────────────────────────────────────────┤ │| xargs -n 1 echo │パイプからのホワイトスペースで分離された │ │ │項目を行に分割 │ ├────────────────────┼─────────────────────────────────────────┤ │| xargs echo │パイプからの全ての行を1行にマージ │ ├────────────────────┼─────────────────────────────────────────┤ │| grep -e │を含む行を抽出 │ │ │ │ ├────────────────────┼─────────────────────────────────────────┤ │| grep -v -e │を含まない行を抽出 │ │ │ │ ├────────────────────┼─────────────────────────────────────────┤ │| cut -d: -f3 - │":"で区切られた3番目のフィールドを抽出 │ │ │(passwdファイルなど) │ ├────────────────────┼─────────────────────────────────────────┤ │| awk '{ print $3 }'│ホワイトスペースで区切られた3番目のフィー│ │ │ルドを抽出 │ ├────────────────────┼─────────────────────────────────────────┤ │| awk -F'\t' '{ │タブで区切られた3番目のフィールドを抽出 │ │print $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)を使って非常に複雑な操作 を多くのファイルに繰り返し実行できます。項10.1.5. 「ファイル選択 の慣用句」と項9.5.9. 「ファイルに関してループしながらコマンドを 反復実行」を参照下さい。 シェルの対話モードを使うのが複雑過ぎるようになったときには、シェ ルのスクリプトを書くのも一計です(項12.1. 「シェルスクリプト」参 照)。 第2章 Debianパッケージ管理 注意 本章は最新安定版リリースがコード名:lennyと言う前提で書かれていま す。 Debianは、フリーソフトウエアーのコンパイル済みバイナリーパッケー ジからなる整合性あるディストリビューションを作り、そのアーカイブ を通じてそれらを頒布するボランティア組織です。 Debianのアーカイブは、HTTPやFTP法によるアクセスされるための多く のリモートのミラーサイトとして提供されています。それは、CD-ROM/ DVDによっても提供されています。 Debianのパッケージ管理システムは、適切に使われれば、バイナリーパ ッケージの整合性ある組み合わせがアーカイブからシステムにインスト ールされるようになっています。現在、amd64アーキテクチャーには 26849つのパッケージがあります。 Debianのパッケージ管理システムは、多彩な歴史があり、使用されるフ ロントエンドのユーザープログラムやバックエンドのアーカイブへのア クセス方法に多くの選択肢があります。現在はDebianのパッケージ管理 活動のメインフロントエンドプログラムとしてaptitude(8)を推薦しま す。 表 2.1. Debianのパッケージ管理ツールのリスト ┌───────────────────┬───────┬────┬─────────────────────────────┐ │パッケージ │ポプコ │サイ│説明 │ │ │ン │ズ │ │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │ │V:27, │ │ターミナルベースのパッケージ │ │aptitude * │I:98 │9812│マネージャー(現在の標準、apt │ │ │ │ │のフロントエンド) │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │ │ │ │アドバンスドパッケージツール │ │ │ │ │(APT)、"http"や"ftp"や"file" │ │apt * │V:89, │5228│というアーカイブへのアクセス │ │ │I:99 │ │方法をdpkgに提供するフロント │ │ │ │ │エンド(apt-get/apt-cacheコマ │ │ │ │ │ンドを含む) │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │ │V:7, │ │Debianシステムにタスクをイン │ │tasksel * │I:93 │904 │ストールするための選択ツール │ │ │ │ │(APTのフロントエンド) │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │unattended-upgrades│V:4, │ │セキュリティーアップデートの │ │* │I:23 │216 │自動インストールを可能にする │ │ │ │ │APTの拡張パッケージ │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │ │ │ │ターミナルベースのパッケージ │ │dselect * │V:4, │2100│マネージャー(過去の標準、APT │ │ │I:49 │ │や他の旧式のアクセス法のフロ │ │ │ │ │ントエンド) │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │dpkg * │V:92, │6636│Debianのためのパッケージ管理 │ │ │I:99 │ │システム │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │dpkg-ftp * │V:0.08,│136 │dselectのための旧式のftp法 │ │ │I:0.4 │ │ │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │ │V:18, │ │グラフィカルなパッケージマネ │ │synaptic * │I:45 │6124│ージャー(APTのGNOMEフロントエ│ │ │ │ │ンド) │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │ │V:6, │ │グラフィカルなパッケージマネ │ │kpackage * │I:13 │1068│ージャー(APTのKDEフロントエン│ │ │ │ │ド) │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │ │ │ │APTユーティリティープログラ │ │apt-utils * │V:52, │496 │ム: apt-extracttemplates(1)と│ │ │I:99 │ │apt-ftparchive(1)と │ │ │ │ │apt-sortpkgs(1) │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │apt-listchanges * │V:4, │504 │パッケージ変更履歴の通知ツー │ │ │I:6 │ │ル │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │apt-listbugs * │V:1.5, │512 │APTによる各インストール前にク│ │ │I:2 │ │リチカルバグをリストする │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │ │V:2, │ │APTパッケージ探索ユーティリテ│ │apt-file * │I:9 │184 │ィー -- コマンドラインインタ │ │ │ │ │ーフェース │ ├───────────────────┼───────┼────┼─────────────────────────────┤ │apt-rdepends * │V:0.16,│92 │パッケージの依存関係を再帰的 │ │ │I:0.9 │ │にリスト │ └───────────────────┴───────┴────┴─────────────────────────────┘ 注意 aptitudeとapt-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 "でインストー ルしません。 ● ランダムなパッケージを"dpkg --force-all -i " で絶対インストールしません。 ● "/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"というコード名に単に設定するだけで十分です。 testingやunstableを使うことは大変楽しいけれど、リスクがついてき ます。Debianシステムのunstableスイーツさえおおむね非常に安定に見 えますが、Debianシステムのtestingやunstableスイーツでは過去パッ ケージ上の問題をいくつか経験して来てるし、その一部は簡単には解決 できないものでした。結構痛い目に会うことになるかもしれませんよ。 時々、壊れたパッケージや機能の欠損が数週間続くことが起こります。 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(即ちlennyとsqueeze)に のみセキュリティーアップデートがあります。 次は設定ファイル内に用いられるDebianアーカイブサイトのURLとスイ ーツ名もしくはコード名です。 表 2.2. Debianアーカイブサイトのリスト ┌───────────────────┬───────────────────────┬──────────────────┐ │アーカイブのURL │スイート名(コード名) │目的 │ ├───────────────────┼───────────────────────┼──────────────────┤ │http:// │ │安定版(lenny)のリ │ │ftp.XX.debian.org/ │stable (lenny) │リース │ │debian/ │ │ │ ├───────────────────┼───────────────────────┼──────────────────┤ │http:// │ │テスト版(squeeze) │ │ftp.XX.debian.org/ │testing (squeeze) │のリリース │ │debian/ │ │ │ ├───────────────────┼───────────────────────┼──────────────────┤ │http:// │ │不安定版(sid)のリ │ │ftp.XX.debian.org/ │unstable (sid) │リース │ │debian/ │ │ │ ├───────────────────┼───────────────────────┼──────────────────┤ │http:// │ │実験的プリリリース│ │ftp.XX.debian.org/ │experimental │(任意、開発者専用)│ │debian/ │ │ │ ├───────────────────┼───────────────────────┼──────────────────┤ │http:// │ │次回安定版ポイント│ │ftp.XX.debian.org/ │stable-proposed-updates│リリース用のアップ│ │debian/ │ │デート(任意) │ ├───────────────────┼───────────────────────┼──────────────────┤ │http:// │ │安定版用のセキュリ│ │security.debian.org│stable/updates │ティーアップデート│ │/ │ │(重要) │ ├───────────────────┼───────────────────────┼──────────────────┤ │http:// │ │テスト版用のセキュ│ │security.debian.org│testing/updates │リティーアップデー│ │/ │ │ト(重要) │ ├───────────────────┼───────────────────────┼──────────────────┤ │http:// │ │スパムフィルターや│ │volatile.debian.org│volatile │IMクライアント他用│ │/debian-volatile/ │ │のコンパチブルなア│ │ │ │ップデート │ ├───────────────────┼───────────────────────┼──────────────────┤ │http:// │ │スパムフィルターや│ │volatile.debian.org│volatile-sloppy │IMクライアント他用│ │/debian-volatile/ │ │のノンコンパチブル│ │ │ │なアップデート │ ├───────────────────┼───────────────────────┼──────────────────┤ │http:// │ │lennyのためのバッ │ │backports.org/ │lenny-backports │クポートされたパッ│ │debian/ │ │ケージ(非正規、任 │ │ │ │意) │ └───────────────────┴───────────────────────┴──────────────────┘ 注意 セキュリティーアップデートされた純粋な安定版stableリリースのみが 最善の安定性を提供します。一部testingやunstable由来のパッケージ を混用してほとんどstableリリースを走らせることは、純粋なunstable リリースを走らせるよりリスクがあります。stableリリースの下で最新 バージョンのいくつかのプログラムが本当に必要なら、 debian-volatileプロジェクトやbackports.org(項2.7.4. 「Volatileと Backports.org」参照)サービスからのパッケージを使って下さい。これ らのサービスは細心の注意を持って使う必要があります。 注意 基本的に、stableかtestingかunstableのスイーツの内の1つだけを "deb"行に書くべきです。もし、stableとtestingとunstableのスイーツ の何らかの組み合わせを"deb"行に書けば、APTプログラムは、最新のア ーカイブのみが有効であるにもかかわらず、実行速度が低下します。"/ etc/apt/preferences"ファイルがはっきりとした目的を持って使われて いる場合(項2.7.3. 「候補バージョンの調整」)のみ複数のリストに意 味があります。 注意 stableやtestingスイーツのDebianシステムでは、上記の例のようにセ キュリティーアップデートを有効とするように"/etc/apt/ sources.list"の中に"http://security.debian.org/"の行を含めること はいいことです。 各Debianアーカイブは3つのコンポーネントから成り立っています。コ ンポーネントには"Debianポリシー"ではカテゴリーとか"Debian社会契 約"ではエリアという別名が使われています。コンポーネントは"Debian フリーソフトウエアーガイドライン" (DFSG)に準拠しているかどうかに よって分類されています。 表 2.3. Debianアーカイブコンポーネントのリスト ┌──────────┬────────┬──────────────────────────────────────────┐ │コンポーネ│パッケー│パッケージのクライテリア │ │ント │ジ数 │ │ ├──────────┼────────┼──────────────────────────────────────────┤ │main │26261 │DSFGに完全準拠し、non-freeのパッケージに非│ │ │ │依存(main=主要) │ ├──────────┼────────┼──────────────────────────────────────────┤ │contrib │190 │DSFGに完全準拠だがnon-freeのパッケージに依│ │ │ │存有り(contrib=寄与) │ ├──────────┼────────┼──────────────────────────────────────────┤ │non-free │398 │非DSFG準拠 │ └──────────┴────────┴──────────────────────────────────────────┘ ここで、上記にあるパッケージ数はamd64アーキテクチャーに関する数 字です。厳密に言うなら、mainコンポーネントのアーカイブのみを Debianシステムと考えるべきです。 Debianアーカイブの構成は、各アーカイブのURLの後ろにdistsかpoolを つけたURLにブラウザーを向ければ学習できます。 ディストリビューションは、スイーツとコード名の2つの方法で言及さ れます。この他にディストリビューションと言う言葉は多くの文書でス イーツの同義語としても使われています。スイーツとコード名の関係は 次のようにまとめられます。 表 2.4. スイーツとコード名の関係 ┌──────────┬───────────────┬─────────────────┬─────────────────┐ │タイミング│スイーツ = 安定│スイーツ = テスト│スイーツ = 不安定│ │ │版 stable │版 testing │版 unstable │ ├──────────┼───────────────┼─────────────────┼─────────────────┤ │lennyリリ │コード名 = │コード名 = │コード名 = sid │ │ース後 │lenny │squeeze │ │ ├──────────┼───────────────┼─────────────────┼─────────────────┤ │squeezeリ │コード名 = │コード名 = │コード名 = sid │ │リース後 │squeeze │squeeze+1 │ │ └──────────┴───────────────┴─────────────────┴─────────────────┘ コード名の歴史は、Debian FAQ: 6.3.1 Which other codenames have been used in the past?に記載されています。 比較的厳格なDebianアーカイブの用語法では、"セクション"という言葉 はアプリケーションの分野によるパッケージ分類に特化して使われます 。(しかし、"mainセクション"という言葉はmainコンポーネントを提供 するDebianアーカイブ部分を表現するのにしばしば使われています。) Debianデベロッパー(DD)が不安定版unstableアーカイブに新たなアップ ロードを(incomingでの処理を経由して)する度毎に、アップロードする パッケージが最新の不安定版unstableアーカイブの最新のパッケージ集 合とコンパチブルであるようにする義務がDDにはあります。 重要なライブラリーのアップグレード他の理由でDDがこのコンパチビリ ティーを壊す際には、debian-develのメーリングリスト他に通常アナウ ンスがされます。 Debianのアーカイブ管理スクリプトによって非安定版unstableアーカイ ブからテスト版testingアーカイブへパッケージ集合が移動される前に 、アーカイブ管理スクリプトはパッケージの成熟度(約10日経過)とRCバ グレポート状況を確認するばかりでなく、テスト版testingアーカイブ の最新パッケージ集合とのコンパチブルであるようにするように努めま す。このプロセスがあるので、テスト版testingアーカイブは非常に新 しくかつ使いやすいのです。 リリースチームによる徐々のアーカイブ凍結過程を通じて、少々の手動 の介入を伴いつつテスト版testingアーカイブは完全に整合性をもった バグの無い状態へと徐々に熟成されます。そして、古いテスト版 testingアーカイブのコード名を新たな安定版stableアーカイブへと割 り当て、新たなコード名を新たなテスト版testingアーカイブへと割り 当てることで、新たな安定版stableがリリースされます。新たなテスト 版testingアーカイブの当初の内容は、新たにリリースされた安定版 stableアーカイブとまったく同じです。 不安定版unstableもテスト版testingアーカイブもともにいくつかの要 因で一時的に細かな問題発生があるかもしれません。 ● ブロークンなパッケージのアーカイブへのアップロード(主に unstableにて) ● 新規パッケージをアーカイブに受け入れる際の遅延(主にunstable にて) ● アーカイブの同期のタイミング問題(testingとunstableの両方に て)。 ● パッケージの除去などのアーカイブへの手動の介入(どちらかとい えばtestingにて)、等。 もしこれらのアーカイブを使おうと考えるなら、この種の細かな問題の 修復や回避は必須技能です。 注意 たとえいつも非安定版unstableやテスト版testingアーカイブを使って いようとも、ほとんどのデスクトップユーザーは新たな安定版stableリ リースの後約数ヶ月はセキュリティーアップデートされた安定版stable アーカイブを使うべきです。この移行期は、非安定版unstableもテスト 版testingアーカイブの何れももほとんどの人に良いものではありませ ん。非安定版unstableアーカイブを使おうとすると、核となるパッケー ジが大アップグレードの嵐に見舞われるので、あなたのシステムをうま く使える状態に保つのは困難です。テスト版testingアーカイブを使お うとしても、安定版stableアーカイブとほとんど同じ内容でセキュリテ ィーサポートはありません(Debian testing-security-announce 2008-12)。1ヶ月ほど経てば、非安定版unstableアーカイブなら注意を 払えば使えるかもしれません。 ティップ テスト版testingアーカイブを追跡している際には、除去されたパッケ ージによって引き起こされる問題は該当するバグ修正のためにアップロ ードされたパッケージを非安定版unstableアーカイブからインストール すれば通常回避できます。 アーカイブの定義は、Debianポリシーマニュアルを参照下さい。 ● "セクション" ● "優先度(priorities)" ● "ベースシステム" ● "必須パッケージ" 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.7.3. 「候補バージョンの調整」参照) 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// README.Debian"を最初に読むべきです。また"/usr/share/doc/ /"の中にある他の文書も参照すべきです。項1.4.2. 「 Bashのカスタム化」に書かれたようなシェル設定がされていれば、次の ようにタイプして下さい。 $ cd $ pager README.Debian $ mc さらに詳しい情報を得るには"-doc"というサフィクスを持った対応する 文書パッケージをインストールする必要があるかもしれません。 特定パッケージに関する問題に出会った際には、Debianバグトラッキン グシステム(BTS)サイトを必ず確認します。 表 2.5. 特定パッケージの問題解決のためのキーとなるウェッブサイト のリスト ┌────────────────────────────┬─────────────────────────────────┐ │ウェッブサイト │コマンド │ ├────────────────────────────┼─────────────────────────────────┤ │Debianバグトラッキングシステ│sensible-browser "http:// │ │ム(BTS)のホームページ │bugs.debian.org/" │ ├────────────────────────────┼─────────────────────────────────┤ │既知のパッケージに関するバグ│sensible-browser "http:// │ │レポート │bugs.debian.org/" │ ├────────────────────────────┼─────────────────────────────────┤ │既知のバグ番号に関するバグレ│sensible-browser "http:// │ │ポート │bugs.debian.org/" │ └────────────────────────────┴─────────────────────────────────┘ "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 │apt-get │パッケージアーカイブメタデーター更 │ │update │update │新 │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude │apt-get │"foo"パッケージの候補バージョンをそ│ │install foo │install foo │の依存関係とともにインストール │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude │apt-get │他のパッケージを削除すること無くイ │ │safe-upgrade│upgrade │ンストール済みパッケージの候補バー │ │ │ │ジョンをインストール │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude │apt-get │必要なら他のパッケージを削除しなが │ │full-upgrade│dist-upgrade │らインストール済みパッケージの候補 │ │ │<パッケージ> │バージョンをインストール │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude │apt-get │設定ファイルを残したまま"foo"パッケ│ │remove foo │remove foo │ージを削除 │ ├────────────┼─────────────┼───────────────────────────────────┤ │N/A │apt-get │既に必要なくなっている自動済みパッ │ │ │autoremove │ケージを削除 │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude │apt-get purge│設定ファイルを含めて"foo"パッケージ│ │purge foo │foo │を完全削除 │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude │apt-get clean│収集されローカルに貯蔵されたパッケ │ │clean │ │ージファイルを完全消去 │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude │apt-get │収集されローカルに貯蔵されたパッケ │ │autoclean │autoclean │ージファイルのうち古くなったパッケ │ │ │ │ージを消去 │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude │apt-cache │"foo"パッケージに関する詳細情報を表│ │show foo │show <パッケ │示 │ │ │ージ> │ │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude │apt-cache │ │ │search │search │とマッチするパッケージを検索│ │ │ │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude why│N/A │なぜとマッチするパッケージが│ │ │ │インストールされるのかを説明 │ ├────────────┼─────────────┼───────────────────────────────────┤ │aptitude │ │なぜとマッチするパッケージが│ │why-not │N/A │インストールされないのかを説明 │ │ │ │ │ └────────────┴─────────────┴───────────────────────────────────┘ Debianシステム上の異なったパッケージツールを混用しても問題が起こ らなくなりましたが、できるだけaptitudeを使い続けるのが最善です。 "safe-upgrade"/"upgrade"と"full-upgrade"/"dist-upgrade"の違いは 新しいバージョンのパッケージが該当する古いバージョンと異なった依 存関係がある場合にのみ起こります。"aptitude safe-upgrade"コマン ドは新規のパッケージをインストールも削除もしません。 "aptitude why "は"aptitude -v why "とすることでさ らに詳しい情報を表示します。同様の情報は"apt-cache rdepends "とすることでも得られます。 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.7.3. 「候補バージョンの調整」を参照)。 "表示"メニューの下に数種のパッケージ表示があります。 表 2.9. aptitudeの表示のリスト ┌──────────┬─────┬─────────────────────────────────────────────┐ │表示 │状況 │ビューの説明 │ ├──────────┼─────┼─────────────────────────────────────────────┤ │パッケージ│良好 │表 2.10. 「標準パッケージ画面の分類」参照(デ │ │画面 │ │フォールト) │ ├──────────┼─────┼─────────────────────────────────────────────┤ │ │ │何らかのインストール済みパッケージによって推 │ │推奨を監査│良好 │薦されているがインストールされていないパッケ │ │ │ │ージをリスト │ ├──────────┼─────┼─────────────────────────────────────────────┤ │平坦なパッ│ │パッケージを分類せずにリスト(regexとともに使 │ │ケージリス│良好 │用) │ │ト │ │ │ ├──────────┼─────┼─────────────────────────────────────────────┤ │Debtags表 │十分 │パッケージのdebtagsのエントリーにより分類した│ │示 │使え │パッケージをリスト │ │ │る │ │ ├──────────┼─────┼─────────────────────────────────────────────┤ │カテゴリー│非推 │パッケージのカテゴリー別に分類してパッケージ │ │別表示 │奨 │をリスト(これに代えてDebtags表示を利用しまし │ │ │ │ょう) │ └──────────┴─────┴─────────────────────────────────────────────┘ 注意 パッケージのdebtagsによるタグ付け状況を改善するのにご協力下さい ! 標準"パッケージ画面"はパッケージをdselectにいくつかの機能を加え た感じで分類します。 表 2.10. 標準パッケージ画面の分類 ┌────────────────────────────┬─────────────────────────────────┐ │分類 │ビューの説明 │ ├────────────────────────────┼─────────────────────────────────┤ │更新可能なパッケージ │section → component → packageと整│ │ │理してパッケージをリスト │ ├────────────────────────────┼─────────────────────────────────┤ │新規パッケージ │, , │ ├────────────────────────────┼─────────────────────────────────┤ │インストール済みのパッケージ│, , │ ├────────────────────────────┼─────────────────────────────────┤ │インストールされていないパッ│, , │ │ケージ │ │ ├────────────────────────────┼─────────────────────────────────┤ │廃止された、またはローカルで│, , │ │作成されたパッケージ │ │ ├────────────────────────────┼─────────────────────────────────┤ │仮想パッケージ │同一機能のパッケージをリスト │ ├────────────────────────────┼─────────────────────────────────┤ │タスク │タスクに一般的に必要な機能を持つ │ │ │パッケージのリスト │ └────────────────────────────┴─────────────────────────────────┘ ティップ Tasksビューはあなたのタスクに使うパッケージをいいとこ取りするの に使えます。 2.2.5. aptitudeを使った探索方法 Aptitudeはそのregex式機能を通してパッケージを探索する方法をいく つか提供します。 ● シェルコマンドライン: ○ マッチするパッケージのインストール状態やパッケージ名や短 い説明をリストをする、"aptitude search ' '" ○ パッケージの詳細説明のリストをする、"aptitude show ' '" ● 対話型フルスクリーンモード: ○ マッチするパッケージにパッケージビューを絞る、"l" ○ マッチするパッケージを探す、"/" ○ マッチするパッケージを逆方向に探す、"\" ○ 次を探す、"n" ○ 次を逆方向に探す、"N" ティップ という文字列は、"~"で始めてregex式と明示されていな い限り、パッケージ名との完全な一致検索として扱います。 2.2.6. aptitudeのregex式 aptitudeのregex式はmutt的な拡張ERE(項1.6.2. 「正規表現」参照)で aptitudeに特定なマッチ規則の拡張は次に示すとおりです。 表 2.11. aptitudeのregex式のリスト ┌───────────┬──────────────────────────────────────────────────┐ │拡張マッチ │regex式 │ │規則の説明 │ │ ├───────────┼──────────────────────────────────────────────────┤ │パッケージ │ │ │名とのマッ │~n<名前のregex> │ │チ │ │ ├───────────┼──────────────────────────────────────────────────┤ │記述とのマ │~d<記述のregex> │ │ッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │タスク名と │~t<タスクのregex> │ │のマッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │debtagとの │~G │ │マッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │メンテナと │~m │ │のマッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │パッケージ │ │ │セクション │~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 │ │壊れたパッ │ │ │ケージとマ │ │ │ッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │パッ │ │ │ケージに対 │ │ │して │ │ │の依存関係 │~D[:] │ │があるパッ │ │ │ケージとマ │ │ │ッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │パッ │ │ │ケージに対 │ │ │して │ │ │の壊れた依 │~DB[:] │ │存関係があ │ │ │るパッケー │ │ │ジとマッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │パッ │ │ │ケージに対 │ │ │して │ │ │の依存関係 │~R[:] │ │があるパッ │ │ │ケージとマ │ │ │ッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │パッ │ │ │ケージに対 │ │ │して │ │ │の壊れた依 │~RB[:] │ │存関係があ │ │ │るパッケー │ │ │ジとマッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │他のインス │ │ │トール済み │ │ │パッケージ │~R~i │ │が依存する │ │ │パッケージ │ │ │とマッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │他のインス │ │ │トール済み │ │ │パッケージ │ │ │が一切依存 │!~R~i │ │しないパッ │ │ │ケージとマ │ │ │ッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │他のインス │ │ │トール済み │ │ │パッケージ │ │ │が依存もし │~R~i|~Rrecommends:~i │ │くは推薦す │ │ │るパッケー │ │ │ジとマッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │フィルター │ │ │されたバー │ │ │ジョンの │~S filter │ │とマ │ │ │ッチ │ │ ├───────────┼──────────────────────────────────────────────────┤ │常に全ての │ │ │パッケージ │~T │ │にマッチ │ │ │(真) │ │ ├───────────┼──────────────────────────────────────────────────┤ │どのパッケ │ │ │ージにもマ │~F │ │ッチしない │ │ │(偽) │ │ └───────────┴──────────────────────────────────────────────────┘ ● regex部分は、"^"や".*"や"$"などを使うegrep(1)やawk(1)やperl (1)といった典型的なUnix的テキストツールで使われるEREと同様で す。 ● 依存関係を表すは(depends, predepends, recommends, suggests, conflicts, replaces, provides)の内の1つです。 ● デフォールトの依存関係は"depends"です。 ティップ がヌル文字列の場合は"~T"をコマンドの直後に使って 下さい。 次がショーとカットです。 ● "~P" == "~Dprovides:" ● "~C" == "~Dconflicts:" ● "…~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レベルのアクテ│ │dpkg.log │ィビティーのログ │ ├───────────────┼──────────────────────────────────────────────┤ │/var/log/apt/ │APTアクティビティのログ │ │term.log │ │ ├───────────────┼──────────────────────────────────────────────┤ │/var/log/ │aptitudeコマンドアクティビティのログ │ │aptitude │ │ └───────────────┴──────────────────────────────────────────────┘ これらのログから意味のある理解を迅速に得るのは実際には難しいです 。より簡単な方法については項9.2.9. 「設定ファイルの変更記録」を 参照下さい。 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システムがあります。 ● フルスクリーンモードのaptitudeはsu機能がついているので本当に 管理権限が必要になるまでは通常のユーザーからの実行ができます 。 旧式の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では下記のようにアップグレードで きるのですが、新たなシステムをクリーンインストールすることを考え るべきです。こうすると溜めてきたゴミの除去ができる上に最新のパッ ケージの最良の組み合わせも分かります。もちろん安全な場所に完全な システムのバックアップ(項10.1.6. 「バックアップと復元」参照)を事 前にしなくてはいけません。異なったパーティションを使ったデュアル ブート設定をすることをスムーズな移行をするためにお薦めします。 "/etc/apt/sources.list"ファイルの内容を新規リリースへと向けるよ うに変更し、"aptitude update; aptitude full-upgrade"コマンドを実 行することでシステム全体のアップグレードができます。 安定版stableからテスト版testingや不安定版unstableにアップグレー ドするには、項2.1.4. 「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.3. 「パッケージ問題から の防御」を参照下さい。 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 │(他のアーカイブから)ソースをダウ│ │ │ンロード │ ├─────────────────────────────┼────────────────────────────────┤ │dpkg-source -x <パッケージ名>│ソースパッケージの組("*.tar.gz" │ │_<バージョン>-.dsc │ビルド │ ├─────────────────────────────┼────────────────────────────────┤ │debuild binary │ローカルのソースツリーからパッケ│ │ │ージをビルド │ ├─────────────────────────────┼────────────────────────────────┤ │make-kpkg kernel_image │カーネルソースツリーからカーネル│ │ │パッケージをビルド │ ├─────────────────────────────┼────────────────────────────────┤ │make-kpkg --initrd │カーネルソースツリーから │ │kernel_image │initramfsを有効にしてカーネルパ │ │ │ッケージをビルド │ ├─────────────────────────────┼────────────────────────────────┤ │dpkg -i <パッケージ名>_<バー │ローカルパッケージをシステムにイ│ │ジョン>-_ │ンストール │ │<アーキテクチャー名>.deb │ │ ├─────────────────────────────┼────────────────────────────────┤ │debi <パッケージ名>_<バージョ│ローカルパッケージ(複数)をシステ│ │ン>-_<アー │ムにインストール │ │キテクチャー名>.dsc │ │ ├─────────────────────────────┼────────────────────────────────┤ │dpkg --get-selection '*' > │dpkgレベルのパッケージ選択状態情│ │selection.txt │報を保存 │ ├─────────────────────────────┼────────────────────────────────┤ │dpkg --set-selection │dpkgレベルのパッケージ選択状態情│ │"が使えます。しかし メンテナスクリプトで生成されるファイルはこれでは見逃されます。 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- │ディストリビューションのトッ│該当アーカイブ中全て │ │<アーキテク│プ │のパッケージに関する │ │チャー> │ │全ファイルリスト │ ├───────────┼────────────────────────────┼─────────────────────┤ │ │各ディストリビューション/コ │apt_preferences(5)の │ │Release │ンポーネント/アーキテクチャ │ルールに利用されるア │ │ │ーの組み合わせのトップ │ーカイブの記述。 │ ├───────────┼────────────────────────────┼─────────────────────┤ │ │各ディストリビューション/コ │バイナリーパッケージ │ │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 ... 注意 項2.1.4. 「Debianアーカイブの基本」の中で"スイーツ(suite)"や"コ ード名(codename)"や"コンポーネント(component)"を使う理由はこれを 見れば分かるでしょう。"ディストリビューション"は"スイーツ"と"コ ード名"との両方を指したい際に用いられます。 トップレベルの"Release"ファイルの整合性はセキュアーaptという暗号 学手法インフラストラクチャーによって検証されます。 ● 暗号手法による署名ファイル"Release.gpg"は真正のトップレベル の"Release"ファイルと秘密のDebianアーカイブキーから作成され ます。 ● 公開のDebianアーカイブキーは"/etc/apt/trusted.gpg"に取り込む には次のようにします。 ○ 最新のbase-filesパッケージを用いてキーリングをインストー ルすることで自動で取り込む。 ○ ftp-master.debian.orgに掲示された最新の公開アーカイブキ ーをgpgかapt-keyツールを用いて手動で取り込む。 ● セキュアーAPTシステムはこの"Release.gpg"ファイルと"/etc/apt/ trusted.gpg"中の公開アーカイブキーを用いてダウンロードされた トップレベルの"Release"ファイルの整合性を暗号学手法を用いて 検証します。 "全てのPackages"と"Sourcesファイルの整合性はそのトップレベルの "Release"ファイル中のMD5sum値を用いて検証します。"パッケージファ イルの整合性は"Packages"や"Sources"ファイル中のMD5sum値を用いて 検証します。debsums(1)と項2.4.2. 「インストールされたパッケージ ファイルの検証」を参照下さい。 暗号学手法を用いた署名の検証はMD5sum値の計算よりも非常にCPUを使 うプロセスなので、トップレベルの"Release"ファイルには暗号学手法 を用いた署名を使いつつ各パッケージにはMD5sum値を用いることでパー フォーマンスを保ったまま良好なセキュリティーが確保できます(項 10.3. 「データーセキュリティーのインフラ」参照)。 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"等)が使わ れます。 experimentalやvolatile-sloppyやlenny-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.7.3. 「候補バージョンの調整」参照)。 2.5.4. パッケージメタデーターの取得 aptitudeやapt-getやsynapticやapt-fileやauto-apt等のAPTツールが使 われる際にはDebianアーカイブ情報を含むメタデーターのローカルコピ ーを更新する必要があります。この様なローカルのコピーは"/etc/apt/ sources.list"中のディストリビューションとコンポーネントとアーキ テクチャーの名前に対応する次のファイル名です(項2.1.4. 「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) │リームのバージョン>--<アーキテクチャー>.deb │ ├───────────────────────┼──────────────────────────────────────┤ │debianインストーラーの │<パッケージ名>_<エポック>:<アップスト │ │ためのバイナリーパッケ │リームのバージョン>--<アーキテクチャー>.udeb │ ├───────────────────────┼──────────────────────────────────────┤ │ソースパッケージ(アップ│<パッケージ名>_<エポック>:<アップスト │ │ストリームのソース) │リームのバージョン>-.tar.gz │ ├───────────────────────┼──────────────────────────────────────┤ │ソースパッケージ(Debian│<パッケージ名>_<エポック>:<アップスト │ │の変更部分) │リームのバージョン>-.diff.gz │ ├───────────────────────┼──────────────────────────────────────┤ │ソースパッケージ(内容記│<パッケージ名>_<エポック>:<アップスト │ │述) │リームのバージョン>-.dsc │ └───────────────────────┴──────────────────────────────────────┘ 表 2.16. Debianパッケージ名の各部分に使用可能な文字 ┌──────────────────────────────┬────────────────────┬────┐ │名前の部分 │使用可能文字(regex) │存在│ ├──────────────────────────────┼────────────────────┼────┤ │<パッケージ名> │[a-z,A-Z,0-9,.,,-] │必須│ ├──────────────────────────────┼────────────────────┼────┤ │<エポック>: │[0-9]+: │任意│ ├──────────────────────────────┼────────────────────┼────┤ │<アップストリームのバージョン>│[a-z,A-Z,0-9,.,,-,:]│必須│ ├──────────────────────────────┼────────────────────┼────┤ │ │[a-z,A-Z,0-9,.,,~] │任意│ └──────────────────────────────┴────────────────────┴────┘ 注意 パッケージバージョンの順位はdpkg(1)を使って、例えば"dpkg --compare-versions 7.0 gt 7.~pre1 ; echo $?"とすると確認できます 。 注意 Debianインストーラー(d-i)のバイナリーパッケージには、通常のdebで はなくudebをファイル拡張子として使われます。udebパッケージはポリ シー条件を緩和しドキュメントのように必須でない内容を削除した減量 debパッケージです。debとudebパッケージは同一のパッケージ構造を共 有しています。"u"はマイクロと言う意味で使っています。 2.5.9. dpkgコマンド dpkg(1)はDebianパッケージ管理の最も低レベルのツールです。非常に 強力ですから気をつけて使う必要があります。 "<パッケージ名>"というパッケージをインストールする際に、dpkgは次 に記す順番でパッケージを処理します。 1. debファイルを解凍("ar -x"と等価) 2. debconf(1)を使い".preinst"を実行 3. システムにパッケージ内容をインストール("tar -x"と等価) 4. debconf(1)を使い".postinst"を実行 debconfシステムによってI18NとL10N(第8章)のサポートのある標準化さ れたユーザーとの対話が実現できます。 表 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/<パッ│debconfシステムのためのパッケージスク│ │ケージ名>.conffiles │リプト │ ├────────────────────────┼─────────────────────────────────────┤ │/var/lib/dpkg/ │update-alternativesコマンドが用いる代│ │alternatives/<パッケージ│替情報 │ │名> │ │ ├────────────────────────┼─────────────────────────────────────┤ │/var/lib/dpkg/available │すべてのパッケージの入手可能性情報 │ ├────────────────────────┼─────────────────────────────────────┤ │/var/lib/dpkg/diversions│dpkg(1)に用いられ、dpkg-divert(8)が設│ │ │定する迂回情報。 │ ├────────────────────────┼─────────────────────────────────────┤ │/var/lib/dpkg/ │dpkg(1)に用いられ、dpkg-statoverride │ │statoverride │(8)が設定する状態の上書き情報。 │ ├────────────────────────┼─────────────────────────────────────┤ │/var/lib/dpkg/status │全パッケージに関する状態情報 │ ├────────────────────────┼─────────────────────────────────────┤ │/var/lib/dpkg/status-old│"var/lib/dpkg/status"ファイルの第一世│ │ │代のバックアップ │ ├────────────────────────┼─────────────────────────────────────┤ │/var/backups/ │"var/lib/dpkg/status"ファイルの第二世│ │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)を用いて何らかの重畳する プログラムを平和裏にインストールするメカニズムがあります。例えば vimとnviの両方のパッケージがインストールされた状況下でviコマンド がvimを選択して実行するようにできます。 $ ls -l $(type -p vi) lrwxrwxrwx 1 root root 20 2007-03-24 19:05 /usr/bin/vi -> /etc/alternatives/vi $ sudo update-alternatives --display vi ... $ sudo update-alternatives --config vi Selection Command ---------------------------------------------- 1 /usr/bin/vim *+ 2 /usr/bin/nvi Enter to keep the default[*], or type selection number: 1 Debianの代替(alternatives)システムは、その選択を"/etc/ alternatives/"の中のシムリンクとして保持します。選択プロセスには "/var/lib/dpkg/alternatives/"の中の対応するファイルが使われます 。 2.5.11. dpkg-statoverrideコマンド dpkg-statoverride(8)コマンドで提供される状態の上書きは、パッケー ジをインストールする際にファイルに関して異なる所有者やモードを使 うようdpkg(1)に指示する方法です。もし"--update"が指定されファイ ルが存在すれば、即座に新たな所有者やモードに設定されます。 注意 パッケージが所有するファイルの所有者やモードをシステム管理者が chmodやchownコマンドを用いて直接変更しても次のパッケージアップグ レードがリセットします。 注意 ここでファイルと言いましたが、実際には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)等の、アーカイブレベルのパッケージ管理シ ステムはパッケージの依存関係を使って重複するファイルを持つファイ ルのインストールしようとさえしません(項2.1.5. 「パッケージ依存関 係」参照)。 パッケージメインテナによるエラーや、システム管理者による不整合な 混合ソースのアーカイブの採用(項2.7.2. 「混合したアーカイブソース からのパッケージ」参照)があった場合には、パッケージ依存関係が誤 って定義される事態が発生するかもしれません。そういう状況下で重複 するファイルを持つパッケージをaptitude(8)やapt-get(1)を使ってイ ンストールしようとすると、パッケージを展開するdpkg(1)は既存ファ イルを上書きすることなく呼ばれたプログラムにエラーを確実に返しま す。 注意 第三者が作成したパッケージを使うと、root権限で実行されるシステム に関して何でもできるメンテナスクリプトが実行されるので、システム が重大なリスクにさらされます。dpkg(1)はパッケージを展開するする さいに上書きする事を防止するだけです。 そのような壊れたインストール状況は、まず古い問題原因となっている パッケージを削除すれば回避できます。 $ sudo dpkg -P 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__.deb ティップ システムがそれほど壊れていないなら、項2.7.7. 「緊急ダウングレー ド」に書かれているようにして、より高レベルのAPTシステムを通じて システム全体をダウングレードする手もあります。 ハードディスクからブートできない場合は、他の方法でのブート方法を 考えるべきです。 1. デビアンインストーラー(debian-installer)のCDを使ってレスキュ ーモードでブートします。 2. ブートできないハードディスク上のシステムを"/target"にマウン トします。 3. 古いバージョンのfooパッケージを次のようにしてインストールし ます。 # dpkg --root /target -i /path/to/foo__.deb この例は、たとえハードディスク上のdpkgコマンドが壊れていても機能 します。 ティップ ハードディスク上の別のシステムであれ、GNU/LinuxのライブCDであれ 、ブート可能なUSBキードライブであれ、ネットブートであれ、どのよ うに起動されたGNU/Linuxシステムでも同様にして壊れたシステムを救 済するのに使えます。 もしこの方法でパッケージをインストールしようとして何らかの依存関 係違反のためにうまくいかなくてどうしようもなくなった場合には、 dpkgの"--ignore-depends"や"--force-depends"や他のオプションを使 って依存関係をオーバーライドすることができます。こうした場合には 、後で依存関係を修復するように真剣に取り組む必要があります。詳細 はdpkg(8)を参照下さい。 注意 システムがひどく壊れた場合には、システムを安全な場所に完全バック アップし(項10.1.6. 「バックアップと復元」参照)、クリー(see 項 10.1.6. 「バックアップと復元」)ンインストールを実行するべきです 。こうすることは時間お節約でもあり最終的に良い結果に結びつきます 。 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 updatesとvolatile 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(項2.7.3. 「候補 バージョンの調整」参照)を使った場合にもこれは当てはまります。 chrootや類似のテクニック(項9.8. 「仮想化システム」参照)使って、 他のアーカイブからのプログラムを実行するよう検討するべきです。 2.7.3. 候補バージョンの調整 警告 lennyのaptitude(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)参照)。 パッケージを混合したアーカイブからのソース(項2.7.2. 「混合したア ーカイブソースからのパッケージ」参照)から定常的にインストールす る場合には、apt_preferences(5)に書かれたように適切な項目のある"/ etc/apt/preferences"ファイルを作り候補バージョンに関するパッケー ジ選択ルールを操作することによってこういった複雑な操作を自動化で きます。これをapt-pinningと呼びます。 警告 初心者のユーザーによるapt-pinningの利用は大トラブル発生を間違い なく起こします。本当に必要な時以外はapt-pinningの利用は避けなけ ればいけません。 注意 apt-pinningを利用する際には、Debianはパッケージの互換性を保証し ないので、ユーザー自身がパッケージの互換性を確保しなければいけま せん。apt-pinningは全く任意の操作で、著者が使うようにと勧めてい るわけではありません。 注意 アーカイブレベルのReleaseファイル(項2.5.3. 「アーカイブレベルの "Release"ファイル」参照)がapt_preferences(5)のルールに使われます 。だから、apt-pinningはnormal Debian archivesやsecurity Debian archivesではスイート("suite")名を使って機能します。(これはUbuntu アーカイブとは異なります)。例えば"/etc/apt/preferences"ファイル 中で、"Pin: release a=unstable"とはできますが、"Pin: release a= sid"とはできません。 注意 非Debianアーカイブをapt-pinningの一部に使う場合には、それが提供 されている対象の確認とその信頼性の確認をします。例えば、Ubuntuと Debianは混合して使うようにはなっていません。 注意 "/etc/apt/preferences"ファイルを作成することなしでも、かなり複雑 なシステム操作(項2.6.4. 「dpkgコマンドを使っての救済」と項2.7.2. 「混合したアーカイブソースからのパッケージ」参照)がapt-pinningを 使わずにできます。 単純化したapt-pinningテクニックの説明を次にします。 APTシステムは"/etc/apt/sources.list"ファイル中に規定された使える パッケージソースから最高のPin-Priorityでアップグレードするパッケ ージを候補バージョンパッケージとして選択します。パッケージの Pin-Priorityが1000より大きい場合には、このアップグレードするとい うバージョン制約が外れるのでダウングレードできるようになります( 項2.7.7. 「緊急ダウングレード」参照)。 各パッケージの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ファイル(項2.5.3. 「アー カイブレベルの"Release"ファイル」参照)に"NotAutomatic: yes"を含 まれるとNotAutomaticアーカイブが設定されます。 複数アーカイブソースのに関するPin-Priority値は "apt-cache policy "の出力で表示されます。 ● "Package pin:"で始まる行は、のみとの関連付けが "Package pin: 0.190"等と定義されている場合に、pinのパッケー ジバージョンを示します。 ● とのみの関連付けが定義されていない場合には、 "Package pin:"という行はありません。 ● とのみの関連付けが定義されている場合のPin-Priority 値は、全バージョン文字列の右側に"0.181 700"等としてリストさ れます。 ● とのみの関連付けが定義されていない場合には、全バー ジョン文字列の右側に"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 ""という名前のパッケージとその依存ファイルを unstableアーカイブからこの設定の下でインストールしたい場合、"-t" オプションを使ってターゲットリリースを切り替える(unstableの Pin-Priorityが990になる)次のコマンドを実行します。 $ sudo apt-get install -t unstable この設定では、通常の"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: Pin: release a=unstable Pin-Priority: 700 Package: 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アーカイブ(項2.5.3. 「アーカイブレベルの"Release"フ ァイル」参照)なので、常に1(<<100)です。experimentalアーカイブに ある特定パッケージを次回アップグレード時に自動的に追跡しようとし ない限り、"/etc/apt/preferences"ファイル中でexperimentalアーカイ ブを使うためにPin-Priority値を明示的に設定する必要はありません。 2.7.4. VolatileとBackports.org stableのためのアップグレードパッケージを提供する、 debian-volatile projectとbackports.orgアーカイブがあります。 警告 lenny-backportsやvolatile-sloppy等のNotAutomaticアーカイブの中に あるパッケージ全てを使ってはいけません。あなたの必要性に適合する 選択されたパッケージだけを使います。 注意 backports.orgは、提供しているパッケージがDebian開発者によってサ インされているとはいえ、非Debianアーカイブです。 注意 アーカイブレベルのReleaseファイル(項2.5.3. 「アーカイブレベルの "Release"ファイル」参照)がapt_preferences(5)のルールで使われます 。だからvolatile Debianアーカイブではapt-pinningは"コード"名を使 って機能します。これは他のDebianアーカイブと異なります。例えば volatile Debianアーカイブのための"/etc/apt/preferences"の中で、 "Pin: release a=lenny"とできますが、"Pin: release a=stable"とは できません。 次にlennyとvolatileを追跡しながら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.orgとvolatile-sloppyアーカイブのデフォールトの Pin-Priority値は、NotAutomaticアーカイブ(項2.5.3. 「アーカイブレ ベルの"Release"ファイル」参照)なので、常に1(<<100)です。 experimentalアーカイブにある特定パッケージを次回アップグレード時 に自動的に追跡しようとしない限り、"/etc/apt/preferences"ファイル 中でbackports.orgとvolatile-sloppyアーカイブを使うために Pin-Priority値を明示的に設定する必要はありません。 ""という名前のパッケージをその依存関係ともども lenny-backportsアーカイブからインストールしたい時には、"-t"オプ ションでターゲットリリースを切り替えながら次のコマンドを使います 。 $ sudo apt-get install -t lenny-backports 特定のパッケージをアップグレードしたいときには、"/etc/apt/ preferences"ファイルを作成しその中に全てのパッケージを次のように 明示的にリストしなければいけません。 Package: Pin: release o=Backports.org archive Pin-Priority: 700 Package: 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では設計としてはダウングレードを正式にサポートしません。緊 急の復元処置の一部としてのみ実行されるべきです。こういう状況であ るにもかかわらず、多くの場合にうまく機能することがある知られてい ます。重要なシステムでは回復処置の後に全ての重要データーをバック アップし、最初から新規システムを再インストールします。 壊れたシステムアップグレードからの復元するために、候補バージョン を操作して新しいアーカイブから古いアーカイブにダウングレードする ことがうまくいくかもしれません(項2.7.3. 「候補バージョンの調整」 参照)。これは、何度も"dpkg -i _ .deb"コマンドを実行する退屈な作業をしないでよくする 方法です(項2.6.4. 「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)プロキシサーバー(項 6.10. 「他のネットワークアプリケーションサーバー」参照)を使うよ うに設定できます。"$http_proxy"環境変数による設定は、"/etc/apt/ apt.conf"ファイル中の設定より優先します。 Debianアーカイブ専用のプロキシツールがあります。実際に使う前に BTSをチェック下さい。 表 2.19. Debianアーカイブ専用のプロキシツールのリスト ┌─────────────┬───────┬────┬───────────────────────────────────┐ │パッケージ │ポプコ │サイ│説明 │ │ │ン │ズ │ │ ├─────────────┼───────┼────┼───────────────────────────────────┤ │ │V:0.2, │ │Debianアーカイブファイルのキャッシ │ │approx * │I:0.3 │3868│ュプロキシサーバー(コンパイルされた│ │ │ │ │OCamlプログラム) │ ├─────────────┼───────┼────┼───────────────────────────────────┤ │apt-proxy * │V:0.4, │428 │Debianアーカイブプロキシと部分ミラ │ │ │I:0.5 │ │ー作成機(Pythonプログラム) │ ├─────────────┼───────┼────┼───────────────────────────────────┤ │apt-cacher * │V:0.3, │244 │Debianパッケージとソースファイルの │ │ │I:0.5 │ │キャッシュプロキシ(Perlプログラム) │ ├─────────────┼───────┼────┼───────────────────────────────────┤ │apt-cacher-ng│V:0.2, │ │ソフトウエアーパッケージの頒布ため │ │* │I:0.2 │708 │のキャッシュプロキシ(コンパイルされ│ │ │ │ │たC++プログラム) │ ├─────────────┼───────┼────┼───────────────────────────────────┤ │debtorrent * │V:0.15,│1173│Debianパッケージのためのbittorrent │ │ │I:0.2 │ │プロキシ(Pythonプログラム) │ └─────────────┴───────┴────┴───────────────────────────────────┘ 注意 Debianがそのアーカイブ構造を再編した際に、このような専用のプロキ シツールはパッケージメンテナによるコードの修正が必要で、一定期間 使えなくなることがあります。一方、汎用のウェッブ(http)プロキシは 比較的堅牢ですしそのような変化に合わすのも簡単です。 2.7.12. 小さな公開パッケージアーカイブ 近代的なセキュアーAPTシステム(項2.5.2. 「トップレベルの"Release" ファイルと信憑性」参照)と互換性のある小規模のパブリックアーカイ ブを作る例を次に示します。まず、いくつかの仮定をします。 ● アカウント名: "foo" ● ホスト名: "www.example.com" ● 必要なパッケージ: apt-utilsやgnupg等のパッケージ ● 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) 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 <aptgenerate.conf < "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)はsysvinitやlibc6やlibpam-modules等の必須のシステムパッ ケージを置き換えるために使うべきではありません。実質的にはalien (1)は、LSB準拠か静的にリンクされたnon-freeのバイナリーのみで提供 されるパッケージにのみ使われるべきです。フリーソフトの場合は、ソ ースパッケージを使い本物のDebianパッケージを作るべきです。 2.7.15. dpkgを使わないパッケージの開梱 現行の"*.deb"パッケージの内容は、どんなUnix的環境でも標準のar(1) とtar(1)を使っうことで、dpkg(1)を使うこと無く開梱できます。 # ar x /path/to/dpkg__.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. パッケージ管理の追加参考文書 パッケージ管理に関しては次の文書からさらに学習できます。 ● パッケージ管理の一義的文書: ○ aptitude(8)とdpkg(1)とtasksel(8)とapt-get(8)とapt-config (8)とapt-key(8)とsources.list(5)とapt.conf(5)と apt_preferences(5); ○ "/usr/share/doc/apt-doc/guide.html/index.html"と"/usr/ share/doc/apt-doc/offline.html/index.html" from the apt-doc package; ○ aptitude-doc-enパッケージに入っている、"/usr/share/doc/ aptitude/html/en/index.html"。 ● 正規で詳細なDebianアーカイブに関する文書: ○ Debianアーカイブの正式のポリシーはDebianポリシーマニュア ル、第2章 - Debianアーカイブに規定されています。 ○ "Debian 開発者リファレンス、第4章 Debian 開発者が利用可 能なリソース 4.6 Debian アーカイブ"と、 ○ "The Debian GNU/Linux FAQ, Chapter 5 - The Debian FTP archives". ● Debianユーザー向けのDebianパッケージ作成の入門書: ○ "Debian New Maintainers' Guide". 第3章システムの初期化 Debianシステムが以下に起動され設定されるかの知っていることはシス テム管理者として賢明です。正確で詳細な情報がインストールされたパ ッケージのソースや文書中にあるとは言え、我々ほとんどにとってちょ っと大変過ぎます。 著者などの過去の知見に基づきDebianシステムの要点とそれらの設定の 簡単な参考となる概論を提供するように勤めました。Debianシステムは 動く標的なので、システムの状況が変わっているかもしれません。シス テムに変更を加える前に、各パッケージの最新文書を参照下さい。 3.1. ブートストラッププロセスの概要 コンピューターシステムは、電源投入イベントからユーザーに機能の完 備したオペレーティングシステム(OS)を提供するまでブートストラップ プロセスを数段通過します。 単純化のため、デフォールトのインストールをした典型的なPCプラット フォームに限定し議論します。 典型的なブートストラッププロセスは4段ロケットのようです。各段の ロケットは次の段のロケットにシステムのコントロールを引き継ぎます 。 ● 項3.2. 「1段目: BIOS」 ● 項3.3. 「2段目: ブートローダー」 ● 項3.4. 「3段目: ミニDebianシステム」 ● 項3.5. 「4段目: 通常のDebianシステム」 もちろん、これらに関して異なる設定をすることはできます。例えば、 自分自身で専用カーネルをコンパイルした場合、ミニDebianシステムの ステップをスキップできます。自分自身で確認するまでは、あなたのシ ステムがこの様になっていると決めつけないで下さい。 注意 伝統的なPCプラットフォームでないSUNとかMacintoshシステム等では、 ROM上のBIOSやディスク上のパーティション(項9.3.1. 「ディスクパー ティション設定」)が非常に異なっているかもしれません。そのような 場合にはプラットフォーム特定の文書をどこかで求めて下さい。 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│説明 │ │ーダー │ │ン │ズ │ │ │ ├────────┼──────────────┼───────┼────┼──────┼──────────────────┤ │ │ │ │ │ │ディスクパーティシ│ │ │ │ │ │ │ョンやvfatやext3等│ │GRUB │grub * │V:21, │168 │サポー│のファイルシステム│ │Legacy │ │I:88 │ │ト │を理解するぐらいス│ │ │ │ │ │ │マートです。(lenny│ │ │ │ │ │ │のデフォールト) │ ├────────┼──────────────┼───────┼────┼──────┼──────────────────┤ │ │ │ │ │ │ディスクパーティシ│ │ │ │V:2, │ │サポー│ョンやvfatやext3等│ │GRUB 2 │grub-pc * │I:8 │1804│ト │のファイルシステム│ │ │ │ │ │ │を理解するぐらいス│ │ │ │ │ │ │マートです。 │ ├────────┼──────────────┼───────┼────┼──────┼──────────────────┤ │ │ │ │ │ │GRUB 2のブート可能│ │ │grub-rescue-pc│V:0.05,│ │サポー│なレスキューイメー│ │GRUB 2 │* │I:0.5 │2992│ト │ジ(CDとフロッピー)│ │ │ │ │ │ │(PC/BIOSバージョ │ │ │ │ │ │ │ン) │ ├────────┼──────────────┼───────┼────┼──────┼──────────────────┤ │ │ │V:0.7, │ │サポー│ハードディスク上の│ │Lilo │lilo * │I:3 │1124│ト │セクター位置に依存│ │ │ │ │ │ │します。(旧式) │ ├────────┼──────────────┼───────┼────┼──────┼──────────────────┤ │ │ │ │ │ │ISO9660ファイルシ │ │Isolinux│syslinux * │V:1.2, │120 │サポー│ステムを理解します│ │ │ │I:7 │ │ト │。ブートCDに使われ│ │ │ │ │ │ │ています。 │ ├────────┼──────────────┼───────┼────┼──────┼──────────────────┤ │ │ │ │ │ │MSDOSファイルシス │ │Syslinux│syslinux * │V:1.2, │120 │サポー│テム(FAT)理解しま │ │ │ │I:7 │ │ト │す。ブートフロッピ│ │ │ │ │ │ │ーで使われます。 │ ├────────┼──────────────┼───────┼────┼──────┼──────────────────┤ │ │ │ │ │ │新しいシステムが │ │Loadlin │loadlin * │V:0.03,│144 │サポー│FreeDOS/MSDOSシス │ │ │ │I:0.2 │ │ト │テムから起動されま│ │ │ │ │ │ │す。 │ ├────────┼──────────────┼───────┼────┼──────┼──────────────────┤ │ │ │ │ │ │MSDOSのMBRを代替す│ │Neil │ │V:1.0, │ │非サポ│るフリーソフトです│ │Turtonの│mbr * │I:6 │96 │ート │。ディスクパーティ│ │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パラ│意味 │ │メーター│ │ ├────────┼─────────────────────────────────────────────────────┤ │ │GRUB legacyでは"(hd0,2)"またGRUB 2では"(hd0,3)"と設定│ │root │することでプライマリディスクの3つ目のパーティションを│ │ │使用 │ ├────────┼─────────────────────────────────────────────────────┤ │kernel │カーネルパラメーター"root=/dev/hda3 ro"とともに"/ │ │ │vmlinuz"にあるカーネルを使用 │ ├────────┼─────────────────────────────────────────────────────┤ │initrd │"/initrd.img"にあるinitrd/initramfsイメージを使用 │ └────────┴─────────────────────────────────────────────────────┘ 注意 GRUB legacyプログラムが使うパーティション値はLinuxカーネルやユー ティリティーツールが使う値より1つ少ない数字です。GRUB 2プログラ ムはこの問題を修正します。 ティップ UUID (項9.3.2. 「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 DebianとDependency 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/ │ブート時のシングルユーザーモード(別名:"s") │ │ │rcS.d/ │ │ ├──────┼─────────┼─────────────────────────────────────────────┤ │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>"か"K<2-digit-number> "という形式となっています。2桁数字はスクリプトの 実行順序決定に使われます。"S"は"スタート(Start)"と言う意味で、 "K"は"停止(Kill)"と言う意味です。 init(8)かtelinit(8)コマンドがランレベルを""に変更すると、次の スクリプトを実行します。 1. "/etc/rc.d/"中の"K"で始まるスクリプト名が、引数"stop"1つ つけてアルファベット順に実行されます。(サービス停止) 2. "/etc/rc.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-confやbum等の使いやすいランレベル管理ツー ルを使ってランレベルを編集することでできます。こうする代わりにコ マンドラインだけを使うなら、(gdmパッケージをデフォールトでインス トールしディスプレーマネージャーとして選択した後に)次に示すよう にします。 # cd /etc/rc2.d ; mv S21gdm K21gdm # cd /etc ; perl -i -p -e 's/^id:.:/id:3:/' inittab ディスプレーマネージャーデーモン(xdmやgdmやkdmやwdm)が起動される 際には、"/etc/X11/default-display-manager"ファイル内容を確認する 事を覚えておいて下さい。 注意 startx(1)コマンドを使えば、どのコンソールシェルからもXが起動でき ます。 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"で設定されます。 項9.3.5. 「マウントオプションによるファイルシステムの最適化」を 参照下さい。 注意 ネットワークファイルシステムの実際のマウントはネットワークインタ ーフェースの起動を待ちます。 警告 各ブートアップごとに、全てのファイルシステムをマウントした後で、 "/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"を用いた 追加確認後で適切なサーバープログラムを起動します。 システムのセキュリティーのためにできるだけ多くのネットワークサー ビスを無効にします。項4.6.3. 「サーバーのサービスへのアクセスの 制限」を参照下さい。 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)を参照下さい。さらに項9.2.2. 「 ログアナライザー」を参照下さい。 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ファイルシステム(項1.2.12. 「 procfsとsysfs」参照)からの情報を使いユーザープロセスを起動し、 modprobe(8)プログラム(項3.5.12. 「カーネルモジュール初期化」参 照)を使ってそれをサポートする必要なカーネルモジュールをロードし 、対応するデバイスノードを作成します。 ティップ もし"/lib/modules//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を使 ってデバイスをマウントできます。項9.3.2. 「UUIDを使ってパーティ ションをアクセス」を参照下さい。 3.5.12. カーネルモジュール初期化 modprobe(8)プログラムは、ユーザープロセスからカーネルモジュール を追加や削除することで実行中のLinuxカーネルの設定を可能にします 。udevシステム(項3.5.11. 「udevシステム」参照)は、その起動を自動 化しカーネルモジュールの初期化を補助します。 "/etc/modules"ファイル中にリストしてプリロードする必要のある (modules(5)参照)次に記すような非ハードウエアーや特殊ハードウエア ーのドライバーモジュールがあります。 ● ポイント間ネットワークデバイス(TUN)と仮想Ethernetネットワー クデバイス(TAP)を提供する、TUN/TAPモジュール ● netfilterファイアーウォール機能(iptables(8)と項5.8. 「 Netfilterインフラ」)を提供するnetfilterモジュール ● ワッチドッグタイマードライバーのモジュール modprobe(8)プログラムのための設定ファイルは、modprobe.conf(5)で 説明されているように"/etc/modprobes.d/"ディレクトリーの下にあり ます。(あるカーネルモジュールが自動ロードされるのを避けるには、" /etc/modprobes.d/blacklist" ファイル中にブラックリスします。) depmod(8)プログラムによって生成される"/lib/modules// modules.dep"ファイルは、modprobe(8)プログラムによって使われるモ ジュール依存関係を記述します。 注意 ブート時にmodprobe(8)を使ってのモジュールロードの問題に出会った 場合には、"depmod -a"として"modules.dep"を再構築をするとこの様な 問題が解消できるかもしれません。 modinfo(8)プログラムはLinuxカーネルモジュールに関する情報を表示 します。 lsmod(8)プログラムは"/proc/modules"の内容を読みやすい形式にして 、どのカーネルモジュールが現在ロードされているかを表示します。 ティップ あなたのシステム上の正確なハードウエアーを特定します。項9.6.3. 「ハードウエアーの識別」を参照下さい。 ティップ ブート時に期待されるハードウエアー機能を有効となるように設定もで きます。項9.6.4. 「ハードウエアー設定」を参照下さい。 ティップ あなたのデバイスのサポートは、カーネルを再コンパイルすれば追加で きます。項9.7. 「カーネル」を参照下さい。 第4章認証 人(またはプログラム)がシステムへのアクセスの要求をした際に、認証 はその正体が信頼できるものだと確認します。 警告 PAMの設定のエラーはあなたをあなた自身のシステムから締め出すかも 知れません。レスキューCDを手元に置くか代替ブートパーティション設 定を必ずします。復元するには、それらを使ってシステムをブートしそ こから修正します。 4.1. 通常のUnix認証 通常のUnix認証はPAM(プラグ可能な認証モジュール)のもとで pam_unix.so(8)モジュールによって提供される。":"で分離されたエン トリーを持つその3つの重要な設定ファイルは次です。 表 4.1. 3つのpam_unix(8)に関する重要な設定ファイル ┌────────┬──────────────┬──────┬──────┬────────────────────────┐ │ファイル│パーミッション│ユーザ│グルー│説明 │ │ │(許可) │ー │プ │ │ ├────────┼──────────────┼──────┼──────┼────────────────────────┤ │/etc/ │-rw-r--r-- │root │root │(浄化された)ユーザーアカ│ │passwd │ │ │ │ウント情報 │ ├────────┼──────────────┼──────┼──────┼────────────────────────┤ │/etc/ │-rw-r----- │root │shadow│保護されたユーザーアカウ│ │shadow │ │ │ │ント情報 │ ├────────┼──────────────┼──────┼──────┼────────────────────────┤ │/etc/ │-rw-r--r-- │root │root │グループ情報 │ │group │ │ │ │ │ └────────┴──────────────┴──────┴──────┴────────────────────────┘ "/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 │""のアカウント情報の閲覧 │ │ │ │ ├────────────────────┼─────────────────────────────────────────┤ │getent shadow │""のシャドーされたアカウント情│ │ │報の閲覧 │ ├────────────────────┼─────────────────────────────────────────┤ │getent group │""のグループ情報の閲覧 │ │ │ │ ├────────────────────┼─────────────────────────────────────────┤ │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:12, │204 │mkpasswd │crypt(3)ライブラリーの充実しすぎ│ │ │I:88 │ │ │たフロントエンド │ ├───────┼──────┼────┼─────────┼────────────────────────────────┤ │openssl│V:43, │2352│openssl │パスワードハッシュの計算 │ │* │I:90 │ │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:82, │1080 │差し替え可能な認証モジュール│ │ │I:99 │ │(基本サービス) │ ├───────────────────┼───────┼─────┼────────────────────────────┤ │ │V:1.9, │ │LDAPインターフェースを可能に│ │libpam-ldap * │I:4 │384 │する差し替え可能な認証モジュ│ │ │ │ │ール │ ├───────────────────┼───────┼─────┼────────────────────────────┤ │ │V:0.8, │ │cracklibのサポートを可能にす│ │libpam-cracklib * │I:1.6 │148 │る差し替え可能な認証モジュー│ │ │ │ │ル │ ├───────────────────┼───────┼─────┼────────────────────────────┤ │libpam-doc * │I:0.7 │1208 │差し替え可能な認証モジュール│ │ │ │ │(htmlとtextの文書) │ ├───────────────────┼───────┼─────┼────────────────────────────┤ │ │V:96, │ │GNU Cライブラリー: "ネームサ│ │libc6 * │I:99 │9908 │ービススイッチ"も提供する共 │ │ │ │ │有ライブラリー │ ├───────────────────┼───────┼─────┼────────────────────────────┤ │glibc-doc * │I:4 │1948 │GNU C ライブラリー: マンペー│ │ │ │ │ジ │ ├───────────────────┼───────┼─────┼────────────────────────────┤ │ │ │ │GNU C ライブラリー: infoと │ │glibc-doc-reference│I:1.5 │12020│pdfとhtmlフォーマットでのリ │ │* │ │ │ファレンスマニュアル │ │ │ │ │(non-free) │ ├───────────────────┼───────┼─────┼────────────────────────────┤ │libnss-mdns * │I:53 │116 │マルチキャストDNSを使った名 │ │ │ │ │前解決のためのNSSモジュール │ ├───────────────────┼───────┼─────┼────────────────────────────┤ │libnss-ldap * │I:4 │312 │LDAPをネームサービスとして使│ │ │ │ │うNSSモジュール │ ├───────────────────┼───────┼─────┼────────────────────────────┤ │ │V:0.13,│ │LDAPをネームサービスとして使│ │libnss-ldapd * │I:0.3 │136 │う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/ │""に関するPAM設定の設定; pam(7)と │ │<プログラム │pam.d(5)参照 │ │名> │ │ ├─────────────┼────────────────────────────────────────────────┤ │/etc/ │各サービスに関するエントリーによるNSS設定の設定;│ │nsswitch.conf│nsswitch.conf(5)参照 │ ├─────────────┼────────────────────────────────────────────────┤ │/etc/nologin │ユーザーのログイン制限のためにpam_nologin(8)モジ│ │ │ュールがアクセス │ ├─────────────┼────────────────────────────────────────────────┤ │/etc/ │pam_securetty(8)モジュールによりrootアクセスに使│ │securetty │うttyを制限 │ ├─────────────┼────────────────────────────────────────────────┤ │/etc/security│pam_access(8)モジュールによりアクセス制限を設定 │ │/access.conf │ │ ├─────────────┼────────────────────────────────────────────────┤ │/etc/security│pam_group(8)モジュールによりグループに基づく制約│ │/group.conf │を設定 │ ├─────────────┼────────────────────────────────────────────────┤ │/etc/security│pam_env(8)モジュールにより環境変数を設定 │ │/pam_env.conf│ │ ├─────────────┼────────────────────────────────────────────────┤ │/etc/ │"readenv=1"引数を付きのpam_env(8)モジュールによ │ │environment │って追加での環境変数を設定 │ ├─────────────┼────────────────────────────────────────────────┤ │/etc/default/│"readenv=1envfile=/etc/default/locale"引数を付き│ │locale │のpam_env(8)モジュールによって追加でロケールを設│ │ │定します。(Debian) │ ├─────────────┼────────────────────────────────────────────────┤ │/etc/security│pam_linits(8)モジュールによってリソース制限 │ │/limits.conf │(ulimit, core, …)を設定 │ ├─────────────┼────────────────────────────────────────────────┤ │/etc/security│pam_time(8)モジュールによって時間制限を設定 │ │/time.conf │ │ └─────────────┴────────────────────────────────────────────────┘ パスワード選択の制限はpam_unix(8)とpam_cracklib(8)モジュールで実 装されています。それらは引数を使って設定します。 ティップ PAMモジュールはファイル名のサフィクスとして".so"を使います。 4.5.2. 最新の集中システム管理 集中化された軽量ディレクトリーアクセスプロトコル(LDAP)を採用する ことで多くのネットワーク上のUnix的や非Unix的システムを最新の集中 システム管理が実現できます。軽量ディレクトリーアクセスプロトコル のオープンソース実装はOpenLDAPソフトウエアーです。 LDAPサーバーは、libpam-ldapとlibnss-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-ldapがSSL(もし くはTLS)接続を使うよう設定しなければいけません。 ● LDAPのネットワークオバーヘッドの犠牲はあるとはいえ、データー の整合性確保のためにlibnss-ldapがSSL(もしくはTLS)接続を使う ように設定できます。 ● LDAP のネットワークトラフィックを減少させるためにLDAPサーチ 結果を一時保持するためのnscd(8)をローカルで走らせるべきです 。 libpam-docパッケージで提供されるpam_ldap.conf(5)や"/usr/share/ doc/libpam-doc/html/"やglibc-docパッケージで提供される "infolibc'NameServiceSwitch'"といった文書を参照下さい。 同様に、これに代わる集中化されたシステムは他の方法を使っても設定 できます。 ● 旧式のUnux的システムとともにNIS (当初YPと呼ばれた)またはNIS+ ● Windows NTやSAMBAとともにWinbind 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)機能の制限は項9.5.15. 「Alt-SysRqキー」を参照下さい。 4.6.1. sudo sudoはシステム管理者がユーザーに制限付きのroot権限を与え、その root活動を記録するように設計されたプログラムです。sudoはユーザー の通常パスワードだけが必要です。sudoパッケージをインストールし、 "/etc/sudoers"の中のオプションを設定することによりアクティベート して下さい。"/usr/share/doc/sudo/examples/sudoersの設定例を参照 下さい。 単一ユーザーシステムにおける私のsudoの使い方(see項1.1.12. 「sudo の設定」)は自分自身の失敗からの防衛を目指しています。sudoを使う ことは、常にrootアカウントからシステムを使うよりは良い方法だと個 人的には考えます。例えば、次は""の所有者を"" に変更します。 $ sudo chown rootのパスワード(自分でシステムインストールをしたDebianユーザー なら当然知っています)を知っていれば、どのユーザーアカウントから いかなるコマンドも"su -c"とすればrootもとで実行できます。 4.6.2. SELinux セキュリティー強化したLinux(SELinux)は強制アクセス制御(MAC)ポリ シーのある通常のUnix的な権限モデルより厳格な枠組みです。ある条件 下ではrootの権限すら制限を受けます。 4.6.3. サーバーのサービスへのアクセスの制限 システムのセキュリティーのためにできるだけ多くのサーバープログラ ムを無効とするのは良い考えです。このことはネットワークサーバーの 場合は決定的です。直接デーモンとしてであれスーパーサーバープログ ラム経由であれ有効にされている使っていないサーバーがあることはセ キュリティーリスクと考えられます。 sshd(8)等の多くのプログラムがPAMを使ったアクセスコントロールを使 っています。サーバーサービスへのアクセスを制限するには多くの方法 があります。 ● 設定ファイル: "/etc/default/<プログラム名>" ● デーモンに関するランレベル設定 ● PAM (プラグ可能な認証モジュール: Pluggable Authentication Modules) ● スーパーサーバーに関する"/etc/inetd.conf" ● TCPラッパーに関する"/etc/hosts.deny"と"/etc/hosts.allow"、 tcpd(8) ● Sun RPCに関する"/etc/rpc.conf" ● atd(8)に関する"/etc/at.allow"と"/etc/at.deny" ● atd(8)に関する"/etc/at.allow"と"/etc/at.deny" ● netfilterインフラのネットワークファイアーウォール 項3.5.3. 「ランレベル管理例」と項3.5.4. 「各initスクリプトのデフ ォールトのパラメーター」と項4.5.1. 「PAMとNSSによってアクセスさ れる設定ファイル」と項3.5.8. 「ネットワークサービスの初期化」と 項5.8. 「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のようなインセキュアープロ トコルの通信をインターネット経由でトンネルするのに使えます。 クライアントは、ホストベースド認証、公開鍵認証、チャレンジレスポ ンス認証、パスワード認証を使って認証をとろうとします。公開鍵認証 を利用すると、リモートからのパスワード無しログインができるように なります。項6.9. 「リーモートアクセスサーバーとユーティリティー (SSH)」を参照下さい。 4.7.3. インターネットのためのセキュリティー強化策 たとえ、セキュアーシェル (SSH)やポイントツーポイントトンネリング プロトコル(PPTP)サーバーのようなセキュアーサービスを走らせる場合 でも、ブルートフォースのパスワード推測等による侵入の可能性は残っ ています。次のようなセキュリティーのためのツールとともに、ファイ アーウォールポリシー(項5.8. 「Netfilterインフラ」参照)を使うのは セキュリティー状況を向上させることが期待できます。 表 4.8. 追加セキュリティー策を提供するツールのリスト ┌─────────────┬───────┬───┬────────────────────────────────────┐ │ │ポプコ │サ │ │ │パッケージ │ン │イ │説明 │ │ │ │ズ │ │ ├─────────────┼───────┼───┼────────────────────────────────────┤ │knockd * │V:0.14,│164│小さなポートノックのデーモンknockd │ │ │I:0.3 │ │(1)とクライアントkonck │ ├─────────────┼───────┼───┼────────────────────────────────────┤ │denyhosts * │V:1.7, │432│sshからの侵入者をシステム管理者が排 │ │ │I:2 │ │除することを助けるユーティリティー │ ├─────────────┼───────┼───┼────────────────────────────────────┤ │fail2ban * │V:3, │660│複数回の認証エラーを発生させるIPを使│ │ │I:4 │ │用禁止にします │ ├─────────────┼───────┼───┼────────────────────────────────────┤ │libpam-shield│V:0.01,│172│パスワード推測によるリモートからの攻│ │* │I:0.06 │ │撃者を締め出す │ └─────────────┴───────┴───┴────────────────────────────────────┘ 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のメニュー項目を編集可能(項3.3. 「2 段目: ブートローダー」参照)なら、次の手順を使えてさらに簡単です 。 1. カーネルパラメーターを"root=/dev/hda6 rw init=/bin/sh"のよう な感じに変更してシステムを起動します。 2. "/etc/passwd"を編集し、rootアカウントの2番目の項目を空にしま す。 3. システム再起動します。 これで、システムのrootシェルにパスワード無しに入れるようになりま した。 注意 rootシェルにアクセスさえできれば、システム上の全てにアクセスでき システム上のどのパスワードでもリセットできます。さらに。johnとか crackパッケージ(項9.6.11. 「システムのセキュリティーと整合性のチ ェック」参照)のようなブルートフォースのパスワードクラッキングツ ールを使ってすべてのユーザーアカウントのパスワードが破られるかも しれません。こうして破られたパスワードは他のシステムへの侵入を引 き起こしかねません。 この様な懸念を回避できる唯一の合理的なソフトウエアー的解決法は、 dm-cryptとinitramfs(項9.4. 「データー暗号化ティップ」参照)をつか う、ソフトウエアー暗号化されたルートパーティション(もしくは"/ etc" パーティション)を使うことです。でも、パスワードがシステム起 動毎に必要になってしまいます。 第5章ネットワークの設定 ティップ GNU/Linuxのネットワーク設定の一般的ガイドはLinux Network Administrators Guideを参照下さい。 Debianシステム上の伝統的なTCP/IPネットワークのセットアップは ifupdownパッケージをよる高レベルのツールとして使います。2つの場 合があります。 ● 可動PCのような動的IPシステムの場合、TCP/IPネットワークを resolvconfパッケージを使い設定し、容易にネットワーク設定を切 り替えられるようにしましょう(項5.3.4. 「DHCPサービスを受ける ネットワークインターフェース」参照)。 ● サーバーのような静的IPシステムの場合、TCP/IPネットワークを resolvconfパッケージを使うことなく設定し、システムを単純にし ましょう(項5.3.5. 「静的IPを使うネットワークインターフェース 」参照)。 ここでは伝統的な場合を詳細に説明します。 また、ワイヤレスネットワークの設定を容易にするnetwork-managerや wicdのような代替の高レベルツールにもここで少し触れていきます(項 5.5.2. 「自動ネットワーク設定」参照)。 5.1. 基本的ネットワークインフラ 現代的なDebianシステムの基本的ネットワークインフラをレビューしま す。 5.1.1. ドメイン名 ドメイン名を名付けるのは通常PCワークステーションのユーザーにとっ てはトリッキーです。PCワークステーションは、ネットワークを渡り歩 く可動PCかもしれないし、インターネットからアクセスできないNATフ ァイアーウォールの背後にあるかもしれません。そのような場合、ドメ イン名がかち合うのを避けるために有効なドメイン名をドメイン名とし て選びたくないでしょう。 rfc2606によると、インターネットから確実に無効なドメイン名を作る ためにはトップレベルドメイン(TLD)の選択として"invalid"が良い選択 のようです。 mDNSネットワーク探索プロトコル(Apple Bonjour / Apple Rendezvous 、Debian上のAvahi)は、"local"を擬似トップレベルドメインとして使 います。Microsoftも"local"をローカルエリアネットワークのTLDとし て推奨しているようでもあります。 無効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 . # 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 上記中のは、"/etc/hostname"で定義される自分自身のホス ト名と一致します。上記中のは、このホストの完全修飾 ドメイン名(FQDN)です。 ティップ 真のFQDNを持たない可動PCでは、この設定ファイル中の のTLD部分に、実在しない"invalid"とかmDNSの"local"を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(項3.5.11. 「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 — │255.255.0.0 │/16 │16 │ │ │172.31.x.x │ │ │ │ ├────┼──────────────────┼─────────────┼─────────────┼──────────┤ │C │192.168.0.x — │255.255.255.0│/24 │256 │ │ │192.168.255.x │ │ │ │ └────┴──────────────────┴─────────────┴─────────────┴──────────┘ 注意 これらのアドレス内の1つがホストに付与されている場合、そのホスト はインターネットを直接アクセスせずに、各サービスのプロキシとなる かネットワークアドレス変換(NAT)をするゲートウエーを通してアクセ スしなければいけません。ブロードバンドルーターは消費者LAN環境の ために通常NATを行います。 5.1.5. ネットワーク設定インフラ Linuxのネットワークシステムには2タイプの低レベルネットワークプロ グラムがあります(項5.6.1. 「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"参照)。 ifplugdやguessnetやifscheme等のifupdownパッケージの補助スクリプ トが有線LAN上の可動PCのためのネットワーク環境設定のようなネット ワーク環境の動的設定を自動化するために作られています。これらはち ょっと使い難いですが、既存のifupdownシステムとは反りが合います。 ifupdownシステムと独立な、network-managerやwicd等の代替となる高 レベルネットワーク設定システムはワイアレスネットワーク上の可動PC も含めたネットワーク環境を楽に設定するために作られました。これら は比較的新しくそのDebianシステムへの統合は進行中なので、これらと ifupdownがかち合うことを避けるために"/etc/network/interfaces"中 の対応するネットワークインターフェースを手動で無効にする必要があ るかもしれません。(項5.5.2. 「自動ネットワーク設定」参照)。 表 5.2. GUIのネットワーク設定ツール ┌─────────────────────┬───────┬─────┬──────────────┬──────────────┐ │パッケージ │ポプコ │サイ │タイプ │説明 │ │ │ン │ズ │ │ │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │ネットワークを│ │ │V:61, │ │ │接続したり切断│ │ifupdown * │I:99 │148 │設定::ifupdown│したりする標準│ │ │ │ │ │化されたツール│ │ │ │ │ │(Debian特定) │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │V:0.5, │ │ │有線ネットワー│ │ifplugd * │I:0.9 │332 │, , │クを自動的に管│ │ │ │ │ │理 │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │"ifupdown"パッ│ │ │V:0.05,│ │ │ケージを強化す│ │ifupdown-extra * │I:0.2 │124 │, , │るネットワーク│ │ │ │ │ │テストスクリプ│ │ │ │ │ │ト │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │ネットワークイ│ │ifmetric * │V:0.02,│100 │, , │ンターフェース│ │ │I:0.08 │ │ │の経路メトリッ│ │ │ │ │ │ク設定 │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │"/etc/network/│ │ │ │ │ │interfaces"フ │ │ │V:0.09,│ │ │ァイル経由で │ │guessnet * │I:0.4 │496 │, , │"ifupdown"パッ│ │ │ │ │ │ケージを補強す│ │ │ │ │ │るmappingスク │ │ │ │ │ │リプト │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │"ifupdown"パッ│ │ifscheme * │V:0.03,│132 │, , │ケージを補強す│ │ │I:0.10 │ │ │るmappingスク │ │ │ │ │ │リプト │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │Zugschlusさん │ │ifupdown-scripts-zg2 │V:0.00,│ │ │のifupdownの手│ │* │I:0.05 │220 │, , │動方法のインタ│ │ │ │ │ │ーフェーススク│ │ │ │ │ │リプト │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │NetworkManager│ │network-manager * │V:27, │2176 │設定::NM │(デーモン): ネ│ │ │I:35 │ │ │ットワークを自│ │ │ │ │ │動管理 │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │network-manager-gnome│V:19, │ │ │NetworkManager│ │* │I:31 │3372 │, , │(GNOMEフロント│ │ │ │ │ │エンド) │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │V:2, │ │ │NetworkManager│ │network-manager-kde *│I:4 │3088 │, , │(KDEフロントエ│ │ │ │ │ │ンド) │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │V:1.4, │ │ │有線と無線のネ│ │wicd * │I:1.8 │2524 │設定::wicd │ットワークマネ│ │ │ │ │ │ージャー │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │パケットフィル│ │iptables * │V:26, │1384 │設 │ターとNATのた │ │ │I:99 │ │定::Netfilter │めの管理ツール│ │ │ │ │ │(Netfilter) │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │iproute2、IPv6│ │iproute * │V:37, │1000 │設定::iproute2│や他の上級ネッ│ │ │I:79 │ │ │トワーク設定: │ │ │ │ │ │ip(8)やtc(8)等│ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │各種の静的クラ│ │ │ │ │ │イテリアに基づ│ │ │V:0.2, │ │ │きネットワーク│ │ifrename * │I:0.7 │108 │, , │インターフェー│ │ │ │ │ │スを改名しま │ │ │ │ │ │す: ifrename │ │ │ │ │ │(8) │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │V:3, │ │ │Ethernetデバイ│ │ethtool * │I:12 │200 │, , │ス設定の表示と│ │ │ │ │ │変更 │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │ホスト名かIPア│ │ │ │ │ │ドレスによって│ │ │V:37, │ │ │リモートホスト│ │iputils-ping * │I:99 │140 │test::iproute2│のネットワーク│ │ │ │ │ │からの到達性を│ │ │ │ │ │テスト(旧来、 │ │ │ │ │ │GNU) │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │ARPアドレスに │ │ │ │ │ │よって特定され│ │iputils-arping * │V:0.9, │84 │, , │るリモートホス│ │ │I:13 │ │ │トのネットワー│ │ │ │ │ │クからの到達性│ │ │ │ │ │をテスト │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │V:0.4, │ │ │リモートホスト│ │iputils-tracepath * │I:2 │120 │, , │へのネットワー│ │ │ │ │ │クパスを追跡 │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │NET-3ネットワ │ │ │ │ │ │ーキングツール│ │ │V:71, │ │設 │キット( │ │net-tools * │I:99 │1016 │定::net-tools │net-tools、 │ │ │ │ │ │IPv4ネットワー│ │ │ │ │ │ク設定): │ │ │ │ │ │ifconfig(8)等 │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │ホスト名かIPア│ │ │ │ │ │ドレスによって│ │ │V:0.05,│ │テス │リモートホスト│ │inetutils-ping * │I:0.13 │268 │ト::net-tools │のネットワーク│ │ │ │ │ │からの到達性を│ │ │ │ │ │テスト(旧来、 │ │ │ │ │ │GNU) │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │ARPアドレスに │ │ │ │ │ │よって特定され│ │arping * │V:0.6, │64 │, , │るリモートホス│ │ │I:2 │ │ │トのネットワー│ │ │ │ │ │クからの到達性│ │ │ │ │ │をテスト(旧来)│ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │リモートホスト│ │ │V:14, │ │ │へのネットワー│ │traceroute * │I:98 │184 │, , │クパスを追跡 │ │ │ │ │ │(旧来、コンソ │ │ │ │ │ │ール) │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │dhcp3-client * │V:48, │604 │設定::低レベル│DHCPクライアン│ │ │I:93 │ │ │ト │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │WPAとWPA2 │ │wpasupplicant * │V:13, │960 │, , │(IEEE 802.11i)│ │ │I:42 │ │ │のためのクライ│ │ │ │ │ │アントサポート│ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │V:8, │ │ │Linuxのワイア │ │wireless-tools * │I:26 │276 │, , │レス拡張を操作│ │ │ │ │ │するツール │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │V:7, │ │ │chatによるPPP/│ │ppp * │I:26 │1100 │, , │PPPoEコネクシ │ │ │ │ │ │ョン │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │V:0.5, │ │ │PPPoEコネクシ │ │pppoeconf * │I:4 │200 │設定::ヘルパー│ョンの設定ヘル│ │ │ │ │ │パー │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │V:0.3, │ │ │chatによるPPP │ │pppconfig * │I:3 │900 │, , │コネクションの│ │ │ │ │ │設定ヘルパー │ ├─────────────────────┼───────┼─────┼──────────────┼──────────────┤ │ │ │ │ │wvdialとpppに │ │wvdial * │V:0.6, │420 │, , │よるPPPコネク │ │ │I:2 │ │ │ションの設定ヘ│ │