Debian リファレンス

                           [FAMILY Given]

製作著作 © 2013-2024 Osamu Aoki (青木　修)

    本 Debian リファレンス (第2.143版) (2026-07-10 14:59:15 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. ポプコン
        3.5. パッケージサイズ
        3.6. 本書へのバグ報告
    4. 新規ユーザーへのリマインダー
    5. 新規ユーザーへの引用文
1. GNU/Linux チュートリアル
    1.1. コンソールの基礎
        1.1.1. シェルプロンプト
        1.1.2. GUI の下でのシェルプロンプト
        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.2.13. tmpfs
    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 の仮想ファイルシステム
    1.4. 基本の Unix 的作業環境
        1.4.1. login シェル
        1.4.2. Bash のカスタム化
        1.4.3. 特別のキーストローク
        1.4.4. マウス操作
        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. Debian パッケージ管理の前提条件
        2.1.1. Debian パッケージ管理システム
        2.1.2. パッケージ設定
        2.1.3. 基本的な注意事項
        2.1.4. 永遠のアップグレード人生
        2.1.5. Debian アーカイブの基本
        2.1.6. Debian は 100% フリーソフトウェアーです
        2.1.7. パッケージ依存関係
        2.1.8. パッケージ管理のイベントの流れ
        2.1.9. パッケージ管理のトラブルへの応急対処法
        2.1.10. Debian パッケージの選択方法
        2.1.11. 矛盾した要求への対処法
    2.2. 基本的パッケージ管理操作
        2.2.1. apt と apt-get/apt-cache と aptitude の比較
        2.2.2. コマンドラインによる基本的なパッケージ管理操作
        2.2.3. aptitude のインタラクティブな使用
        2.2.4. aptitude のキーバインディング
        2.2.5. aptitude の下でのパッケージの表示
        2.2.6. aptitude を使った探索方法
        2.2.7. aptitude の regex 式
        2.2.8. aptitude による依存関係の解決
        2.2.9. パッケージ活動ログ
    2.3. aptitude 操作例
        2.3.1. 興味あるパッケージの探索
        2.3.2. regex にマッチするパッケージ名のパッケージをリスト
        2.3.3. regex マッチをしての閲覧
        2.3.4. パッケージの完全削除
        2.3.5. 自動 / 手動インストール状態の整理
        2.3.6. システム全体のアップグレード
    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. dpkg コマンドを使っての救済
        2.6.4. 依存関係の欠落により失敗したインストール
        2.6.5. 重複するファイルを持つ相異なるパッケージ
        2.6.6. 壊れたパッケージスクリプトの修正
        2.6.7. パッケージセレクションの復元
    2.7. パッケージ管理のヒント
        2.7.1. 誰がパッケージをアップロードしたのか?
        2.7.2. APT のよるダウンロードバンド幅の制限
        2.7.3. パッケージの自動ダウンロードとアップグレード
        2.7.4. Updates と Backports
        2.7.5. 外部のパッケージアーカイブ
        2.7.6. apt-pinning を使わない混合のアーカイブソースからのパッ
        ケージ
        2.7.7. apt-pinning で候補バージョンを調整
        2.7.8. "推奨 (Recommends)" によりパッケージがインストールされ
        るのを阻止
        2.7.9. unstable からのパッケージと共に、testing を追いかける
        2.7.10. experimental からのパッケージと共に、unstable を追い
        かける
        2.7.11. 緊急ダウングレード
        2.7.12. equivs パッケージ
        2.7.13. 安定版システムへのパッケージ移植
        2.7.14. APT のためのプロキシサーバー
        2.7.15. パッケージ管理の追加参考文書
3. システムの初期化
    3.1. ブートストラッププロセスの概要
        3.1.1. 1段目: UEFI
        3.1.2. 2段目: ブートローダー
        3.1.3. 3段目: ミニ Debian システム
        3.1.4. 4段目: 普通の Debian システム
    3.2. レスキューシステム
        3.2.1. USB 上の GRUB UEFI レスキューシステム
        3.2.2. USB 上の Linux live レスキューシステム
        3.2.3. GRUBからの Linux live レスキューシステム
    3.3. Systemd
        3.3.1. Systemd init
        3.3.2. Systemd login
    3.4. カーネルメッセージ
    3.5. システムメッセージ
    3.6. システム管理
    3.7. 他のシステムモニター
    3.8. システム設定
        3.8.1. ホスト名
        3.8.2. ファイルシステム
        3.8.3. ネットワークインターフェースの初期化
        3.8.4. クラウドシステムの初期化
        3.8.5. sshd サービスを調整するカスタム化例
    3.9. udev システム
    3.10. カーネルモジュール初期化
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. インターネット上でセキュアーなパスワード
        4.6.2. セキュアーシェル
        4.6.3. インターネットのためのセキュリティー強化策
        4.6.4. root パスワードのセキュリティー確保
    4.7. 他のアクセスコントロール
        4.7.1. アクセス制御リスト (ACLs)
        4.7.2. sudo
        4.7.3. PolicyKit
        4.7.4. サーバーのサービスへのアクセスの制限
        4.7.5. Linux のセキュリティ機能
5. ネットワークの設定
    5.1. 基本的ネットワークインフラ
        5.1.1. ホスト名の解決
        5.1.2. ネットワークインターフェース名
        5.1.3. LAN のためのネットワークアドレス範囲
        5.1.4. ネットワークデバイスサポート
    5.2. デスクトップのための現代的なネットワーク設定
        5.2.1. GUI のネットワーク設定ツール
    5.3. GUI無しの現代的なネットワーク設定
    5.4. クラウドのための現代的なネットワーク設定
        5.4.1. クラウドのための現代的なネットワーク設定
        5.4.2. クラウドのための静的IPを使う現代的なネットワーク設定
        5.4.3. クラウドのための Network Manager を使う現代的なネット
        ワーク設定
    5.5. 低水準ネットワーク設定
        5.5.1. Iproute2 コマンド
        5.5.2. 安全な低レベルネットワーク操作
    5.6. ネットワークの最適化
        5.6.1. 最適 MTU の発見
        5.6.2. WAN TCP の最適化
    5.7. Netfilter インフラ
6. ネットワークアプリケーション
    6.1. ウェッブブラウザー
        6.1.1. User-Agent 文字列をスプーフィングする
        6.1.2. ブラウザー拡張
    6.2. メールシステム
        6.2.1. Eメールの基本
        6.2.2. 現代的なメールサービスの制約
        6.2.3. 歴史的なメールサービスへの期待
        6.2.4. メール転送エージェント (MTA)
    6.3. リーモートアクセスサーバーとユーティリティー (SSH)
        6.3.1. SSH の基本
        6.3.2. リモートホストでのユーザ名
        6.3.3. リモートパスワード無しでの接続
        6.3.4. 外部 SSH クライアントへの対処法
        6.3.5. ssh-agent の設定
        6.3.6. リモートホストからメールを送信する
        6.3.7. SMTP/POP3 トンネルをするためのポートフォワーディング
        6.3.8. SSH 上のリモートシステムをシャットダウンする方法
        6.3.9. SSH のトラブルシュート
    6.4. プリントサーバーとユーティリティー
    6.5. 他のネットワークアプリケーションサーバー
    6.6. 他のネットワークアプリケーションクライアント
    6.7. システムデーモンの診断
7. GUI システム
    7.1. GUI デスクトップ環境
    7.2. GUI 通信プロトコル
    7.3. GUI インフラストラクチャー
    7.4. GUI アプリケーション
    7.5. ユーザーディレクトリー
    7.6. フォント
        7.6.1. 基本的なフォント
        7.6.2. フォントのラスタ化
    7.7. サンドボックス
    7.8. リモートデスクトップ
    7.9. Xサーバ接続
        7.9.1. X サーバローカル接続
        7.9.2. X サーバリモート接続
        7.9.3. X サーバ chroot 接続
    7.10. クリップボード
8. I18N と L10N
    8.1. ロケール
        8.1.1. UTF-8 ロケールを使う根拠
        8.1.2. ロケールの再設定
        8.1.3. ファイル名の符号化方式
        8.1.4. 地域化されたメッセージと翻訳された文書
        8.1.5. ロケールの効果
    8.2. キーボード入力
        8.2.1. Linux コンソールと X Window 用のキーボードインプット
        8.2.2. Wayland 向けのキーボード入力
        8.2.3. IBus を使うインプットメソッドのサポート
        8.2.4. Fcitx を使うインプットメソッドのサポート
        8.2.5. 日本語の例
    8.3. ディスプレー出力
        8.3.1. ターミナルの設定
        8.3.2. 東アジア不明瞭文字幅文字
9. システムに関するティップ
    9.1. コンソールのティップ
        9.1.1. シェルの活動を綺麗に記録
        9.1.2. screen プログラム
        9.1.3. ディレクトリー間移動
        9.1.4. Readline のラッパー
        9.1.5. ソースコードツリーのスキャン
    9.2. Vim のカスタム化
        9.2.1. 内部機能を使った vim のカスタマイズ
        9.2.2. 外部パッケージを使った vim のカスタマイズ
    9.3. データーの記録と表現
        9.3.1. ログデーモン
        9.3.2. ログアナライザー
        9.3.3. テキストデーターのカスタム化表示
        9.3.4. 時間と日付のカスタム化表示
        9.3.5. 着色化されたシェル出力
        9.3.6. 着色化されたコマンド
        9.3.7. 複雑な反復のためにエディターでの活動を記録
        9.3.8. X アプリケーションの画像イメージの記録
        9.3.9. 設定ファイルの変更記録
    9.4. プログラム活動の監視と制御と起動
        9.4.1. プロセスの時間計測
        9.4.2. スケジューリングの優先度
        9.4.3. ps コマンド
        9.4.4. top コマンド
        9.4.5. プロセスによって開かれているファイルのリスト
        9.4.6. プログラム活動の追跡
        9.4.7. ファイルやソケットを使っているプロセスの識別
        9.4.8. 一定間隔でコマンドを反復実行
        9.4.9. ファイルに関してループしながらコマンドを反復実行
        9.4.10. GUI からプログラムをスタート
        9.4.11. スタートするプログラムのカスタム化
        9.4.12. プロセスの停止
        9.4.13. タスク1回実行のスケジュール
        9.4.14. タスク定期実行のスケジュール
        9.4.15. イベントに合わせたタスクのスケジュール
        9.4.16. Alt-SysRq キー
    9.5. システム管理ティップ
        9.5.1. だれがシステムを利用している?
        9.5.2. 全員への警告
        9.5.3. ハードウエアーの識別
        9.5.4. ハードウエアー設定
        9.5.5. システムとハードウエアーの時間
        9.5.6. 音のインフラ
        9.5.7. スクリーンセーバーの無効化
        9.5.8. ブザー音の無効化
        9.5.9. メモリー使用状況
        9.5.10. システムのセキュリティーと整合性のチェック
    9.6. データー保存のティップ
        9.6.1. ディスク空間の利用状況
        9.6.2. ディスクパーティション設定
        9.6.3. UUID を使ってパーティションをアクセス
        9.6.4. LVM2
        9.6.5. ファイルシステム設定
        9.6.6. ファイルシステムの生成と整合性チェック
        9.6.7. マウントオプションによるファイルシステムの最適化
        9.6.8. スーパーブロックによるファイルシステムの最適化
        9.6.9. ハードディスクの最適化
        9.6.10. ソリッドステートドライブの最適化
        9.6.11. SMART を用いたハードディスクの破壊の予測
        9.6.12. $TMPDIR 経由で一時保存ディレクトリーを指定
        9.6.13. LVM を使う使用可能なストレージ空間の拡張
        9.6.14. 他パーティションをマウントする使用可能なストレージ空
        間の拡張
        9.6.15. 他ディレクトリーをバインドマウントする使用可能なスト
        レージ空間の拡張
        9.6.16. 他ディレクトリーをオーバーレーマウントすることで使用
        可能なストレージ空間を拡張
        9.6.17. シムリンクを使う使用可能なストレージ空間の拡張
    9.7. ディスクイメージ
        9.7.1. ディスクイメージの作成
        9.7.2. ディスクに直接書込み
        9.7.3. ディスクイメージファイルをマウント
        9.7.4. ディスクイメージのクリーニング
        9.7.5. 空のディスクイメージ作成
        9.7.6. ISO9660 イメージファイル作成
        9.7.7. CD/DVD-R/RW に直接書込み
        9.7.8. ISO9660 イメージファイルをマウント
    9.8. バイナリーデーター
        9.8.1. バイナリーデーターの閲覧と編集
        9.8.2. ディスクをマウントせずに操作
        9.8.3. データーの冗長性
        9.8.4. データーファイルの復元と事故の証拠解析
        9.8.5. 大きなファイルを小さなファイルに分割
        9.8.6. ファイル内容の消去
        9.8.7. ダミーファイル
        9.8.8. ハードディスクの全消去
        9.8.9. ハードディスク未使用部分の全消去
        9.8.10. 削除されたがまだオープン中のファイルの復活法
        9.8.11. 全てのハードリンクを検索
        9.8.12. 見えないディスクスペースの消費
    9.9. データー暗号化ティップ
        9.9.1. dm-crypt/LUKS を使ったリムーバブルディスクの暗号化
        9.9.2. dm-crypt/LUKS で暗号化されたディスクのマウント
    9.10. カーネル
        9.10.1. カーネル変数
        9.10.2. カーネルヘッダー
        9.10.3. カーネルと関連モジュールのコンパイル
        9.10.4. カーネルソースのコンパイル: Debian カーネルチーム推奨
        9.10.5. ハードウエアードライバーとファームウエアー
    9.11. 仮想化システム
        9.11.1. 仮想化やエミュレーションツール
        9.11.2. 仮想化の業務フロー
        9.11.3. 仮想ディスクイメージファイルをマウント。
        9.11.4. Chroot システム
        9.11.5. 複数のデスクトップシステム
10. データー管理
    10.1. 共有とコピーとアーカイブ
        10.1.1. アーカイブと圧縮ツール
        10.1.2. コピーと同期ツール
        10.1.3. アーカイブの慣用句
        10.1.4. コピーの慣用句
        10.1.5. ファイル選択の慣用句
        10.1.6. アーカイブメディア
        10.1.7. リムーバブルストレージデバイス
        10.1.8. データー共有用のファイルシステム選択
        10.1.9. ネットワーク経由でのデーター共有
    10.2. バックアップと復元
        10.2.1. バックアップと復元のポリシー
        10.2.2. バックアップユーティリティーのスイート
        10.2.3. バックアップのティップ
    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.3.6. パスワードキーリング
    10.4. ソースコードマージツール
        10.4.1. ソースファイル間の相違の抽出
        10.4.2. ソースファイルに更新をマージ
        10.4.3. インタラクティブなマージ
    10.5. Git
        10.5.1. Git クライアントの設定
        10.5.2. 基本 Git コマンド
        10.5.3. Git ティップ
        10.5.4. Git リファレンス
        10.5.5. 他のバージョンコントロールシステム
11. データー変換
    11.1. テキストデーター変換ツール
        11.1.1. テキストファイルを iconv を使って変換
        11.1.2. ファイルが UTF-8 であると iconv を使い確認
        11.1.3. iconv を使ってファイル名変換
        11.1.4. 行末変換
        11.1.5. タブ変換
        11.1.6. 自動変換付きエディター
        11.1.7. プレーンテキスト抽出
        11.1.8. プレーンテキストデーターをハイライトとフォーマット
    11.2. XML データー
        11.2.1. XML に関する基本ヒント
        11.2.2. XML 処理
        11.2.3. XML データー抽出
        11.2.4. XML データーの静的解析
    11.3. タイプセッティング
        11.3.1. roff タイプセッティング
        11.3.2. TeX/LaTeX
        11.3.3. マニュアルページを綺麗に印刷
        11.3.4. マニュアルページの作成
    11.4. 印刷可能データー
        11.4.1. Ghostscript
        11.4.2. 2つの PS や PDF ファイルをマージ
        11.4.3. 印刷可能データーユーティリティー
        11.4.4. CUPS を使って印刷
    11.5. メールデーター変換
        11.5.1. メールデーターの基本
    11.6. 画像データーツール
        11.6.1. 画像データーツール (メタパッケージ)
        11.6.2. 画像データーツール (GUI)
        11.6.3. 画像データーツール (CLI)
    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.2. インタープリター言語でのスクリプティング
        12.2.1. インタープリター言語コードのデバグ
        12.2.2. シェルスクリプトを使った GUI プログラム
        12.2.3. GUI フィルター用のカスタム動作集
        12.2.4. 究極の短い Perl スクリプト
    12.3. コンパイル言語でのコーディング
        12.3.1. C
        12.3.2. 単純な C プログラム (gcc)
        12.3.3. Flex — 改良版 Lex
        12.3.4. Bison — 改良版 Yacc
    12.4. 静的コード分析ツール
    12.5. デバグ
        12.5.1. 基本的な gdb 実行
        12.5.2. Debian パッケージのデバグ
        12.5.3. バックトレースの収集
        12.5.4. 高度な gdb コマンド
        12.5.5. ライブラリーへの依存の確認
        12.5.6. 動的呼び出し追跡ツール
        12.5.7. X エラーのデバグ
        12.5.8. メモリーリーク検出ツール
        12.5.9. バイナリーのディスアッセンブリー
    12.6. ビルドツール
        12.6.1. Make
        12.6.2. Autotools
        12.6.3. Meson
    12.7. ウェッブ
    12.8. ソースコード変換
    12.9. 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. Debian 上でのマウス操作と関連キー操作のリスト
1.16. 基本の Vim キーストロークのリスト
1.17. 基本の Unix コマンドのリスト
1.18. ロケールの値の3つの部分
1.19. 推奨ロケールのリスト
1.20. "$HOME" の値のリスト
1.21. シェルグロブパターン
1.22. コマンドの終了コード
1.23. シェルコマンドの慣用句
1.24. 事前定義されたファイルデスクリプタ
1.25. BRE と ERE のメタ文字
1.26. 置換式
1.27. コマンドをパイプするためのスクリプト断片
2.1. Debian のパッケージ管理ツールのリスト
2.2. Debian アーカイブサイトのリスト
2.3. Debian アーカイブエリアのリスト
2.4. スイーツとコード名の関係
2.5. 特定パッケージの問題解決のためのキーとなるウェッブサイトのリスト
2.6. apt(8) や 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. apt-pinning テクニックに関する特記すべき Pin-Priority 値をリス
トします。
2.19. Debian アーカイブ専用のプロキシツールのリスト
3.1. ブートローダーのリスト
3.2. /boot/grub/grub.cfg の上記部分のメニューエントリーの意味
3.3. Debian システムのブートユーティリティーのリスト
3.4. カーネルエラーレベルのリスト
3.5. 典型的な journalctl コマンド断片の例
3.6. 典型的な systemctl コマンド断片の例
3.7. systemd の下での他のモニタリングコマンドのリスト
4.1. 3つの pam_unix(8) に関する重要な設定ファイル
4.2. "/etc/passwd" の2番目のエントリーの内容
4.3. アカウント情報を管理するコマンドのリスト
4.4. パスワード生成ツールのリスト
4.5. 特記すべき PAM と NSS システムのリスト
4.6. PAM NSS によりアクセスされる設定ファイルのリスト
4.7. インセキュアーとセキュアーのサービスとポートのリスト
4.8. 追加セキュリティー策を提供するツールのリスト
5.1. GUI のネットワーク設定ツール
5.2. ネットワークアドレス範囲のリスト
5.3. 旧式の net-tools コマンドと新しい iproute2 コマンド等との翻訳表
5.4. 低レベルネットワークコマンドのリスト
5.5. ネットワーク最適化ツールのリスト
5.6. 最適 MTU 値の基本的なガイドライン
5.7. ファイアーウォールツールのリスト
6.1. ウェッブブラウザーのリスト
6.2. メールユーザーエージェント (MUA) のリスト
6.3. 基本的なメール転送エージェント関連パッケージのリスト
6.4. 重要 postfix マニュアルページのリスト
6.5. メールアドレス関連のファイルのリスト
6.6. 基本的 MTA 操作のリスト
6.7. リモートアクセスサーバーとユーティリティーのリスト
6.8. SSH 設定ファイルのリスト
6.9. SSH クライアント起動例のリスト
6.10. 他のプラットフォーム上で使えるフリーな SSH クライアントのリスト
6.11. プリントサーバーとユーティリティーのリスト
6.12. 他のネットワークアプリケーションサーバー
6.13. 他のネットワークアプリケーションクライアント
6.14. よく使われる RFC のリスト
7.1. デスクトップ環境のリスト
7.2. データーインフラパッケージのリスト
7.3. 特筆すべき GUI アプリケーションのリスト
7.4. 特記すべき TrueType や OpenType フォントのリスト
7.5. 有用フォント環境と関連パッケージのリスト
7.6. 特記すべきサンドボックス環境や関連のパッケージのリスト
7.7. 特記すべきリモートアクセスサーバーのリスト
7.8. X サーバーへの接続方法のリスト
7.9. 文字クリップボードの操作関連プログラムのリスト
8.1. IBusとプラグインパッケージのリスト
8.2. Fcitx5とプラグインパッケージのリスト
9.1. コンソールの活動をサポートするプログラムのリスト
9.2. screen キーバインディングのリスト
9.3. vim 初期化に関する情報
9.4. システムログアナライザーのリスト
9.5. "ls -l" コマンドを時間スタイル値とともに用いた場合の時間と日付の
例
9.6. 画像の操作ツールのリスト
9.7. 設定の履歴を記録するパッケージのリスト
9.8. プログラム活動の監視と制御のツールのリスト
9.9. スケジューリングの優先度のためのナイス値のリスト
9.10. ps コマンドのスタイルのリスト
9.11. kill コマンドが良く使うシグナルのリスト
9.12. 特記すべき SAK コマンドキーのリスト
9.13. ハードウエアー識別ツールのリスト
9.14. ハードウエアー設定ツールのリスト
9.15. サウンドパッケージのリスト
9.16. スクリーンセーバーを無効にするコマンドのリスト
9.17. 報告されるメモリーサイズのリスト
9.18. システムセキュリティーや整合性確認のためのツールリスト
9.19. ディスクパーティション管理パッケージのリスト
9.20. ファイルシステム管理用パッケージのリスト
9.21. バイナリーデーターを閲覧や編集するパッケージのリスト
9.22. ディスクをマウントせずに操作するパッケージのリスト
9.23. ファイルにデーターの冗長性を追加するツールのリスト
9.24. データーファイルの復元と事故の証拠解析のリスト
9.25. データー暗号化ユーティリティーのリスト
9.26. Debian システム上でカーネルの再コンパイルためにインストールする
重要パッケージのリスト
9.27. 仮想化ツールのリスト
10.1. アーカイブと圧縮ツールのリスト
10.2. コピーと同期ツールのリスト
10.3. 典型的な使用シナリオに合わせたリムーバブルストレージデバイスの
ファイルシステムの選択肢のリスト
10.4. 典型的使用シナリオの場合のネットワークサービスの選択のリスト
10.5. バックアップスイートのユーティリティーのリスト
10.6. データーセキュリティーインフラツールのリスト
10.7. キー管理のための GNU プライバシガードコマンドのリスト
10.8. トラストコードの意味のリスト
10.9. ファイルに使用する GNU プライバシーガードコマンドのリスト
10.10. ソースコードマージツールのリスト
10.11. git 関連のパッケージとコマンドのリスト
10.12. 主要 Git コマンド
10.13. Git ティップ
10.14. 他のバージョンコントロールシステムツールのリスト
11.1. テキストデーター変換ツールのリスト
11.2. 符号化方式値とその使い方リスト
11.3. 異なるプラットフォーム上での行末スタイルのリスト
11.4. bsdmainutils と coreutils パッケージ中のタブ変換コマンドのリス
ト
11.5. プレーンテキストデーター抽出ツールのリスト
11.6. プレーンテキストデーターをハイライトするツールのリスト
11.7. XML で事前定義されているエントリーのリスト
11.8. XML ツールのリスト
11.9. DSSLツールのリスト
11.10. テキストデーター変換ツールのリスト
11.11. XML整形印刷ツールのリスト
11.12. タイプ設定ツールのリスト
11.13. マンページ作成を補助するパッケージのリスト
11.14. Ghostscript PostScript インタープリタのリスト
11.15. プリントできるデーターのユーティリティーのリスト
11.16. メールデーター変換を補助するパッケージのリスト
11.17. 画像データーツールのリスト (メタパッケージ)
11.18. 画像データーツール (GUI) のリスト
11.19. 画像データーツールのリスト (CLI)
11.20. その他のデーター変換ツールのリスト
12.1. 典型的 bashizms のリスト
12.2. シェル変数のリスト
12.3. シェル変数展開のリスト
12.4. 重要なシェル変数置換のリスト
12.5. 条件式中のファイル比較演算子
12.6. 条件式中での文字列比較演算子のリスト
12.7. シェルスクリプト用の小さなユーティリティープログラムを含むパッ
ケージのリスト
12.8. インタープリター関連のパッケージのリスト
12.9. ダイアログプログラムのリスト
12.10. コンパイラ関連のパッケージのリスト
12.11. Yacc 互換の LALR パーサー生成ソフトのリスト
12.12. 静的コード分析ツールのリスト
12.13. デバッグパッケージのリスト
12.14. 高度な gdb コマンドのリスト
12.15. メモリーリーク検出ツールのリスト
12.16. ビルドツールパッケージのリスト
12.17. make の自動変数のリスト
12.18. make 変数の展開のリスト
12.19. ソースコード変換ツールのリスト

序章

目次

1. 免責事項
2. Debian とはなにか
3. 本書について
    3.1. 編集指針
    3.2. 前提条件
    3.3. 文書様式
    3.4. ポプコン
    3.5. パッケージサイズ
    3.6. 本書へのバグ報告
4. 新規ユーザーへのリマインダー
5. 新規ユーザーへの引用文

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

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

インスト─ルの方法は、以下を参照下さい:

  * 現行安定システム用 Debian GNU/Linux インストールガイド

  * 現行テスティング (testing) システム用 Debian GNU/Linux インストー
    ルガイド

1. 免責事項

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

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

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

2. Debian とはなにか

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

      * ソフトウェアの自由へのコミットメント: Debian 社会契約と
        Debian フリーソフトウェアーガイドライン (DFSG)

      * インターネット上の分散型の無償ボランティア活動: https://
        www.debian.org

      * 多数のプリコンパイルされた高品質のソフトウェアーパッケージ
   
      * セキュリティー更新への平易なアクセス提供による、安定性とセキ
        ュリティーの重視

      * テスト版 testing アーカイブによる、最新のソフトウェアーへの円
        滑なアップグレードの重視

      * 多数のサポートされたハードウエアーアーキテクチャー

    Debian の中のフリーソフトウェアー構成要素は、GNU や Linux や BSD
    や X や ISC や Apache や Ghostscript や Common Unix Printing
    System や Samba や GNOME や KDE や Mozilla や LibreOffice や Vim
    や TeX や LaTeX や DocBook や Perl や Python や Tcl や Java や
    Ruby や PHP や Berkeley DB や MariaDB や PostgreSQL や SQLite や
    Exim や Postfix や Mutt や FreeBSD や OpenBSD や Plan 9 やその他
    の多くの独立のフリーソフトウェアーのプロジェクトに由来します。
    Debian はこの多種多様なフリーソフトウェアーを 1つのシステムにまと
    め上げます。

3. 本書について

3.1. 編集指針

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

      * 概論を提供し枝葉末節は省略します。(全体像)

      * 簡潔を心がけました。(KISS)

      * 車輪の再発明をしません。(既存の参考文献へのポインターの利用)

      * 非 GUI ツールとコンソールを重視します。(シェル例示を使用)

      * 客観的であるようにします。(ポプコン等の利用)

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

3.2. 前提条件

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

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

      * 一般的情報は https://www.debian.org にある Debian サイト

      * "/usr/share/doc/package_name" ディレクトリー下にある文書

      * Unix スタイルのマンページ: "dpkg -L package_name |grep '/man/
        man.*/'"

      * GNU スタイルの info ページ: "dpkg -L package_name |grep '/
        info/'"

      * バグレポート: https://bugs.debian.org/package_name
   
      * 変化中の事や特定案件に関しては、https://wiki.debian.org/ にあ
        る Debian の Wiki

      * Open Group の The UNIX System Home Page 中の Single UNIX
        Specification

      * https://www.wikipedia.org/ にある Wikipedia のフリーの百科事
        典

      * The Debian Administrator's Handbook

      * The Linux Documentation Project (TLDP) の HOWTO 集

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

3.3. 文書様式

    bash(1) シェルコマンドの例示をする以下のような簡略化した表現スタ
    イルで本書は情報を提供します。

    # command-in-root-account
    $ command-in-user-account

    これらのシェルプロンプトは使われるアカウントを区別します。これは
    ちょうど環境変数として: "PS1='\$'" と "PS2=' '" を設定した場合に
    相当します。これらの環境変数値はあくまで本書の読みやすさのためで
    、実際のインストール済みシステではほとんど見かけません。

    すべてのコマンド例は英語ロケール "LANG=en_US.UTF8" 下で実行されま
    す。コマンド例中の command-in-root-account や 
    command-in-user-account 等のプレースホルダー文字列が翻訳されると
    は期待しないで下さい。これは全ての翻訳された例が最新版であるよう
    するための意識的な選択です。

    注記
   
    "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/apt/" のように表現されます。読者は以下のように
    タイプして情報を得るように心がけて下さい。

    $ mc "/etc/apt/"

    パッケージ名はその名をタイプライターフォントで書き "vim" のように
    表現されます。読者は以下のようにタイプして情報を得るように心がけ
    て下さい。

    $ dpkg -L vim
    $ apt-cache show vim
    $ aptitude show vim

    文書は、その場所のファイル名でダブルクォーテションマーク間にタイ
    プライターフォントで書き "/usr/share/doc/base-passwd/
    users-and-groups.txt.gz" や "/usr/share/doc/base-passwd/
    users-and-groups.html" のように表現されたり、その場所の URL で
    https://www.debian.org のように表現されます。読者は以下のようにタ
    イプして情報を得るように心がけて下さい。

    $ zcat "/usr/share/doc/base-passwd/users-and-groups.txt.gz" | sensible-pager
    $ sensible-browser "/usr/share/doc/base-passwd/users-and-groups.html"
    $ sensible-browser "https://www.debian.org"

    環境変数は、頭に "$" がついた名前をダブルクォーテションマーク間に
    タイプライターフォントで書き、"$TERM" のように表現されます。読者
    は以下のようにタイプして情報を得るように心がけて下さい。

    $ echo "$TERM"

3.4. ポプコン

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

    注記

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

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

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

    注記

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

3.5. パッケージサイズ

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

    注記

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

    注記

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

3.6. 本書へのバグ報告

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

4. 新規ユーザーへのリマインダー

    新規ユーザーへのリマインダーを以下に記します:

      * データをバックアップします

          + 「バックアップと復元」を参照下さい。

      * パスワードとセキュリティーキーを保護します

      * KISS (keep it simple stupid、簡潔性尊重原則)

          + システムを過剰にエンジニアリングしてはいけません

      * ログファイルを読みます

          + 最初のエラーが大事なエラーです

      * RTFM (read the fine manual、良く書かれているマニュアルを読み
        ましょう)

      * 質問する前にインターネットを検索しましょう

      * 必要もないのに root になってはいけません

      * パッケージ管理システムを改変してはいけません

      * 自分が理解していないことを入力してはいけません

      * (全セキュリティレビューを受ける前に) ファイルのパーミッション
        を変更してはいけません

      * あなたの変更をテストするまでrootシェルを離れてはいけません

      * 代替ブートメディア (USBフラッシュドライブ、CD-ROM, …) を常に
        確保します。

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

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

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

    ウイキペディアの "Unix philosophy" という記事に、おもしろい格言集
    があります。

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

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

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

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

    注記

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

1.1. コンソールの基礎

1.1.1. シェルプロンプト

    GNOME や KDE 等のデスクトップシステム等のような GUI 環境をインス
    トールした場合以外には、システム起動の際に文字の login スクリーン
    が現れます。あなたのホスト名が foo と仮定すると、login プロンプト
    は次に示すような見えます。

    GUI 環境をインストールした場合でも、Ctrl-Alt-F3 で文字ベースのロ
    グインプロンプトが出ますし、Ctrl-Alt-F2 で GUI 環境に戻れます (詳
    細は下記の「仮想コンソール」を参照下さい)。

    foo login:

    login プロンプトであなたのユーザー名 (例えば penguin) を打鍵し
    Enter キーを押します。さらにあなたのパスワードを打鍵し Enter キー
    を再び押します。

    注記

    Unix の伝統に従い、Debian システムではユーザー名とパスワードに関
    して大文字小文字の区別をします。ユーザー名は通常小文字のみから選
    ばれます。最初のユーザーアカウントは通常インストールの際に作られ
    ます。追加のユーザーアカウントは root によって adduser(8) を用い
    て作られます。

    "/etc/motd" (本日のメッセージ: Message Of The Day) に保存されてい
    る歓迎メッセージとコマンドプロンプトを表示しシステムが起動されま
    す。

    Debian GNU/Linux 12 foo tty3

    foo login: penguin
    Password:

    Linux foo 6.5.0-0.deb12.4-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.5.10-1~bpo12+1 (2023-11-23) 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.

    Last login: Wed Dec 20 09:39:00 JST 2023 on tty3
    foo:~$

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

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

    インストールの際に GUI 環境をインストールした場合、システム起動時
    にグラフィカルなログイン画面が表示されます。あなたのユーザー名と
    パスワードを入力することで非特権ユーザーアカウントにログインでき
    ます。タブ (tab) を用いたりマウスの第一クリックを用いるとユーザー
    名とパスワードの間を行き来できます。

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

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

1.1.3. root アカウント

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

      * ファイルパーミッションによらずシステム上の任意ファイルに関し
        ての、読出しと書込みと削除

      * システム上のいかなるファイルに関して、ファイルの所有者やパー
        ミッション設定

      * システム上の非特権ユーザーのパスワードを設定

      * パスワード無しに任意アカウントへの login

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

    警告
   
    root のパスワードを第三者に決して教えてはいけません。

    注記

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

1.1.4. root シェルプロンプト

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

      * 文字ベースのログインプロンプトに root と入力します。

      * どのユーザーシェルプロンプトからでも "su -l" と入力します。

          + 現ユーザーの環境を一切引き継がません。

      * どのユーザーシェルプロンプトからでも "su" と入力します。

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

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

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

    警告

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

    あなたの X スクリーンを覗き見られるかもしれないので、X Window 下
    で信頼できないリモートの GUI プログラムを決して実行してはいけませ
    ん。

1.1.6. 仮想コンソール

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

    GUI 環境下では、Ctrl-Alt-F3 キーを押す、つまり left-Ctrl-key と
    left-Alt-key と F3-key キーを同時に押すと文字コンソール3にアクセ
    スできます。普通仮想コンソール2で実行されている GUI 環境には
    Alt-F2 を押すことにより戻れます。

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

    # chvt 3

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

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

1.1.9. 合理的なコンソールの復元

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

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

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

    # apt-get update
     ...
    # apt-get install mc vim sudo aptitude
     ...

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

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

    +---------------------------------------------------------------+
    |パッケー |ポプコ|サイ |                  説明                  |
    |   ジ    |  ン  | ズ  |                                        |
    |---------+------+-----+----------------------------------------|
    |mc       |V:41, |1590 |テキストモードの全画面ファイルマネージャ|
    |         |I:182 |     |ー                                      |
    |---------+------+-----+----------------------------------------|
    |sudo     |V:750,|6774 |ユーザーに限定的な root 権限を与えるプロ|
    |         |I:866 |     |グラム                                  |
    |---------+------+-----+----------------------------------------|
    |         |V:85, |     |Unix テキストエディター Vi IMproved (改 |
    |vim      |I:347 |4135 |良版 Vi)、プログラマーのためのテキストエ|
    |         |      |     |ディター (標準版)                       |
    |---------+------+-----+----------------------------------------|
    |         |V:57, |     |Unix テキストエディター Vi IMproved (改 |
    |vim-tiny |I:979 |1862 |良版 Vi)、プログラマーのためのテキストエ|
    |         |      |     |ディター (軽量版)                       |
    |---------+------+-----+----------------------------------------|
    |emacs-nox|V:3,  |46564|GNU プロジェクト Emacs、Lisp に基づく拡 |
    |         |I:13  |     |張可能なテキストエディター              |
    |---------+------+-----+----------------------------------------|
    |w3m      |V:11, |2853 |テキストモード WWW ブラウザー           |
    |         |I:137 |     |                                        |
    |---------+------+-----+----------------------------------------|
    |gpm      |V:8.7,|524  |テキストコンソール上の Unix 式のカットア|
    |         |I:9.5 |     |ンドペースト (daemon)                   |
    +---------------------------------------------------------------+


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

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

    +---------------------------------------------------------------+
    |     パッケージ     |ポプコン|サイ |           説明            |
    |                    |        | ズ  |                           |
    |--------------------+--------+-----+---------------------------|
    |doc-debian          |I:883   |185  |Debian プロジェクトの文書、|
    |                    |        |     |(Debian FAQ) 他            |
    |--------------------+--------+-----+---------------------------|
    |debian-policy       |I:7.4   |5147 |Debian ポリシーマニュアルと|
    |                    |        |     |関連文書                   |
    |--------------------+--------+-----+---------------------------|
    |developers-reference|V:0.2,  |2635 |Debian 開発者のためのガイド|
    |                    |I:2.4   |     |ラインと情報               |
    |--------------------+--------+-----+---------------------------|
    |debmake-doc         |I:0.37  |11807|Debian メンテナ向けガイド  |
    |--------------------+--------+-----+---------------------------|
    |debian-history      |I:0.52  |6251 |Debian プロジェクトの歴史  |
    |--------------------+--------+-----+---------------------------|
    |debian-faq          |I:881   |791  |Debian FAQ (よくある質問集)|
    +---------------------------------------------------------------+


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

    # apt-get install package_name

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

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

    # adduser fish

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

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

    # deluser --remove-home fish

    非Debian や特殊な Debian システム上では、より下層の useradd(8) や
    userdel(8) ユーティリティーで上記の操作を代用する必要があります。

1.1.12. sudo の設定

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

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

    これに代え、以下のようにして非特権ユーザー penguin にパスワード一
    切無しに管理者権限を与えることもよくあります。

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

    ワークステーション上であなた自身が管理者で唯一のユーザーである場
    合にのみ、このトリックを使用して下さい。

    警告

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

    注意

    上記例のような penguin のパスワードとアカウントは root パスワード
    や root アカウント同様の保護が必要です。
   
    この文脈上の管理者権限はワークステーションに関するシステム管理業
    務をする権限を与えられた人に属します。そのような権限と能力を持っ
    ていなければ、あなたの会社の管理部門の管理職や上司とはいえこのよ
    うな権限を与えてはいけません。

    注記

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

1.1.13. お遊びの時間

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

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

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

      * 「Unix-like ファイルシステム」 (基本コンセプト)

      * 「ミッドナイトコマンダー (MC)」 (サバイバル手法)

      * 「基本の Unix 的作業環境」 (基本手法)

      * 「シェルプロンプト」 (シェルのメカニズム)

      * 「Unix 的テキスト処理」 (文字処理手法)

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

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

    このようなファイルやディレクトリーはいくつかのデバイスに展開する
    ことができます。あるデバイス上にあるファイルシステムを大きなファ
    イルツリーにマウントするのに mount(8) が使われます。その逆に、そ
    れを切り離すのに umount(8) が使われます。最近の Linux カーネルで
    は、mount(8) をオプションとともに用いると、ファイルツリーの一部を
    別のところと結びつけたり、ファイルシステムを共有か非共有か従属か
    バインド不可としてマウントもできます。各ファイルシステムごとの利
    用可能なマウントオプションは "/usr/share/doc/linux-doc-*/
    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/systemd/"
        や "/usr/local/" のように、さらにサブディレクトリーに枝別れし
        ます。これらの全体をまとめてディレクトリーツリーと呼びます。
        絶対ファイル名はツリーの根元 ("/") から枝の先 (ファイル) まで
        の経路として考えることもできます。また、あたかもディレクトリ
        ーツリーをルートディレクトリー ("/") という単一人物の全直系に
        広がる家系図のように人が話すのを聞いたことがあるでしょう。あ
        たかもそれぞれのサブディレクトリーに親があるとし、パスはファ
        イルの完全な祖先の系図のように表現します。ルートディレクトリ
        ーではない他の場所から始まる相対パスもあります。ディレクトリ
        ー "../" は親ディレクトリーを参照していることを覚えておきまし
        ょう。このような呼び方はディレクトリーのような構造を持つ他の
        階層的ツリー状のデーター構造体でもよく使われます。

      * ハードディスクのような物理デバイスに対応したパス名の要素は存
        在しません。ここが、パス名に "C:\" のようなデバイス名が含まれ
        る RT-11 や CP/M や OpenVMS や MS-DOS や AmigaOS や Microsoft
        Windows と違う点です。(但し、普通のファイルシステム中に物理デ
        バイスを示すディレクトリー項目はあります。「ファイルシステム
        の内側」を参照下さい。)

    注記

    ほとんど全ての文字や記号をファイル名中に使えますが、実際そうする
    ことは賢明ではありません。スペースやタブや改行や他の特殊文字: { }
    ( ) [ ] ' ` " \ / > < | ; ! # & ^ * % @ $ はコマンドラインで特別
    な意味を持つので避けるべきです。名前の中の単語間には、ピリオドや
    ハイフンや下線を選んで区別します。各語頭を "LikeThis" のように語
    頭を大文字にすることもできます。経験を積んだ Linux のユーザーはフ
    ァイル名中にスペースが入ることを避けます。

    注記

    "root" (ルート) と言う言葉は "root ユーザー" と言う意味でも "ルー
    トディレクトリー" と言う意味でも使われます。それがいずれかは使わ
    れている文脈から明かです。

    注記

    パスと言う言葉は上述の完全に記述したファイル名に関して使われるば
    かりではなくコマンドサーチパスにも使われます。どちらの意味かは文
    脈から通常明かです。

    ファイル階層について詳細に学ぶ最も良い方法は、Filesystem
    Hierarchy Standard ("/usr/share/doc/debian-policy/fhs/
    fhs-2.3.txt.gz" や hier(7)) に記述されています。手始めとして以下
    の事実を覚えるべきです。

    表1.3 重要ディレクトリーの使い方のリスト

    +---------------------------------------------------------+
    |ディレクトリー|           ディレクトリーの用途           |
    |--------------+------------------------------------------|
    |/             |ルートディレクトリー                      |
    |--------------+------------------------------------------|
    |/etc/         |システム全体の設定ファイル                |
    |--------------+------------------------------------------|
    |/var/log/     |システムのログファイル                    |
    |--------------+------------------------------------------|
    |/home/        |全ての非特権ユーザーのホームディレクトリー|
    +---------------------------------------------------------+


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

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

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

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

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

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

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

      * ファイルを所有するユーザー (user) (u)

      * ファイルが所属するグループ (group) 中の他ユーザー (g)

      * "世界" や "全員" とも呼ばれる、全第三者 (other) ユーザー (o)

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

      * 読出し (read) (r) パーミッションはファイル内容確認を可能にし
        ます。

      * 書込み (write) (w) パーミッションはファイル内容変更を可能にし
        ます。

      * 実行 (execute) (x) パーミッションはファイルをコマンド実行を可
        能にします。

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

      * 読出し (read) (r) パーミッションはディレクトリー内容リストを
        可能にします。

      * 書込み (write) (w) パーミッションはディレクトリーへのファイル
        の追加削除を可能にします。

      * 実行 (execute) (x) パーミッションはディレクトリー内のファイル
        へのアクセスを可能にします。

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

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

      * ファイルのタイプ (最初の文字)

      * ファイルのアクセスパーミッション (以下の9文字。ユーザーとグル
        ープと第三者の順にそれぞれに対して3文字から構成されている)

      * ファイルへのハードリンク数

      * ファイルを所有するユーザー (user) の名前

      * ファイルが所属するグループ (group)

      * ファイルのサイズ (文字数、バイト)

      * ファイルの日時 (mtime)

      * ファイルの名前

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

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


    root アカウントから chown(1) を使用することでファイルの所有者を変
    更します。ファイルの所有者又は root アカウントから chgrp(1) を使
    用することでファイルのグループを変更します。ファイルの所有者又は
    root アカウントから chmod(1) を使用することでファイルやディレクト
    リーのアクセスパーミッションを変更します。foo ファイルの操作の基
    本的文法は以下の通り。

    # chown newowner foo
    # chgrp newgroup foo
    # chmod  [ugoa][+-=][rwxXst][,...] foo

    例えば以下のようにするとディレクトリーツリーの所有者をユーザー
    foo に変更しグループ bar で共有できます。

    # cd /some/location/
    # chown -R foo:bar .
    # chmod -R ug+rwX,o=rX .

    更に特殊なパーミッションビットが3つ存在します。

      * セットユーザー ID ビット (ユーザーの x に代えて s か S)

      * セットグループ ID ビット (グループの x に代えて s か S)

      * スティッキービット (第三者の x に代えて t か T)

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

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

    セットグループ ID をディレクトリーに対して設定すると、 BSD 的ファ
    イル作成手法が有効になり、ディレクトリーに作成した全ファイルが所
    属するグループがディレクトリーのものになります。

    スティッキビットをディレクトリーに対して有効にすると、ディレクト
    リーにあるファイルがファイルの所有者以外から削除されるのを防ぎま
    す。"/tmp" のような全員書込み可能ディレクトリーやグループ書込み可
    能なディレクトリーなどのにあるファイルの内容を安全にするためには
    、書込みパーミッションを無効にするだけでなく、ディレクトリーにス
    ティッキビットもセットする必要があります。さもなければ、ディレク
    トリーに書込みアクセスできるユーザーにより、ファイルが削除され、
    同じ名前で新規ファイルが作成されることを許してしまいます。

    ファイルパーミッションの興味ある例を次にいくつか示します。

    $ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4
    crw------T 1 root root   108, 0 Oct 16 20:57 /dev/ppp
    -rw-r--r-- 1 root root     2761 Aug 30 10:38 /etc/passwd
    -rw-r----- 1 root shadow   1695 Aug 30 10:38 /etc/shadow
    -rwsr-xr-x 1 root root   973824 Sep 23 20:04 /usr/sbin/exim4
    $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
    drwxrwxrwt 14 root root  20480 Oct 16 21:25 /tmp
    drwxrwsr-x 10 root staff  4096 Sep 29 22:50 /usr/local
    drwxr-xr-x 10 root root   4096 Oct 11 00:28 /usr/src
    drwxrwsr-x  2 root mail   4096 Oct 15 21:40 /var/mail
    drwxrwxrwt  3 root root   4096 Oct 16 21:20 /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 0 Oct 16 21:39 bar
    -rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo

    ヒント

    シェルスクリプトから "ls -l" で表示される情報にアクセスする必要が
    ある際には、test(1) や stat(1) や readlink(1) のような適切なコマ
    ンドの使用を考えるべきです。シェル組込みコマンドの "[" や "test"
    を使うのも手です。

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

    新規作成ファイルのやディレクトリーに適用されるパーミッションは
    umask シェル組込みコマンドを使うことにより制限できます。dash(1)
    か bash(1) か builtins(7) をご覧下さい。

     (file permissions) = (requested file permissions) & ~(umask value)

    表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 グループに所属させ
    ることがよく行われます。そのような場合には安全のため umask を0022
    に設定した方がよいでしょう。)

    ヒント
   
    ~/.bashrc ファイル中に "umask 002" と書いて UPG を有効にしましょ
    う。

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

    警告
   
    リブートやそれに類する行為をする前に未保存の変更を保存しましょう
    。

    ユーザー penguin をグループ bird に2ステップで追加できます:

      * 以下のいずれか一つでグループ設定を変更します。

          + "sudo usermod -aG bird penguin" を実行します。

          + "sudo adduser penguin bird" を実行します。(典型的 Debian
            システム上のみ)

          + /etc/group に "sudo vigr" を、/etc/gshadow に "sudo vigr
            -s" を実行し bird の行に penguin を追記します。

      * 以下のいずれか一つを使い設定を適用します。

          + コールドリブートとログイン。(最適選択肢)

          + GUI メニュー経由でのログアウト。(現代的デスクトップ環境下
            では、上手く行かないかもしれません。)

    ユーザー penguin をグループ bird から2ステップで削除できます:

      * 以下のいずれか一つでグループ設定を変更します。

          + "sudo usermod -rG bird penguin" を実行します。

          + "sudo deluser penguin bird" を実行します。(典型的 Debian
            システム上のみ)

          + /etc/group に "sudo vigr" を、/etc/gshadow に "sudo vigr
            -s" を実行し bird の行の penguin を削除します。
   
      * 以下のいずれか一つを使い設定を適用します。

          + コールドリブートとログイン。(最適選択肢)

          + "kill -TERM -1" を実行し、"systemctl restart
            NetworkManager.service" 等のような何らかの修正操作をしま
            す。

          + GUI 経由でのログアウトは Gnome Desktop では選択肢ではあり
            ません。

    現代的なデスクトップ環境では、何らかのワームリブートをしようとし
    ても本物のコールドリブートの脆弱な代用品にしかなりません。

    注記

    もし "auth optional pam_group.so" 行が "/etc/pam.d/common-auth"
    に書き加えれ、"/etc/security/group.conf" に対応する設定がされてい
    れば、実際のユーザーのグループメンバーシップは動的に割り当てられ
    ます。(4章認証とアクセスの制御を参照下さい。)

    ハードウエアーデバイスは Debian システム上では一種のファイルでし
    かありません。USB フラッシュドライブや CD-ROM のようなデバイスを
    ユーザーアカウントからアクセスするのに問題があった場合にはそのユ
    ーザーを該当するグループのメンバーにします。

    いくつかのシステムが供給するグループはそのメンバーに 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   |いかなるコマンドでもスーパーユーザー特権下で実行       |
    |-------+-------------------------------------------------------|
    |lpadmin|プリンターのデーターベースからプリンターを追加や変更や |
    |       |削除するコマンドを実行                                 |
    +---------------------------------------------------------------+


    システムが供給するユーザーやグループの完全なリストは、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 タイムスタンプのタイプのリスト

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


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

    注記
   
    GNU/Linux システム上では、実際の atime 値は歴史的 Unix 定義とは異
    なる場合があります。

      * ファイルが上書きされると、ファイルの mtime と ctime と atime
        の属性すべてが変更されます。

      * ファイルの所有者やパーミッションの変更をすると、ファイルの 
        ctime や atime アトリビュートを変えます。

      * 伝統的 Unix システム上ではファイルを読むとファイルの atime 属
        性が変更されます。

      * GNU/Linux システム上では、"strictatime" でファイルシステムを
        マウントした場合にファイルを読むとファイルの atime が変更され
        ます。

      * ファイルを初めて読み込んだときか、1日空けてアクセスした場合、
        ファイルの atime 属性の更新がGNU/Linux (Linux 2.6.30以降) の
        relatime でマウントされているファイルシステムでは生じます。

      * atime 属性は noatime でマウントされているファイルシステムでは
        、読み込み時に更新されることはありません。

    注記

    "noatime" や "relatime" マウントオプションは普通使用状況下でのフ
    ァイルシステムの読み出しパーフォーマンスを向上させるために導入さ
    れました。"strictatime" オプション下の単純なファイル読み出しオペ
    レーションは atime 属性を更新する時間のかかる書き込み操作を引き起
    こします。しかし、 atime 属性は mbox(5) ファイルを除くとほとんど
    使われることはありません。mount(8) を参照下さい。

    既存ファイルのタイムスタンプを変更するには touch(1) コマンドを使
    って下さい。

    タイムスタンプに関して、 ls コマンドは非英語ロケール
    ("fr_FR.UTF-8") でローカライズされた文字列を表示します。

    $ LANG=C  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
    $ LANG=en_US.UTF-8  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
    $ LANG=fr_FR.UTF-8  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 oct. 16 21:35 foo

    ヒント
   
    "ls -l" の出力のカスタム化は「時間と日付のカスタム化表示」を参照
    下さい。

1.2.7. リンク

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

      * ハードリンク

          + 既存ファイルの重複名

          + "ln foo bar"
   
      * シンボリックリンクもしくはシムリンク

          + 他のファイルをその名前で指す特殊ファイル

          + "ln -s foo bar"

    リンク数の変化と rm コマンドの結果の微妙な違いについての以下の例
    をご覧下さい。

    $ umask 002
    $ echo "Original Content" > foo
    $ ls -li foo
    1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo
    $ ln foo bar     # hard link
    $ ln -s foo baz  # symlink
    $ ls -li foo bar baz
    1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 bar
    1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
    1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 foo
    $ rm foo
    $ echo "New Content" > foo
    $ ls -li foo bar baz
    1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 bar
    1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
    1450183 -rw-rw-r-- 1 penguin penguin 12 Oct 16 21:48 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-rw-r-- 1 penguin penguin 0 Oct 16 21:49 mypipe
    $ cat mypipe
    hello
    [1]+  Done                    echo "hello" >mypipe
    $ ls mypipe
    mypipe
    $ rm mypipe

1.2.9. ソケット

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

    ヒント
   
    (iproute2 パッケージが提供する) "ss -t -u -a" を実行すると特定の
    システム上のソケットの全般状況がよく分かります。

1.2.10. デバイスファイル

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

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

      * 文字デバイス

          + 1文字毎にアクセス可能

          + 1文字 = 1 バイト

          + 例: キーボードデバイス、シリアルポート等
   
      * ブロックデバイス

          + 比較的大きなブロック単位でアクセス可能

          + 1 ブロック > 1 バイト

          + 例: ハードディスク等

    デバイスファイルの読出しと書込みは可能ですが、おそらく人間にとっ
    ては意味不明のバイナリーデーターがファイル中に含まれています。こ
    のようなファイルにデータ書き込むことは、ハードウェアの接続に関す
    るトラブルシューティングに役立つことがあります。例えば、プリンタ
    デバイス "/dev/lp0" にテキストファイルをダンプしたり、適切なシリ
    アルポート "/dev/ttyS0" にモデムコマンドを送ることができます。し
    かし、注意深くやらないと、大災害をもたらすことがあります。くれぐ
    れも気をつけて下さい。

    注記
   
    普通のプリンターへのアクセスは lp(1) を使います。

    以下のように ls(1) を実行するとデバイスノード番号が表示されます。

    $ ls -l /dev/sda /dev/sr0 /dev/ttyS0 /dev/zero
    brw-rw---T  1 root disk     8,  0 Oct 16 20:57 /dev/sda
    brw-rw---T+ 1 root cdrom   11,  0 Oct 16 21:53 /dev/sr0
    crw-rw---T  1 root dialout  4, 64 Oct 16 20:57 /dev/ttyS0
    crw-rw-rw-  1 root root     1,  5 Oct 16 20:57 /dev/zero

      * "/dev/sda" はメジャーデバイス番号8 とマイナーデバイス番号0 を
        持ちます。これは disk グループに所属するユーザーにより、読出
        し / 書込みアクセスが可能です。

      * "/dev/sr0" はメジャーデバイス番号11 とマイナーデバイス番号0
        を持ちます。これは cdrom グループに所属するユーザーにより、読
        出し / 書込みアクセスが可能です。
   
      * "/dev/ttyS0" はメジャーデバイス番号4 とマイナーデバイス番号64
        を持ちます。これは dialout グループに所属するユーザーにより、
        読出し / 書込みアクセスが可能です。

      * "/dev/zero" はメジャーデバイス番号1 とマイナーデバイス番号5
        を持ちます。これは誰によっても読出し / 書込みアクセスが可能で
        す。

    現代的な Linux システムでは、"/dev/" の下のファイルは udev(7) メ
    カニズムで自動的に充足されます。

1.2.11. 特別なデバイスファイル

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

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

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


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

1.2.12. procfs と sysfs

    procfs と sysfs は "/proc" や "/sys" 上にマウントされる仮想ファイ
    ルシステムであり、カーネルの内部データー構造をユーザー空間にさら
    け出します。言い換えると、オペレーティングシステムのオペレーショ
    ンへの便利なのぞき窓となると言う意味で仮想といえます。

    "/proc" ディレクトリー中には、システム上で実行されている各プロセ
    スに対応したそのプロセス ID (PID) の名前がついたサブディレクトリ
    ー他があります。プロセス情報をアクセスする ps(1) のようなシステム
    ユーティリティーはこのディレクトリー構造からその情報を得ています
    。

    "/proc/sys/" の下のディレクトリーには実行時のカーネル変数を変更す
    るインターフェースがあります。(専用の sysctl(8) コマンドもしくは
    そのプリロード / 設定ファイル "/etc/sysctl.d/*.conf" によっても同
    様のことができます。)

    特にあるファイル - "/proc/kcore" - に気づくと、パニックになる人が
    よくいます。これは一般に巨大です。これは (おおよそ) コンピュータ
    ーのメモリーの内容のコピーです。これは kernel をデバッグするのに
    用いられます。コンピューターのメモリーを指す仮想ファイルなので、
    そのサイズに関して心配する必要は全くありません。

    "/sys" の下のディレクトリーはカーネルから引き出されたデーター構造
    、その属性、それらの関連を含んでいます。一部カーネル変数を実行時
    に変更する機構もまた含まれたりします。

    linux-doc-* パッケージで供給される Linux カーネル文書 ("/usr/
    share/doc/linux-doc-2.6.*/Documentation/filesystems/*") 中の
    "proc.txt(.gz)" や "sysfs.txt(.gz)" や関連する他の文書を参照下さ
    い。

1.2.13. tmpfs

    tmpfs は仮想記憶中にすべてのファイルを保持する一時的なファイルシ
    ステムです。メモリー上のページキャッシュ中にある tmpfs のデーター
    は必要に応じてディスク上の swap 空間へと書き出せます。

    "/run" ディレクトリは初期ブートプロセスに tmpfs としてマウントさ
    れます。こうすることで "/" が読み取り専用でマウントされていてもそ
    こへの書き込みが可能です。これは過渡的な状態ファイルの保管のため
    の新たな場所で、Filesystem Hierarchy Standard のバージョン 2.3に
    規定されたいくつかの場所を置き換えます:

      * "/var/run" → "/run"

      * "/var/lock" → "/run/lock"

      * "/dev/shm" → "/run/shm"

    linux-doc-* パッケージで供給される Linux カーネル文書 ("/usr/
    share/doc/linux-doc-*/Documentation/filesystems/*") 中の
    "tmpfs.txt(.gz)" を参照下さい。

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

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

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

    $ sudo apt-get install mc

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

      * "/etc" とサブディレクトリー

      * "/var/log" とサブディレクトリー
   
      * "/usr/share/doc" とサブディレクトリー

      * "/usr/sbin" と "/usr/bin"。

1.3.1. MC のカスタム化

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

    . /usr/lib/mc/mc.sh

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

1.3.2. MC の始動

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

    $ mc

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

    注記

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

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

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

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

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

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

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


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

      * cd コマンドは選択されたスクリーンに表示されたディレクトリーを
        変更します。

      * Ctrl-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-n キーを押して仮想コンソールを切替えて、
    "File→Insert file" や "File→Copy to file" を用いてファイルの一部
    を他のファイルに動かします。

    この内部エディターはお好きな他の外部エディターと置き換えが可能で
    す。

    また、多くのプログラムは使用するエディターを決定するために環境変
    数 "$EDITOR" や "$VISUAL" を使用します。最初 vim(1) や nano(1) が
    使いにくい場合には "~/.bashrc" に次に示す行を追加してエディターを
    "mcedit" に設定するのも一計です。

    export EDITOR=mcedit
    export VISUAL=mcedit

    できればこれは "vim" に設定することを推奨します。

    vim(1) が使いにくい場合には、mcedit(1) をほとんどのシステム管理業
    務のために使い続けられます。

1.3.6. MC の内部ビューワー

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

    $ mc -v path/to/filename_to_view

    $ mcview path/to/filename_to_view

1.3.7. MC の自動起動機能

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

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

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


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

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

    MC は Internet 経由でのファイルアクセスに使えます。F9 を押してメ
    ニューに行き、"Enter" と "h" を押して仮想ファイルシステムをアクテ
    ィベートします。"sh://[user@]machine[:options]/[remote-dir]" の形
    式で URL を入力すると、ssh を利用してあたかもローカルにあるかのよ
    うにリモートディレクトリーを取得します。

1.4. 基本の Unix 的作業環境

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

1.4.1. login シェル

    login シェルはシステム初期化プログラムによって使われることがある
    ので、bash(1) のままにし、chsh(1) を使って login シェルを切り替え
    ることを避けることが賢明です。

    もし異なるインタラクティブなシェルプロンプトを使いたい場合には、
    GUI ターミナルエミュレーターのコンフィギュレーションからの設定や
    、例えば "exec /usr/bin/zsh -i -l" や "exec /usr/bin/fish -i -l"
    等と書き込んだ ~/.bashrc から起動しましょう。

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

    +---------------------------------------------------------------+
    |               |ポプコ |サイ|POSIX|                            |
    |  パッケージ   |  ン   | ズ |シェ |            説明            |
    |               |       |    | ル  |                            |
    |---------------+-------+----+-----+----------------------------|
    |bash           |V:888, |7276|はい |Bash: GNU Bourne Again SHell|
    |               |I:999  |    |     |(デファクトスタンダード)    |
    |---------------+-------+----+-----+----------------------------|
    |bash-completion|V:36,  |1952|N/A  |bash シェルのプログラム可能 |
    |               |I:958  |    |     |なコンプリーション          |
    |---------------+-------+----+-----+----------------------------|
    |dash           |V:928, |207 |はい |Debian の Almquist シェル、 |
    |               |I:998  |    |     |シェルスクリプトに好適      |
    |---------------+-------+----+-----+----------------------------|
    |zsh            |V:41,  |2499|はい |Z shell: 多くの拡張された標 |
    |               |I:70   |    |     |準シェル                    |
    |---------------+-------+----+-----+----------------------------|
    |tcsh           |V:4,   |1366|いい |TENEX C Shell: 拡張バージョ |
    |               |I:15   |    |え   |ンの Berkeley csh           |
    |---------------+-------+----+-----+----------------------------|
    |mksh           |V:5.4, |7713|はい |Korn シェルの１バージョン   |
    |               |I:7.9  |    |     |                            |
    |---------------+-------+----+-----+----------------------------|
    |csh            |V:1.1, |348 |いい |OpenBSD の C シェル、       |
    |               |I:5.4  |    |え   |Berkeley csh の派生         |
    |---------------+-------+----+-----+----------------------------|
    |               |V:0.3, |    |     |組み込みコマンド付きの独立シ|
    |sash           |I:5.2  |1245|はい |ェル (標準の "/usr/bin/sh"  |
    |               |       |    |     |には不向き)                 |
    |---------------+-------+----+-----+----------------------------|
    |ksh            |V:0.3, |65  |はい |真の AT&T バージョンの Korn |
    |               |I:8.4  |    |     |シェル                      |
    |---------------+-------+----+-----+----------------------------|
    |rc             |V:0.10,|182 |いい |AT&T Plan 9 の rc シェルの実|
    |               |I:0.73 |    |え   |装                          |
    |---------------+-------+----+-----+----------------------------|
    |posh           |V:0.01,|191 |はい |ポリシー準拠の通常のシェル  |
    |               |I:0.23 |    |     |(pdksh の派生)              |
    +---------------------------------------------------------------+


    ヒント

    POSIX-ライクなシェルは基本シンタックスはにていますが、シェル変数
    や glob の展開のような基本事項の挙動が異なることがあります。詳細
    に関しては個々の文書を確認して下さい。

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

1.4.2. Bash のカスタム化

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

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

    # enable bash-completion
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

    # CD upon exiting MC
    . /usr/lib/mc/mc.sh

    # set CDPATH to a good one
    CDPATH=.:/usr/share/doc:~:~/Desktop:~
    export CDPATH

    PATH="${PATH+$PATH:}/usr/sbin:/sbin"
    # set PATH so it includes user's private bin if it exists
    if [ -d ~/bin ] ; then
      PATH="~/bin${PATH+:$PATH}"
    fi
    export PATH

    EDITOR=vim
    export EDITOR

    ヒント
   
    bash に関する更なるカスタム化方法は、9章システムに関するティップ
    中の「着色化されたコマンド」等にあります。

    ヒント
   
    bash-completion パッケージは bash で入力のプログラムによる補完を
    可能にします。

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. マウス操作

    Debian システム上の文字列へのマウス操作は 2 つのスタイルを混ぜて
    いて少々複雑です:

      * 伝統的な Unix 流のマウス操作:

          + 3 ボタンの使用 (クリック)

          + プライマリーを使用

          + xterm のような X アプリケーションや Linux コンソール中の
            テキストアプリケーションが使用
   
      * 現代的な GUI 流のマウス操作:

          + 2 ボタンの使用 (ドラッグ + クリック)

          + プライマリーとクリップボードを使用

          + gnome-terminal のような現代的な GUI アプリケーションが使
            用

    表1.15 Debian 上でのマウス操作と関連キー操作のリスト

    +---------------------------------------------------------------+
    |       アクション        |                反応                 |
    |-------------------------+-------------------------------------|
    |マウスの左クリックアンド |プライマリーの選択範囲の選択         |
    |ドラッグ                 |                                     |
    |-------------------------+-------------------------------------|
    |左クリック               |プライマリーの選択スタート点の選択   |
    |-------------------------+-------------------------------------|
    |右クリック（伝統的）     |プライマリーの選択エンド点の選択     |
    |-------------------------+-------------------------------------|
    |右クリック（現代的）     |コンテキスト依存のメニュー (カット/コ|
    |                         |ピー/ペースト)                       |
    |-------------------------+-------------------------------------|
    |ミドルクリックまたは     |プライマリーの選択をカーソール位置に |
    |Shift-Ins                |挿入                                 |
    |-------------------------+-------------------------------------|
    |Ctrl-X                   |プライマリーの選択をクリップボードに |
    |                         |カット                               |
    |-------------------------+-------------------------------------|
    |Ctrl-C (ターミナルで     |プライマリーの選択をクリップボードに |
    |Shift-Ctrl-C)            |コピー                               |
    |-------------------------+-------------------------------------|
    |Ctrl-V                   |クリップボードをカーソール位置に挿入 |
    |                         |(ペースト)                           |
    +---------------------------------------------------------------+


    ここで、プライマリーの選択はハイライトされたテキスト範囲です。実
    行中プログラムの停止を避けるため、ターミナルプログラム内では
    Shift-Ctrl-C が代用で使われています。

    現代的なホイールマウスの真ん中のホイールは中マウスボタンと見なさ
    れ、中クリックに使えます。2ボタンマウス状況では左右のボタンの同時
    押しが中クリックとして使えます。

    Linux 文字コンソールでマウスを使うには gpm(8) をデーモンで実行す
    る必要があります。

1.4.5. ページャー

    less(1) は機能拡張されたページャー (ファイル内容のブラウザー) で
    す。コマンドアーギュメントに指定されたファイル、もしくは標準入力
    を読みますless。コマンドで閲覧中にヘルプが必要なら、"h" を押しま
    しょう。これは、more(1) よりもはるかに高機能で、"eval $(lesspipe)
    " または "eval $(lessfile)" をシェルのスタートスクリプト中で実行
    することで更に機能が拡充されます。詳しくは、"/usr/share/doc/less/
    LESSOPEN" を参照下さい。"-R" オプションを用いると、生の文字出力や
    ANSI カラーエスケープシーケンスが有効になります。less(1) を参照下
    さい。

    ヒント

    less コマンドでは、ヘルプスクリーンを見るには "h" とタイプし、文
    字列検索をするには "/" か "?" とタイプし、大文字と小文字の区別・
    非区別を変更するには "-i" とタイプします。

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 や他のエギゾチックな
    符号化方式 (エンコーディング) のテキストを正しく扱えます。それに
    はUTF-8ロケール中のGUI環境で、必要なプログラムとフォントをインス
    トールをするのが賢明です。エディタにはGUI環境に依らずにファイルの
    エンコーディングを設定するオプションがあります。マルチバイトテキ
    ストについてはそれぞれの文書を参照下さい。

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

    Debian にはいくつかの異なったエディターがあります。上述のように
    vim パッケージをインストールすることを推薦します。

    Debian ではシステムのデフォールトのエディターへの統一されたアクセ
    スを "/usr/bin/editor" コマンドを通じて提供しているので、他のプロ
    グラム (例えば reportbug(1) 等) がエディターを起動できます。設定
    変更は次で出来ます。

    $ sudo update-alternatives --config editor

    著者が "/usr/bin/vim.tiny" より "/usr/bin/vim.basic" を初心者に推
    薦するのはシンタクスハイライトをサポートしているからです。

    ヒント

    多くのプログラムは "$EDITOR" か "$VISUAL" という環境変数を使って
    どのエディターを使うかを決めます (「MC の内部エディター」と「スタ
    ートするプログラムのカスタム化」を参照下さい)。Debian システムの
    整合性のために、これらを "/usr/bin/editor" と設定しましょう。(歴
    史的には "$EDITOR" は "ed" で、"$VISUAL" は "vi" でした。)

1.4.8. Vim 利用法

    最近の vim(1) は合理的な "nocompatible" モードで起動し NORMAL モ
    ードに入ります。^[1]

    表1.16 基本の Vim キーストロークのリスト

    +---------------------------------------------------------------+
    |    モード     |  キーストローク  |         アクション         |
    |---------------+------------------+----------------------------|
    |NORMAL         |:help|only        |ヘルプファイルを表示します  |
    |---------------+------------------+----------------------------|
    |NORMAL         |:e filename.ext   |filename.ext を編集するため |
    |               |                  |に新規バッファーを開きます  |
    |---------------+------------------+----------------------------|
    |NORMAL         |:w                |現バッファーを元ファイルに上|
    |               |                  |書きします                  |
    |---------------+------------------+----------------------------|
    |NORMAL         |:w filename.ext   |現バッファーを filename.ext |
    |               |                  |に書きます                  |
    |---------------+------------------+----------------------------|
    |NORMAL         |:q                |vim を終了します            |
    |---------------+------------------+----------------------------|
    |NORMAL         |:q!               |vim を強制終了します        |
    |---------------+------------------+----------------------------|
    |NORMAL         |:only             |分割し開かれているすべての他|
    |               |                  |ウィンドウを閉じます        |
    |---------------+------------------+----------------------------|
    |NORMAL         |:set nocompatible?|vim が合理的な nocompatible |
    |               |                  |モードかを確認します        |
    |---------------+------------------+----------------------------|
    |NORMAL         |:set nocompatible |vim が合理的な nocompatible |
    |               |                  |モードに設定します          |
    |---------------+------------------+----------------------------|
    |NORMAL         |i                 |INSERT モードに入ります     |
    |---------------+------------------+----------------------------|
    |NORMAL         |R                 |REPLACE モードに入ります    |
    |---------------+------------------+----------------------------|
    |NORMAL         |v                 |VISUAL モードに入ります     |
    |---------------+------------------+----------------------------|
    |NORMAL         |V                 |行単位の VISUAL モードに入り|
    |               |                  |ます                        |
    |---------------+------------------+----------------------------|
    |NORMAL         |Ctrl-V            |ブロック単位の VISUAL モード|
    |               |                  |に入ります                  |
    |---------------+------------------+----------------------------|
    |TERMINAL-JOB 以|ESC-キー          |NORMAL モードに入ります     |
    |外             |                  |                            |
    |---------------+------------------+----------------------------|
    |NORMAL         |:term             |TERMINAL-JOB モードに入りま |
    |               |                  |す                          |
    |---------------+------------------+----------------------------|
    |TERMINAL-NORMAL|i                 |TERMINAL-JOB モードに入りま |
    |               |                  |す                          |
    |---------------+------------------+----------------------------|
    |TERMINAL-JOB   |Ctrl-W N (もしくは|TERMINAL-NORMAL モードに入り|
    |               |Ctrl-\ Ctrl-N)    |ます                        |
    |---------------+------------------+----------------------------|
    |TERMINAL-JOB   |Ctrl-W :          |TERMINAL-NORMAL 中の Exモー |
    |               |                  |ドに入ります                |
    +---------------------------------------------------------------+


    vim をインタラクティブなチュートリアルコースで学習する"vimtutor"
    プログラムを使いましょう。

    vim プログラムはモードに基づきタイプされたキーストロークへの挙動
    を変えます。バッファーにキーストロークをタイプ入力するのは INSERT
    モードと REPLACE モード主にされます。カーソール移動は NORMAL モー
    ドで主にされます。インタラクティブな選択は VISUAL モードでされま
    す。NORMAL モードで ":" をタイプするとそのモードが Ex モードに代
    わります。Ex モードはコマンドを受け付けます。

    ヒント

    Vim には Netrw パッケージが同梱されています。Netrw はファイルの読
    み書きやディレクトリーのネットワーク経由やローカルの閲覧を可能に
    します！Netrw を "vim ." (アーギュメントとしてピリオド) として試
    し、":help netrw" にあるマニュアルを読みましょう。

    vim の高度な設定は、「Vim のカスタム化」を参照下さい。

1.4.9. シェル活動の記録

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

    ヒント
   
    新しい Vim (version>=8.2) は TERMINAL-JOB モードを使うときれいに
    シェル活動を記録できます。「Vim 利用法」を参照下さい。

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

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

    $ script
    Script started, file is typescript

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

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

    $ vim typescript

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

1.4.10. 基本 Unix コマンド

    基本的 Unix コマンドを学びます。ここでは一般的意味で "Unix" を使
    っています。いかなる Unix クローンの OS も通常等価なコマンドを提
    供します。Debian システムも例外ではありません。今一部コマンドが思
    うように機能しなくても心配しないで下さい。エイリアスがシェルで使
    われた場合は、対応するコマンドの出力は変わります。次は順番に実行
    すると言う意味の例ではありません。

    非特権ユーザーのアカウントから以下のコマンドを全て実行します。

    表1.17 基本の Unix コマンドのリスト

    +---------------------------------------------------------------+
    | コマンド  |                       説明                        |
    |-----------+---------------------------------------------------|
    |pwd        |カレント / ワーキングディレクトリーの名前を表示    |
    |-----------+---------------------------------------------------|
    |whoami     |現在のユーザー名を表示                             |
    |-----------+---------------------------------------------------|
    |id         |現在のユーザーのアイデンティティ (名前と uid と gid|
    |           |と関連する group) を表示                           |
    |-----------+---------------------------------------------------|
    |file foo   |"foo" ファイルのファイルタイプを表示               |
    |-----------+---------------------------------------------------|
    |type -p    |"commandname" コマンドのファイルの位置を表示       |
    |commandname|                                                   |
    |-----------+---------------------------------------------------|
    |which      |, ,                                                |
    |commandname|                                                   |
    |-----------+---------------------------------------------------|
    |type       |"commandname" コマンドに関する情報を表示           |
    |commandname|                                                   |
    |-----------+---------------------------------------------------|
    |apropos    |"key-word" に関連したコマンドを発見                |
    |key-word   |                                                   |
    |-----------+---------------------------------------------------|
    |man -k     |, ,                                                |
    |key-word   |                                                   |
    |-----------+---------------------------------------------------|
    |whatis     |"commandname" コマンドに関する1行の説明を表示      |
    |commandname|                                                   |
    |-----------+---------------------------------------------------|
    |man -a     |"commandname" コマンドに関する説明を表示 (Unix スタ|
    |commandname|イル)                                              |
    |-----------+---------------------------------------------------|
    |info       |"commandname" コマンドに関する比較的長い説明を表示 |
    |commandname|(GNU スタイル)                                     |
    |-----------+---------------------------------------------------|
    |ls         |ディレクトリーの内容をリスト (非ドットファイルおよ |
    |           |びディレクトリー)                                  |
    |-----------+---------------------------------------------------|
    |ls -a      |ディレクトリーの内容をリスト (全ファイルおよびディ |
    |           |レクトリー)                                        |
    |-----------+---------------------------------------------------|
    |ls -A      |ディレクトリーの内容をリスト (ほとんど全ファイルお |
    |           |よびディレクトリー、".." と "." をスキップ)        |
    |-----------+---------------------------------------------------|
    |ls -la     |ディレクトリーの内容を詳細情報とともにリスト       |
    |-----------+---------------------------------------------------|
    |ls -lai    |ディレクトリーの内容を inode 番号と詳細情報とともに|
    |           |リスト                                             |
    |-----------+---------------------------------------------------|
    |ls -d      |現ディレクトリーの中の全ディレクトリーをリスト     |
    |-----------+---------------------------------------------------|
    |tree       |ファイルツリーの内容を表示                         |
    |-----------+---------------------------------------------------|
    |lsof foo   |"foo" ファイルのオープンの状態をリスト             |
    |-----------+---------------------------------------------------|
    |lsof -p pid|プロセス ID: "pid" によってオープンされたファイルを|
    |           |リスト                                             |
    |-----------+---------------------------------------------------|
    |mkdir foo  |現ディレクトリー中に "foo" という新規ディレクトリー|
    |           |作成                                               |
    |-----------+---------------------------------------------------|
    |rmdir foo  |現ディレクトリー中の "foo" というディレクトリーを削|
    |           |除                                                 |
    |-----------+---------------------------------------------------|
    |           |現ディレクトリー中もしくは "$CDPATH" 変数中にリスト|
    |cd foo     |されたディレクトリー中の "foo" というディレクトリー|
    |           |にディレクトリーを変更                             |
    |-----------+---------------------------------------------------|
    |cd /       |ディレクトリーをルートディレクトリーに変更         |
    |-----------+---------------------------------------------------|
    |cd         |現在のユーザーのホームディレクトリーにディレクトリ |
    |           |ーを変更                                           |
    |-----------+---------------------------------------------------|
    |cd /foo    |絶対ディレクトリーパス "/foo" にディレクトリーを変 |
    |           |更                                                 |
    |-----------+---------------------------------------------------|
    |cd ..      |親ディレクトリーにディレクトリーを変更             |
    |-----------+---------------------------------------------------|
    |cd ~foo    |ユーザー "foo" のホームディレクトリーにディレクトリ|
    |           |ーを変更                                           |
    |-----------+---------------------------------------------------|
    |cd -       |一つ前のディレクトリーにディレクトリーを変更       |
    |-----------+---------------------------------------------------|
    |</etc/motd |"/etc/motd" の内容をデフォールトのページャーで表示 |
    |pager      |                                                   |
    |-----------+---------------------------------------------------|
    |touch      |空ファイル "junkfile" を作成                       |
    |junkfile   |                                                   |
    |-----------+---------------------------------------------------|
    |cp foo bar |既存のファイル "foo" を新規ファイル "bar" にコピー |
    |-----------+---------------------------------------------------|
    |rm junkfile|ファイル "junkfile" を削除                         |
    |-----------+---------------------------------------------------|
    |mv foo bar |既存のファイル "foo" の名前を新しい名前 "bar" に変 |
    |           |更 (ディレクトリー "bar" が存在不可)               |
    |-----------+---------------------------------------------------|
    |mv foo bar |既存のファイル "foo" を新しい場所 "bar/foo" に移動 |
    |           |(ディレクトリー "bar" が存在しなければいけない)    |
    |-----------+---------------------------------------------------|
    |           |既存のファイル "foo" を新しい場所の新しい名前のファ|
    |mv foo bar/|イル "bar/baz" に移動 (ディレクトリー "bar" が存在 |
    |baz        |しなければいけないが、ディレクトリー "bar/baz" は存|
    |           |在してはいけない)                                  |
    |-----------+---------------------------------------------------|
    |chmod 600  |既存のファイル "foo" を第三者から読出し不可かつ書込|
    |foo        |み不可 (全員実行不可)                              |
    |-----------+---------------------------------------------------|
    |chmod 644  |既存のファイル "foo" を第三者からは読出し可だが書込|
    |foo        |み不可 (全員実行不可)                              |
    |-----------+---------------------------------------------------|
    |chmod 755  |既存のファイル "foo" を第三者からは読出し可だが書込|
    |foo        |み不可 (全員実行可能)                              |
    |-----------+---------------------------------------------------|
    |find .     |シェルで "pattern" にマッチするファイル名を探索 (比|
    |-name      |較的遅い)                                          |
    |pattern    |                                                   |
    |-----------+---------------------------------------------------|
    |locate -d .|シェルで "pattern" にマッチするファイル名を探索 (定|
    |pattern    |期的に生成されるデーターベースを使い比較的早い)    |
    |-----------+---------------------------------------------------|
    |grep -e "  |現ディレクトリーにある ".html" で終わる全ファイルか|
    |pattern"   |ら "pattern" のパターンを検索し、該当する全ファイル|
    |*.html     |を表示                                             |
    |-----------+---------------------------------------------------|
    |top        |フルスクリーンを用いてプロセス情報を表示し、"q" と |
    |           |押して終了                                         |
    |-----------+---------------------------------------------------|
    |ps aux |   |実行中の全プロセスの情報を BSD スタイルの出力を用い|
    |pager      |て表示                                             |
    |-----------+---------------------------------------------------|
    |ps -ef |   |実行中の全プロセスの情報を System-V スタイルの出力 |
    |pager      |を用いて表示                                       |
    |-----------+---------------------------------------------------|
    |ps aux |   |                                                   |
    |grep -e "  |"exim" もしくは "exim4" の実行中の全プロセスを表示 |
    |[e]xim4*"  |                                                   |
    |-----------+---------------------------------------------------|
    |ps axf |   |実行中の全プロセスの情報を ASCII アート出力を用いて|
    |pager      |表示                                               |
    |-----------+---------------------------------------------------|
    |kill 1234  |プロセス ID"1234" により識別されるプロセスを停止   |
    |-----------+---------------------------------------------------|
    |gzip foo   |Lempel-Ziv コーディング (LZ77) を用いて "foo" を圧 |
    |           |縮し "foo.gz" を作成                               |
    |-----------+---------------------------------------------------|
    |gunzip foo |"foo.gz" を解凍して "foo" を作成                   |
    |.gz        |                                                   |
    |-----------+---------------------------------------------------|
    |           |Burrows-Wheeler ブロックソートテキスト圧縮アルゴリ |
    |bzip2 foo  |ズムと Huffman コーディングを用いて "foo" を圧縮し |
    |           |"foo.bz2" を作成 (gzip より高圧縮率)               |
    |-----------+---------------------------------------------------|
    |bunzip2 foo|"foo.bz2" を解凍して "foo" を作成                  |
    |.bz2       |                                                   |
    |-----------+---------------------------------------------------|
    |xz foo     |Lempel–Ziv–Markov鎖アルゴリズムを用いて "foo" を圧 |
    |           |縮し "foo.xz" を作成 (bzip2 より高圧縮率)          |
    |-----------+---------------------------------------------------|
    |unxz foo.xz|"foo.xz" を解凍して "foo" を作成                   |
    |-----------+---------------------------------------------------|
    |tar -xvf   |"foo.tar" アーカイブからファイルを展開             |
    |foo.tar    |                                                   |
    |-----------+---------------------------------------------------|
    |tar -xvzf  |gzip 圧縮された "foo.tar.gz" アーカイブからファイル|
    |foo.tar.gz |を展開                                             |
    |-----------+---------------------------------------------------|
    |tar -xvjf  |"foo.tar.bz2" アーカイブからファイルを展開         |
    |foo.tar.bz2|                                                   |
    |-----------+---------------------------------------------------|
    |tar -xvJf  |"foo.tar.xz" アーカイブからファイルを展開          |
    |foo.tar.xz |                                                   |
    |-----------+---------------------------------------------------|
    |tar -cvf   |フォルダ "bar/" の内容を "foo.tar" アーカイブにアー|
    |foo.tar bar|カイブ                                             |
    |/          |                                                   |
    |-----------+---------------------------------------------------|
    |tar -cvzf  |フォルダ "bar/" の内容を "foo.tar.gz" アーカイブに |
    |foo.tar.gz |圧縮アーカイブ                                     |
    |bar/       |                                                   |
    |-----------+---------------------------------------------------|
    |tar -cvjf  |フォルダ "bar/" の内容を "foo.tar.bz2" アーカイブに|
    |foo.tar.bz2|圧縮アーカイブ                                     |
    |bar/       |                                                   |
    |-----------+---------------------------------------------------|
    |tar -cvJf  |フォルダ "bar/" の内容を "foo.tar.xz" アーカイブに |
    |foo.tar.xz |圧縮アーカイブ                                     |
    |bar/       |                                                   |
    |-----------+---------------------------------------------------|
    |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 パッケージを "apt-get install
    less" というコマンドラインでインストールすると、less(1) がデフォ
    ルトのページャーになりカーソールキーでスクロールバック出来るよう
    になります。

    上記の "ps aux | grep -e "[e]xim4*"" コマンド中に現れる正規表現中
    の "[" と "]" によって grep が自分自身にマッチするのを避けること
    ができます。正規表現中の "4*" は数字 "4" の0回以上の繰り返しを意
    味するので、grep が "exim" と "exim4" の両方にマッチします。 "*"
    はシェルのファイルネームのグロブと正規表現で使われますが、意味が
    違います。grep(1) から正規表現を学びましょう。

    上記のコマンドを訓練として用いて、ディレクトリーを渡り歩き、シス
    テムの中を覗き込んで下さい。コンソールのコマンドに関して質問があ
    る場合は、必ずマニュアルページを読んでみて下さい。

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

    $ man man
    $ man bash
    $ man builtins
    $ man grep
    $ man ls

    マンページのスタイルは慣れるのに少々大変かもしれません。なぜなら
    特に比較的旧式の非常に伝統的なマンページは比較的言葉が少ないから
    です。しかし一旦慣れるとその簡潔さの良さが分かるでしょう。

    GNU や BSD 由来を含む多くの Unix 的なコマンドは以下のように (場合
    によっては一切の引数無しで) 起動すると簡単なヘルプ情報を表示する
    ことを承知下さい。

    $ commandname --help
    $ commandname -h

1.5. シェルプロンプト

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

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

     1. 変数代入 (任意)

     2. コマンド名

     3. 引数 (任意)

     4. リダイレクト (任意: > と >> と < と << 等。)

     5. 制御演算子 (任意: && と || と改行と ; と & と ( と ))

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

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

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

      * pam_env のような PAM システムは /etc/pam.conf" や "/etc/
        environment" や "/etc/default/locale" によって環境変数を設定
        できます。

      * ユーザーモード systemd ユニット (systemd.unit(5) 参照) から起
        動される現代的な GUI 環境は "~/.config/environment.d/" ディレ
        クトリー中のファイルによりその環境変数を設定します。

      * ユーザー特定のプログラム初期化は "~/.profile" や "~
        /.bash_profile" や "~/.bashrc" により環境変数を再設定すること
        があります。

1.5.2. "$LANG" 変数

    デフォルトのロケールは "$LANG" 環境変数中に定義され、インストーラ
    ーか、GNOME の場合なら "Settings" → "Region & Language" →
    "Language" / "Formats" と言ったその後の GUI 設定によって "LANG=
    xx_YY.UTF-8" 等と設定されます。

    注記
   
    本当に必要な場合でなければ、"$LC_*" 変数を避け、とりあえず
    "$LANG" 変数のみを用いてシステム環境を設定する事をお薦めします。

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

    表1.18 ロケールの値の3つの部分

    +-----------------------------------------------------+
    |ロケールの値|                  意味                  |
    |------------+----------------------------------------|
    |xx          |ISO 639 言語コード (小文字)、例えば "en"|
    |------------+----------------------------------------|
    |YY          |ISO 3166 国コード (大文字)、例えば "US" |
    |------------+----------------------------------------|
    |ZZZZ        |コードセット、常に "UTF-8" と設定       |
    +-----------------------------------------------------+


    表1.19 推奨ロケールのリスト

    +------------------------------------------+
    |推奨ロケール|         言語 (地域)         |
    |------------+-----------------------------|
    |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 |ベトナム語 (ベトナム)        |
    +------------------------------------------+


    典型的なコマンドの実行は以下のようなシェルの行シーケンスを用いま
    す。

    $ echo $LANG
    en_US.UTF-8
    $ date -u
    Wed 19 May 2021 03:18:43 PM UTC
    $ LANG=fr_FR.UTF-8 date -u
    mer. 19 mai 2021 15:19:02 UTC

    以上で、date(1) プログラムは異なるロケール変数で実行されます。

      * 最初のコマンドでは、"$LANG" はシステムのデフォルトのロケール
        値 "en_US.UTF-8" に設定されます。
   
      * 二番目のコマンドでは、"$LANG" はフランス語の UTF-8 ロケール値
        "fr_FR.UTF-8" に設定されます。

    ほとんどのコマンド実行は通常頭に環境変数定義をつけません。上記の
    例の代わりに以下のように実行します。

    $ LANG=fr_FR.UTF-8
    $ date -u
    mer. 19 mai 2021 15:19:24 UTC

    ヒント
   
    バグを報告する場合、もし非英語環境を使っているならば、プログラム
    を "en_US.UTF-8" ロケールの下で実行し確認することが望ましいです。

    ロケールの詳細に関しては、「ロケール」を参照下さい。

1.5.3. "$PATH" 変数

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

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

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

1.5.4. "$HOME" 変数

    多くのコマンドはユーザー特定の設定をホームディレクトリーに保存し
    、その内容でコマンドの挙動が変わります。ホームディレクトリーは
    "$HOME" 環境変数で指定されます。

    表1.20 "$HOME" の値のリスト

    +---------------------------------------------------------------+
    |"$HOME" の値 |               プログラム実行状況                |
    |-------------+-------------------------------------------------|
    |/            |init プロセスが実行するプログラム (デーモン)     |
    |-------------+-------------------------------------------------|
    |/root        |普通の root シェルから実行されるプログラム       |
    |-------------+-------------------------------------------------|
    |/home/       |普通のユーザーシェルから実行されるプログラム     |
    |normal_user  |                                                 |
    |-------------+-------------------------------------------------|
    |/home/       |普通のユーザーの GUI デスクトップメニューから実行|
    |normal_user  |されるプログラム                                 |
    |-------------+-------------------------------------------------|
    |/home/       |"sudo program" を用いて root として実行されるプロ|
    |normal_user  |グラム                                           |
    |-------------+-------------------------------------------------|
    |/root        |"sudo -H program" を用いて root として実行される |
    |             |プログラム                                       |
    +---------------------------------------------------------------+


    ヒント

    シェルは、"~/" を現ユーザーのホームディレクトリーである "$HOME/"
    へと展開します。シェルは、"~foo/" をユーザー foo のホームディレク
    トリーである "/home/foo/" へと展開します。

    もし $HOME をあなたのプログラムから使えない場合には、「シェル環境
    変数」を参照下さい。

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

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

    $ date
    Thu 20 May 2021 01:08:08 AM JST
    $ date -R
    Thu, 20 May 2021 01:08:12 +0900

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

1.5.6. シェルグロブ

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

    表1.21 シェルグロブパターン

    +---------------------------------------------------------------+
    |シェルグロブパターン|            マッチルールの説明            |
    |--------------------+------------------------------------------|
    |*                   |"." で始まらないファイル (部分) 名        |
    |--------------------+------------------------------------------|
    |.*                  |"." で始まるファイル (部分) 名            |
    |--------------------+------------------------------------------|
    |?                   |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" や "extglob" などとすることでグロブ挙
    動を色々変更できます。bash(1) を参照下さい。

1.5.7. コマンドの戻り値

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

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

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


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

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

    注記

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

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

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

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

    +---------------------------------------------------------------+
    |コマンドの |                       説明                        |
    |  慣用句   |                                                   |
    |-----------+---------------------------------------------------|
    |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) を参照下さい。

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

    $ </etc/motd pager

    $ pager </etc/motd

    $ pager /etc/motd

    $ cat /etc/motd | pager

    4つ全ての例が全く同じ表示をしますが、最後の例は余計な cat コマン
    ドを実行するので理由なくリソースを無駄に遣います。

    シェルでは exec 組み込みコマンドを任意のファイルディスクリプタと
    ともに使いファイルをオープンすることができます。

    $ echo Hello >foo
    $ exec 3<foo 4>bar  # open files
    $ cat <&3 >&4       # redirect stdin to 3, stdout to 4
    $ exec 3<&- 4>&-    # close files
    $ cat bar
    Hello

    ファイルデスクリプタの 0-2 は事前定義されています。

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

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


1.5.9. コマンドエイリアス

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

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

    $ alias la='ls -la'

    こうすると、"la" が "ls -la" の短縮形として機能し、全てのファイル
    を長いリスト形式でリストします。

    既存のエイリアスは alias でリストできます (bash(1) の "SHELL
    BUILTIN COMMANDS" 参照下さい)。

    $ alias
    ...
    alias la='ls -la'

    type 内部コマンドを使うと正確なパスやコマンドの正体を識別できます
    (bash(1) の "SHELL BUILTIN COMMANDS" 下参照下さい)。

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

    $ type ls
    ls is hashed (/bin/ls)
    $ type la
    la is aliased to ls -la
    $ type echo
    echo is a shell builtin
    $ type file
    file is /usr/bin/file

    上記で、ls は最近探索されましたが "file" は最近探索されていませの
    で、"ls" は "ハッシュされた" つまりシェルには "ls" コマンドの場所
    を高速アクセスのために内部記録していると表示されます。

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

1.6. Unix 的テキスト処理

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

1.6.1. Unix テキストツール

    Unix 的システムでしばしば使われる標準テキスト処理ツールがいくつか
    あります。

      * 正規表現を使わないもの:

          + cat(1) はファイルをつなぎ合わせて内容を全て出力します。

          + tac(1) はファイルをつなぎ合わせ逆順で出力します。

          + cut(1) は行の一部を選択し出力します。

          + head(1) はファイルの最初の部分を選択し出力します。

          + tail(1) はファイルの最後の部分を選択し出力します。

          + sort(1) は行を順番に並び替えます。

          + uniq(1) は順番に並べられたファイルから重複行を削除します
            。

          + tr(1) は文字を変換削除します。

          + diff(1) は1行ごとにファイルを比較します。

      * 基本正規表現 (BRE) をデフォルトで使用するもの:

          + ed(1) は原始的な行エディターです。

          + sed(1) はストリームエディターです。

          + egrep(1) はテキストのパターンマッチをします。

          + vim(1) はスクリーンエディターです。

          + emacs(1) はスクリーンエディターです。(ちょっと拡張された 
            BRE)

      * 拡張正規表現 (ERE) を使用するもの:

          + awk(1) は単純なテキスト処理をします。

          + egrep(1) はテキストのパターンマッチをします。

          + tcl(3tcl) は考え得る全てのテキスト処理をします: re_syntax
            (3)。時々 tk(3tk) とともに使用されます。

          + perl(1) は考え得る全てのテキスト処理をします。perlre(1).

          + pcre2-util パッケージの pcre2grep(1) はテキストのパターン
            マッチを Perl 互換正規表現 (PCRE) パターンを使ってします
            。

          + re モジュールとともに使うことで python(1) は考え得る全て
            のテキスト処理をします。"/usr/share/doc/python/html/
            index.html" を参照下さい。

    もしこれらのコマンドが正確にどう動作するかを確認したいなら、"man
    command" を使って自分で見つけましょう。

    注記

    ソート順や範囲表現はロケールに依存します。コマンドの従来の挙動を
    得たい場合は、 UTF-8 がついた普通のロケール（「ロケール」を参照）
    ではなく、C または C.UTF-8 ロケールを使います。

    注記

    Perl 正規表現 (perlre(1)) と Perl 互換正規表現 (PCRE) と re モジ
    ュールで提供される Python 正規表現は ERE に多くの共通の拡張をして
    います。

1.6.2. 正規表現

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

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

    メタ文字は特別な意味を持った文字です。上記のようにテキストツール
    によって、BRE と ERE の2つの主要なスタイルがあります。

    表1.25 BRE と ERE のメタ文字

    +---------------------------------------------------------------+
    |   BRE    |  ERE  |               正規表現の説明               |
    |----------+-------+--------------------------------------------|
    |\ . [ ] ^ |\ . [ ]|共通のメタ文字                              |
    |$ *       |^ $ *  |                                            |
    |----------+-------+--------------------------------------------|
    |\+ \? \(  |       |"\" でエスケープされた、BRE のみで用いるメタ|
    |\) \{ \} \|       |文字                                        |
    ||         |       |                                            |
    |----------+-------+--------------------------------------------|
    |          |+ ? ( )|"\" でエスケープされ無い、ERE のみで用いるメ|
    |          |{ } |  |タ文字                                      |
    |----------+-------+--------------------------------------------|
    |c         |c      |非メタ文字 "c" にマッチ                     |
    |----------+-------+--------------------------------------------|
    |\c        |\c     |"c" 自身がメタ文字でも "c" という文字そのも |
    |          |       |のとマッチ                                  |
    |----------+-------+--------------------------------------------|
    |.         |.      |改行を含む全ての文字とマッチ                |
    |----------+-------+--------------------------------------------|
    |^         |^      |文字列の最初                                |
    |----------+-------+--------------------------------------------|
    |$         |$      |文字列の最後                                |
    |----------+-------+--------------------------------------------|
    |\<        |\<     |単語の先頭                                  |
    |----------+-------+--------------------------------------------|
    |\>        |\>     |単語の末尾                                  |
    |----------+-------+--------------------------------------------|
    |[abc…]    |[abc…] |"abc…" のいずれかの文字にマッチ             |
    |----------+-------+--------------------------------------------|
    |[^abc…]   |[^abc…]|"abc…" 以外の文字にマッチ                   |
    |----------+-------+--------------------------------------------|
    |r*        |r*     |"r" という正規表現の0回以上にマッチ         |
    |----------+-------+--------------------------------------------|
    |r\+       |r+     |"r" という正規表現の1回以上にマッチ         |
    |----------+-------+--------------------------------------------|
    |r\?       |r?     |"r" という正規表現の0回か1回にマッチ        |
    |----------+-------+--------------------------------------------|
    |r1\|r2    |r1|r2  |"r1" か "r2" という正規表現のいずれかにマッ |
    |          |       |チ                                          |
    |----------+-------+--------------------------------------------|
    |\(r1\|r2\)|(r1|r2)|"r1" か "r2" という正規表現のいずれかにマッ |
    |          |       |チし、それを括弧で囲まれた正規表現と見なす  |
    +---------------------------------------------------------------+


    emacs の正規表現は、ERE 同様の "+" と "?" をメタ文字と扱う拡張を
    してはありますが、基本的に BRE です。これら文字を emacs の正規表
    現で "\" でエスケープする必要はありません。

    grep(1) によって正規表現を使った文字列探索ができます。

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

    $ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL
    GNU GENERAL PUBLIC LICENSE
    GNU GENERAL PUBLIC LICENSE
    Yoyodyne, Inc., hereby disclaims all copyright interest in the program

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

1.6.3. 置換式

    置換式の場合、一部の文字は特別な意味を持ちます。

    表1.26 置換式

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


    Perl の代替文字列には"&" に代えて "$&" が使われ、 "\n" に代えて
    "$n" が使われます。

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

    $ echo zzz1abc2efg3hij4 | \
    sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    sed -E -e 's/(1[a-z]*)[0-9]*(.*)$/=&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=$&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/'
    zzzefg3hij4===1abc
    $ echo zzz1abc2efg3hij4 | \
    sed -E -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

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

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

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

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

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

    ed(1) コマンドは以下のようにすると "file" 中に存在する全ての
    "FROM_REGEX" を "TO_TEXT" に置換できます。

    $ ed file <<EOF
    ,s/FROM_REGEX/TO_TEXT/g
    w
    q
    EOF

    sed(1) コマンドは以下のようにすると "file" 中に存在する全ての
    "FROM_REGEX" を "TO_TEXT" に置換できます。

    $ sed -i -e 's/FROM_REGEX/TO_TEXT/g' file

    vim(1) コマンドは ex(1) コマンドを使い以下のようにすると "file"
    中に存在する全ての "FROM_REGEX" を "TO_TEXT" に置換できます。

    $ vim '+%s/FROM_REGEX/TO_TEXT/gc' '+update' '+q' file

    ヒント
   
    上記の "c" フラグをにより各置換毎に対話型の確認をします。

    複数ファイル ("file1" と "file2" と "file3") を vim(1) や perl(1)
    で同様に正規表現を用いて処理できます。

    $ vim '+argdo %s/FROM_REGEX/TO_TEXT/gce|update' '+q' file1 file2 file3

    ヒント
   
    上記の "e" フラグをにより "No match" エラーでマッピングが停止する
    ことを防ぎます。

    $ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' file1 file2 file3

    perl(1) の例中で、"-i" はその場で各ターゲットファイルの編集、"-p"
    は与えられたすべてのファイルに関する暗黙的なループを意味します。

    ヒント

    "-i" の代わりに "-i.bak" という引数を用いるとオリジナルファイル名
    に ".bak" をつけたファイル名でオリジナルファイルが保管されます。
    複雑な置換のエラーからの復元が簡単にできます。

    注記
   
    ed(1) や vim(1) は BRE です。一方、perl(1) は ERE です。

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

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

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

    ヒント
   
    最新のDebian のリーダーの歴史に関しては、"A Brief History of
    Debian" を参照下さい。

    Awk はこういったタイプのファイルからデーターを抽出するために良く
    使われます。

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

    $ awk '{ print $3 }' <DPL                   # month started
    August
    April
    January
    January
    April
    April
    March
    $ awk '($1=="Ian") { print }' <DPL          # DPL called Ian
    Ian     Murdock   August  1993
    Ian     Jackson   January 1998
    $ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started
    April 1996

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

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

    $ while read first last month year; do
        echo $month
      done <DPL
    ... same output as the first Awk example

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

    "$IFS" を ":" に変更すると、"/etc/passwd" をシェルでうまく解読で
    きます。

    $ oldIFS="$IFS"   # save old value
    $ IFS=':'
    $ while read user password uid gid rest_of_line; do
        if [ "$user" = "bozo" ]; then
          echo "$user's ID is $uid"
        fi
      done < /etc/passwd
    bozo's ID is 1000
    $ IFS="$oldIFS"   # restore old value

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

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

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

    $ IFS=":,"                        # use ":" and "," as IFS
    $ echo IFS=$IFS,   IFS="$IFS"     # echo is a Bash builtin
    IFS=  , IFS=:,
    $ date -R                         # just a command output
    Sat, 23 Aug 2003 08:30:15 +0200
    $ echo $(date -R)                 # sub shell --> input to main shell
    Sat  23 Aug 2003 08 30 36 +0200
    $ unset IFS                       # reset IFS to the default
    $ echo $(date -R)
    Sat, 23 Aug 2003 08:30:50 +0200

1.6.6. コマンドをパイプするためのスクリプト断片

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

    表1.27 コマンドをパイプするためのスクリプト断片

    +---------------------------------------------------------------+
    |スクリプト断片 (1行|              コマンドの効果               |
    |       入力)       |                                           |
    |-------------------+-------------------------------------------|
    |find /usr -print   |"/usr" の下の全ファイル発見                |
    |-------------------+-------------------------------------------|
    |seq 1 100          |1から100までプリント                       |
    |-------------------+-------------------------------------------|
    || xargs -n 1       |パイプからの各項目を引数としてコマンドを反 |
    |command            |復実行                                     |
    |-------------------+-------------------------------------------|
    || xargs -n 1 echo  |パイプからのホワイトスペースで分離された項 |
    |                   |目を行に分割                               |
    |-------------------+-------------------------------------------|
    || xargs echo       |パイプからの全ての行を1行にマージ          |
    |-------------------+-------------------------------------------|
    || grep -e          |regex_pattern を含む行を抽出               |
    |regex_pattern      |                                           |
    |-------------------+-------------------------------------------|
    || grep -v -e       |regex_pattern を含まない行を抽出           |
    |regex_pattern      |                                           |
    |-------------------+-------------------------------------------|
    || cut -d: -f3 -    |":" で区切られた3番目のフィールドを抽出    |
    |                   |(passwd ファイルなど)                      |
    |-------------------+-------------------------------------------|
    || awk '{ print $3 }|ホワイトスペースで区切られた3番目のフィール|
    |'                  |ドを抽出                                   |
    |-------------------+-------------------------------------------|
    || awk -F'\t' '{    |タブで区切られた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) を使って非常に複雑な
    操作を多くのファイルに繰り返し実行できます。「ファイル選択の慣用
    句」と「ファイルに関してループしながらコマンドを反復実行」を参照
    下さい。

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


---------------------------------------------------------------------

    ^[1] 比較的古い vim ですら起動時に"-N" オプションをつけることで合
    理的な "nocompatible" モードで起動できます。

第2章 Debian パッケージ管理

    注記

    本章は最新安定版リリースがコード名: trixie と言う前提で書かれてい
    ます。
   
    APT システムのデーターソースは本文書中では集合的にソースリストと
    表記されます。これは、"/etc/apt/sources.list" ファイルか、 "/etc/
    apt/sources.list.d/*.list" ファイルか、 "/etc/apt/sources.list.d/
    *.sources" ファイルの中の何処かに定義されます。

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

2.1.1. Debian パッケージ管理システム

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

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

    これら全てのリソースを利用できる現行の Debian パッケージ管理シス
    テムは Advanced Packaging Tool (APT) です。

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

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

      * パッケージのインストールや削除や dist-upgrade を含む全ての対
        話的コマンドライン操作を提供する、apt(8)。

      * スクリプトから Debian のパッケージ管理をするためによぶ、
        apt-get(8)。(古い Debian システム等で)apt が使えない際の控え
        のオプション。

      * インストール済みパッケージを管理したり、使用可能なパッケージ
        を探索するためのインタラクティブなテキストインターフェースを
        提供する、aptitude(8)

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

    +---------------------------------------------------------------+
    |    パッケージ     |ポプコ|サイ|             説明              |
    |                   |  ン  | ズ |                               |
    |-------------------+------+----+-------------------------------|
    |dpkg               |V:905,|6399|Debian のための低水準パッケージ|
    |                   |I:1000|    |管理システム（ファイルベース） |
    |-------------------+------+----+-------------------------------|
    |                   |V:896,|    |CLI でパッケージを管理する APT |
    |apt                |I:1000|4682|フロントエンド: apt/apt-get/   |
    |                   |      |    |apt-cache                      |
    |-------------------+------+----+-------------------------------|
    |                   |      |    |フルスクリーンコンソール中でイ |
    |aptitude           |V:34, |4621|ンタラクティブにパッケージを管 |
    |                   |I:172 |    |理する APT フロントエンド:     |
    |                   |      |    |aptitude(8)                    |
    |-------------------+------+----+-------------------------------|
    |                   |V:37, |    |選択されたタスクをインストール |
    |tasksel            |I:984 |346 |する APT フロントエンド:       |
    |                   |      |    |tasksel(8)                     |
    |-------------------+------+----+-------------------------------|
    |                   |V:128,|    |セキュリティー更新の自動インス |
    |unattended-upgrades|I:183 |317 |トールを可能にする APT の拡張パ|
    |                   |      |    |ッケージ                       |
    |-------------------+------+----+-------------------------------|
    |gnome-software     |V:160,|4715|GNOME用のソフトウェアーセンター|
    |                   |I:262 |    |(GUI APT フロントエンド)       |
    |-------------------+------+----+-------------------------------|
    |synaptic           |V:32, |7788|グラフィカルなパッケージマネー |
    |                   |I:281 |    |ジャー (GTK APT フロントエンド)|
    |-------------------+------+----+-------------------------------|
    |                   |      |    |APT ユーティリティープログラム:|
    |apt-utils          |V:417,|1139|apt-extracttemplates(1) と     |
    |                   |I:998 |    |apt-ftparchive(1) と           |
    |                   |      |    |apt-sortpkgs(1)                |
    |-------------------+------+----+-------------------------------|
    |apt-listchanges    |V:400,|563 |パッケージ変更履歴の通知ツール |
    |                   |I:891 |    |                               |
    |-------------------+------+----+-------------------------------|
    |apt-listbugs       |V:5.2,|512 |APT による各インストール前にク |
    |                   |I:7.1 |    |リチカルバグをリストする       |
    |-------------------+------+----+-------------------------------|
    |                   |V:15, |    |APT パッケージ探索ユーティリテ |
    |apt-file           |I:55  |89  |ィー -- コマンドラインインター |
    |                   |      |    |フェース                       |
    |-------------------+------+----+-------------------------------|
    |apt-rdepends       |V:0.4,|39  |パッケージの依存関係を再帰的に |
    |                   |I:4.5 |    |リスト                         |
    +---------------------------------------------------------------+


2.1.2. パッケージ設定

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

      * 現代的デスクトップ環境では、パッケージ設定変更やパッケージア
        ップグレード後にシステムをリブートすることが、システムの適正
        稼働に好ましい。

      * システム管理者による手動の設定は尊重されます。言い換えれば、
        パッケージ設定システムは利便性のために勝手な設定をしません。

      * 各パッケージは、debconf(7) と呼ばれる標準化されたユーザーイン
        ターフェースを使用するパッケージの初期インストールプロセス支
        援のためのパッケージ毎の設定スクリプトが同梱されています。

      * Debian の開発者はパッケージの設定スクリプトによりユーザーのア
        ップグレードが滞りなく進むように最大限の努力を行います。

      * システム管理者にはパッケージされたソフトウェアーの全機能が利
        用可能です。ただしセキュリティーリスクのある機能はデフォール
        トのインストール状態では無効にされています。

      * セキュリティーリスクのあるサービスを手動でアクティベートした
        場合は、リスクの封じ込めはあなたの責任です。

      * システム管理者は難解奇異な設定を手動で有効にはできます。ただ
        こんなことをすればポピュラーな一般の補助プログラムと干渉して
        しまうかもしれません。

2.1.3. 基本的な注意事項

    警告

    ランダムな混合のスイーツからパッケージをインストールしてはいけま
    せん。コンパイラーの ABI とかライブラリーのバージョンとかインター
    プリターの機能等のシステム管理に関する深い知見が必要なパッケージ
    の整合性がきっと破壊されます。

    初心者の Debian システム管理者は Debian の安定版 stable リリース
    をセキュリティー更新を適用しながら使うべきです。Debian システムを
    非常によく理解するまでは、以下の予防策を守るべきです。

      * ソースリスト中にテスト版 testing とか不安定版 unstable とかを
        含めない。

      * ソースリスト中に標準の Debian と Debian 以外の Ubuntu のよう
        なアーカイブを混在させない。

      * "/etc/apt/preferences" を作成しない。

      * パッケージ管理ツールのデフォールトを影響を理解せずに変更しな
        い。

      * ランダムなパッケージを "dpkg -i random_package" でインストー
        ルしない。

      * ランダムなパッケージを "dpkg --force-all -i random_package"
        で絶対インストールしない。

      * "/var/lib/dpkg/" の中のファイルを消去や改変しない。

      * ソースから直接コンパイルしたソフトウェアープログラムをインス
        トールする際にシステムファイルを上書きしない。

          + 必要な場合は "/usr/local/" か "/opt/" 中にインストールす
            る。

    上記予防策に違反するアクションにより起越される Debian パッケージ
    システムへの非互換効果は、システムを使えなくするかもしれません。

    ミッションクリティカルなサーバーを走らせる真剣な Debian システム
    管理者は更なる用心をすべきです。

      * 安全な条件下であなたの特定の設定で徹底的にテストすることなく
        セキュリティー更新をも含めた如何なるパッケージもインストール
        をしてはいけません。

          + システム管理者のあなたがシステムに対して最終責任がありま
            す。

          + Debian システムの長い安定性の歴史それ自体は何の保証でもあ
            りません。

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

    注意

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

    私が上記のような警告をしても、多くの本文書の読者は、テスト版
    testing や不安定版 unstable スイーツを使いたいと考えるのは分かっ
    ています。

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

    本リストは自己管理されたデスクトップ環境を対象とします。

      * Debian continuous integration と source only upload practices
        と library transition tracking 等の Debian アーカイブの QA イ
        ンフラで自動管理された実質的にローリングリリースだから、
        testing スイートを使いましょう。testing スイートのパッケージ
        は全ての最新機能を提供するのに十分頻繁に更新されます。

      * テスト版 testing スイーツに該当するコードネーム (trixie が安
        定版 stable であるリリース期間の場合"forky") をソースリスト中
        に設定します。

      * メジャースイートリリースの約一ヶ月後に自分自身で状況を確認し
        た後でソースリストの中のこのコードネームを新しいコードネーム
        に手動で更新します。Debian user と developer のメーリングリス
        トもこれに関する良好な情報源です。

    非安定版 unstable スイーツを使うことは推奨できません。非安定版
    unstable スイーツは開発者としてパッケージのデバグには好適ですが、
    普通のデスクトップ使用ではあなたを不要なリスクに晒してしまいます
    。Debian システムの非安定版 unstable スイーツは、ほぼいつも非常に
    安定に見えるとはいえ、過去パッケージ上の問題をいくつか経験して来
    てるし、その一部は簡単には解決できないものでした。

    Debian パッケージのバグからの早急かつ簡単な復元を確実にするいくつ
    かの予防策のアイデアです。

      * 「レスキューシステム」に従い、レスキューシステムを準備する。

      * Debian システムの安定版 stable スイーツを別のパーティションに
        インストールし、システムをヂュアルブータブル化
   
      * apt-listbugs をインストールしてアップグレードの前に Debian バ
        グトラッキングシステム (BTS) をチェックを考慮

      * 問題回避するのに十分なだけのパッケージシステムの基盤を学習

    注意
   
    これらの予防策の何れもできないなら、テスト版 testing や不安定版
    unstable スイーツを使うのには、きっとあなたは準備不足です。

2.1.5. Debian アーカイブの基本

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

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

    システムユーザーから見ると、Debian アーカイブは APT システムを用
    いてアクセスされます。

    APT システムは、そのデーターソースをソースリストとして指定し、そ
    れは sources.list(5) に説明されています。

    典型的なHTTPでのアクセスを使う trixie システムでは、ソースリスト"
    が "/etc/apt/sources.list.d/debian.sources" 中にdeb822スタイルで
    以下で提供されます:

    Types: deb deb-src
    URIs: http://deb.debian.org/debian/
    Suites: trixie
    Components: main non-free-firmware contrib non-free
   
    Types: deb deb-src
    URIs: http://security.debian.org/debian-security/
    Suites: trixie-security
    Components: main non-free-firmware contrib non-free

    ヒント

    もしソースリストが "/etc/apt/sources.list" とか "/etc/apt/
    sources.list.d/*.list" という１行スタイルのファイルで提供される場
    合は、以下のようにして更新します。

     $ sudo apt modernize-sources

    deb822スタイルのソースリストの要点は以下です。

      * その定義ファイルは "/etc/apt/sources.list.d/*.sources" ファイ
        ルです。

      * 空行で分離されている複数行の各ブロックは APT システムのデータ
        ーソースを定義します。

      * "Types:" スタンザは"deb" や "deb-src" といったタイプのリスト
        を定義します。
   
      * The "URIs:" スタンザは Debian アーカイブのルート URI のリスト
        を定義します。

      * "Suites:" スタンザはスイート名かコードネームのいずれかを用い
        てディストリビューションのリストを定義します。

      * "Components:" スタンザは Debian アーカイブの中の有効なアーカ
        イブのエリア名のリストを定義します。

    ソース関連のメタデーターにアクセスしない aptitude のためだけなら
    "deb-src" 行は安全に省略することができます。こうするとアーカイブ
    のメタデーターの更新速度が向上します。

    URL は "https://", "http://", "ftp://", "file://", … のいずれも可
    能です。

    "#" で始まる行はコメントで無視されます。

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

    ヒント

    もし上記の例で "trixie" ではなく "sid" が使われる場合には、"deb:
    http://security.debian.org/ ..." 行やそのdeb822相当の内容はソース
    リストには不要です。これは"sid" (不安定版 unstable) には、セキュ
    リティー更新のアーカイブが存在しないからです。

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

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

    +-------------------------------------------------------------------------------------------+
    | アーカイブの URL  |      スイート名       |     コードネーム      |  レポジトリーの用途   |
    |-------------------+-----------------------+-----------------------+-----------------------|
    |http://            |                       |                       |徹底的な確認後の擬似静 |
    |deb.debian.org/    |stable                 |trixie                 |的 stable (安定版)リリ |
    |debian/            |                       |                       |ース                   |
    |-------------------+-----------------------+-----------------------+-----------------------|
    |http://            |                       |                       |適度の確認と短い待機後 |
    |deb.debian.org/    |testing                |forky                  |の動的 testing (テスト |
    |debian/            |                       |                       |版)リリース            |
    |-------------------+-----------------------+-----------------------+-----------------------|
    |http://            |                       |                       |最小限の確認と無待機後 |
    |deb.debian.org/    |unstable               |sid                    |の動的 unstable (不安定|
    |debian/            |                       |                       |版)リリース            |
    |-------------------+-----------------------+-----------------------+-----------------------|
    |http://            |                       |                       |開発者によるプリリリー |
    |deb.debian.org/    |experimental           |N/A                    |ス実験 (任意、開発者専 |
    |debian/            |                       |                       |用)                    |
    |-------------------+-----------------------+-----------------------+-----------------------|
    |http://            |                       |                       |次期 stable (安定版)ポ |
    |deb.debian.org/    |stable-proposed-updates|trixie-proposed-updates|イントリリース用の更新 |
    |debian/            |                       |                       |(任意)                 |
    |-------------------+-----------------------+-----------------------+-----------------------|
    |                   |                       |                       |タイムゾーンデーターの |
    |http://            |                       |                       |ような緊急更新が必要な |
    |deb.debian.org/    |stable-updates         |trixie-updates         |stable-proposed-updates|
    |debian/            |                       |                       |スイートの部分集合 (任 |
    |                   |                       |                       |意)                    |
    |-------------------+-----------------------+-----------------------+-----------------------|
    |http://            |                       |                       |主に testing リリースか|
    |deb.debian.org/    |stable-backports       |trixie-backports       |ら再コンパイルされたパ |
    |debian/            |                       |                       |ッケージのランダムな集 |
    |                   |                       |                       |合                     |
    |-------------------+-----------------------+-----------------------+-----------------------|
    |http://            |                       |                       |stable リリース用のセキ|
    |security.debian.org|stable-security        |trixie-security        |ュリティーアップデート |
    |/debian-security/  |                       |                       |(重要)                 |
    |-------------------+-----------------------+-----------------------+-----------------------|
    |http://            |                       |                       |セキュリティーチームに |
    |security.debian.org|testing-security       |forky-security         |よるサポートは無く利用 |
    |/debian-security/  |                       |                       |されてません           |
    +-------------------------------------------------------------------------------------------+


    注意

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

    注意

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

    ヒント

    stable スイーツの Debian システムは、上記の例のようにソースリスト
    中にセキュリティー更新を有効とする "http://security.debian.org/"
    を含む内容を織り込むことが望ましいです。

    注記

    stable アーカイブのセキュリティーバグは Debian のセキュリティーチ
    ームにより修正されます。本活動は非常に厳格で信頼できるものです。
    testing アーカイブのセキュリティーバグは Debian の testing セキュ
    リティーチームにより修正されます。諸所の事情で、本活動は stable
    ほどは厳格ではなく、修正された unstable パッケージのtesting アー
    カイブへの移行を待つ必要があるかもしれません。unstable アーカイブ
    のセキュリティーバグは個別のメンテナにより修正されます。活発にメ
    ンテされている unstable パッケージはアップストリームのセキュリテ
    ィー修正を使うことで通常比較的良い状態です。Debian がセキュリティ
    ーバグへ如何に対応するかに関しては Debian security FAQ を参照下さ
    い。

    表2.3 Debian アーカイブエリアのリスト

    +---------------------------------------------------------------+
    |                 |パッ |                                       |
    |     エリア      |ケー |   パッケージ構成要素のクライテリア    |
    |                 |ジ数 |                                       |
    |-----------------+-----+---------------------------------------|
    |main             |75525|DFSG に完全準拠し、non-free のパッケー |
    |                 |     |ジに非依存 (main = 主要)               |
    |-----------------+-----+---------------------------------------|
    |                 |     |DFSG 非コンプライアント、合理的なシステ|
    |non-free-firmware|74   |ムインストール経験のために必要なファー |
    |                 |     |ムウエアー                             |
    |-----------------+-----+---------------------------------------|
    |contrib          |360  |DFSG に完全準拠だが、non-free のパッケ |
    |                 |     |ージに依存有り (contrib = 寄与)        |
    |-----------------+-----+---------------------------------------|
    |non-free         |1044 |DFSG に非準拠で non-free-firmware に含 |
    |                 |     |まれない                               |
    +---------------------------------------------------------------+


    ここで、上記にあるパッケージ数は amd64 アーキテクチャーに関する数
    字です。main エリアのアーカイブのみが Debian システムです(「
    Debian は 100% フリーソフトウェアーです」を参照下さい)。

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

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

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

    +---------------------------------------------------------------+
    |タイミング |スイーツ = 安定|スイーツ = テスト|スイーツ = 不安定|
    |           |   版 stable   |   版 testing    |   版 unstable   |
    |-----------+---------------+-----------------+-----------------|
    |trixie リリ|コード名 =     |コード名 = forky |コード名 = sid   |
    |ース後     |trixie         |                 |                 |
    |-----------+---------------+-----------------+-----------------|
    |forky リリ |コード名 =     |コード名 = duke  |コード名 = sid   |
    |ース後     |forky          |                 |                 |
    +---------------------------------------------------------------+


    コード名の歴史は、Debian FAQ: 6.2.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 アーカイブへパッケージ集合が移動される前
    に、アーカイブ管理スクリプトはパッケージの成熟度 (約2-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 アーカイブも使い物になるかもしれません。

    ヒント

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

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

      * "セクション"

      * "優先度 (priorities)"
   
      * "ベースシステム"

      * "必須パッケージ"

2.1.6. Debian は 100% フリーソフトウェアーです

    Debian は以下の理由で 100% フリーソフトウェアーです:

      * Debian はユーザーの自由を尊重すべくデフォルトではフリーソフト
        ウェアのみをインストールします。

      * Debian は main 中にはフリーソフトウェアーのみを提供します。

      * Debian は main からのフリーソフトウェアーのみを実行することを
        推奨します。

      * main 中のいかなるパッケージも non-free や non-free-firmware
        や contrib 中のいずれのパッケージに依存しないし、これらを推薦
        することもありません。

    一部の人は以下の2つの事実が矛盾するのでは無いかとの疑問を持ちます
    。

      * 「Debian は 100% フリーソフトウェアーであり続けます」。Debian
        社会契約の第一項)
   
      * Debian サーバーは non-free-firmware や non-free や contrib パ
        ッケージをホストします。

    これらは以下の理由で矛盾しません。

      * Debian システムは 100% フリーソフトウェアーでそのパッケージは
        Debian サーバーの main エリア中にホストされます。
   
      * Debian システム外のパッケージは Debian サーバーの non-free と
        non-free-firmware と contrib エリア中にホストされます。

    これらは Debian 社会契約の第4項と第5項中に正確に説明されています:

      * 私たちはユーザーとフリーソフトウェアーを大切にします

          + 私たちはユーザーとフリーソフトウェアーコミュニティーから
            の要求に従います。彼らの関心を最優先に考えます。私たちは
            さまざまな状況におけるコンピューター利用環境の運用に関し
            て、ユーザーの必要を満たすように行動します。私たちは
            Debian システム上での利用を目的としたフリーではない著作物
            に敵対することはありません。またそのような著作物を作成ま
            たは利用する人々に対して、料金を徴収することはありません
            。私たちは、Debian システムとその他の著作物の両方を含むデ
            ィストリビューションを、第三者が作成することも認めていま
            す。その際、私たちは料金を徴収しません。私たちはこれらの
            目標を増進させるために、これらのシステムの使用を妨げるよ
            うな法的な制約のない、高品質な素材を統合したシステムを提
            供します。
   
      * 私たちのフリーソフトウェアー基準に合致しない著作物について

          + 私たちは、Debian フリーソフトウェアーガイドラインに適合し
            ていない著作物を使わなければならないユーザーがいることを
            認めています。このような著作物のために、私たちはアーカイ
            ブに「non-free」と「non-free-firmware」と「contrib」とい
            う領域を作りました。これらの領域にあるパッケージは、
            Debian 上で使用できるよう設定されていますが、 Debian シス
            テムの一部ではありません。私たちは、CD 製造業者がこれらの
            領域にあるパッケージを彼らの CD に収録して配布できるかど
            うか判断する際に、それぞれのパッケージのライセンスを読ん
            で決めるよう奨めています。このように、フリーではない著作
            物は Debian の一部ではありませんが、その使用をサポートし
            、フリーではないパッケージのための (バグ追跡システムやメ
            ーリングリストのような) インフラストラクチャーを用意して
            います。

    注記

    Debian 社会契約 1.2 の第 5 項の実際の文言は上記と少々違います。こ
    の編集上導入したズレは、社会契約の本質的内容を変えること無く本ユ
    ーザー文書の自己整合性を確保するために意識的に作られたズレです。

    ユーザーは non-free や non-free-firmware や contrib エリア中のパ
    ッケージを使用するリスクを認識すべきです。

      * そのようなソフトウェアーパッケージに関する自由の欠如

      * そのようなソフトウェアーパッケージに関するDebianからのサポー
        トの欠如 (Debian はソフトウェアーのソースコードに適切なアクセ
        スなしにはソフトウェアーをサポートできません。)

      * あなたの 100% フリーソフトウェアーの Debain システムへの汚染

    Debian フリーソフトウェアーガイドラインは Debian のフリーソフトウ
    ェアー基準です。Debian は「ソフトウェアー」に関して、パッケージ中
    の文書、ファームウエアー、ロゴ、アート作品を含む最も広義の解釈を
    します。このことにより Debian のフリーソフトウェアー基準は非常に
    厳格なものとなります。

    典型的な non-free や non-free-firmware や contrib パッケージは以
    下のタイプの自由に頒布できるパッケージを含んでいます。

      * GCC や Make 等の変更不可部分付きの GNU フリー文書利用許諾契約
        書に基づく文書パッケージ。 (主に non-free/doc セクション中に
        ある)

      * 「ハードウエアードライバーとファームウエアー」に列記された中
        で non-free-firmware とあるソースコード無しのバイナリーデータ
        ーを含むファームウエアーパッケージ。 (主に non-free-firmware/
        kernel セクション中にある)

      * 商用使用やコンテント変更に関する制約のあるゲームやフォントの
        パッケージ。

    non-free と non-free-firmware と contrib パッケージの数は main パ
    ッケージの数の 2% 以下ということを承知下さい。non-free や
    non-free-firmware や contrib エリアへのアクセスを有効にしてもパッ
    ケージソースは不明瞭になりません。aptitude(8) をインタラクティブ
    でフルスクリーンに使用すると、どのエリアからどのパッケージをイン
    ストールするのかを完全に可視化しコントロールできるので、あなたの
    システムをあなたの意向通りの自由の程度に合わせて維持できます。

2.1.7. パッケージ依存関係

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

      * "Depends"

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

      * "Pre-Depends"

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

      * "Recommends"

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

      * "Suggests"

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

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

      * "Breaks"

          + これは通常バージョン制約付きでパッケージのインコンパチビ
            リティーを宣言します。一般的にこのフィールドにリストされ
            た全てのパッケージをアップグレードすることで解決します。

      * "Conflicts"

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

      * "Replaces"

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

      * "Provides"

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

    注記

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

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

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

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

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

         1. アーカイブメタデーターをリモートアーカイブから取得

         2. APT が使えるようローカルメタデーターの再構築と更新

      * 更新 ("apt upgrade" と "apt full-upgrade"か、"aptitude
        safe-upgrade" と "aptitude full-upgrade" か、"apt-get
        upgrade" と "apt-get dist-upgrade"):

         1. 全てのインストール済みパッケージに関して、通常最新の利用
            可能なバージョンを選択します (例外については「apt-pinning
            で候補バージョンを調整」を参照下さい)

         2. パッケージ依存関係解決の実行

         3. もし候補バージョンがインストール済みバージョンと異なる際
            には、選ばれたバイナリーパッケージをリモートアーカイブか
            ら取得

         4. 取得バイナリーパッケージの開梱

         5. preinst スクリプトの実行

         6. バイナリーファイルのインストール

         7. postinst スクリプトの実行

      * インストール ("apt install ..." か "aptitude install ..." か
        "apt-get install ..."):

         1. コマンドラインにリストされたパッケージの選択

         2. パッケージ依存関係解決の実行
   
         3. 選ばれたバイナリーパッケージをリモートアーカイブから取得

         4. 取得バイナリーパッケージの開梱

         5. preinst スクリプトの実行

         6. バイナリーファイルのインストール

         7. postinst スクリプトの実行

      * 削除 ("apt remove ..." か "aptitude remove ..." か "apt-get
        remove ..."):

         1. コマンドラインにリストされたパッケージの選択

         2. パッケージ依存関係解決の実行

         3. prerm スクリプトの実行

         4. 設定ファイル以外のインストール済みファイルの削除

         5. postrm スクリプトの実行

      * 完全削除 ("apt purge ..." か "aptitude purge ..." か "apt-get
        purge ..."):

         1. コマンドラインにリストされたパッケージの選択

         2. パッケージ依存関係解決の実行

         3. prerm スクリプトの実行

         4. 設定ファイルを含めたインストール済みファイルの削除

         5. postrm スクリプトの実行

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

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

    内容が正確な正式文書を読むように心がけるべきです。まず Debian に
    特定のことが記載された "/usr/share/doc/package_name/
    README.Debian" を最初に読むべきです。また "/usr/share/doc/
    package_name/" の中にある他の文書も参照すべきです。「Bash のカス
    タム化」に書かれたようなシェル設定がされていれば、以下のようにタ
    イプして下さい。

    $ cd package_name
    $ pager README.Debian
    $ mc

    さらに詳しい情報を得るには "-doc" というサフィクスを持った対応す
    る文書パッケージをインストールする必要があるかもしれません。

    特定パッケージに関する問題に出会った際には、Debian バグトラッキン
    グシステム (BTS) サイトを必ず確認します。

    表2.5 特定パッケージの問題解決のためのキーとなるウェッブサイトの
    リスト

    +---------------------------------------------------------------+
    |        ウェッブサイト        |            コマンド            |
    |------------------------------+--------------------------------|
    |Debian バグトラッキングシステ |sensible-browser "https://      |
    |ム (BTS) のホームページ       |bugs.debian.org/"               |
    |------------------------------+--------------------------------|
    |既知のパッケージに関するバグレ|sensible-browser "https://      |
    |ポート                        |bugs.debian.org/package_name"   |
    |------------------------------+--------------------------------|
    |既知のバグ番号に関するバグレポ|sensible-browser "https://      |
    |ート                          |bugs.debian.org/bug_number"     |
    +---------------------------------------------------------------+


    "site:debian.org" や "site:wiki.debian.org" や
    "site:lists.debian.org" 等を含む検索語で Google を検索します。

    バグ報告をする際には、reportbug(1) コマンドを使います。

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

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

      * 必須 (essential): yes > no

      * エリア (area): メイン (main) > contrib > non-free

      * 優先度 (priority): 必須 (required) > 重要 (important) > 標準
        (standard) > 任意 (optional) > 特別 (extra)

      * タスク (tasks): "デスクトップ環境" のようなタスクにリストされ
        たパッケージ

      * 依存パッケージにより選ばれたパッケージ (例えば、gcc による
        gcc-15)
   
      * ポプコン: 投票やインストールの数が多い

      * changelog: メンテナによる定期的更新

      * BTS: RC bug が無いこと (critical も grave も serious もいずれ
        のバグも無い)

      * BTS: バグレポートに反応の良いメンテナ

      * BTS: 最近修正されたバグの数が多い

      * BTS: wishlist 以外のバグが少ない

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

2.1.11. 矛盾した要求への対処法

    どのスイートの Debian システムを使うと決めようと、そのスイートで
    利用可能となっていないプログラムのバージョンをなんとか実行したい
    かもしれません。そのようなプログラムのバイナリーパッケージが他の
    Debian スイートとか他の非 Debian リソースで見つかるかもしれません
    が、あなたの現行の Debian システムはそれらの要求条件と相容れない
    かもしれません。

    そのような不同期のバイナリーパッケージをインストールする「
    apt-pinning で候補バージョンを調整」に記載されたような 
    apt-pinning テクニック等を用いてパッケージ管理システムを微調整す
    ることができるとはいえ、そのような微調整はそれらのプログラムやあ
    なたのシステムを壊すかもしれないので、そのような微調整のアプロー
    チには限定的なユースケースしかありません。

    そのような非同期のパッケージを強引にインストールする前に、あなた
    の現行の Debian システムとコンパチブルな、全ての利用可能な安全な
    技術的解決策を探索すべきです。

      * 対応するサンドボックス化したアップストリームのバイナリーパッ
        ケージをインストール(「サンドボックス」を参照下さい)。

          + LibreOffice や GNOME アプリケーション等の多くの主に GUI
            プログラムは、Flatpak や Snap や AppImage パッケージが利
            用可能です。

      * chroot か類似の環境を作り、その中でそのようなプログラムを実行
        (「仮想化システム」を参照下さい)。

          + CLI コマンドは、それとコンパチブルな chroot 下で簡単に実
            行できます(「Chroot システム」を参照下さい)。

          + 複数のフルのデスクトップ環境をリブートすること無く簡単に
            試せます(「複数のデスクトップシステム」を参照下さい)。

      * あなたの現行の Debian システムとコンパチブルな望ましいバージ
        ョンのバイナリーパッケージをビルド。

          + これは、簡便でない操作です(「安定版システムへのパッケージ
            移植」を参照下さい)。

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

    Debian システム上でのレポジトリーを使ったパッケージ管理操作は
    Debian システム上にある多くのAPTを使うパッケージ管理ツールを使い
    できます。ここでは、apt /apt-get / apt-cache や aptitude といった
    3つの基本的なパッケージ管理ツールを説明します。

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

2.2.1. apt と apt-get/apt-cache と aptitude の比較

    aptitude は筆者が主に使う非常に良いインタラクティブツールではあり
    ますが、注意すべき事実があることを知っておくべきです。

      * stable(安定版) Debian システムにおいて、新リリースがあった後
        の新リリースシステムへのアップグレードにaptitude コマンドを使
        用することは推薦されません。

          + それには、"apt full-upgrade" か "apt-get dist-upgrade" を
            使うことが推薦されます。Bug #411280 参照下さい。

      * aptitude コマンドは時折testing(試験版) や unstable (不安定版)
        Debian システム上でシステムアップグレードをしようとする際に、
        大量のパッケージ削除を提案することが時々あります。
   
          + この状況は多くのシステム管理者を驚かせて来ました。パニッ
            クしないで下さい。

          + このようなことは gnome-core の様なメタパッケージにより依
            存や推薦されるパッケージ間のバージョンのずれにより発生す
            るようです。

          + この状況は aptitude コマンドのメニューから "未実行アクシ
            ョンの取り消し" を選択し、aptitude を終了し、"apt
            full-upgrade" を使うことで解決できます。

    apt-get や apt-cache コマンドはAPTを使う最も基本的なパッケージ管
    理ツールです。

      * apt-get/apt-cache はコマンドラインのユーザーインターフェース
        のみを提供します。

      * apt-get はリリース間のような大掛かりなシステムアップグレード
        に最適です。

      * apt-get は頑強で安定なパッケージリゾルバーを提供します。
   
      * apt-getはハードウエアリソースへの要求が楽である。メモリーの消
        費は少なく、実行速度が早い。

      * apt-cache はパッケージ名や説明に関して標準の regex を使った検
        索機能を提供します。

      * apt-get と apt-cache は /etc/apt/preferences を使って複数のバ
        ージョンのパッケージを管理できますが、それはとても面倒です。

    apt コマンドはパッケージ管理のための上位コマンドラインインターフ
    ェースです。基本的に apt-get や apt-cache 等のコマンドのラッパー
    で、インタラクティブな用途に良いオプションをデフォルトで有効にし
    てエンドユーザーインターフェース向けとなっています。

      * apt は、apt install としてパッケージをインストールするとフレ
        ンドリーなプログレスバーを提供します。
   
      * apt は、ダウンロードされたパッケージが上手くインストールされ
        た後、デフォルトでキャッシュされた .deb パッケージを削除しま
        す。

    ヒント

    ユーザーはインタラクティブ用途には apt(8) コマンドを使うことが推
    奨されますし、シェルスクリプト中ではapt-get(8) や apt-cache(8) コ
    マンドを使うことが推奨されます。

    aptitude コマンドは最も多芸なAPTを使うパッケージ管理ツールです。

      * aptitude はフルスクリーンのインタラクティブなテキストユーザー
        インターフェースを提供します。

      * aptitude はコマンドラインのユーザーインターフェースも提供しま
        す。

      * aptitude はインストール済みパッケージを検査したり利用可能なパ
        ッケージを探索したりするような日常のインタラクティブなパッケ
        ージ管理に最適です。

      * aptitudeはハードウエアリソースへの要求が厳しい。メモリーの消
        費は多く、実行速度も遅い。

      * aptitude はパッケージメタデータ全てに関する拡張されたregex を
        使った探索を提供します。

      * aptitude は /etc/apt/preferences を使わずに複数のバージョンの
        パッケージを管理できますし、それは非常に直感的です。

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

    apt(8) や aptitude(8) や apt-get(8) /apt-cache(8) を使うコマンド
    ラインによるパッケージ管理操作を次に記します。

    表2.6 apt(8) や aptitude(8) や apt-get(8) /apt-cache(8) を使うコ
    マンドラインによる基本パッケージ管理操作

    +---------------------------------------------------------------+
    |                  |aptitude シ |  apt-get/  |                  |
    | apt シンタックス | ンタックス |apt-cache シ|       説明       |
    |                  |            | ンタックス |                  |
    |------------------+------------+------------+------------------|
    |apt update        |aptitude    |apt-get     |パッケージアーカイ|
    |                  |update      |update      |ブメタデーター更新|
    |------------------+------------+------------+------------------|
    |                  |            |            |"foo" パッケージの|
    |apt install foo   |aptitude    |apt-get     |候補バージョンをそ|
    |                  |install foo |install foo |の依存関係とともに|
    |                  |            |            |インストール      |
    |------------------+------------+------------+------------------|
    |                  |            |            |他のパッケージを削|
    |                  |aptitude    |apt-get     |除すること無くイン|
    |apt upgrade       |safe-upgrade|upgrade     |ストール済みパッケ|
    |                  |            |            |ージの候補バージョ|
    |                  |            |            |ンをインストール  |
    |------------------+------------+------------+------------------|
    |                  |            |            |必要なら他のパッケ|
    |                  |            |            |ージを削除しながら|
    |apt full-upgrade  |aptitude    |apt-get     |インストール済みパ|
    |                  |full-upgrade|dist-upgrade|ッケージの候補バー|
    |                  |            |            |ジョンをインストー|
    |                  |            |            |ル                |
    |------------------+------------+------------+------------------|
    |                  |aptitude    |apt-get     |設定ファイルを残し|
    |apt remove foo    |remove foo  |remove foo  |たまま "foo" パッ |
    |                  |            |            |ケージを削除      |
    |------------------+------------+------------+------------------|
    |                  |            |apt-get     |既に必要なくなって|
    |apt autoremove    |N/A         |autoremove  |いる自動済みパッケ|
    |                  |            |            |ージを削除        |
    |------------------+------------+------------+------------------|
    |                  |aptitude    |apt-get     |設定ファイルを含め|
    |apt purge foo     |purge foo   |purge foo   |て "foo" パッケー |
    |                  |            |            |ジを完全削除      |
    |------------------+------------+------------+------------------|
    |                  |            |            |収集されローカルに|
    |apt clean         |aptitude    |apt-get     |貯蔵されたパッケー|
    |                  |clean       |clean       |ジファイルを完全消|
    |                  |            |            |去                |
    |------------------+------------+------------+------------------|
    |                  |            |            |収集されローカルに|
    |                  |aptitude    |apt-get     |貯蔵されたパッケー|
    |apt autoclean     |autoclean   |autoclean   |ジファイルのうち古|
    |                  |            |            |くなったパッケージ|
    |                  |            |            |を消去            |
    |------------------+------------+------------+------------------|
    |                  |aptitude    |apt-cache   |"foo"パッケージに |
    |apt show foo      |show foo    |show foo    |関する詳細情報を表|
    |                  |            |            |示                |
    |------------------+------------+------------+------------------|
    |apt search regex  |aptitude    |apt-cache   |regex とマッチする|
    |                  |search regex|search regex|パッケージを検索  |
    |------------------+------------+------------+------------------|
    |                  |            |            |なぜ regex とマッ |
    |N/A               |aptitude why|N/A         |チするパッケージが|
    |                  |regex       |            |インストールされる|
    |                  |            |            |のかを説明        |
    |------------------+------------+------------+------------------|
    |                  |aptitude    |            |なぜ regex とマッ |
    |N/A               |why-not     |N/A         |チするパッケージが|
    |                  |regex       |            |インストールされな|
    |                  |            |            |いのかを説明      |
    |------------------+------------+------------+------------------|
    |apt list          |aptitude    |apt-mark    |手動インストール済|
    |--manual-installed|search '~i! |showmanual  |みパッケージをリス|
    |                  |~M'         |            |ト                |
    +---------------------------------------------------------------+


    apt / apt-get と aptitude は大きな問題なく混用が可能です。

    "aptitude why regex" は "aptitude -v why regex" とすることで、さ
    らに詳しい情報を表示します。同様の情報は "apt rdepends package"
    や "apt-cache rdepends package" とすることでも得られます。

    aptitude コマンドが最初コマンドラインモードで実行されパッケージ間
    のコンフリクトのような問題に直面した場合は、プロンプトがでた際に
    "e" を押すことでフルスクリーンのインタラクティブモードに切り替え
    られます。

    注記

    aptitude コマンドはその拡張されたパッケージリゾルバーのような豊富
    な機能が同梱されていますが、この複雑さは Bug #411123 や Bug #
    514930 や Bug #570377 のようないくつかのリグレッションを引き起こ
    しました (また起こしているかもしれません)。疑義のある場合には、
    aptitude コマンドに代えて apt や apt-get や apt-cache コマンドを
    使って下さい。

    "aptitude" のすぐ後ろにコマンドオプションをつけられます。

    表2.7 aptitude(8) に関する特記すべきコマンドオプション

    +---------------------------------------------------------------+
    |コマンドオプシ |                     説明                      |
    |     ョン      |                                               |
    |---------------+-----------------------------------------------|
    |-s             |コマンド結果のシミュレート                     |
    |---------------+-----------------------------------------------|
    |-d             |インストール / アップグレード無しにダウンロード|
    |               |のみする                                       |
    |---------------+-----------------------------------------------|
    |-D             |自動的なインストールや削除の前に簡単な説明を表 |
    |               |示                                             |
    +---------------------------------------------------------------+


    詳細は aptitude(8) や "/usr/share/doc/aptitude/README" にある
    "aptitude user's manual" を参照下さい。

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

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

    $ sudo aptitude -u
    Password:

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

    ヒント

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

    ヒント

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

2.2.4. 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.5. aptitude の下でのパッケージの表示

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

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

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

      * "現状" フラグ (1番目の文字)

      * "予定のアクション" フラグ (2番目の文字)

      * "自動" フラグ (3番目の文字)

      * パッケージ名

      * "予定のアクション" に帰属されるディスク空間の使用の変化

      * パッケージの現バージョン

      * パッケージの候補バージョン

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

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

    "表示" メニューの下にある数種のパッケージ表示が利用できます。

    表2.9 aptitude の表示のリスト

    +---------------------------------------------------------------+
    |    表示    |                   ビューの説明                   |
    |------------+--------------------------------------------------|
    |パッケージ画|表2.10「標準パッケージ画面の分類」を参照 (デフォー|
    |面          |ルト)                                             |
    |------------+--------------------------------------------------|
    |推奨を監査  |何らかのインストール済みパッケージによって推薦され|
    |            |ているがインストールされていないパッケージをリスト|
    |------------+--------------------------------------------------|
    |平坦なパッケ|パッケージを分類せずにリスト (regex とともに使用) |
    |ージリスト  |                                                  |
    |------------+--------------------------------------------------|
    |Debtags 表示|パッケージの debtags のエントリーにより分類したパ |
    |            |ッケージをリスト                                  |
    |------------+--------------------------------------------------|
    |ソースパッケ|ソースパッケージごとに分けてパッケージのリストを表|
    |ージ画面    |示                                                |
    +---------------------------------------------------------------+


    注記
   
    パッケージの debtags によるタグ付け状況を改善するのにご協力下さい
    ！

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

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

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


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

2.2.6. aptitude を使った探索方法

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

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

          + マッチするパッケージのインストール状態やパッケージ名や短
            い説明をリストをすには、"aptitude search 'aptitude_regex
            '"

          + パッケージの詳細説明のリストをするには、"aptitude show '
            package_name'"

      * 対話型フルスクリーンモード:

          + マッチするパッケージにパッケージビューを絞る、"l"

          + マッチするパッケージを探す、"/"

          + マッチするパッケージを逆方向に探す、"\"

          + 次を探す、"n"

          + 次を逆方向に探す、"N"

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

2.2.7. aptitude の regex 式

    aptitude の regex 式は mutt 的な拡張 ERE (「正規表現」を参照下さ
    い) で aptitude に特定なマッチ規則の拡張は次に示すとおりです。

    表2.11 aptitude の regex 式のリスト

    +---------------------------------------------------------------+
    |拡張マッチ規|                     regex 式                     |
    |  則の説明  |                                                  |
    |------------+--------------------------------------------------|
    |パッケージ名|~n名前のregex                                     |
    |とのマッチ  |                                                  |
    |------------+--------------------------------------------------|
    |記述とのマッ|~d記述のregex                                     |
    |チ          |                                                  |
    |------------+--------------------------------------------------|
    |タスク名との|~tタスクのregex                                   |
    |マッチ      |                                                  |
    |------------+--------------------------------------------------|
    |debtag との |~Gdebtagのregex                                   |
    |マッチ      |                                                  |
    |------------+--------------------------------------------------|
    |メンテナとの|~mmaintainerのregex                               |
    |マッチ      |                                                  |
    |------------+--------------------------------------------------|
    |パッケージセ|                                                  |
    |クションとの|~sセクションのregex                               |
    |マッチ      |                                                  |
    |------------+--------------------------------------------------|
    |パッケージバ|                                                  |
    |ージョンとの|~Vバージョンのregex                               |
    |マッチ      |                                                  |
    |------------+--------------------------------------------------|
    |アーカイブ  |                                                  |
    |(archive) と|~A{trixie,forky,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                                                |
    |パッケージと|                                                  |
    |マッチ      |                                                  |
    |------------+--------------------------------------------------|
    |type の壊れ |                                                  |
    |た依存関係を|                                                  |
    |宣言している|~Btype                                            |
    |パッケージと|                                                  |
    |マッチ      |                                                  |
    |------------+--------------------------------------------------|
    |type の壊れ |                                                  |
    |た依存関係を|                                                  |
    |宣言している|~D[type:]pattern                                  |
    |pattern パッ|                                                  |
    |ケージとマッ|                                                  |
    |チ          |                                                  |
    |------------+--------------------------------------------------|
    |type の壊れ |                                                  |
    |た依存関係を|                                                  |
    |宣言している|~DB[type:]pattern                                 |
    |pattern パッ|                                                  |
    |ケージとマッ|                                                  |
    |チ          |                                                  |
    |------------+--------------------------------------------------|
    |pattern マッ|                                                  |
    |チするパッケ|                                                  |
    |ージが type |                                                  |
    |の依存関係を|~R[type:]pattern                                  |
    |宣言している|                                                  |
    |パッケージと|                                                  |
    |マッチ      |                                                  |
    |------------+--------------------------------------------------|
    |pattern マッ|                                                  |
    |チするパッケ|                                                  |
    |ージが type |                                                  |
    |の壊れた依存|~RB[type:]pattern                                 |
    |関係を宣言し|                                                  |
    |ているパッケ|                                                  |
    |ージとマッチ|                                                  |
    |------------+--------------------------------------------------|
    |他のインスト|                                                  |
    |ール済みパッ|                                                  |
    |ケージが依存|~R~i                                              |
    |するパッケー|                                                  |
    |ジとマッチ  |                                                  |
    |------------+--------------------------------------------------|
    |他のインスト|                                                  |
    |ール済みパッ|                                                  |
    |ケージが一切|!~R~i                                             |
    |依存しないパ|                                                  |
    |ッケージとマ|                                                  |
    |ッチ        |                                                  |
    |------------+--------------------------------------------------|
    |他のインスト|                                                  |
    |ール済みパッ|                                                  |
    |ケージが依存|~R~i|~Rrecommends:~i                              |
    |もしくは推薦|                                                  |
    |するパッケー|                                                  |
    |ジとマッチ  |                                                  |
    |------------+--------------------------------------------------|
    |フィルターさ|                                                  |
    |れたバージョ|~S filter pattern                                 |
    |ンの pattern|                                                  |
    |とマッチ    |                                                  |
    |------------+--------------------------------------------------|
    |常に全てのパ|                                                  |
    |ッケージにマ|~T                                                |
    |ッチ (真)   |                                                  |
    |------------+--------------------------------------------------|
    |どのパッケー|                                                  |
    |ジにもマッチ|~F                                                |
    |しない (偽) |                                                  |
    +---------------------------------------------------------------+


      * regex 部分は、"^" や ".*" や "$" などを使う egrep(1) や awk
        (1) や perl(1) といった典型的な Unix 的テキストツールで使われ
        る ERE と同様です。

      * 依存関係を表す type はパッケージの相互関係を指定する
        (depends, predepends, recommends, suggests, conflicts,
        replaces, provides) の内の1つです。

      * デフォールトの依存タイプは "depends" です。

    ヒント
   
    regex_pattern がヌル文字列の場合は "~T" をコマンドの直後に使って
    下さい。

    次がショートカットです。

      * "~Pterm" == "~Dprovides:term"

      * "~Cterm" == "~Dconflicts:term"

      * "…~W term" == "(…|term)"

    mutt が表現のお手本なので、mutt に慣れているユーザーはすぐ慣れる
    でしょう。"User's Manual" ("/usr/share/doc/aptitude/README") 中の
    "SEARCHING, LIMITING, AND EXPRESSIONS" を参照下さい。

    注記

    lenny バージョンの aptitude(8) では、新規の "?broken" のような長
    形式の regex マッチ形式が、古い "~b" のような短形式のマッチ形式に
    代えて使えます。そのためチルダ文字 "~" に加えてスペース文字 " "
    も regex の終端文字として扱われます。新規の長形式のマッチ形式につ
    いては "User's Manual" を参照下さい。

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

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

    aptitude コマンドの"自動インストール" 挙動を制御するフラグは apt
    パッケージ中の apt-mark(8) コマンドを用いても操作できます。

2.2.9. パッケージ活動ログ

    パッケージ活動履歴はログファイルで確認できます。

    表2.12 パッケージ活動のログファイル

    +--------------------------------------------------------------+
    |      ファイル       |                  内容                  |
    |---------------------+----------------------------------------|
    |/var/log/dpkg.log    |全パッケージ活動の dpkg レベルの活動ログ|
    |---------------------+----------------------------------------|
    |/var/log/apt/term.log|汎用 APT 活動ログ                       |
    |---------------------+----------------------------------------|
    |/var/log/aptitude    |aptitude コマンド活動ログ               |
    +--------------------------------------------------------------+


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

2.3. aptitude 操作例

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

2.3.1. 興味あるパッケージの探索

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

2.3.2. 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.3. regex マッチをしての閲覧

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

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

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

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

    # aptitude search '~c'

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

    # aptitude purge '~c'

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

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

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

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

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

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

     1. aptitude を root としてインタラクティブに起動します。

     2. "u" と "U" と "f" と "g" とタイプしてパッケージリストを更新し
        パッケージをアップグレードします。

     3. パッケージ表示制限を "~i(~R~i|~Rrecommends:~i)" と入力するた
        めに "l" とタイプし、自動インストール済みとするように
        "Installed Packages" (インストール済みパッケージ) の上で "M"
        とでタイプします。

     4. パッケージ表示制限を "~prequired|~pimportant|~pstandard|~E"
        と入力するために "l" とタイプし、手動インストールとなるよう
        "m" と "Installed Packages" (インストール済みパッケージ)の上
        でタイプします。

     5. パッケージ表示制限を "~i!~M" と入力するために "l" とタイプし
        、"Installed Packages" (インストール済みパッケージ)の上で "["
        とタイプしてパッケージを見えるようにした後で個々のパッケージ
        の上で "-" とタイプして使っていないパッケージを削除します。

     6. パッケージ表示制限を "~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.6. システム全体のアップグレード

    注記

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

    ソースリストの内容を新規リリースへ向けるように変更し、"apt
    update; apt dist-upgrade"コマンドを実行することでシステム全体のア
    ップグレードができます。

    安定版 stable リリースが trixie の期間中の、安定版 stable からテ
    スト版 testing や不安定版 unstable にアップグレードするには、「
    Debian アーカイブの基本」にあるソースリスト例の "trixie" を
    "forky" か "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. ソースリストを更新して新アーカイブ対象に "aptitude update" を
        実行します。

    11. "aptitude install perl" 等として、先に新規の中核的パッケージ
        を必要に応じてインストールします。

    12. "apt-get -s dist-upgrade" コマンドを実行して影響を確認します
        。

    13. 最後に "apt-get dist-upgrade" コマンドを実行します。

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

    注意

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

    注意

    「リリースノート」は可能性ある全ケースをカバーしていないかもしれ
    ません。低レベル設定を変更した場合、あなたの次のアップグレードは
    "... segfault after upgrade ..." のように上手く行かないかもしてま
    せん。

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

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

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

    aptitude ではハイレベル過ぎるとか必要な機能を欠くという他のパッケ
    ージ管理操作のリストです。

    表2.13 高度なパッケージ管理操作

    +---------------------------------------------------------------+
    |         コマンド          |            アクション             |
    |---------------------------+-----------------------------------|
    |COLUMNS=120 dpkg -l パッケ |バグレポートのためにインストール済 |
    |ージ名パターン             |みパッケージの状態をリスト         |
    |---------------------------+-----------------------------------|
    |dpkg -L パッケージ名       |インストール済みパッケージの内容を |
    |                           |リスト                             |
    |---------------------------+-----------------------------------|
    |dpkg -L パッケージ名 |     |インストール済みパッケージのマンペ |
    |egrep '/usr/share/man/man.*|ージをリスト                       |
    |/.+'                       |                                   |
    |---------------------------+-----------------------------------|
    |dpkg -S ファイル名パターン |マッチするファイル名があるインスト |
    |                           |ール済みパッケージをリスト         |
    |---------------------------+-----------------------------------|
    |apt-file search ファイル名 |マッチするファイル名があるアーカイ |
    |パターン                   |ブ中のパッケージをリスト           |
    |---------------------------+-----------------------------------|
    |apt-file list パッケージ名 |アーカイブ中のマッチするパッケージ |
    |パターン                   |をリスト                           |
    |---------------------------+-----------------------------------|
    |dpkg-reconfigure パッケージ|特定パッケージを再設定             |
    |名                         |                                   |
    |---------------------------+-----------------------------------|
    |dpkg-reconfigure -plow パッ|もっとも詳細な質問で特定パッケージ |
    |ケージ名                   |を再設定                           |
    |---------------------------+-----------------------------------|
    |configure-debian           |フルスクリーンメニューからパッケー |
    |                           |ジを再設定                         |
    |---------------------------+-----------------------------------|
    |dpkg --audit               |部分インストール済みパッケージに関 |
    |                           |してシステムを監査                 |
    |---------------------------+-----------------------------------|
    |dpkg --configure -a        |全ての部分インストール済みパッケー |
    |                           |ジを設定                           |
    |---------------------------+-----------------------------------|
    |apt-cache policy バイナリー|バイナリーパッケージに関して利用可 |
    |パッケージ名               |能なバージョンやプライオリティーや |
    |                           |アーカイブ情報を表示               |
    |---------------------------+-----------------------------------|
    |apt-cache madison パッケー |パッケージに関して利用可能なバージ |
    |ジ名                       |ョンやアーカイブ情報を表示         |
    |---------------------------+-----------------------------------|
    |apt-cache showsrc バイナリ |バイナリーパッケージに関してソース |
    |ーパッケージ名             |パッケージの情報を表示             |
    |---------------------------+-----------------------------------|
    |apt-get build-dep パッケー |パッケージをビルドするのに必要なパ |
    |ジ名                       |ッケージをインストール             |
    |---------------------------+-----------------------------------|
    |aptitude build-dep         |パッケージをビルドするのに必要なパ |
    |package_name               |ッケージをインストール             |
    |---------------------------+-----------------------------------|
    |apt-get source パッケージ名|(標準アーカイブから) ソースをダウン|
    |                           |ロード                             |
    |---------------------------+-----------------------------------|
    |dget dscファイルのURL      |(他のアーカイブから) ソースをダウン|
    |                           |ロード                             |
    |---------------------------+-----------------------------------|
    |dpkg-source -x パッケージ名|ソースパッケージの組 ("*.tar.gz" と|
    |_バージョン-debianのレビジ |"*.debian.tar.gz" / "*.diff.gz") か|
    |ョン.dsc                   |らソースツリーをビルド             |
    |---------------------------+-----------------------------------|
    |debuild binary             |ローカルのソースツリーからパッケー |
    |                           |ジをビルド                         |
    |---------------------------+-----------------------------------|
    |make-kpkg kernel_image     |カーネルソースツリーからカーネルパ |
    |                           |ッケージをビルド                   |
    |---------------------------+-----------------------------------|
    |make-kpkg --initrd         |カーネルソースツリーから initramfs |
    |kernel_image               |を有効にしてカーネルパッケージをビ |
    |                           |ルド                               |
    |---------------------------+-----------------------------------|
    |dpkg -i パッケージ名_バージ|ローカルパッケージをシステムにイン |
    |ョン-debianのレビジョン_ア |ストール                           |
    |ーキテクチャー名.deb       |                                   |
    |---------------------------+-----------------------------------|
    |apt install /path/to/      |自動的に依存関係を解決しながらロー |
    |package_filename.deb       |カルパッケージをシステムにインスト |
    |                           |ールする                           |
    |---------------------------+-----------------------------------|
    |debi パッケージ名_バージョ |ローカルパッケージ (複数) をシステ |
    |ン-debianのレビジョン_アー |ムにインストール                   |
    |キテクチャー名.dsc         |                                   |
    |---------------------------+-----------------------------------|
    |dpkg --get-selections '*' >|dpkg レベルのパッケージ選択状態情報|
    |selection.txt              |を保存                             |
    |---------------------------+-----------------------------------|
    |dpkg --set-selections      |dpkg レベルのパッケージ選択状態情報|
    |<selection.txt             |を設定                             |
    |---------------------------+-----------------------------------|
    |                           |特定パッケージの dpkg レベルのパッ |
    |echo package_name hold |   |ケージ選択状態を hold にする       |
    |dpkg --set-selections      |("aptitude hold package_name" と等 |
    |                           |価)                                |
    +---------------------------------------------------------------+


    注記

    multi-arch 機能のあるパッケージに関して、一部のコマンドはアーキテ
    クチャー名を必要があるかもしれません。例えば、amd64 アーキテクチ
    ャーの libglib2.0-0 パッケージの内容をリストするには "dpkg -L
    libglib2.0-0:amd64" を使います。

    注意

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

    以下を承知下さい。

      * 全てのシステム設定やインストールコマンドは root から実行なけ
        ればいけません。

      * regex (「正規表現」を参照下さい) を使う aptitude と異なり、他
        のパッケージ管理コマンドはシェルグロブ (「シェルグロブ」を参
        照下さい) のようなパターンを使います。

      * apt-file パッケージに入っている apt-file(1) は事前に
        "apt-file update" を実行する必要があります。

      * configure-debian パッケージに入っている configure-debian(8)
        はそのバックエンドとして dpkg-reconfigure(8) を実行します。

      * dpkg-reconfigure(8) はそのバックエンドとして debconf(1) を利
        用するパッケージスクリプトを実行します。
   
      * "apt-get build-dep" や "apt-get source" や "apt-cache
        showsrc" コマンドはソースリストの中に "deb-src" エントリーが
        必要です。

      * dget(1) や debuild(1) や debi(1) は devscripts パッケージが必
        要です。

      * "apt-get source" を使った (再)パッケージ化の手続きは「安定版
        システムへのパッケージ移植」を参照下さい。

      * make-kpkg コマンドは kernel-package パッケージが必要です (「
        カーネル」を参照下さい)。

      * 一般的なパッケージ化に関しては「Debian パッケージ作成」を参照
        下さい。

2.4.2. インストール済みパッケージファイルの検証

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

    注記

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

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

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

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

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

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

    最近は Debian サイトの https://packages.debian.org/ を訪問すると
    パッケージメタデーターの検索を簡単に出きるようになっていますが、
    より伝統的な方法を見てみます。

    grep-dctrl(1) や grep-status(1) や grep-available(1) コマンドは
    Debian のパッケージコントロールファイルの一般的フォーマットに従う
    いかなるファイルを検索するのにも使えます。

    マッチする名前のファイルを含む dpkg でインストール済みパッケージ
    名を探索するのに "dpkg -S ファイル名パターン" が使えます。しかし
    メンテナスクリプトで生成されるファイルはこれでは見逃されます。

    dpkg のメタデーターに関してより詳細な検索をする必要がある場合、"/
    var/lib/dpkg/info/" ディレクトリーで "grep -e regexパターン *" コ
    マンドを実行しないといけません。こうすることでパッケージスクリプ
    トやインストール時の質問テキスト中の言葉まで検索できます。

    パッケージ依存関係を再帰的に検索したい際には、apt-rdepends(8) を
    使います。

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

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

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

    各ディストリビューションのメタデーターのファイルは例えば "http://
    deb.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://
    deb.debian.org/debian/dists/unstable/Release" のようなトップレベ
    ルの "Release" ファイルがあります。

    Origin: Debian
    Label: Debian
    Suite: unstable
    Codename: sid
    Date: Sat, 14 May 2011 08:20:50 UTC
    Valid-Until: Sat, 21 May 2011 08:20:50 UTC
    Architectures: alpha amd64 armel hppa hurd-i386 i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 sparc
    Components: main contrib non-free
    Description: Debian x.y Unstable - Not Released
    MD5Sum:
     bdc8fa4b3f5e4a715dd0d56d176fc789 18876880 Contents-alpha.gz
     9469a03c94b85e010d116aeeab9614c0 19441880 Contents-amd64.gz
     3d68e206d7faa3aded660dc0996054fe 19203165 Contents-armel.gz
    ...

    注記

    「Debian アーカイブの基本」の中で "スイーツ (suite)" や "コード名
    (codename)" を使う理由はこれを見れば分かるでしょう。"ディストリビ
    ューション" は "スイーツ" と "コード名" との両方を指したい際に用
    いられます。アーカイブが提供する全アーカイブ "エリア (area)" 名が
    "Components" の下にリストされます。

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

      * 暗号手法による署名ファイル "Release.gpg" は真正のトップレベル
        の "Release" ファイルと秘密の Debian アーカイブキーから作成さ
        れます。

      * 公開の Debian アーカイブキーは最新の debian-archive-keyring
        パッケージによってローカルに導入されます。

      * セキュアー APT システムはこの "Release.gpg" ファイルとローカ
        ルに導入された公開アーカイブキーを用いてダウンロードされたト
        ップレベルの "Release" ファイルの整合性を暗号学手法を用いて自
        動的に検証します。
   
      * "全ての Packages" と "Sources ファイルの整合性はそのトップレ
        ベルの "Release" ファイル中の MD5sum 値を用いて検証します。"
        パッケージファイルの整合性は "Packages" や "Sources" ファイル
        中の MD5sum 値を用いて検証します。debsums(1) と「インストール
        済みパッケージファイルの検証」を参照下さい。

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

    もしソースリストの記載内容が "signed-by" オプションを指定した場合
    には、指定された公開キーでダウンロードしたトップレベルの
    "Release" ファイルを指定した公開キーで検証されます。これは、ソー
    スリストが非 Debian アーカイブを含むとき非常に有用です。

    ヒント
   
    APT キーの管理に apt-key(8) コマンドを用いることは非推奨です。

    これとは別に、gpg を用いて "Release.gpg" ファイルと
    ftp-master.debian.org に掲示された公開アーカイブキーで "Release"
    ファイルの整合性を手動で検証できます。

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

    ヒント
   
    アーカイブレベルの "Release" ファイルが apt_preferences(5) のルー
    ルに使われます。

    "http://deb.debian.org/debian/dists/unstable/main/binary-amd64/
    Release" や "http://deb.debian.org/debian/dists/sid/main/
    binary-amd64/Release" 等のソースリストが指定する全てのアーカイブ
    ロケーションにはアーカイブレベルの次に示すような "Release" ファイ
    ルがあります。

    Archive: unstable
    Origin: Debian
    Label: Debian
    Component: main
    Architecture: amd64

    注意

    "Archive:" スタンザには、Debian アーカイブではスイート名
    ("stable" や "testing" や "unstable" 等) が使われますが、Ubuntu
    アーカイブではコード名 ("trusty" や "xenial" や "artful" 等) が使
    われます。

    experimental や trixie-backports のような自動的にインストールされ
    るべきでないパッケージを含むような一部アーカイブでは次に示す
    "http://deb.debian.org/debian/dists/experimental/main/
    binary-amd64/Release" のような追加の行があります。

    Archive: experimental
    Origin: Debian
    Label: Debian
    NotAutomatic: yes
    Component: main
    Architecture: amd64

    "NotAutomatic: yes" となっていない普通のアーカイブではデフォール
    トの Pin-Priority 値は 500 ですが、"NotAutomatic: yes" となってい
    る特別なアーカイブではデフォールトの Pin-Priority 値は 1 であるこ
    とを承知下さい (apt_preferences(5) と「apt-pinning で候補バージョ
    ンを調整」を参照下さい)。

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

    aptitude や apt-get や synaptic や apt-file や auto-apt 等の APT
    ツールが使われる際には Debian アーカイブ情報を含むメタデーターの
    ローカルコピーを更新する必要があります。この様なローカルのコピー
    はソースリスト中のディストリビューション (distribution) とエリア
    (area) とアーキテクチャー (architecture) の名前に対応する以下のフ
    ァイル名です (「Debian アーカイブの基本」を参照下さい)。

      * "/var/lib/apt/lists/deb.debian.org_debian_dists_ディストリビ
        ューション_Release"

      * "/var/lib/apt/lists/deb.debian.org_debian_dists_ディストリビ
        ューション_Release.gpg"

      * "/var/lib/apt/lists/deb.debian.org_debian_dists_ディストリビ
        ューション_エリア_binary-アーキテクチャー_Packages"

      * "/var/lib/apt/lists/deb.debian.org_debian_dists_ディストリビ
        ューション_エリア_source_Sources"

      * "/var/cache/apt/apt-file/deb.debian.org_debian_dists_ディスト
        リビューション_Contents-アーキテクチャー.gz" (apt-file 用)

    最初の4つのタイプのファイルは全ての適切な APT コマンド間で共有さ
    れておりコマンドラインから "apt-get update" や "aptitude update"
    によって更新されます。もしソースリスト中に "deb" が指定されていれ
    ば "Packages" メタデーターが更新されます。もしソースリスト中に
    "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/archives" に貯蔵されます。

    aptitude では、このキャッシュファイルのクリーニングポリシーは
    "Options" → "Preferences" の下で設定でき、 "Actions" の下の
    "Clean package cache" か "Clean obsolete files" メニューによって
    強制実行できる。

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

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

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

    +---------------------------------------------------------------+
    |    パッケージタイプ     |             名前の構造              |
    |-------------------------+-------------------------------------|
    |バイナリーパッケージ (所 |パッケージ名_アップストリームのバージ|
    |謂 deb)                  |ョン-debianのレビジョン_アーキテクチ |
    |                         |ャー.deb                             |
    |-------------------------+-------------------------------------|
    |Debianインストーラー用の |パッケージ名_アップストリームのバージ|
    |バイナリーパッケージ (所 |ョン-debianのレビジョン_アーキテクチ |
    |謂udeb)                  |ャー.udeb                            |
    |-------------------------+-------------------------------------|
    |ソースパッケージ (アップ |パッケージ名_アップストリームのバージ|
    |ストリームのソース)      |ョン-debianのレビジョン.orig.tar.gz  |
    |-------------------------+-------------------------------------|
    |1.0 ソースパッケージ     |パッケージ名_アップストリームのバージ|
    |(Debian の変更部分)      |ョン-debianのレビジョン.diff.gz      |
    |-------------------------+-------------------------------------|
    |3.0 (quilt) ソースパッケ |パッケージ名_アップストリームのバージ|
    |ージ (Debian の変更部分) |ョン-debianのレビジョン.debian.tar.gz|
    |-------------------------+-------------------------------------|
    |ソースパッケージ (内容記 |パッケージ名_アップストリームのバージ|
    |述)                      |ョン-debianのレビジョン.dsc          |
    +---------------------------------------------------------------+


    ヒント
   
    ここでは基本的なパッケージフォーマットのみが記述されています。詳
    細は dpkg-source(1) を参照下さい。

    表2.16 Debian パッケージ名の各部分に使用可能な文字

    +----------------------------------------------------------+
    |         名前の部分         |使用可能文字 (ERE regex)|存在|
    |----------------------------+------------------------+----|
    |パッケージ名                |[a-z0-9][-a-z0-9.+]+    |必須|
    |----------------------------+------------------------+----|
    |エポック:                   |[0-9]+:                 |任意|
    |----------------------------+------------------------+----|
    |アップストリームのバージョン|[-a-zA-Z0-9.+:]+        |必須|
    |----------------------------+------------------------+----|
    |debianのレビジョン          |[a-zA-Z0-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) を使い "package_name.preinst" を実行
   
     3. システムにパッケージ内容をインストール ("tar -x" と等価)

     4. debconf(1) を使い "package_name.postinst" を実行

    debconf システムによって I18N と L10N (8章I18N と L10N) のサポー
    トのある標準化されたユーザーとの対話が実現できます。

    表2.17 dpkg が作成する特記すべきファイル

    +---------------------------------------------------------------+
    |       ファイル        |              内容の説明               |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/info/パッ|設定ファイルのリスト。(ユーザー変更可  |
    |ケージ名.conffiles     |能)                                    |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/info/パッ|パッケージによりインストールされるファ |
    |ケージ名.list          |イルやディレクトリーのリスト           |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/info/パッ|パッケージによりインストールされるファ |
    |ケージ名.md5sums       |イルの MD5 ハッシュ値のリスト          |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/info/パッ|パッケージインストールの前に実行するパ |
    |ケージ名.preinst       |ッケージスクリプト                     |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/info/パッ|パッケージインストールの後に実行するパ |
    |ケージ名.postinst      |ッケージスクリプト                     |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/info/パッ|パッケージ削除の前に実行するパッケージ |
    |ケージ名.prerm         |スクリプト                             |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/info/パッ|パッケージ削除の前に実行するパッケージ |
    |ケージ名.prerm         |スクリプト                             |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/info/パッ|debconf システムのためのパッケージスク |
    |ケージ名.conffiles     |リプト                                 |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/         |update-alternatives コマンドが用いる代 |
    |alternatives/パッケージ|替情報                                 |
    |名                     |                                       |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/available|すべてのパッケージの入手可能性情報     |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/         |dpkg(1) が利用し、dpkg-divert(8) が設定|
    |diversions             |するする迂回情報                       |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/         |dpkg(1) が利用し、dpkg-statoverride(8) |
    |statoverride           |が設定する状態オーバーライド情報       |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/status   |全パッケージに関する状態情報           |
    |-----------------------+---------------------------------------|
    |/var/lib/dpkg/         |"var/lib/dpkg/status" ファイルの第一世 |
    |status-old             |代のバックアップ                       |
    |-----------------------+---------------------------------------|
    |/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. 壊れたシステムからの復元

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

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

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

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

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

2.6.2. パッケージデーターのキャッシングエラー

    APT を使うと、"GPG error: ... invalid: BADSIG ..." 等の首を傾げた
    くなるエラーがパッケージデーターのキャッシュエラーで引き起こされ
    ます。

    全てのキャッシュデーターを "sudo rm -rf /var/lib/apt/* " で削除し
    もう一度トライしましょう。(apt-cacher-ng が使われた場合には "sudo
    rm -rf /var/cache/apt-cacher-ng/* " も実行しましょう。)

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

    dpkg は非常に低レベルフのパッケージツールなので、ネットワーク接続
    なしでも機能します。

    foo パッケージが壊れていて修復の必要があると仮定しましょう。

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

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

    # dpkg -i /path/to/foo_old_version_arch.deb

    もしこの方法でパッケージをインストールしようとして何らかの依存関
    係違反のためにうまくいかなくてどうしようもなくなった場合には、
    dpkg の "--ignore-depends" や "--force-depends" や他のオプション
    を使って依存関係をオーバーライドすることができます。こうした場合
    には、後で適正な依存関係を修復するように真剣に取り組む必要があり
    ます。詳細は dpkg(8) を参照下さい。

    注記

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

    ヒント

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

2.6.4. 依存関係の欠落により失敗したインストール

    依存パッケージをインストールせず"sudo dpkg -i ..." でパッケージを
    強制インストールした場合、パッケージのインストールは部分インスト
    ールとなり失敗します。

    "sudo dpkg -i ..." を繰り返し使って全ての依存パッケージをインスト
    ールします。

    # apt --fix-broken install

    そして、全ての部分インストール済みパッケージを以下のコマンドで設
    定します。

    # dpkg --configure -a

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

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

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

    注意

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

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

    $ sudo dpkg -P old-package

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

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

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

      * "/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.7. パッケージセレクションの復元

    もし何らかの理由で "/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. パッケージ管理のヒント

    簡単のため、本セクション中のソースリスト例はtrixie リリース後の１
    行スタイルの "/etc/apt/sources.list" として示されています。

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

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

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

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

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

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

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

    テスト版 testing や非安定版 unstable システムを実行する場合には、
    自動アップグレードするとシステムはいつの日か確実に壊われるので、
    それはしたくないでしょう。そんなテスト版 testing や非安定版
    unstable の場合でも、次に記すような事前にパッケージをダウンロード
    するパラメーターを設定でインタラクティブなアップグレードをするた
    めの時間を節約したいでしょう。

    APT::Periodic::Update-Package-Lists "1";
    APT::Periodic::Download-Upgradeable-Packages "1";
    APT::Periodic::Unattended-Upgrade "0";

2.7.4. Updates と Backports

    stable のためのアップグレードパッケージを提供する、stable-updates
    (安定版 stable リリースが trixie の期間中の "trixie-updates") や
    backports.debian.org アーカイブがあります。

    これらのアーカイブを使うには、以下に示すように "/etc/apt/
    preferences" ファイル中に全ての必要なアーカイブをリストします。

    deb http://deb.debian.org/debian/ trixie main non-free-firmware contrib non-free
    deb http://security.debian.org/debian-security trixie-security main non-free-firmware contrib non-free
    deb http://deb.debian.org/debian/ trixie-updates main non-free-firmware contrib non-free
    deb http://deb.debian.org/debian/ trixie-backports main non-free-firmware contrib non-free

    "/etc/apt/preferences" ファイル中に Pin-Priority 値を明示的に設定
    する必要はありません。より新しいパッケージが利用可能となった場合
    はいつも、デフォルトの設定によりもっとも合理的なアップグレードが
    なされます (「アーカイブレベルの "Release" ファイル」参照下さい)
    。

      * 全てのインストールされている古いパッケージが trixie-updates
        からのより新しいパッケージにアップグレードされます。
   
      * trixie-backports からインストールしされた古いパッケージのみが
        trixie-backports からのより新しいパッケージにアップグレードさ
        れます。

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

    $ sudo apt-get install -t trixie-backports package-name

    警告

    backports.debian.org アーカイブから多すぎるパッケージをインストー
    ルしてはいけない。そんなことをするとパッケージ依存関係合併症を引
    き起こすかもしれません。代替解決策は、「矛盾した要求への対処法」
    を参照下さい。

2.7.5. 外部のパッケージアーカイブ

    警告

    外部のパッケージはあなたのシステムのルート権限を獲得することを意
    識するべきです。信頼できる外部のパッケージアーカイブのみを使うべ
    きです。代替策は「矛盾した要求への対処法」を参照下さい。

    ソースリストに Debian コンパチブルな外部パッケージアーカイブを加
    え "/etc/apt/trusted.gpg.d/" ディレクトリーそのアーカイブキーファ
    イルを置くことで、セキュアー APT でそのアーカイブが使えます。
    sources.list(5) と apt-secure(8) と apt-key(8) を参照下さい。

2.7.6. apt-pinning を使わない混合のアーカイブソースからのパッケージ

    注意

    安定版 (stable) と security updates と stable-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")のインストールは比
        較的安全です。

          + 文書パッケージ: 特段の要件無し

          + インタープリタプログラムパッケージ: 互換性あるインタープ
            リタ環境が利用可能

      * バイナリーパッケージ (非 "Architecture: all") のインストール
        は、通常多くの障害があり、安全ではありません。

          + ライブラリー ("libc" 等) のバージョン互換性

          + 関連ユーティリティープログラムのバージョン互換性

          + カーネル ABI 互換性

          + C++ の ABI 互換性

          + …

    注記

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

    注記

    短期的に壊れたパッケージを回避するため以外は、非 Debian アーカイ
    ブからバイナリーパッケージをインストールするのは大体良くないアイ
    デアです。あなたの現行の Debian システムとコンパチブルな、全ての
    利用可能な安全な技術的解決策を探索すべきです(「矛盾した要求への対
    処法」を参照下さい)。

2.7.7. apt-pinning で候補バージョンを調整

    警告

    初心者ユーザーによる apt-pinning テクニックの利用は大トラブル発生
    を間違いなく起こします。絶対必要な時以外はこのテクニックの利用を
    避けなければいけません。

    "/etc/apt/preferences" ファイル無しだと、APT システムはバージョン
    文字列を用いて、最新利用可能バージョンを候補バージョンとします。
    これが普通状態で APT システムの最も推薦される使い方です。全ての公
    式にサポートされたアーカイブの組み合わせは、自動的にアップグレー
    ドするソースとすべきでないアーカイブは NotAutomatic とマークされ
    適正な扱いを受けるので、"/etc/apt/preferences" ファイルを必要とし
    ません。

    ヒント

    バージョン文字列比較ルールは、例えば "dpkg --compare-versions
    ver1.1 gt ver1.1~1; echo $?" とすれば確認できます (dpkg(1) 参照下
    さい)。

    パッケージを混合したアーカイブからのソース (「apt-pinning を使わ
    ない混合のアーカイブソースからのパッケージ」を参照下さい) から定
    常的にインストールする場合には、apt_preferences(5) に書かれたよう
    に適正な項目のある "/etc/apt/preferences" ファイルを作り候補バー
    ジョンに関するパッケージ選択ルールを操作することによってこういっ
    た複雑な操作を自動化できます。これを apt-pinning と呼びます。

    apt-pinning を利用する際には、Debian はパッケージの互換性を保証し
    ないので、ユーザー自身がパッケージの互換性を確保しなければいけま
    せん。apt-pinning は全くの随意操作で、使用を勧めているわけではあ
    りません。

    アーカイブレベルの Release ファイル (「アーカイブレベルの
    "Release" ファイル」を参照下さい) が apt_preferences(5) のルール
    に使われます。だから、apt-pinning は normal Debian archives や
    security Debian archives ではスイート ("suite") 名を使って機能し
    ます。(これは Ubuntu アーカイブとは異なります)。例えば "/etc/apt/
    preferences" ファイル中で、"Pin: release a=unstable" とはできます
    が、"Pin: release a=sid" とはできません。

    非 Debian アーカイブを apt-pinning の一部に使う場合には、それが提
    供されている対象の確認とその信頼性の確認をします。例えば、Ubuntu
    と Debian は混合して使うようにはなっていません。

    注記

    "/etc/apt/preferences" ファイルを作成することなしでも、かなり複雑
    なシステム操作 (「dpkg コマンドを使っての救済」と「apt-pinning を
    使わない混合のアーカイブソースからのパッケージ」を参照下さい) が 
    apt-pinning を使わずにできます。

    単純化した apt-pinning テクニックの説明を次にします。

    APT システムは "/etc/apt/sources.list" ファイル中に規定された利用
    可能なパッケージソースから最高の Pin-Priority でアップグレードす
    るパッケージを候補バージョンパッケージとして選択します。パッケー
    ジの Pin-Priority が1000 より大きい場合には、このアップグレードす
    るというバージョン制約が外れるのでダウングレードできるようになり
    ます (「緊急ダウングレード」を参照下さい)。

    各パッケージの Pin-Priority 値は "/etc/apt/preferences" ファイル
    中の "Pin-Priority" 項目にて規定されるか、そのデフォールト値が使
    われます。

    表2.18 apt-pinning テクニックに関する特記すべき Pin-Priority 値を
    リストします。

    +---------------------------------------------------------------+
    |Pin-Priority|       パッケージに関する apt-pinning 効果        |
    |------------+--------------------------------------------------|
    |1001        |パッケージのダウングレードになる場合でもパッケージ|
    |            |をインストールする                                |
    |------------+--------------------------------------------------|
    |990         |ターゲットのリリースアーカイブのデフォルトとして使|
    |            |用                                                |
    |------------+--------------------------------------------------|
    |500         |ノーマルアーカイブのデフォルトとして使用          |
    |------------+--------------------------------------------------|
    |100         |NotAutomatic かつ ButAutomaticUpgrades アーカイブ |
    |            |のデフォルトとして使用                            |
    |------------+--------------------------------------------------|
    |100         |インストール済みパッケージに使用                  |
    |------------+--------------------------------------------------|
    |1           |NotAutomatic アーカイブのデフォルトとして使用     |
    |------------+--------------------------------------------------|
    |-1          |たとえ推奨 (Recommend) されても、パッケージを絶対 |
    |            |にインストールしない                              |
    +---------------------------------------------------------------+


    ターゲットのリリースアーカイブは"apt-get install -t testing
    some-package" のようにコマンドラインオプションによって設定できま
    す。

    アーカイブ中のアーカイブレベルの Release ファイル (「アーカイブレ
    ベルの "Release" ファイル」を参照下さい) に "NotAutomatic: yes"
    と "ButAutomaticUpgrades: yes" が含まれると NotAutomatic かつ 
    ButAutomaticUpgrades アーカイブが設定されます。アーカイブ中のアー
    カイブレベルの Release ファイルに "NotAutomatic: yes" だけが含ま
    れると NotAutomatic アーカイブが設定されます。

    複数アーカイブソースの package に関する apt-pinning 状況は
    "apt-cache policy package" の出力で表示されます。

      * "Package pin:" で始まる行は、package のみとの関連付けが
        "Package pin: 0.190" 等と定義されている場合に、pin のパッケー
        ジバージョンを示します。

      * package とのみの関連付けが定義されていない場合には、"Package
        pin:" という行はありません。

      * package とのみの関連付けが定義されている場合の Pin-Priority
        値は、全バージョン文字列の右側に "0.181 700" 等としてリストさ
        れます。

      * package とのみの関連付けが定義されていない場合には、全バージ
        ョン文字列の右側に "0" が"0.181 0" 等としてリストされます。

      * アーカイブの Pin-Priority 値 ("/etc/apt/preferences" ファイル
        中に "Package: *" として定義) はアーカイブへのパスの左側に、
        "100 http://deb.debian.org/debian/ trixie-backports/main
        Packages" 等としてリストされます。

2.7.8. "推奨 (Recommends)" によりパッケージがインストールされるのを阻
止

    警告

    初心者ユーザーによる apt-pinning テクニックの利用は大トラブル発生
    を間違いなく起こします。絶対必要な時以外はこのテクニックの利用を
    避けなければいけません。

    たとえ "推奨 (Recommends)" されていても自動的に特定のパッケージが
    引きこまれ無くしたいときには、"/etc/apt/preferences" ファイルを作
    成しその中に全てのパッケージを以下のように明示的にリストしなけれ
    ばいけません。

    Package: package-1
    Pin: version *
    Pin-Priority: -1
   
    Package: package-2
    Pin: version *
    Pin-Priority: -1

2.7.9. unstable からのパッケージと共に、testing を追いかける

    警告

    初心者ユーザーによる apt-pinning テクニックの利用は大トラブル発生
    を間違いなく起こします。絶対必要な時以外はこのテクニックの利用を
    避けなければいけません。

    testing を追跡しながら、unstable にある特定の新規アップストリーム
    バージョンのパッケージが定常的にアップグレードされる、apt-pinning
    テクニックの例を次に示します。全ての必要なアーカイブを "/etc/apt/
    sources.list" ファイル中に以下のようにリストします。

    deb http://deb.debian.org/debian/ testing main contrib non-free
    deb http://deb.debian.org/debian/ unstable main contrib non-free
    deb http://security.debian.org/debian-security testing-security main contrib

    "/etc/apt/preferences" を以下のように設定します。

    Package: *
    Pin: release a=unstable
    Pin-Priority: 100

    "package-name" という名前のパッケージとその依存ファイルを
    unstable アーカイブからこの設定の下でインストールしたい場合、"-t"
    オプションを使ってターゲットのリリースを切り替える (unstable の
    Pin-Priority が990 になる) 以下のコマンドを実行します。

    $ sudo apt-get install -t unstable package-name

    この設定では、通常の "apt-get upgrade" や "apt-get dist-upgrade"
    ("aptitude safe-upgrade" や "aptitude full-upgrade") の実行は、
    testing アーカイブからインストールされたパッケージは最新の
    testing アーカイブを使ってアップグレードし、unstable アーカイブか
    らインストールされたパッケージは最新の unstable アーカイブを使っ
    てアップグレードします。

    注意

    "/etc/apt/sources.list" ファイルから "testing" の項目を削除しない
    ように注意します。"testing" 項目がその中にないと、APT システムは
    最新の unstable アーカイブを使ってアップグレードします。

    ヒント

    著者は上記操作のすぐ後に "/etc/apt/sources.list" ファイルを通常編
    集して "unstable" アーカイブ項目をコメントアウトします。こうする
    ことで、最新の unstable アーカイブによって unstable からインスト
    ールされたパッケージをアップグレードしなくなりますが、"/etc/apt/
    sources.list" ファイル中に項目が多すぎて更新のプロセスが遅くなる
    ことを避けられます。

    ヒント

    もし "/etc/apt/preferences" ファイル中で "Pin-Priority: 100" の代
    わりに "Pin-Priority: 1" が用いられた場合は、"/etc/apt/
    sources.list" ファイルの中の "testing" 項目が削除されようと、
    Pin-Priority 値は100 のインストール済みパッケージは unstable アー
    カイブによってアップグレードされる事はありません。

    最初の "-t unstable" によるインストール無しに、unstable の特定パ
    ッケージを自動的に追跡したい場合、"/etc/apt/preferences" ファイル
    を作りそのトップにこれらパッケージを明示的に以下のようにリストし
    ます。

    Package: package-1
    Pin: release a=unstable
    Pin-Priority: 700
   
    Package: package-2
    Pin: release a=unstable
    Pin-Priority: 700

    以上で、各特定パッケージに関して Pin-Priority 値が設定されます。
    例えば最新の unstable バージョンのこの "Debian リファレンス" を英
    語版で追跡するためには、"/etc/apt/preferences" ファイルに以下の項
    目を設定します。

    Package: debian-reference-en
    Pin: release a=unstable
    Pin-Priority: 700
   
    Package: debian-reference-common
    Pin: release a=unstable
    Pin-Priority: 700

    ヒント

    この apt-pinning テクニックは stable アーカイブを追跡している際に
    も有効です。著者の経験では、文書パッケージは unstable アーカイブ
    からインストールしても今までいつも安全でした。

2.7.10. experimental からのパッケージと共に、unstable を追いかける

    警告

    初心者ユーザーによる apt-pinning テクニックの利用は大トラブル発生
    を間違いなく起こします。絶対必要な時以外はこのテクニックの利用を
    避けなければいけません。

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

    deb http://deb.debian.org/debian/ unstable main contrib non-free
    deb http://deb.debian.org/debian/ experimental main contrib non-free
    deb http://security.debian.org/ testing-security main contrib

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

2.7.11. 緊急ダウングレード

    警告

    初心者ユーザーによる apt-pinning テクニックの利用は大トラブル発生
    を間違いなく起こします。絶対必要な時以外はこのテクニックの利用を
    避けなければいけません。

    注意

    Debian では設計としてはダウングレードを正式にサポートしません。緊
    急の復元処置の一部としてのみ実行されるべきです。こういう状況であ
    るにもかかわらず、多くの場合にうまく機能することが知られています
    。重要なシステムでは復元操作の後に全ての重要データーをバックアッ
    プし、最初から新規システムを再インストールします。

    壊れたシステムアップグレードからの復元するために、候補バージョン
    を操作して新しいアーカイブから古いアーカイブにダウングレードする
    ことがうまくいくかもしれません (「apt-pinning で候補バージョンを
    調整」を参照下さい)。これは、何度も "dpkg -i broken-package_
    old-version.deb" コマンドを実行する退屈な作業をしないでよくする方
    法です (「dpkg コマンドを使っての救済」を参照下さい)。

    次に記すような "unstable" を追跡する "/etc/apt/sources.list" ファ
    イル中の行を探します。

    deb http://deb.debian.org/debian/ sid main contrib non-free

    それを testing を追いかけるように次と交換します。

    deb http://deb.debian.org/debian/ forky 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.12. equivs パッケージ

    ソースからプログラムをコンパイルして Debian パッケージを置換えた
    い際には、それを実際にローカルで Debian 化してパッケージ (*.deb)
    して、私的アーカイブを使うのが好ましいです。

    しかし、プログラムをソースからコンパイルして "/usr/local" にイン
    ストールすることを選んだ際には、パッケージ依存関係を満足させるた
    めの最後の手段として equivs を使う必要があるかもしれません。

    Package: equivs
    Priority: optional
    Section: admin
    Description: Circumventing Debian package dependencies
     This package provides a tool to create trivial Debian packages.
     Typically these packages contain only dependency information, but they
     can also include normal installed files like other packages do.
     .
     One use for this is to create a metapackage: a package whose sole
     purpose is to declare dependencies and conflicts on other packages so
     that these will be automatically installed, upgraded, or removed.
     .
     Another use is to circumvent dependency checking: by letting dpkg
     think a particular package name and version is installed when it
     isn't, you can work around bugs in other packages' dependencies.
     (Please do still file such bugs, though.)

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

    注意
   
    ここに書かれた手順がシステムの違いのために追加の手動の努力無しに
    うまく行く保証はありません。

    stable システムの部分アップグレードのためには、その環境内でソース
    パッケージを使ってパッケージをリビルドするのが好ましいです。こう
    することでパッケージ依存関係による大掛かりなアップグレードをしな
    いで済みます。

    stable システムのための "/etc/apt/sources.list" ファイルに以下の
    エントリーを追加します。

    deb-src http://deb.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*

    バックポートに必要な際には、dpkg や debhelper 等のツールチェイン
    パッケージをバックポートパッケージを用いて更新します。

    次を実行します。

    $ dch -i

    "+bp1" を後ろに付けるなどして、"debian/changelog" 中でパッケージ
    バージョンを先に進める

    以下のようにしてパッケージをビルドしシステムにインストールします
    。

    $ debuild
    $ cd ..
    # debi foo*.changes

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

    Debian アーカイブの特定サブセクション全てをミラーするとディスク空
    間とネットワークのバンド幅の大いなる無駄遣いですので、LAN 上に多
    くのシステムを管理している際には APT のためのローカルのプロキシサ
    ーバーを設置することを考えるのは良いことです。APT は、apt.conf(5)
    とか "/usr/share/doc/apt/examples/configure-index.gz" に説明され
    たようにして、汎用の squid のようなウェッブ (http) プロキシサーバ
    ー (「他のネットワークアプリケーションサーバー」を参照下さい) を
    使うように設定できます。"$http_proxy" 環境変数による設定は、"/etc
    /apt/apt.conf" ファイル中の設定より優先します。

    Debian アーカイブ専用のプロキシツールがあります。実際に使う前に
    BTS をチェック下さい。

    表2.19 Debian アーカイブ専用のプロキシツールのリスト

    +---------------------------------------------------------------+
    | パッケージ  |ポプコ |サイ|                説明                |
    |             |  ン   | ズ |                                    |
    |-------------+-------+----+------------------------------------|
    |apt-cacher   |V:0.31,|267 |Debian パッケージとソースファイルの |
    |             |I:0.37 |    |キャッシュプロキシ (Perl プログラム)|
    |-------------+-------+----+------------------------------------|
    |             |V:4.0, |    |ソフトウェアーパッケージの頒布ための|
    |apt-cacher-ng|I:4.1  |1968|キャッシュプロキシ (コンパイルされた|
    |             |       |    |C++ プログラム)                     |
    +---------------------------------------------------------------+


    注意

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

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

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

      * パッケージ管理の一義的文書:

          + aptitude(8) と dpkg(1) と tasksel(8) と apt(8) と apt-get
            (8) と apt-config(8) と apt-secure(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 6 - The Debian FTP
            archives".

      * Debian ユーザー向けの Debian パッケージ作成の入門書:

          + "Debian Maintainer 向け案内書".

第3章システムの初期化

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

    Debian システム初期化の大まかな概要をここに記します。Debian シス
    テムは動くターゲットなので、最新のドキュメンテーションを参照する
    必要があります。

      * Debian Linux Kernel Handbook は Debian カーネルに関する一次情
        報源です。

      * systemd に準拠するシステムのブートアッププロセスは bootup(7)
        に詳述されている。 (最新の Debian)

      * UNIX System V Release 4 に準拠するシステムのブートアッププロ
        セスは boot(7) に詳述されている。 (過去の Debian)

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

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

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

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

      * 「1段目: UEFI」

      * 「2段目: ブートローダー」
   
      * 「3段目: ミニ Debian システム」

      * 「4段目: 普通の Debian システム」

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

3.1.1. 1段目: UEFI

    Unified Extensible Firmware Interface (UEFI) は、UEFI 仕様書の一
    部としてブートマネージャーを定義します。ブートマナージャーは、コ
    ンピューター電源投入時にブート設定をチェックしその設定に基づき指
    定された OS ブートローダーかオペレーティングシステムのカーネル(通
    常ブートローダー)を実行するブートプロセスの第一段階です。ブート設
    定は、OS ローダーや OS カーネルまでのファイルシステムパスを示す変
    数を含めて、NVRAM に保存された変数に定義されています。

    EFI システムパーティション (ESP) は UEFI 仕様書に準拠するコンピュ
    ーターで使われるデーターストレージデバイスのパーティションです。
    それはコンピューター電源投入時に UEFI ファームウエアーによってア
    クセスされ、UEFI アプリケーションやそれらのアプリケーションが実行
    する必要のある OS ブートローダーを含めたファイルが保存されていま
    す。(旧式の PC システム上では MBR 中に保存された BIOS がこれに代
    え使われているかもしれません)

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

    ブートローダーは UEFI によって起動されるブートプロセスの2段目です
    。それはシステムのカーネルイメージと initrd イメージをメモリーに
    ロードし、それらにコントロールを引き継ぎます。この initrd イメー
    ジはルートファイルシステムイメージで、そのサポートは使われるブー
    トローダーによります。

    Debian システムは普通 Linux カーネルをデフォルトのシステムカーネ
    ルとして使います。現行の 5.x Linux カーネルのための initrd イメー
    ジは技術的には initramfs (initial RAM filesystem) イメージです。

    多くのブートローダと設定オプションが利用可能です。

    表3.1 ブートローダーのリスト

    +---------------------------------------------------------------+
    |  パッケージ   |ポプコ |サイ|initrd|ブートロ|       説明       |
    |               |  ン   | ズ |      | ーダー |                  |
    |---------------+-------+----+------+--------+------------------|
    |               |       |    |      |        |ディスクパーティシ|
    |               |       |    |      |        |ョンや vfat や    |
    |grub-efi-amd64 |I:451  |142 |サポー|GRUB    |ext4 等のファイル |
    |               |       |    |ト    |UEFI    |システムを理解する|
    |               |       |    |      |        |ぐらいスマートです|
    |               |       |    |      |        |。(UEFI)          |
    |---------------+-------+----+------+--------+------------------|
    |               |       |    |      |        |ディスクパーティシ|
    |               |       |    |      |        |ョンや vfat や    |
    |grub-pc        |V:17,  |479 |サポー|GRUB 2  |ext4 等のファイル |
    |               |I:525  |    |ト    |        |システムを理解する|
    |               |       |    |      |        |ぐらいスマートです|
    |               |       |    |      |        |。(BIOS)          |
    |---------------+-------+----+------+--------+------------------|
    |               |       |    |      |        |GRUB 2 のブート可 |
    |               |V:0.06,|    |サポー|        |能なレスキューイメ|
    |grub-rescue-pc |I:0.59 |7273|ト    |GRUB 2  |ージ (CD とフロッ |
    |               |       |    |      |        |ピー) (PC/BIOS バ |
    |               |       |    |      |        |ージョン)         |
    |---------------+-------+----+------+--------+------------------|
    |               |       |    |      |        |grml-rescueboot は|
    |               |V:0.1, |    |      |GRUB 2  |、live Linux ISO  |
    |grml-rescueboot|I:1.1  |36  |N/A   |プラグイ|image を grub2 の |
    |               |       |    |      |ン      |ブートメニューに追|
    |               |       |    |      |        |加します。        |
    |---------------+-------+----+------+--------+------------------|
    |               |       |    |      |        |ISO9660 ファイルシ|
    |syslinux       |V:3,   |325 |サポー|Isolinux|ステムを理解します|
    |               |I:32   |    |ト    |        |。ブート CD に使わ|
    |               |       |    |      |        |れています。      |
    |---------------+-------+----+------+--------+------------------|
    |               |       |    |      |        |MSDOS ファイルシス|
    |syslinux       |V:3,   |325 |サポー|Syslinux|テム (FAT) 理解し |
    |               |I:32   |    |ト    |        |ます。ブートフロッ|
    |               |       |    |      |        |ピーで使われます。|
    |---------------+-------+----+------+--------+------------------|
    |               |       |    |      |        |新しいシステムが  |
    |loadlin        |V:0.03,|87  |サポー|Loadlin |FreeDOS/MSDOS シス|
    |               |I:0.40 |    |ト    |        |テムから起動されま|
    |               |       |    |      |        |す。              |
    |---------------+-------+----+------+--------+------------------|
    |               |       |    |      |        |MSDOS の MBR を代 |
    |               |       |    |      |Neil    |替するフリーソフト|
    |mbr            |V:0.3, |47  |非サポ|Turton  |ウェアーです。ディ|
    |               |I:2.9  |    |ート  |の MBR  |スクパーティション|
    |               |       |    |      |        |を理解するだけです|
    |               |       |    |      |        |。                |
    +---------------------------------------------------------------+


    UEFI システムの場合、GRUB2 は ESP パーティションを最初に読み、"/
    boot/efi/EFI/debian/grub.cfg" 中の search.fs_uuid に指定された
    UUID を使って GRUB2 メニュー設定ファイル "/boot/grub/grub.cfg" が
    あるパーティションを決めます。

    GRUB2 メニュー設定ファイルの重要部分は以下です:

    menuentry 'Debian GNU/Linux' ... {
            load_video
            insmod gzio
            insmod part_gpt
            insmod ext2
            search --no-floppy --fs-uuid --set=root fe3e1db5-6454-46d6-a14c-071208ebe4b1
            echo    'Loading Linux 5.10.0-6-amd64 ...'
            linux   /boot/vmlinuz-5.10.0-6-amd64 root=UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 ro quiet
            echo    'Loading initial ramdisk ...'
            initrd  /boot/initrd.img-5.10.0-6-amd64
    }

    /boot/grub/grub.cfg のこの部分に関して、このメニューエントリーは
    以下の意味があります。

    表3.2 /boot/grub/grub.cfg の上記部分のメニューエントリーの意味

    +---------------------------------------------------------------+
    |          設定           |               変数値                |
    |-------------------------+-------------------------------------|
    |導入済みの GRUB2 モジュー|gzio, part_gpt, ext2                 |
    |ル                       |                                     |
    |-------------------------+-------------------------------------|
    |使用されるルートファイル |UUID=                                |
    |システムのパーティション |fe3e1db5-6454-46d6-a14c-071208ebe4b1 |
    |                         |により識別されるパーティション       |
    |-------------------------+-------------------------------------|
    |ルートファイルシステム中 |/boot/vmlinuz-5.10.0-6-amd64         |
    |のカーネルイメージのパス |                                     |
    |-------------------------+-------------------------------------|
    |使用されるカーネルブート |"root=UUID=                          |
    |変数                     |fe3e1db5-6454-46d6-a14c-071208ebe4b1 |
    |                         |ro quiet"                            |
    |-------------------------+-------------------------------------|
    |ルートファイルシステム中 |/boot/initrd.img-5.10.0-6-amd64      |
    |の initrd イメージパス   |                                     |
    +---------------------------------------------------------------+


    Debian システム上では、"/boot/grub/grub.cfg" はインストールされた
    GRUB パッケージ (例えば、grub-efi-amd64) で管理されていて、ユーザ
    ーによる直接の改変は非推奨です。その代わり、 "/etc/grub.d/" 中の
    設定ファイルや "/etc/default/grub" をカスタマイズしましょう。そし
    て、GRUB 設定ファイルを設定し、NVRAM 変数を自動的に Debian をブー
    トするように以下のようにします:

    # dpkg-reconfigure grub-efi-amd64

    ヒント
   
    カーネルブートログを見えるようにするには、"/etc/default/grub" 中
    の "GRUB_CMDLINE_LINUX_DEFAULT" の値からquiet を除去して下さい。

    ヒント

    You can add GRUB splash background by placing its image file in画
    像ファイルを "/boot/grub/" 中に置くことで、GRUB に画面背景を追加
    できます。

    "info grub", grub-install(8), grub-mkconfig(8) を参照下さい。

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

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

    注記

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

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

      * initramfs-tools で initramfs が作成された場合には "/init" プ
        ログラムはシェルプログラムです。

          + "break=init" 等をカーネルブートパラメーターとして与えると
            、本部分のブートプロセスに割り込み root シェルを獲得でき
            ます。この他の割り込み条件は "/init" スクリプトを参照下さ
            い。このシェル環境はあなたの機器のハードウエアーを詳細に
            検査できるだけ十分洗練されています。
   
          + このミニ Debian システムで利用可能なコマンドは機能を削っ
            たコマンドで、主に busybox(1) という GNU ツールで提供され
            ます。

      * dracut で initramfs が作成された場合には "/init" プログラムは
        バイナリーの systemd プログラムです。

          + このミニ Debian システムで利用可能なコマンドは機能を削っ
            た systemd(1) 環境です。

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

3.1.4. 4段目: 普通の Debian システム

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

    多くのプログラムを起動する主ブートプロセスを行う init プログラム
    は、PID=1 で最初のプログラムとして実行されます。init プログラムの
    デフォールトのファイルパスは "/usr/sbin/init" ですが、"init=/path
    /to/init_program" のようなカーネルブートパラメーターにより変更で
    きます。

    Debian 8 jessie (2015年リリース) 以降では "/usr/sbin/init" は "/
    lib/systemd/systemd" にシムリンクされています。

    ヒント
   
    あなたのシステム上の実際の init コマンドは "ps --pid 1 -f" コマン
    ドで確認できます。

    表3.3 Debian システムのブートユーティリティーのリスト

    +---------------------------------------------------------------+
    |    パッケージ     |ポプコ |サイ |            説明             |
    |                   |  ン   | ズ  |                             |
    |-------------------+-------+-----+-----------------------------|
    |                   |V:919, |     |並行処理のためのイベント依存 |
    |systemd            |I:979  |11764|の init(8) デーモン (sysvinit|
    |                   |       |     |代替)                        |
    |-------------------+-------+-----+-----------------------------|
    |                   |V:4.3, |     |インフラストラクチャークラウ |
    |cloud-init         |I:6.8  |3240 |ドインスタンス用の初期化シス |
    |                   |       |     |テム                         |
    |-------------------+-------+-----+-----------------------------|
    |                   |V:909, |     |systemd で sysvinit を置換す |
    |systemd-sysv       |I:980  |68   |るのに必要な、マニュアルペー |
    |                   |       |     |ジとリンク                   |
    |-------------------+-------+-----+-----------------------------|
    |init-system-helpers|V:594, |133  |sysvinit と systemd 間を切り |
    |                   |I:987  |     |替える補助ツール             |
    |-------------------+-------+-----+-----------------------------|
    |initscripts        |V:17,  |197  |システムの始動と停止のための |
    |                   |I:62   |     |スクリプト                   |
    |-------------------+-------+-----+-----------------------------|
    |sysvinit-core      |V:3.4, |365  |System-V 的な init(8) ユーテ |
    |                   |I:3.9  |     |ィリティー                   |
    |-------------------+-------+-----+-----------------------------|
    |sysv-rc            |V:33,  |85   |System-V 的なランレベル変更メ|
    |                   |I:66   |     |カニズム                     |
    |-------------------+-------+-----+-----------------------------|
    |sysvinit-utils     |V:726, |100  |System-V 的なユーティリティー|
    |                   |I:1000 |     |(startpar(8)、bootlogd(8)、…)|
    |-------------------+-------+-----+-----------------------------|
    |lsb-base           |V:227, |12   |Linux Standard Base 3.2 の   |
    |                   |I:332  |     |init スクリプト機能          |
    |-------------------+-------+-----+-----------------------------|
    |                   |V:40,  |     |LSB init.d スクリプト依存関係|
    |insserv            |I:65   |132  |を使いブート順序を整理するツ |
    |                   |       |     |ール                         |
    |-------------------+-------+-----+-----------------------------|
    |kexec-tools        |V:1.4, |320  |kexec(8) リブートのための    |
    |                   |I:5.3  |     |kexec ツール (ワームリブート)|
    |-------------------+-------+-----+-----------------------------|
    |systemd-bootchart  |V:0.16,|131  |ブートプロセスのパーフォンマ |
    |                   |I:0.55 |     |ンスアナライザー             |
    |-------------------+-------+-----+-----------------------------|
    |mingetty           |V:0.1, |36   |コンソール専用 getty(8)      |
    |                   |I:2.6  |     |                             |
    |-------------------+-------+-----+-----------------------------|
    |mgetty             |V:0.13,|318  |インテリジェントモデム用の代 |
    |                   |I:0.48 |     |替 getty(8)                  |
    +---------------------------------------------------------------+


    ヒント
   
    ブートプロセスを高速化する最新のティップは Debian wiki:
    BootProcessSpeedup を参照下さい。

3.2. レスキューシステム

    警告
   
    ブートストラッププロセス周辺のシステム管理作業をレスキューシステ
    ムを確保せず行ってはいけません。

    レスキューシステムが使えることで、困難な作業に取り組めるようにな
    ります。

      * 壊れたブートローダーのインストールからのブート

      * 壊れたブートローダーのインストールの修復
   
      * 壊れてブートできないシステムからのデーター抽出

      * root ファイルシステムが絡む、ファイルシステムやディスクパーテ
        ィションやLVM ボリュームの編集

    一般的にはレスキューシステムは ISO イメージファイルで提供され、次
    のような脱着可能なストレージ媒体に書き込まれます:

      * 「ディスクに直接書込み」のようにして準備される USB フラッシュ
        ドライブ

      * 「CD/DVD-R/RW に直接書込み」のようにして準備される CD / DVD

    簡潔さのため、USB フラッシュドライブの場合が以下で例示し言及され
    ているが、CD や DVD も同様に使えます。

    ヒント

    脱着可能なストレージ媒体上の不特定のブートローダーをブートするに
    は、何らかの UEFI NVRAM 変数を変更しなければいけないかもしれませ
    ん。

3.2.1. USB 上の GRUB UEFI レスキューシステム

    「USB 上の GRUB UEFI レスキューシステム」を挿入しシステムの電源投
    入で、GRUB UEFI レスキューシステムが起動できます。

    事前に Super Grub2 Disk ISO イメージを USB フラッシュドライブに書
    き込むことで、「USB 上の GRUB UEFI レスキューシステム」を準備でき
    ます。

    他のオペーレーティングシステムの導入などでブートローダー設定が破
    壊された場合等は、以下のようにして修復します。

      * GRUB UEFI レスキューシステムを起動し、自動的にブート可能なイ
        ンストール済みシステムを発見します。

      * インストール済み Debian システムを GRUB メニューから起動しま
        す。

      * Linux の root シェルプロンプトで:

        # dpkg-reconfigure grub-efi-amd64

    注記

    "info grub-mkrescue" に従うことでも、ブート可能な GRUB レスキュー
    ISO イメージが作成できます。これは、 CLI の GRUB シェルプロンプト
    を提供しますが、ブート可能なシステムの自動発見は提供しません。

3.2.2. USB 上の Linux live レスキューシステム

    Linux live レスキューシステムは「USB 上の Linux live レスキューシ
    ステム」を挿入してシステム電源を投入することで起動できます。

    「USB 上の Linux live レスキューシステム」は、 USB フラッシュドラ
    イブにDebian準拠の Linux live ISO イメージの1つを事前に書き込むこ
    とで準備できます。そのような Linux live イメージの例は以下です。

      * Debian Live イメージ

      * Kali Linux Live

      * Grml Live Linux

    この Linux live レスキューシステムの使用例です:

      * 他のオペーレーティングシステムの導入などで破壊されたブートローダ
        ー設定は以下のようにして修復します。

          + Linux live レスキューシステムをスタートします。

          + ブートできないインストールされたシステムの root ファイルシス
            テムを含むパーティションを "/mnt" にマウントします。

          + Linux の root シェルプロンプトで:

            # chroot /mnt; dpkg-reconfigure grub-efi-amd64

      * 壊れた dpkg パッケージの修復:

          + Linux live レスキューシステムをスタートします。

          + 壊れた dpkg パッケージを含むインストールされた Debian システ
            ムの root ファイルシステムを含むパーティションを "/mnt" にマ
            ウントします。

          + Linux の root シェルプロンプトで:

            # dpkg --root /mnt -i /mnt/var/cache/apt/archives/dpkg_old_version_amd64.deb

      * インストール済みシステムへのファイルシステム操作(「データー保存の
        ティップ」参照) のような通常禁止されている変更の実行。

    警告
   
    無活動状態が続くと、Linux live システムの GUI スクリーンがロック
    されてしまうかもしれません。

    ヒント

      * Linux live システムをスタートしてすぐあなたのパスワードを設定
        しましょう。

      * Linux 仮想コンソール (「仮想コンソール」参照) 上のユーザーの
        シェルプロンプトから、例えば"sudo passwd user" としてあなたの
        パスワードを設定してもいいです。

      * 一部のLinux live システムはデフォルトの "user/password" を設
        定します: "Debian Live": "user/live", "Kali Linux Live":
        "kali/kali"

3.2.3. GRUBからの Linux live レスキューシステム

    Linux live レスキューシステムは、GRUB メニュー項目から起動できま
    す。この GRUB 設定は以下のようにすると準備できます:

      * grml-rescueboot パッケージをインストールします。

      * Linux live ISO イメージ中に "/boot/grub/loopback.cfg" がある
        イメージを探します。

          + 「USB 上の Linux live レスキューシステム」中で触れた ISO
            イメージは "/boot/grub/loopback.cfg" そのイメージ中に保持
            しています。

      * "/boot/grml/" ディレクトリー中にこれらのLinux live ISO イメー
        ジの一部をコピーします。

      * 以下のようにGRUB メニューを更新します。

        # dpkg-reconfigure grub-efi-amd64

    電源を投入すると、GRUB メニューは Linux live レスキューシステムの
    候補を含むメニューを示します。

3.3. Systemd

3.3.1. Systemd init

    Debian システムが起動する時、/usr/lib/systemd にシムリンクされた
    /usr/sbin/init が、root (UID=0) が所有する init システムプロセス
    (PID=1) で起動されます。systemd(1) を参照下さい。

    systemd の init プロセスは、SysV 的な手続き定義スタイルではなく宣
    言定義スタイルで書かれた unit 設定ファイルに従い並列で複数プロセ
    スを起動します。(systemd-system.conf(5) 参照):

    生成されたプロセスは、それらが所属するプライベート systemd ヒエラ
    ルキー中の所属する unit にちなんで名付けられた個別の Linux コント
    ロールグループ中に置かれます(cgroups と「Linux のセキュリティ機能
    」を参照下さい。)

    systemd.unit(5) 中に記載された "System Unit Search Path (システム
    ユニット探索パス)" からシステムモード用の unit がロードされます。
    主要なパスは優先順位順に以下です:

      * "/etc/systemd/system/*": 管理者が作成したシステム unit

      * "/run/systemd/system/*": 実行時の unit

      * "/lib/systemd/system/*": ディストリビューションパッケージマネ
        ージャーがインストールしたシステム unit

    相互依存関係は "Wants="、"Requires="、"Before="、"After="、 …
    ("MAPPING OF UNIT PROPERTIES TO THEIR INVERSES" in systemd.unit
    (5) 参照) 等の指示定義によって規定される。リソースのコントロール
    は (systemd.resource-control(5) 参照)によっても定義されます。

    unit 設定ファイルのサッフィックスにそのタイプを以下のように折込み
    ます:

      * *.service は systemd がコントロールしたりスーパーバイズするプ
        ロセスを記述します。systemd.service(5) 参照下さい。

      * *.device は sysfs(5) 中に udev(7) デバイスツリーとして暴露さ
        れるデバイスを記述します。See systemd.device(5) を参照下さい
        。

      * *.mount は systemd がコントロールしたりスーパーバイズするファ
        イルシステムのマウントポイントを記述します。systemd.mount(5)
        を参照下さい。

      * *.automount は systemd がコントロールしたりスーパーバイズする
        ファイルシステムの自動マウントポイントを記述します。
        systemd.automount(5) を参照下さい。

      * *.swap は systemd がコントロールやスーパーバイズするスワップ
        デバイスやファイルを記述します。systemd.swap(5) を参照下さい
        。

      * *.path は systemd がパス基準でアクティベーションするために監
        視するパスを記述します。systemd.path(5) を参照下さい。

      * *.socket は systemd がソケット基準でアクティベーションするた
        めにコントロールしたりスーパーバイズするソケットを記述します
        。systemd.socket(5) を参照下さい。

      * *.timer は systemd がタイマー基準でアクティベーションするため
        にコントロールしたりスーパーバイズするタイマーを記述します。
        systemd.timer(5) を参照下さい。

      * *.slice は cgroups(7) でリソースを管理します。systemd.slice
        (5) を参照下さい。

      * *.scope はシステムプロセスの集合を systemd のバスインターフェ
        ースを用いて管理するためにプログラムで作られます。
        systemd.scope(5) を参照下さい。

      * *.target は他の unit設定ファイルを組み合わせて始動時同期点を
        作ります。systemd.target(5) を参照下さい。

    システムの始動 (init) されると systemd プロセスは (普通
    "graphical.target" にシムリンクされている) "/lib/systemd/system/
    default.target を起動しようとします。. 最初に、"local-fs.target"
    や "swap.target" や "cryptsetup.target" 等のいくつかの特殊ターゲ
    ット unit (systemd.special(7) 参照) が引き込まれファイルシステム
    をマウントします。そして、他のターゲット unit が、ターゲット unit
    の依存関係で引き込まれます。詳細に関しては bootup(7) を読んで下さ
    い。

    systemd はバックワードコンパティビリティー機能を提供します。"/etc
    /init.d/rc[0123456S].d/[KS]name" 中の、SysV-スタイルのブートスク
    リプトは依然として読み込まれ処理されますし、telinit(8) は systemd
    の unit のアクティベーション要求に変換されます。

    注意
   
    擬似実装された runlevel の 2 から 4 は、すべて同じ
    "multi-user.target" にシムリンクされます。

3.3.2. Systemd login

    gdm3(8)、sshd(8)、等々経由で Debian システムにユーザーがログイン
    する際に、当該ユーザーが所有するユーザーサービスマネージャープロ
    セスとして /lib/systemd/system --user が起動されます。systemd(1)
    を参照下さい。

    systemd のユーザーサービスマネージャーは、宣言定義スタイルで書か
    れた unit 設定ファイルに従い並列で複数プロセスを起動します。
    (systemd.unit(5) や user@.service(5) 参照):

    systemd.unit(5) 中に記載された "User Unit Search Path (ユーザーユ
    ニット探索パス)" からユーザーモード用の unit がロードされます。主
    要なパスは優先順位順に以下です:

      * "~/.config/systemd/user/*": ユーザー設定 unit

      * "/etc/systemd/user/*": 管理者が作成したユーザー units
   
      * "/run/systemd/user/*": 実行時 unit

      * "/lib/systemd/user/*": ディストリビューションパッケージマネー
        ジャーがインストールしたユーザー unit

    これらは、「Systemd init」と同様の手法で管理されます。

3.4. カーネルメッセージ

    コンソールに表示されるカーネルのエラーメッセージは、その閾値て設
    定できる。

    # 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. システムメッセージ

    systemd の下では、カーネルとシステムの両方のメッセージがジャーナ
    ルサービス systemd-journald.service (所謂 journald) で、"/var/log
    /journal" の下の恒久的なバイナリーデーターか "/run/log/journal/"
    下の非恒久的なバイナリーデーターとして記録されます。このようなバ
    イナリー記録データーには journalctl(1) コマンドを用いてアクセスで
    きます。例えば以下のようにして最後のブートからのログを表示できま
    す:

    $ journalctl -b

    表3.5 典型的な journalctl コマンド断片の例

    +---------------------------------------------------------------+
    |                    操作                    |   コマンド断片   |
    |--------------------------------------------+------------------|
    |最後のブートからのシステムサービスとカーネル|"journalctl -b    |
    |のログを閲覧                                |--system"         |
    |--------------------------------------------+------------------|
    |最後のブートからの現行ユーザーのサービスのロ|"journalctl -b    |
    |グを閲覧                                    |--user"           |
    |--------------------------------------------+------------------|
    |最後のブートからの"$unit" のジョブのログを閲|"journalctl -b -u |
    |覧                                          |$unit"            |
    |--------------------------------------------+------------------|
    |最後のブートからの"$unit" のジョブのログを見|"journalctl -b -u |
    |る ("tail -f" スタイル)                     |$unit -f"         |
    +---------------------------------------------------------------+


    systemd のもとでは、システムログユーティリティー rsyslogd(8) はア
    ンインストールしても大丈夫です。もしそれがインストールされている
    場合には、それは(systemd以前のデフォルトの "/dev/log" に代え)揮発
    性のバイナリーログデーターを読むように挙動を変え、伝統的で恒久的
    な ASCII システムログデーターを作成します。これは、"/etc/default/
    rsyslog" や "/etc/rsyslog.conf" を用いてログファイルと画面表示の
    両方に関してカスタマイズ可能です。rsyslogd(8) や rsyslog.conf(5)
    を参照下さい。また、「ログアナライザー」も参照下さい。

3.6. システム管理

    systemd は init システムを提供するのみならず、systemctl(1) コマン
    ドで汎用システム管理機能を提供します。

    表3.6 典型的な systemctl コマンド断片の例

    +---------------------------------------------------------------+
    |                操作                |       コマンド断片       |
    |------------------------------------+--------------------------|
    |全使用可能なユニットタイプをリスト  |"systemctl list-units     |
    |                                    |--type=help"              |
    |------------------------------------+--------------------------|
    |メモリー中の全ターゲット unit のリス|"systemctl list-units     |
    |ト                                  |--type=target"            |
    |------------------------------------+--------------------------|
    |メモリー中の全サービス unit のリスト|"systemctl list-units     |
    |                                    |--type=service"           |
    |------------------------------------+--------------------------|
    |メモリー中の全デバイス unit のリスト|"systemctl list-units     |
    |                                    |--type=device"            |
    |------------------------------------+--------------------------|
    |メモリー中の全マウント unit のリスト|"systemctl list-units     |
    |                                    |--type=mount"             |
    |------------------------------------+--------------------------|
    |メモリー中の全ソケット unit のリスト|"systemctl list-sockets"  |
    |------------------------------------+--------------------------|
    |メモリー中の全タイマー unit のリスト|"systemctl list-timers"   |
    |------------------------------------+--------------------------|
    |"$unit" 始動                        |"systemctl start $unit"   |
    |------------------------------------+--------------------------|
    |"$unit" 停止                        |"systemctl stop $unit"    |
    |------------------------------------+--------------------------|
    |サービス特定の設定の再ロード        |"systemctl reload $unit"  |
    |------------------------------------+--------------------------|
    |"$unit" 停止と始動                  |"systemctl restart $unit" |
    |------------------------------------+--------------------------|
    |"$unit" 始動と、他全ての停止        |"systemctl isolate $unit" |
    |------------------------------------+--------------------------|
    |"graphical" に切り替え(GUI システム)|"systemctl isolate        |
    |                                    |graphical"                |
    |------------------------------------+--------------------------|
    |"multi-user" に切り替え(CLI システ  |"systemctl isolate        |
    |ム)                                 |multi-user"               |
    |------------------------------------+--------------------------|
    |"rescue" に切り替え(シングルユーザー|"systemctl isolate rescue"|
    |CLI システム)                       |                          |
    |------------------------------------+--------------------------|
    |"$unit" に kill 信号を送る          |"systemctl kill $unit"    |
    |------------------------------------+--------------------------|
    |"$unit" サービスがアクティブかを確認|"systemctl is-active      |
    |                                    |$unit"                    |
    |------------------------------------+--------------------------|
    |"$unit" サービスが失敗かを確認      |"systemctl is-failed      |
    |                                    |$unit"                    |
    |------------------------------------+--------------------------|
    |"$unit|$PID|device" の状態を確認    |"systemctl status $unit|  |
    |                                    |$PID|$device"             |
    |------------------------------------+--------------------------|
    |"$unit|$job" の属性を表示           |"systemctl show $unit|    |
    |                                    |$job"                     |
    |------------------------------------+--------------------------|
    |失敗した "$unit" をリセット         |"systemctl reset-failed   |
    |                                    |$unit"                    |
    |------------------------------------+--------------------------|
    |全ての unit サービスの依存関係をリス|"systemctl                |
    |ト                                  |list-dependencies --all"  |
    |------------------------------------+--------------------------|
    |システムにインストールされた unit フ|"systemctl                |
    |ァイルをリスト                      |list-unit-files"          |
    |------------------------------------+--------------------------|
    |"$unit" を有効にする(symlink 追加)  |"systemctl enable $unit"  |
    |------------------------------------+--------------------------|
    |"$unit" を無効にする(symlink 削除)  |"systemctl disable $unit" |
    |------------------------------------+--------------------------|
    |"$unit" のマスクを外す("/dev/null"  |"systemctl unmask $unit"  |
    |へのsymlink を削除)                 |                          |
    |------------------------------------+--------------------------|
    |"$unit" にマスクをかける("/dev/null"|"systemctl mask $unit"    |
    |へのsymlink を追加)                 |                          |
    |------------------------------------+--------------------------|
    |デフォールトのターゲット設定を取得  |"systemctl get-default"   |
    |------------------------------------+--------------------------|
    |"graphical" にデフォールトのターゲッ|"systemctl set-default    |
    |トを設定 (GUI システム)             |graphical"                |
    |------------------------------------+--------------------------|
    |"multi-user" にデフォールトのターゲ |"systemctl set-default    |
    |ットを設定 (CLI システム)           |multi-user"               |
    |------------------------------------+--------------------------|
    |ジョブ環境の表示                    |"systemctl                |
    |                                    |show-environment"         |
    |------------------------------------+--------------------------|
    |ジョブ環境 "variable"(変数)を "value|"systemctl set-environment|
    |(値)に設定する"                     |variable=value"           |
    |------------------------------------+--------------------------|
    |ジョブ環境 "variable" (変数)の設定を|"systemctl                |
    |解除する                            |unset-environment         |
    |                                    |variable"                 |
    |------------------------------------+--------------------------|
    |全 unit ファイルとデーモンをリロード|"systemctl daemon-reload" |
    |------------------------------------+--------------------------|
    |システムをシャットダウンする        |"systemctl poweroff"      |
    |------------------------------------+--------------------------|
    |システムのシャットダウンとリブート  |"systemctl reboot"        |
    |------------------------------------+--------------------------|
    |システムのサスペンド                |"systemctl suspend"       |
    |------------------------------------+--------------------------|
    |システムのハイバーネート            |"systemctl hibernate"     |
    +---------------------------------------------------------------+


    ここで、上記の例の中の "$unit" は単一の unit 名 (.service や
    .target といったサフィックスは任意) とか、多くの場合、現在メモリ
    ー中の全 unit の主名称に対して fnmatch(3) を用いて"*" や "?" や "
    []" 等のシェルスタイルのグロブによる複数 unit 指定であっても良い
    。

    上記例中のシステムの状態を変えるコマンドは必要な管理特権を獲得さ
    せるべく "sudo" を典型的には前置されています。

    "systemctl status $unit|$PID|$device" の出力は色付きドット ("●")
    を使い unit の状態が一目瞭然としています。

      * 白い "●" は "活動停止" や "活動停止中" の状態を示します。

      * 赤い "●" は "失敗発生" や "エラー発生" の状態を示します。

      * 緑の "●" は "活動中" や "リローディング" や "活動化中" の状態
        を示します。

3.7. 他のシステムモニター

    以下は、systemd の下での他のモニタリングコマンドです。cgroups(7)
    を含めた該当のマンページを読んで下さい。

    表3.7 systemd の下での他のモニタリングコマンドのリスト

    +---------------------------------------------------------------+
    |                操作                 |      コマンド断片       |
    |-------------------------------------+-------------------------|
    |それぞれの初期化ステップにかかった時 |"systemd-analyze time"   |
    |間を表示します                       |                         |
    |-------------------------------------+-------------------------|
    |初期化にかかった時間を全ての unit に |"systemd-analyze blame"  |
    |関してリストします                   |                         |
    |-------------------------------------+-------------------------|
    |読み込み "$unit" ファイル中のエラーを|"systemd-analyze verify  |
    |検出します。                         |$unit"                   |
    |-------------------------------------+-------------------------|
    |呼んだセッションからのユーザーの簡潔 |"loginctl user-status"   |
    |な実行時状態の表示します             |                         |
    |-------------------------------------+-------------------------|
    |呼んだセッションからの簡潔な実行時状 |"loginctl session-status"|
    |態の表示します                       |                         |
    |-------------------------------------+-------------------------|
    |cgroups を用いてブートプロセスを追跡 |"systemd-cgls"           |
    |します                               |                         |
    |-------------------------------------+-------------------------|
    |cgroups を用いてブートプロセスを追跡 |"ps xawf -eo             |
    |します                               |pid,user,cgroup,args"    |
    |-------------------------------------+-------------------------|
    |cgroups を用いてブートプロセスを追跡 |"/sys/fs/cgroup/" の下の |
    |します                               |sysfs を読みます         |
    +---------------------------------------------------------------+


3.8. システム設定

3.8.1. ホスト名

    カーネルがシステムのホスト名を維持管理します。
    systemd-hostnamed.service により起動されたシステム unit が "/etc/
    hostname" に保存された名前を使ってブート時にホスト名を設定します
    。このファイルには、完全修飾ドメイン名ではなく、システムのホスト
    名のみが含まれているべきです。

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

3.8.2. ファイルシステム

    普通のディスクやネットワークのファイルシテムのマウントオプション
    は "/etc/fstab" で設定されます。fstab(5) と「マウントオプションに
    よるファイルシステムの最適化」を参照下さい。

    暗号化されたファイルシステムの設定は "/etc/crypttab" で設定されま
    す。crypttab(5) を参照下さい。

    mdadm(8) を用いるソフトウェアー RAID は "/etc/mdadm/mdadm.conf"
    で設定されます。mdadm.conf(5) を参照下さい。

    警告

    各ブートアップごとに、全てのファイルシステムをマウントした後で、"
    /tmp" と "/var/lock" と "/var/run" 中の一時ファイルはクリーンされ
    ます。

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

    systemd下の現代的な Debian デスクトップ環境では、ネットワークイン
    ターフェースは、lo が "networking.service" で、他のインターフェー
    スが "NetworkManager.service" で典型的には初期化されます。

    どのように設定するのかは 5章ネットワークの設定を参照下さい。.

3.8.4. クラウドシステムの初期化

    クラウドシステムインスタンス "Debian オフィッシャルクラウドイメー
    ジ" とか類似のイメージのクローンとしてローンチされるかもしれませ
    ん。そのようなシステムインスタンスの場合、ホスト名やファイルシス
    テムやネットワーキングやロケールや SSH キーやユーザーとかグループ
    とかは cloud-init や netplan.io パッケージが提供する機能を使って
    、オリジナルのシステムイメージ中に置かれたファイルとかそのローン
    チ時に供給される外部データー等の複数のデーターソースを用いて設定
    されます。これらのパッケージは YAML データーを使った宣言的なシス
    テム設定を可能にします。

    詳しくは "Debian とその系統でのクラウドコンピューティング"や
    "Cloud-init ドキュメンテーション"や「クラウドのための現代的なネッ
    トワーク設定」を参照下さい。

3.8.5. sshd サービスを調整するカスタム化例

    デフォルトのインストールでは、多くのネットワークサービス(6章ネッ
    トワークアプリケーションを参照) はブート時に systemd によってブー
    ト時に network.target の後に起動されます。"sshd" も例外ではありま
    せん。カスタム化の例としてオンデマンド起動に "sshd" を変えましょ
    う。

    最初に、システムがインストールしたサービスの unit を無効化しまし
    ょう。

     $ sudo systemctl stop sshd.service
     $ sudo systemctl mask sshd.service

    古典的 Unix サービスでは indetd (または xinetd) スーパーサーバー
    によりオンデマンドでソケットをアクティベーションしました。systemd
    では、*.socket や *.service unit 設定ファイルを追加することでこれ
    と同等のことができます。

    聞くソケットを指定するには sshd.socket

    [Unit]
    Description=SSH Socket for Per-Connection Servers

    [Socket]
    ListenStream=22
    Accept=yes

    [Install]
    WantedBy=sockets.target

    sshd.socket に対応するサービスファイルの sshd@.service

    [Unit]
    Description=SSH Per-Connection Server
   
    [Service]
    ExecStart=-/usr/sbin/sshd -i
    StandardInput=socket

    そして、再ロードします。

     $ sudo systemctl daemon-reload

3.9. udev システム

    udev システムはハードウエアーの自動検出と初期化のメカニズムを提供
    します (udev(7) 参照下さい)。カーネルが各デバイスを発見すると、
    udev システムは sysfs ファイルシステム (「procfs と sysfs」を参照
    下さい) からの情報を使いユーザープロセスを起動し、modprobe(8) プ
    ログラム (「カーネルモジュール初期化」を参照下さい) を使ってそれ
    をサポートする必要なカーネルモジュールをロードし、対応するデバイ
    スノードを作成します。

    ヒント

    もし "/lib/modules/kernel-version/modules.dep" が何らかの理由で
    depmod(8) によって適正に生成されていなかった場合には、モジュール
    は udev システムによる期待にそってロードされないかもしれません。
    これを修正するには、"depmod -a" を実行します。

    "/etc/fstab" 中のマウントルールでは、デバイス名が静的なデバイス名
    である必要がありません。"/dev/sda" 等のデバイス名ではなく UUID を
    使ってデバイスをマウントできます。「UUID を使ってパーティションを
    アクセス」を参照下さい。

    udev システムは少々動くターゲットなので、詳細は他のドキュメントに
    譲り、ここでは最小限の記述に止めます。

    警告

    udev(7) で語られているように udev ルール中の RUN でバックアップス
    クリプトのような長時間実行されるプログラムを実行しようとしないで
    下さい。そうする代わりには、適切な systemd.service(5) ファイルを
    作成しそれを有効化しましょう。「マウントイベントがトリガーするバ
    ックアップ」を参照下さい。

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

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

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

      * ポイント間ネットワークデバイス (TUN) と仮想 Ethernet ネットワ
        ークデバイス (TAP) を提供する、TUN/TAP モジュール

      * netfilter ファイアーウォール機能 (iptables(8) と「Netfilter
        インフラ」) を提供する netfilter モジュール

      * ウォッチドッグタイマードライバーのモジュール

    modprobe(8) プログラムのための設定ファイルは、modprobe.conf(5) で
    説明されているように "/etc/modprobes.d/" ディレクトリーの下にあり
    ます。(あるカーネルモジュールが自動ロードされるのを避けるには、"/
    etc/modprobes.d/blacklist" ファイル中にブラックリストします。)

    depmod(8) プログラムによって生成される "/lib/modules/version/
    modules.dep" ファイルは、modprobe(8) プログラムによって使われるモ
    ジュール依存関係を記述します。

    注記

    ブート時に modprobe(8) を使ってのモジュールロードの問題に出会った
    場合には、"depmod -a" として "modules.dep" を再構築をするとこの様
    な問題が解消できるかもしれません。

    modinfo(8) プログラムは Linux カーネルモジュールに関する情報を表
    示します。

    lsmod(8) プログラムは "/proc/modules" の内容を読みやすい形式にし
    て、どのカーネルモジュールが現在ロードされているかを表示します。

    ヒント

    あなたのシステム上の正確なハードウエアーを特定します。「ハードウ
    エアーの識別」を参照下さい。
   
    ブート時に期待されるハードウエアー機能をアクティベートするように
    設定もできます。「ハードウエアー設定」を参照下さい。

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

第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 日から、最後にパスワードが変更された日までの日
        数

      * パスワードが変更可能となるまでの日数
   
      * パスワードを変更しなくてはならなくなる日までの日数

      * パスワード有効期限が来る前に、ユーザが警告を受ける日数

      * パスワード有効期限が過ぎてからアカウントが使用不能になるまで
        の日数

      * 1970 年 1 月 1 日からアカウントが使用不能になる日までの日数

      * …

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

    group1:x:20:user1,user2

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

      * グループ名

      * 暗号化されたパスワード (実際は使われていない)
   
      * 数値のグループ ID

      * "," で分離されたユーザー名のリスト

    注記

    "/etc/gshadow" ファイルは "/etc/shadow" ファイルが "/etc/group"
    ファイルに対する機能と同様の機能がありますが、実際には使われてい
    ません。

    注記

    もし "/etc/pam.d/common-auth" に "auth optionalpam_group.so" 行が
    書き加えれ、"/etc/security/group.conf" に対応する設定がされていれ
    ば、実際のユーザーのグループメンバーシップは動的に割り当てられま
    す。pam_group(8) を参照下さい。

    注記

    base-passwd パッケージはユーザーとグループに関する権威のあるリス
    トが含まれます: "/usr/share/doc/base-passwd/
    users-and-groups.html"。

4.2. アカウントとパスワードの情報管理

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

    表4.3 アカウント情報を管理するコマンドのリスト

    +---------------------------------------------------------------+
    |    コマンド    |                     機能                     |
    |----------------+----------------------------------------------|
    |getent passwd   |"user_name" のアカウント情報の閲覧            |
    |user_name       |                                              |
    |----------------+----------------------------------------------|
    |getent shadow   |"user_name" のシャドーされたアカウント情報の閲|
    |user_name       |覧                                            |
    |----------------+----------------------------------------------|
    |getent group    |"group_name" のグループ情報の閲覧             |
    |group_name      |                                              |
    |----------------+----------------------------------------------|
    |passwd          |アカウントのパスワード管理                    |
    |----------------+----------------------------------------------|
    |passwd -e       |アカウントのアクティベーションのために一回だけ|
    |                |使えるパスワードの設定                        |
    |----------------+----------------------------------------------|
    |chage           |パスワードのエージング情報管理                |
    +---------------------------------------------------------------+


    一部機能が機能するには root 権限が必要な場合があります。パスワー
    ドとデーターの暗号化は crypt(3) を参照下さい。

    注記

    Debian が提供する salsa 機器と同様な PAM と NSS の設定をされたシ
    ステム上では、ローカルの "/etc/passwd" や "/etc/group" や "/etc/
    shadow" の内容がシステムにアクティブに利用されていないことがあり
    ます。そういった環境下でも上記コマンドは有効です。

4.3. 良好なパスワード

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

      * 小文字のアルファベット

      * 数字の0から9

      * 句読点

    警告

    容易に推測できるパスワードを選んではいけません。アカウント名、社
    会保険番号、電話番号、住所、誕生日、家族員やペットの名前、辞書に
    ある単語、"12345" や "qwerty" のような単純な文字列…、これらすべて
    パスワードに選んではいけません。

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

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

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

    +---------------------------------------------------------------+
    |パッケ |ポプコン|サイ|コマンド |             機能              |
    | ージ  |        | ズ |         |                               |
    |-------+--------+----+---------+-------------------------------|
    |whois  |V:23,   |384 |mkpasswd |crypt(3) ライブラリーの充実しす|
    |       |I:208   |    |         |ぎたフロントエンド             |
    |-------+--------+----+---------+-------------------------------|
    |openssl|V:847,  |2532|openssl  |パスワードハッシュの計算       |
    |       |I:996   |    |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:941,|891  |差し替え可能な認証モジュール  |
    |                   |I:1000|     |(基本サービス)                |
    |-------------------+------+-----+------------------------------|
    |                   |V:7,  |     |LDAP インターフェースを可能に |
    |libpam-ldapd       |I:14  |79   |する差し替え可能な認証モジュー|
    |                   |      |     |ル                            |
    |-------------------+------+-----+------------------------------|
    |                   |V:738,|     |logind のために登録ユーザーセ |
    |libpam-systemd     |I:966 |777  |ッションを登録するプラガブルオ|
    |                   |      |     |ーセンティケーション (PAM)    |
    |-------------------+------+-----+------------------------------|
    |libpam-doc         |I:7.1 |1491 |差し替え可能な認証モジュール  |
    |                   |      |     |(html と text の文書)         |
    |-------------------+------+-----+------------------------------|
    |                   |V:940,|     |GNU C ライブラリー: "ネームサ |
    |libc6              |I:999 |5355 |ービススイッチ" も提供する共有|
    |                   |      |     |ライブラリー                  |
    |-------------------+------+-----+------------------------------|
    |glibc-doc          |I:5.5 |3836 |GNU C ライブラリー: マンページ|
    |-------------------+------+-----+------------------------------|
    |                   |      |     |GNU C ライブラリー: info と   |
    |glibc-doc-reference|I:3.3 |14261|pdf と html フォーマットでのリ|
    |                   |      |     |ファレンスマニュアル          |
    |                   |      |     |(non-free)                    |
    |-------------------+------+-----+------------------------------|
    |libnss-mdns        |V:271,|142  |マルチキャスト DNS を使った名 |
    |                   |I:505 |     |前解決のための NSS モジュール |
    |-------------------+------+-----+------------------------------|
    |libnss-ldapd       |V:8,  |131  |LDAP をネームサービスとして使 |
    |                   |I:17  |     |う NSS モジュール             |
    +---------------------------------------------------------------+


      * libpam-doc 中の "The Linux-PAM System Administrators' Guide"
        は PAM 設定を学ぶ上で必須です。
   
      * glibc-doc-reference の中の "System Databases and Name Service
        Switch" セクションは NSS 設定を学ぶ上で必須です。

    注記

    より大規模かつ最新のリストは "aptitude search 'libpam-|libnss-'"
    コマンドを実行すると得られます。NSS という頭字語は "ネームサービ
    ススイッチ: Name Service Switch" と異なる "ネットワークセキュリテ
    ィーサービス: Network Security Service" を指すこともあります。

    注記
   
    PAM は個別プログラムに関する環境変数をシステム全体のデフォールト
    値に初期化する最も基本的な手段です。

    systemd の下では、logind のために systemd のコントロールグループ
    階層中にユーザーセッションを登録することでユーザーのログインを管
    理すべくlibpam-systemd パッケージがインストールされている。
    systemd-logind(8) や logind.conf(5) や pam_systemd(8) を参照下さ
    い。

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

    PAM と NSS がアクセスする注目すべき設定ファイルを次に記します。

    表4.6 PAM NSS によりアクセスされる設定ファイルのリスト

    +---------------------------------------------------------------+
    |設定ファイル |                      機能                       |
    |-------------+-------------------------------------------------|
    |/etc/pam.d/プ|"program_name" に関する 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   |                                                 |
    |-------------+-------------------------------------------------|
    |/etc/systemd/|systemd ログイン管理設定の設定(logind.conf(5) と |
    |logind.conf  |systemd-logind.service(8) を参照)                |
    +---------------------------------------------------------------+


    パスワード選択の制限は pam_unix(8) と pam_cracklib(8) モジュール
    で実装されています。それらは引数を使って設定します。

    ヒント
   
    PAM モジュールはファイル名のサフィクスとして ".so" を使います。

4.5.2. 集中システム管理

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

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

      * スタンドアローンの LDAP デーモンである slapd(8) 等のプログラ
        ムを実行することで集中化された LDAP サーバーを設置します。

      * デフォールトの "pam_unix.so" に代えて "pam_ldap.so" を使うに
        は "/etc/pam.d/" ディレクトリー中の PAM 設定ファイルを変更し
        ます。

      * デフォールト ("compat" または "file") に代えて "ldap" を使う
        には "/etc/nsswitch.conf" ファイル中の NSS 設定を変更します。
   
      * パスワードのセキュリティー確保のために libpam-ldapd が SSL
        (もしくは TLS) 接続を使うよう設定しなければいけません。

      * LDAP のネットワークオーバーヘッドのコストは掛かりますが、デー
        タの整合性確保のために libnss-ldapd が SSL (もしくは TLS) 接
        続を使うように設定できます。

      * LDAP のネットワークトラフィックを減少させるために LDAP サーチ
        結果を一時保持するための nscd(8) をローカルで走らせるべきです
        。

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

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

      * Windows システムとのユーザーとグループの統合

          + winbind と libpam_winbind パッケージを使って Windows ドメ
            インサービスにアクセスします。

          + winbind(8) と SAMBA による MS Windows Networks への統合を
            参照下さい。

      * 旧来の Unix 的なシステムとのユーザーとグループの統合

          + nis パッケージにより NIS (当初 YP と呼ばれた) または NIS+
            にアクセス

          + The Linux NIS(YP)/NYS/NIS+ HOWTO 参照下さい。

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 パッケージをインストールすると、より厳格なパスワ
    ード規則を強制できます。

    自動的に libpam-gnome-keyring をインストールする典型的な GNOME シ
    ステム上では、"/etc/pam.d/common-password" は以下です:

    # here are the per-package modules (the "Primary" block)
    password        requisite                       pam_cracklib.so retry=3 minlen=8 difok=3
    password        [success=1 default=ignore]      pam_unix.so obscure use_authtok try_first_pass yescrypt
    # here's the fallback if no module succeeds
    password        requisite                       pam_deny.so
    # prime the stack with a positive return value if there isn't one already;
    # this avoids us returning an error just because nothing sets a success code
    # since the modules above will each just jump around
    password        required                        pam_permit.so
    # and here are more per-package modules (the "Additional" block)
    password        optional        pam_gnome_keyring.so
    # end of pam-auth-update config

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

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

4.6.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.6.2. セキュアーシェル

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

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

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

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

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

    +---------------------------------------------------------------+
    | パッケージ  |ポプコン|サイ|               説明                |
    |             |        | ズ |                                   |
    |-------------+--------+----+-----------------------------------|
    |knockd       |V:0.7,  |110 |小さなポートノックのデーモン knockd|
    |             |I:1.7   |    |(1) とクライアント konck(1)        |
    |-------------+--------+----+-----------------------------------|
    |fail2ban     |V:101,  |2192|複数回の認証エラーを発生させる IP  |
    |             |I:111   |    |を使用禁止にします                 |
    |-------------+--------+----+-----------------------------------|
    |libpam-shield|V:0.05, |115 |パスワード推測によるリモートからの |
    |             |I:0.06  |    |攻撃者を締め出す                   |
    +---------------------------------------------------------------+


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

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

      * ストレージデバイス (HDD / SSD / ...) への物理アクセスを阻止

      * UEFI/BIOS をロックして、リムーバブルメディアからのブートを阻
        止

      * GRUB のインタラクティブセッションのパスワードを設定

      * GRUB のメニュー項目編集に施錠

    ハードディスクへの物理的アクセスがあれば、以下の手順を使い比較的
    簡単にパスワードをリセットできます。

     1. ハードディスクを USB からブート可能な UEFI/BIOS のついた PC
        に移動します。

     2. レスキュー媒体 (see 「USB 上の Linux live レスキューシステム
        」参照)でシステムをブートします。
   
     3. ルートパーティションを読出し / 書込みアクセスでマウントします
        。

     4. ルートパーティションの "/etc/passwd" を編集し、root アカウン
        トの2番目の項目を空にします。

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

     1. カーネルパラメーターを "root=/dev/sda6 rw init=/bin/sh" のよ
        うな感じに変更してシステムをブートします。

     2. "/etc/passwd" を編集し、root アカウントの2番目の項目を空にし
        ます。

     3. システムをリブートします。

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

    注記

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

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

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

    パスワードによる認証システムやファイルパーミッション以外のシステ
    ムへのアクセスコントロールがあります。

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

4.7.1. アクセス制御リスト (ACLs)

    ACL は、「ファイルシステムのパーミッション」で説明された通常のパ
    ーミッションの上位集合です。

    現代的なデスクトップ環境では ACL が作動していることに出くわします
    。フォーマットされた USB ストレージデバイスが例えば "/media/
    penguin/USBSTICK" として自動マウントされた場合、通常ユーザーの
    penguin は以下を実行できます:

     $ cd /media/penguin
     $ ls -la
    total 16
    drwxr-x---+ 1 root    root    16 Jan 17 22:55 .
    drwxr-xr-x  1 root    root    28 Sep 17 19:03 ..
    drwxr-xr-x  1 penguin penguin 18 Jan  6 07:05 USBSTICK

    11 列目にある "+" は ACL 作動を表示しています。ACL 無しだと、通常
    ユーザーの penguin は、penguin が root グループに属さないためこの
    ようにリストできません。ACL は以下のようにして確認できます:

     $ getfacl .
    # file: .
    # owner: root
    # group: root
    user::rwx
    user:penguin:r-x
    group::---
    mask::r-x
    other::---

    ここで:

      * "user::rwx" や "group::---" や "other::---" は、通常の所有者
        や、グループや、第三者のパーミッションに対応します。

      * "user:penguin:r-x" という ACL は通常ユーザーの penguin が
        "r-x" パーミッションを保有することを可能にします。これにより
        、"ls -la" でディレクトリー内容をリストできるようになります。

      * "mask::r-x" という ACL はパーミッションの上限を設定します。

    詳細は "POSIX Access Control Lists on Linux" や acl(5) や getfacl
    (1) や setfacl(1) を参照下さい。

4.7.2. sudo

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

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

    $ sudo chown my_name some_file

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

4.7.3. PolicyKit

    PolicyKit は Unix系オペレーティングシステムにおけるシステム全体の
    特権を制御するオペレーティングシステム構成要素です。

    新しいGUIアプリケーションは、特権プロセスとして実行するように設計
    されていません。それらは、PolicyKitを経由し管理操作を実行する特権
    プロセスに話しかけます。

    PolicyKitは、このような操作をDebianシステム上のsudoグループ所属の
    ユーザーアカウントに限定します。

    polkit(8)を参照下さい。

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

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

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

      * 設定ファイル: "/etc/default/プログラム名"

      * デーモンに関する systemd サービス unit 設定

      * 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 インフラのネットワークファイアーウォール

    「システム管理」と「PAM と NSS によってアクセスされる設定ファイル
    」と「Netfilter インフラ」を参照下さい。

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

    ヒント

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

4.7.5. Linux のセキュリティ機能

    Linux カーネルは進化していて、伝統的な UNIX 実装には見当たらない
    セキュリティー機能をサポートします。

    Linux は、伝統的な UNIX アトリビュートを拡張する拡張アトリビュー
    トをサポートします (xattr(7) を参照下さい)。

    Linux は、伝統的にスーパーユーザーに紐付けられた特権を
    capabilities(7) として知られた、独立に有効化や無効化できる、別個
    の単位に分割します。

    Linux セキュリティーモジュール (LSM) フレームワークは、新規のカー
    ネル拡張により接続される各種セキュリティーチェックのためのメカニ
    ズムを提供します。例えば:

      * AppArmor

      * Security-Enhanced Linux (SELinux)
   
      * Smack (簡易強制アクセス制御カーネル)

      * Tomoyo Linux

    このような拡張は特権モデルを通常の Unix ライクのセキュリティーモ
    デルポリシーより厳しく引き締められるので、ルートの力も制約される
    かもしれません。kernel.org にある Linux セキュリティーモデル
    (LSM) フレームワーク文書を読むことをおすすめします。

    Linux namespaces は、namespace 内のプロセスから見たらプロセスがグ
    ローバルリソースの中でそれ自身のインスタンスがあるようにグローバ
    ルステムリソースを抽象化し包み込んでいます。グローバルリソースの
    変更は namespace のメンバーである他のプロセスからは見えますが、そ
    れ以外のプロセスからは見えません。カーネルバージョン 5.6 以降、8
    種の namespace があります(namespaces(7) と unshare(1) と nsenter
    (1) を参照下さい)。

    Debian 11 Bullseye (2021年) の時点では、Debian は統一 cgroup ヒエ
    ラルキー (cgroups-v2と呼ばれています)。

    プロセスを隔離しリソースコントロールを可能にする cgroups を使う
    namespaces の使用例は以下です:

      * Systemd。「Systemd init」を参照下さい。

      * サンドボックス環境。「サンドボックス」を参照下さい。

      * Docker や LXC 等のLinux コンテナ. 「仮想化システム」を参照下
        さい。

    このような機能は「普通の Unix 認証」では実現できません。このよう
    な高度のトピックスは当該入門書のほぼ対象外です。

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

    ヒント
   
    現代的な Debian に特化したネットワーク設定のガイドは The Debian
    Administrator's Handbook — Configuring the Network を参照下さい。

    ヒント
   
    systemd の下では、networkd がネットワーク管理に使えます。
    systemd-networkd(8)y> を参照下さい。

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

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

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

    +-------------------------------------------------------------------+
    |     パッケージ      |ポプコ|サイ |    タイプ     |      説明      |
    |                     |  ン  | ズ  |               |                |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |NetworkManager  |
    |network-manager      |V:423,|6996 |設定::NM       |(デーモン): ネッ|
    |                     |I:470 |     |               |トワークを自動管|
    |                     |      |     |               |理              |
    |---------------------+------+-----+---------------+----------------|
    |                     |V:43, |     |               |NetworkManager  |
    |network-manager-gnome|I:167 |18   |設定::NM       |(GNOME フロント |
    |                     |      |     |               |エンド)         |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |Netplan (生成   |
    |                     |      |     |               |器):            |
    |                     |      |     |               |NetworkManager  |
    |netplan.io           |V:2.2,|340  |設             |と              |
    |                     |I:8.5 |     |定::NM+networkd|systemd-networkd|
    |                     |      |     |               |バックエンド用の|
    |                     |      |     |               |統一的で宣言的な|
    |                     |      |     |               |インターフェース|
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |ネットワークを接|
    |                     |V:641,|     |               |続したり切断した|
    |ifupdown             |I:972 |201  |設定::ifupdown |りする標準化され|
    |                     |      |     |               |たツール (Debian|
    |                     |      |     |               |特定)           |
    |---------------------+------+-----+---------------+----------------|
    |pppoeconf            |V:0.2,|176  |設定::ヘルパー |PPPoE コネクショ|
    |                     |I:4.1 |     |               |ンの設定ヘルパー|
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |WPA と WPA2     |
    |wpasupplicant        |V:409,|3896 |設定::ヘルパー |(IEEE 802.11i)  |
    |                     |I:514 |     |               |のためのクライア|
    |                     |      |     |               |ントサポート    |
    |---------------------+------+-----+---------------+----------------|
    |                     |V:0.2,|     |               |wpa_supplicant  |
    |wpagui               |I:1.3 |779  |設定::ヘルパー |の Qt GUI クライ|
    |                     |      |     |               |アント          |
    |---------------------+------+-----+---------------+----------------|
    |                     |V:191,|     |               |Linux のワイヤレ|
    |wireless-tools       |I:257 |225  |設定::ヘルパー |ス拡張を操作する|
    |                     |      |     |               |ツール          |
    |---------------------+------+-----+---------------+----------------|
    |                     |V:37, |     |               |Linux のワイヤレ|
    |iw                   |I:473 |332  |設定::ヘルパー |スデバイスを設定|
    |                     |      |     |               |するツール      |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |iproute2、IPv6  |
    |iproute2             |V:776,|4123 |設定::iproute2 |や他の高度なネッ|
    |                     |I:986 |     |               |トワーク設定: ip|
    |                     |      |     |               |(8) や tc(8) 等 |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |パケットフィルタ|
    |iptables             |V:376,|2408 |設定::Netfilter|ーと NAT のため |
    |                     |I:638 |     |               |の管理ツール    |
    |                     |      |     |               |(Netfilter)     |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |パケットフィルタ|
    |                     |      |     |               |ーと NAT のため |
    |nftables             |V:246,|189  |設定::Netfilter|の管理ツール    |
    |                     |I:866 |     |               |(Netfilter)     |
    |                     |      |     |               |({ip,ip6,arp,eb}|
    |                     |      |     |               |tables の後継)  |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |ホスト名か IP ア|
    |                     |      |     |               |ドレスによってリ|
    |iputils-ping         |V:198,|188  |テスト         |モートホストのネ|
    |                     |I:997 |     |               |ットワークからの|
    |                     |      |     |               |到達性をテスト  |
    |                     |      |     |               |(iproute2)      |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |ARP アドレスによ|
    |                     |V:2,  |     |               |って特定されるリ|
    |iputils-arping       |I:18  |53   |テスト         |モートホストのネ|
    |                     |      |     |               |ットワークからの|
    |                     |      |     |               |到達性をテスト  |
    |---------------------+------+-----+---------------+----------------|
    |                     |V:2,  |     |               |リモートホストへ|
    |iputils-tracepath    |I:20  |50   |テスト         |のネットワークパ|
    |                     |      |     |               |スを追跡        |
    |---------------------+------+-----+---------------+----------------|
    |                     |V:96, |     |               |Ethernet デバイ |
    |ethtool              |I:254 |1088 |テスト         |ス設定の表示と変|
    |                     |      |     |               |更              |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |リモートホストへ|
    |mtr-tiny             |V:4,  |181  |テスト::低レベ |のネットワークパ|
    |                     |I:39  |     |ル             |スを追跡するツー|
    |                     |      |     |               |ル (curses)     |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |リモートホストへ|
    |                     |V:4,  |     |テスト::低レベ |のネットワークパ|
    |mtr                  |I:41  |230  |ル             |スを追跡するツー|
    |                     |      |     |               |ル (curses と   |
    |                     |      |     |               |GTK)            |
    |---------------------+------+-----+---------------+----------------|
    |                     |V:0.5,|     |テスト::低レベ |共通のネットワー|
    |gnome-nettool        |I:9.0 |2480 |ル             |ク情報操作のため|
    |                     |      |     |               |のツール (GNOME)|
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |ネットワークマッ|
    |nmap                 |V:25, |4766 |テスト::低レベ |パー / ポートス |
    |                     |I:184 |     |ル             |キャナー (Nmap、|
    |                     |      |     |               |コンソール)     |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |ネットワークトラ|
    |tcpdump              |V:18, |1346 |テスト::低レベ |フィックアナライ|
    |                     |I:174 |     |ル             |ザー (Tcpdump、 |
    |                     |      |     |               |コンソール)     |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |ネットワークトラ|
    |wireshark            |V:4,  |17068|テスト::低レベ |フィックアナライ|
    |                     |I:39  |     |ル             |ザー (Wireshark |
    |                     |      |     |               |、GTK)          |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |ネットワークトラ|
    |tshark               |V:2,  |433  |テスト::低レベ |フィックアナライ|
    |                     |I:23  |     |ル             |ザー (コンソー  |
    |                     |      |     |               |ル)             |
    |---------------------+------+-----+---------------+----------------|
    |                     |V:0.2,|     |テスト::低レベ |tcpdump の出力か|
    |tcptrace             |I:1.6 |407  |ル             |ら接続状況のまと|
    |                     |      |     |               |めを作成        |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |BIND によって提 |
    |                     |      |     |               |供されるネットワ|
    |dnsutils             |V:5,  |23   |テスト::低レベ |ーククライアン  |
    |                     |I:161 |     |ル             |ト: nslookup(8) |
    |                     |      |     |               |と nsupdate(8)  |
    |                     |      |     |               |と dig(8)       |
    |---------------------+------+-----+---------------+----------------|
    |                     |      |     |               |ネームサーバーの|
    |dlint                |V:0.1,|52   |テスト::低レベ |閲覧で DNS のゾ |
    |                     |I:2.2 |     |ル             |ーン情報をチェッ|
    |                     |      |     |               |ク              |
    |---------------------+------+-----+---------------+----------------|
    |dnstracer            |V:0.1,|59   |テスト::低レベ |DNS サーバーをそ|
    |                     |I:1.2 |     |ル             |の源流まで追跡  |
    +-------------------------------------------------------------------+


5.1.1. ホスト名の解決

    ホスト名の解決もまた、現在 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) への問い合わせで
        ホスト名が見つかれば、それに関する全ての有効アドレスを返しま
        す。

    典型的なワークステーションでは、ホスト名は例えば "host_name" と設
    定され、オプショナルなドメイン名は空文字列に設定されてインストー
    ルされているかもしてません。その場合、"/etc/hosts" は以下のように
    なります。

    127.0.0.1 localhost
    127.0.1.1 host_name

    # The following lines are desirable for IPv6 capable hosts
    ::1     localhost ip6-localhost ip6-loopback
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters

    各行は IP アドレスで始まり、関連するホスト名がそれに続きます。

    本例の2行目の IP アドレス 127.0.1.1 は他の Unix 系システムでは見
    かけないかもしれません。bug #719621 に記録されているように、
    Debian インストーラーは恒久的 IP アドレスのないシステムのために一
    部ソフトウェアー (GNOME等) のための回避策としてこの項目を作成しま
    す。

    host_name は、"/etc/hostname" の中に定義されたホスト名と一致しま
    す(「ホスト名」参照)。

    恒久的 IP アドレスを持つシステムでは 127.0.1.1 の代えてその恒久的
    IP アドレスがここにあるべきです。

    恒久的 IP アドレスと Domain 名システム (DNS)が提供する完全修飾ド
    メイン名 (FQDN) を持つシステムでは、その標準的な host_name(ホスト
    名).domain_name(ドメイン名) が host_name(ホスト名) のみに代えて使
    われるべきです。

    resolvconf パッケージがインストールされなかったら、"/etc/
    resolv.conf" は静的なファイルです。インストールされると、それはシ
    ンボリックリンクになります。いずれにせよ、解決機構を初期化する情
    報を含んでいます。もし DNS が IP="192.168.11.1" に見つかるなら、
    それは以下の内容です。

    nameserver 192.168.11.1

    resolvconf パッケージはこの "/etc/resolv.conf" をシンボリックリン
    クにし、フックスクリプトで自動的にその内容を管理します。

    典型的 adhoc な LAN 環境にある PC ワークステーションの場合、基本
    的な files や dns 法に加えて Multicast DNS (mDNS) 経由でホスト名
    を解決する事ができます。

      * Avahi は Debian で Multicast DNS サービスの探索の枠組みを提供
        します。

      * Apple Bonjour / Apple Rendezvous と同等です。

      * libnss-mdns プラグインパッケージが GNU C ライブラリー (glibc)
        の GNU Name Service Switch (NSS) 機能に mDNS 経由のホスト名解
        決を提供します。
   
      * "/etc/nsswitch.conf" ファイルには "hosts: files mdns4_minimal
        [NOTFOUND=return] dns" のようなスタンザがあるべきです(他の設
        定は/usr/share/doc/libnss-mdns/README.Debianを参照下さい)。

      * ".local" で終わる擬似-top-level domain が末尾についたホスト名
        は、IPv4 アドレス "224.0.0.251" か IPv6 アドレス "FF02::FB"
        から、マルチキャスト UDP パケット中の mDNS クエリーメッセージ
        送ることで解決されます。

    注記

    ドメイン名システムにおけるジェネリックトップレベルドメイン (gTLD)
    の拡張が進行中です。LAN内のみで使うドメイン名を選ぶ際に名前衝突に
    注意が必要です。

    注記

    systemd-resolved と合わせての libnss-resolve や、
    libnss-myhostname や、libnss-mymachine のようなパッケージを"/etc/
    nsswitch.conf" ファイル中の "hosts" 行上に対応するリスト項目を挙
    げて使用すると、上記で述べた伝統的なネットワーク設定はオーバーラ
    イドされるかもしれません。詳しくは、nss-resolve(8) や、
    systemd-resolved(8) や、nss-myhostname(8) や、nss-mymachines(8)
    を参照下さい。

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

    systemd は "enp0s25" のような "予測可能なネットワークインターフェ
    ース名" を用います。

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

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

    注記
   
    コロンのついた IP アドレスは IPv6 アドレスです。たとえば "::1" は
    localhost です。

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

    +---------------------------------------------------------------+
    |クラ|ネットワークアドレ|ネットマスク |ネットマスク /|サブネット|
    | ス |        ス        |             |    ビット    |   の数   |
    |----+------------------+-------------+--------------+----------|
    |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.4. ネットワークデバイスサポート

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

5.2. デスクトップのための現代的なネットワーク設定

    systemd下の現代的な Debian デスクトップ環境では、ネットワークイン
    ターフェースは、lo が "networking.service" で、他のインターフェー
    スが "NetworkManager.service" で典型的には初期化されます。

    Debian では、NetworkManager (NM) (network-manager と関連パッケー
    ジ) 等の管理デーモン経由でネットワーク接続の管理ができます。

      * それらは洒落た GUI やコマンドラインのユーザーインターフェース
        が同梱されています。

      * それらにはバックエンドシステムとして、自前のデーモンが同梱さ
        れています。

      * それらによりあなたのシステムをインターネットへ容易に接続でき
        ます。

      * それらによりインターネットへの有線や無線のネットワークの管理
        が容易にできます。

      * それらにより旧来の "ifupdown" パッケージと独立にネットワーク
        を設定できます。

    注記
   
    サーバーにはこの様な自動ネットワーク設定を使わないで下さい。これ
    らはラップトップ上のモービルデスクトップを主対象としています。

    これらの現代的なネットワーク設定ツールは旧来の "ifupdown" パッケ
    ージやその "/etc/network/interfaces" 設定ファイルとの競合を避ける
    ように適正に設定する必要があります。

5.2.1. GUI のネットワーク設定ツール

    Debian における NM の公式のドキュメンテーションは "/usr/share/doc
    /network-manager/README.Debian" にあります。

    デスクトップのための現代的ネットワーク設定の要点は以下です。

     1. 以下のようにして、例えば foo というデスクトップユーザーを
        "netdev" グループに属するようにします。(GNOME や KDE のような
        現代的デスクトップ環境の下では D-bus 経由でそれを自動的にする
        のも一つの方法です。)

        $ sudo usermod -a -G netdev foo

     2. "/etc/network/interfaces" の設定を以下のようにできるだけ簡単
        にします。

        auto lo
        iface lo inet loopback

     3. 以下のようにして NM を再起動します。

        $ sudo systemctl restart NetworkManager

     4. GUI 経由でネットワークを設定します。

    注記
   
    ifupdown との干渉を避けるために、NM は "/etc/network/interfaces"
    にリストされてないインターフェースのみを管理します。

    ヒント

    NM のネットワーク設定能力を拡張したい場合には、
    network-manager-openconnect、network-manager-openvpn-gnome、
    network-manager-pptp-gnome、mobile-broadband-provider-info、
    gnome-bluetooth 等の適当なプラグインモジュールや補足パッケージを
    探して下さい。

5.3. GUI無しの現代的なネットワーク設定

    上記とは異なり、systemd の下では、ネットワークは /etc/systemd/
    network/ を使って設定されているかもしれません。systemd-resolved
    (8) や resolved.conf(5) や systemd-networkd(8) を参照下さい。

    これによりGUI無しの現代的なネットワーク設定ができます。

    DHCP クライアントの設定は "/etc/systemd/network/dhcp.network" を
    作成することで設定できます。例えば:

    [Match]
    Name=en*
   
    [Network]
    DHCP=yes

    静的ネットワーク設定は "/etc/systemd/network/static.network" を作
    成することで設定できます。例えば:

    [Match]
    Name=en*
   
    [Network]
    Address=192.168.0.15/24
    Gateway=192.168.0.1

5.4. クラウドのための現代的なネットワーク設定

    クラウドのための現代的なネットワーク設定は cloud-init と
    netplan.io パッケージを使っているかもしれません (「クラウドシステ
    ムの初期化」を参照下さい)。

    netplan.io パッケージはネットワーク設定バックエンドとして
    systemd-networkd と NetworkManager をサポートし、宣言的な YAML デ
    ーターを使ったネットワーク設定を可能にします。 YAMLを変更する時
    は:

      * "netplan generate" コマンドを実行して、YAMLからすべての必要な
        バックエンド設定を生成します。
   
      * "netplan apply" コマンドを実行して、生成される設定をバックエ
        ンドに適用します。

    "Netplan ドキュメンテーション"とnetplan(5) と netplan-generate(8)
    と netplan-apply(8) を参照下さい。

    更に、cloud-init がどのようにしてnetplan.io の設定を代替データー
    ソースを使って一体化するのかは "Cloud-init ドキュメンテーション"
    (特に "設定ソース"と "Netplan パススルー") を参照下さい。

5.4.1. クラウドのための現代的なネットワーク設定

    DHCP クライアントの設定はデーターソースファイル "/etc/systemd/
    network/dhcp.network" を作成することで設定できます:

    network:
      version: 2
      ethernets:
        all-en:
          match:
            name: "en*"
          dhcp4: true
          dhcp6: true

5.4.2. クラウドのための静的IPを使う現代的なネットワーク設定

    静的ネットワーク設定はデーターソースファイル "/etc/systemd/
    network/static.network" を作成することで設定できます:

    network:
      version: 2
      ethernets:
        eth0:
          addresses:
            - 192.168.0.15/24
          routes:
            - to: default
              via: 192.168.0.1

5.4.3. クラウドのための Network Manager を使う現代的なネットワーク設
定

    Network Manager インフラを用いるネットワーククライアントの設定は
    、データーソースファイル "/etc/netplan/00-network-manager.yaml"
    を作成することで設定できます:

    network:
      version: 2
      renderer: NetworkManager

5.5. 低水準ネットワーク設定

    Linux における低水準のネットワークを設定するには iproute2 プログ
    ラム (ip(8)、…) を用います。

5.5.1. Iproute2 コマンド

    Iproute2 コマンドは低水準ネットワーク設定の完全な機能を提供します
    。旧式の net-tools コマンドと新しい iproute2 コマンド等との翻訳表
    を次に示します。

    表5.3 旧式の net-tools コマンドと新しい iproute2 コマンド等との翻
    訳表

    +---------------------------------------------------------------+
    |  旧式の   |   新しい    |                操作                 |
    | net-tools | iproute2 等 |                                     |
    |-----------+-------------+-------------------------------------|
    |ifconfig(8)|ip addr      |デバイスのプロトコル (IP または IPv6)|
    |           |             |アドレス                             |
    |-----------+-------------+-------------------------------------|
    |route(8)   |ip route     |ルーティングテーブル                 |
    |-----------+-------------+-------------------------------------|
    |arp(8)     |ip neigh     |ARP または NDISC キャッシュ項目      |
    |-----------+-------------+-------------------------------------|
    |ipmaddr    |ip maddr     |マルチキャストアドレス               |
    |-----------+-------------+-------------------------------------|
    |iptunnel   |ip tunnel    |IP 経由トンネル                      |
    |-----------+-------------+-------------------------------------|
    |nameif(8)  |ifrename(8)  |MAC アドレスに基づきネットワークイン |
    |           |             |ターフェースを命名                   |
    |-----------+-------------+-------------------------------------|
    |mii-tool(8)|ethtool(8)   |イーサーネットデバイスの設定         |
    +---------------------------------------------------------------+


    ip(8) とLinux Advanced Routing & Traffic Controlを参照下さい。

5.5.2. 安全な低レベルネットワーク操作

    以下の低レベルネットワークコマンドは、ネットワーク設定を変更しな
    いので安全に使えます。

    表5.4 低レベルネットワークコマンドのリスト

    +---------------------------------------------------------------+
    |      コマンド      |                   説明                   |
    |--------------------+------------------------------------------|
    |ip addr show        |アクティブなインターフェースのリンクとアド|
    |                    |レスの状態を表示                          |
    |--------------------+------------------------------------------|
    |route -n            |数字を使ったアドレスで全てのルーティングテ|
    |                    |ーブルを表示                              |
    |--------------------+------------------------------------------|
    |ip route show       |数字を使ったアドレスで全てのルーティングテ|
    |                    |ーブルを表示                              |
    |--------------------+------------------------------------------|
    |arp                 |ARP キャッシュテーブルの現状の内容を表示  |
    |--------------------+------------------------------------------|
    |ip neigh            |ARP キャッシュテーブルの現状の内容を表示  |
    |--------------------+------------------------------------------|
    |plog                |ppp デーモンのログを表示                  |
    |--------------------+------------------------------------------|
    |ping yahoo.com      |"yahoo.com" までのインターネット接続の確認|
    |--------------------+------------------------------------------|
    |whois yahoo.com     |ドメインデーターベースに "yahoo.com" を誰 |
    |                    |が登録したかを確認                        |
    |--------------------+------------------------------------------|
    |traceroute yahoo.com|"yahoo.com" までのインターネット接続の追跡|
    |--------------------+------------------------------------------|
    |tracepath yahoo.com |"yahoo.com" までのインターネット接続の追跡|
    |--------------------+------------------------------------------|
    |mtr yahoo.com       |"yahoo.com" までのインターネット接続の追跡|
    |                    |(繰り返し)                                |
    |--------------------+------------------------------------------|
    |dig                 |"example.com" のDNS レコードを            |
    |[@dns-server.com]   |"dns-server.com" で"a" か "mx" か "any" か|
    |example.com [{a|mx| |のレコードに関して確認します。            |
    |any}]               |                                          |
    |--------------------+------------------------------------------|
    |iptables -L -n      |パケットフィルターの確認                  |
    |--------------------+------------------------------------------|
    |ss -a               |オープンポートの発見                      |
    |--------------------+------------------------------------------|
    |ss -l               |聴取中のポートの発見                      |
    |--------------------+------------------------------------------|
    |ss -l -t -n         |聴取中の TCP ポートの発見 (数字)          |
    |--------------------+------------------------------------------|
    |dlint example.com   |"examle.com" の DNS ゾーン情報を確認      |
    +---------------------------------------------------------------+


    ヒント

    これらの低レベルネットワーク設定ツールは "/usr/sbin/" 中にありま
    す。"/usr/sbin/ifconfig" 等のような完全コマンドパスを使うか、 "~
    /.bashrc" 中の "$PATH" リストに "/usr/sbin" を追加する必要がある
    かもしれません。

5.6. ネットワークの最適化

    一般的なネットワークの最適化は本書の射程外です。ここでは消費者用
    の接続に関する課題にのみ触れます。

    表5.5 ネットワーク最適化ツールのリスト

    +---------------------------------------------------------------+
    |パッケー |ポプコン |サイ|                 説明                 |
    |   ジ    |         | ズ |                                      |
    |---------+---------+----+--------------------------------------|
    |iftop    |V:6, I:89|93  |ネットワークインターフェースの帯域利用|
    |         |         |    |情報を表示                            |
    |---------+---------+----+--------------------------------------|
    |iperf    |V:2, I:35|431 |インターネットプロトコルのバンド幅測定|
    |         |         |    |ツール                                |
    |---------+---------+----+--------------------------------------|
    |ifstat   |V:0.6,   |52  |インターフェース統計モニター          |
    |         |I:5.5    |    |                                      |
    |---------+---------+----+--------------------------------------|
    |bmon     |V:2, I:20|141 |可搬型バンド幅モニター兼速度推定機    |
    |---------+---------+----+--------------------------------------|
    |ethstatus|V:0.2,   |41  |ネットワークデバイスのスループットを迅|
    |         |I:2.5    |    |速に測定するスクリプト                |
    |---------+---------+----+--------------------------------------|
    |bing     |V:0.08,  |80  |経験則的確率バンド幅試験ソフト        |
    |         |I:0.51   |    |                                      |
    |---------+---------+----+--------------------------------------|
    |bwm-ng   |V:1.1,   |95  |簡単軽量のコンソール式のバンド幅モニタ|
    |         |I:9.7    |    |ー                                    |
    |---------+---------+----+--------------------------------------|
    |ethstats |V:0.05,  |21  |コンソール式のイーサーネット統計モニタ|
    |         |I:0.39   |    |ー                                    |
    |---------+---------+----+--------------------------------------|
    |ipfm     |V:0.05,  |78  |帯域分析ツール                        |
    |         |I:0.12   |    |                                      |
    +---------------------------------------------------------------+


5.6.1. 最適 MTU の発見

    NM は普通最適の最大送信単位 (MTU: Maximum Transmission Unit) を自
    動的に設定します。

    場合によっては、ping(8) を "-M do" オプションとともに用いて多くの
    データーパケットサイズの ICMP パケットを送る実験後 MTU を手動で設
    定したいと考えるかもしれません。MTU は IP フラグメンテーションを
    起こさずおくれる最大のデーターパケットサイズに IPv4 の場合は 28
    バイト IPv6 の場合は 48 バイト足したものです。例えば以下では IPv4
    接続の場合は 1460 と IPv6 接続の場合は 1500 と突き止めます。

    $ ping -4 -c 1 -s $((1500-28)) -M do www.debian.org
    PING  (149.20.4.15) 1472(1500) bytes of data.
    ping: local error: message too long, mtu=1460

    ---  ping statistics ---
    1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

    $ ping -4 -c 1 -s $((1460-28)) -M do www.debian.org
    PING  (130.89.148.77) 1432(1460) bytes of data.
    1440 bytes from klecker-misc.debian.org (130.89.148.77): icmp_seq=1 ttl=50 time=325 ms
   
    ---  ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 325.318/325.318/325.318/0.000 ms
    $ ping -6 -c 1 -s $((1500-48)) -M do www.debian.org
    PING www.debian.org(mirror-csail.debian.org (2603:400a:ffff:bb8::801f:3e)) 1452 data bytes
    1460 bytes from mirror-csail.debian.org (2603:400a:ffff:bb8::801f:3e): icmp_seq=1 ttl=47 time=191 ms

    --- www.debian.org ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 191.332/191.332/191.332/0.000 ms

    このプロセスはパス MTU (PMTU) 発見 (RFC1191) で、tracepath(8) コ
    マンドで自動化できます。

    表5.6 最適 MTU 値の基本的なガイドライン

    +---------------------------------------------------------------+
    |           ネットワーク環境           |MTU |       理由        |
    |--------------------------------------+----+-------------------|
    |ダイヤルアップ接続 (IP: PPP)          |576 |標準               |
    |--------------------------------------+----+-------------------|
    |イーサーネット接続 (IP: DHCP または固 |1500|標準かつデフォール |
    |定)                                   |    |ト                 |
    +---------------------------------------------------------------+


    これらの基本的なガイドラインに加えて、次を覚えておきます。

      * 何らかのトンネル手法 (VPN等) を使うと、それらのオーバーヘッド
        のために最適 MTU を更に減らすかもしれません。

      * MTU 値は実験的に決定される PMTU 値を越すべきではありません。

      * もし他の制約条件を満たすなら、MTU 値は一般的に大きい方がいい
        です。

    最大セグメントサイズ (MSS) はパケットサイズの代替尺度として使われ
    ます。MSS と MTU の関係は次です。

      * IPv4 ではMSS = MTU - 40
   
      * IPv6 ではMSS = MTU - 60

    注記

    iptables(8) (「Netfilter インフラ」を参照下さい) を使う最適化は
    MSS を使ってパッケットサイズを制約できるのでルーターとして有用で
    す。iptables(8) 中の "TCPMSS" を参照下さい。

5.6.2. WAN TCP の最適化

    現代的な高帯域でレイテンシーの大きな WAN では、TCP のスループット
    は TCP バッファーサイズパラメーターを "TCP tuning" にある手順で調
    整することで最大化できます。今のところ現在の Debian のデフォール
    トは高速の 1G bps の FTTP サービスでつながっている私の LAN でも十
    分機能しています。

5.7. Netfilter インフラ

    Netfilter はLinux カーネルのモジュール (「カーネルモジュール初期
    化」を参照下さい) を利用するステートフルファイアーウォールとネッ
    トワークアドレス変換 (NAT) のインフラを提供します。

    表5.7 ファイアーウォールツールのリスト

    +---------------------------------------------------------------+
    |  パッケージ   |ポプコ |サイ|               説明               |
    |               |  ン   | ズ |                                  |
    |---------------+-------+----+----------------------------------|
    |               |V:246, |    |パケットフィルターと NAT のための |
    |nftables       |I:866  |189 |管理ツール (Netfilter)            |
    |               |       |    |({ip,ip6,arp,eb}tables の後継)    |
    |---------------+-------+----+----------------------------------|
    |               |V:376, |    |netfilter の管理ツール(IPv4 用の  |
    |iptables       |I:638  |2408|iptables(8)、IPv6 用の ip6tables  |
    |               |       |    |(8))                              |
    |---------------+-------+----+----------------------------------|
    |arptables      |V:0.1, |102 |netfilter の管理ツール(ARP 用の   |
    |               |I:1.7  |    |arptables(8))                     |
    |---------------+-------+----+----------------------------------|
    |ebtables       |V:15,  |276 |netfilter の管理ツール(Ethernet ブ|
    |               |I:24   |    |リッジング用の ebtables(8))       |
    |---------------+-------+----+----------------------------------|
    |iptstate       |V:0.2, |122 |netfilter の状態を常時モニター    |
    |               |I:1.7  |    |(top(1) と類似)                   |
    |---------------+-------+----+----------------------------------|
    |               |V:79,  |    |Uncomplicated Firewall (UFW)      |
    |ufw            |I:105  |859 |netfilter ファイアーウォールの管理|
    |               |       |    |プログラム                        |
    |---------------+-------+----+----------------------------------|
    |               |V:6,   |    |Uncomplicated Firewall (UFW) 用の |
    |gufw           |I:11   |3663|グラフィカルユーザーインターフェー|
    |               |       |    |ス                                |
    |---------------+-------+----+----------------------------------|
    |               |V:15,  |    |firewalld はネットワークゾーンをサ|
    |firewalld      |I:23   |2558|ポートする動的管理ファイアーウォー|
    |               |       |    |ルプログラム                      |
    |---------------+-------+----+----------------------------------|
    |firewall-config|V:0.7, |1096|firewalld 用のグラフィカルユーザー|
    |               |I:3.2  |    |インターフェース                  |
    |---------------+-------+----+----------------------------------|
    |shorewall-init |V:0.21,|88  |Shoreline ファイアーウォール初期化|
    |               |I:0.41 |    |                                  |
    |---------------+-------+----+----------------------------------|
    |shorewall      |V:2.3, |3090|Shoreline ファイアーウォール、    |
    |               |I:5.1  |    |netfilter 設定ファイル生成システム|
    |---------------+-------+----+----------------------------------|
    |               |V:0.03,|    |Shoreline ファイアーウォール、    |
    |shorewall-lite |I:0.06 |71  |netfilter 設定ファイル生成システム|
    |               |       |    |(軽装備バージョン)                |
    |---------------+-------+----+----------------------------------|
    |               |V:0.7, |    |Shoreline ファイアーウォール、    |
    |shorewall6     |I:1.3  |1334|netfilter 設定ファイル生成システム|
    |               |       |    |(IPv6 バージョン)                 |
    |---------------+-------+----+----------------------------------|
    |               |V:0.02,|    |Shoreline ファイアーウォール、    |
    |shorewall6-lite|I:0.03 |71  |netfilter 設定ファイル生成システム|
    |               |       |    |(IPv6 軽装備バージョン)           |
    +---------------------------------------------------------------+


    netfilter のユーザー空間の主プログラムは iptables(8) です。シェル
    から対話形式で手動で netfilter を設定し、その状態を iptables-save
    (8) で保存し、iptables-restore(8) を使って init スクリプト経由で
    システムのリブート時に回復できます。

    shorewall のような設定ヘルパースクリプトはこの過程を簡単にします
    。

    Netfilter Documentation (または "/usr/share/doc/iptables/html/"
    中) の文書を参照下さい。

      * Linux Networking-concepts HOWTO

      * Linux 2.4 Packet Filtering HOWTO

      * Linux 2.4 NAT HOWTO

    ヒント

    これらは Linux 2.4 のために書かれたとはいえ、iptables(8) コマンド
    も netfilter カーネル機能も現在の Linux 2.6 や 3.x カーネルシリー
    ズにもあてはまります。

第6章ネットワークアプリケーション

    ネットワーク接続を確立した (5章ネットワークの設定を参照下さい) あ
    とで、各種のネットワークアプリケーションを実行できます。

    ヒント

    現代的な Debian に特化したネットワークインターフェースのガイドは
    、 The Debian Administrator's Handbook — Network Infrastructure
    を参照下さい。

    ヒント

    もしどこかの ISP で "2段階認証" を有効にした場合、あなたのプログ
    ラムから POP や SMTP サービスにアクセスするアプリケーションパスワ
    ードを入手する必要があります。事前にあなたのホスト IP を許可する
    必要があるかもしれません。

6.1. ウェッブブラウザー

    多くのウェッブブラウザーパッケージがハイパーテキストトランスファ
    ープロトコル (HTTP) を使って遠隔コンテントにアクセスするために存
    在します。

    表6.1 ウェッブブラウザーのリスト

    +---------------------------------------------------------------+
    |   パッケージ   |ポプコ|サイズ|タイ| ウェッブブラウザーの説明  |
    |                |  ン  |      | プ |                           |
    |----------------+------+------+----+---------------------------|
    |chromium        |V:29, |302260|X   |Chromium、(Google からのオ |
    |                |I:101 |      |    |ープンオースブラウザー)    |
    |----------------+------+------+----+---------------------------|
    |                |      |      |    |Firefox, (Mozilla からのオ |
    |firefox         |V:15, |294905|, , |ープンソースのブラウザー、 |
    |                |I:21  |      |    |Debian Unstable でのみ入手 |
    |                |      |      |    |可能)                      |
    |----------------+------+------+----+---------------------------|
    |firefox-esr     |V:190,|265874|, , |Firefox ESR, (Firefox 延長 |
    |                |I:425 |      |    |サポートリリース)          |
    |----------------+------+------+----+---------------------------|
    |epiphany-browser|V:2,  |6666  |, , |GNOME、HIG 準拠、Epiphany  |
    |                |I:11  |      |    |                           |
    |----------------+------+------+----+---------------------------|
    |konqueror       |V:25, |7982  |, , |KDE、Konqueror             |
    |                |I:112 |      |    |                           |
    |----------------+------+------+----+---------------------------|
    |dillo           |V:0.5,|1585  |, , |Dillo, (軽量ブラウザー,    |
    |                |I:4.1 |      |    |FLTK 準拠)                 |
    |----------------+------+------+----+---------------------------|
    |w3m             |V:11, |2853  |テキ|w3m                        |
    |                |I:137 |      |スト|                           |
    |----------------+------+------+----+---------------------------|
    |lynx            |V:28, |2031  |, , |Lynx                       |
    |                |I:449 |      |    |                           |
    |----------------+------+------+----+---------------------------|
    |elinks          |V:3,  |1789  |, , |ELinks                     |
    |                |I:16  |      |    |                           |
    |----------------+------+------+----+---------------------------|
    |links           |V:2,  |2321  |, , |Links (テキストのみ)       |
    |                |I:21  |      |    |                           |
    |----------------+------+------+----+---------------------------|
    |                |V:1,  |      |グラ|Links (X を使わないコンソー|
    |links2          |I:10  |5466  |フィ|ルグラフィクス)            |
    |                |      |      |クス|                           |
    +---------------------------------------------------------------+


6.1.1. User-Agent 文字列をスプーフィングする

    一部の過剰な制約を課すウエッブサイトにアクセスするには、ウエッブ
    ブラウザープログラムが返すUser-Agent 文字列をスプーフィングする必
    要があるかもしれません。以下を参照下さい:

      * MDN Web Docs: userAgent
      * Chrome Developers: Override the user agent string
      * How to change your user agent
      * How to Change User-Agent in Chrome, Firefox, Safari, and more
      * How to Change Your Browser’s User Agent Without Installing
        Any Extensions
      * How to change the User Agent in Gnome Web (epiphany)

6.1.2. ブラウザー拡張

    全ての現代的な GUI ブラウザーはソースコードを使うブラウザー拡張を
    サポートしていて、ウエッブ拡張として標準化されつつあります。

6.2. メールシステム

    本セクションは消費者用インターネット接続上の典型的モービルワーク
    ステーションにフォーカスします。

    注意

    もしインターネットと直接メール交換するメールサーバーを設定するな
    ら、このような初歩的文書が不要なぐらいシステムを熟知しているべき
    です。

6.2.1. Eメールの基本

    email メッセージは、メッセージのエンベロープ(封筒)と、メッセージ
    のヘッダーと、メッセージの本体との、3 構成要素から成り立っていま
    す。

      * メッセージエンベロープ中の "To" (宛先)と "From" (差出人) 情報
        は SMTP が電子メールを配達するのに用いられます。(メッセージエ
        ンベロープの "From" 情報はバウンスアドレス、 From_、等とも呼
        ばれます。)

      * メッセージヘッダー中の "To" (宛先)と "From" (差出人) 情報は
        email クライアントが email を表示するのに用いられます。(これ
        らはメッセージエンベロープの情報と共通のことがよくありますが
        、必ずしもそうとは限りません。)

      * ヘッダーやボディーデーターを包含する電子メールのメッセージの
        書式は、多目的インターネットメール拡張 (MIME) を持ちいて、プ
        レーンな ASCII テキストから他の文字エンコーディングに、またオ
        ーディオやビデオや画像アプリケーションプログラムに拡張されて
        います。

    フル機能の GUI を使った電子メールクライアントは GUI を使った直感
    的な設定を使い以下の全機能を提供します。

      * コンテントのデータータイプやエンコーディングを扱いメッセージ
        ヘッダーやボディーのデーターは多目的インターネットメール拡張
        (MIME) を持ちいて解釈されます。

      * 旧来の基本アクセス認証か現代的な OAuth 2.0 を用いて ISP の
        SMTP や IMAP サーバーから認証をうけます。(OAuth 2.0 に関して
        は、デスクトップ環境経由で設定します。例えば "Settings" ->
        "Online Accounts".)

      * メッセージサブミッションポート (587) を聞いている ISP のスマ
        ートホスト SMTP サーバーにメッセージを送ります。

      * TLS/IMAP4 ポート (993) から ISP のサーバー上に保存されたメッ
        セージを受け取ります。

      * 属性によってメールのフィルタリングができます。

      * 連絡先、カレンダー、タスク、メモといった追加の機能を提供する
        ことがあります。

    表6.2 メールユーザーエージェント (MUA) のリスト

    +---------------------------------------------------------------+
    |パッケージ |ポプコン|サイズ|              タイプ               |
    |-----------+--------+------+-----------------------------------|
    |evolution  |V:26,   |488   |X GUI プログラム (GNOME、グループウ|
    |           |I:228   |      |エアスイート)                      |
    |-----------+--------+------+-----------------------------------|
    |thunderbird|V:42,   |274189|X GUI プログラム (GTK、Mozilla     |
    |           |I:105   |      |Thunderbird)                       |
    |-----------+--------+------+-----------------------------------|
    |kmail      |V:43,   |25270 |X GUI プログラム (KDE)             |
    |           |I:103   |      |                                   |
    |-----------+--------+------+-----------------------------------|
    |mutt       |V:11,   |7332  |きっと vim とともに使われるキャラク|
    |           |I:89    |      |ターターミナルプログラム           |
    |-----------+--------+------+-----------------------------------|
    |mew        |V:0.02, |2319  |(x)emacs の下でキャラクターターミナ|
    |           |I:0.15  |      |ルプログラム                       |
    +---------------------------------------------------------------+


6.2.2. 現代的なメールサービスの制約

    スパム（迷惑メール）問題にさらされるのを最小化するために、現代的
    なメールサービスには様々な制約があります。

      * 確実にメールをリモートホストに直接送るために消費者用インター
        ネット接続上で SMTP サーバーを実行するのは現実的ではありませ
        ん。

      * メールは可能な限り真正に見えない限り、送付先に到達する途中の
        どこかのホストによって黙って拒否されるでしょう。

      * 無関係の複数の送信元メールアドレスのメールを、単一のスマート
        ホストを使って確実にリモートホストに送ることを期待するのは現
        実的ではありません。

    なぜなら:

      * 消費者用インターネット接続からインターネットへのSMTP ポート
        (25) 接続はブロックされます。

      * 消費者用インターネット接続されたホストへのインターネットから
        のSMTP ポート (25) 接続はブロックされます。

      * 消費者用インターネット接続されたホストからインターネットへの
        送信メッセージはメッセージサブミッションポート (587) 経由での
        み送れます。

      * ドメインキーアイデンティファイドメール (DKIM) や SPF 認証やド
        メインベースのメッセージ認証、報告および適合 (DMARC) のような
        アンチスパムテクニックが email のフィルタリングに広範に使用さ
        れています。

      * ドメインキーアイデンティファイドメールサービスがあなたのメー
        ルをスマートホスト経由で送信する際に提供されているかもしれま
        せん。

      * Eメールアドレスのなりすましを防ぐために、スマートホストによっ
        てメッセージヘッダ内の送信元メールアドレスがスマートホストの
        メールアカウントに書き換えられることがあります。

6.2.3. 歴史的なメールサービスへの期待

    Debian 上のいくつかのプログラムは、UNIX システム上のメールサービ
    スが歴史的に以下のように機能したため、デフォルト設定でもカスタマ
    イズ設定でも /usr/sbin/sendmail コマンドにアクセスして以下のよう
    にして電子メールを送ることを期待します:

      * 電子メールがテキストファイルで作成されます。

      * 電子メールが /usr/sbin/sendmail コマンドに引き渡されます。

      * 同一ホスト上の送り先アドレスの場合、/usr/sbin/sendmail コマン
        ドは /var/mail/$username ファイルに電子メールを追記することで
        電子メールのローカル配達をします。

          + このような機能を期待しているコマンド: apt-listchanges,
            cron, at, ...

      * リモートホスト上の送り先アドレスの場合、/usr/sbin/sendmail コ
        マンドは DNS の MX レコードから見つかる送り先ホストに SMTP を
        用いて電子メールを配達をします。

          + このような機能を期待しているコマンド: popcon, reportbug,
            bts, ...

6.2.4. メール転送エージェント (MTA)

    Debian のモービルワークステーションは、Debian 12 Bookworm 以降メ
    ール転送エージェント (MTA)を使わず、フル機能の GUI を使った電子メ
    ールクライアントだけで設定可能です。

    Debian は伝統的に、 /usr/sbin/sendmail コマンドを期待するプログラ
    ムのために何らかの MTA プログラムをインストールしました。モービル
    ワークステーション上のそのような MTA は「現代的なメールサービスの
    制約」や「歴史的なメールサービスへの期待」に対処しなければいけま
    せん。

    モービルワークステーションでは、MTA の典型的選択肢はインストール
    オプションとして "Mail sent by smarthost; received via SMTP or
    fetchmail" 等を選択した exim4-daemon-light か postfix です。これ
    らの軽量 MTA は "/etc/aliases" を尊重します。

    ヒント

    exim4 を設定して複数の送信元メールアドレスに対応する複数のスマー
    トホストを経由してインターネットメールを送ることは簡単ではありま
    せん。特定のプログラムためにそのような機能が必要な場合には、複数
    の送信元アドレスを簡単に設定できる msmtp を設定し使用しましょう。
    そして、MTA は単一送信元アドレスだけのままにしましょう。

    表6.3 基本的なメール転送エージェント関連パッケージのリスト

    +---------------------------------------------------------------+
    |    パッケージ    |ポプコ|サイ|              説明              |
    |                  |  ン  | ズ |                                |
    |------------------+------+----+--------------------------------|
    |exim4-daemon-light|V:211,|1637|Exim4 メール転送エージェント    |
    |                  |I:218 |    |(MTA: Debian のデフォルト)      |
    |------------------+------+----+--------------------------------|
    |exim4-daemon-heavy|V:5.1,|1802|Exim4 メール転送エージェント    |
    |                  |I:5.2 |    |(MTA: 柔軟な代替候補)           |
    |------------------+------+----+--------------------------------|
    |exim4-base        |V:216,|1634|Exim4 文書 (text) と共通ファイル|
    |                  |I:224 |    |                                |
    |------------------+------+----+--------------------------------|
    |exim4-doc-html    |I:0.96|3798|Exim4 文書 (html)               |
    |------------------+------+----+--------------------------------|
    |exim4-doc-info    |I:0.54|648 |Exim4 文書 (info)               |
    |------------------+------+----+--------------------------------|
    |postfix           |V:107,|4224|Postfix メール転送エージェント  |
    |                  |I:112 |    |(MTA: セキュアな代替候補)       |
    |------------------+------+----+--------------------------------|
    |postfix-doc       |I:4.6 |5022|Postfix 文書 (html+text)        |
    |------------------+------+----+--------------------------------|
    |sasl2-bin         |V:5,  |381 |Cyrus SASL API の実装 (SMTP AUTH|
    |                  |I:10  |    |について postfix を補完)        |
    |------------------+------+----+--------------------------------|
    |cyrus-sasl2-doc   |I:0.68|2140|Cyrus SASL - 文書               |
    |------------------+------+----+--------------------------------|
    |msmtp             |V:8,  |811 |軽量 MTA                        |
    |                  |I:14  |    |                                |
    |------------------+------+----+--------------------------------|
    |msmtp-mta         |V:6.5,|136 |軽量 MTA (msmtp の sendmail 互換|
    |                  |I:8.5 |    |性拡張)                         |
    |------------------+------+----+--------------------------------|
    |nullmailer        |V:7.9,|483 |超軽量 MTA、ローカルメール無し  |
    |                  |I:8.4 |    |                                |
    |------------------+------+----+--------------------------------|
    |ssmtp             |V:4.2,|134 |超軽量 MTA、ローカルメール無し  |
    |                  |I:6.3 |    |                                |
    |------------------+------+----+--------------------------------|
    |sendmail-bin      |V:11, |1954|高機能 MTA (既に慣れている場合) |
    |                  |I:11  |    |                                |
    |------------------+------+----+--------------------------------|
    |                  |V:0.4,|    |パッチの集合の email として送信 |
    |git-email         |I:9.8 |1204|する git-send-email(1) プログラ |
    |                  |      |    |ム                              |
    +---------------------------------------------------------------+


6.2.4.1. exim4 設定

    スマートホスト経由のインターネットメールに関しては、exim4-* パッ
    ケージを以下のように (再)設定します。

    $ sudo systemctl stop exim4
    $ sudo dpkg-reconfigure exim4-config

    "General type of mail configuration" に関して、"スマートホストで
    メール送信; SMTP または fetchmail で受信する" を選択します。

    "System mail name:" をそのデフォルトである FQDN (「ホスト名の解決
    」を参照下さい) に設定します。

    "IP-addresses to listen on for incoming SMTP connections:" をその
    デフォルトである "127.0.0.1 ; ::1" と設定します。

    "Other destinations for which mail is accepted:" の内容を消去しま
    す。

    "Machines to relay mail for:" の内容を消去します。

    "送出スマートホストの IP アドレスまたはホスト名:" を
    "smtp.hostname.dom:587" と設定します。

    "Hide local mail name in outgoing mail?" に対して "No" を選択しま
    す。(この代わりに、「メールアドレス設定」にある "/etc/
    email-addresses" を使用します。)

    "DNS クエリの数を最小限に留めますか (ダイヤルオンデマンド)?" に以
    下の内のひとつの返答をします。

      * ブート時にインターネットに接続されている場合は、"No" とします
        。
   
      * ブート時にインターネットに接続されていない場合は、"Yes" とし
        ます。

    "Delivery method for local mail:" を"mbox format in /var/mail/"
    と設定します。

    "Split configuration into small files?:" に対して "Yes" を選択し
    ます。

    "/etc/exim4/passwd.client" を編集しスマートホストのためのパスワー
    ドエントリーを作成します。

    $ sudo vim /etc/exim4/passwd.client
     ...
    $ cat /etc/exim4/passwd.client
    ^smtp.*\.hostname\.dom:username@hostname.dom:password

    "/etc/default/exim4" 中で "QUEUERUNNER='queueonly'" や
    "QUEUERUNNER='nodaemon'" 等と設定しシステムリソースの消費を最小限
    とした exim4(8) (optional)

    以下のようにして exim4 を起動します。

    $ sudo systemctl start exim4

    "/etc/exim4/passwd.client" 中のホスト名はエイリアスであってはいけ
    ません。真のホスト名は以下のようにして確認できます。

    $ host smtp.hostname.dom
    smtp.hostname.dom is an alias for smtp99.hostname.dom.
    smtp99.hostname.dom has address 123.234.123.89

    エイリアス問題を回避するために "/etc/exim4/passwd.client" の中に
    正規表現を用いています。もし ISP がエイリアスで示されるホストを移
    動させても SMTP AUTH はおそらく動きます。

    以下のようにすれば exim4 の設定を手動で更新できます。

      * "/etc/exim4/" 中の exim4 設定ファイルの更新。

          + MACRO を設定するために "/etc/exim4/
            exim4.conf.localmacros" を作成し、"/etc/exim4/
            exim4.conf.template" を編集します。(非分割設定)
   
          + "/etc/exim4/exim4.conf.d" サブディレクトリー中で、新規フ
            ァイルを作成したり既存ファイルを編集したりします。(分割設
            定)

      * "systemctl reload exim4" を実行します。

    注意

    "DNS クエリの数を最小限に留めますか (ダイヤルオンデマンド)?" とい
    う debconf の質問に "No" (デフォールト値) が選ばれシステムがブー
    ト時にインターネットに繋がっていない場合、exim4 の起動は長い時間
    がかかります。

   

    次に示す正式のガイドを読んで下さい: "/usr/share/doc/exim4-base/
    README.Debian.gz" と update-exim4.conf(8)。

    警告

    現実的な各種配慮から、ポート 587 上で STARTTLS を用い SMTP を用い
    るか、ポート 25 上のプレーンの SMTP の代わりのポート 465 上の
    SMTPS (SSL使用のSMTP) を用いています。

6.2.4.2. SASL を使う postfix の設定

    スマートホスト経由のインターネットメールに関しては postfix 文書と
    重要マニュアルページを読むことから始めるべきです。

    表6.4 重要 postfix マニュアルページのリスト

    +-----------------------------------------------------------+
    |  コマンド  |                     機能                     |
    |------------+----------------------------------------------|
    |postfix(1)  |Postfix コントロールプログラム                |
    |------------+----------------------------------------------|
    |postconf(1) |Postfix の設定ユーティリティー                |
    |------------+----------------------------------------------|
    |postconf(5) |Postfix 設定パラメーター                      |
    |------------+----------------------------------------------|
    |postmap(1)  |Postfix 検索テーブルのメンテナンス            |
    |------------+----------------------------------------------|
    |postalias(1)|Postfix エイリアスデーターベースのメンテナンス|
    +-----------------------------------------------------------+


    postfix と sasl2-bin パッケージを以下のように (再)設定します。

    $ sudo systemctl stop postfix
    $ sudo dpkg-reconfigure postfix

    "スマートホストを使ってインターネット" を選択します。

    "SMTP リレーホスト (なければ空):" を "[smtp.hostname.dom]:587" と
    設定します。

    $ sudo postconf -e 'smtp_sender_dependent_authentication = yes'
    $ sudo postconf -e 'smtp_sasl_auth_enable = yes'
    $ sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'
    $ sudo postconf -e 'smtp_sasl_type = cyrus'
    $ sudo vim /etc/postfix/sasl_passwd

    スマートホストのパスワードエントリーを作成します。

    $ cat /etc/postfix/sasl_passwd
    [smtp.hostname.dom]:587     username:password
    $ sudo postmap hush:/etc/postfix/sasl_passwd

    次に記すように postfix を起動します。

    $ sudo systemctl start postfix

    dpkg-reconfigure ダイアログと "/etc/postfix/sasl_passwd" の中で "
    [" と "]" を使うことで MX レコードを確認せずに指定された hostname
    その物を直接使うように確実にします。"/usr/share/doc/postfix/html/
    SASL_README.html" の中の "Enabling SASL authentication in the
    Postfix SMTP client" を参照下さい。

6.2.4.3. メールアドレス設定

    メールのトランスポートとデリバリーとユーザーのエージェントが使う
    メールアドレス設定ファイルが少々存在します。

    表6.5 メールアドレス関連のファイルのリスト

    +---------------------------------------------------------------+
    |   ファイル    |       機能       |      アプリケーション      |
    |---------------+------------------+----------------------------|
    |/etc/mailname  |(送出)メールのデフ|Debian 固有、mailname(5)    |
    |               |ォールトのホスト名|                            |
    |---------------+------------------+----------------------------|
    |/etc/          |送出メールのホスト|exim(8) 固有、              |
    |email-addresses|名の偽装          |exim4-config_files(5)       |
    |---------------+------------------+----------------------------|
    |/etc/postfix/  |送出メールのホスト|postfix(1) 固有、postmap(1) |
    |generic        |名の偽装          |コマンド実行後アクティベート|
    |               |                  |されます。                  |
    |---------------+------------------+----------------------------|
    |               |受入メールのための|一般的、newaliases(1) コマン|
    |/etc/aliases   |アカウント名のエイ|ド実行後アクティベートされま|
    |               |リアス            |す。                        |
    +---------------------------------------------------------------+


    通常 "/etc/mailname" ファイル中の mailname はホストの IP の一つと
    して解決できる完全修飾ドメイン名 (FQDN) です。解決できる IP アド
    レスのあるホスト名を持たない可動ワークステーションの場合には、こ
    の mailname を "hostname -f" に設定します。(これは exim4-* と
    postfix の両方に有効な安全な選択肢です。)

    ヒント

    "/etc/mailname" の内容は多くの MTA 以外のプログラムによってそのデ
    フォールト挙動のために使われます。mutt の場合、~/muttrc ファイル
    中の "hostname" と "from" 変数を設定して mailname の値をオーバー
    ライドします。bts(1) や dch(1) 等の devscripts パッケージ中のプロ
    グラムの場合、環境変数の "$DEBFULLNAME" や "$DEBEMAIL" をエキスポ
    ートしてその値をオーバーライドします。

    ヒント

    普通 popularity-contest パッケージは root アカウントからメールを
    FQDN 付きで送信します。/usr/share/popularity-contest/default.conf
    に記載された様に /etc/popularity-contest.conf 中に MAILFROM を設
    定する必要があります。こうしないと、smarthost の SMTP サーバーに
    よってあなたのメールは拒否されます。少々面倒ですが、root からの全
    メールの発信元を書き替えるより、この方法は安全ですし、他のデーモ
    ンや cron スクリプトに関してもこの方法を適用するべきです。

    mailname を"hostname -f" と設定した時には、次によって MTA で発信
    元メールアドレスを偽装することが実現できます。

      * exim4(8) の場合、exim4-config_files(5) に説明されているように
        "/etc/email-addresses"
   
      * postfix(1) の場合、generic(5) に説明されているように "/etc/
        postfix/generic"

    postfix の場合、次に記す追加ステップが必要です。

    # postmap hash:/etc/postfix/generic
    # postconf -e 'smtp_generic_maps = hash:/etc/postfix/generic'
    # postfix reload

    あなたのメール設定は以下のようにするとテストできます。

      * exim(8) の場合、-brw, -bf, -bF, -bV, … オプションを使用
   
      * postmap(1) の場合、-q オプションを使用

    ヒント

    Exim にはexiqgrep(8) や exipick(8) のようないくつかのユーティリテ
    ィープログラムが同梱されています。利用可能なコマンドは "dpkg -L
    exim4-base|grep man8/" を参照下さい。

6.2.4.4. 基本的な MTA の操作

    基本的な MTA 操作が存在します。その一部は sendmail(1) 互換性イン
    ターフェース経由で実行する事もできます。

    表6.6 基本的 MTA 操作のリスト

    +---------------------------------------------------------------+
    |exim コマン|   postfix コマンド   |            説明            |
    |    ド     |                      |                            |
    |-----------+----------------------+----------------------------|
    |sendmail   |sendmail              |標準入力からメールを読み配送|
    |           |                      |を手配 (-bm)                |
    |-----------+----------------------+----------------------------|
    |mailq      |mailq                 |メールキューを状態とキュー  |
    |           |                      |ID とともにリスト (-bp)     |
    |-----------+----------------------+----------------------------|
    |newaliases |newaliases            |エイリアスデーターベースを初|
    |           |                      |期化 (-I)                   |
    |-----------+----------------------+----------------------------|
    |exim4 -q   |postqueue -f          |待機メールを排出 (-q)       |
    |-----------+----------------------+----------------------------|
    |exim4 -qf  |postsuper -r ALL      |全メールを排出              |
    |           |deferred; postqueue -f|                            |
    |-----------+----------------------+----------------------------|
    |exim4 -qff |postsuper -r ALL;     |凍結メールをも排出          |
    |           |postqueue -f          |                            |
    |-----------+----------------------+----------------------------|
    |exim4 -Mg  |postsuper -h queue_id |キュー ID によってメッセージ|
    |queue_id   |                      |を凍結                      |
    |-----------+----------------------+----------------------------|
    |exim4 -Mrm |postsuper -d queue_id |キュー ID によってメッセージ|
    |queue_id   |                      |を削除                      |
    |-----------+----------------------+----------------------------|
    |N/A        |postsuper -d ALL      |全メッセージを削除          |
    +---------------------------------------------------------------+


    ヒント
   
    "/etc/ppp/ip-up.d/*" 中のスクリプトで全メールを排出するのは良い考
    えかも知れません。

6.3. リーモートアクセスサーバーとユーティリティー (SSH)

    セキュアーシェル (SSH) はインターネット経由で接続するセキュアーな
    方法です。Debian では、OpenSSH と呼ばれるフリーバージョンのSSH が
    openssh-client と openssh-server パッケージとして利用可能です。

    ssh(1) はユーザーにとってより賢明でよりセキュアーな telnet(1) と
    して機能します。telnet コマンドと異なり、ssh コマンドは telnet エ
    スケープ文字 (初期デフォールト CTRL-]) に出会うことで中断される事
    がありません。

    表6.7 リモートアクセスサーバーとユーティリティーのリスト

    +------------------------------------------------------------------+
    |      パッケージ      |ポプコ |サイ|        ツール        | 説明  |
    |                      |  ン   | ズ |                      |       |
    |----------------------+-------+----+----------------------+-------|
    |                      |       |    |                      |セキュ |
    |                      |V:915, |    |                      |アーシ |
    |openssh-client        |I:996  |4210|ssh(1)                |ェルク |
    |                      |       |    |                      |ライア |
    |                      |       |    |                      |ント   |
    |----------------------+-------+----+----------------------+-------|
    |                      |       |    |                      |セキュ |
    |openssh-server        |V:768, |3359|sshd(8)               |アーシ |
    |                      |I:819  |    |                      |ェルサ |
    |                      |       |    |                      |ーバー |
    |----------------------+-------+----+----------------------+-------|
    |                      |       |    |                      |ユーザ |
    |                      |       |    |                      |ーに   |
    |                      |       |    |                      |ssh-add|
    |                      |       |    |                      |用のパ |
    |ssh-askpass           |I:16   |103 |ssh-askpass(1)        |スフレ |
    |                      |       |    |                      |ーズを |
    |                      |       |    |                      |尋ねる |
    |                      |       |    |                      |(プレー|
    |                      |       |    |                      |ン X)  |
    |----------------------+-------+----+----------------------+-------|
    |                      |       |    |                      |ユーザ |
    |                      |       |    |                      |ーに   |
    |                      |       |    |                      |ssh-add|
    |ssh-askpass-gnome     |V:0.4, |207 |ssh-askpass-gnome(1)  |用のパ |
    |                      |I:3.0  |    |                      |スフレ |
    |                      |       |    |                      |ーズを |
    |                      |       |    |                      |尋ねる |
    |                      |       |    |                      |(GNOME)|
    |----------------------+-------+----+----------------------+-------|
    |                      |       |    |                      |見た目 |
    |                      |       |    |                      |良くユ |
    |                      |       |    |                      |ーザー |
    |                      |       |    |                      |に     |
    |ssh-askpass-fullscreen|V:0.11,|41  |ssh-askpass-fullscreen|ssh-add|
    |                      |I:0.45 |    |(1)                   |用のパ |
    |                      |       |    |                      |スフレ |
    |                      |       |    |                      |ーズを |
    |                      |       |    |                      |尋ねる |
    |                      |       |    |                      |(GNOME)|
    |----------------------+-------+----+----------------------+-------|
    |                      |       |    |                      |ブラウ |
    |                      |       |    |                      |ザーア |
    |                      |       |    |                      |クセス |
    |                      |       |    |                      |可能な |
    |                      |       |    |                      |VT100  |
    |                      |V:0.7, |    |                      |ターミ |
    |shellinabox           |I:1.1  |528 |shellinaboxd(1)       |ナルエ |
    |                      |       |    |                      |ミュレ |
    |                      |       |    |                      |ーター |
    |                      |       |    |                      |のため |
    |                      |       |    |                      |のウエ |
    |                      |       |    |                      |ッブサ |
    |                      |       |    |                      |ーバー |
    +------------------------------------------------------------------+


    shellinabox は SSH プログラムではありませんが、リモートターミナル
    アクセスのための興味深い代替策としてここにリストしています。

    リモート X クライアントプログラムへの接続のために「Xサーバ接続」
    も参照下さい。

    注意
   
    あなたの SSH がインターネットからアクセスできる場合には、「インタ
    ーネットのためのセキュリティー強化策」を参照下さい。

    ヒント

    リモートのシェルプロセスが回線接続の中断の際にも継続するようにす
    るために screen(1) プログラムを使いましょう (「screen プログラム
    」を参照下さい)。

6.3.1. SSH の基本

    OpenSSH SSH デーモンは SSH プロトコル2のみをサポートします。

    "/usr/share/doc/openssh-client/README.Debian.gz" と ssh(1) と
    sshd(8) と ssh-keygen(1) と ssh-add(1) と ssh-agent(1) を参照下さ
    い。

    警告

    OpenSSH サーバーを実行したい場合には、"/etc/ssh/
    sshd_not_to_be_run" が存在してはいけません。

    rhost に基づく認証を有効化してはいけない (/etc/ssh/sshd_config 中
    の HostbasedAuthentication )。

    表6.8 SSH 設定ファイルのリスト

    +---------------------------------------------------------------+
    |  設定ファイル  |              設定ファイルの説明              |
    |----------------+----------------------------------------------|
    |/etc/ssh/       |SSH クライアントのデフォールト、ssh_config(5) |
    |ssh_config      |参照下さい                                    |
    |----------------+----------------------------------------------|
    |/etc/ssh/       |SSH サーバーのデフォールト、sshd_config(5) 参 |
    |sshd_config     |照下さい                                      |
    |----------------+----------------------------------------------|
    |~/.ssh/         |当該 SSH サーバーの当該アカウント接続用にクラ |
    |authorized_keys |イアントが使用するデフォールト公開 SSH キー   |
    |----------------+----------------------------------------------|
    |~/.ssh/id_rsa   |ユーザーの秘密 SSH-2 RSA キー                 |
    |----------------+----------------------------------------------|
    |~/.ssh/id_      |ユーザの秘密 SSH-2 key-type-name キー (ecdsa, |
    |key-type-name   |ed25519 など)                                 |
    +---------------------------------------------------------------+


    クライアントから ssh(1) 接続を開始するには以下のようにします。

    表6.9 SSH クライアント起動例のリスト

    +---------------------------------------------------------------+
    |            コマンド            |             説明             |
    |--------------------------------+------------------------------|
    |ssh username@hostname.domain.ext|デフォルトモードで接続        |
    |--------------------------------+------------------------------|
    |ssh -v                          |デバッグメッセージを有効にして|
    |username@hostname.domain.ext    |デフォルトモードで接続        |
    |--------------------------------+------------------------------|
    |ssh -o PreferredAuthentications=|SSH バージョン 2 でパスワード |
    |password                        |を使うことを強制              |
    |username@hostname.domain.ext    |                              |
    |--------------------------------+------------------------------|
    |ssh -t                          |リモートホストでパスワードを更|
    |username@hostname.domain.ext    |新するために passwd プログラム|
    |passwd                          |を実行                        |
    +---------------------------------------------------------------+


6.3.2. リモートホストでのユーザ名

    ローカルホストとリモートホストで同じユーザ名を使っている場合は
    "username@" と打たなくてもよいです。

    たとえローカルとリモートで異なるユーザー名を使う場合でも、"~/.ssh
    /config" を用いるとユーザー名を省略できます。例えば Debian Salsa
    サービスでのユーザー名が "foo-guest" の場合は、"~/.ssh/config" が
    次を含むように設定します。

    Host salsa.debian.org people.debian.org
    User foo-guest

6.3.3. リモートパスワード無しでの接続

    "PubkeyAuthentication" (SSH-2 プロトコル) を使うと、リモートシス
    テムのパスワードを覚えなくてもよくなります。

    リモートシステムの "/etc/ssh/sshd_config" 中に対応する項目
    "PubkeyAuthentication yes" を設定します。

    次に示すように、ローカルで認証キーを生成しリモートシステム上に公
    開キーをインストールします。

    $ ssh-keygen -t rsa
    $ cat .ssh/id_rsa.pub | ssh user1@remote "cat - >>.ssh/authorized_keys"

    ホストを制限したり特定コマンドを実行したりするには "~/.ssh/
    authorized_keys" 中の項目にオプションを追加します。sshd(8) の
    "AUTHORIZED_KEYS FILE FORMAT" を参照下さい。

6.3.4. 外部 SSH クライアントへの対処法

    他のプラットフォーム上で利用可能なフリーな SSH クライアントがいく
    つかあります。

    表6.10 他のプラットフォーム上で使えるフリーな SSH クライアントの
    リスト

    +---------------------------------------------------------------+
    |    環境    |             フリーの SSH プログラム              |
    |------------+--------------------------------------------------|
    |Windows     |puTTY (PuTTY: 自由な SSH と Telnet クライアント)  |
    |            |(GPL)                                             |
    |------------+--------------------------------------------------|
    |Windows     |cygwin 中の SSH (Cygwin: Windows 上での Linux 感覚|
    |(cygwin)    |を得よう) (GPL)                                   |
    |------------+--------------------------------------------------|
    |Mac OS X    |OpenSSH; ターミナルアプリケーションの ssh を使用し|
    |            |ます (GPL)                                        |
    +---------------------------------------------------------------+


6.3.5. ssh-agent の設定

    SSH の認証キーをパスフレーズで保護する方がより安全です。もしパス
    フレーズが設定されていない場合には "ssh-keygen -p" で設定できます
    。

    上記のようにパスワードを使って接続したリモートホスト上の "~/.ssh/
    authorized_keys" 中にあなたの公開 SSH キー (例えば "~/.ssh/
    id_rsa.pub") を設定します。

    $ ssh-agent bash
    $ ssh-add ~/.ssh/id_rsa
    Enter passphrase for /home/username/.ssh/id_rsa:
    Identity added: /home/username/.ssh/id_rsa (/home/username/.ssh/id_rsa)

    今後、次のコマンドにリモートパスワードは必要ありません。

    $ scp foo username@remote.host:foo

    ssh-agent のセッションを終了するのに ^D を押します。

    X サーバーの場合、普通の Debian の起動スクリプトは親プロセスとし
    て ssh-agent を実行します。だから ssh-add は1回だけ実行すれば十分
    です。詳細は ssh-agent(1) と ssh-add(1) を参照下さい。

6.3.6. リモートホストからメールを送信する

    適切な DNS 設定がなされたサーバに SSH アカウントを持っている場合
    、リモートサーバから真に送られたメールとして、ワークステーション
    からメールを送信することができます。

    $ ssh username@example.org /usr/sbin/sendmail -bm -ti -f "username@example.org" < mail_data.txt

6.3.7. SMTP/POP3 トンネルをするためのポートフォワーディング

    ssh を通して localhost のポート 4025 から remote-server のポート
    25 へと、localhost のポート 4110 から remote-server のポート 110
    へと接続するパイプを設定するには、ローカルホスト上で以下のように
    実行します。

    # ssh -q -L 4025:remote-server:25 4110:remote-server:110 username@remote-server

    このようにするとインターネット経由で SMTP/POP3 サーバーへとセキュ
    アーに接続できます。リモートホストの "/etc/ssh/sshd_config" 中の
    "AllowTcpForwarding" エントリーを "yes" と設定します。

6.3.8. SSH 上のリモートシステムをシャットダウンする方法

    "shutdown -h now" (「システムをシャットダウンする方法」を参照下さ
    い) を実行しているプロセスを at(1) コマンド (「タスク1回実行のス
    ケジュール」を参照下さい) を使って以下のようにして SSH が終了する
    ことから守る必要があります。

    # echo "shutdown -h now" | at now

    "shutdown -h now" をscreen(1) (「screen プログラム」を参照下さい)
    セッション中で実行しても同様のことができます。

6.3.9. SSH のトラブルシュート

    問題があるときは設定ファイルのパーミッションを確認し、ssh を"-v"
    オプションとともに実行します。

    root でファイアーウォールと問題を起こした場合には、"-p" オプショ
    ンを使います; こうするとサーバーポートの 1 — 1023 を使うのを回避
    します。

    リモートサイトへの ssh 接続が急に動作し無くなった際は、システム管
    理者による変更、特に可能性が高いのはシステムメンテナンス中に
    "host_key" が変更された結果かもしれません。実際にこういう状況で誰
    も洒落たハックでリモートホストとしてなりすまそうとしていないこと
    を確認した後に、"host_key" エントリーをローカルホストの "~/.ssh/
    known_hosts" から削除すると再び接続できるようになります。

6.4. プリントサーバーとユーティリティー

    旧来の Unix 的システムでは BSD のラインプリンターデーモン (lpd)が
    標準で、古典的フリーソフトウェアーの標準プリント出力フォーマット
    は PostScript (PS) でした。Ghostscript とともに何らかのフィルター
    システムを使うことで non-PostScript プリンターへの印刷が可能にな
    っていました。「Ghostscript」を参照下さい。

    現代的な Debian システムでは Common UNIX Printing System (CUPS)
    がデファクトスタンダードで、現代的なフリーソフトの標準プリント出
    力フォーマットは Portable Document Format (PDF) です。

    CUPS は、インターネット印刷プロトコル (IPP) を使います。IPP は新
    たなクロスプラットフォームの両方向通信能力のあるリモート印刷のデ
    ファクト標準となっています。

    CUPS システムのファイルフォーマット依存の自動変換機能のおかげで、
    どんなデーターでも lpr コマンドに供給すると期待される印刷出力が生
    成されます。(CUPS では、lpr はcups-bsd パッケージをインストールす
    ると有効となります。)

    Debian システムには、プリントサーバーやユーティリティーで留意すべ
    きパッケージがいくつかあります。

    表6.11 プリントサーバーとユーティリティーのリスト

    +---------------------------------------------------------------+
    |       パッケージ        |ポプコ|サイ|ポート |      説明       |
    |                         |  ン  | ズ |       |                 |
    |-------------------------+------+----+-------+-----------------|
    |                         |V:2.1,|    |printer|BSD lpr/lpd (ライ|
    |lpr                      |I:2.5 |378 |(515)  |ンプリンターデー |
    |                         |      |    |       |モン)            |
    |-------------------------+------+----+-------+-----------------|
    |cups                     |V:98, |1088|IPP    |インターネット印 |
    |                         |I:446 |    |(631)  |刷 CUPS サーバー |
    |-------------------------+------+----+-------+-----------------|
    |                         |      |    |       |CUPS 用System V  |
    |                         |      |    |       |プリンターコマン |
    |                         |      |    |       |ド: lp(1) と     |
    |                         |V:118,|    |       |lpstat(1) と     |
    |cups-client              |I:458 |429 |, ,    |lpoptions(1) と  |
    |                         |      |    |       |cancel(1) と     |
    |                         |      |    |       |lpmove(8) と     |
    |                         |      |    |       |lpinfo(8) と     |
    |                         |      |    |       |lpadmin(8) 等    |
    |-------------------------+------+----+-------+-----------------|
    |                         |      |    |       |CUPS 用BSD プリン|
    |                         |V:34, |    |       |ターコマンド: lpr|
    |cups-bsd                 |I:186 |131 |, ,    |(1) と lpq(1) と |
    |                         |      |    |       |lprm(1) と lpc(8)|
    |                         |      |    |       |等               |
    |-------------------------+------+----+-------+-----------------|
    |printer-driver-gutenprint|V:11, |1117|非該当 |CUPS 用のプリンタ|
    |                         |I:56  |    |       |ードライバー     |
    +---------------------------------------------------------------+


    ヒント
   
    CUPS システムはウェッブブラウザーを "http://localhost:631/" に向
    けることで設定できます。

6.5. 他のネットワークアプリケーションサーバー

    他のネットワークアプリケーションサーバーを次に示します。

    表6.12 他のネットワークアプリケーションサーバー

    +---------------------------------------------------------------+
    |   パッケージ    |ポプコ |サイ|プロト|          説明           |
    |                 |  ン   | ズ | コル |                         |
    |-----------------+-------+----+------+-------------------------|
    |telnetd          |V:0.3, |55  |TELNET|TELNET サーバー          |
    |                 |I:1.6  |    |      |                         |
    |-----------------+-------+----+------+-------------------------|
    |nfs-kernel-server|V:47,  |830 |NFS   |Unix 式ファイル共有      |
    |                 |I:55   |    |      |                         |
    |-----------------+-------+----+------+-------------------------|
    |samba            |V:109, |5053|SMB   |Windows のファイルとプリ |
    |                 |I:123  |    |      |ンター共有               |
    |-----------------+-------+----+------+-------------------------|
    |netatalk         |V:0.74,|933 |ATP   |Apple/Mac のファイルとプ |
    |                 |I:0.97 |    |      |リンター共有 (AppleTalk) |
    |-----------------+-------+----+------+-------------------------|
    |proftpd-basic    |V:3.9, |452 |FTP   |汎用ファイルダウンロード |
    |                 |I:9.2  |    |      |                         |
    |-----------------+-------+----+------+-------------------------|
    |apache2          |V:178, |586 |HTTP  |汎用ウェッブサーバー     |
    |                 |I:218  |    |      |                         |
    |-----------------+-------+----+------+-------------------------|
    |squid            |V:9.3, |9358|, ,   |汎用ウェッブプロキシサー |
    |                 |I:9.9  |    |      |バー                     |
    |-----------------+-------+----+------+-------------------------|
    |bind9            |V:35,  |885 |DNS   |他のホストの IP アドレス |
    |                 |I:37   |    |      |                         |
    |-----------------+-------+----+------+-------------------------|
    |kea              |I:0.57 |244 |DHCP  |クライアント自身の IP ア |
    |                 |       |    |      |ドレス                   |
    +---------------------------------------------------------------+


    コモンインターネットファイルシステムプロトコル (CIFS) はサーバー
    メッセージブロック (SMB) と同じプロトコルで Microsoft Windows で
    広く使われています。

    ヒント
   
    サーバーシステムの統合には、「集中システム管理」を参照下さい。

    ヒント

    ホスト名の解決は通常 DNS サーバーによって提供されます。ホストの
    IP アドレスが DHCP によって動的にアサインされる場合には Debian
    wiki 上のDDNS ページに書かれているようにして bind9 と kea を使い
    ホスト名解決のためのダイナミック DNS が設定できます。

    ヒント

    Debian アーカイブの全内容のローカルのミラーサーバーを使うより、
    squid 等のプロキシサーバーを使う方がはるかにバンド幅を節約上では
    るかに効率的です。

6.6. 他のネットワークアプリケーションクライアント

    他のネットワークアプリケーションクライアントを次に示します。

    表6.13 他のネットワークアプリケーションクライアント

    +---------------------------------------------------------------+
    |    パッケージ    |ポプコ|サイ |プロトコル|        説明        |
    |                  |  ン  | ズ  |          |                    |
    |------------------+------+-----+----------+--------------------|
    |netcat-traditional|V:50, |139  |TCP/IP    |TCP/IP 用万能ツール |
    |                  |I:904 |     |          |(スイス陸軍ナイフ)  |
    |------------------+------+-----+----------+--------------------|
    |                  |      |     |          |IPv6 やプロキシや   |
    |                  |V:22, |     |          |Unix ソケットサポー |
    |netcat-openbsd    |I:120 |105  |TCP/IP    |ト付きの TCP/IP 用万|
    |                  |      |     |          |能ツール (スイス陸軍|
    |                  |      |     |          |ナイフ)             |
    |------------------+------+-----+----------+--------------------|
    |                  |      |     |          |セキュアソケットレイ|
    |openssl           |V:847,|2532 |SSL       |ヤー (SSL) のバイナ |
    |                  |I:996 |     |          |リーと関連する暗号化|
    |                  |      |     |          |ツール              |
    |------------------+------+-----+----------+--------------------|
    |stunnel4          |V:6.2,|24   |, ,       |万能 SSL ラッパー   |
    |                  |I:9.3 |     |          |                    |
    |------------------+------+-----+----------+--------------------|
    |telnet            |V:11, |55   |TELNET    |TELNET クライアント |
    |                  |I:215 |     |          |                    |
    |------------------+------+-----+----------+--------------------|
    |nfs-common        |V:150,|1139 |NFS       |Unix 式ファイル共有 |
    |                  |I:197 |     |          |                    |
    |------------------+------+-----+----------+--------------------|
    |smbclient         |V:26, |2088 |SMB       |MS Windows のファイ |
    |                  |I:206 |     |          |ルとプリンター共有  |
    |------------------+------+-----+----------+--------------------|
    |                  |      |     |          |リモートの MS       |
    |cifs-utils        |V:33, |351  |, ,       |Windows ファイルをマ|
    |                  |I:119 |     |          |ウントやアンマウント|
    |                  |      |     |          |するコマンド        |
    |------------------+------+-----+----------+--------------------|
    |wget              |V:185,|3784 |HTTP と   |ウェッブダウンローダ|
    |                  |I:982 |     |FTP       |ー                  |
    |------------------+------+-----+----------+--------------------|
    |curl              |V:244,|512  |, ,       |, ,                 |
    |                  |I:716 |     |          |                    |
    |------------------+------+-----+----------+--------------------|
    |transmission-gtk  |V:11, |6259 |BitTorrent|BitTorrent クライア |
    |                  |I:156 |     |          |ント (GTK)          |
    |------------------+------+-----+----------+--------------------|
    |transmission-qt   |V:0.7,|6213 |, ,       |BitTorrent クライア |
    |                  |I:2.5 |     |          |ント (Qt)           |
    |------------------+------+-----+----------+--------------------|
    |ktorrent          |V:1.4,|5031 |, ,       |BitTorrent クライア |
    |                  |I:5.1 |     |          |ント (Qt)           |
    |------------------+------+-----+----------+--------------------|
    |qbittorrent       |V:8,  |15261|, ,       |BitTorrent クライア |
    |                  |I:22  |     |          |ント (Qt)           |
    |------------------+------+-----+----------+--------------------|
    |                  |V:128,|     |          |bind9 由来の host(1)|
    |bind9-host        |I:940 |137  |DNS       |コマンド、"Priority:|
    |                  |      |     |          |standard"           |
    |------------------+------+-----+----------+--------------------|
    |                  |V:5,  |     |          |bind 由来の dig(1)  |
    |dnsutils          |I:161 |23   |, ,       |コマンド、"Priority:|
    |                  |      |     |          |standard"           |
    |------------------+------+-----+----------+--------------------|
    |ldap-utils        |V:10, |782  |LDAP      |LDAP サーバーからデ |
    |                  |I:58  |     |          |ーター獲得          |
    +---------------------------------------------------------------+


6.7. システムデーモンの診断

    telnet プログラムを使うとシステムデーモンへの手動接続とその診断が
    できます。

    プレーンな POP3 サービスをテストするには、以下のようにします。

    $ telnet mail.ispname.net pop3

    一部の ISP が提供する TLS/SSL を有効にした POP3 サービスをテスト
    するには、telnet-ssl か openssl パッケージによる、TLS/SSL を有効
    にした telnet クライアントが必要です。

    $ telnet -z ssl pop.gmail.com 995

    $ openssl s_client -connect pop.gmail.com:995

    以下の RFC は各システムデーモンに関する必要な知見を提供します。

    表6.14 よく使われる RFC のリスト

    +---------------------------------------------------------------+
    |       RFC        |                    説明                    |
    |------------------+--------------------------------------------|
    |rfc1939 と rfc2449|POP3 サービス                               |
    |------------------+--------------------------------------------|
    |rfc3501           |IMAP4 サービス                              |
    |------------------+--------------------------------------------|
    |rfc2821 (rfc821)  |SMTP サービス                               |
    |------------------+--------------------------------------------|
    |rfc2822 (rfc822)  |メールファイルフォーマット                  |
    |------------------+--------------------------------------------|
    |rfc2045           |Multipurpose Internet Mail Extensions (MIME)|
    |------------------+--------------------------------------------|
    |rfc819            |DNS サービス                                |
    |------------------+--------------------------------------------|
    |rfc2616           |HTTP サービス                               |
    |------------------+--------------------------------------------|
    |rfc2396           |URI 定義                                    |
    +---------------------------------------------------------------+


    "/etc/services" の中にポートの使用され方が記載されています。

第7章 GUI システム

7.1. GUI デスクトップ環境

    Debian システム上のフル機能の GUI デスクトップ環境にはいくつかの
    選択肢があります。

    表7.1 デスクトップ環境のリスト

    +---------------------------------------------------------------+
    |      タスクパッケージ      |ポプ |サイ|         説明          |
    |                            |コン | ズ |                       |
    |----------------------------+-----+----+-----------------------|
    |task-gnome-desktop          |I:190|9   |GNOME デスクトップ環境 |
    |----------------------------+-----+----+-----------------------|
    |task-xfce-desktop           |I:88 |9   |Xfce デスクトップ環境  |
    |----------------------------+-----+----+-----------------------|
    |task-kde-desktop            |I:93 |6   |KDE Plasma デスクトップ|
    |                            |     |    |環境                   |
    |----------------------------+-----+----+-----------------------|
    |task-mate-desktop           |I:32 |9   |MATE デスクトップ環境  |
    |----------------------------+-----+----+-----------------------|
    |task-cinnamon-desktop       |I:37 |9   |Cinnamon デスクトップ環|
    |                            |     |    |境                     |
    |----------------------------+-----+----+-----------------------|
    |task-lxde-desktop           |I:20 |9   |LXDE デスクトップ環境  |
    |----------------------------+-----+----+-----------------------|
    |task-lxqt-desktop           |I:16 |9   |LXQt デスクトップ環境  |
    |----------------------------+-----+----+-----------------------|
    |task-gnome-flashback-desktop|I:9.8|6   |GNOME Flashback デスク |
    |                            |     |    |トップ環境             |
    +---------------------------------------------------------------+


    ヒント

    タスクメタパッケージによって選ばれた依存パッケージは、Debian
    unstable/testing 環境下で最新のパッケージ移行状態と同期していない
    かもしれません。task-gnome-desktop の場合、以下のようにパッケージ
    選択を調整する必要があるかもしれません:

      * sudo aptitude -u として aptitude(8) をスタートします。

      * カーサを "Tasks" に移動し "Enter" を押します。

      * カーサを "End-user" に移動し "Enter" を押します。

      * カーサを "GNOME" に移動し "Enter" を押します。
   
      * カーサを task-gnome-desktop に移動し "Enter" を押します。

      * カーサを "Depends" に移動し "m" (手動で manually 選択) を押し
        ます。

      * カーサを "Recommends" に移動し "m" (手動で manually 選択) を
        押します。

      * カーサを "task-gnome-desktop に移動し "-" を押します。 (drop)

      * パッケージ間コンフリクトを引き起こしている問題あるパッケージ
        を落としながら選択されたパッケージを調整します。

      * "g" を押してインストールを開始します。

    本章は Debian のデフォルトデスクトップ環境にフォーカスします:
    wayland 上の GNOME を提供する task-gnome-desktop。

7.2. GUI 通信プロトコル

    GNOME デスクトップで使用されうる GUI 通信プロトコル:

      * Wayland (ディスプレイサーバプロトコル) (ネイティブ)
   
      * X Window システムコアプロトコル (xwayland 経由)

    Wayland アーキテクチャーは X Window アーキテクチャーとどう違うの
    かという freedesktop.org サイトを確認して下さい。

    ユーザー視点からは、相違点は以下のように口語的にまとめられます。

      * Wayland は同一ホスト上の GUI 通信プロトコル: 新規、簡単、高速
        、非 setuid root のバイナリー
   
      * X Window はネットワーク対応可能な GUI 通信プロトコル: 伝統的
        、複雑、低速、setuid root のバイナリー

    Wayland プロトコルを使うアプリケーションにとって、その表示内容へ
    のリモートホストからのアクセスは VNC や RDP によって支えられてい
    ます。「リモートデスクトップ」を参照下さい。

    現代的な X サーバーは MIT 共有メモリー拡張機能があり、ローカルの
    X クライアントとローカルの共有メモリーを使って通信します。これは
    ネットワーク透過性の Xlib プロセス間通信チャンネルをバイパスし性
    能が得られるようにしています。この状況がローカル限定の通信プロト
    コルの Wayland が作られた背景です。

    GNOME ターミナルから起動された xeyes プログラムを使うことで、各
    GUI アプリケーションが使う GUI コミュニケーションプロトコルが確認
    できます。

     $ xeyes

      * Wayland 表示サーバープロトコルを使う "GNOME ターミナル" のよ
        うなアプリケーション上にマウスカーソールがある際には、目玉は
        マウスカーソールにつれて動きません。
   
      * X Window システムコアプロトコルを使う "xterm" のようなアプリ
        ケーション上にマウスカーソールがある際には、X Window アーキテ
        クチャーの分離不十分性がさらされ目玉はマウスカーソールにつれ
        て動きます。

    2021年4月の時点で、GNOME や LibreOffice (LO) アプリケーション等の
    多くの人気ある GUI アプリケーションが Wayland 表示サーバープロト
    コルに移行しました。xterm や gitk や chromium や firefox や gimp
    や dia や KDE アプリケーションが、未だに X Window システムコアプ
    ロトコルを使っていると見受けます。

    注記

    Wayland 上の xwayland とネイティブの X Window システムの両方とも
    、古い X サーバー設定ファイル "/etc/X11/xorg.conf" はシステム上に
    存在するべきではありません。画像や入力デバイスは DRM や KMS や
    udev によるカーネルによって設定されます。ネイティブの X Window サ
    ーバーはこれらを使うように書き換えられました。Linux カーネル文書
    の"modedb デフォルトビデオモードサポート" を参照下さい。

7.3. GUI インフラストラクチャー

    Wayland 環境上の GNOME のための特記すべき GUI インフラパッケージ
    は以下です。

    表7.2 データーインフラパッケージのリスト

    +---------------------------------------------------------------+
    |                           |      |パッ |                      |
    |        パッケージ         |ポプコ|ケー |         説明         |
    |                           |  ン  |ジサ |                      |
    |                           |      |イズ |                      |
    |---------------------------+------+-----+----------------------|
    |mutter                     |V:1,  |215  |GNOME の mutter ウィン|
    |                           |I:24  |     |ドウマネージャ [自動] |
    |---------------------------+------+-----+----------------------|
    |xwayland                   |V:252,|2540 |wayland 上で実行される|
    |                           |I:332 |     |X サーバー [自動]     |
    |---------------------------+------+-----+----------------------|
    |                           |      |     |GNOME のための        |
    |gnome-remote-desktop       |V:135,|2444 |PipeWire を使うリモー |
    |                           |I:238 |     |トデスクトップデーモン|
    |                           |      |     |[自動]                |
    |---------------------------+------+-----+----------------------|
    |gnome-tweaks               |V:16, |1145 |GNOME のための高度な構|
    |                           |I:231 |     |成設定                |
    |---------------------------+------+-----+----------------------|
    |gnome-shell-extension-prefs|V:7,  |72   |GNOME シェル拡張を有効|
    |                           |I:126 |     |化・無効化するツール  |
    +---------------------------------------------------------------+


    ここで、"[自動]" は task-gnome-desktop がインストールされた際に自
    動的にインストールされるパッケージの意味です。

    ヒント

    gnome-tweaks は不可欠の設定ユーティリティーです。例えば:

      * "General" から音量ボリュームの "Over-Amplification" を強制で
        きます。

      * "Keyboard & Mouse" -> "Keyboard" -> "Additional Layout
        Option" から "Caps" が "Esc" になるよう強制できます。

    ヒント

    GNOME デスクトップ環境の詳細機能は、Super キー打鍵後、"settings"
    か "tweaks" か "extensions" とタイプして起動されるユーティリティ
    ーで設定できます。

7.4. GUI アプリケーション

    有用な GUI アプリケーションの多くは Debian で利用できるようになり
    ました。対応する機能が GNOME デスクトップ環境下では利用できないた
    め、scribus (KDE) のようなソフトウェアを GNOME デスクトップ環境に
    インストールするのはまったく問題ありません。しかしながら、機能が
    重複するパッケージをインストールしすぎるとあなたのシステムが散ら
    かってしまいます。

    著者の目に止まった GUI アプリケーションのリストを記します。

    表7.3 特筆すべき GUI アプリケーションのリスト

    +---------------------------------------------------------------+
    |                   |ポプコ |パッケ|      |                     |
    |    パッケージ     |  ン   |ージサ|タイプ|        説明         |
    |                   |       | イズ |      |                     |
    |-------------------+-------+------+------+---------------------|
    |evolution          |V:26,  |488   |GNOME |個人情報管理 (グルー |
    |                   |I:228  |      |      |プウエアと電子メール)|
    |-------------------+-------+------+------+---------------------|
    |thunderbird        |V:42,  |274189|GTK   |Eメールクライアント  |
    |                   |I:105  |      |      |(Mozilla Thunderbird)|
    |-------------------+-------+------+------+---------------------|
    |kontact            |V:1,   |2305  |KDE   |個人情報管理 (グルー |
    |                   |I:11   |      |      |プウエアと電子メール)|
    |-------------------+-------+------+------+---------------------|
    |libreoffice-writer |V:98,  |33285 |LO    |ワードプロセッサ     |
    |                   |I:422  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |abiword            |V:0.9, |3596  |GNOME |ワードプロセッサ     |
    |                   |I:4.9  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |calligrawords      |V:0.3, |6932  |KDE   |ワードプロセッサ     |
    |                   |I:3.1  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |                   |V:1,   |      |      |PDF ファイルを編集す |
    |scribus            |I:13   |32423 |KDE   |るためのデスクトップ |
    |                   |       |      |      |パブリッシング       |
    |-------------------+-------+------+------+---------------------|
    |glabels            |V:0.4, |1283  |GNOME |ラベルエディター     |
    |                   |I:2.7  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |libreoffice-calc   |V:94,  |28299 |LO    |スプレッドシート     |
    |                   |I:419  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |gnumeric           |V:3,   |9958  |GNOME |スプレッドシート     |
    |                   |I:11   |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |calligrasheets     |V:0.2, |13593 |KDE   |スプレッドシート     |
    |                   |I:2.0  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |libreoffice-impress|V:81,  |2443  |LO    |プレゼンテーション   |
    |                   |I:417  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |calligrastage      |V:0.1, |6011  |KDE   |プレゼンテーション   |
    |                   |I:1.9  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |libreoffice-base   |V:20,  |4984  |LO    |データーベース管理   |
    |                   |I:71   |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |kexi               |V:0.05,|7565  |KDE   |データーベース管理   |
    |                   |I:0.76 |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |libreoffice-draw   |V:82,  |10995 |LO    |ベクトル画像エディタ |
    |                   |I:418  |      |      |ー (ドロー)          |
    |-------------------+-------+------+------+---------------------|
    |inkscape           |V:12,  |112538|GNOME |ベクトル画像エディタ |
    |                   |I:78   |      |      |ー (ドロー)          |
    |-------------------+-------+------+------+---------------------|
    |karbon             |V:0.2, |3958  |KDE   |ベクトル画像エディタ |
    |                   |I:2.4  |      |      |ー (ドロー)          |
    |-------------------+-------+------+------+---------------------|
    |dia                |V:1,   |3802  |GTK   |フローチャートやダイ |
    |                   |I:17   |      |      |アグラムエディター   |
    |-------------------+-------+------+------+---------------------|
    |gimp               |V:44,  |32791 |GTK   |ビットマップ画像エデ |
    |                   |I:216  |      |      |ィター (ペイント)    |
    |-------------------+-------+------+------+---------------------|
    |shotwell           |V:14,  |6334  |GTK   |デジタル写真オーガナ |
    |                   |I:246  |      |      |イザー               |
    |-------------------+-------+------+------+---------------------|
    |digikam            |V:1.5, |324   |KDE   |デジタル写真オーガナ |
    |                   |I:8.3  |      |      |イザー               |
    |-------------------+-------+------+------+---------------------|
    |darktable          |V:4,   |35876 |GTK   |写真家のためのライト |
    |                   |I:11   |      |      |ボックスと暗室       |
    |-------------------+-------+------+------+---------------------|
    |planner            |V:0.2, |1400  |GNOME |プロジェクト管理     |
    |                   |I:4.4  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |calligraplan       |V:0.2, |23545 |KDE   |プロジェクト管理     |
    |                   |I:3.0  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |gnucash            |V:2.2, |29455 |GNOME |個人会計             |
    |                   |I:7.0  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |homebank           |V:0.3, |3194  |GTK   |個人会計             |
    |                   |I:1.6  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |lilypond           |V:0.7, |16924 |-     |音楽用タイプセッター |
    |                   |I:5.5  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |kmymoney           |V:0.5, |18945 |KDE   |個人会計             |
    |                   |I:1.9  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |                   |V:1,   |      |Qt ア |コンピューター支援設 |
    |librecad           |I:14   |9164  |プリ  |計 (CAD) システム    |
    |                   |       |      |      |(2D)                 |
    |-------------------+-------+------+------+---------------------|
    |                   |V:1,   |      |Qt ア |コンピューター支援設 |
    |freecad            |I:21   |112   |プリ  |計 (CAD) システム    |
    |                   |       |      |      |(3D)                 |
    |-------------------+-------+------+------+---------------------|
    |kicad              |V:3,   |212240|GTK   |電気回路図と PCB デザ|
    |                   |I:15   |      |      |インソフトウェアー   |
    |-------------------+-------+------+------+---------------------|
    |xsane              |V:9,   |1512  |GTK   |スキャナーのフロント |
    |                   |I:129  |      |      |エンド               |
    |-------------------+-------+------+------+---------------------|
    |libreoffice-math   |V:76,  |1912  |LO    |数式エディター       |
    |                   |I:421  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |calibre            |V:7,   |65193 |KDE   |e-book コンバーターと|
    |                   |I:24   |      |      |ライブラリーの管理   |
    |-------------------+-------+------+------+---------------------|
    |fbreader           |V:0.7, |3827  |GTK   |e-book リーダー      |
    |                   |I:5.8  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |evince             |V:72,  |942   |GNOME |文書 (pdf) ビューワー|
    |                   |I:285  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |okular             |V:33,  |4419  |KDE   |文書 (pdf) ビューワー|
    |                   |I:131  |      |      |                     |
    |-------------------+-------+------+------+---------------------|
    |                   |V:30,  |      |純粋な|                     |
    |x11-apps           |I:445  |2461  |X アプ|xeyes(1) など。      |
    |                   |       |      |リ    |                     |
    |-------------------+-------+------+------+---------------------|
    |                   |V:225, |      |純粋な|xev(1), xwininfo(1)  |
    |x11-utils          |I:555  |651   |X アプ|等。                 |
    |                   |       |      |リ    |                     |
    +---------------------------------------------------------------+


7.5. ユーザーディレクトリー

    デスクトップ環境が使う、"~/Desktop"、"~/Documents"、...、のような
    ユーザーディレクトリーのデフォールトの名前はシステムのインストー
    ルが使ったロケールに依存します。これらは英語環境の名前に以下でリ
    セットできます:

     $ LANGUAGE=C xdg-user-dirs-update --force

    そしてすべてのデーターを新ディレクトリーに手動で移動させます。
    xdg-user-dirs-update(1) を参照下さい。

    それらは "~/.config/user-dirs.dirs" を編集することで如何なる名前
    にも設定できます。user-dirs.dirs(5) を参照下さい。

7.6. フォント

    多くの有用なスケーラブルフォントが Debian 上のユーザーに使えるよ
    うになっています。ユーザーの関心事は如何に重複を回避するかとか、
    如何にインストール済みフォントを無効化するかです。こうしないとあ
    なたの GUI アプリケーションのメニューが無用なフォントの選択肢で一
    杯になります。

    Debian システムは FreeType 2.0 ライブラリーを使って多くのスケーラ
    ブルフォントフォーマットを画面や印刷用にラスター化します:

      * Type 1 (PostScript) フォント、3次ベジェ曲線を使用 (ほぼ廃れた
        形式)
   
      * TrueType フォント、2次ベジェ曲線を使用 (よい選択肢)

      * OpenType フォント、3次ベジェ曲線を使用 (最良の選択肢)

7.6.1. 基本的なフォント

    文字の大きさやグリフ提供範囲に関する明確な理解に基づき、適切なス
    ケーラブルフォントをユーザーが選択する助けとなることを願って、以
    下のテーブルを編纂しました。ほとんどのフォントは全てのラテン文字
    とギリシャ文字とキリル文字をカバーします。最終的にアクティベート
    されるフォントの選択はあなたの美学によっても影響されます。これら
    の文字は画面表示にも紙への印刷にも使えます。

    表7.4 特記すべき TrueType や OpenType フォントのリスト

    +---------------------------------------------------------------+
    |                         |      |     |サ |  |  |              |
    |                         |ポプコ|サイ |ン |セ|等|フォントについ|
    |       パッケージ        |  ン  | ズ  |セ |リ|幅|   ての注釈   |
    |                         |      |     |リ |フ|  |              |
    |                         |      |     |フ |  |  |              |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |V:177,|     |   |  |  |Cantarell     |
    |fonts-cantarell          |I:290 |224  |59 |- |- |(GNOME 3, 画面|
    |                         |      |     |   |  |  |表示)         |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |      |     |   |  |  |Noto フォント |
    |fonts-noto               |I:151 |30   |61 |63|40|(Google,      |
    |                         |      |     |   |  |  |multi-lingual |
    |                         |      |     |   |  |  |with CJK)     |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |      |     |   |  |  |DejaVu (GNOME |
    |                         |      |     |   |  |  |2,            |
    |fonts-dejavu             |I:388 |34   |58 |68|40|MCM:Verdana,  |
    |                         |      |     |   |  |  |拡張 Bitstream|
    |                         |      |     |   |  |  |Vera)         |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |      |     |   |  |  |LibreOffice 用|
    |fonts-liberation2        |V:49, |15   |56 |60|40|の Liberation |
    |                         |I:180 |     |   |  |  |フォント (Red |
    |                         |      |     |   |  |  |Hat, MCMATC)  |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |      |     |   |  |  |Chrome OS:    |
    |                         |V:20, |     |   |  |  |Arimo, Tinos  |
    |fonts-croscore           |I:37  |5260 |56 |60|40|と Cousine    |
    |                         |      |     |   |  |  |(Google,      |
    |                         |      |     |   |  |  |MCMATC)       |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |      |     |   |  |  |Chrome OS:    |
    |fonts-crosextra-carlito  |V:20, |2696 |57 |- |- |Carlito       |
    |                         |I:93  |     |   |  |  |(Google,      |
    |                         |      |     |   |  |  |MCM:Calibri ) |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |      |     |   |  |  |Chrome OS:    |
    |                         |      |     |   |  |  |Caladea       |
    |fonts-crosextra-caladea  |V:12, |347  |-  |55|- |(Google,      |
    |                         |I:87  |     |   |  |  |MCM:Cambria ) |
    |                         |      |     |   |  |  |(Latin文字の  |
    |                         |      |     |   |  |  |み)           |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |V:78, |     |   |  |  |GNU FreeFont  |
    |fonts-freefont-ttf       |I:204 |14460|57 |59|40|(拡張 URW     |
    |                         |      |     |   |  |  |Nimbus)       |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |      |     |   |  |  |Debian        |
    |                         |V:207,|     |   |  |  |task-desktop, |
    |fonts-quicksand          |I:451 |392  |56 |- |- |Quicksand (画 |
    |                         |      |     |   |  |  |面表示, Latin |
    |                         |      |     |   |  |  |文字のみ)     |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |      |     |   |  |  |ソースコードの|
    |                         |V:33, |     |   |  |40|ためにデザイン|
    |fonts-hack               |I:136 |2507 |-  |- |P |されたタイプフ|
    |                         |      |     |   |  |  |ェース Hack   |
    |                         |      |     |   |  |  |(Facebook)    |
    |-------------------------+------+-----+---+--+--+--------------|
    |fonts-sil-gentiumplus    |I:29  |14345|-  |54|- |Gentium SIL   |
    |-------------------------+------+-----+---+--+--+--------------|
    |fonts-sil-charis         |V:1,  |6704 |-  |59|- |Charis SIL    |
    |                         |I:28  |     |   |  |  |              |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |      |     |   |  |  |URW Nimbus    |
    |                         |V:185,|     |   |  |  |(Nimbus Sans, |
    |fonts-urw-base35         |I:531 |15558|56 |60|40|Roman No. 9 L,|
    |                         |      |     |   |  |  |Mono L,       |
    |                         |      |     |   |  |  |MCAHTC)       |
    |-------------------------+------+-----+---+--+--+--------------|
    |fonts-ubuntu             |V:2.1,|4339 |58 |- |33|Ubuntu フォン |
    |                         |I:4.9 |     |   |  |P |ト (画面表示) |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |V:0.3,|     |   |  |  |クールなレトロ|
    |fonts-terminus           |I:3.9 |451  |-  |- |33|なターミナルフ|
    |                         |      |     |   |  |  |ォント        |
    |-------------------------+------+-----+---+--+--+--------------|
    |                         |      |     |   |  |  |Microsoft の非|
    |                         |V:1,  |     |   |  |  |フリーフォント|
    |ttf-mscorefonts-installer|I:41  |85   |56?|60|40|のダウンローダ|
    |                         |      |     |   |  |  |ー (以下を参照|
    |                         |      |     |   |  |  |下さい)       |
    +---------------------------------------------------------------+


    ここで:

      * "MCM" は "metric compatible with fonts provided by Microsoft"
        の意味です。

      * "MCMATC" は "metric compatible with fonts provided by
        Microsoft: Arial, Times New Roman, Courier New" の意味です。

      * "MCAHTC" は "metric compatible with fonts provided by Adobe:
        Helvetica, Times, Courier" の意味です。

      * フォントタイプ列の数字は同一ポイントサイズのフォントに関する
        、"M" の概算相対幅を表します。

      * モノフォントタイプ列の "P" は、"0"/"O" と "1"/"I"/"l" がはっ
        きり区別しやすいというプログラミング用としての使い勝手の良さ
        を表します。

      * ttf-mscorefonts-installer パッケージはマイクロソフトの "Core
        fonts for the Web" をダウンロードして、Arial と Times New
        Roman と Courier New と Verdana と ... をインストールします。
        こうしてインストールされるフォントデーターは non-free のデー
        ターです。

    多くのフリーの Latin フォントは、URW Nimbus ファミリーとか
    Bitstream Veraに、それらへの系統をたどれます。

    ヒント

    あなたのロケールが、上記のフォントでうまくカバーできないフォント
    を必要とする場合、aptitude を使って "Tasks" -> "Localization" の
    下にリストされたタスクパッケージをチェックしましょう。ローカリゼ
    ーションタスク中の "Depends:" か "Recommends:" としてリストされた
    フォントパッケージが主要候補です。

7.6.2. フォントのラスタ化

    Debian は FreeType をフォントをラスタ化に使用します。そのフォント
    選択インフラは Fontconfig フォント設定ライブラリーで提供されます
    。

    表7.5 有用フォント環境と関連パッケージのリスト

    +---------------------------------------------------------------+
    |     パッケージ      |ポプコン |サイ|           説明           |
    |                     |         | ズ |                          |
    |---------------------+---------+----+--------------------------|
    |libfreetype6         |V:584,   |1022|FreeType フォントラスター |
    |                     |I:997    |    |化ライブラリー            |
    |---------------------+---------+----+--------------------------|
    |libfontconfig1       |V:575,   |344 |Fontconfig、フォント設定ラ|
    |                     |I:815    |    |イブラリー                |
    |---------------------+---------+----+--------------------------|
    |fontconfig           |V:467,   |415 |fc-*: Fontconfig の CLI コ|
    |                     |I:696    |    |マンド                    |
    |---------------------+---------+----+--------------------------|
    |font-manager         |V:2.3,   |1116|Font Manager: Fontconfig  |
    |                     |I:6.7    |    |の GUI コマンド           |
    |---------------------+---------+----+--------------------------|
    |nautilus-font-manager|V:0.09,  |38  |Font ManagerのNautilus拡張|
    |                     |I:0.40   |    |                          |
    +---------------------------------------------------------------+


    ヒント

    fonts-noto* のようないくつかのフォントパッケージは多すぎるフォン
    トインストールします。普通の使用状況下では、いくつかのフォントパ
    ッケージをインストールはしながら無効化したいかもしれません。いく
    つかの Unicode コードポイントでは漢統一 (Han unification) のため
    複数のグリフが期待されていて、Fontconfig ライブラリーが設定がまだ
    だと希望しないグリフが表示されかもしれません。最も気になるケース
    は CJK 国間の "U+3001 IDEOGRAPHIC COMMA" と "U+3002 IDEOGRAPHIC
    FULL STOP" です。フォントマネージャー GUI (font-manager) を使いフ
    ォントの可用性を設定することによりこのような問題状況は簡単に回避
    できます。

    フォント設定状態は以下のようにしても確認できます。

      * fontconfig のフォントデフォルトに関しては "fc-match(1)"
   
      * fontconfig で利用可能なフォントに関しては "fc-list(1)"

    テキストエディターからフォント設定状態を設定できますが、これは簡
    単ではありません。fonts.conf(5) を参照下さい。

7.7. サンドボックス

    Linux 上の主に GUI アプリケーションの多くはバイナリー形式で非
    Debian ソースから利用可能です。

      * AppImage -- どこででも実行できる Linux アプリ

      * FLATHUB -- Linux 用アプリ、ここで使える

      * snapcraft -- Linux 用アプリストアー

    警告
   
    これらのサイトからのバイナリーはプロプライエタリーな non-free ソ
    フトウェアーパッケージが含まれているかもしれません。

    各アプリのアップストリームデベロッパーが当該アプリに使っている本
    来のライブラリーの組み合わせを Debian が提供するライブラリーと独
    立にアプリに提供することを可能にするので、Debian を使うフリーソフ
    トウェアー愛好家にとってもこれらのバイナリー形式ディストリビュー
    ションには一定の存在意義があります。

    外部バイナリーを実行する本質的リスクは、Linux の現代的なセキュリ
    ティー機能を利用するサンドボックス環境を使うことで低減できます(「
    Linux のセキュリティ機能」を参照下さい)。

      * AppImage やいくつかのアップストリームサイトからのバイナリーに
        関しては、手動設定の下で firejail を実行します。

      * FLATHUB からのバイナリーに関しては、 Flatpak の中で実行します
        。(手動設定不要です。)

      * snapcraf からのバイナリーに関しては、 Snap の中で実行します。
        (手動設定不要です。デーモンプログラムとコンパチブルです。)

    xdg-desktop-portal パッケージは共通のデスクトップ機能への標準化さ
    れた API を提供します。 xdg-desktop-portal (flatpak) や
    xdg-desktop-portal (snap) を参照下さい。

    表7.6 特記すべきサンドボックス環境や関連のパッケージのリスト

    +---------------------------------------------------------------+
    |         パッケージ          |ポプコ|サイ |        説明        |
    |                             |  ン  | ズ  |                    |
    |-----------------------------+------+-----+--------------------|
    |                             |      |     |デスクトップアプリ用|
    |flatpak                      |V:105,|9080 |の Flatpak アプリケ |
    |                             |I:111 |     |ーションデプロイメン|
    |                             |      |     |トフレームワーク    |
    |-----------------------------+------+-----+--------------------|
    |                             |V:29, |     |GNOME ソフトウェアー|
    |gnome-software-plugin-flatpak|I:41  |283  |への Flatpak サポー |
    |                             |      |     |ト                  |
    |-----------------------------+------+-----+--------------------|
    |                             |V:61, |     |snap パッケージを有 |
    |snapd                        |I:65  |76444|効化するデーモンやツ|
    |                             |      |     |ール                |
    |-----------------------------+------+-----+--------------------|
    |gnome-software-plugin-snap   |V:1.5,|145  |GNOME ソフトウェアー|
    |                             |I:2.3 |     |への Snap サポート  |
    |-----------------------------+------+-----+--------------------|
    |                             |V:366,|     |Flatpak や Snap デス|
    |xdg-desktop-portal           |I:436 |2291 |クトップインテグレー|
    |                             |      |     |ションポータル      |
    |-----------------------------+------+-----+--------------------|
    |                             |V:332,|     |gtk 用の            |
    |xdg-desktop-portal-gtk       |I:434 |715  |xdg-desktop-portal  |
    |                             |      |     |バックエンド (GNOME)|
    |-----------------------------+------+-----+--------------------|
    |                             |V:79, |     |Qt 用の             |
    |xdg-desktop-portal-kde       |I:110 |3027 |xdg-desktop-portal  |
    |                             |      |     |バックエンド (KDE)  |
    |-----------------------------+------+-----+--------------------|
    |                             |      |     |wltools 用の        |
    |xdg-desktop-portal-wlr       |V:2.1,|159  |xdg-desktop-portal  |
    |                             |I:6.3 |     |バックエンド        |
    |                             |      |     |(Wayland)           |
    |-----------------------------+------+-----+--------------------|
    |                             |      |     |AppImage に用いる   |
    |firejail                     |V:1.2,|1827 |SUID のセキュリティ |
    |                             |I:4.4 |     |ーサンドボックスプロ|
    |                             |      |     |グラム firejail     |
    +---------------------------------------------------------------+


    このサンドボックス環境技術はアプリが制御されたリソースアクセス下
    で実行されるスマートフォンの OS 上のアプリと非常に似ています。

    ウエッブブラウザーのようないくつかの大きな GUI アプリも、より安全
    にするために内部的にサンドボックス環境技術を使います。

7.8. リモートデスクトップ

    表7.7 特記すべきリモートアクセスサーバーのリスト

    Wayland プロトコルを使いリモートホスト上で実行されるデスクトップ
    やアプリへのローカルクライアントからのアクセスは VNC や RDP 経由
    の GNOME リモートデスクトップによってサポートされています。

    全ての QEMU 仮想マシンのデスクトップ環境へのアクセスは SPICE (the
    Simple Protocol for Independent Computing Environments) プロトコ
    ルによってサポートされています。

    +---------------------------------------------------------------+
    |        パッケージ        |ポプコ|サイ|プロトコ|     説明      |
    |                          |  ン  | ズ |   ル   |               |
    |--------------------------+------+----+--------+---------------|
    |                          |V:135,|    |        |GNOME Remote   |
    |gnome-remote-desktop      |I:238 |2444|RDP     |Desktop サーバ |
    |                          |      |    |        |ー             |
    |--------------------------+------+----+--------+---------------|
    |                          |      |    |        |xrdp, リモート |
    |xrdp                      |V:28, |4666|RDP     |デスクトッププ |
    |                          |I:30  |    |        |ロトコル (RDP) |
    |                          |      |    |        |サーバー       |
    |--------------------------+------+----+--------+---------------|
    |                          |      |    |        |x11vnc, リモー |
    |                          |V:8,  |    |RFB     |トフレームバッ |
    |x11vnc                    |I:45  |1863|(VNC)   |ファープロトコ |
    |                          |      |    |        |ル (VNC) サーバ|
    |                          |      |    |        |ー             |
    |--------------------------+------+----+--------+---------------|
    |                          |      |    |        |TigerVNC, リモ |
    |                          |V:5,  |    |RFB     |ートフレームバ |
    |tigervnc-standalone-server|I:15  |2967|(VNC)   |ッファープロト |
    |                          |      |    |        |コル (VNC) サー|
    |                          |      |    |        |バー           |
    |--------------------------+------+----+--------+---------------|
    |                          |V:6,  |    |RDP, RFB|GNOME リモート |
    |gnome-connections         |I:135 |1651|(VNC)   |デスクトップク |
    |                          |      |    |        |ライアント     |
    |--------------------------+------+----+--------+---------------|
    |                          |      |    |RDP, RFB|Vinagre: GNOME |
    |vinagre                   |V:1,  |4249|(VNC),  |リモートデスク |
    |                          |I:24  |    |SPICE,  |トップクライア |
    |                          |      |    |SSH     |ント           |
    |--------------------------+------+----+--------+---------------|
    |                          |      |    |RDP, RFB|Remmina: GTK リ|
    |remmina                   |V:15, |982 |(VNC),  |モートデスクト |
    |                          |I:61  |    |SPICE,  |ップクライアン |
    |                          |      |    |SSH, ...|ト             |
    |--------------------------+------+----+--------+---------------|
    |                          |V:2,  |    |RDP, RFB|KRDC: KDE リモ |
    |krdc                      |I:16  |4144|(VNC)   |ートデスクトッ |
    |                          |      |    |        |プクライアント |
    |--------------------------+------+----+--------+---------------|
    |                          |      |    |RFB     |仮想マシンマネ |
    |virt-viewer               |V:5,  |1278|(VNC),  |ージャーのゲス |
    |                          |I:40  |    |SPICE   |ト OS の GUI 表|
    |                          |      |    |        |示クライアント |
    +---------------------------------------------------------------+


7.9. Xサーバ接続

    ローカルホスト上の xwayland も含めた X サーバーにリモートホスト上
    のアプリが接続する方法がいくつかあります。

    表7.8 X サーバーへの接続方法のリスト

    +---------------------------------------------------------------+
    |   パッケージ    |ポプコ|サイ|     コマンド     |     説明     |
    |                 |  ン  | ズ |                  |              |
    |-----------------+------+----+------------------+--------------|
    |                 |V:768,|    |X11-forwarding オ |SSH サーバ (セ|
    |openssh-server   |I:819 |3359|プション付きの    |キュア)       |
    |                 |      |    |sshd              |              |
    |-----------------+------+----+------------------+--------------|
    |openssh-client   |V:915,|4210|ssh -X            |SSH クライアン|
    |                 |I:996 |    |                  |ト (セキュア) |
    |-----------------+------+----+------------------+--------------|
    |xauth            |V:190,|81  |xauth             |X 認証ファイル|
    |                 |I:972 |    |                  |ユーティリティ|
    |-----------------+------+----+------------------+--------------|
    |x11-xserver-utils|V:309,|559 |xhost             |X のサーバアク|
    |                 |I:531 |    |                  |セス制御      |
    +---------------------------------------------------------------+


7.9.1. X サーバローカル接続

    ローカルの UNIX ドメインソケット経由でローカル接続することで、X
    コアプロトコルを使うローカルのアプリはローカルの X サーバーにアク
    セスできます。これはアクセスクッキーを保持する権限ファイルによっ
    て許諾されます。権限ファイルの場所は "$XAUTHORITY" 環境変数により
    特定され、X ディスプレーは "$DISPLAY" 環境変数により特定されます
    。普通これらは自動設定されているので、例えば "gitk" の場合以下の
    ように特段のアクションは不要です。

    username $ gitk

    注記
   
    xwayland の場合、XAUTHORITY は "/run/user/1000
    /.mutter-Xwaylandauth.YVSU30" のような値を取ります。

7.9.2. X サーバリモート接続

    X コアプロトコルを使うリモートのアプリからローカルの X サーバーへ
    のアクセスは X11 フォワーディング機能を使ってサポートされます。

      * ローカルホスト上で gnome-terminal を開きます。

      * ssh(1) を -X オプションとともに実行して以下のようにリモートサイト
        との接続を確立する。

        localname @ localhost $ ssh -q -X loginname@remotehost.domain
        Password:

      * リモートホスト上の "gitk" 等の X アプリケーションコマンドを以下の
        ように実行します。

        loginname @ remotehost $ gitk

    ここに書かれた手法はリモート X クライアントがあたかもローカルの
    UNIX ドメインソケット経由でローカル接続されているかのようにして、
    リモート X クライアントからの出力を表示できるようにします。

    SSH/SSHD に関しては「リーモートアクセスサーバーとユーティリティー
    (SSH)」を参照下さい。

    警告

    X サーバーへの TCP/IP 接続はセキュリティー上の理由で Debian シス
    テム上では無効化されています。回避可能であれば、"xhost +" と単純
    に設定しこれを有効化してはいけないし、また XDMCP 接続を有効化して
    これを有効化してもいけません。

7.9.3. X サーバ chroot 接続

    X コアプロトコルを使う同一ではあるが認証ファイルにアクセスできな
    い chroot のような環境で実行されるアプリケーションから X サーバー
    へのアクセスは、例えば "gitk" の場合は以下のようにして User-based
    アクセスを使うと xhost を使い安全に認証できます。

    username $ xhost + si:localuser:root ; sudo chroot /path/to
    # cd /src
    # gitk
    # exit
    username $ xhost -

7.10. クリップボード

    テキストのクリップボードへのクリップに関しては、「マウス操作」を
    参照下さい。

    グラフィクスのクリップボードへのクリップに関しては、「画像データ
    ーツール」を参照下さい。

    文字クリップボード (PRIMARY と CLIPBOARD) の操作は、いくつかの
    CLI コマンドを使うと可能です。

    表7.9 文字クリップボードの操作関連プログラムのリスト

    +---------------------------------------------------------------+
    |            |ポプコ|パッケ|ターゲ |                            |
    | パッケージ |  ン  |ージサ| ット  |            説明            |
    |            |      | イズ |       |                            |
    |------------+------+------+-------+----------------------------|
    |xsel        |V:7,  |55    |X      |X 選択のコマンドラインインタ|
    |            |I:43  |      |       |ーフェース (クリップボード) |
    |------------+------+------+-------+----------------------------|
    |xclip       |V:16, |62    |X      |X 選択のコマンドラインインタ|
    |            |I:77  |      |       |ーフェース (クリップボード) |
    |------------+------+------+-------+----------------------------|
    |            |V:8,  |      |       |wl-copy wl-paste: Wayland ク|
    |wl-clipboard|I:25  |174   |Wayland|リップボードへのコマンドライ|
    |            |      |      |       |ンインターフェース          |
    |------------+------+------+-------+----------------------------|
    |            |V:8.7,|      |Linux  |Linux コンソールのマウスイベ|
    |gpm         |I:9.5 |524   |コンソ |ントを捉えるデーモン        |
    |            |      |      |ール   |                            |
    +---------------------------------------------------------------+


第8章 I18N と L10N

    アプリケーションソフトの多言語化 (M17N) とかネイティブ言語サポー
    トは2段階で行います。

      * 国際化 (I18N): ソフトが複数のロケール (地域) を扱えるようにし
        ます。

      * 地域化 (L10N): 特定のロケール (地域) を扱えるようにします。

    ヒント

    M17N、I18N、L10N に対応する英語の multilingualization、
    internationalization、localization の中の "m" と "n"、"i" と "n"
    、"l" と "n" の間には 17、18、10 の文字があります。詳細は、国際化
    と地域化を参照下さい。

8.1. ロケール

    国際化をサポートするプログラムの挙動は、ローカル化をサポートする
    環境変数 "$LANG" を使って設定されます。libc ライブラリーによるロ
    カール依存機能の実際のサポートには、locales か locales-all パッケ
    ージをインストールする必要があります。locales パッケージは適切に
    初期化する必要があります。

    locales と locales-all パッケージのいずれもインストールされない場
    合、ロカール機能のサポートは失われ、システムは US 英語のメッセー
    ジ使い、データーを ASCII として取り扱います。この挙動は "$LANG"
    が "LANG=" か "LANG=C" か "LANG=POSIX" と設定されたのと同様です。

    GNOME や KDE 等の現代的なソフトは多言語化されています。UTF-8 デー
    ターを扱えるようにすることで国際化され、gettext(1) インフラで翻訳
    されたメッセージを提供することで地域化されています。翻訳されたメ
    ッセージは別の地域化パッケージとして供給されているかもしれません
    。

    現行の Debian デスクトップ GUI システムは普通 GUI 環境下のロカー
    ルを "LANG=xx_YY.UTF-8" と設定します。ここで、"xx" は ISO 639 言
    語コードで "YY" は ISO 3166 国コードです。これらの値はデスクトッ
    プ設定 GUI ダイアログで設定されプログラムの挙動を変えます。「
    "$LANG" 変数」を参照下さい

8.1.1. UTF-8 ロケールを使う根拠

    テキストデータの最も単純な表現は ASCII で、英語には十分で 127 未
    満の文字 (7 ビットで表現可能) を使います。

    プレーンな英語のテキストですら非 ASCII 文字を含んでいるかもしれま
    せん。例えば微妙に曲がった左右のクォテーションマークは ASCII 内で
    は利用できません。

    “double quoted text” is not "double quoted ASCII"
    ‘single quoted text’ is not 'single quoted ASCII'

    より多くの文字をサポートするために、多くの言語をサポートする多数
    の文字集合とエンコーディング体系が使用されてきました (表11.2「符
    号化方式値とその使い方リスト」を参照下さい)。

    ユニコード文字セットは実質的に人類が知り得る全ての文字を21ビット
    のコードポイント範囲 (16進表記で 0 から 10FFFF まで) で表記できま
    す。

    テキストエンコーディングシステム UTF-8 は、ASCII データー処理シス
    テムとほぼ互換な賢明な 8 ビットデーターストリームにユニコードコー
    ドポイントを当てはめます。これが UTF-8 を現代的な好ましい選択肢に
    します。UTF はユニコード変換フォーマット (Unicode Transformation
    Format) の意味です。 ASCII プレーンテキストデーターが UTF-8 デー
    ターに変換されるとき、最初の ASCII データーと全く同じ内容とサイズ
    です。UTF-8 ロケールを採用することで失いものはありません。

    UTF-8 ロカールの下の互換アプリケーションプログラムを使うと、必要
    なフォントとインプットメソッドが導入され有効化されていれば、いか
    なる外国語のテキストデーターの表示や編集ができます。例えば、"LANG
    =fr_FR.UTF-8" ロケールの下で、gedit(1) (GNOME デスクトップ用のテ
    キストエディター) は、メニューをフランス語で表示しながら中国語の
    文字の表示や編集ができます。

    ヒント

    新標準の "en_US.UTF-8" ロケールと旧標準の "C"/"POSIX" ロケールは
    標準アメリカ英語のメッセージを使いますが、ソート順などでわずかに
    違います。古い "C" ロケールの挙動を保持しながら、ASCII 文字を扱う
    だけでなく、UTF-8 でエンコードされた全ての文字を優雅に扱いたい場
    合は、非標準の "C.UTF-8" ロケールを Debian で使います。

    注記

    一部のプログラムは I18N をサポートした後でより多くのメモリーを消
    費するようになります。それらのプログラムは、実行速度最適化のため
    に内部的に UTF-32 (UCS4) で Unicode のサポートをコードされていて
    、選ばれたロケールに無関係にそれぞれの ASCII 文字データー毎に4バ
    イトを消費するからです。ここでも、UTF-8 ロケールを使ったからとい
    って何も失うわけではありません。

8.1.2. ロケールの再設定

    システムが特定のロケールにアクセスできるように、ロケールデータを
    ロケールデータベースからコンパイルする必要が有ります。

    locales パッケージには、事前にコンパイルしたロケールデーターは同
    梱されていません。以下のようにして設定する必要があります:

    # dpkg-reconfigure locales

    このプロセスは2段階あります。

     1. バイナリー形式にコンパイルしたい全ての必要なロケールデーター
        を選択します。(少なくとも１つの UTF-8 ロケールが含めて下さい)
   
     2. PAM (「PAM と NSS」を参照下さい) によって使われるように "/etc
        /default/locale" を作成しシステム全体のデフォールトのロケール
        値を設定。

    "/etc/default/locale" 中に設定されたシステム全体のデフォルトロケ
    ール値は GUI アプリケーション用の GUI 設定によりオーバーライドさ
    れるかもしれません。

    注記

    実際に使われる符号化方式は "/usr/share/i18n/SUPPORTED" を確認する
    ことで識別できます。だから、"en_US" は"ISO-8859-1" 符号化方式を使
    います。

    locales-all パッケージには、全てのロケールデーター用に事前にコン
    パイルしたロケールデーターが同梱されています。"/etc/default/
    locale" を作成しないので、locales パッケージもまだインストール必
    要があるかもしれません。

    ヒント

    いくつかの Debian 派生のディストリビューションの locales パッケー
    ジには、事前にコンパイルしたロケールデーターが同梱されています。
    そのようなシステム環境を Debian 上で再現するには locales と
    locales-all パッケージの両方をインストールする必要があります。

8.1.3. ファイル名の符号化方式

    クロスプラットフォームのデーター交換 (「リムーバブルストレージデ
    バイス」を参照下さい) のために、特定の符号化方式 (エンコーディン
    グ) でファイルシステムをマウントする必要があるかもしれません。例
    えば、vfat ファイルシステムに関して mount(8) はオプション無しの場
    合 CP437 とみなします。ファイル名に UTF-8 とか CP932 を使うために
    は明示的にマウントオプションを提供する必要があります。

    注記

    GNOME のような現代的なデスクトップ環境の下では、デスクトップアイ
    コンを右クリックし "Drive" タブをクリックし "Setting" を開くよう
    にクリックし "Mount options:" に"utf8" を入力すれば、ホットプラグ
    できる USB フラッシュドライブを自動マウントする時のマウントオプシ
    ョンを設定できます。次回このUSB フラッシュドライブをマウントする
    際には UTF-8 でのマウントが有効です。

    注記

    もしシステムをアップグレードしたり旧式非 UTF-8 システムからディス
    クを移動したりする場合には、非 ASCII 文字のファイル名は
    ISO-8859-1 とか eucJP 等の今は非推奨の歴史的符号化方式で符号化を
    しているかもしれません。テキスト変換ツールの助力を得て、ファイル
    名を UTF-8 に変換します。「テキストデーター変換ツール」を参照下さ
    い。

    Samba は新規クライアント (Windows NT、200x、XP) には Unicode を使
    いますが、旧式クライアント (DOS、Windows 9x/Me) には CP850 をデフ
    ォールトで使います。この旧式クライアントへのデフォールトは "/etc/
    samba/smb.conf" ファイル中の "dos charset" を使って例えば日本語な
    ら CP932 等と変更できます。

8.1.4. 地域化されたメッセージと翻訳された文書

    Debian システム中で表示されるエラーメッセージや標準のプログラムの
    出力やメニューやマニュアルページ等のテキストメッセージや文書の多
    くに翻訳があります。ほとんどの翻訳行為のバックエンドツールとして
    GNU gettext(1) コマンドツールチェインが使われています。

    "Tasks" → "Localization" の下の aptitude(8) リストは地域化された
    メッセージをアプリケーションに追加したり翻訳された文書を提供する
    有用なバイナリーパッケージの徹底的なリストを提供します。

    例えば、manpages-LANG パッケージをインストールするとマンページで
    地域化したメッセージに使えるようになります。programname に関する
    イタリア語のマンページを "/usr/share/man/it/" から読むには、次を
    実行します。

    LANG=it_IT.UTF-8 man programname

    GNU gettext は $LANGUAGE 環境変数を使って翻訳言語の優先順位をつけ
    るようにできます。例えば:

     $ export LANGUAGE="pt:pt_BR:es:it:fr"

    詳しくは、info gettext を参照して "The LANGUAGE variable" セクシ
    ョンを読んで下さい。

8.1.5. ロケールの効果

    sort(1) や ls(1) での並べ替え順はロケールの影響を受けます。LANG=
    en_US.UTF-8 をエクスポートすると辞書順 A->a->B->b...->Z->z で並べ
    替えられ、一方 LANG=C.UTF-8 をエクスポートすると ASCII バイナーリ
    ー順 A->B->...->Z->a->b... で並べ替えられます。

    ls(1) の日付形式はロケールに影響されます。literal>" の日付形式は
    違います (「時間と日付のカスタム化表示」を参照下さい)。

    date(1) の日付形式はロケールに影響されます。例えば以下です:

     $ unset LC_ALL
     $ LANG=en_US.UTF-8 date
    Thu Dec 24 08:30:00 PM JST 2023
     $ LANG=en_GB.UTF-8 date
    Thu 24 Dec 20:30:10 JST 2023
     $ LANG=es_ES.UTF-8 date
    jue 24 dic 2023 20:30:20 JST
     $ LC_TIME=en_DK.UTF-8 date
    2023-12-24T20:30:30 JST

    数字の区切り方はロケール毎に異なります。例えば、英語のロケールで
    は一千点一は "1,000.1" と表示されますが、ドイツ語のロケールでは
    "1.000,1" と表示されます。スプレッドシートプログラムでこの違いを
    目にするしれません。

    "$LANG" 環境変数の各詳細機能は、"$LC_*" 変数の設定でオーバーライ
    ドされます。これらの環境変数は更に "$LC_ALL" 変数の設定でオーバー
    ライドされます。詳細は locale(7) マンページを参照下さい。複雑な設
    定をするよほどの理由がない限り、これらは使わずただ "$LANG" 変数だ
    けを UTF-8 ロカールの 1 つに設定して使いましょう。

8.2. キーボード入力

    キーボードシステムはシステムの異なるレーヤーで設定できます。

      * Linux カーネル: keyboard(5)

      * X サーバー: setxkbmap(1), xkeyboard-config(5), 環境変数
        XMODIFIERS
   
      * GUI デスクトップ環境: インプットメソッド枠組: ibus, fcitx5

      * アプリケーション: インプット元を設定する環境変数:
        GTK_IM_MODULE, QT_IM_MODULE, QT_IM_MODULES, ...

    インプットメソッド枠組み (IM) は以下で構成されます:

      * インプットメソッドエンジン (IME): 実際のインプットメソッド

      * 設定: IBus yあ IME プラグインのような他のサービスの設定を取り
        扱う

      * パネル: 言語バーや選択候補テーブルのようなユーザーインターフ
        ェース

    アプリケーションへの多言語入力は概略以下のように処理されます。

    Keyboard        UI panel    Configuration          Application
    |                  ^ |           |                        ^  ^
    v                  | v           v                        |  |
    Linux kernel -> Input method engine (IME) -+-> Gtk, Qt ---+  |
                       | ^                     |                 |
                       | |                     +-> X11, Wayland -+
                       v |
                    IME plugin (ibus-mozc, ...)

8.2.1. Linux コンソールと X Window 用のキーボードインプット

    Debian システムは keyboard-configuration パッケージを使い多くの国
    際キーボード配列として機能するように設定できます。

    # dpkg-reconfigure keyboard-configuration

    Linux コンソールや X Window システムでは、これは "/etc/default/
    keyboard" 内の設定パラメーターを更新します。多くの欧州言語で用い
    られるアクセント付き文字を含めた多くの非 ASCII 文字はデッドキーや
    AltGr キーやコンポーズキーを用い提供されます。

    注記

    もし ibus がアクティブな場合、たとえ古典的 X 上のデスクトップ環境
    下でも、あなたの setxkbmap による古典的 X キーボード設定は ibus
    によってオーバーライドされるかもしれません。im-config を使ってイ
    ンプットメソッドを "None" と設定すると、インストールされた ibus
    は無効化できます。詳細は、キーボードに関する Debian Wiki を参照下
    さい。

8.2.2. Wayland 向けのキーボード入力

    X Window プロトコルと違い、Wayland のコアのプロトコルはアクセント
    付き文字すらサポートしません。 GNOME 用の Mutter とか KDE 用の
    KWin 等の人気のある Wayland コンポジターはテキスト入力用の
    text-input-unstable-v3 のような拡張プロトコルを実装しています
    ("current Wayland protocols and their support status"を参照下さ
    い)。

    Waylandでは、text-input-unstable-v3 プロトコルがインプットメソッ
    ドと相性よく機能します ("Wayland input method project
    post-mortem" を参照下さい)。.

      * この text-input-unstable-v3 をサポートするGTK とか Qt のよう
        なライブラリーを用いてほとんどの GUI アプリケーションはビルド
        されます。

      * IBus とか Fcitx (version 5)のような、人気のインプットメソッド
        エンジン (IME) はこの text-input-unstable-v3 と相性よく機能し
        ます
   
      * IME は多くの言語のためのテキスト入力をプラグインを用いてサポ
        ートします。

      * 最近の IME は、Wayland で欧州言語用のアクセント付き文字のテキ
        スト入力をサポートするために、過去 X Window が提供していた
        setxkbmap のような "X Keyboard Extension (XKB) (X キーボード
        拡張機能) " の機能を中に組み込んでいます。

8.2.3. IBus を使うインプットメソッドのサポート

    GNOME では "ibus" がそのパッケージ依存関係から自動導入されるデフ
    ォルトの IME です。

      * 殆どの多言語キーボード入力機能は "GNOME Settings" か "GNOME
        Tweaks" から設定できます。

      * 一部の多言語キーボード入力機能は ibus-setup(1) コマンドから設
        定する必要があるかもしれません。

      * 絵文字キーボード入力は "SUPER-." をタイプ (Windows キーとピリ
        オドキーの同時タイプ) に続いて、各絵文字のキーワードと SPACE-
        キーをタイプしてできます。

    IBus とそのプラグインパッケージのリストは以下の通りです。

    表8.1 IBusとプラグインパッケージのリスト

    +---------------------------------------------------------------+
    |  パッケージ   |ポプコン |サイ |    サポートされたロケール     |
    |               |         | ズ  |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus           |V:213,   |1828 |dbus を用いるインプットメソッド|
    |               |I:252    |     |のフレームワーク               |
    |---------------+---------+-----+-------------------------------|
    |ibus-mozc      |V:2.1,   |978  |日本語                         |
    |               |I:3.8    |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-anthy     |V:0.5,   |8958 |日本語                         |
    |               |I:1.2    |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-skk       |V:0.04,  |242  |日本語                         |
    |               |I:0.14   |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-kkc       |V:0.03,  |211  |日本語                         |
    |               |I:0.18   |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-libpinyin |V:1.2,   |2767 |中国語 (zh_CN 用)              |
    |               |I:5.1    |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-chewing   |V:0.19,  |288  |中国語 (zh_TW 用)              |
    |               |I:0.90   |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-libzhuyin |V:0.00,  |41009|中国語 (zh_TW 用)              |
    |               |I:0.11   |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-rime      |V:0.26,  |78   |中国語 (zh_CN/zh_CN 用)        |
    |               |I:0.49   |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-cangjie   |V:0.02,  |235  |中国語 (zh_HK 用)              |
    |               |I:0.12   |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-hangul    |V:0.3,   |264  |韓国語                         |
    |               |I:2.0    |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-libthai   |V:0.00,  |84   |タイ語                         |
    |               |I:0.05   |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-table-thai|I:0.05   |59   |タイ語                         |
    |---------------+---------+-----+-------------------------------|
    |ibus-unikey    |V:0.20,  |286  |ベトナム語                     |
    |               |I:0.43   |     |                               |
    |---------------+---------+-----+-------------------------------|
    |keyman         |I:0.10   |507  |多言語: 2000 語以上のための    |
    |               |         |     |Keyman プラグイン              |
    |---------------+---------+-----+-------------------------------|
    |ibus-table     |V:0.08,  |2271 |IBus 用のテーブルプラグイン    |
    |               |I:1.00   |     |                               |
    |---------------+---------+-----+-------------------------------|
    |ibus-m17n      |V:0.3,   |373  |多言語: インド系言語、アラビア |
    |               |I:2.0    |     |語、他                         |
    +---------------------------------------------------------------+


8.2.4. Fcitx を使うインプットメソッドのサポート

    Fcitx (version 5) インプトメソッドフレームワークは中国人ユーザー
    に人気があり "ibus" と互換性があります。

    "fcitx5"とそのプラグインパッケージのリストは以下の通りです。

    表8.2 Fcitx5とプラグインパッケージのリスト

    +---------------------------------------------------------------+
    |        パッケージ        |ポプコ |サイ |サポートされたロケール|
    |                          |  ン   | ズ  |                      |
    |--------------------------+-------+-----+----------------------|
    |fcitx5                    |V:7,   |761  |"ibus"互換のインプとメ|
    |                          |I:12   |     |ソッドフレームワーク  |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-mozc               |V:1.0, |1260 |日本語                |
    |                          |I:1.6  |     |                      |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-anthy              |V:0.06,|808  |日本語                |
    |                          |I:0.20 |     |                      |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-skk                |V:0.05,|369  |日本語                |
    |                          |I:0.14 |     |                      |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-kkc                |V:0.00,|416  |日本語                |
    |                          |I:0.06 |     |                      |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-chinese-addons     |I:9.0  |17   |中国語 (zh_* 用メタパ |
    |                          |       |     |ッケージ)             |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-pinyin             |V:3.8, |1044 |中国語 (zh_CN 用)     |
    |                          |I:9.4  |     |                      |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-chewing            |V:0.2, |217  |中国語 (zh_TW 用)     |
    |                          |I:1.0  |     |                      |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-zhuyin             |I:0.06 |41051|中国語 (zh_TW 用)     |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-rime               |V:0.44,|371  |中国語 (zh_CN/zh_CN   |
    |                          |I:0.84 |     |用)                   |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-table-cangjie-large|I:0.12 |1292 |中国語 (zh_HK 用)     |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-hangul             |V:0.09,|235  |韓国語                |
    |                          |I:0.23 |     |                      |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-libthai            |I:0.05 |119  |タイ語                |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-table-thai         |I:0.08 |34   |タイ語                |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-unikey             |V:0.08,|588  |ベトナム語            |
    |                          |I:0.20 |     |                      |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-m17n               |V:0.12,|259  |多言語: インド系言語、|
    |                          |I:0.51 |     |アラビア語、他        |
    |--------------------------+-------+-----+----------------------|
    |fcitx5-table              |V:0.4, |520  |fcitx5 用のテーブルプ |
    |                          |I:9.2  |     |ラグイン              |
    |--------------------------+-------+-----+----------------------|
    |                          |V:0.03,|     |多言語: 2000 語以上の |
    |fcitx5-keyman             |I:0.04 |235  |ための Keyman プラグイ|
    |                          |       |     |ン                    |
    +---------------------------------------------------------------+


8.2.5. 日本語の例

    日本語インプットメソッドを英語環境 ("en_US.UTF-8") 下で起動するの
    が非常に便利です。IBus を使ってどう実現したかを以下に記します。

     1. 日本語インプットツールパッケージの ibus-mozc (または
        ibus-anthy) をインストールします。

     2.
          + 一般: ibus-setup(1) を実行 → "Input Method" を選択 →
            "Add" をクリック → "Japanese" → "Mozc (または Anthy)" →
            "Add" をクリック

          + GNOME: "Settings" → "Keyboard" → "Input Sources" → "Input
            Sources" 中の "+" をクリック → "Japanese" → "Mozc (または
            Anthy)" → "Add" をクリック

     3. インプットソースはいくつ選んでも構いません。

     4. ユーザーアカウントに再ログインします。

     5. GUI ツールバーアイコンを右クリックして各インプットソースを設
        定します。

     6. インプットソース間を、SUPER-SPACE を用いて切り替えます。
        (SUPER は普通 Windows キーです。)

    ヒント

    シフト2 が " (ダブルクォーテーションマーク)の刻印のある物理的な日
    本語キーボードでアルファベットのみのキーボード環境にアクセスする
    には、上記の手順で "Japanese" を選びます。シフト2 が @ (アットマ
    ーク)の刻印のある物理的な US 英語キーボードを "Japanese mozc (も
    しくは anthy)" を使うと日本語が入力できます。

      * Wayland だと:

          + im-config パッケージは何もし無いし、安全に削除可能です。

          + 環境変数の設定をする必要は、バックワード互換性のため等を
            除けばきっと必要ないでしょう。

          + 環境変数を設定する必要のある場合には、 "~/.config/
            environment.d/50-input-method.conf" のようなファイルを作
            成して環境変数を設定します。

      * X Window だと:
   
          + im-config パッケージをインストールします。

          + im-config(8) のための GUI メニューエントリーは "Input
            method" です。

          + あるいは、ユーザのシェルから "im-config" を実行します。

          + im-config(8) は実行されるのが root からかどうかによって違
            った挙動をします。

          + im-config(8) はユーザーからのアクション無しにシステム上で
            最も好ましいインプットメソッドを有効にします。

8.3. ディスプレー出力

    Linux コンソールは限定された文字しか表示できません。(非 GUI コン
    ソール上で非ヨーロッパ言語を表示するには jfbterm(1) のような特別
    なターミナルプログラムを使う必要があります。)

    GUI 環境(7章GUI システム)は、必要なフォントデーターがあれば UTF-8
    中の全ての文字を表示できます。(オリジナルフォントデーターで使われ
    た符号化方式は面倒を見られているのでユーザーからは見えません。)

8.3.1. ターミナルの設定

    Debian システムは console-setup パッケージを使い多くの国際化コン
    ソール設定をともに使えるように設定できます。

    # dpkg-reconfigure console-setup

    Linux コンソールや X Window システムでは、これは "/etc/default/
    console-setup" 内の設定パラメーターを更新し多くの欧州言語で用いら
    れるアクセント付き文字を含めた多くの非 ASCII 文字を表示するように
    します。

    文字コンソールと ncurses(3) システム機能を設定するのはいくつかの
    要素があります。

      * "/etc/terminfo/*/*" ファイル (terminfo(5))

      * "$TERM" 環境変数 (term(7))

      * setterm(1)、stty(1)、tic(1)、toe(1)

    もし xterm 用の terminfo エントリーが非 Debian のxterm でうまく機
    能しない場合には、リモートから Debian システムにログインする時に
    ターミナルタイプ、"$TERM"、を "xterm" から "xterm-r6" のような機
    能限定版に変更します。詳細は "/usr/share/doc/libncurses5/FAQ" を
    参照下さい。"dumb" は"$TERM" の最低機能の共通項です。

8.3.2. 東アジア不明瞭文字幅文字

    東アジアのロケールでは、箱描画文字やギリシャ文字やキリル文字はあ
    なたが望むよりも広い幅で表示されて、ターミナル出力が揃わなくなる
    かもしれません (Unicode標準附属書 #11, 4.2 不明瞭文字参照)。

    この問題は回避可能です:

      * gnome-terminal: Preferences → Profiles → Profile name →
        Compatibility → Ambiguous-wide characters → Narrow
   
      * ncurses: 環境変数を export NCURSES_NO_UTF8_ACS=0 と設定します
        。

第9章システムに関するティップ

    主にコンソールからシステムを設定や管理する基本的なティップを次に
    記します。

9.1. コンソールのティップ

    コンソール活動を補助するユーティリティープログラムがいくつかあり
    ます。

    表9.1 コンソールの活動をサポートするプログラムのリスト

    +---------------------------------------------------------------+
    |パッケー|ポプコン|サイ|                  説明                  |
    |   ジ   |        | ズ |                                        |
    |--------+--------+----+----------------------------------------|
    |mc      |V:41,   |1590|「ミッドナイトコマンダー (MC)」を参照   |
    |        |I:182   |    |                                        |
    |--------+--------+----+----------------------------------------|
    |bsdutils|V:443,  |334 |ターミナルセッションの記録を作成する    |
    |        |I:999   |    |script コマンド                         |
    |--------+--------+----+----------------------------------------|
    |screen  |V:52,   |991 |VT100/ANSI ターミナルエミュレーションを |
    |        |I:200   |    |使ってのターミナルマルチプレクサ        |
    |--------+--------+----+----------------------------------------|
    |tmux    |V:94,   |1291|代替のターミナルマルチプレクサ (代わりに|
    |        |I:162   |    |"Control-B" を用いる)                   |
    |--------+--------+----+----------------------------------------|
    |ripgrep |V:14,   |5294|自動フィルタリング付きのソースコード中の|
    |        |I:42    |    |高速再帰文字検索                        |
    |--------+--------+----+----------------------------------------|
    |fzf     |V:8,    |4983|ファジーテキストファインダ              |
    |        |I:35    |    |                                        |
    |--------+--------+----+----------------------------------------|
    |fzy     |V:0.08, |59  |ファジーテキストファインダ              |
    |        |I:0.36  |    |                                        |
    |--------+--------+----+----------------------------------------|
    |rlwrap  |V:1,    |328 |readline 機能のコマンドラインラッパー   |
    |        |I:12    |    |                                        |
    |--------+--------+----+----------------------------------------|
    |ledit   |V:0.5,  |375 |readline 機能のコマンドラインラッパー   |
    |        |I:7.7   |    |                                        |
    |--------+--------+----+----------------------------------------|
    |rlfe    |V:0.04, |45  |readline 機能のコマンドラインラッパー   |
    |        |I:0.49  |    |                                        |
    +---------------------------------------------------------------+


9.1.1. シェルの活動を綺麗に記録

    単に script(1) を使ってシェル活動を記録すると (「シェル活動の記録
    」を参照下さい)、コントロール文字の入ったファイルが生成されます。
    このような事は以下のようにして col(1) を使うことで避けられます。

    $ script
    Script started, file is typescript

    何なりとします … そして script から脱出するために Ctrl-D を押しま
    す。

    $ col -bx < typescript > cleanedfile
    $ vim cleanedfile

    シェルの活動を記録する他の方法もあります:

      * tee を使う (initramfs 中のブートプロセスで有用):

        $ sh -i 2>&1 | tee typescript

      * スクロールバック用バッファーを拡張した gnome-terminal を使い
        ます。

      * screen(1) を"^A H" で使い (「screen プログラム」を参照下さい)
        コンソールの記録をします。

      * vim を":terminal" で使ってコンソールの記録します。"C-W N" と
        して TERMINAL モードから NORMAL モードに出ます。":w
        typescript" としてバッファーをファイルに書き出します。

      * emacs を"M-x shell" か "M-x eshell" か "M-x term" で使ってコ
        ンソールの記録します。"C-x C-w" としてバッファーをファイルに
        書き出します。

9.1.2. screen プログラム

    screen(1) は複数のプロセスを1つのターミナルウィンドウでうまく動作
    させるのみならず、接続が中断してもリモートシェルプロセスを生き延
    びさせる事もできます。screen(1) の使われ方の典型的シナリオは次で
    す。

     1. リモート機器にログインします。

     2. 単一のコンソール上で screen を起動します。

     3. ^A c ("Control-A" に続いて "c") によって作られた screen のウ
        ィンドウ中で複数のプログラムを実行します。

     4. ^A n ("Control-A" に続いて "n") によって、複数の screen のウ
        ィンドウ間を切り替えます。

     5. 突然ターミナルを離れる必要ができたけれども、接続を継続してあ
        なたのアクティブな作業を失いたくありません。

     6. いかなる方法ででも、screen のセッションをデタッチできます。
   
          + 暴力的にネットワーク接続を引き抜く

          + ^A d ("Control-A" に続いて "d") とタイプしてリモート接続
            から手動でログアウト

          + ^A DD ("Control-A" に続いて "DD") とタイプして screen を
            デタッチしてログアウト

     7. 同じリモート機器に (たとえ異なるターミナルからでも) 再びログ
        インします。

     8. screen を"screen -r" として起動します。

     9. screen は全アクティブなプログラムが実行されている過去の全
        screen ウィンドウを魔法のようにリアタッチします。

    ヒント

    screen を使うと、切断してもプロセスをアクティブにしておけその後で
    再接続した時にリアタッチできるので、ダイヤルアップやパケット接続
    のような計量されたネットワーク接続での接続料金の節約ができます。

    screen セッションではコマンドキーストローク以外の全てのキーボード
    入力は現在のウィンドウに送られます。全ての screen コマンドキース
    トロークは ^A ("Control-A") と単一キー [プラス何らかのパラメータ
    ー] をタイプすることによって入力されます。次に覚えておくべき重要
    なコマンドキーストロークを記します。

    表9.2 screen キーバインディングのリスト

    +---------------------------------------------------------------+
    |キーバインディン|                     意味                     |
    |       グ       |                                              |
    |----------------+----------------------------------------------|
    |^A ?            |ヘルプスクリーンを表示 (キーバインディングを表|
    |                |示)                                           |
    |----------------+----------------------------------------------|
    |^A c            |新規ウィンドウを作成しそれに切り替える        |
    |----------------+----------------------------------------------|
    |^A n            |次のウィンドウに切り替える                    |
    |----------------+----------------------------------------------|
    |^A p            |前のウィンドウに切り替える                    |
    |----------------+----------------------------------------------|
    |^A 0            |0番のウィンドウに切り替える                   |
    |----------------+----------------------------------------------|
    |^A 1            |1番のウィンドウに切り替える                   |
    |----------------+----------------------------------------------|
    |^A w            |ウィンドウのリストを表示                      |
    |----------------+----------------------------------------------|
    |^A a            |Ctrl-A を現在のウィンドウにキーボード入力とし |
    |                |て送る                                        |
    |----------------+----------------------------------------------|
    |^A h            |現在のウィンドウのハードコピーをファイルに書く|
    |----------------+----------------------------------------------|
    |^A H            |現在のウィンドウのファイルへのロギングを開始/ |
    |                |終了する                                      |
    |----------------+----------------------------------------------|
    |^A ^X           |ターミナルをロック (パスワードで保護)         |
    |----------------+----------------------------------------------|
    |^A d            |ターミナルから screen のセッションをデタッチ  |
    |----------------+----------------------------------------------|
    |^A DD           |screen のセッションをデタッチしてログアウト   |
    +---------------------------------------------------------------+


    詳細は screen(1) を参照下さい。

    代替コマンドの機能については tmux(1) を参照下さい。

9.1.3. ディレクトリー間移動

    「Bash のカスタム化」にて、ディレクトリー間の俊敏な移動を可能にす
    る 2 つのティップが記述されています: $CDPATH と mc。

    ファジーテキストフィルターを使えば、正確なパスをタイプ無しでも可
    能です。fzf の場合だと、~/.bashrc に以下を含めます。

    FZF_KEYBINDINGS_PATH=/usr/share/doc/fzf/examples/key-bindings.bash
    if [ -f $FZF_KEYBINDINGS_PATH ]; then
      . $FZF_KEYBINDINGS_PATH
    fi

    たとえば:

      * 最小限の努力で非常に奥深いサブディレクトリーまでジャンプでき
        ます。最初に "cd **" とタイプして Tab を押します。すると、候
        補のパスとともに入力を促されます。例えば、s/d/b foo のような
        部分パス文字列をタイプすると候補パスが絞られます。cd が使うパ
        スをカーソールとリターンキーで選択します。
   
      * 最小限の努力でコマンド履歴からより効率的にコマンドを選択でき
        ます。コマンドプロンプトで Ctrl-R を押します。すると、候補の
        コマンドとともに入力を促されます。例えば、vim d のような部分
        コマンド文字列をタイプすると候補が絞られます。使うコマンドを
        カーソールとリターンキーで選択します。

9.1.4. Readline のラッパー

    /usr/bin/dash のようなコマンドライン履歴編集能力のないコマンドは
    rlwrap もしくはその等価プログラムのもとで透過的にそのような機能を
    追加できます。

     $ rlwrap dash -i

    これは、bash のようなフレンドリーな環境下で、dashに関する微妙な点
    をテストする便利なプラットフォームを提供します。

9.1.5. ソースコードツリーのスキャン

    ripgrep パッケージ中にある rg(1) コマンドは、典型的な状況にあるソ
    ースコードツリーをスキャンするための grep(1) コマンド代替の高速コ
    マンドを提供します。現代的なマルチコア CPU をうまく利用するととも
    に、いくつかのファイルをスキップする合理的なフィルターを自動的に
    適用します。

9.2. Vim のカスタム化

    「Vim 利用法」で vim(1) の基本を学んだ後は、vim を以下に使うべき
    かを理解するために、Bram Moolenaar 氏の"Seven habits of effective
    text editing (2000)" を読んで下さい。

9.2.1. 内部機能を使った vim のカスタマイズ

    vim の挙動は "set ..." 等の Ex モードコマンドを通して、その内部機
    能を有効にすることで大幅に変更できます。

    Ex コマンドは、伝統的な "~/.vimrc" または git-friendly な "~/.vim
    /vimrc" という、ユーザーの vimrc ファイルに含められます。以下は非
    常に単純な一例です ^[2]:

    """ Generic baseline Vim and Neovim configuration (~/.vimrc)
    """   - For NeoVim, use "nvim -u ~/.vimrc [filename]"
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    let mapleader = ' '             " :h mapleader
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    set nocompatible                " :h 'cp -- sensible (n)vim mode
    syntax on                       " :h :syn-on
    filetype plugin indent on       " :h :filetype-overview
    set encoding=utf-8              " :h 'enc (default: latin1) -- sensible encoding
    """ current vim option value can be verified by :set encoding?
    set backspace=indent,eol,start  " :h 'bs (default: nobs) -- sensible BS
    set statusline=%<%f%m%r%h%w%=%y[U+%04B]%2l/%2L=%P,%2c%V
    set listchars=eol:¶,tab:⇄\ ,extends:↦,precedes:↤,nbsp:␣
    set viminfo=!,'100,<5000,s100,h " :h 'vi -- bigger copy buffer etc.
    """ Pick "colorscheme" from blue darkblue default delek desert elflord evening
    """ habamax industry koehler lunaperche morning murphy pablo peachpuff quiet ron
    """ shine slate torte zellner
    colorscheme industry
    """ don't pick "colorscheme" as "default" which may kill SpellUnderline settings
    set scrolloff=5                 " :h 'scr -- show 5 lines around cursor
    set laststatus=2                " :h 'ls (default 1)  k
    """ boolean options can be unset by prefixing "no"
    set ignorecase                  " :h 'ic
    set smartcase                   " :h 'scs
    set autoindent                  " :h 'ai
    set smartindent                 " :h 'si
    set nowrap                      " :h 'wrap
    "set list                        " :h 'list (default nolist)
    set noerrorbells                " :h 'eb
    set novisualbell                " :h 'vb
    set t_vb=                       " :h 't_vb -- termcap visual bell
    set spell                       " :h 'spell
    set spelllang=en_us,cjk         " :h 'spl -- english spell, ignore CJK
    set clipboard=unnamedplus       " :h 'cb -- cut/copy/paste with other app
    set hidden                      " :h 'hid
    set autowrite                   " :h 'aw
    set timeoutlen=300              " :h 'tm

    vim のキーマップはユーザーの vimrc ファイルで変更可能です。例え
    ば:

    注意
   
    よほどいい理由がない限りデフォルトのキーバインディングを変えよう
    としてはいけません。

    """ Popular mappings (imitating LazyVim etc.)
    """ Window moves without using CTRL-W which is dangerous in INSERT mode
    nnoremap <C-H> <C-W>h
    nnoremap <C-J> <C-W>j
    nnoremap <C-K> <C-W>k
    silent! nnoremap <C-L> <C-W>l
    """ Window resize
    nnoremap <C-LEFT> <CMD>vertical resize -2<CR>
    nnoremap <C-DOWN> <CMD>resize -2<CR>
    nnoremap <C-UP> <CMD>resize +2<CR>
    nnoremap <C-RIGHT> <CMD>vertical resize +2<CR>
    """ Clear hlsearch with <ESC> (<C-L> is mapped as above)
    nnoremap <ESC> <CMD>noh<CR><ESC>
    inoremap <ESC> <CMD>noh<CR><ESC>
    """ center after jump next
    nnoremap n nzz
    nnoremap N Nzz
    """ fast "jk" to get out of INSERT mode (<ESC>)
    inoremap  jk <CMD>noh<CR><ESC>
    """ fast "<ESC><ESC>" to get out of TERM mode (CTRL-\ CTRL-N)
    tnoremap <ESC><ESC> <C-\><C-N>
    """ fast "jk" to get out of TERM mode (CTRL-\ CTRL-N)
    tnoremap jk <C-\><C-N>
    """ previous/next trouble/quickfix item
    nnoremap [q <CMD>cprevious<CR>
    nnoremap ]q <CMD>cnext<CR>
    """ buffers
    nnoremap <S-H> <CMD>bprevious<CR>
    nnoremap <S-L> <CMD>bnext<CR>
    nnoremap [b <CMD>bprevious<CR>
    nnoremap ]b <CMD>bnext<CR>
    """ Add undo break-points
    inoremap  , ,<C-G>u
    inoremap  . .<C-G>u
    inoremap  ; ;<C-G>u
    """ save file
    inoremap <C-S> <CMD>w<CR><ESC>
    xnoremap <C-S> <CMD>w<CR><ESC>
    nnoremap <C-S> <CMD>w<CR><ESC>
    snoremap <C-S> <CMD>w<CR><ESC>
    """ better indenting
    vnoremap < <gv
    vnoremap > >gv
    """ terminal (Somehow under Linux, <C-/> becomes <C-_> in Vim)
    nnoremap <C-_> <CMD>terminal<CR>
    "nnoremap <C-/> <CMD>terminal<CR>
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    if ! has('nvim')
    """ Toggle paste mode with <SPACE>p for Vim (no need for Nvim)
    set pastetoggle=<leader>p
    """ nvim default mappings for Vim.  See :h default-mappings in nvim
    """ copy to EOL (no delete) like D for d
    noremap Y y$
    """ sets a new undo point before deleting
    inoremap <C-U> <C-G>u<C-U>
    inoremap <C-W> <C-G>u<C-W>
    """ <C-L> is re-purposed as above
    """ execute the previous macro recorded with Q
    nnoremap Q @@
    """ repeat last substitute and *KEEP* flags
    nnoremap & :&&<CR>
    """ search visual selected string for visual mode
    xnoremap * y/\V<C-R>"<CR>
    xnoremap # y?\V<C-R>"<CR>
    endif

    上記のキーバインディングが適正に機能するには、Backspace キーが
    "ASCII DEL" を生成し、Delete キーが "Escape sequence" を生成する
    ように、ターミナルプログラムが設定される必要があります。

    他のいろいろな設定もユーザーの vimrc ファイルで変更可能です。例え
    ば:

    """ Use faster 'rg' (ripgrep package) for :grep
    if executable("rg")
      set grepprg=rg\ --vimgrep\ --smart-case
      set grepformat=%f:%l:%c:%m
    endif
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    """ Retain last cursor position :h '"
    augroup RetainLastCursorPosition
      autocmd!
      autocmd BufReadPost *
        \ if line("'\"") > 0 && line ("'\"") <= line("$") |
        \   exe "normal! g'\"" |
        \ endif
    augroup END
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    """ Force to use underline for spell check results
    augroup SpellUnderline
      autocmd!
      autocmd ColorScheme * highlight SpellBad term=Underline gui=Undercurl
      autocmd ColorScheme * highlight SpellCap term=Underline gui=Undercurl
      autocmd ColorScheme * highlight SpellLocal term=Underline gui=Undercurl
      autocmd ColorScheme * highlight SpellRare term=Underline gui=Undercurl
    augroup END
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    """ highlight tailing spaces except when typing as red (set after colorscheme)
    highlight TailingWhitespaces ctermbg=red guibg=red
    """ \s\+     1 or more whitespace character: <Space> and <Tab>
    """ \%#\@<!  Matches with zero width if the cursor position does NOT match.
    match TailingWhitespaces /\s\+\%#\@<!$/

9.2.2. 外部パッケージを使った vim のカスタマイズ

    興味深い外部プラグインパッケージがあります:

      * Vim - 至る所にあるテキストエディター -- Vim と vim スクリプト
        の公式アップストリームサイト
   
      * VimAwsome -- Vim プラグインのリスト

      * vim-scripts -- Debian パッケージ: vim スクリプト集

    ユーザーの vimrc ファイルを用いて vim-scripts パッケージ中のプラ
    グインパッケージを有効化できます。例えば:

    packadd! secure-modelines
    packadd! winmanager
    " IDE-like UI for files and buffers with <space>w
    nnoremap <leader>w         :WMToggle<CR>

    新しいネイティブの Vim パッケージシステムは "git" や "git
    submodule" とうまく機能します。そのような設定例のひとつは私の git
    レポジトリー: dot-vim にあります。これは本質的に以下をします:

      * "git" と"git submodule" を使って、"name" のような最新の外部パ
        ッケージを ~/.vim/pack/*/opt/name に置くようなことをします。

      * :packadd! name ラインをユーザーの vimrc ファイルに追加するこ
        とで、これらのパッケージは runtimepath 上に置かれます。
   
      * Vim はその初期化中に runtimepath 上のこのようなパッケージをロ
        ードします。

      * 初期化の最後に、インストールされたドキュメントのタグが
        "helptags ALL" で更新されます。

    詳しくは、vim を "vim --startuptime vimstart.log" とともに起動し
    、実際の起動順や各段階の時間を確認しましょう。

    vim への外部パッケージを管理したりロードするのに多すぎる手法^[3]
    があるのには混乱させられます。オリジナルの情報を確認するのが最適
    の解決法です。

    表9.3 vim 初期化に関する情報

    +---------------------------------------------------------------+
    |キーストロー|                       情報                       |
    |     ク     |                                                  |
    |------------+--------------------------------------------------|
    |:help       |vim パッケージメカニズムに関する説明              |
    |package     |                                                  |
    |------------+--------------------------------------------------|
    |:help       |runtimepath メカニズムに関する説明                |
    |runtimepath |                                                  |
    |------------+--------------------------------------------------|
    |:version    |vimrc ファイル用の候補を含めた内部状態            |
    |------------+--------------------------------------------------|
    |:echo $VIM  |vimrc ファイルを見つけるのに用いる "$VIM" 環境変数|
    |------------+--------------------------------------------------|
    |:set        |全実行時サポートファイルを探す対象のディレクトリー|
    |runtimepath?|のリスト                                          |
    |------------+--------------------------------------------------|
    |:echo       |システムが供給した各種実行時サポートファイルを見つ|
    |$VIMRUNTIME |けるのに用いる環境変数 "$VIMRUNTIME"              |
    +---------------------------------------------------------------+


9.3. データーの記録と表現

9.3.1. ログデーモン

    多くの伝統的プログラムは "/var/log/" ディレクトリーの下にそれぞれ
    の活動をテキストファイル形式で記録します。

    logrotate(8) が、大量のログファイルを生成するシステム上のログファ
    イルの管理を簡略化するのに使われます。

    多くの新規プログラムは "/var/log/journal" ディレクトリーの下に
    systemd-journald(8) の記録サービスを使ってそれぞれの活動をバイナ
    リファイル形式で記録します。

    systemd-cat(1) コマンドを使ってシェルスクリプトから
    systemd-journald(8) ジャーナルにデーターをログできます。

    「システムメッセージ」と「カーネルメッセージ」を参照下さい。

9.3.2. ログアナライザー

    注目すべきログアナライザー (aptitude(8) で
    "~Gsecurity::log-analyzer") を次に記します。

    表9.4 システムログアナライザーのリスト

    +---------------------------------------------------------------+
    |パッケージ|ポプコン|サイ|                 説明                 |
    |          |        | ズ |                                      |
    |----------+--------+----+--------------------------------------|
    |fail2ban  |V:101,  |2192|複数回の認証エラーを発生させる IP を使|
    |          |I:111   |    |用禁止にします                        |
    |----------+--------+----+--------------------------------------|
    |logwatch  |V:9,    |2436|綺麗な出力の Perl で書かれたログアナラ|
    |          |I:11    |    |イザー                                |
    |----------+--------+----+--------------------------------------|
    |awstats   |V:5.5,  |6934|強力で機能の多いウェッブサーバーのログ|
    |          |I:8.5   |    |アナライザー                          |
    |----------+--------+----+--------------------------------------|
    |analog    |V:3,    |3739|ウェッブサーバーのログアナライザー    |
    |          |I:85    |    |                                      |
    |----------+--------+----+--------------------------------------|
    |sarg      |V:0.74, |863 |squid の分析レポートジェネレター      |
    |          |I:0.81  |    |                                      |
    |----------+--------+----+--------------------------------------|
    |pflogsumm |V:1.5,  |173 |Postfix ログ項目サマライザー          |
    |          |I:3.8   |    |                                      |
    |----------+--------+----+--------------------------------------|
    |fwlogwatch|V:0.11, |487 |ファイアウォールログアナライザー      |
    |          |I:0.17  |    |                                      |
    |----------+--------+----+--------------------------------------|
    |squidview |V:0.03, |224 |squid の access.log ファイルのモニター|
    |          |I:0.46  |    |と分析                                |
    |----------+--------+----+--------------------------------------|
    |swatch    |V:0.09, |99  |正規表現マッチ、ハイライト、フック機能|
    |          |I:0.30  |    |付きログファイルビューワー            |
    |----------+--------+----+--------------------------------------|
    |crm114    |V:0.07, |1371|制御可能な正規表現切断機とスパムフィル|
    |          |I:0.34  |    |ター (CRM114)                         |
    |----------+--------+----+--------------------------------------|
    |icmpinfo  |V:0.01, |42  |ICMP メッセージの解釈                 |
    |          |I:0.33  |    |                                      |
    +---------------------------------------------------------------+


    注記

    CRM114 はTRE 正規表現ライブラリーを使うファジーなフィルターを書く
    言語インフラを提供します。そのよくある応用はスパムメールのフィル
    ターですが、ログアナライザーとしても使えます。

9.3.3. テキストデーターのカスタム化表示

    more(1) や less(1) 等のページャーツール (「ページャー」を参照下さ
    い) や、ハイライトやフォーマット用のカスタムツール (「プレーンテ
    キストデーターをハイライトとフォーマット」を参照下さい) はテキス
    トデーターを綺麗に表示できますが、汎用エディター (「テキストエデ
    ィター」を参照下さい) が最も汎用性がありカスタム化が可能です。

    ヒント
   
    vim(1) やそのページャーモードのエイリアス view(1) では、":set
    hls" とするとハイライトサーチが可能になります。

9.3.4. 時間と日付のカスタム化表示

    "ls -l" コマンドによる時間と日付のデフォールトの表示形式はロケー
    ル (値は「タイムスタンプ」を参照下さい) に依存します。"$LANG" 変
    数が最初に参照され、それを "$LC_TIME" か "$LC_ALL" のエクスポート
    された環境変数によりオーバーライドする事ができます。

    実際の各ロケールでのデフォールトの表示形式は使われた標準 C ライブ
    ラリー (libc6 パッケージ) のバージョンに依存します。つまり Debian
    の異なるリリースは異なるデフォールトです。ISO書式については、ISO
    8601 を参照下さい。

    ロケール以上にこの時間や日付の表示フォーマットをカスタム化したい
    と真摯に望むなら、"--time-style" 引数か "$TIME_STYLE" 値を使って
    時間スタイル値を設定するべきです (ls(1) と date(1) と "info
    coreutils 'ls invocation'" を参照下さい)。

    表9.5 "ls -l" コマンドを時間スタイル値とともに用いた場合の時間と
    日付の例

    +---------------------------------------------------------------+
    |時間スタイル |    ロケール     |       時間と日付の表示        |
    |     値      |                 |                               |
    |-------------+-----------------+-------------------------------|
    |iso          |任意             |01-19 00:15                    |
    |-------------+-----------------+-------------------------------|
    |long-iso     |任意             |2009-01-19 00:15               |
    |-------------+-----------------+-------------------------------|
    |full-iso     |任意             |2009-01-19 00:15:16.000000000  |
    |             |                 |+0900                          |
    |-------------+-----------------+-------------------------------|
    |locale       |C                |Jan 19 00:15                   |
    |-------------+-----------------+-------------------------------|
    |locale       |en_US.UTF-8      |Jan 19 00:15                   |
    |-------------+-----------------+-------------------------------|
    |locale       |es_ES.UTF-8      |ene 19 00:15                   |
    |-------------+-----------------+-------------------------------|
    |+%d.%m.%y    |任意             |19.01.09 00:15                 |
    |%H:%M        |                 |                               |
    |-------------+-----------------+-------------------------------|
    |+%d.%b.%y    |C または         |19.Jan.09 00:15                |
    |%H:%M        |en_US.UTF-8      |                               |
    |-------------+-----------------+-------------------------------|
    |+%d.%b.%y    |es_ES.UTF-8      |19.ene.09 00:15                |
    |%H:%M        |                 |                               |
    +---------------------------------------------------------------+


    ヒント

    コマンドの別名を使えばコマンドライン上で長いオプションを入力しな
    くてもよくなります (「コマンドエイリアス」を参照下さい)。

    alias ls='ls --time-style=+%d.%m.%y %H:%M'

9.3.5. 着色化されたシェル出力

    殆どの現代的なターミナルへのシェル出力は ANSI エスケープコードを
    使って着色化できます ("/usr/share/doc/xterm/ctlseqs.txt.gz" を参
    照下さい)。

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

    $ RED=$(printf "\x1b[31m")
    $ NORMAL=$(printf "\x1b[0m")
    $ REVERSE=$(printf "\x1b[7m")
    $ echo "${RED}RED-TEXT${NORMAL} ${REVERSE}REVERSE-TEXT${NORMAL}"

9.3.6. 着色化されたコマンド

    着色化されたコマンドは対話環境で出力を検査するのに便利です。私は
    、私の "~/.bashrc" に次を含めています。

    if [ "$TERM" != "dumb" ]; then
        eval "`dircolors -b`"
        alias ls='ls --color=always'
        alias ll='ls --color=always -l'
        alias la='ls --color=always -A'
        alias less='less -R'
        alias ls='ls --color=always'
        alias grep='grep --color=always'
        alias egrep='egrep --color=always'
        alias fgrep='fgrep --color=always'
        alias zgrep='zgrep --color=always'
    else
        alias ll='ls -l'
        alias la='ls -A'
    fi

    エイリアスを使うことで色効果を対話コマンド使用時に限定します。こ
    うすると less(1) 等のページャープログラムの下でも色を見られるので
    、環境変数 "export GREP_OPTIONS='--color=auto'" をエキスポートす
    るより都合が良いです。他のプログラムにパイプする際に色を使いたく
    なければ、先ほどの "~/.bashrc" 例中で代わりに "--color=auto" とし
    ます。

    ヒント
   
    対話環境でシェルを "TERM=dumb bash" として起動することで、このよ
    うな着色するエイリアスを無効にできます。

9.3.7. 複雑な反復のためにエディターでの活動を記録

    複雑な反復のためにエディターでの活動を記録できます。

    Vim の場合以下のようにします。

      * "qa": 名前付きレジスタ "a" にタイプした文字の記録を開始。

      * … エディターでの活動
   
      * "q": タイプした文字の記録を終了。

      * "@a": レジスター "a" の内容を実行。

    Emacs の場合は以下のようにします。

      * "C-x (": キーボードマクロの定義開始。

      * … エディターでの活動
   
      * "C-x )": キーボードマクロの定義終了。

      * "C-x e": キーボードマクロの実行。

9.3.8. X アプリケーションの画像イメージの記録

    xterm の表示を含めた、X アプリケーションの画像イメージを記録する
    にはいくつか方法があります。

    表9.6 画像の操作ツールのリスト

    +---------------------------------------------------------------+
    |   パッケージ   |ポプコ|サイ |screen |        コマンド         |
    |                |  ン  | ズ  |       |                         |
    |----------------+------+-----+-------+-------------------------|
    |gnome-screenshot|V:12, |1115 |Wayland|GNOME 用のスクリーンショ |
    |                |I:101 |     |       |ットアプリケーション     |
    |----------------+------+-----+-------+-------------------------|
    |flameshot       |V:8,  |3534 |Wayland|強化されたスクリーンショ |
    |                |I:18  |     |       |ットアプリケーション     |
    |----------------+------+-----+-------+-------------------------|
    |gimp            |V:44, |32791|Wayland|GUI メニュー中のスクリー |
    |                |I:216 |     |+ X    |ンショット               |
    |----------------+------+-----+-------+-------------------------|
    |x11-apps        |V:30, |2461 |X      |xwd(1)                   |
    |                |I:445 |     |       |                         |
    |----------------+------+-----+-------+-------------------------|
    |imagemagick     |V:9,  |79   |X      |import(1)                |
    |                |I:278 |     |       |                         |
    |----------------+------+-----+-------+-------------------------|
    |scrot           |V:4,  |144  |X      |scrot(1)                 |
    |                |I:50  |     |       |                         |
    +---------------------------------------------------------------+


9.3.9. 設定ファイルの変更記録

    DVCS の助力で設定ファイルの変更を記録したり、Btrfs の上でシステム
    のスナップショットを作成したりする専用のツールがあります。

    表9.7 設定の履歴を記録するパッケージのリスト

    +---------------------------------------------------------------+
    |パッケー |ポプコ|サイ|                  説明                   |
    |   ジ    |  ン  | ズ |                                         |
    |---------+------+----+-----------------------------------------|
    |         |V:24, |    |Git (デフォールト) か Mercurial か GNU   |
    |etckeeper|I:27  |157 |Bazaar を使って設定ファイルとそのメタデー|
    |         |      |    |ターを保存                               |
    |---------+------+----+-----------------------------------------|
    |timeshift|V:8,  |4481|rsync か BTRFS スナップショットを使うシス|
    |         |I:13  |    |テム回復ユーティリティー                 |
    |---------+------+----+-----------------------------------------|
    |snapper  |V:6.1,|2396|Linux ファイルシステムスナップショット管 |
    |         |I:8.1 |    |理ツール                                 |
    +---------------------------------------------------------------+


    ローカルスクリプト「バックアップのティップ」アプローチも一策です
    。

9.4. プログラム活動の監視と制御と起動

    プログラム活動は専用ツールを用いて監視と制御できます。

    表9.8 プログラム活動の監視と制御のツールのリスト

    +---------------------------------------------------------------+
    |パッケー |ポプコ |サイ |                 説明                  |
    |   ジ    |  ン   | ズ  |                                       |
    |---------+-------+-----+---------------------------------------|
    |coreutils|V:911, |17994|nice(1): スケジューリングの優先順位の変|
    |         |I:1000 |     |更してプログラムを実行                 |
    |---------+-------+-----+---------------------------------------|
    |bsdutils |V:443, |334  |renice(1): 実行中プロセスのスケジューリ|
    |         |I:999  |     |ングの優先順位を変更                   |
    |---------+-------+-----+---------------------------------------|
    |         |V:834, |     |"/proc" ファイルシステムのユーティリテ |
    |procps   |I:997  |2389 |ィー: ps(1) と top(1) と kill(1) と    |
    |         |       |     |watch(1) 等                            |
    |---------+-------+-----+---------------------------------------|
    |         |V:404, |     |"/proc" ファイルシステムのユーティリテ |
    |psmisc   |I:727  |950  |ィー: killall(1) と fuser(1) と pstree |
    |         |       |     |(1) と pstree(1)                       |
    |---------+-------+-----+---------------------------------------|
    |time     |V:6,   |148  |time(1): 時間に関するシステムリソース使|
    |         |I:81   |     |用状況を報告するためにプログラムを実行 |
    |---------+-------+-----+---------------------------------------|
    |sysstat  |V:120, |1904 |sar(1)、iostat(1)、mpstat(1)、…: Linux |
    |         |I:166  |     |用のシステムパーフォーマンスツール     |
    |---------+-------+-----+---------------------------------------|
    |isag     |V:0.1, |109  |sysstat の対話型システム活動グラフ化ソ |
    |         |I:3.3  |     |フト                                   |
    |---------+-------+-----+---------------------------------------|
    |lsof     |V:445, |492  |lsof(8): "-p" オプションを使い実行中の |
    |         |I:949  |     |プロセスが開いているファイルをリスト   |
    |---------+-------+-----+---------------------------------------|
    |strace   |V:10,  |4393 |strace(1): システムコールやシグナルを追|
    |         |I:102  |     |跡                                     |
    |---------+-------+-----+---------------------------------------|
    |ltrace   |V:1,   |420  |ltrace(1): ライブラリーコールを追跡    |
    |         |I:12   |     |                                       |
    |---------+-------+-----+---------------------------------------|
    |xtrace   |V:0.04,|342  |xtrace(1): X11 のクライアントとサーバー|
    |         |I:0.70 |     |の間の通信を追跡                       |
    |---------+-------+-----+---------------------------------------|
    |powertop |V:33,  |696  |powertop(1): システムの電力消費情報    |
    |         |I:224  |     |                                       |
    |---------+-------+-----+---------------------------------------|
    |cron     |V:922, |247  |cron(8) デーモンからバックグランドでス |
    |         |I:997  |     |ケジュール通りプロセスを実行           |
    |---------+-------+-----+---------------------------------------|
    |anacron  |V:419, |110  |1日24時間動作でないシステム用の cron 類|
    |         |I:476  |     |似のコマンドスケジューラー             |
    |---------+-------+-----+---------------------------------------|
    |at       |V:73,  |158  |at(1) と batch(1) コマンド: 特定の時間 |
    |         |I:98   |     |や特定のロードレベル以下でジョブを実行 |
    +---------------------------------------------------------------+


    ヒント
   
    procps パッケージはプログラム活動の監視と制御と起動の基本中の基本
    を提供します。このすべてを習得するべきです。

9.4.1. プロセスの時間計測

    コマンドにより呼び出されたプロセスにより使われた時間を表示します
    。

    # time some_command >/dev/null
    real    0m0.035s       # time on wall clock (elapsed real time)
    user    0m0.000s       # time in user mode
    sys     0m0.020s       # time in kernel mode

9.4.2. スケジューリングの優先度

    ナイス値はプロセスのスケジューリングの優先度を制御するのに使われ
    ます。

    表9.9 スケジューリングの優先度のためのナイス値のリスト

    +------------------------------------------------------------+
    |ナイス値|             スケジューリングの優先度              |
    |--------+---------------------------------------------------|
    |19      |優先度が最低のプロセス (ナイス)                    |
    |--------+---------------------------------------------------|
    |0       |ユーザーにとっての優先度が非常に高いプロセス       |
    |--------+---------------------------------------------------|
    |-20     |rootにとっての優先度が非常に高いプロセス (非ナイス)|
    +------------------------------------------------------------+


    # nice  -19 top                                      # very nice
    # nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # very fast

    極端なナイス値はシステムに害を与えるかもしれません。本コマンドは
    注意深く使用下さい、

9.4.3. ps コマンド

    Debian 上の ps(1) コマンドは BSD と SystemV 機能の両方をサポート
    しプロセスの活動を静的に特定するのに有用です。

    表9.10 ps コマンドのスタイルのリスト

    +----------------------------------------+
    |スタイル|典型的コマンド|      特徴      |
    |--------+--------------+----------------|
    |BSD     |ps aux        |%CPU %MEM を表示|
    |--------+--------------+----------------|
    |System V|ps -efH       |PPID を表示     |
    +----------------------------------------+


    ゾンビ (動作していない) 子プロセスに関して、"PPID" フィールドで識
    別される親プロセス ID を使ってプロセスを停止できます。

    pstree(1) コマンドはプロセスの木 (ツリー) を表示します。

9.4.4. top コマンド

    Debian 上の top(1) は機能が豊富で、どのプロセスがおかしな動きをし
    ているかを動的に識別することに役立ちます。

    それはインタラクティブなフルスクリーンプログラムです。"h"-キーを
    押すことで使用法のヘルプが得られ、 "q"-キーを押すことで終了できま
    す。

9.4.5. プロセスによって開かれているファイルのリスト

    プロセス ID (PID)、例えば1を使うプロセスによって開かれている全フ
    ァイルは以下のようにしてリストできます。

    $ sudo lsof -p 1

    PID=1 は通常 init プログラムです。

9.4.6. プログラム活動の追跡

    プラグラムの活動状況は、システムコールとシグナルは strace(1) で、
    ライブラリーコールは ltrace(1) で、X11 のクライアントとサーバーの
    通信は xtrace(1) でプラグラムの活動状況を追跡できます。

    ls コマンドのシステムコールを以下のようにして追跡できます。

    $ sudo strace ls

    ヒント
   
    きれいなトリービューを作る /usr/share/doc/strace/examples/ にある
    strace-graph スクリプトを使いましょう

9.4.7. ファイルやソケットを使っているプロセスの識別

    例えば "/var/log/mail.log" 等のファイルを使っているプロセスは
    fuser(1) によって以下のようにして識別できます。

    $ sudo fuser -v /var/log/mail.log
                         USER        PID ACCESS COMMAND
    /var/log/mail.log:   root       2946 F.... rsyslogd

    "/var/log/mail.log" ファイルが rsyslogd(8) コマンドによって書込み
    のために開かれている事が分かります。

    例えば "smtp/tcp" 等のソケットを使っているプロセスは fuser(1) に
    よって以下のようにして識別できます。

    $ sudo fuser -v smtp/tcp
                         USER        PID ACCESS COMMAND
    smtp/tcp:            Debian-exim   3379 F.... exim4

    SMTP ポート (25) への TCP 接続を処理するためにあなたのシステムで
    は exim4(8) が実行されている事がこれで分かります。

9.4.8. 一定間隔でコマンドを反復実行

    watch(1) はプログラムを一定間隔で反復実行しながらフルスクリーンで
    その出力を表示します。

    $ watch w

    こうすると2秒毎更新でシステムに誰がログオンしているかを表示します
    。

9.4.9. ファイルに関してループしながらコマンドを反復実行

    例えばグロブパターン "*.ext" へのマッチ等の何らかの条件にマッチす
    るファイルに関してループしながらコマンドを実行する方法がいくつか
    あります。

      * シェルの for-loop 法 (「シェルループ」を参照下さい):

    for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done

      * find(1) と xargs(1) の組み合わせ:

    find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command

      * コマンド付きの "-exec" オプションを使って find(1):

    find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;

      * 短いシェルスクリプト付きの "-exec" オプションを使って find
        (1):

    find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "command '{}' && echo 'successful'" \;

    上記の例はスペースを含む等の変なファイル名でも適正に処理できるよ
    うに書かれています。find(1) に関する高度な使用法の詳細は「ファイ
    ル選択の慣用句」を参照下さい。

9.4.10. GUI からプログラムをスタート

    コマンドラインインターフェース (CLI) の場合、$PATH 環境変数で指定
    されるディレクトリー中で最初にマッチした名前のプログラムが実行さ
    れます。「"$PATH" 変数」を参照下さい。

    freedesktop.org スタンダード準拠のグラフィカルユーザーインターフ
    ェース (GUI) の場合、/usr/share/applications/ ディレクトリー中の
    *.desktop ファイルにより各プログラムの GUI メニュー表示に必要なア
    トリビュートが提供されます。Freedesktop.org の xdg メニューシステ
    ムに準拠する各パッケージは "/usr/share/applications/" の下に
    "*.desktop" で提供されるそのメニューデーターをインストールします
    。Freedesktop.org 標準に準拠する現代的なデスクトップ環境は
    xdg-utils パッケージを用いてその環境用のメニューを生成します。"/
    usr/share/doc/xdg-utils/README" を参照下さい。

    例えば chromium.desktop ファイルは、プログラム名の "Name" や、プ
    ログラムの実行パスと引数の "Exec" や、使用するアイコンの "Icon"
    等の属性(Desktop Entry Specification 参照)を "Chromium Web
    Browser" に関して以下のようにして定義します:

    [Desktop Entry]
    Version=1.0
    Name=Chromium Web Browser
    GenericName=Web Browser
    Comment=Access the Internet
    Comment[fr]=Explorer le Web
    Exec=/usr/bin/chromium %U
    Terminal=false
    X-MultipleArgs=false
    Type=Application
    Icon=chromium
    Categories=Network;WebBrowser;
    MimeType=text/html;text/xml;application/xhtml_xml;x-scheme-handler/http;x-scheme-handler/https;
    StartupWMClass=Chromium
    StartupNotify=true

    これは簡略化しすぎた記述ですが、*.desktop ファイルは以下のように
    してスキャンされます。

    デスクトップ環境は $XDG_DATA_HOME と $XDG_DATA_DIR 環境変数を設定
    します。例えば GNOME では:

      * $XDG_DATA_HOME が未設定。(デフォルト値の $HOME/.local/share
        が使われます。)
   
      * $XDG_DATA_DIRS は /usr/share/gnome:/usr/local/share/:/usr/
        share/ に設定されます。

    以上により、ベースディレクトリー (XDG Base Directory
    Specification 参照) や applications ディレクトリーは以下となりま
    す。

      * $HOME/.local/share/ → $HOME/.local/share/applications/

      * /usr/share/gnome/ → /usr/share/gnome/applications/
   
      * /usr/local/share/ → /usr/local/share/applications/

      * /usr/share/ → /usr/share/applications/

    *.desktop ファイルはこれらの applications ディレクトリーでこの順
    番でスキャンされます。

    ヒント

    ユーザーによるカスタムの GUI メニュー項目は *.desktop ファイルを
    $HOME/.local/share/applications/ ディレクトリーに追加することで生
    成できます。

    ヒント
   
    "Exec=..." 行はシェルが解釈しません。環境変数を設定する場合には
    env(1) コマンドを使います。

    ヒント

    同様に、もしこれらのベースディレクトリーの下の autostart ディレク
    トリーの中に*.desktop ファイルが作成されれば、*.desktop ファイル
    中に指定されたプログラムがデスクトップ環境が起動された時点に自動
    実行されます。Desktop Application Autostart Specification を参照
    下さい。

    ヒント

    同様に、もし$HOME/Desktop ディレクトリーの中に*.desktop ファイル
    が作成され、デスクトップ環境がローンチャーアイコンを表示する機能
    を有効としていれば、そこに指定されたプログラムがアイコンをクリッ
    クした際に実行されます。$HOME/Desktopディレクトリーの実際の名前は
    ロケール依存であることを承知下さい。xdg-user-dirs-update(1) を参
    照下さい。

9.4.11. スタートするプログラムのカスタム化

    一部のプログラムは他のプログラムを自動的にスタートします。このプ
    ロセスをカスタム化する上でのチェックポイントを次に記します。

      * アプリケーション設定メニュー:

          + GNOME デスクトップ: "Settings" → "Apps" → "Default Apps"

          + KDE デスクトップ: "Application Launcher" → "System
            Settings" → "Default Applications"

          + Iceweasel ブラウザー: "Edit" → "Preferences" →
            "Applications"

          + mc(1): "/etc/mc/mc.ext"

      * "$BROWSER" や "$EDITOR" や "$VISUAL" や "$PAGER" といった環境
        変数 (environ(7) 参照下さい)

      * "editor" や "view" や "x-www-browser" や "gnome-www-browser"
        や "www-browser" 等のプログラムに関する update-alternatives
        (8) システム (「デフォールトのテキストエディターの設定」を参
        照下さい)

      * MIME タイプとプログラムと関係づける、"~/.mailcap" や "/etc/
        mailcap" ファイルの内容 (mailcap(5) 参照下さい)

      * ファイル拡張子と MIME タイプとプログラムと関係づける、"~
        /.mime.types" や "/etc/mime.types" ファイルの内容
        (run-mailcap(1) 参照下さい)

    ヒント
   
    update-mime(8) は"/etc/mailcap.order" ファイルを使って "/etc/
    mailcap" ファイルを更新します (mailcap.order(5) 参照下さい)。

    ヒント

    debianutils パッケージは、どのエディターやページャーやウェッブブ
    ラウザーを呼び出すかに関してそれぞれ賢明な判断をする
    sensible-browser(1) や sensible-editor(1) や sensible-pager(1) を
    提供します。これらのシェルスクリプトを読む事をお薦めします。

    ヒント

    GUI の下で mutt のようなコンソールアプリケーションをあなたの好む
    アプリケーションとして実行するには、以下のようにして GUI アプリケ
    ーションを作成し、前記の方法であなたの好む起動されるアプリケーシ
    ョンとして "/usr/local/bin/mutt-term" を設定します。

    # cat /usr/local/bin/mutt-term <<EOF
    #!/bin/sh
    gnome-terminal -e "mutt \$@"
    EOF
    # chmod 755 /usr/local/bin/mutt-term

9.4.12. プロセスの停止

    kill(1) を使ってプロセス ID を使ってプロセスを停止 (プロセスへシ
    グナルを送信) します。

    killall(1) や pkill(1) プロセスコマンド名や他の属性を使ってプロセ
    スを停止 (プロセスへシグナルを送信) します。

    表9.11 kill コマンドが良く使うシグナルのリスト

    +---------------------------------------------------------------+
    |シグ |シグナ |                       |                         |
    |ナル | ル名  |      アクション       |          注釈           |
    | 値  |       |                       |                         |
    |-----+-------+-----------------------+-------------------------|
    |0    |---    |シグナルが送られていま |プロセスが実行中かチェッ |
    |     |       |せん (kill(2) を参照)  |ク                       |
    |-----+-------+-----------------------+-------------------------|
    |1    |SIGHUP |プロセスの終了         |ターミナル接続の切断（シ |
    |     |       |                       |グナルがハングアップ）   |
    |-----+-------+-----------------------+-------------------------|
    |2    |SIGINT |プロセスの終了         |キーボードから割り込み   |
    |     |       |                       |(CTRL-C)                 |
    |-----+-------+-----------------------+-------------------------|
    |3    |SIGQUIT|プロセスを終了してコア |キーボードから停止 (CTRL-|
    |     |       |をダンプ               |\)                       |
    |-----+-------+-----------------------+-------------------------|
    |9    |SIGKILL|プロセスの終了         |ブロック不可能なkillシグ |
    |     |       |                       |ナル                     |
    |-----+-------+-----------------------+-------------------------|
    |15   |SIGTERM|プロセスの終了         |ブロック可能な終了シグナ |
    |     |       |                       |ル                       |
    +---------------------------------------------------------------+


9.4.13. タスク1回実行のスケジュール

    at(1) コマンドを以下のように実行して1回だけのジョブをスケジュール
    します。

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

9.4.14. タスク定期実行のスケジュール

    cron(8) コマンドを実行して定期的タスクをスケジュールします。
    crontab(1) と crontab(5) を参照下さい。

    例えば foo というノーマルユーザーとして "crontab -e" コマンドを使
    って "/var/spool/cron/crontabs/foo" という crontab(5) ファイルを
    作成することでプロセスをスケジュールして実行する事ができます。

    crontab(5) ファイルの例を次に記します。

    # use /usr/bin/sh to run commands, no matter what /etc/passwd says
    SHELL=/bin/sh
    # mail any output to paul, no matter whose crontab this is
    MAILTO=paul
    # Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed)
    # run at 00:05, every day
    5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
    # run at 14:15 on the first of every month -- output mailed to paul
    15 14 1  * *   $HOME/bin/monthly
    # run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc:
    0 22 *   * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%
    23 */2 1 2 *   echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"
    5  4 *   * sun echo "run at 04:05 every Sunday"
    # run at 03:40 on the first Monday of each month
    40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args

    ヒント

    連続稼働していないシステムでは、機器のアップタイム上可能な限り指
    定間隔に近く定期的にコマンドをスケジュールするために anacron パッ
    ケージをインストールします。anacron(8) と anacrontab(5) を参照下
    さい。

    ヒント

    スケジュールされたシステムメインテナンススクリプトは、そのような
    スクリプトを "/etc/cron.hourly/" か "/etc/cron.daily/" か "/etc/
    cron.weekly/" か "/etc/cron.monthly/" 中に置くことで root アカウ
    ントからそれらを定期的に実行できます。これらのスクリプトの実行時
    間は "/etc/crontab" と "/etc/anacrontab" でカスタム化できます。

    Systemd は cron デーモンを使わずプログラムをスケジュールする低レ
    ベル能力があります。例えば、/lib/systemd/system/apt-daily.timer
    と /lib/systemd/system/apt-daily.service は、毎日の apt ダウンロ
    ード活動を設定しています。systemd.timer(5) を参照下さい。

9.4.15. イベントに合わせたタスクのスケジュール

    Systemd は、タイマーイベントのみならずマウントイベントにもプログ
    ラムをスケジュールできます。例は、「タイマーイベントがトリガーす
    るバックアップ」 and 「マウントイベントがトリガーするバックアップ
    」を参照下さい。

9.4.16. Alt-SysRq キー

    Alt-SysRq (PrtScr) に続いて一つのキーを押すとシステムのレスキュー
    コントロールの魔法をできます。

    表9.12 特記すべき SAK コマンドキーのリスト

    +---------------------------------------------------------------+
    |Alt-SysRq に|                 アクションの説明                 |
    |  続くキー  |                                                  |
    |------------+--------------------------------------------------|
    |k           |全ての現仮想ターミナル上の全てのプロセスを停止 (K |
    |            |ll) (SAK)                                         |
    |------------+--------------------------------------------------|
    |s           |データーが壊れないように全てのマウントされたファイ|
    |            |ルシステムをsync (同期)します。                   |
    |------------+--------------------------------------------------|
    |u           |全てのマウントされたファイルシステムを読出し専用で|
    |            |再マウント (アンマウント、umount)                 |
    |------------+--------------------------------------------------|
    |r           |X クラッシュの後でキーボードを raw (生コード発生) |
    |            |モードから復旧                                    |
    +---------------------------------------------------------------+


    詳しくは、Linux kernel user’s and administrator’s guide » Linux
    Magic System Request Key Hacks を参照下さい。

    ヒント

    SSH ターミナルなどからは、"/proc/sysrq-trigger" に書き込むことで
    Alt-SysRq 機能が使えます。例えば、リモートのシェルプロンプトから
    "echo s > /proc/sysrq-trigger; echo u > /proc/sysrq-trigger" とす
    ると、全てのマウントされたファイルシステムを sync (同期) して u
    mount (アンマウント) します。

    現在 (2021年) のDebian amd64 Linux カーネルでは /proc/sys/kernel/
    sysrq=438=0b110110110 となっています:

      * 2 = 0x2 - コンソールロギングレベルのコントロールを有効化 (ON)

      * 4 = 0x4 - キーボード (SAK, unraw) のコントロールを有効化 (ON)

      * 8 = 0x8 - プロセス等のデバグダンプを有効化 (OFF)

      * 16 = 0x10 - sync コマンドを有効化 (ON)
   
      * 32 = 0x20 - remount read-only を有効化 (ON)

      * 64 = 0x40 - プロセスのシグナリング (term, kill, oom-kill) を
        有効化 (OFF)

      * 128 = 0x80 - reboot/poweroff を許可する (ON)

      * 256 = 0x100 - 全 RT タスクのナイス設定を許可する (ON)

9.5. システム管理ティップ

9.5.1. だれがシステムを利用している?

    だれがシステムを利用しているかは、以下のようにしてチェックできま
    す。

      * who(1) は、誰がログオンしているかを表示します。

      * w(1) は、誰がログオンしていて何をしているかを表示します。
   
      * last(1) は、最後にログインしたユーザーのリストを表示します。

      * lastb(1) は、最後にログイン失敗したユーザーのリストを表示しま
        す。

    ヒント
   
    "/var/run/utmp" と "/var/log/wtmp" はこのようなユーザー情報を保持
    します。login(1) と utmp(5) を参照下さい。

9.5.2. 全員への警告

    wall(1) を使うと、以下のようにしてシステムにログオンしている全員
    にメッセージを送れます。

    $ echo "We are shutting down in 1 hour" | wall

9.5.3. ハードウエアーの識別

    PCI 的デバイス (AGP、PCI-Express、CardBus、ExpressCard、等) では
    、 (きっと "-nn" オプションとともに使う) lspci(8) がハードウエア
    ー識別の良いスタート点です。

    この代わりに、"/proc/bus/pci/devices" の内容を読むか、"/sys/bus/
    pci" の下のディレクトリーツリーを閲覧することでハードウエアーの識
    別ができます (「procfs と sysfs」を参照下さい)。

    表9.13 ハードウエアー識別ツールのリスト

    +---------------------------------------------------------------+
    |パッケージ |ポプコン |サイ|                説明                |
    |           |         | ズ |                                    |
    |-----------+---------+----+------------------------------------|
    |pciutils   |V:258,   |289 |Linux PCI ユーティリティー: lspci(8)|
    |           |I:993    |    |                                    |
    |-----------+---------+----+------------------------------------|
    |usbutils   |V:83,    |322 |Linux USB ユーティリティー: lsusb(8)|
    |           |I:887    |    |                                    |
    |-----------+---------+----+------------------------------------|
    |nvme-cli   |V:24,    |2222|Linux 用の NVMe ユーティリティー:   |
    |           |I:34     |    |nvme(1)                             |
    |-----------+---------+----+------------------------------------|
    |pcmciautils|V:4.1,   |92  |Linux のための PCMCIA ユーティリティ|
    |           |I:6.4    |    |ー: pccardctl(8)                    |
    |-----------+---------+----+------------------------------------|
    |scsitools  |V:0.2,   |261 |SCSI ハードウエアー管理のためのツー |
    |           |I:2.3    |    |ル集: lsscsi(8)                     |
    |-----------+---------+----+------------------------------------|
    |procinfo   |V:0.4,   |149 |"/proc" から得られるシステム情報:   |
    |           |I:6.2    |    |lsdev(8)                            |
    |-----------+---------+----+------------------------------------|
    |lshw       |V:13,    |971 |ハードウエアー設定に関する情報: lshw|
    |           |I:90     |    |(1)                                 |
    |-----------+---------+----+------------------------------------|
    |discover   |V:26,    |81  |ハードウエアー識別システム: discover|
    |           |I:620    |    |(8)                                 |
    +---------------------------------------------------------------+


9.5.4. ハードウエアー設定

    GNOME や KDE のような現代的な GUI のデスクトップ環境ではほとんど
    のハードウエアー設定が付随する GUI 設定ツールを通じて管理できます
    が、それらの設定の基本的手法を知っておくのは良い事です。

    キーボードやターミナルの設定に関しては、「キーボード入力」と「デ
    ィスプレー出力」を参照下さい。

    表9.14 ハードウエアー設定ツールのリスト

    +---------------------------------------------------------------+
    |      パッケージ       |ポプコ |サイ |          説明           |
    |                       |  ン   | ズ  |                         |
    |-----------------------+-------+-----+-------------------------|
    |                       |V:81,  |     |Linux コンソールのフォン |
    |console-setup          |I:974  |422  |トとキーテーブルユーティ |
    |                       |       |     |リティー                 |
    |-----------------------+-------+-----+-------------------------|
    |                       |       |     |カーネルの下層の入力基本 |
    |keyd                   |V:1.1, |1437 |要素 (evdev, uinput) を用|
    |                       |I:1.3  |     |いる、キーボードキーのリ |
    |                       |       |     |マッピングデーモン       |
    |-----------------------+-------+-----+-------------------------|
    |                       |V:0.00,|     |キーボードキーのリマッピ |
    |keyd-application-mapper|I:0.09 |34   |ングデーモン - 特定アプリ|
    |                       |       |     |ケーションリマッパー     |
    |-----------------------+-------+-----+-------------------------|
    |x11-xserver-utils      |V:309, |559  |X サーバーユーティリティ |
    |                       |I:531  |     |ー: xset(1)、xmodmap(1)  |
    |-----------------------+-------+-----+-------------------------|
    |                       |       |     |Advanced Configuration   |
    |                       |V:55,  |     |and Power Interface      |
    |acpid                  |I:85   |158  |(ACPI) によって起こるイベ|
    |                       |       |     |ントの管理のためのデーモ |
    |                       |       |     |ン                       |
    |-----------------------+-------+-----+-------------------------|
    |acpi                   |V:7,   |49   |ACPI デバイス上の情報を表|
    |                       |I:79   |     |示するユーティリティー   |
    |-----------------------+-------+-----+-------------------------|
    |                       |V:0.08,|     |非使用状況のときにラップ |
    |sleepd                 |I:0.11 |84   |トップをスリープさせるデ |
    |                       |       |     |ーモン                   |
    |-----------------------+-------+-----+-------------------------|
    |                       |V:117, |     |ハードディスクアクセスの |
    |hdparm                 |I:213  |246  |最適化 (「ハードディスク |
    |                       |       |     |の最適化」を参照下さい)  |
    |-----------------------+-------+-----+-------------------------|
    |smartmontools          |V:235, |2455 |S.M.A.R.T. を使ってストレ|
    |                       |I:265  |     |ージシステムを制御監視   |
    |-----------------------+-------+-----+-------------------------|
    |setserial              |V:3.2, |104  |シリアルポートの管理ツー |
    |                       |I:5.2  |     |ル集                     |
    |-----------------------+-------+-----+-------------------------|
    |memtest86+             |V:1,   |12483|メモリーハードウエアー管 |
    |                       |I:19   |     |理のためのツール集       |
    |-----------------------+-------+-----+-------------------------|
    |scsitools              |V:0.2, |261  |SCSI ハードウエアー管理の|
    |                       |I:2.3  |     |ためのツール集           |
    |-----------------------+-------+-----+-------------------------|
    |setcd                  |V:0.06,|33   |コンパクトデバイスアクセ |
    |                       |I:0.66 |     |ス最適化                 |
    |-----------------------+-------+-----+-------------------------|
    |big-cursor             |I:0.64 |26   |X のための大きなマウスカ |
    |                       |       |     |ーソール                 |
    +---------------------------------------------------------------+


    上記で、ACPI はAPM より新しい電力管理システムの枠組みです。

    ヒント
   
    最近のシステム上の CPU フリーケンシースケーリングは acpi_cpufreq
    のようなカーネルモジュールで管理されています。

9.5.5. システムとハードウエアーの時間

    以下はシステムとハードウエアーの時間を MM/DD hh:mm, CCYY (月/日
    時:分, 年) に設定します。

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

    Debian システムでは時間は地域の時間が普通表示されますが、ハードウ
    エアーとシステムの時間は通常 UTC(GMT) を使います。

    ハードウエアーの時間が UTC に設定されていれば "/etc/default/rcS"
    の中の設定を "UTC=yes" と変更します。

    Debian システムが使うタイムゾーンは以下のようにして再設定できます
    。

    # dpkg-reconfigure tzdata

    ネットワーク経由でシステムの時間を更新したい場合には、ntp や
    ntpdate や chrony 等のパッケージを使って NTP サービスを利用するこ
    とを考えます。

    ヒント

    systemd の下では、ネットワーク時間同期には上記と代わり
    systemd-timesyncd を使います。詳細は systemd-timesyncd(8) を参照
    下さい。

    次を参照下さい。

      * 正確な日時の管理ハウツー

      * NTP 公共サービスプロジェクト

      * ntp-doc パッケージ

    ヒント
   
    ntp パッケージ中の ntptrace(8) を使うと、NTP サービスの継がりを第
    一義的根源まで溯ることができます。

9.5.6. 音のインフラ

    現在の Linux のためのサウンドカードのためのデバイスドライバーは
    Advanced Linux Sound Architecture (ALSA) で提供されています。ALSA
    は過去の Open Sound System (OSS) と互換性のためのエミュレーション
    モードを提供します。

    アプリケーションソフトはサウンドデバイスに直接アクセスするように
    ばかりでなく標準的なサウンドサーバーシステム経由で間接的にアクセ
    スするように設定されているかもしれません。現在、PulseAudio や
    JACK や PipeWire がサウンドサーバーシステムとして使われています。
    最新の状況はサウンドに関する Debian wiki を参照下さい。

    各ポピュラーなデスクトップ環境では通常共通のサウンドエンジンがあ
    ります。アプリケーションに使われるそれぞれのサウンドエンジンはそ
    れと異なるサウンドサーバーにつなぐようにもできます。

    ヒント
   
    "cat /dev/urandom > /dev/audio" か speaker-test(1) を使ってスピー
    カをテストします。(^C で停止)

    ヒント

    音が出ない場合ですが、あなたのスピーカーが消音された出力につなが
    っているかもしれません。現代的なサウンドシステムには多くの出力が
    あります。alsa-utils パッケージ中の alsamixer(1) は音量や消音の設
    定をするのに便利です。

    表9.15 サウンドパッケージのリスト

    +---------------------------------------------------------------+
    |  パッケージ   |ポプコ|サイ|               説明                |
    |               |  ン  | ズ |                                   |
    |---------------+------+----+-----------------------------------|
    |alsa-utils     |V:340,|2696|ALSA を設定し使用するユーティリティ|
    |               |I:459 |    |ー                                 |
    |---------------+------+----+-----------------------------------|
    |oss-compat     |V:0.6,|21  |ALSA の下で "/dev/dsp not found" エ|
    |               |I:9.7 |    |ラーを防ぐ OSS 互換性              |
    |---------------+------+----+-----------------------------------|
    |               |V:321,|    |オーディオとビデオ処理エンジンのマ |
    |pipewire       |I:365 |135 |ルチメディアサーバー - メタパッケー|
    |               |      |    |ジ                                 |
    |---------------+------+----+-----------------------------------|
    |               |V:328,|    |オーディオとビデオ処理エンジンのマ |
    |pipewire-bin   |I:365 |2219|ルチメディアサーバー - オーディオサ|
    |               |      |    |ーバーと CLI プログラム            |
    |---------------+------+----+-----------------------------------|
    |               |V:169,|    |オーディオとビデオ処理エンジンのマ |
    |pipewire-alsa  |I:234 |190 |ルチメディアサーバー - ALSA 代替オ |
    |               |      |    |ーディオサーバー                   |
    |---------------+------+----+-----------------------------------|
    |               |V:289,|    |オーディオとビデオ処理エンジンのマ |
    |pipewire-pulse |I:337 |53  |ルチメディアサーバー - PulseAudio  |
    |               |      |    |代替オーディオサーバー             |
    |---------------+------+----+-----------------------------------|
    |pulseaudio     |V:156,|6602|PulseAudio サーバー                |
    |               |I:182 |    |                                   |
    |---------------+------+----+-----------------------------------|
    |libpulse0      |V:440,|969 |PulseAudio クライアントライブラリー|
    |               |I:577 |    |                                   |
    |---------------+------+----+-----------------------------------|
    |jackd          |V:2,  |8   |JACK Audio Connection Kit. (JACK)  |
    |               |I:14  |    |サーバー (低遅延)                  |
    |---------------+------+----+-----------------------------------|
    |libjack0       |V:1.8,|329 |JACK Audio Connection Kit. (JACK)  |
    |               |I:8.8 |    |ライブラリー (低遅延)              |
    |---------------+------+----+-----------------------------------|
    |libphonon4qt5-4|V:22, |572 |Phonon: KDE サウンドエンジン       |
    |               |I:50  |    |                                   |
    +---------------------------------------------------------------+


9.5.7. スクリーンセーバーの無効化

    スクリーンセーバーを無効にするには、以下のコマンドを使います。

    表9.16 スクリーンセーバーを無効にするコマンドのリスト

    +---------------------------------------------------------------+
    |                環境                 |        コマンド         |
    |-------------------------------------+-------------------------|
    |Linux コンソール                     |setterm -powersave off   |
    |-------------------------------------+-------------------------|
    |X Window (スクリーンセーバー消去)    |xset s off               |
    |-------------------------------------+-------------------------|
    |X Window (dpms 無効)                 |xset -dpms               |
    |-------------------------------------+-------------------------|
    |X Window (スクリーンセーバーの GUI 設|xscreensaver-command     |
    |定)                                  |-prefs                   |
    +---------------------------------------------------------------+


9.5.8. ブザー音の無効化

    PC スピーカーのコネクタを外すとブザー音は確実に無効にできます。
    pcspkr カーネルモジュールを削除すると同じ事ができます。

    以下のようにすると bash(1) が使う readline(3) プログラムが警告文
    字 (ASCII=7) に出会った際にブザー音を発生するのを防げます。

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

9.5.9. メモリー使用状況

    メモリー使用状況を確認するのに2つのリソースがあります。

      * "/var/log/dmesg" 中にあるカーネルブートメッセージには、利用可
        能なメモリーの正確な全サイズが書かれています。
   
      * free(1) や top(1) は稼働中システムのメモリーリソース情報を表
        示します。

    以下がその例です。

    # grep '\] Memory' /var/log/dmesg
    [    0.004000] Memory: 990528k/1016784k available (1975k kernel code, 25868k reserved, 931k data, 296k init)
    $ free -k
                 total       used       free     shared    buffers     cached
    Mem:        997184     976928      20256          0     129592     171932
    -/+ buffers/cache:     675404     321780
    Swap:      4545576          4    4545572

    「dmesg は 990 MB 空いているという一方、free -k は 320 MB 空いて
    いると言っている。 600 MB 以上行方不明だ …」と不思議かもれません
    。

    "Mem:" 行の "used" のサイズが大きかったり "free" のサイズが小さか
    ったりについて悩まないでおきましょう。それらの1行下 (上記例では
    675404と321780) を読んで安心して下さい。

    1GB=1048576k の DRAM (video システムがこのメモリーの一部を使用)
    が付いている私の MacBook では以下のようになっています。

    表9.17 報告されるメモリーサイズのリスト

    +--------------------------------------------------------+
    |           報告           |           サイズ            |
    |--------------------------+-----------------------------|
    |dmesg 中の全サイズ (Total)|1016784k = 1GB - 31792k      |
    |--------------------------+-----------------------------|
    |dmesg 中の未使用 (free)   |990528k                      |
    |--------------------------+-----------------------------|
    |shell 下での全 (total)    |997184k                      |
    |--------------------------+-----------------------------|
    |shell 下での未使用 (free) |20256k (しかし実質は 321780k)|
    +--------------------------------------------------------+


9.5.10. システムのセキュリティーと整合性のチェック

    ダメなシステム管理をするとあなたのシステムを外界からの攻撃にさら
    すことになるかもしれません。

    システムのセキュリティーと整合性のチェックには、以下の事から始め
    るべきです。

      * debsums パッケージ、debsums(1) と「トップレベルの "Release"
        ファイルと信憑性」を参照下さい。

      * chkrootkit パッケージ、chkrootkit(1) 参照下さい。
   
      * clamav パッケージ類、clamscan(1) と freahclam(1) 参照下さい。

      * Debian セキュリティー FAQ.

      * Securing Debian Manual.

    表9.18 システムセキュリティーや整合性確認のためのツールリスト

    +---------------------------------------------------------------+
    |パッケージ|ポプコ |サイ |                 説明                 |
    |          |  ン   | ズ  |                                      |
    |----------+-------+-----+--------------------------------------|
    |logcheck  |V:4.8, |120  |システムログの異常を管理者にメールする|
    |          |I:5.9  |     |デーモン                              |
    |----------+-------+-----+--------------------------------------|
    |          |V:4,   |     |MD5 チェックサムを使ってインストール済|
    |debsums   |I:30   |108  |みパッケージファイルを検証するユーティ|
    |          |       |     |リティー                              |
    |----------+-------+-----+--------------------------------------|
    |chkrootkit|V:9,   |987  |ルートキット検出ソフト                |
    |          |I:14   |     |                                      |
    |----------+-------+-----+--------------------------------------|
    |clamav    |V:9,   |39204|Unix 用アンチウィルスユーティリティー |
    |          |I:39   |     |- コマンドラインインターフェース      |
    |----------+-------+-----+--------------------------------------|
    |tiger     |V:1.2, |7800 |システムセキュリティーの脆弱性を報告  |
    |          |I:1.5  |     |                                      |
    |----------+-------+-----+--------------------------------------|
    |tripwire  |V:1.3, |5060 |ファイルやディレクトリーの整合性チェッ|
    |          |I:1.6  |     |クソフト                              |
    |----------+-------+-----+--------------------------------------|
    |john      |V:1.1, |469  |アクティブなパスワードクラッキングツー|
    |          |I:7.3  |     |ル                                    |
    |----------+-------+-----+--------------------------------------|
    |aide      |V:2.0, |324  |先進的進入検出環境 - 静的ライブラリー |
    |          |I:2.4  |     |                                      |
    |----------+-------+-----+--------------------------------------|
    |integrit  |V:0.10,|2771 |ファイル整合性確認プログラム          |
    |          |I:0.18 |     |                                      |
    |----------+-------+-----+--------------------------------------|
    |crack     |V:0.09,|153  |パスワード推定プログラム              |
    |          |I:0.57 |     |                                      |
    +---------------------------------------------------------------+


    以下のシンプルなスクリプトを使うと、典型的な間違いの全員書込み可
    のファイルパーミッションをチェックできます。

    # find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)

    注意

    debsums パッケージはローカルに保存された MD5 チェックサムを使うの
    で、悪意ある攻撃に対抗するセキュリティー監査ツールとしては完全に
    は信頼できません。

9.6. データー保存のティップ

    Linux live システムとしてあなたのシステムをブート (「USB 上の
    Linux live レスキューシステム」や「GRUBからの Linux live レスキュ
    ーシステム」) すると、インストール済みシステム上のデーターストレ
    ージへの再設定が簡単になります。

    注記

    ハードディスク (HDD) に関する文言は、SSD / USB フラッシュデバイス
    / メモリーカード /... のようなストレージデバイスのような他のスト
    レージデバイスにも適用できます。例中の/dev/sda のようなデバイス名
    は、該当するデバイス名 /dev/nvme0, /dev/mmcblk0, ... に置き換えま
    す。

    あるデバイスが GUI デスクトップシステム自動マウントされた場合、そ
    れらに操作を加える前に手動でコマンドラインからそのデバイスを
    umount(8) する必要があるかもしれません。

9.6.1. ディスク空間の利用状況

    ディスク空間使用状況は mount と coreutils と xdu パッケージが提供
    するプログラムで評価できます:

      * mount(8) はマウントされたファイルシステム (= ディスク) すべて
        を報告します。

      * df(1) はファイルシステムのディスク空間使用状況を報告します。

      * du(1) はディレクトリーツリーのディスク空間使用状況を報告しま
        す。

    ヒント

    du(8) の出力を xdu(1) に "du -k . |xdu" や "sudo du -k -x / |xdu"
    等として注ぎ込むとそのグラフィカルでインタラクティブな表現が作成
    できます。

9.6.2. ディスクパーティション設定

    ディスクのパーティションの設定に関して、fdisk(8) は標準と考えられ
    てきていますが、parted(8) も注目に値します。"ディスクパーティショ
    ンデーター" や "パーティションテーブル" や "パーティションマップ"
    や "ディスクラベル" は全て同意語です。

    古い PC では、ディスクのパーティションデーターが最初のセクターと
    なる LBA セクター 0 (512バイト) に保持される、古典的なマスターブ
    ートレコード (MBR) 方式が使われています。

    Intel ベースの Mac を含むユニファイドエクステンシブルファームウェ
    アインタフェース (UEFI) 付きの一部 PC では、ディスクパーティショ
    ンデーターを最初のセクター以外に保持する GUID Partition Table
    (GPT) 方式が使われています。

    fdisk(8) はディスクパーティションツールの標準でしたが、parted(8)
    がそれを置き換えつつあります。

    表9.19 ディスクパーティション管理パッケージのリスト

    +---------------------------------------------------------------+
    |パッケージ|ポプコン|サイ|                 説明                 |
    |          |        | ズ |                                      |
    |----------+--------+----+--------------------------------------|
    |util-linux|V:917,  |4658|fdisk(8) と cfdisk(8) を含む雑多なシス|
    |          |I:1000  |    |テムユーティリティー                  |
    |----------+--------+----+--------------------------------------|
    |parted    |V:449,  |122 |GNU Parted ディスクパーティションとリ |
    |          |I:568   |    |サイズのプログラム                    |
    |----------+--------+----+--------------------------------------|
    |gparted   |V:12,   |2313|libparted ベースの GNOME パーティショ |
    |          |I:87    |    |ンエディター                          |
    |----------+--------+----+--------------------------------------|
    |gdisk     |V:19,   |967 |GPT/MBR ハイブリッドディスク用パーティ|
    |          |I:277   |    |ションエディター                      |
    |----------+--------+----+--------------------------------------|
    |kpartx    |V:17,   |76  |パーティション用のデバイスマッピングを|
    |          |I:26    |    |作成するプログラム                    |
    +---------------------------------------------------------------+


    注意

    parted(8) はファイルシステムを生成やリサイズも出きるということで
    すが、そのようなことは mkfs(8) (mkfs.msdos(8) と mkfs.ext2(8) と
    mkfs.ext3(8) とmkfs.ext4(8) と …) とか resize2fs(8) 等の最もよく
    メンテされている専用ツールを使って行う方がより安全です。

    注記

    GPT と MBR 間で切り替えるには、ディスクの最初数ブロックの内容を直
    接消去し (「ファイル内容の消去」を参照下さい)、"parted /dev/sdx
    mklabel gpt" か "parted /dev/sdx mklabel msdos" を使ってそれを設
    定する必要があります。ここで "msdos" がMBR のために使われているこ
    とを承知下さい。

9.6.3. UUID を使ってパーティションをアクセス

    あなたのパーティションの再設定やリムーバブルストレージメディアの
    アクティベーション順はパーティションの名前を変えることになるかも
    しれませんが、それに首尾一貫してアクセスできます。もしディスクが
    複数ありあなたの BIOS/UEFI がそれに首尾一貫したデバイス名をつけな
    い時にも、これは役に立ちます。

      * "-U" オプションを使って mount(8) を実行すると "/dev/sda3" の
        ようなファイル名を使うのではなく UUID を使ってブロックデバイ
        スをマウントできます。
   
      * "/etc/fstab" (fstab(5) 参照下さい) は UUID を使えます。

      * ブートローダー (「2段目: ブートローダー」) もまた UUID を使え
        ます。

    ヒント

    ブロックスペシャルデバイスの UUID はblkid(8) を使って見極められま
    す。

    "lsblk -f" を使って UUID や他の情報も調査できます。

9.6.4. LVM2

    LVM2 は Linux カーネル用の論理ボリュームマネージャーです。LVM2 を
    使うと、ディスクパーティションを物理的ハードディスクではなく論理
    ボリューム上の作成できるようになります。

    LVMには以下が必要です。

      * Linux カーネルによる device-mapper サポート (Debian カーネル
        ではデフォルト)

      * ユーザースペースの device-mapper サポートライブラリー
        (libdevmapper* パッケージ)

      * ユーザースペースの LVM2 ツール (lvm2 パッケージ)

    以下のマンページから LVM2 を学び始めましょう。

      * lvm(8): LVM2 機構の基本 (全 LVM2 コマンドのリスト)

      * lvm.conf(5): LVM2 の設定ファイル

      * lvs(8): 論理ボリュームの情報を報告します

      * vgs(8): ボリュームグループの情報を報告します

      * pvs(8): 物理ボリュームの情報を報告します

9.6.5. ファイルシステム設定

    ext4 ファイルシステム用に e2fsprogs パッケージは次を提供します。

      * 新規の ext4 ファイルシステムを作成するための mkfs.ext4(8)

      * 既存の ext4 ファイルシステムをチェックと修理するための
        fsck.ext4(8)

      * ext4 ファイルシステムのスーパーブロックを設定するための
        tune2fs(8)

      * debugfs(8) を使ってext4 ファイルシステムをインタラクティブに
        デバグします。(削除したファイルを復元する undel コマンドがあ
        ります。)

    mkfs(8) と fsck(8) コマンドは各種ファイルシステム依存プログラム
    (mkfs.fstype や fsck.fstype) のフロントエンドとして e2fsprogs に
    より提供されています。ext4 ファイルシステム用は、mkfs.ext4(8) と
    fsck.ext4(8) で、それぞれ mke2fs(8) と e2fsck(8) にシムリンクされ
    ています。

    Linux によってサポートされる各ファイルシステムでも、類似コマンド
    が利用可能です。

    表9.20 ファイルシステム管理用パッケージのリスト

    +---------------------------------------------------------------+
    |  パッケージ  |ポプコ|サイ|                説明                |
    |              |  ン  | ズ |                                    |
    |--------------+------+----+------------------------------------|
    |e2fsprogs     |V:822,|1543|ext2/ext3/ext4 ファイルシステムのた |
    |              |I:997 |    |めのユーティリティー                |
    |--------------+------+----+------------------------------------|
    |btrfs-progs   |V:51, |5250|btrfs ファイルシステムのためのユーテ|
    |              |I:78  |    |ィリティー                          |
    |--------------+------+----+------------------------------------|
    |reiserfsprogs |V:11, |473 |Reiserfs ファイルシステムのためのユ |
    |              |I:22  |    |ーティリティー                      |
    |--------------+------+----+------------------------------------|
    |zfsutils-linux|V:33, |1895|OpenZFS ファイルシステムのためのユー|
    |              |I:33  |    |ティリティー                        |
    |--------------+------+----+------------------------------------|
    |              |V:257,|    |FAT ファイルシステムのためのユーティ|
    |dosfstools    |I:564 |310 |リティー (Microsoft: MS-DOS,        |
    |              |      |    |Windows)                            |
    |--------------+------+----+------------------------------------|
    |              |V:34, |    |三星によってメンテナンスされている  |
    |exfatprogs    |I:459 |558 |exFAT ファイルシステムのためのユーテ|
    |              |      |    |ィリティー                          |
    |--------------+------+----+------------------------------------|
    |exfat-fuse    |V:2,  |73  |FUSE によるexFAT ファイルシステム   |
    |              |I:45  |    |(Microsoft) の読み書きドライバー。  |
    |--------------+------+----+------------------------------------|
    |xfsprogs      |V:41, |4382|XFS ファイルシステムのためのユーティ|
    |              |I:87  |    |リティー (SGI: IRIX)                |
    |--------------+------+----+------------------------------------|
    |              |V:201,|    |FUSE による NTFS ファイルシステム   |
    |ntfs-3g       |I:512 |1501|(Microsoft: Windows NT, …) の読み書 |
    |              |      |    |きドライバー。                      |
    |--------------+------+----+------------------------------------|
    |jfsutils      |V:0.4,|1104|JFS ファイルシステムのためのユーティ|
    |              |I:6.9 |    |リティー (IBM: AIX, OS/2)           |
    |--------------+------+----+------------------------------------|
    |              |V:14, |    |libburnia提供の、ISO-9660 ファイルシ|
    |xorriso       |I:64  |378 |ステムとCD/DVD 書き込みユーティリテ |
    |              |      |    |ィー                                |
    |--------------+------+----+------------------------------------|
    |wodim         |V:7,  |898 |cdrkit提供の、CD/DVD 書き込みコマン |
    |              |I:89  |    |ド                                  |
    |--------------+------+----+------------------------------------|
    |genisoimage   |V:17, |1567|cdrkit提供の、コマンドライン        |
    |              |I:160 |    |ISO-9660 ファイルシステムツール     |
    |--------------+------+----+------------------------------------|
    |reiser4progs  |V:0.1,|1367|Reiser4 ファイルシステムのためのユー|
    |              |I:1.2 |    |ティリティー                        |
    |--------------+------+----+------------------------------------|
    |hfsprogs      |V:0.3,|394 |HFS と HFS Plus ファイルシステムのた|
    |              |I:3.2 |    |めのユーティリティー (Apple: Mac OS)|
    |--------------+------+----+------------------------------------|
    |zerofree      |V:7,  |30  |ext2/3/4 ファイルシステムのフリーブ |
    |              |I:120 |    |ロックをゼロにセットするプログラム  |
    +---------------------------------------------------------------+


    ヒント

    Ext4 ファイルシステムは Linux システムのためのデフォルトのファイ
    ルシステムで、特定の使用しない理由がない限りこれを使用することが
    強く推奨されます。

    Btrfs の状態は Debian wiki の btrfs や kernel.org wiki の btrfs
    に記されています。btrfsファイルシステムは、ext4 ファイルシステム
    後継のデフォルトのファイルシステムとなると期待されています。

    一部のツールはファイルシステムへのアクセスを Linux カーネルのサポ
    ート無しでも可能にします (「ディスクをマウントせずに操作」を参照
    下さい)。

9.6.6. ファイルシステムの生成と整合性チェック

    mkfs(8) コマンドは Linux システム上でファイルシステムを生成します
    。fsck(8) コマンドは Linux システム上でファイルシステムの整合性チ
    ェックと修理機能を提供します。

    現在 Debian は、ファイルシステム形成後に定期的な fsck 無しがデフ
    ォルトです。

    注意
   
    一般的に fsck をマウントされているファイルシステムに実行すること
    は安全ではありません。

    ヒント

    "/etc/mke2fs.conf" 中に "enable_periodic_fsck" と設定し、"tune2fs
    -c0 /dev/partition_name"を実行して最大マウント回数を 0 と設定すれ
    ば、リブート時にfsck(8) コマンドを root ファイルシステムを含む全
    ファイルシステムに安全に実行可能です。mke2fs.conf(5) と tune2fs
    (8) を参照下さい。

    ブートスクリプトから実行される fsck(8) コマンドの結果を "/var/log
    /fsck/" 中のファイルからチェックします。

9.6.7. マウントオプションによるファイルシステムの最適化

    "/etc/fstab" により静的なファイルシステム設定がなされます。例えば
    、

    «file system»                   «mount point» «type» «options»    «dump» «pass»
    proc                                      /proc proc   defaults          0 0
    UUID=709cbe4c-80c1-56db-8ab1-dbce3146d2f7 /     ext4   errors=remount-ro 0 1
    UUID=817bae6b-45d2-5aca-4d2a-1267ab46ac23 none  swap   sw                0 0
    /dev/scd0                        /media/cdrom0  udf,iso9660 user,noauto  0 0

    ヒント

    UUID (「UUID を使ってパーティションをアクセス」を参照下さい) は、
    "/dev/sda3" や "/dev/sda3" 等の普通のブロックデバイス名の代わりに
    ブロックデバイスを指定するのに使えます。

    Linux 2.6.30 以来、カーネルは "relatime" オプションで提供される挙
    動をデフォルトとしています。

    fstab(5) と mount(8) を参照下さい。

9.6.8. スーパーブロックによるファイルシステムの最適化

    tune2fs(8) コマンドを用いてファイルシステムのスーパーブロックによ
    ってファイルシステムを最適化できます。

      * "sudo tune2fs -l /dev/sda1" を実行すると"/dev/sda1" 上のファ
        イルシステムスーパーブロックを表示します。

      * "sudo tune2fs -c 50 /dev/sda1" を実行すると"/dev/sda1" 上のフ
        ァイルシステムのチェック (ブートアップ時の fsck 実行) の頻度
        を50回のブート毎に変更します。

      * "sudo tune2fs -j /dev/sda1" の実行は ext2 から ext3 へと"/dev
        /sda1" 上のファイルシステム変換してファイルシステムにジャーナ
        リングの機能を追加します。(アンマウントしたファイルシステムに
        対して実行します。)

      * "sudo tune2fs -O extents,uninit_bg,dir_index /dev/sda1 &&
        fsck -pf /dev/sda1" の実行は"/dev/sda1" 上のファイルシステム
        を ext3 から ext4 に変換します。(アンマウントしたファイルシス
        テムに対して実行します。)

    ヒント

    tune2fs(8) は、その名前にもかかわらず、ext2 ファイルシステムに機
    能するだけでなく ext3 とか ext4 ファイルシステムに関しても機能し
    ます。

9.6.9. ハードディスクの最適化

    警告

    ハードディスクの設定はデーターの整合性にとって非常に危険な事なの
    で、その設定をさわる前にお使いのハードウエアーをチェックし hdparm
    (8) のマンページをチェックします。

    例えば "/dev/sda" に対して "hdparm -tT /dev/sda" とするとハードデ
    ィスクのアクセス速度をテストできます。(E)IDE を使って接続された一
    部のハードディスクでは、"(E)IDE 32ビット I/O サポート" を有効にし
    "using_dma フラグ" を有効にし "interrupt-unmask フラグ" を設定し
    "複数16セクター I/O" を設定するように、"hdparm -q -c3 -d1 -u1
    -m16 /dev/sda" とすると高速化できます (危険です!)。

    例えば "/dev/sda" に対して "hdparm -W /dev/sda" とするとハードデ
    ィスクの書込みキャッシュ機能をテストできます。"hdparm -W 0 /dev/
    sda" とするとハードディスクの書込みキャッシュ機能を無効にできます
    。

    不良プレスの CDROM を現代的な高速 CD-ROM ドライブで読むには、
    "setcd -x 2" としてそれを減速して使えば読めるかもしれません。

9.6.10. ソリッドステートドライブの最適化

    現在、ソリッドステートドライブ (SSD) は自動検出されます。

    揮発性のデーターパスの上に "tmpfs" を /etc/fstab でマウントするこ
    とで、不必要なディスクアクセスを減らしてディスクの消耗りを防ぎま
    す。

9.6.11. SMART を用いたハードディスクの破壊の予測

    smartd(8) デーモンを使うと SMART に文句を言うハードディスクの監視
    と記録ができます。

     1. BIOS のSMART 機能を有効にします。

     2. smartmontools パッケージをインストールします。

     3. df(1) を使ってリストすることであなたのハードディスクを識別し
        ます。

          + 監視対象のハードディスクを "/dev/sda" と仮定します。

     4. SMART 機能が実際に有効となっているかを "smartctl -a /dev/sda"
        のアウトプットを使ってチェックします。

          + もし有効でない場合には、"smartctl -s on -a /dev/sda" とし
            て有効にします。

     5. 以下のようにして smartd(8) デーモンを実行します。

          + "/etc/default/smartmontools" ファイル中の "start_smartd=
            yes" をアンコメントします。

          + "sudo systemctl restart smartmontools" として smartd(8)
            デーモンを再実行します。

    ヒント
   
    smartd(8) デーモンは、警告の通知の仕方を含めて /etc/smartd.conf
    ファイルを用いてカスタム化できます。

9.6.12. $TMPDIR 経由で一時保存ディレクトリーを指定

    普通アプリケーションは一時保存ディレクトリー "/tmp" のもとに一時
    ファイルを作成します。もし "/tmp" が十分なスペースを提供できない
    場合、行儀のいいプログラムなら $TMPDIR 変数を使ってそのような一時
    保存ディレクトリを指定できます。

9.6.13. LVM を使う使用可能なストレージ空間の拡張

    インストール時に論理ボリュームマネージャー (LVM) (Linux 機能) 上
    に作られたパーティションは、大掛かりなシステムの再設定無しに複数
    のストレージデバイスにまたがる LVM 上のエクステントを継ぎ足したり
    その上のエクステントを切り捨てることで簡単にサイズ変更が出きます
    。

9.6.14. 他パーティションをマウントする使用可能なストレージ空間の拡張

    空のパーティションがあれば (例えば "/dev/sdx")、それを mkfs.ext4
    (1) を使ってフォーマットし、それをあなたが空間をより必要とするデ
    ィレクトリーに mount(8) することができます。(元来あったデーター内
    容はコピーする必要があります。)

    $ sudo mv work-dir old-dir
    $ sudo mkfs.ext4 /dev/sdx
    $ sudo mount -t ext4 /dev/sdx work-dir
    $ sudo cp -a old-dir/* work-dir
    $ sudo rm -rf old-dir

    ヒント

    上記の代わりに、空のディスクイメージファイル (「空のディスクイメ
    ージ作成」を参照下さい) をループデバイスとしてマウントする (「デ
    ィスクイメージファイルをマウント」を参照下さい) 事もできます。実
    際のディスク使用は実際にデーターを溜め込むとともに成長します。

9.6.15. 他ディレクトリーをバインドマウントする使用可能なストレージ空
間の拡張

    使える空間がある他のパーティション中に空のディレクトリーがあれば
    (例えば "/path/to/emp-dir")、そのディレクトリーを --bind" オプシ
    ョンを使って、空間を必要としているディレクトリー (例えば
    "work-dir")にマウントすることができます。

    $ sudo mount --bind /path/to/emp-dir work-dir

9.6.16. 他ディレクトリーをオーバーレーマウントすることで使用可能なス
トレージ空間を拡張

    Linux カーネル 3.18 以降 (Debian Stetch 9.0 以降) を使うと、他の
    パーティション中に使える空間 (例えば "/path/to/empty" と "/path/
    to/work") があれば、その中にディレクトリーを作成し、容量が必要な
    古いディレクトリー(e.g., "/path/to/old")の上に OverlayFS を使って
    積み重ねることができます。

    $ sudo mount -t overlay overlay \
      -olowerdir=/path/to/old-dir,upperdir=/path/to/empty,workdir=/path/to/work

    ここで、"/path/to/old" 上に書き込むには、読み書きが許可されたパー
    ティション上に "/path/to/empty" と "/path/to/work" があることが必
    要です。

9.6.17. シムリンクを使う使用可能なストレージ空間の拡張

    注意

    ここに書かれている事は非推奨です。ソフトウェアーによっては「ディ
    レクトリーへのシムリンク」ではうまく機能しません。上記の「マウン
    トする」アプローチを代わりに使って下さい。

    使える空間がある他のパーティション中に空のディレクトリーがあれば
    (例えば "/path/to/emp-dir")、そのディレクトリーへ ln(8) を使って
    シムリンクを作成することができます。

    $ sudo mv work-dir old-dir
    $ sudo mkdir -p /path/to/emp-dir
    $ sudo ln -sf /path/to/emp-dir work-dir
    $ sudo cp -a old-dir/* work-dir
    $ sudo rm -rf old-dir

    警告

    "ディレクトリーへのシムリンク" を "/opt" のようなシステムが管理す
    るディレクトリーに使用してはいけません。システムがアップグレード
    される際にそのようなシムリンクは上書きされるかもしれません。

9.7. ディスクイメージ

    次に、ディスクイメージの操作を論じます。

9.7.1. ディスクイメージの作成

    マウントされていない、例えば2番目の SCSI か ATA ドライブの "/dev/
    sdb"、デバイスのディスクイメージファイル "disk.img" は、以下のひ
    とつで書き込めます。

    # dd if=/dev/sdb of=disk.img; sync

    # cp /dev/sdb disk.img ; sync

    # cat /dev/sdb > disk.img ; sync

    プライマリ IDE ディスクの最初のセクターにある伝統的 PC のマスター
    ブートレコード (MBR) (「ディスクパーティション設定」を参照下さい)
    のディスクイメージは、dd(1) を用いれば以下のようにして作れます。

    # dd if=/dev/sda of=mbr.img bs=512 count=1
    # dd if=/dev/sda of=mbr-nopart.img bs=446 count=1
    # dd if=/dev/sda of=mbr-part.img skip=446 bs=1 count=66

      * "mbr.img": パーティションテーブル付きの MBR

      * "mbr-nopart.img": パーティションテーブル抜きの MBR。

      * "mbr-part.img": MBR のパーティションテーブルのみ。

    オリジナルディスクのパーティションのイメージを作る場合には、"/dev
    /sda" を"/dev/sda1" 等で置き換えます。

9.7.2. ディスクに直接書込み

    ディスクイメージファイル "disk.img" は、例えばサイズがマッチする2
    番目の SCSI ドライブ"/dev/sdb" に、、以下のひとつで書き込めます。

    # dd if=disk.img of=/dev/sdb ; sync

    # cp disk.img /dev/sdb ; sync

    # cat disk.img >/dev/sdb ; sync

    同様にディスクパーティションイメージファイル "partition.img" はサ
    イズがマッチする例えば "/dev/sdb1" という2番目の SCSI ドライブの1
    番目のパーティションに以下のようにして書き込むことができます。

    # dd if=partition.img of=/dev/sdb1 ; sync

9.7.3. ディスクイメージファイルをマウント

    単一パーティションイメージを含むディスクイメージ "partition.img"
    は以下のように loop デバイスを使いマウントしアンマウントできます
    。

    # losetup --show -f partition.img
    /dev/loop0
    # mkdir -p /mnt/loop0
    # mount -t auto /dev/loop0 /mnt/loop0
    ...hack...hack...hack
    # umount /dev/loop0
    # losetup -d /dev/loop0

    これは以下のように簡略化出来ます。

    # mkdir -p /mnt/loop0
    # mount -t auto -o loop partition.img /mnt/loop0
    ...hack...hack...hack
    # umount partition.img

    複数のパーティションを含むディスクイメージ "disk.img" の各パーテ
    ィションは loop デバイスを使ってマウント出来ます。

    # losetup --show -f -P disk.img
    /dev/loop0
    # ls -l /dev/loop0*
    brw-rw---- 1 root disk   7,  0 Apr  2 22:51 /dev/loop0
    brw-rw---- 1 root disk 259, 12 Apr  2 22:51 /dev/loop0p1
    brw-rw---- 1 root disk 259, 13 Apr  2 22:51 /dev/loop0p14
    brw-rw---- 1 root disk 259, 14 Apr  2 22:51 /dev/loop0p15
    # fdisk -l /dev/loop0
    Disk /dev/loop0: 2 GiB, 2147483648 bytes, 4194304 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: gpt
    Disk identifier: 6A1D9E28-C48C-2144-91F7-968B3CBC9BD1

    Device         Start     End Sectors  Size Type
    /dev/loop0p1  262144 4192255 3930112  1.9G Linux root (x86-64)
    /dev/loop0p14   2048    8191    6144    3M BIOS boot
    /dev/loop0p15   8192  262143  253952  124M EFI System

    Partition table entries are not in disk order.
    # mkdir -p /mnt/loop0p1
    # mkdir -p /mnt/loop0p15
    # mount -t auto /dev/loop0p1 /mnt/loop0p1
    # mount -t auto /dev/loop0p15 /mnt/loop0p15
    # mount |grep loop
    /dev/loop0p1 on /mnt/loop0p1 type ext4 (rw,relatime)
    /dev/loop0p15 on /mnt/loop0p15 type vfat (rw,relatime,fmask=0002,dmask=0002,allow_utime=0020,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
    ...hack...hack...hack
    # umount /dev/loop0p1
    # umount /dev/loop0p15
    # losetup -d /dev/loop0

    この他、同様の効果は kpartx パッケージの kpartx(8) により作られる
    デバイスマッパーデバイスを用いて以下のようにして実現も出来ます。

    # kpartx -a -v disk.img
    add map loop0p1 (253:0): 0 3930112 linear 7:0 262144
    add map loop0p14 (253:1): 0 6144 linear 7:0 2048
    add map loop0p15 (253:2): 0 253952 linear 7:0 8192
    # fdisk -l /dev/loop0
    Disk /dev/loop0: 2 GiB, 2147483648 bytes, 4194304 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: gpt
    Disk identifier: 6A1D9E28-C48C-2144-91F7-968B3CBC9BD1

    Device         Start     End Sectors  Size Type
    /dev/loop0p1  262144 4192255 3930112  1.9G Linux root (x86-64)
    /dev/loop0p14   2048    8191    6144    3M BIOS boot
    /dev/loop0p15   8192  262143  253952  124M EFI System

    Partition table entries are not in disk order.
    # ls -l /dev/mapper/
    total 0
    crw------- 1 root root 10, 236 Apr  2 22:45 control
    lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p1 -> ../dm-0
    lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p14 -> ../dm-1
    lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p15 -> ../dm-2
    # mkdir -p /mnt/loop0p1
    # mkdir -p /mnt/loop0p15
    # mount -t auto /dev/mapper/loop0p1 /mnt/loop0p1
    # mount -t auto /dev/mapper/loop0p15 /mnt/loop0p15
    # mount |grep loop
    /dev/loop0p1 on /mnt/loop0p1 type ext4 (rw,relatime)
    /dev/loop0p15 on /mnt/loop0p15 type vfat (rw,relatime,fmask=0002,dmask=0002,allow_utime=0020,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
    ...hack...hack...hack
    # umount /dev/mapper/loop0p1
    # umount /dev/mapper/loop0p15
    # kpartx -d disk.img

9.7.4. ディスクイメージのクリーニング

    ディスクイメージファイル "disk.img" は消去済みのファイルを綺麗に
    無くした綺麗なスパースイメージ "new.img" に以下のようにしてできま
    す。

    # mkdir old; mkdir new
    # mount -t auto -o loop disk.img old
    # dd bs=1 count=0 if=/dev/zero of=new.img seek=5G
    # mount -t auto -o loop new.img new
    # cd old
    # cp -a --sparse=always ./ ../new/
    # cd ..
    # umount new.img
    # umount disk.img

    もし "disk.img" が ext2 か ext3 か ext4 の場合には、zerofree パッ
    ケージの zerofree(8) を使うことも出来ます。

    # losetup --show -f disk.img
    /dev/loop0
    # zerofree /dev/loop0
    # cp --sparse=always disk.img new.img
    # losetup -d /dev/loop0

9.7.5. 空のディスクイメージ作成

    5GiB まで成長可能な空のディスクイメージファイル "disk.img" はdd
    (1) を用いて以下のようにして作成できます。

    $ dd bs=1 count=0 if=/dev/zero of=disk.img seek=5G

    ここで dd(1) の利用に代え、特化した fallocate(8) の利用ができます
    。

    loop デバイスを使ってこのディスクイメージ "disk.img" 上に ext4 フ
    ァイルシステムを作成できます。

    # losetup --show -f disk.img
    /dev/loop0
    # mkfs.ext4 /dev/loop0
    ...hack...hack...hack
    # losetup -d /dev/loop0
    $ du  --apparent-size -h disk.img
    5.0G  disk.img
    $ du -h disk.img
    83M disk.img

    "sparse" に関して、そのファイルサイズは 5.0GiB でその実ディスク使
    用はたったの 83MiB です。この相違は ext4 がスパースファイルを保持
    できるから可能となっています。

    ヒント
   
    スパースファイルによる実際のディスク使用はそこに書かれるデーター
    とともに成長します。

    「ディスクイメージファイルをマウント」にあるように loop デバイス
    またはデバイスマッパーデバイスによりデバイスに同様の操作をするこ
    とで、このディスクイメージ "disk.img" をparted(8) または fdisk(8)
    を使ってパーティションし mkfs.ext4(8) や mkswap(8) 等を使ってファ
    イルシステムを作れます。

9.7.6. ISO9660 イメージファイル作成

    ヒント

    cdrkit が提供するgenisoimage(1) や、Libburnia が提供する
    xorrisofs(1) はコマンド名以外のコマンドシンタックスを共有していま
    す。

    "source_directory" のソースディレクトリーツリーから作られる
    ISO9660 イメージファイル"cd.iso" はcdrkit が提供する genisoimage
    (1) を使って以下のようにして作成できます。

    #  genisoimage -r -J -T -V volume_id -o cd.iso source_directory

    同様に、ブート可能な ISO9660 イメージファイル "cdboot.iso" は、
    debian-installer のような "source_directory" にあるディレクトリー
    ツリーから以下のようにして作成できます。

    #  genisoimage -r -o cdboot.iso -V volume_id \
       -b isolinux/isolinux.bin -c isolinux/boot.cat \
       -no-emul-boot -boot-load-size 4 -boot-info-table source_directory

    上記では、Isolinux ブートローダー (「2段目: ブートローダー」を参
    照下さい) がブートに使われています。

    以下のようにすると CD-ROM デバイスから直接 md5sum 値を計算し
    ISO9660 イメージを作成できます。

    $ isoinfo -d -i /dev/cdrom
    CD-ROM is in ISO 9660 format
    ...
    Logical block size is: 2048
    Volume size is: 23150592
    ...
    # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum
    # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso

    警告
   
    正しい結果を得るために上記のように Linux の ISO9660 ファイルシス
    テム先読みバグを注意深く避けなければいけません。

9.7.7. CD/DVD-R/RW に直接書込み

    ヒント

    DVD iは cdrkit が提供するwodim(1) や、Libburnia が提供する
    xorrrecord(1) にとって、DVDは大きな CD でしかありません。これらコ
    マンドは、コマンド名以外のコマンドシンタックスを共有しています。

    使えるデバイスは以下のようにするとみつかります。

    # wodim --devices

    そしてブランクの CD-R をドライブに挿入して、例えば "/dev/sda" と
    いうこのデバイスに ISO9660 イメージファイル "cd.iso" にwodim(1)
    を使って以下のようにして書込みます。

    # wodim -v -eject dev=/dev/sda cd.iso

    もし CD-R ではなく CD-RW が使われている場合には、次を代わりに実行
    して下さい。

    # wodim -v -eject blank=fast dev=/dev/sda cd.iso

    ヒント

    もしあなたのデスクトップシステムが CD を自動的にマウントする場合
    、wodim(1) を使う前に "sudo unmount /dev/sda" として CD をアンマ
    ウントします。

9.7.8. ISO9660 イメージファイルをマウント

    もし "cd.iso" の内容が ISO9660 イメージの場合、以下のようにすると
    それを "/cdrom" に手動でマウントできます。

    # mount -t iso9660 -o ro,loop cd.iso /cdrom

    ヒント

    現代的なデスクトップシステムではISO9660フォーマットされた CD のよ
    うなリムーバブルメディアを自動的にマウントします (「リムーバブル
    ストレージデバイス」を参照下さい)。

9.8. バイナリーデーター

    次に、ストレージメディア上のバイナリーデーターを直接操作すること
    を論じます。

9.8.1. バイナリーデーターの閲覧と編集

    もっとも基本的なバイナリーファイルを閲覧方法は "od -t x1" コマン
    ドを使うことです。

    表9.21 バイナリーデーターを閲覧や編集するパッケージのリスト

    +---------------------------------------------------------------+
    |  パッケージ   |ポプコ |サイ |              説明               |
    |               |  ン   | ズ  |                                 |
    |---------------+-------+-----+---------------------------------|
    |               |V:911, |     |ファイルをダンプする od(1) がある|
    |coreutils      |I:1000 |17994|基本パッケージ (HEX, ASCII,      |
    |               |       |     |OCTAL, …)                        |
    |---------------+-------+-----+---------------------------------|
    |               |V:4,   |     |ファイルをダンプする hd(1) がある|
    |bsdmainutils   |I:136  |17   |ユーティリティーパッケージ (HEX, |
    |               |       |     |ASCII, OCTAL, …)                 |
    |---------------+-------+-----+---------------------------------|
    |hexedit        |V:0.8, |70   |バイナリーエディターとビューワー |
    |               |I:7.9  |     |(HEX, ASCII)                     |
    |---------------+-------+-----+---------------------------------|
    |bless          |V:0.2, |924  |フル機能の16進エディター (GNOME) |
    |               |I:1.4  |     |                                 |
    |---------------+-------+-----+---------------------------------|
    |okteta         |V:1,   |1589 |フル機能の16進エディター (KDE4)  |
    |               |I:12   |     |                                 |
    |---------------+-------+-----+---------------------------------|
    |ncurses-hexedit|V:0.1, |130  |バイナリーエディターとビューワー |
    |               |I:1.2  |     |(HEX, ASCII, EBCDIC)             |
    |---------------+-------+-----+---------------------------------|
    |beav           |V:0.04,|137  |バイナリーエディターとビューワー |
    |               |I:0.32 |     |(HEX, ASCII, EBCDIC, OCTAL, …)   |
    +---------------------------------------------------------------+


    ヒント

    HEX は底が16の16進フォーマットです。OCTAL は底が8の8進フォーマッ
    トです。ASCII (アスキー) は情報交換用アメリカ標準コードで、普通の
    英文テキストです。EBCDIC (エビシディック) は IBM メインフレームオ
    ペレーティングシステム上で使われる拡張二進化十進数互換コードです
    。

9.8.2. ディスクをマウントせずに操作

    ディスクをマウントせずに読出しや書込みをするツールがあります。

    表9.22 ディスクをマウントせずに操作するパッケージのリスト

    +---------------------------------------------------------------+
    |パッケー| ポプコン |サイ |                説明                 |
    |   ジ   |          | ズ  |                                     |
    |--------+----------+-----+-------------------------------------|
    |mtools  |V:7, I:53 |400  |MSDOS ファイルをマウントせずに使うツ |
    |        |          |     |ール                                 |
    |--------+----------+-----+-------------------------------------|
    |hfsutils|V:0.2,    |178  |HFS や HFS+ ファイルをマウントせずに |
    |        |I:2.7     |     |使うツール                           |
    +---------------------------------------------------------------+


9.8.3. データーの冗長性

    Linux カーネルが提供するソフトウェアー RAID システムは高いレベル
    のストレージ信頼性を達成するためにカーネルのファイルシステムのレ
    ベルでデーターの冗長性を提供します。

    アプリケーションプログラムレベルでストレージの高い信頼性を達成す
    るようにデーター冗長性を付加するツールもあります。

    表9.23 ファイルにデーターの冗長性を追加するツールのリスト

    +---------------------------------------------------------------+
    |パッケージ|ポプコン|サイ|                 説明                 |
    |          |        | ズ |                                      |
    |----------+--------+----+--------------------------------------|
    |par2      |V:9,    |297 |ファイルのチェックと修理のためのパリテ|
    |          |I:116   |    |ィーアーカイブセット                  |
    |----------+--------+----+--------------------------------------|
    |dvdisaster|V:0.1,  |1422|CD/DVD メディアのデーターロス/傷つき/ |
    |          |I:1.2   |    |老化の防止                            |
    |----------+--------+----+--------------------------------------|
    |dvbackup  |V:0.01, |413 |MiniDV カメラレコーダを使うバックアッ |
    |          |I:0.03  |    |プツール (rsbep(1) を提供)            |
    +---------------------------------------------------------------+


9.8.4. データーファイルの復元と事故の証拠解析

    データーファイルの復元と事故の証拠解析のツールがあります。

    表9.24 データーファイルの復元と事故の証拠解析のリスト

    +---------------------------------------------------------------+
    | パッケージ  |ポプコン|サイ|               説明                |
    |             |        | ズ |                                   |
    |-------------+--------+----+-----------------------------------|
    |testdisk     |V:2,    |2275|パーティションのスキャンとディスク |
    |             |I:25    |    |復元のためのユーティリティー       |
    |-------------+--------+----+-----------------------------------|
    |magicrescue  |V:0.2,  |257 |マジックバイトを探してファイルを復 |
    |             |I:1.7   |    |元するユーティリティー             |
    |-------------+--------+----+-----------------------------------|
    |scalpel      |V:0.2,  |89  |質素で高性能なファイル彫刻刀       |
    |             |I:2.2   |    |                                   |
    |-------------+--------+----+-----------------------------------|
    |myrescue     |V:0.2,  |81  |破壊したハードディスクからデーター |
    |             |I:1.8   |    |を救出                             |
    |-------------+--------+----+-----------------------------------|
    |extundelete  |V:0.5,  |152 |ext3/4 ファイルシステム上のファイル|
    |             |I:7.3   |    |の削除復元ユーティリティー         |
    |-------------+--------+----+-----------------------------------|
    |ext4magic    |V:0.3,  |235 |ext3/4 ファイルシステム上のファイル|
    |             |I:3.4   |    |の削除復元ユーティリティー         |
    |-------------+--------+----+-----------------------------------|
    |ext3grep     |V:0.2,  |299 |ext3 ファイルシステム上のファイルの|
    |             |I:1.8   |    |削除復元ヘルプツール               |
    |-------------+--------+----+-----------------------------------|
    |scrounge-ntfs|V:0.2,  |49  |NTFS ファイルシステム上のデーター復|
    |             |I:1.5   |    |元プログラム                       |
    |-------------+--------+----+-----------------------------------|
    |gzrt         |V:0.03, |34  |gzip 復元ツールキット              |
    |             |I:0.47  |    |                                   |
    |-------------+--------+----+-----------------------------------|
    |sleuthkit    |V:2,    |1119|証拠解析のためのツール (Sleuthkit) |
    |             |I:25    |    |                                   |
    |-------------+--------+----+-----------------------------------|
    |autopsy      |V:0.2,  |1026|SleuthKit のための GUI             |
    |             |I:1.1   |    |                                   |
    |-------------+--------+----+-----------------------------------|
    |foremost     |V:0.4,  |102 |データー復元のための証拠解析アプリ |
    |             |I:4.0   |    |ケーション                         |
    |-------------+--------+----+-----------------------------------|
    |guymager     |V:0.13, |1049|Qt 使用の証拠解析用イメージ作成ソフ|
    |             |I:0.75  |    |ト                                 |
    |-------------+--------+----+-----------------------------------|
    |dcfldd       |V:0.3,  |113 |証拠解析とセキュリティーのための dd|
    |             |I:2.7   |    |の強化版                           |
    +---------------------------------------------------------------+


    ヒント

    e2fsprogs パッケージ中の debugfs(8) の list_deleted_inodes または
    undel コマンドを用いると ext2 ファイルシステム上でファイルのアン
    デリートができます。

9.8.5. 大きなファイルを小さなファイルに分割

    単一ファイルでバックアップするにはデーターが大きすぎる場合、その
    ファイル内容を例えば 2000MiB の断片にしてバックアップし、それらの
    断片を後日マージしてオリジナルのファイルに戻せます。

    $ split -b 2000m large_file
    $ cat x* >large_file

    注意
   
    名前がかち合わないように "x" で始まるファイル名のファイルが無いよ
    うにします。

9.8.6. ファイル内容の消去

    ログファイルのようなファイルの内容を消去するためには、rm(1) を使
    ってファイルを消去しその後新しい空ファイルを作成することは止めま
    す。コマンド実行間にファイルがアクセスされているかもしれないのが
    この理由です。以下のようにするのがファイル内容を消去する安全な方
    法です。

    $ :>file_to_be_cleared

9.8.7. ダミーファイル

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

    $ dd if=/dev/zero    of=5kb.file bs=1k count=5
    $ dd if=/dev/urandom of=7mb.file bs=1M count=7
    $ touch zero.file
    $ : > alwayszero.file

    以下のファイルを見つかります。

      * "5kb.file" は5KB のゼロの連続です。

      * "7mb.file" は7MB のランダムなデーターです。

      * "zero.file" は0バイト長のファイルかもしれません。もしファイル
        が存在する時は、その mtime を更新しその内容と長さを保持します
        。

      * "alwayszero.file" は常に0バイト長ファイルです。もしファイルが
        存在する時は mtime を更新しファイル内容をリセットします。

9.8.8. ハードディスクの全消去

    "/dev/sda" にある USB フラッシュドライブ等のハードディスク類似デ
    バイス全体のデーターを完全に消すいくつかの方法があります。

    注意

    コマンドを実行する前にまず USB フラッシュドライブの場所を mount
    (8) を使ってチェックします。"/dev/sda" によって指し示されるデバイ
    スは、あなたの全システムが存在する、 SCSI ハードディスクやシリア
    ル ATA ハードディスクかも知れません。

    以下のようにしてデーターを0にリセットして全消去します。

    # dd if=/dev/zero of=/dev/sda

    以下のようにしてランダムデーターを上書きして全消去します。

    # dd if=/dev/urandom of=/dev/sda

    以下のようにしてランダムデーターを非常に効率的に上書きして全消去
    します。

    # shred -v -n 1 /dev/sda

    これに代え badblocks(8) を -t random オプションとともに用いること
    ができる。

    Debian インストーラ CD 等の多くのブート可能な Linux の CD のシェ
    ルから dd(1) が利用可能ですから、"/dev/sda" や "/dev/sda" 等のシ
    ステムハードディスクに対して同類のメディアから消去コマンドを実行
    することでインストールされたシステムを完全に消去することができま
    す。

9.8.9. ハードディスク未使用部分の全消去

    データーの消去はファイルシステムからアンリンクされているだけなの
    で、例えば "/dev/sdb1" のようなハードディスク (USB フラッシュドラ
    イブ) 上の使用されていない領域には消去されたデーター自身が含まれ
    ているかもしれません。これらに上書きすることで綺麗に消去できます
    。

    # mount -t auto /dev/sdb1 /mnt/foo
    # cd /mnt/foo
    # dd if=/dev/zero of=junk
    dd: writing to `junk': No space left on device
    ...
    # sync
    # umount /dev/sdb1

    警告

    あなたの USB フラッシュドライブではこれで通常十分です。でもこれは
    完璧ではありません。消去されたファイル名や属性はファイルシステム
    中に隠れて残っているかもしれません。

9.8.10. 削除されたがまだオープン中のファイルの復活法

    ファイルをうっかり消去しても、そのファイルが何らかのアプリケーシ
    ョン (読出しか書込み) によって使われている限り、そのようなファイ
    ルを復元出来ます。

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

    $ echo foo > bar
    $ less bar
    $ ps aux | grep ' less[ ]'
    bozo    4775  0.0  0.0  92200   884 pts/8    S+   00:18   0:00 less bar
    $ rm bar
    $ ls -l /proc/4775/fd | grep bar
    lr-x------ 1 bozo bozo 64 2008-05-09 00:19 4 -> /home/bozo/bar (deleted)
    $ cat /proc/4775/fd/4 >bar
    $ ls -l
    -rw-r--r-- 1 bozo bozo 4 2008-05-09 00:25 bar
    $ cat bar
    foo

    この代わりに、(lsof パッケージがインストールされている時) もう一
    つのターミナルで以下のように実行します。

    $ ls -li bar
    2228329 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:02 bar
    $ lsof |grep bar|grep less
    less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar
    $ rm bar
    $ lsof |grep bar|grep less
    less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar (deleted)
    $ cat /proc/4775/fd/4 >bar
    $ ls -li bar
    2228302 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:05 bar
    $ cat bar
    foo

9.8.11. 全てのハードリンクを検索

    ハードリンクのあるファイルは "ls -li" を使って確認できます、

    $ ls -li
    total 0
    2738405 -rw-r--r-- 1 root root 0 2008-09-15 20:21 bar
    2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 baz
    2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 foo

    "baz" も "foo" もリンク数が "2" (>1) でハードリンクがある事を示し
    ています。これらの inode 番号は共通の "2738404" です。これはこれ
    らがハードリンクされた同じファイルということを意味します。ハード
    リンクされた全てのファイルを偶然うまく見つけられない場合は、それ
    を例えば "2738404" という inode で以下のようにして探せます。

    # find /path/to/mount/point -xdev -inum 2738404

9.8.12. 見えないディスクスペースの消費

    削除されたがオープンされたままのファイルは、普通の du(1) では見え
    ませんが、ディスクスペースを消費します。これらは以下のようにすれ
    ばそのサイズとともにリストできます。

    # lsof -s -X / |grep deleted

9.9. データー暗号化ティップ

    あなたの PC への物理的アクセスがあると、誰でも簡単に root 特権を
    獲得できあなたの PC の全てのファイルにアクセスできます (「root パ
    スワードのセキュリティー確保」を参照下さい)。これが意味するところ
    は、あなたの PC が盗まれた場合にログインのパスワードではあなたの
    プライベートでセンシティブなデーターを守れないと言うことです。そ
    れを達成するにはデーターの暗号化技術を適用しなければいけません。
    GNU プライバシーガード (「データーセキュリティーのインフラ」を参
    照下さい) はファイルを暗号化できますが、少々手間がかかります。

    dm-crypt は、ネイティブ Linux カーネルモジュール経由での自動デー
    ター暗号化を、最小限のユーザー努力で device-mapper 経由で可能にし
    ます。

    表9.25 データー暗号化ユーティリティーのリスト

    +---------------------------------------------------------------+
    |  パッケージ  |ポプコ |サイ|               説明                |
    |              |  ン   | ズ |                                   |
    |--------------+-------+----+-----------------------------------|
    |              |V:35,  |    |暗号化されたブロックデバイス       |
    |cryptsetup    |I:78   |462 |(dm-crypt / LUKS) のためのユーティ |
    |              |       |    |リティー                           |
    |--------------+-------+----+-----------------------------------|
    |              |       |    |ノーマルユーザーによるマウント/アン|
    |cryptmount    |V:1.9, |236 |マウントに焦点を当てた暗号化された |
    |              |I:2.5  |    |ブロックデバイス (dm-crypt / LUKS) |
    |              |       |    |のためのユーティリティー           |
    |--------------+-------+----+-----------------------------------|
    |fscrypt       |V:0.4, |6545|Linux ファイルシステム暗号化       |
    |              |I:1.1  |    |(fscrypt) 用のユーティリティー     |
    |--------------+-------+----+-----------------------------------|
    |libpam-fscrypt|V:0.27,|6594|Linux ファイルシステム暗号化       |
    |              |I:0.34 |    |(fscrypt) 用のPAM モジュール       |
    +---------------------------------------------------------------+


    注意

    データーの暗号化には CPU 時間等の負担がかかります。暗号化したデー
    ターはそのパスワードを失うとアクセスできなくなります。暗号化の利
    益と負担の両天秤をして下さい。

    注記

    debian-installer (lenny 以降) を使うと、dm-crypt/LUKS と
    initramfs を使って、全 Debian システムを暗号化したディスク上にイ
    ンストールできます。

    ヒント
   
    ユーザー空間での暗号化ユーティリティーに関しては「データーセキュ
    リティーのインフラ」を参照下さい: GNU プライバシーガード。

9.9.1. dm-crypt/LUKS を使ったリムーバブルディスクの暗号化

    例えば "/dev/sdx" にある USB フラッシュドライブのようなリムーバブ
    ルストレージデバイスの内容を dm-crypt/LUKS を使って暗号化できます
    。それを単に以下のようにフォーマットします。

    # fdisk /dev/sdx
    ... "n" "p" "1" "return" "return" "w"
    # cryptsetup luksFormat /dev/sdx1
    ...
    # cryptsetup open /dev/sdx1 secret
    ...
    # ls -l /dev/mapper/
    total 0
    crw-rw---- 1 root root  10, 60 2021-10-04 18:44 control
    lrwxrwxrwx 1 root root       7 2021-10-04 23:55 secret -> ../dm-0
    # mkfs.vfat /dev/mapper/secret
    ...
    # cryptsetup close secret

    こうすると暗号化されたディスクは、現代的な GNOME のようなデスクト
    ップ環境では gnome-mount(1) を使ってパスワードを聞く以外は普通の
    ディスクと同様に "/media/disk_label" にマウントできます (「リムー
    バブルストレージデバイス」を参照下さい)。全て書込まれるデーターが
    暗号化されている点が相違点です。パスワード入力はキーリングを使う
    ことで自動化できます (「パスワードキーリング」を参照下さい)。

    異なるファイルシステム、例えば、"mkfs.ext4 /dev/mapper/sdx1" とし
    て ext4 にメディアをフォーマットするのも一策です。これに替え
    btrfs が使われた場合には、udisks2-btrfs パッケージがインストール
    されている必要があります。このようなファイルシステムの場合、ファ
    イルのオウナーシップやパーミッションも設定する必要があるかもしれ
    ません。

9.9.2. dm-crypt/LUKS で暗号化されたディスクのマウント

    例えば、dm-crypt/LUKS を用いて "/dev/sdc5" 上に作成された暗号化さ
    れたディスクパーティションは以下のようにして "/mnt" マウントでき
    ます:

    $ sudo cryptsetup open /dev/sdc5 ninja --type luks
    Enter passphrase for /dev/sdc5: ****
    $ sudo lvm
    lvm> lvscan
      inactive          '/dev/ninja-vg/root' [13.52 GiB] inherit
      inactive          '/dev/ninja-vg/swap_1' [640.00 MiB] inherit
      ACTIVE            '/dev/goofy/root' [180.00 GiB] inherit
      ACTIVE            '/dev/goofy/swap' [9.70 GiB] inherit
    lvm> lvchange -a y /dev/ninja-vg/root
    lvm> exit
      Exiting.
    $ sudo mount /dev/ninja-vg/root /mnt

9.10. カーネル

    Debian はモジュール化された Linux カーネルをサポートされるアーキ
    テクチャに対してパッケージとしてディストリブートしています。

    本ドキュメンテーションを読んでいるなら、あなた自身で Linux カーネ
    ルをコンパイルする必要はきっとありません。

9.10.1. カーネル変数

    多くの Linux の機能はカーネル変数を使い以下のように設定されます。

      * ブートローダーにより初期化されたカーネル変数 (「2段目: ブート
        ローダー」を参照下さい)

      * 実行時に sysfs によりアクセスできるカーネル変数に関して
        sysctl(8) を用い変更されたカーネル変数 (「procfs と sysfs」を
        参照下さい)

      * モジュールがアクティベートされた際の modprobe(8) の引数により
        設定されるモジュール変数 (「ディスクイメージファイルをマウン
        ト」を参照下さい)

    詳細は、"The Linux kernel user’s and administrator’s guide » The
    kernel’s command-line parameters" を参照下さい。

9.10.2. カーネルヘッダー

    ほとんどの普通のプログラムはカーネルヘッダーを必要としませんし、
    コンパイルするのにそれらを直接用いるとコンパイルがうまくいかない
    かもしれません。普通のプログラムは Debian システム上では (glibc
    ソースパッケージから生成される) libc6-dev パッケージが提供する "/
    usr/include/linux" や "/usr/include/asm" 中のヘッダを使ってコンパ
    イルするべきです。

    注記

    外部ソースからのカーネルモジュールやオートマウンターデーモン
    (amd) のようなカーネル固有の一部プログラムをコンパイルする場合、
    例えば "-I/usr/src/linux-particular-version/include/" 等の対応す
    るカーネルヘッダーへのパスをコマンドラインで指定しなければいけま
    せん。

9.10.3. カーネルと関連モジュールのコンパイル

    Debian にはカーネルと関連モジュールをコンパイルする独自の方法があ
    ります。

    表9.26 Debian システム上でカーネルの再コンパイルためにインストー
    ルする重要パッケージのリスト

    +---------------------------------------------------------------+
    |   パッケージ   |ポプコ|サイ |              説明               |
    |                |  ン  | ズ  |                                 |
    |----------------+------+-----+---------------------------------|
    |build-essential |V:16, |17   |Debian パッケージをビルドする上で|
    |                |I:511 |     |不可欠なパッケージ: make、gcc、… |
    |----------------+------+-----+---------------------------------|
    |bzip2           |V:163,|113  |bz2 ファイルのための圧縮と解凍ユ |
    |                |I:972 |     |ーティリティー                   |
    |----------------+------+-----+---------------------------------|
    |libncurses5-dev |I:36  |6    |ncurses のためのデベロッパ用ライ |
    |                |      |     |ブラリーと文書                   |
    |----------------+------+-----+---------------------------------|
    |                |V:406,|     |git: Linux カーネルによって使われ|
    |git             |I:616 |50972|ている分散型リビジョンコントロー |
    |                |      |     |ルシステム                       |
    |----------------+------+-----+---------------------------------|
    |fakeroot        |V:31, |224  |パッケージを非 root としてビルド |
    |                |I:513 |     |するための fakeroot 環境を提供   |
    |----------------+------+-----+---------------------------------|
    |initramfs-tools |V:465,|49   |initramfs をビルドするツール     |
    |                |I:988 |     |(Debian 固有)                    |
    |----------------+------+-----+---------------------------------|
    |dkms            |V:79, |235  |動的カーネルモジュールサポート   |
    |                |I:147 |     |(DKMS) (汎用)                    |
    |----------------+------+-----+---------------------------------|
    |module-assistant|V:1,  |395  |モジュールパッケージ作成用ヘルパ |
    |                |I:13  |     |ーツール (Debian 固有)           |
    |----------------+------+-----+---------------------------------|
    |devscripts      |V:5,  |2763 |Debian パッケージメンテナ用ヘルパ|
    |                |I:32  |     |ースクリプト (Debian 固有)       |
    +---------------------------------------------------------------+


    「2段目: ブートローダー」中で initrd を使う場合、initramfs-tools
    (8) と update-initramfs(8) と mkinitramfs(8) と initramfs.conf(5)
    中の関連情報をしっかり読んで下さい。

    警告

    Linux カーネルソースをコンパイルする時にソースツリー中のディレク
    トリー (例えば "/usr/src/linux*") から "/usr/include/linux" や "/
    usr/include/asm" へのシムリンクを張ってはいけません。(古くなった
    一部文書はまだこれをすることを提案しています。)

    注記

    Debian の stable (安定版) システム上で最新の Linux カーネルをコン
    パイルする際には、Debian のunstable (非安定版) システムからバック
    ポートされた最新のツールが必要かもしれません。

    module-assistant(8) (もしくは、その短縮形 m-a) は、単一複数のカス
    タムカーネル用にモジュールパッケージをユーザーが簡単にビルドする
    のを援助します。

    動的カーネルモジュールサポート (DKMS) は、カーネル全体を変えるこ
    と無く個別カーネルモジュールをアップグレードできるようにする新し
    いディストリビューションに依存しない枠組みです。これはアウトオブ
    ツリーのモジュールの管理方法です。これはあなたがカーネルをアップ
    グレードする際のモジュールの再構築を簡単にもします。

9.10.4. カーネルソースのコンパイル: Debian カーネルチーム推奨

    アップストリームのカーネルソースからカーネルバイナリーパッケージ
    を作成するには、それが提供するターゲットを用いて "deb-pkg" としま
    す。

    $ sudo apt-get build-dep linux
    $ cd /usr/src
    $ wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-version.tar.xz
    $ tar --xz -xvf linux-version.tar.xz
    $ cd linux-version
    $ cp /boot/config-version .config
    $ make menuconfig
     ...
    $ make deb-pkg

    ヒント

    linux-source-version パッケージはDebian パッチがあたった Linux カ
    ーネルソースを "/usr/src/linux-version.tar.bz2" として提供します
    。

    Debian カーネルソースパッケージから特定のバイナリパッケージをビル
    ドするには、"debian/rules.gen" 中の "binary-arch_architecture_
    featureset_flavour" ターゲットを使います。

    $ sudo apt-get build-dep linux
    $ apt-get source linux
    $ cd linux-3.*
    $ fakeroot make -f debian/rules.gen binary-arch_i386_none_686

    詳細は以下参照下さい:

      * Debian Wiki: KernelFAQ

      * Debian Wiki: Debianカーネル

      * Debian Linux カーネルハンドブック: https://
        kernel-handbook.debian.net

9.10.5. ハードウエアードライバーとファームウエアー

    ハードウエアードラーバーとはターゲットシステム上の主 CPU で実行さ
    れるコードです。ほとんどのハードウエアードライバーは現在フリーソ
    フトウェアーとして入手可能で main エリアにある普通の Debian カー
    ネルパッケージに含まれています。

      * GPU ドラーバー

          + Intel GPU ドラーバー (main)

          + AMD/ATI GPU ドラーバー(main)

          + NVIDIA GPU ドライバー (nouveau ドライバーは main、ベンダ
            ーにサポートされたバイナリーのみ提供のドライバーは
            non-free 。)

    ファームウエアーとはターゲットシステムに接続されたデバイスにロー
    ドされるコードやデーター (例えば CPU マイクロコードや、GPU上で実
    行されるレンダリングコードや、FPGA / CPLD データー等々)です。一部
    のファームウエアーパッケージはフリーソフトウェアーとして入手可能
    ですが、多くのファームウエアーパッケージはソースの無いバイナリー
    データーを含むためにフリーソフトウェアーとして入手不可能です。こ
    のようなファームウエアーデーターをインストールすることはデバイス
    が期待通り動作するのに不可欠です。

      * ターゲットデバイス上の揮発性メモリーにロードされるデーターを
        含むファームウエアーデーターパッケージ。

          + firmware-linux-free (main)

          + firmware-linux-nonfree (non-free-firmware)

          + firmware-linux-* (non-free-firmware)

          + *-firmware (non-free-firmware)

          + intel-microcode (non-free-firmware)
   
          + amd64-microcode (non-free-firmware)

      * ターゲットデバイス上の不揮発性メモリー上のデーターを更新する
        ファームウエアー更新プログラムパッケージ。

          + fwupd (main): ファームウエアーデーターを Linux Vendor フ
            ァームウエアーサービスからダウンロードする、ファームウエ
            アー更新デーモン

          + gnome-firmware (main): fwupd 用の GTK フロントエンド

          + plasma-discover-backend-fwupd (main): fwupd 用の Qt フロ
            ントエンド

    Debian 12 Bookworm 以降、ユーザーに機能的なインストール経験を提供
    するため non-free-firmware パッケージへのアクセスが正規版インスト
    ールメディアで提供されていることを承知下さい。non-free-firmware
    エリアに関しては「Debian アーカイブの基本」を参照下さい。

    Linux Vendor ファームウエアーサービスから fwupd がダウンロードし
    実行中の Linux カーネルにロードするファームウエアーデーターは
    non-free かもしれないことも承知下さい。

9.11. 仮想化システム

    仮想化されたシステムを利用すると単一ハード上で同時に複数のシステ
    ムのインスタンスを実行することが可能となります。

    ヒント
   
    Debian wiki: SystemVirtualizationを参照下さい。

9.11.1. 仮想化やエミュレーションツール

    仮想化とエミュレーションツールはいくつかあります。

      * games-emulator メタパッケージがインストールするような、完璧な
        ハードウエアーエミュレーションパッケージ

      * QEMU のような一部の I/O デバイスエミュレーションを含む、ほぼ
        CPU レベルのエミュレーション

      * Kernel-based Virtual Machine (KVM) のような一部の I/O デバイ
        スエミュレーションを含む、ほぼ CPU レベルの仮想化

      * LXC (Linux コンテナー) や Docker や systemd-nspawn(1) ...等の
        ようなカーネルレベルのサポートの下での OS レベルの仮想化

      * chroot のようなシステムライブラリーコールがファイルパスをオー
        バーライドすることによる OS レベルのファイルシステムアクセス
        仮想化

      * fakeroot のようなシステムライブラリーコールがファイルオウナー
        シップをオーバーライドすることによる OS レベルのファイルシス
        テムアクセス仮想化

      * WineのようなOS API のエミュレーション

      * Python 用の virtualenv や venv のようなインタープリターの実行
        選択や実行時ライブラリーをオーバーライドすることによるインタ
        ープリターレベルの仮想化

    コンテナ仮想化は「Linux のセキュリティ機能」を使い、また「サンド
    ボックス」のバックエンド技術です。

    仮想化システムを設定する際に役立ついくつかのパッケージを記します
    。

    表9.27 仮想化ツールのリスト

    +---------------------------------------------------------------+
    |    パッケージ    |ポプコ |サイズ|            説明             |
    |                  |  ン   |      |                             |
    |------------------+-------+------+-----------------------------|
    |coreutils         |V:911, |17994 |chroot(8)を含むGNU core      |
    |                  |I:1000 |      |utilities                    |
    |------------------+-------+------+-----------------------------|
    |                  |V:917, |      |chroot(8)を含むGNU core      |
    |util-linux        |I:1000 |4658  |utilitiesunshare(1) を含む雑 |
    |                  |       |      |多なシステムユーティリティー |
    |------------------+-------+------+-----------------------------|
    |                  |V:73,  |      |systemd-nspawn(1) を含む     |
    |systemd-container |I:76   |2710  |systemd の container/nspawn  |
    |                  |       |      |ツール                       |
    |------------------+-------+------+-----------------------------|
    |schroot           |V:6.8, |2222  |Debian バイナリーパッケージを|
    |                  |I:8.8  |      |chroot 中で実行する専用ツール|
    |------------------+-------+------+-----------------------------|
    |                  |V:1.3, |      |Debian ソースから Debian バイ|
    |sbuild            |I:6.4  |154   |ナリーパッケージをビルドする |
    |                  |       |      |ツール                       |
    |------------------+-------+------+-----------------------------|
    |                  |V:5,   |      |基本的な Debian システムのブ |
    |debootstrap       |I:45   |331   |ートストラップ (sh で書かれて|
    |                  |       |      |いる)                        |
    |------------------+-------+------+-----------------------------|
    |mmdebstrap        |V:7,   |574   |Debian システムのブートストラ|
    |                  |I:12   |      |ップ (Perl で書かれている)   |
    |------------------+-------+------+-----------------------------|
    |cdebootstrap      |V:0.1, |114   |Debian システムのブートストラ|
    |                  |I:1.3  |      |ップ (C で書かれている)      |
    |------------------+-------+------+-----------------------------|
    |cloud-image-utils |V:1,   |66    |クラウドイメージ管理ユーティ |
    |                  |I:14   |      |リティー                     |
    |------------------+-------+------+-----------------------------|
    |cloud-guest-utils |V:5,   |71    |クラウドゲストユーティリティ |
    |                  |I:22   |      |ー                           |
    |------------------+-------+------+-----------------------------|
    |                  |V:12,  |      |仮想マシンマネージャー: 仮想 |
    |virt-manager      |I:48   |2310  |マシンを管理するデスクトップ |
    |                  |       |      |アプリケーション             |
    |------------------+-------+------+-----------------------------|
    |libvirt-clients   |V:49,  |1159  |libvirt ライブラリー用のプロ |
    |                  |I:71   |      |グラム                       |
    |------------------+-------+------+-----------------------------|
    |docker.io         |V:48,  |81426 |docker: Linux コンテナーラン |
    |                  |I:50   |      |タイム                       |
    |------------------+-------+------+-----------------------------|
    |podman            |V:31,  |84758 |podman: OCI ベースのコンテナ |
    |                  |I:34   |      |ーをPod中で実行するエンジン  |
    |------------------+-------+------+-----------------------------|
    |                  |V:2.8, |      |OCI-ベースのコンテナをPod中で|
    |podman-docker     |I:3.3  |270   |実行するエンジン - docker 用 |
    |                  |       |      |のラッパー                   |
    |------------------+-------+------+-----------------------------|
    |incus             |V:0.8, |23    |Incus: システムコンテナーと仮|
    |                  |I:2.9  |      |想マシンマネージャー         |
    |------------------+-------+------+-----------------------------|
    |games-emulator    |I:0.18 |21    |games-emulator: Debian のゲー|
    |                  |       |      |ム用エミュレーター           |
    |------------------+-------+------+-----------------------------|
    |bochs             |V:0.07,|8180  |Bochs: IA-32 PC エミュレータ |
    |                  |I:0.64 |      |ー                           |
    |------------------+-------+------+-----------------------------|
    |qemu-system       |I:21   |61    |QEMU: フルシステムエミュレー |
    |                  |       |      |ションのバイナリ             |
    |------------------+-------+------+-----------------------------|
    |qemu-user         |V:5.8, |468923|QEMU: ユーザーモードエミュレ |
    |                  |I:9.3  |      |ーションのバイナリ           |
    |------------------+-------+------+-----------------------------|
    |qemu-utils        |V:14,  |12175 |QEMU: ユーティリティー       |
    |                  |I:108  |      |                             |
    |------------------+-------+------+-----------------------------|
    |                  |V:53,  |      |KVM: ハードウエア補助仮想化を|
    |qemu-system-x86   |I:92   |68056 |利用する x86 ハードウエア上の|
    |                  |       |      |フル仮想化                   |
    |------------------+-------+------+-----------------------------|
    |virtualbox        |V:3.4, |151566|VirtualBox: i386 と amd64 上 |
    |                  |I:4.1  |      |での x86 仮想化解決策        |
    |------------------+-------+------+-----------------------------|
    |gnome-boxes       |V:1.2, |7045  |Boxes: 仮想システムにアクセス|
    |                  |I:6.4  |      |するシンプルな GNOME アプリ  |
    |------------------+-------+------+-----------------------------|
    |xen-tools         |V:0.1, |719   |Debian XEN 仮想サーバーの管理|
    |                  |I:1.5  |      |ツール                       |
    |------------------+-------+------+-----------------------------|
    |wine              |V:13,  |204   |Wine: Windows API の実装 (標 |
    |                  |I:55   |      |準スイート)                  |
    |------------------+-------+------+-----------------------------|
    |                  |       |      |DOSBox: Tandy/Herc/CGA/EGA/  |
    |dosbox            |V:1,   |2697  |VGA/SVGA グラフィクス、サウン|
    |                  |I:12   |      |ド、DOS 付きの x86 エミュレー|
    |                  |       |      |ター                         |
    |------------------+-------+------+-----------------------------|
    |lxc               |V:10,  |1629  |Linux コンテナーユーザースペ |
    |                  |I:13   |      |ースツール                   |
    |------------------+-------+------+-----------------------------|
    |python3-venv      |V:8,   |6     |仮想 python 環境を作るための |
    |                  |I:147  |      |venv (システムライブラリー)  |
    |------------------+-------+------+-----------------------------|
    |python3-virtualenv|V:7,   |374   |隔離された仮想 python 環境を |
    |                  |I:39   |      |作るための virtualenv        |
    |------------------+-------+------+-----------------------------|
    |                  |V:7,   |      |隔離された環境に python アプ |
    |pipx              |I:47   |4409  |リをインストールするための   |
    |                  |       |      |pipx                         |
    +---------------------------------------------------------------+


    異なるプラットフォーム仮想化策の詳細な比較は Wikipedia の記事
    Comparison of platform virtual machines を参照下さい。

9.11.2. 仮想化の業務フロー

    注記
   
    lenny 以降の Debian のデフォルトカーネルは KVM をサポートしていま
    す。

    仮想化のための典型的な業務フローにはいくつかの段階があります。

      * 空のファイルシステムの作成 (ファイルツリーもしくはディスクイ
        メージ)。

          + ファイルツリーは "mkdir -p /path/to/chroot" として作成で
            きる。

          + raw ディスクイメージファイルは dd(1) を使って作れます (「
            ディスクイメージの作成」と「空のディスクイメージ作成」を
            参照下さい)。

          + qemu-img(1) はQEMU によりサポートされたディスクイメージの
            作成や変換に使えます。

          + raw と VMDK ファイルフォーマットは仮想ツール間の共通フォ
            ーマットとして使えます。

      * mount(8) を使ってディスクイメージをファイルシステムにマウント
        する (任意)。

          + raw のディスクイメージファイルに関しては、loop デバイスま
            たはデバイスマッパーデバイス (「ディスクイメージファイル
            をマウント」を参照下さい) としてマウント。

          + QEMU がサポートするディスクイメージファイルに関しては、ネ
            ットワークブロックデバイス (「仮想ディスクイメージファイ
            ルをマウント。」を参照下さい) としてマウント。

      * 必要なシステムデーターを用いて対象のファイルシステムを充足。

          + debootstrap や cdebootstrap のようなプログラムがこのプロ
            セスを援助します (「Chroot システム」を参照下さい)。

          + OS のインストーラーをフルシステムエミュレーション下で利用
            。

      * 仮想化環境下でプログラムを実行。

          + chroot は、仮想環境の中でプログラムのコンパイルやコンソー
            ルアプリケーションの実行やデーモンの実行等をするのに十分
            な基本的仮想環境を提供します。

          + QEMU: クロスプラットフォームの CPU エミュレーションを提供

          + KVM と共の QEMU はハードウエア補助仮想化によるフルシステ
            ムエミュレーションを提供します。

          + VirtualBox はハードウエア補助仮想化の有無によらず i386 と
            amd64 上でのフルシステムエミュレーションを提供します。

9.11.3. 仮想ディスクイメージファイルをマウント。

    raw ディスクイメージファイルに関しては、「ディスクイメージ」を参
    照下さい。

    他の仮想ディスクイメージに関しては、qemu-nbd(1) を使ってネットワ
    ークブロックデバイスプロトコルを用いてそれらをエクスポートし nbd
    カーネルモジュールを使ってそれらをマウントできます。

    qemu-nbd(1) はQEMU がサポートする以下のディスクフォーマットをサポ
    ートします: raw、qcow2、qcow、vmdk、vdi、bochs、cow (user-mode
    Linux の copy-on-write)、parallels、dmg、cloop、vpc、vvfat
    (virtual VFAT)、host_device。

    ネットワークブロックデバイスはloop デバイスと同様の方法でパーティ
    ションをサポートします (「ディスクイメージファイルをマウント」を
    参照下さい)。"image.img" の最初のパーティションは以下のようにする
    とマウントできます。

    # modprobe nbd max_part=16
    # qemu-nbd -v -c /dev/nbd0 disk.img
    ...
    # mkdir /mnt/part1
    # mount /dev/nbd0p1 /mnt/part1

    ヒント
   
    qemu-nbd(8) に"-P 1" オプションを用いると、"disk.img" の最初のパ
    ーティションだけをエクスポートできます。

9.11.4. Chroot システム

    もしターミナルコンソールから新規 Debian 環境を試したい場合、
    chroot を使うことをお薦めします。これを使うと、ありがちな関連する
    リスク無しかつブート無しに Debian の unstable や testing のアプリ
    を実行できます。chroot(8) は最も基本的手法です。

    注意
   
    以下の例は親システムと chroot システムが同じ amd64 CPU アーキテク
    チャを共有していると仮定しています。

    debootstrap(1) を使うと chroot(8) 環境を手動で作れますが、少々手
    間です。

    Debian パッケージをソースからビルドする sbuild パッケージは
    schroot によって管理された chroot 環境を使います。それには
    sbuild-createchroot(1) という補助スクリプトが同梱されています。そ
    れを以下のように実行し、どのように動作するのかを学びましょう。

    $ sudo mkdir -p /srv/chroot
    $ sudo sbuild-createchroot -v --include=eatmydata,ccache unstable /srv/chroot/unstable-amd64-sbuild http://deb.debian.org/debian
     ...

    "/srv/chroot/unstable-amd64-sbuild" の下に unstable 環境のための
    システムデーターをどのようにして充足するかは debootstrap(8) を見
    ると分かります。

    schroot(1) を使ってこの環境に login できます。

    $ sudo schroot -v -c chroot:unstable-amd64-sbuild

    unstable 環境下で実行されるシステムシェルをどのようにして作成する
    かが理解できます。

    注記

    常に101で終了する"/usr/sbin/policy-rc.d" ファイルは、Debian シス
    テム上でデーモンプログラムが自動的に起動されることを防ぎます。"/
    usr/share/doc/init-system-helpers/README.policy-rc.d.gz" を参照下
    さい。

    注記

    プログラムによっては機能するために chroot の下で
    sbuild-createchroot が提供するより多くの親システムのファイルへの
    アクセスする必要があります。例えば、"/sys" や "/etc/passwd" や "/
    etc/group" や "/var/run/utmp" や "/var/log/wtmp" 等が bind マウン
    トもしくはコピーされる必要があるかもしれません。

    ヒント

    sbuild パッケージはそのバックエンドに schroot を使って chroot シ
    ステムを構築し chroot 内でパッケージをビルドします。それはビルド
    依存を確認するのに理想的です。詳細は Debian wiki の sbuild や
    "Guide for Debian Maintainers" 中の sbuild 設定例を参照下さい。

    ヒント

    systemd-nspawn(1) コマンドは chroot に似た方法で軽量コンテナ中で
    コマンドや OS を実行したりするのを援助します。それは、namespaces
    を使ってプロセス木や IPC やホスト名やドメイン名やさらにはネットワ
    ーキングやユーザーデーターベースまで完全に仮想化するので、それは
    より強力です。systemd-nspawnを参照下さい。

9.11.5. 複数のデスクトップシステム

    仮想化を使って複数のデスクトップシステムを安全に実行するには、
    Debian 安定版 (stable) システム上で QEMU か KVM を使うことをお薦
    めします。これらを使うと通常ありがちなリスクに晒されずにまたリブ
    ートすること無く Debian テスト版 (testing) や不安定版 (unstable)
    システムのデスクトップアプリケーションを実行できるようになります
    。

    純粋な QEMU は非常に遅いので、ホストシステムがサポートする際には
    KVM を使って加速することをお薦めします。

    仮想マシンマネージャーは、virt-manager とも呼ばれていて、libvirt
    経由で KVM 仮想マシンを管理する便利な GUI ツールです。

    QEMU 用の Debian システムを含む仮想ディスクイメージ
    "virtdisk.qcow2" はdebian-installer: 小さな CD を使って以下のよう
    に作成できます。

    $ wget https://cdimage.debian.org/debian-cd/5.0.3/amd64/iso-cd/debian-503-amd64-netinst.iso
    $ qemu-img create -f qcow2 virtdisk.qcow2 5G
    $ qemu -hda virtdisk.qcow2 -cdrom debian-503-amd64-netinst.iso -boot d -m 256
    ...

    ヒント

    Ubuntu や Fedra 等の GNU/Linux ディストリビューションを仮想化の下
    で実行するのは設定ティップを学ぶ非常に良い方法です。他のプロプラ
    イエタリな OS もこの GNU/Linux の仮想化の下で上手く実行できます。

    更なるティップに関しては Debian wiki: SystemVirtualizationを参照
    下さい。


---------------------------------------------------------------------

    ^[2] さらに凝ったカスタマイズ例: "Vim Galore", "sensible.vim",
    ...

    ^[3] vim-pathogen は人気がありました。

第10章データー管理

    バイナリーとテキストのデーターを Debian システム上で管理するツー
    ルとティップを記します。

10.1. 共有とコピーとアーカイブ

    警告

    競合状態とならないようにするために、アクティブにアクセスされてい
    るデバイスやファイルに複数プロセスから調整なく書き込みアクセスを
    してはいけません。flock(1) を使ったファイルロック機構がこの回避に
    使えます。

    データーのセキュリティーとそのコントロールされた共有はいくつかの
    側面があります。

      * データーアーカイブの作成

      * 遠隔ストレージアクセス

      * 複製

      * 変更履歴の追跡

      * データー共有のアシスト

      * 不正なファイルへのアクセスの防止

      * 不正なファイルの改変の検出

    こういったことは以下の組み合わせを使うことで実現できます。

      * アーカイブと圧縮ツール

      * コピーと同期ツール

      * ネットワークファイルシステム

      * リムーバブルストレージメディア
   
      * セキュアーシェル

      * 認証システム

      * バージョンコントロールシステムツール

      * ハッシュや暗号学的暗号化ツール

10.1.1. アーカイブと圧縮ツール

    Debian システム上で利用可能なアーカイブと圧縮ツールのまとめを以下
    に記します。

    表10.1 アーカイブと圧縮ツールのリスト

    +---------------------------------------------------------------+
    |パッケージ|ポプコ|サイ|拡張 |コマン |         コメント         |
    |          |  ン  | ズ | 子  |  ド   |                          |
    |----------+------+----+-----+-------+--------------------------|
    |tar       |V:908,|3085|.tar |tar(1) |標準アーカイバー (デファク|
    |          |I:1000|    |     |       |ト標準)                   |
    |----------+------+----+-----+-------+--------------------------|
    |          |V:352,|    |     |       |Unix System V スタイルのア|
    |cpio      |I:999 |1201|.cpio|cpio(1)|ーカイバー、find(1) ととも|
    |          |      |    |     |       |に使用                    |
    |----------+------+----+-----+-------+--------------------------|
    |binutils  |V:190,|1119|.ar  |ar(1)  |静的ライブラリー生成用のア|
    |          |I:640 |    |     |       |ーカイバー                |
    |----------+------+----+-----+-------+--------------------------|
    |fastjar   |V:1.0,|182 |.jar |fastjar|Java 用のアーカイバー (zip|
    |          |I:9.6 |    |     |(1)    |類似)                     |
    |----------+------+----+-----+-------+--------------------------|
    |          |V:5.5,|    |     |       |新規 POSIX 標準アーカイバ |
    |pax       |I:9.6 |167 |.pax |pax(1) |ー、tar と cpio の間の妥協|
    |          |      |    |     |       |点                        |
    |----------+------+----+-----+-------+--------------------------|
    |          |      |    |     |gzip   |                          |
    |gzip      |V:904,|256 |.gz  |(1),   |GNU LZ77 圧縮ユーティリテ |
    |          |I:1000|    |     |zcat   |ィー (デファクト標準)     |
    |          |      |    |     |(1), … |                          |
    |----------+------+----+-----+-------+--------------------------|
    |          |      |    |     |bzip2  |gzip(1) より高い圧縮比    |
    |          |V:163,|    |     |(1),   |(gzip より遅い、類似シンタ|
    |bzip2     |I:972 |113 |.bz2 |bzcat  |ックス) の Burrows-Wheeler|
    |          |      |    |     |(1), … |ブロック並び替え圧縮ユーテ|
    |          |      |    |     |       |ィリティー                |
    |----------+------+----+-----+-------+--------------------------|
    |          |V:1,  |    |     |       |gzip(1) より高い圧縮比の  |
    |lzma      |I:10  |349 |.lzma|lzma(1)|LZMA 圧縮ユーティリティー |
    |          |      |    |     |       |(非推奨)                  |
    |----------+------+----+-----+-------+--------------------------|
    |          |      |    |     |       |bzip2(1) より高い圧縮比の |
    |          |V:318,|    |     |xz(1), |XZ 圧縮ユーティリティー   |
    |xz-utils  |I:982 |1520|.xz  |xzdec  |(gzip より遅いが bzip2 よ |
    |          |      |    |     |(1), … |り早い、LZMA 圧縮ユーティ |
    |          |      |    |     |       |リティーの代替)           |
    |----------+------+----+-----+-------+--------------------------|
    |          |      |    |     |zstd   |                          |
    |zstd      |V:318,|2309|.zstd|(1),   |Zstandard 高速ロスレス圧縮|
    |          |I:803 |    |     |zstdcat|ユーティリティー          |
    |          |      |    |     |(1), … |                          |
    |----------+------+----+-----+-------+--------------------------|
    |          |V:6,  |    |     |7zr(1),|高い圧縮比をもつ 7-Zip 圧 |
    |p7zip     |I:198 |8   |.7z  |p7zip  |縮ユーティリティー (LZMA  |
    |          |      |    |     |(1)    |圧縮)                     |
    |----------+------+----+-----+-------+--------------------------|
    |          |V:20, |    |     |7z(1), |高い圧縮比をもつ 7-Zip 圧 |
    |p7zip-full|I:222 |12  |.7z  |7za(1) |縮ユーティリティー (LZMA  |
    |          |      |    |     |       |圧縮、他)                 |
    |----------+------+----+-----+-------+--------------------------|
    |          |      |    |     |       |gzip(1) より高い圧縮と解凍|
    |lzop      |V:12, |164 |.lzo |lzop(1)|の速度 (gzip より低い圧縮 |
    |          |I:134 |    |     |       |比、類似シンタックス) の  |
    |          |      |    |     |       |LZO 圧縮ユーティリティー  |
    |----------+------+----+-----+-------+--------------------------|
    |zip       |V:49, |627 |.zip |zip(1) |InfoZIP: DOS アーカイブと |
    |          |I:361 |    |     |       |圧縮ツール                |
    |----------+------+----+-----+-------+--------------------------|
    |unzip     |V:110,|387 |.zip |unzip  |InfoZIP: DOS アーカイブ解 |
    |          |I:749 |    |     |(1)    |凍と圧縮解凍ツール        |
    +---------------------------------------------------------------+


    警告
   
    何が起こるかを理解せずに "$TAPE" 変数を設定してはいけません。設定
    すると tar(1) の挙動が変わります。

      * gzip 圧縮された tar(1) アーカイブは ".tgz" とか ".tar.gz" と
        いったファイル拡張子を使います。

      * xz 圧縮された tar(1) アーカイブは ".txz" とか ".tar.xz" とい
        ったファイル拡張子を使います。

      * tar(1) 等の FOSS ツールでのポピュラーな圧縮方法は以下のように
        変遷しています: gzip → bzip2 → xz

      * cp(1) と scp(1) と tar(1) は特殊ファイルに関して一部制約があ
        るかもしれません。cpio(1) は最も汎用性があります。
   
      * cpio(1) はfind(1) 等のコマンドとともに使うようにできていて、
        ファイルの選定部分のスクリプトを独立にテストできるのでバック
        アップスクリプトを作るのに向いています。

      * Libreoffice データーファイルの内部構造は ".jar" ファイルで、
        unzip で開くことができます。

      * デファクトのクロスプラットフォームのアーカイブツールは zip で
        す。最大限のコンパチビリティーのためには "zip -rX" として使っ
        て下さい。もし最大ファイルサイズが問題となる際には "-s" オプ
        ションも使って下さい。

10.1.2. コピーと同期ツール

    Debian システム上で利用可能な単純なコピーとバックアップツールのま
    とめを以下に記します。

    表10.2 コピーと同期ツールのリスト

    +---------------------------------------------------------------+
    |  パッケージ  |ポプコ|サイ |ツー|             機能             |
    |              |  ン  | ズ  | ル |                              |
    |--------------+------+-----+----+------------------------------|
    |coreutils     |V:911,|17994|GNU |ファイルやディレクトリーのロー|
    |              |I:1000|     |cp  |カルコピー ("-a" で再帰的実行)|
    |--------------+------+-----+----+------------------------------|
    |              |V:915,|     |    |ファイルやディレクトリーのリモ|
    |openssh-client|I:996 |4210 |scp |ートコピー (クライアント、"-r"|
    |              |      |     |    |で再帰実行)                   |
    |--------------+------+-----+----+------------------------------|
    |openssh-server|V:768,|3359 |sshd|ファイルやディレクトリーのリモ|
    |              |I:819 |     |    |ートコピー (リモートサーバー) |
    |--------------+------+-----+----+------------------------------|
    |rsync         |V:195,|835  |    |単方向リモート同期とバックアッ|
    |              |I:541 |     |    |プ                            |
    |--------------+------+-----+----+------------------------------|
    |unison        |V:3,  |14   |    |双方向リモート同期とバックアッ|
    |              |I:12  |     |    |プ                            |
    +---------------------------------------------------------------+


    rsync(8) を使ってのファイルのコピーには他の方法より豊かな機能があ
    ります。

      * 転送元のファイルと転送先の既存ファイル間の相違のみを送信する
        差分転送アルゴリズム

      * サイズか最終変更時間に変更があったファイルのみを探す (デフォ
        ルトで採用される) 急速確認アルゴリズム

      * tar(1) 類似の "--exclude" や "--exclude-from" オプション

      * 転送先に追加ディレクトリーレベルを作成しなくする「転送元ディ
        レクトリ後スラシュ (/) 付加」文法

    ヒント

    表10.14「他のバージョンコントロールシステムツールのリスト」に記さ
    れたバージョンコントロールシステム (VCS) ツールは多方向のコピーと
    同期のツールとして機能します。

10.1.3. アーカイブの慣用句

    "./source" ディレクトリー中の全内容を異なるツールを用いてアーカイ
    ブしアーカイブ解凍するいくつかの方法を以下に記します。

    GNU tar(1):

    $ tar -cvJf archive.tar.xz ./source
    $ tar -xvJf archive.tar.xz

    この代わりに、以下のようにも出来ます。

    $ find ./source -xdev -print0 | tar -cvJf archive.tar.xz --null -T -

    cpio(1):

    $ find ./source -xdev -print0 | cpio -ov --null > archive.cpio; xz archive.cpio
    $ zcat archive.cpio.xz | cpio -i

10.1.4. コピーの慣用句

    "./source" ディレクトリー中の全内容を異なるツールを用いてコピーす
    るいくつかの方法を以下に記します。

      * ローカルコピー: "./source" ディレクトリー → "/dest" ディレク
        トリー
   
      * リモートコピー: ローカルホストの "./source" ディレクトリー →
        "user@host.dom" ホストの "/dest" ディレクトリー

    rsync(8):

    # cd ./source; rsync -aHAXSv . /dest
    # cd ./source; rsync -aHAXSv . user@host.dom:/dest

    「転送元ディレクトリー後スラシュ付加」文法を上記の代わりに使えま
    す。

    # rsync -aHAXSv ./source/ /dest
    # rsync -aHAXSv ./source/ user@host.dom:/dest

    この代わりに、以下のようにも出来ます。

    # cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest
    # cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . user@host.dom:/dest

    GNU cp(1) と openSSH scp(1):

    # cd ./source; cp -a . /dest
    # cd ./source; scp -pr . user@host.dom:/dest

    GNU tar(1):

    # (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - )
    # (cd ./source && tar cf - . ) | ssh user@host.dom '(cd /dest && tar xvfp - )'

    cpio(1):

    # cd ./source; find . -print0 | cpio -pvdm --null --sparse /dest

    "." を含むすべての例で "." は"foo" で代替でき、ファイルを "./
    source/foo" ディレクトリーから "/dest/foo" ディレクトリにコピーで
    きます。

    "." を含むすべての例で "." を絶対パスの "/path/to/source/foo" で
    代替でき、"cd ./source;" を削除することができます。これらは使うツ
    ール次第で異なる場所にファイルをコピーします。

      * "/dest/foo": rsync(8)、GNU cp(1)、scp(1)
   
      * "/dest/path/to/source/foo": GNU tar(1) と cpio(1)

    ヒント
   
    rsync(8) や GNU cp(1) には転送先のファイルが新しい場合にスキップ
    する "-u" オプションがあります。

10.1.5. ファイル選択の慣用句

    アーカイブやコピーコマンド (「アーカイブの慣用句」と「コピーの慣
    用句」を参照下さい) のためや xargs(1) (「ファイルに関してループし
    ながらコマンドを反復実行」を参照下さい) のためにファイルを選択す
    るのに find(1) が使われます。これの操作はそのコマンド引数を使うこ
    とで強化できます。

    find(1) の基本シンタックスは以下のようにまとめられます。

      * 条件の引数は左から右へと評価されます。

      * 結果が決まった時点で評価は終了します。

      * "論理 OR" (条件間に "-o" で指定) は、"論理 AND" (条件間に
        "-a" または何もなしで指定) より低い優先順位です。

      * "論理 NOT" (条件前に "!" で指定) は、"論理 AND" より高い優先
        順位です。

      * "-prune" は常に論理真 (TRUE) を返し、ディレクトリーの場合には
        この点以降のファイル探索を停止します。

      * "-name" はシェルのグロブ (「シェルグロブ」を参照下さい) を使
        ってファイル名のベースにマッチし、さらに "*" and "?" 等のメタ
        文字で最初の "." ともマッチします。(新規の POSIX 機能)

      * "-regex" はデフォールトでは emacs スタイルの BRE (「正規表現
        」を参照下さい) を用いてフルパスをマッチします。

      * "-size" はファイルサイズ ("+" が前に付いた値はより大きい、"-"
        が前に付いた値はより小さい) に基づいてファイルをマッチします
        。

      * "-newer" はその引数に指定されたファイルより新しいファイルとマ
        ッチします。

      * "-print0" は常に論理真 (TRUE) を返し、フルファイル名を (null
        終端処理して) 標準出力へプリントします。

    find(1) はしばしば慣用的なスタイルで使われます。

    # find /path/to \
        -xdev -regextype posix-extended \
        -type f -regex ".*\.cpio|.*~" -prune -o \
        -type d -regex ".*/\.git" -prune -o \
        -type f -size +99M -prune -o \
        -type f -newer /path/to/timestamp -print0

    これは以下のアクションをすることを意味します。

     1. "/path/to" からはじまる全ファイルを探索

     2. 探索開始したファイルシステムに探索を全体的に制約し、デフォー
        ルトの代わりに ERE (「正規表現」を参照下さい) を使用

     3. 正規表現 ".*\.cpio" か ".*~" にマッチするファイルを処理停止を
        することで探索から除外
   
     4. 正規表現 ".*/\.git" にマッチするディレクトリーを処理停止をす
        ることで探索から除外

     5. 9MiB(1048576バイトの単位) より大きいファイルを処理停止をする
        ことで探索から除外

     6. 上記の探索条件に合致し "/path/to/timestamp" より新しいファイ
        ル名をプリントします

    上記例中でファイルを検索から除外するときの "-prune -o" の慣用的な
    使い方を承知下さい。

    注記

    非 Debian のUnix 的システムでは、一部のオプションは find(1) によ
    ってサポートされていないかもしれません。そのような場合には、マッ
    チング方法を調整したり "-print0" を"-print" で置き換えることを考
    慮します。これに関連するコマンドも調整する必要があるかもしれませ
    ん。

10.1.6. アーカイブメディア

    重要なデーターアーカイブのためのコンピューターデーターストレージ
    メディアを選ぶ時にはそれらの限界について注意を払うべきです。小さ
    な個人的なバックアップのためには、著者としては名前が知られている
    会社の CD-R と DVD-R を使い、クールで日陰の乾燥した埃の無い環境に
    保存しています。(プロ用途ではテープアーカイブメディアに人気がある
    ようです。)

    注記

    耐火金庫は紙の文書のためのものです。ほとんどのコンピューターデー
    ターストレージメディアは紙よりも耐熱性がありません。著者は複数の
    安全な場所に保管された複数のセキュアーな暗号化されたコピーに通常
    頼っています。

    ネット上に散見するアーカイブメディアの楽観的なストレージ寿命 (ほ
    とんどベンダー情報由来)。

      * 100+年: インクと中性紙

      * 100年: オプティカルストレージ (CD/DVD、CD/DVD-R)
   
      * 30年: 磁気ストレージ (テープ、フロッピー)

      * 20年: 相変化オプティカルストレージ (CD-RW)

    これらは取扱いによる機械的故障等は考慮していません。

    ネット上に散見するアーカイブメディアの楽観的な書込み回数 (ほとん
    どベンダー情報由来)。

      * 250,000+回: ハードディスク

      * 10,000+回: フラッシュメモリー
   
      * 1,000回: CD/DVD-RW

      * 1回: CD/DVD-R、紙

    注意

    ここにあるストレージ寿命や書込み回数の数字はクリチカルなデーター
    ストレージに関する決定に使うべきではありません。製造者によって提
    供される特定の製品情報を参照下さい。

    ヒント
   
    CD/DVD-R や紙は1回しか書けないので、本質的に重ね書きで間違ってデ
    ーターを消すことを防げます。これは、利点です!

    ヒント

    もし高速で頻繁な大量のデーターのバックアップをする必要がある場合
    、高速のネットワーク接続でつながっているリモートホスト上のハード
    ディスクが唯一の現実的なオプションかもしれません。

    ヒント

    もし書き換え可能なメディアをバックアップに使っている場合には、リ
    ードオンリーのスナップショットをサポートする btrfs や zfs のよう
    なファイルシステムを使うのも一策です。

10.1.7. リムーバブルストレージデバイス

    リムーバブルストレージデバイスは以下の何れも指します。

      * USB フラッシュドライブ

      * Hard ディスクドライブ

      * 光学ディスクドライブ

      * デジタルカメラ

      * デジタル音楽プレーヤー

    これらは以下の何れかで接続できます。

      * USB

      * IEEE 1394 / FireWire

      * PC カード

    GNOME や KDE のような最近のデスクトップ環境は、"/etc/fstab" エン
    トリーにマッチが無いリムーバブルデバイスを自動的にマウントする事
    ができます。

      * udisks2 パッケージは、これらのデバイスをマウントやアンマウン
        トするためのデーモンと関連するユーティリティーを提供します。
   
      * D-bus は、自動的なプロセスを開始するイベントを作成します。

      * PolicyKit が必要な特権を提供します。

    ヒント
   
    自動的にマウントされたデバイスは、umount(8) によって利用される
    "uhelper=" マウントオプションが設定されているかもしれません。

    ヒント
   
    "/etc/fstab" にリムーバブルメディアデバイスの記載が無い時のみ、現
    代的なデスクトップ環境下での自動マウントは起こります。

    最新のデスクトップ環境下では以下のようにしてカスタマイズ可能なマ
    ウント点として "/media/username/disk_label" が選ばれます。

      * FAT ファイルシステムでは、mlabel(1) を使います。

      * ISO9660 ファイルシステムでは、genisoimage(1) を"-V" オプショ
        ンとともに使います。

      * ext2/ext3/ext4 ファイルシステムでは、tune2fs(1) を"-L" オプシ
        ョンとともに使います。

    ヒント

    符号化方式 (エンコーディング) の選択をマウントオプションとして与
    える必要があるかもしれません (「ファイル名の符号化方式」を参照下
    さい)。

    ヒント

    ファイルシステムをアンマウントする際に GUI メニューを使うと、動的
    に生成された "/dev/sdc" 等のデバイスノード削除するかもしれません
    。もしそのデバイスノードの削除したくない場合にはシェルのコマンド
    プロンプトから umount(8) コマンドを使いアンマウントします。

10.1.8. データー共有用のファイルシステム選択

    リムーバブルストレージデバイスを使ってデーターを共有する際には、
    両方のシステムにサポートされた共通のファイルシステムでそれをフォ
    ーマットするべきです。ファイルシステム選択のリストを次に示します
    。

    注記

    ハードディスク (HDD) に関する文言は、SSD / USB フラッシュデバイス
    / メモリーカード /... のようなストレージデバイスのような他のスト
    レージデバイスにも適用できます。例中の/dev/sda のようなデバイス名
    は、該当するデバイス名 /dev/nvme0, /dev/mmcblk0, ... に置き換えま
    す。

    表10.3 典型的な使用シナリオに合わせたリムーバブルストレージデバイ
    スのファイルシステムの選択肢のリスト

    +---------------------------------------------------------------+
    |ファイ |                                                       |
    |ルシス |                  典型的使用シナリオ                   |
    |テム名 |                                                       |
    |-------+-------------------------------------------------------|
    |FAT12  |フロッピーディスク上のクロスプラットフォームのデーター |
    |       |共有 (<32MiB)                                          |
    |-------+-------------------------------------------------------|
    |FAT16  |小さなハードディスク類似のデバイス上のクロスプラットフ |
    |       |ォームのデーター共有 (<2GiB)                           |
    |-------+-------------------------------------------------------|
    |       |大きなハードディスク類似のデバイス上のクロスプラットフ |
    |FAT32  |ォームのデーター共有 (<8TiB, MS Windows95 OSR2 以降でサ|
    |       |ポート有り)                                            |
    |-------+-------------------------------------------------------|
    |       |大きなハードディスク類似のデバイス上のクロスプラットフ |
    |exFAT  |ォームのデーター共有 (<512TiB, WindowsXPとMac OS X Snow|
    |       |Leopard 10.6.5とLinux kernel 5.4 リリース以降でサポート|
    |       |有り)                                                  |
    |-------+-------------------------------------------------------|
    |       |大きなハードディスク類似のデバイス上のクロスプラットフ |
    |NTFS   |ォームのデーター共有 (MS Windows NT 以降でネイティブに |
    |       |サポート、Linux 上では FUSE 経由の NTFS-3G でサポート) |
    |-------+-------------------------------------------------------|
    |ISO9660|CD-R and DVD+/-R 上の静的データーのクロスプラットフォー|
    |       |ムの共有                                               |
    |-------+-------------------------------------------------------|
    |UDF    |CD-R や DVD+/-R 上への増分データーの書込み (新規)      |
    |-------+-------------------------------------------------------|
    |MINIX  |フロッピーディスク上へのスペース効率の良い unix ファイ |
    |       |ルデーターのストレージ                                 |
    |-------+-------------------------------------------------------|
    |ext2   |古い Linux システムとハードディスク類似デバイス上のデー|
    |       |ターを共有                                             |
    |-------+-------------------------------------------------------|
    |ext3   |古い Linux システムとハードディスク類似デバイス上のデー|
    |       |ターを共有                                             |
    |-------+-------------------------------------------------------|
    |ext4   |現行の Linux システムとハードディスク類似デバイス上のデ|
    |       |ーターを共有                                           |
    |-------+-------------------------------------------------------|
    |btrfs  |現行の Linux システムとハードディスク類似デバイス上のデ|
    |       |ーターを読み出し専用のスナップショットでの共有         |
    +---------------------------------------------------------------+


    ヒント

    デバイスレベルの暗号化を使ったクロスプラットフォームのデーター共
    有に関しては、「dm-crypt/LUKS を使ったリムーバブルディスクの暗号
    化」を参照下さい。

    FAT ファイルシステムはほとんど全ての現代的なオペレーティングシス
    テムでサポートされていて、ハードディスク類似のメディア経由でのデ
    ーター交換目的に非常に有用です。

    クロスプラットフォームの FAT ファイルシステムを使ったデーター共有
    にリムーバブルハードディスク類似デバイスをフォーマットする時の安
    全な選択肢は次です。

      * fdisk(8) か cfdisk(8) か parted(8) (「ディスクパーティション
        設定」を参照下さい) を使ってそれを単一のプライマリパーティシ
        ョンにパーティションしそれを以下のようにマークします。

          + 2GB より小さなメディアには FAT16 となるように "6" とタイ
            プします

          + 大きなメディアには FAT32 (LBA) となるように "c" とタイプ
            します

      * 第1パーティションを mkfs.vfat(8) を使って以下のようにフォーマ
        ットします。

          + FAT16 となるように "/dev/sda1" 等とそのデバイス名だけを使
            います

          + FAT32 となるように "-F 32 /dev/sda1" 等と明示的なオプショ
            ン指定とそのデバイス名を使います

    FAT とか ISO9660 ファイルシステムを使ってデーターを共有する際の安
    全への配慮を次に記します。

      * tar(1) や cpio(1) を使ってアーカイブファイルに最初にファイル
        をアーカイブすることで長いファイル名やシンボリックリンクやオ
        リジナルの Unix ファイルパーミッションとオーナー情報を保持し
        ます。
   
      * split(1) コマンドを使ってアーカイブファイルを 2GiB 以下の塊に
        分割してファイルサイズの制約から保護します。

      * アーカイブファイルを暗号化してその内容を不正アクセスから保護
        します。

    注記

    FAT ファイルシステムはその設計上最大ファイルサイズは (2^32 - 1)
    bytes = (4GiB - 1 byte) です。古い 32 ビット OS 上の一部アプリケ
    ーションは、最大ファイルサイズはさらに小さく (2^31 - 1) bytes =
    (2GiB - 1 byte) です。Debian は後者の問題に苦しむことはありません
    。

    注記

    Microsoft 自身も 200MB を越すドライブやパーティションに FAT を使
    うことを勧めていません。マイクロソフトは、彼らの "Overview of
    FAT, HPFS, and NTFS File Systems" で非効率的なディスク領域の使用
    等の欠点をハイライトしています。もちろん私たちは Linux では ext4
    ファイルシステムを普通使うべきです。

    ヒント
   
    ファイルシステムとファイルシステムのアクセスに関しての詳細は、
    "Filesystems HOWTO" を参照下さい。

10.1.9. ネットワーク経由でのデーター共有

    データーをネットワーク経由で他のシステムと共有するときには、共通
    のサービスを使うべきです。次に一部のヒントを記します。

    表10.4 典型的使用シナリオの場合のネットワークサービスの選択のリス
    ト

    +---------------------------------------------------------------+
    |ネットワークサービス |        典型的使用シナリオの説明         |
    |---------------------+-----------------------------------------|
    |Samba を使う SMB/CIFS|"Microsoft Windows Network" 経由でのファ |
    |ネットワーク経由マウ |イル共有、smb.conf(5) と The Official    |
    |ントファイルシステム |Samba 3.x.x HOWTO and Reference Guide か |
    |                     |samba-doc パッケージ参照下さい           |
    |---------------------+-----------------------------------------|
    |Linux カーネルを使う |"Unix/Linux Network" 経由のファイル共有、|
    |NFS ネットワークマウ |exports(5) と Linux NFS-HOWTO 参照下さい |
    |ントファイルシステム |。                                       |
    |---------------------+-----------------------------------------|
    |HTTP サービス        |ウェッブサーバー/クライアント間のファイル|
    |                     |共有                                     |
    |---------------------+-----------------------------------------|
    |                     |暗号化されたセキュアーソケットレイヤー   |
    |HTTPS サービス       |(SSL) もしくは Transport Layer Security  |
    |                     |(TLS) を使ったウェッブサーバー/クライアン|
    |                     |ト間のファイル共有                       |
    |---------------------+-----------------------------------------|
    |FTP サービス         |FTP サーバー/クライアント間のファイル共有|
    +---------------------------------------------------------------+


    このようなネットワーク経由でマウントされたファイルシステムやネッ
    トワーク経由のファイル転送法はデーター共有のために非常に便利です
    が、インセキュアーかもしれませんこれらのネットワーク接続は次に記
    すようにしてセキュアーにされなければいけません。

      * SSL/TLS を使い暗号化

      * SSH 経由でそれをトンネル
   
      * VPN 経由でそれをトンネル

      * セキュアーファイアウォールの背後に限定

    さらに「他のネットワークアプリケーションサーバー」と「他のネット
    ワークアプリケーションクライアント」を参照下さい。

10.2. バックアップと復元

    コンピューターはいつか壊れるとか、人間によるエラーがシステムやデ
    ーターをへの損害を及ぼすことは皆知っています。バックアップと復元
    の操作は正しいシステム管理の必須構成要素です。考えうる全ての故障
    モードはいつかの日にやって来ます。

    ヒント

    バックアップのシステムは簡単にしておき、システムのバックアップは
    頻繁にします。バックアップデーターが存在することは、あなたのバッ
    クアップ方法が技術的に如何に良いかよりも重要です。

10.2.1. バックアップと復元のポリシー

    実際のバックアップと復元の方針を決める上で3つの要素があります。

     1. 何をバックアップし復元するかを知っていること

          + あなた自身が作成したデーターファイル: "~/" 中のデーター

          + あなた自身が使用したアプリケーションが作成したデーターフ
            ァイル: "/var/" ("/var/cache/" と "/var/run/" と "/var/
            tmp/" は除外) 中のデーター

          + システム設定ファイル: "/etc/" 中のデーター

          + ローカルプログラム: "/usr/local/" とか "/opt/" 中のデータ
            ー

          + システムインストール情報: 要点 (パーティション、…) をプレ
            ーンテキストで書いたメモ

          + 実証済みのデーターセット: 事前の実験復元操作で確認

              o ユーザープロセスでの cron ジョブ: "/var/spool/cron/
                crontabs" ディレクトリー中のファイルと cron(8) の再ス
                タート。cron(8) と crontab(1) に関しては「タスク定期
                実行のスケジュール」を参照下さい。

              o ユーザープロセスでの systemd タイマージョブ: "~
                /.config/systemd/user ディレクトリー中のファイル。
                systemd.timer(5) や systemd.service(5) を参照下さい。

              o ユーザープロセスでの自動スタートジョブ: "~/.config/
                autostart" ディレクトリー中のファイル。Desktop
                Application Autostart Specification を参照下さい。

     2. バックアップと復元の方法を知っていること

          + セキュアーなデーターのストレージ: 上書きやシステム障害の
            防止

          + 頻繁なバックアップ: スケジュールされたバックアップ

          + 冗長なバックアップ: データーのミラーリング

          + フルプルーフなプロセス: 簡単な単一コマンドバックアップ

     3. 関わっているリスクと費用の評価

          + データー消失時のリスク

              o データーはファイルシステム破壊に耐えるように、できれ
                ば異なるディスクやマシン上の、最低限異なるディスクパ
                ーティション上に置くべきです。重要データーは読み取り
                専用ファイルシステムに保存するのが好ましい。^[4]

          + データ侵害の際のデーターのリスク

              o "/etc/ssh/ssh_host_*_key" や "~/.gnupg/*" や "~/.ssh/
                *" や "/etc/passwd" や "/etc/shadow" や "/etc/
                fetchmailrc" や "popularity-contest.conf" や "/etc/
                ppp/pap-secrets" や "/etc/exim4/passwd.client" 等の慎
                重に扱うべきアイデンティティ関連のデーターファイルは
                暗号化してバックアップする必要があります。^[5] (「デ
                ーター暗号化ティップ」を参照下さい。)

              o たとえ信頼できるシステム上でも、システムの login パス
                ワードや暗号化解除パスフレーズは、いかなるスクリプト
                中にもハードコードしてはいけません。(「パスワードキー
                リング」を参照下さい。)

          + 故障モードとその確率

              o ハードウエアー (特に HDD) はいずれ壊れます

              o ファイルシステムは壊れるかもしれないし、その中のデー
                ターは失われるかもしれません

              o セキュリティー侵害に関してリモートストレージシステム
                は信用できません。

              o 脆弱なパスワードによる保護は簡単に破られます

              o ファイルパーミッションシステムが不正アクセスを許すよ
                うになるかもしてません

          + バックアップに必要なリソース: 人的、ハードウエアー、ソフ
            トウェアー、…

              o cron ジョブや systemd タイマージョブでする自動スケジ
                ュールバックアップ

    ヒント

    debconf の設定データーは "debconf-set-selections
    debconf-selections" で、dpkg の選択データーは "dpkg
    --set-selection <dpkg-selections.list" で復元できます。

    注記

    /proc や /sys や /tmp や /run 上にある擬似ファイルシステム (「
    procfs と sysfs」と「tmpfs」参照) の内容をバックアップしてはいけ
    ません。あなた自身が自分がしていることの意味を余程よく分かってい
    なければ、これらの内容は巨大で無用なデーターです。

    注記

    データーをバックアップする際には MTA (「メール転送エージェント
    (MTA)」を参照下さい) 等のアプリケーションデーモンを停止するのも一
    計です。

10.2.2. バックアップユーティリティーのスイート

    Debian システム上で利用可能でバックアップユーティリティーのスイー
    トのなかで際立った選ばれたリストを記します。

    表10.5 バックアップスイートのユーティリティーのリスト

    +---------------------------------------------------------------+
    |  パッケージ  |ポプコ |サイ |               説明               |
    |              |  ン   | ズ  |                                  |
    |--------------+-------+-----+----------------------------------|
    |              |V:6.3, |     |Bacula: ネットワークバックアップ、|
    |bacula-common |I:7.2  |2501 |復元および検証 - 共通のサポートフ |
    |              |       |     |ァイル                            |
    |--------------+-------+-----+----------------------------------|
    |              |V:0.3, |     |Bacula: ネットワークバックアップ、|
    |bacula-client |I:1.9  |199  |復元および検証 - クライアントメタ |
    |              |       |     |パッケージ                        |
    |--------------+-------+-----+----------------------------------|
    |              |V:0.7, |     |Bacula: ネットワークバックアップ、|
    |bacula-console|I:2.1  |112  |復元および検証 - テキストコンソー |
    |              |       |     |ル                                |
    |--------------+-------+-----+----------------------------------|
    |              |       |     |Bacula: ネットワークバックアップ、|
    |bacula-server |I:0.60 |199  |復元および検証 - サーバーメタパッ |
    |              |       |     |ケージ                            |
    |--------------+-------+-----+----------------------------------|
    |              |V:0.6, |     |Amanda: Advanced Maryland         |
    |amanda-common |I:2.2  |9851 |Automatic Network Disk Archiver   |
    |              |       |     |(ライブラリー)                    |
    |--------------+-------+-----+----------------------------------|
    |              |V:0.6, |     |Amanda: Advanced Maryland         |
    |amanda-client |I:2.2  |1099 |Automatic Network Disk Archiver   |
    |              |       |     |(クライアント)                    |
    |--------------+-------+-----+----------------------------------|
    |              |V:0.11,|     |Amanda: Advanced Maryland         |
    |amanda-server |I:0.23 |1093 |Automatic Network Disk Archiver   |
    |              |       |     |(サーバー)                        |
    |--------------+-------+-----+----------------------------------|
    |              |V:1.4, |     |BackupPC は高性能でエンタープライ |
    |backuppc      |I:1.7  |3088 |ズ級の、PC をバックアップするため |
    |              |       |     |のシステム (ディスクベース)       |
    |--------------+-------+-----+----------------------------------|
    |duplicity     |V:6,   |2670 |(リモート) 増分バックアップ       |
    |              |I:47   |     |                                  |
    |--------------+-------+-----+----------------------------------|
    |deja-dup      |V:29,  |5274 |duplicity の GUI フロントエンド   |
    |              |I:43   |     |                                  |
    |--------------+-------+-----+----------------------------------|
    |borgbackup    |V:13,  |3485 |(リモート) 重複回避バックアップ   |
    |              |I:28   |     |                                  |
    |--------------+-------+-----+----------------------------------|
    |borgmatic     |V:3.2, |946  |borgbackup のヘルパー             |
    |              |I:4.4  |     |                                  |
    |--------------+-------+-----+----------------------------------|
    |rdiff-backup  |V:2.3, |1207 |(リモート) 増分バックアップ       |
    |              |I:6.6  |     |                                  |
    |--------------+-------+-----+----------------------------------|
    |restic        |V:6,   |41560|(リモート) 増分バックアップ       |
    |              |I:12   |     |                                  |
    |--------------+-------+-----+----------------------------------|
    |backupninja   |V:2.2, |360  |軽量で拡張可のメタバックアップシス|
    |              |I:2.6  |     |テム                              |
    |--------------+-------+-----+----------------------------------|
    |slbackup      |V:0.11,|147  |(リモート) 増分バックアップ       |
    |              |I:0.13 |     |                                  |
    |--------------+-------+-----+----------------------------------|
    |backup-manager|V:0.43,|573  |コマンドラインのバックアップツール|
    |              |I:0.77 |     |                                  |
    |--------------+-------+-----+----------------------------------|
    |              |V:0.38,|     |マウントできるメディアのための低メ|
    |backup2l      |I:0.53 |110  |ンテナンスのバックアップ/復旧ツー |
    |              |       |     |ル (ディスクベース)               |
    +---------------------------------------------------------------+


    バックアップツールにはそれぞれの特別な狙いがあります。

      * Mondo Rescue を使うと、普通のインストールプロセスを経ずにバッ
        クアップ CD/DVD 等から完全なシステムを迅速に復旧できます。

      * Bacula と Amanda と BackupPC は、ネットワーク越しの定期的バッ
        クアップに焦点のあるフル機能のバックアップスイートです。

      * Duplicity や Borg は典型的ワークステーション向けの比較的簡単
        なバックアップユーティリティーです。

10.2.3. バックアップのティップ

    個人用ワークステーションでは、サーバー環境用に設計されたフル装備
    バックアップユーティリティー一式はうまく機能しないかもしれません
    。同時に、既存のワークステーション用のバックアップユーティリティ
    ーでは足りない面があるかもしれません。

    ここに最小限のユーザー努力でより簡単にバックアップできるようする
    ティップスを示します。これらの技法はどのバックアップユーティリテ
    ィーにでも使えます。

    例示のために、主ユーザーとグループ名を penguin とし、バックアップ
    とスナップショット用スクリプト例 "/usr/local/bin/bkss.sh" を以下
    として作成します:

    #!/bin/sh -e
    SRC="$1" # source data path
    DSTFS="$2" # backup destination filesystem path
    DSTSV="$3" # backup destination subvolume name
    DSTSS="${DSTFS}/${DSTSV}-snapshot" # snapshot destination path
    if [ "$(stat -f -c %T "$DSTFS")" != "btrfs" ]; then
      echo "E: $DESTFS needs to be formatted to btrfs" >&2 ; exit 1
    fi
    MSGID=$(notify-send -p "bkup.sh $DSTSV" "in progress ...")
    if [ ! -d "$DSTFS/$DSTSV" ]; then
      btrfs subvolume create "$DSTFS/$DSTSV"
      mkdir -p "$DSTSS"
    fi
    rsync -aHxS --delete --mkpath "${SRC}/" "${DSTFS}/${DSTSV}"
    btrfs subvolume snapshot -r "${DSTFS}/${DSTSV}" ${DSTSS}/$(date -u --iso=min)
    notify-send -r "$MSGID" "bkup.sh $DSTSV" "finished!"

    ここでは、基本ツールの rsync(1) のみを使いシステムのバックアップ
    が実現され、Btrfs を使うことでストレージスペースが有効利用されて
    います。

    ヒント
   
    参考: 当著者は、自作の類似シェルスクリプト "bss: Btrfs Subvolume
    Snapshot Utility" を自身のワークステーションで使用しています。

10.2.3.1. GUI バックアップ

    単一 GUI クリックによるバックアップの設定例をここに示します。

      * USB ストレージデバイスをバックアップ用に準備します。

          + "BKUP" というラベル名のついた btrfs の 1 パーティションがある
            ように USB ストレージデバイスをフォーマットします。これは暗号
            化されていても良いです(「dm-crypt/LUKS を使ったリムーバブルデ
            ィスクの暗号化」を参照下さい)。

          + これをあなたのシステムに挿入します。デスクトップシステムがそ
            れを "/media/penguin/BKUP" をして自動マウントするはずです。

          + 当該ユーザーにより書き込みできるように "sudo chown
            penguin:penguin /media/penguin/BKUP" と実行します。

      * 「GUI からプログラムをスタート」中に記載された技法に則り "~
        /.local/share/applications/BKUP.desktop" を以下のように作成しま
        す:

        [Desktop Entry]
        Name=bkss
        Comment=Backup and snapshot of ~/Documents
        Exec=/usr/local/bin/bkss.sh /home/penguin/Documents /media/penguin/BKUP Documents
        Type=Application

    各 GUI クリック毎に、あなたのデーターが "~/Documents" から USB ス
    トレージデバイスにバックアップされ、リードオンリーのスナップショ
    ットが作成されます。

10.2.3.2. マウントイベントがトリガーするバックアップ

    マウントイベントによりトリガーされる自動バックアップの設定例をこ
    こに記します。

      * 「GUI バックアップ」と同様にし、USB ストレージデバイスをバックア
        ップ用に準備します。

      * systemd サービスユニットファイル "~/.config/systemd/user/
        back-BKUP.service" を以下のように作成します:

        [Unit]
        Description=USB Disk backup
        Requires=media-%u-BKUP.mount
        After=media-%u-BKUP.mount
   
        [Service]
        ExecStart=/usr/local/bin/bkss.sh %h/Documents /media/%u/BKUP Documents
        StandardOutput=append:%h/.cache/systemd-snap.log
        StandardError=append:%h/.cache/systemd-snap.log

        [Install]
        WantedBy=media-%u-BKUP.mount

      * 以下のようにして systemd のユニット設定を有効化します。

         $ systemctl --user enable bkup-BKUP.service

    各マウントイベント毎に、あなたのデーターが "~/Documents" から USB
    ストレージデバイスにバックアップされ、リードオンリーのスナップシ
    ョットが作成されます。

    ここで、systemd が現在メモリー上に保持する systemd のマウント
    unit 名を、呼び出ているユーザーのサービスマネージャーに問い合わす
    には、"systemctl --user list-units --type=mount" を使います。

10.2.3.3. タイマーイベントがトリガーするバックアップ

    タイマーイベントによりトリガーされる自動バックアップの設定例をこ
    こに記します。

      * 「GUI バックアップ」と同様にし、USB ストレージデバイスをバックア
        ップ用に準備します。

      * systemd タイマーユニットファイル "~/.config/systemd/user/
        snap-Documents.timer" を以下のように作成します:

        [Unit]
        Description=Run btrfs subvolume snapshot on timer
        Documentation=man:btrfs(1)

        [Timer]
        OnStartupSec=30
        OnUnitInactiveSec=900

        [Install]
        WantedBy=timers.target

      * systemd サービスユニットファイル "~/.config/systemd/user/
        snap-Documents.service" を以下のように作成します:

        [Unit]
        Description=Run btrfs subvolume snapshot
        Documentation=man:btrfs(1)

        [Service]
        Type=oneshot
        Nice=15
        ExecStart=/usr/local/bin/bkss.sh %h/Documents /media/%u/BKUP Documents
        IOSchedulingClass=idle
        CPUSchedulingPolicy=idle
        StandardOutput=append:%h/.cache/systemd-snap.log
        StandardError=append:%h/.cache/systemd-snap.log

      * 以下のようにして systemd のユニット設定を有効化します。

         $ systemctl --user enable snap-Documents.timer

    各タイマーイベント毎に、あなたのデーターが "~/Documents" から USB
    ストレージデバイスにバックアップされ、リードオンリーのスナップシ
    ョットが作成されます。

    ここで、systemd が現在メモリー上に保持する systemd のタイマー
    unit 名を、呼び出ているユーザーのサービスマネージャーに問い合わす
    には、"systemctl --user list-units --type=mount" を使います。

    現代的なデスクトップシステムでは、この systemd を使うアプローチの
    ほうが at(1) や cron(8) や anacron(8) を使う伝統的 Unix アプロー
    チよりより精緻な制御を提供できます。

10.3. データーセキュリティーのインフラ

    データーのセキュリティーのインフラはデーターの暗号化のツールとメ
    ッセージダイジェストのツールと署名ツールの組み合わせで提供されま
    す。

    表10.6 データーセキュリティーインフラツールのリスト

    +---------------------------------------------------------------+
    |  パッケージ   |ポプコ|サイ | コマンド  |         説明         |
    |               |  ン  | ズ  |           |                      |
    |---------------+------+-----+-----------+----------------------|
    |               |V:398,|     |           |GNU プライバシーガード|
    |gnupg          |I:867 |464  |gpg(1)     |- OpenPGP 暗号化と署名|
    |               |      |     |           |ツール                |
    |---------------+------+-----+-----------+----------------------|
    |               |V:234,|     |           |GNU プライバシーガード|
    |gpgv           |I:939 |555  |gpgv(1)    |- OpenPGP 署名検証ツー|
    |               |      |     |           |ル                    |
    |---------------+------+-----+-----------+----------------------|
    |sq             |V:1,  |23948|sq(1)      |Sequoia-PGP - OpenPGP |
    |               |I:27  |     |           |暗号化と署名ツール    |
    |---------------+------+-----+-----------+----------------------|
    |sqv            |V:416,|1702 |sqv(1)     |Sequoia-PGP - OpenPGP |
    |               |I:487 |     |           |署名検証ツール        |
    |---------------+------+-----+-----------+----------------------|
    |paperkey       |V:1,  |58   |paperkey(1)|OpenPGP の秘密キーから|
    |               |I:13  |     |           |秘密の情報だけを抜粋  |
    |---------------+------+-----+-----------+----------------------|
    |               |      |     |           |暗号化されたブロックデ|
    |cryptsetup     |V:35, |462  |cryptsetup |バイス (dm-crypt /    |
    |               |I:78  |     |(8), …     |LUKS) のためのユーティ|
    |               |      |     |           |リティー              |
    |---------------+------+-----+-----------+----------------------|
    |coreutils      |V:911,|17994|md5sum(1)  |MD5 メッセージダイジェ|
    |               |I:1000|     |           |ストを計算やチェック  |
    |---------------+------+-----+-----------+----------------------|
    |coreutils      |V:911,|17994|sha1sum(1) |SHA1 メッセージダイジ |
    |               |I:1000|     |           |ェストを計算やチェック|
    |---------------+------+-----+-----------+----------------------|
    |               |      |     |           |"openssl dgst" を使っ |
    |openssl        |V:847,|2532 |openssl    |てメッセージダイジェス|
    |               |I:996 |     |(1ssl)     |トを計算やチェック    |
    |               |      |     |           |(OpenSSL)             |
    |---------------+------+-----+-----------+----------------------|
    |libsecret-tools|V:1,  |45   |secret-tool|パスワードの保存と読出|
    |               |I:11  |     |(1)        |し (CLI)              |
    |---------------+------+-----+-----------+----------------------|
    |seahorse       |V:75, |7971 |seahorse(1)|キー管理ツール (GNOME)|
    |               |I:261 |     |           |                      |
    +---------------------------------------------------------------+


    Linux カーネルモジュール経由で自動的データー暗号化のインフラを実
    現する dm-crypt と fscrypt に関しては「データー暗号化ティップ」を
    参照下さい。

10.3.1. Gnupg のためのキー管理

    基本的なキー管理に関する GNU プライバシガードコマンドを次に記しま
    す。

    表10.7 キー管理のための GNU プライバシガードコマンドのリスト

    +---------------------------------------------------------------+
    |         コマンド         |                説明                |
    |--------------------------+------------------------------------|
    |gpg --gen-key             |新規キーの生成                      |
    |--------------------------+------------------------------------|
    |gpg --gen-revoke          |my_user_ID に関するリボークキーを生 |
    |my_user_ID                |成                                  |
    |--------------------------+------------------------------------|
    |gpg --edit-key user_ID    |インタラクティブにキーを編集、ヘルプ|
    |                          |は "help"                           |
    |--------------------------+------------------------------------|
    |gpg -o file --export      |全ての公開キーをファイルにエクスポー|
    |                          |ト                                  |
    |--------------------------+------------------------------------|
    |gpg -o file               |全ての秘密キーをファイルにエクスポー|
    |--export-secret-keys      |ト                                  |
    |--------------------------+------------------------------------|
    |gpg --import file         |全てのキーをファイルからインポート  |
    |--------------------------+------------------------------------|
    |gpg --send-keys user_ID   |user_ID のキーをキーサーバーに送信  |
    |--------------------------+------------------------------------|
    |gpg --recv-keys user_ID   |user_ID のキーをキーサーバーから受信|
    |--------------------------+------------------------------------|
    |gpg --list-keys user_ID   |user_ID のキーをリスト              |
    |--------------------------+------------------------------------|
    |gpg --list-sigs user_ID   |user_ID の署名をリスト              |
    |--------------------------+------------------------------------|
    |gpg --check-sigs user_ID  |user_ID の署名をチェック            |
    |--------------------------+------------------------------------|
    |gpg --fingerprint user_ID |user_ID のフィンガープリントをチェッ|
    |                          |ク                                  |
    |--------------------------+------------------------------------|
    |gpg --refresh-keys        |ローカルキーリングを更新            |
    +---------------------------------------------------------------+


    トラストコードの意味を次に記します。

    表10.8 トラストコードの意味のリスト

    +----------------------------------+
    |コード|        信用の説明         |
    |------+---------------------------|
    |-     |所有者への信用未付与/未計算|
    |------+---------------------------|
    |e     |信用計算に失敗             |
    |------+---------------------------|
    |q     |計算用の情報不十分         |
    |------+---------------------------|
    |n     |このキーを信用不可         |
    |------+---------------------------|
    |m     |スレスレの信用             |
    |------+---------------------------|
    |f     |フルに信用                 |
    |------+---------------------------|
    |u     |究極の信用                 |
    +----------------------------------+


    以下のようにすると私のキー
    "9563FC29932C409F1A77F9C1AB8A1522D8234C6A" を作成出来ます。

    $ gpg --gen-key
    gpg (GnuPG) 2.4.7; Copyright (C) 2024 g10 Code GmbH
    ...
    GnuPG needs to construct a user ID to identify your key.

    Real name: Osamu Aoki
    Email address: osamu@debian.org
    You selected this USER-ID:
        "Osamu Aoki <osamu@debian.org>"
   
    Change (N)ame, (E)mail, or (O)kay/(Q)uit? o
    ...
    public and secret key created and signed.

    pub   ed25519 2026-02-14 [SC] [expires: 2029-02-13]
          9563FC29932C409F1A77F9C1AB8A1522D8234C6A
    uid                      Osamu Aoki <osamu@debian.org>
    sub   cv25519 2026-02-14 [E] [expires: 2029-02-13]


    以下のようにすると私のキー
    "9563FC29932C409F1A77F9C1AB8A1522D8234C6A" をポピュラーなキーサー
    バー "hkp://keys.gnupg.net" にアップロード出来ます。

    $ gpg --keyserver hkp://keys.gnupg.net --send-keys 9563FC29932C409F1A77F9C1AB8A1522D8234C6A

    "~/.gnupg/gpg.conf" (もしくは古い場所 "~/.gnupg/options") 中の良
    いデフォールトのキーサーバーの設定は次を含みます。

    keyserver hkp://keys.gnupg.net

    次によってキーサーバーから知らないキーが獲得できます。

    $ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\
              cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys

    OpenPGP 公開キーサーバー (バージョン0.9.6以前) に2つ以上サブキー
    のあるキーを壊すバグがありました。新しい gnupg (>1.2.1-2) パッケ
    ージはこのような壊れたサブキーを取り扱えます。gpg(1) の
    "--repair-pks-subkey-bug" オプションの説明を参照下さい。

    SHA-1 をハッシュに使うのは非推奨です。あなたの古い RSA ベースの
    openPGP キーが SHA-1 を使用していれば、FixKeyWithSha1 を用いて修
    正しましょう。

    ヒント

    sq(1) と sqv(1) コマンドは openPGP コマンドの代替セットです。sq
    user documentation と A Practical Introduction to using sq,
    Sequoia PGP’s CLI を参照ください。

10.3.2. GnuPG をファイルに使用

    基本的なキー管理に関する GNU プライバシガードコマンドを次に記しま
    す。

    表10.9 ファイルに使用する GNU プライバシーガードコマンドのリスト

    +---------------------------------------------------------------+
    |         コマンド          |               説明                |
    |---------------------------+-----------------------------------|
    |gpg -a -s file             |ファイルを ASCII 文字化した        |
    |                           |file.asc と署名                    |
    |---------------------------+-----------------------------------|
    |gpg --armor --sign file    |, ,                                |
    |---------------------------+-----------------------------------|
    |gpg --clearsign file       |メッセージをクリアサイン           |
    |---------------------------+-----------------------------------|
    |gpg --clearsign file|mail  |foo@example.org にクリアサインされ |
    |foo@example.org            |たメッセージをメールする           |
    |---------------------------+-----------------------------------|
    |gpg --clearsign            |                                   |
    |--not-dash-escaped         |パッチファイルをクリアサイン       |
    |patchfile                  |                                   |
    |---------------------------+-----------------------------------|
    |gpg --verify file          |クリアサインされたファイルを確認   |
    |---------------------------+-----------------------------------|
    |gpg -o file.sig -b file    |署名を別ファイルで作成             |
    |---------------------------+-----------------------------------|
    |gpg -o file.sig            |, ,                                |
    |--detach-sign file         |                                   |
    |---------------------------+-----------------------------------|
    |gpg --verify file.sig file |file.sig を使ってファイルを確認    |
    |---------------------------+-----------------------------------|
    |gpg -o crypt_file.gpg -r   |file からバイナリー crypt_file.gpg |
    |name -e file               |への name 宛公開キー暗号化         |
    |---------------------------+-----------------------------------|
    |gpg -o crypt_file.gpg      |                                   |
    |--recipient name --encrypt |, ,                                |
    |file                       |                                   |
    |---------------------------+-----------------------------------|
    |gpg -o crypt_file.asc -a -r|file から ASCII 文字化された       |
    |name -e file               |crypt_file.asc への name 宛公開キー|
    |                           |暗号化                             |
    |---------------------------+-----------------------------------|
    |gpg -o crypt_file.gpg -c   |file からバイナリー crypt_file.gpg |
    |file                       |への対称暗号化                     |
    |---------------------------+-----------------------------------|
    |gpg -o crypt_file.gpg      |, ,                                |
    |--symmetric file           |                                   |
    |---------------------------+-----------------------------------|
    |gpg -o crypt_file.asc -a -c|file から ASCII 文字化された       |
    |file                       |crypt_file.asc への対称暗号化      |
    |---------------------------+-----------------------------------|
    |gpg -o file -d             |暗号解読                           |
    |crypt_file.gpg -r name     |                                   |
    |---------------------------+-----------------------------------|
    |gpg -o file --decrypt      |, ,                                |
    |crypt_file.gpg             |                                   |
    +---------------------------------------------------------------+


10.3.3. Mutt で GnuPG を使用

    インデックスメニュー上で "S" とすれば GnuPG が使えるようにしてお
    きながら、遅い GnuPG が自動的に起動しないように "~/.muttrc" に以
    下の内容を追加します。

    macro index S ":toggle pgp_verify_sig\n"
    set pgp_verify_sig=no

10.3.4. Vim で GnuPG を使用

    gnupg のプラグインを使うと ".gpg" や ".asc" や ".pgp" というファ
    イル拡張子のファイルに対して透過的に GnuPG を実行できます。^[6]

    $ sudo aptitude install vim-scripts
    $ echo "packadd! gnupg" >> ~/.vim/vimrc

10.3.5. MD5 和

    md5sum(1) はrfc1321 の方法を使ってダイジェストファイルを作成し各
    ファイルをそれで確認するユーティリティーを提供します。

    $ md5sum foo bar >baz.md5
    $ cat baz.md5
    d3b07384d113edec49eaa6238ad5ff00  foo
    c157a79031e1c40f85931829bc5fc552  bar
    $ md5sum -c baz.md5
    foo: OK
    bar: OK

    注記

    MD5 和の計算は GNU プライバシーガード (GnuPG) による暗号学的署名
    の計算より CPU への負荷がかかりません。通常、一番上のレベルのダイ
    ジェストファイルだけがデーターの整合性のために暗号学的に署名され
    ます。

10.3.6. パスワードキーリング

    GNOME システム上では、seahorse(1) がキーリング ~/.local/share/
    keyrings/* 中にパスワードを管理し保存します。

    secret-tool(1) はコマンドラインからパスワードをキーリングに保存で
    きます。

    ディスクイメージを LUKS/dm-crypt 暗号化するためのパスフレーズを保
    存します。

    $ secret-tool store --label='LUKS passphrase for disk.img' LUKS my_disk.img
    Password: ********

    cryptsetup(8) のような他のプログラムに、こうして保存されたパスワ
    ードを読み出し供給できます。

    $ secret-tool lookup LUKS my_disk.img | \
      cryptsetup open disk.img disk_img --type luks --keyring -
    $ sudo mount /dev/mapper/disk_img /mnt

    ヒント

    スクリプト中でパスワードを供給する必要がある際はいつも
    secret-tool を使いパスフレーズを直接ハードコードすることは避けま
    す。

10.4. ソースコードマージツール

    ソースコードをマージする多くのツールがあります。以下のコマンドが
    著者の目に止まりました。

    表10.10 ソースコードマージツールのリスト

    +---------------------------------------------------------------+
    |パッケージ|ポプコ |サイ| コマンド  |           説明            |
    |          |  ン   | ズ |           |                           |
    |----------+-------+----+-----------+---------------------------|
    |patch     |V:103, |242 |patch(1)   |差分ファイルをオリジナルに |
    |          |I:726  |    |           |適用                       |
    |----------+-------+----+-----------+---------------------------|
    |vim       |V:85,  |4135|vimdiff(1) |vim で2つのファイルを並べて|
    |          |I:347  |    |           |比較                       |
    |----------+-------+----+-----------+---------------------------|
    |imediff   |V:0.03,|329 |imediff(1) |対話型フルスクリーンの2方/3|
    |          |I:0.26 |    |           |方マージツール             |
    |----------+-------+----+-----------+---------------------------|
    |meld      |V:5,   |3992|meld(1)    |ファイルを比較やマージ     |
    |          |I:24   |    |           |(GTK)                      |
    |----------+-------+----+-----------+---------------------------|
    |wiggle    |V:0.01,|175 |wiggle(1)  |リジェクトされたパッチを適 |
    |          |I:0.12 |    |           |用                         |
    |----------+-------+----+-----------+---------------------------|
    |diffutils |V:896, |1768|diff(1)    |1行ごとにファイルを比較    |
    |          |I:998  |    |           |                           |
    |----------+-------+----+-----------+---------------------------|
    |diffutils |V:896, |1768|diff3(1)   |1行ごとにファイルを比較やマ|
    |          |I:998  |    |           |ージ                       |
    |----------+-------+----+-----------+---------------------------|
    |quilt     |V:2,   |880 |quilt(1)   |パッチのシリーズを管理     |
    |          |I:17   |    |           |                           |
    |----------+-------+----+-----------+---------------------------|
    |wdiff     |V:6,   |651 |wdiff(1)   |テキストファイル間のワード |
    |          |I:40   |    |           |の相違表示                 |
    |----------+-------+----+-----------+---------------------------|
    |diffstat  |V:9,   |79  |diffstat(1)|差分ファイルによる変化のヒ |
    |          |I:98   |    |           |ストグラム作成             |
    |----------+-------+----+-----------+---------------------------|
    |patchutils|V:11,  |269 |combinediff|2つの積み重ねパッチから1つ |
    |          |I:97   |    |(1)        |の合計パッチを生成         |
    |----------+-------+----+-----------+---------------------------|
    |patchutils|V:11,  |269 |dehtmldiff |HTML ページから差分ファイル|
    |          |I:97   |    |(1)        |を抽出                     |
    |----------+-------+----+-----------+---------------------------|
    |patchutils|V:11,  |269 |filterdiff |差分ファイルから差分ファイ |
    |          |I:97   |    |(1)        |ルを抽出や削除             |
    |----------+-------+----+-----------+---------------------------|
    |          |V:11,  |    |fixcvsdiff |CVS により作成された patch |
    |patchutils|I:97   |269 |(1)        |(1) が誤解する差分ファイル |
    |          |       |    |           |を修正                     |
    |----------+-------+----+-----------+---------------------------|
    |patchutils|V:11,  |269 |flipdiff(1)|古い2つのパッチを交換      |
    |          |I:97   |    |           |                           |
    |----------+-------+----+-----------+---------------------------|
    |          |V:11,  |    |           |正規表現にマッチするパッチ |
    |patchutils|I:97   |269 |grepdiff(1)|によって変更されるファイル |
    |          |       |    |           |を表示                     |
    |----------+-------+----+-----------+---------------------------|
    |patchutils|V:11,  |269 |interdiff  |2つのユニファイド差分ファイ|
    |          |I:97   |    |(1)        |ル間の違いを表示           |
    |----------+-------+----+-----------+---------------------------|
    |patchutils|V:11,  |269 |lsdiff(1)  |どのファイルがパッチによっ |
    |          |I:97   |    |           |て変更されるかを表示       |
    |----------+-------+----+-----------+---------------------------|
    |          |V:11,  |    |recountdiff|ユニファイドコンテキスト差 |
    |patchutils|I:97   |269 |(1)        |分ファイルのカウントやオフ |
    |          |       |    |           |セットを再計算             |
    |----------+-------+----+-----------+---------------------------|
    |          |V:11,  |    |           |手編集された差分ファイルの |
    |patchutils|I:97   |269 |rediff(1)  |カウントやオフセットを再計 |
    |          |       |    |           |算                         |
    |----------+-------+----+-----------+---------------------------|
    |patchutils|V:11,  |269 |splitdiff  |増分パッチの分離           |
    |          |I:97   |    |(1)        |                           |
    |----------+-------+----+-----------+---------------------------|
    |patchutils|V:11,  |269 |unwrapdiff |ワードラップされたパッチを |
    |          |I:97   |    |(1)        |復元                       |
    |----------+-------+----+-----------+---------------------------|
    |dirdiff   |V:0.1, |167 |dirdiff(1) |ディレクトリーツリー間で相 |
    |          |I:1.4  |    |           |違点の表示と変更のマージ   |
    |----------+-------+----+-----------+---------------------------|
    |docdiff   |V:0.03,|554 |docdiff(1) |2つのファイルをワード毎/文 |
    |          |I:0.25 |    |           |字毎に比較                 |
    |----------+-------+----+-----------+---------------------------|
    |makepatch |V:0.02,|99  |makepatch  |拡張パッチファイルの生成   |
    |          |I:0.16 |    |(1)        |                           |
    |----------+-------+----+-----------+---------------------------|
    |makepatch |V:0.02,|99  |applypatch |拡張パッチファイルの適用   |
    |          |I:0.16 |    |(1)        |                           |
    +---------------------------------------------------------------+


10.4.1. ソースファイル間の相違の抽出

    ふたつのソースファイル間の相違を抽出したユニファイド差分ファイル
    は、以下の要領でファイル位置に対応し "file.patch0" か
    "file.patch1" として作成されます。

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

10.4.2. ソースファイルに更新をマージ

    差分ファイル (別名、パッチファイル) はプログラム更新を送るのに使
    われます。受け取った側はこの更新を別のファイルに以下のようにして
    適用します。

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

10.4.3. インタラクティブなマージ

    2つのバージョンのソースコードがある場合、imediff(1) をインタラク
    ティブに使って効率的に2方マージを以下のように実行できます。

    $ imediff -o file.merged file.old file.new

    3つのバージョンのソースコードがある場合、imediff(1) をインタラク
    ティブに使って3方マージを以下のように実行できます。

    $ imediff -o file.merged file.yours file.base file.theirs

10.5. Git

    最近は、ローカルとリモートの両方のコード管理一切が可能なGitがバー
    ジョンコントロールシステム (VCS) として最優先の選択肢です。

    Debian は Debian Salsa サービス経由でフリーの Git サービスを提供
    します。その説明文書は https://wiki.debian.org/Salsa にあります。

    Git関連パッケージは以下です。

    表10.11 git 関連のパッケージとコマンドのリスト

    +---------------------------------------------------------------+
    |   パッケージ   |ポプコ |サイ |    コマンド    |     説明      |
    |                |  ン   | ズ  |                |               |
    |----------------+-------+-----+----------------+---------------|
    |                |       |     |                |git: 高速、スケ|
    |                |V:406, |     |                |ーラブル、分散 |
    |git             |I:616  |50972|git(7)          |型リビジョンコ |
    |                |       |     |                |ントロールシス |
    |                |       |     |                |テム           |
    |----------------+-------+-----+----------------+---------------|
    |                |       |     |                |GUI による履歴 |
    |gitk            |V:4,   |2022 |gitk(1)         |付き Git レポジ|
    |                |I:27   |     |                |トリーブラウザ |
    |                |       |     |                |ー             |
    |----------------+-------+-----+----------------+---------------|
    |                |       |     |                |GUI による履歴 |
    |qgit            |V:0.2, |1431 |qgit(1)         |付き Git レポジ|
    |                |I:2.0  |     |                |トリーブラウザ |
    |                |       |     |                |ー             |
    |----------------+-------+-----+----------------+---------------|
    |                |       |     |                |GUI による履歴 |
    |git-cola        |V:0.7, |5005 |git-cola(1)     |付き Git レポジ|
    |                |I:4.6  |     |                |トリーブラウザ |
    |                |       |     |                |ー             |
    |----------------+-------+-----+----------------+---------------|
    |                |       |     |                |コンソールによ |
    |tig             |V:2,   |1243 |tig(1)          |る履歴付き Git |
    |                |I:12   |     |                |レポジトリーブ |
    |                |       |     |                |ラウザー       |
    |----------------+-------+-----+----------------+---------------|
    |                |       |     |                |コンソールによ |
    |lazygit         |V:0.9, |24167|lazygit(1)      |る履歴付き Git |
    |                |I:3.6  |     |                |レポジトリーブ |
    |                |       |     |                |ラウザー       |
    |----------------+-------+-----+----------------+---------------|
    |git-gui         |V:1,   |2525 |git-gui(1)      |Git 用の GUI   |
    |                |I:17   |     |                |(履歴無し)     |
    |----------------+-------+-----+----------------+---------------|
    |                |V:0.4, |     |git-send-email  |Git からパッチ |
    |git-email       |I:9.8  |1204 |(1)             |の集合の email |
    |                |       |     |                |として送信     |
    |----------------+-------+-----+----------------+---------------|
    |                |V:1.2, |     |git-buildpackage|Git を使って   |
    |git-buildpackage|I:7.1  |2027 |(1)             |Debian パッケー|
    |                |       |     |                |ジ化を自動化   |
    |----------------+-------+-----+----------------+---------------|
    |                |V:0.2, |     |                |Debian アーカイ|
    |dgit            |I:1.0  |738  |dgit(1)         |ブと git の相互|
    |                |       |     |                |運用性         |
    |----------------+-------+-----+----------------+---------------|
    |                |       |     |                |インタラクティ |
    |imediff         |V:0.03,|329  |git-ime(1)      |ブな git コミッ|
    |                |I:0.26 |     |                |ト分割ヘルパー |
    |                |       |     |                |ツール         |
    |----------------+-------+-----+----------------+---------------|
    |stgit           |V:0.08,|6181 |stg(1)          |Git 上の quilt |
    |                |I:0.50 |     |                |(Python)       |
    |----------------+-------+-----+----------------+---------------|
    |git-doc         |I:11   |14896|N/A             |正式 Git 文書  |
    |----------------+-------+-----+----------------+---------------|
    |                |       |     |                |"Git マジック" |
    |gitmagic        |I:0.52 |721  |N/A             |、Git に関する |
    |                |       |     |                |分かり易いガイ |
    |                |       |     |                |ド             |
    +---------------------------------------------------------------+


10.5.1. Git クライアントの設定

    Git は使うあなたの名前や email アドレス等を "~/.gitconfig" 中のい
    くつかのグローバル設定に設定したいなら以下のようにします。

    $ git config --global user.name "Name Surname"
    $ git config --global user.email yourname@example.com

    以下によって Git のデフォルトの動作をカスタマイズしてもいいです。

    $ git config --global init.defaultBranch main
    $ git config --global pull.rebase true
    $ git config --global push.default current

    もしあなたが CVS や Subversion コマンドに慣れ過ぎている場合には、
    いくつかのコマンドエイリアスを以下のように設定するのも一計です。

    $ git config --global alias.ci "commit -a"
    $ git config --global alias.co checkout

    あなたのグローバル設定は以下のようにするとチェックできます。

    $ git config --global --list

10.5.2. 基本 Git コマンド

    Git 操作にはいくつかのデーターが関与します。

      * ユーサーから見えるファイルを保持しかつ変更の対象とする、ワー
        キングツリー

          + 記録すべき変更は、インデックスに明示的に選択して候補とし
            て挙げなければいけません。これは、git add や git rm コマ
            ンドです。

      * 候補として挙げたファイルを保持するインデックス

          + 候補として挙げたファイルはそれに続くリクエストでローカル
            のレポジトリーにコミットされるでしょう。これは、git
            commit コマンドです。

      * コミットされたファイルを保持するローカルのレポジトリー

          + Git はコミットされたデーターのリンクされた履歴をレポジト
            リー中にブランチとして整理して保存します。

          + git push コマンドによって、ローカルレポジトリーはリモート
            レポジトリーにデーターを送信できます。
   
          + git fetch や git pull コマンドによって、ローカルレポジト
            リーはリモートレポジトリーからデーターを受信できます。

              o git pull コマンドは git fetch コマンドの後で git
                merge か git rebase コマンドを実行します。

              o ここで、git merge は、2 つの別々の履歴のブランチの最
                後を 1 点にまとめます。(これは、カスタマイズされてい
                ないデフォルトの場合の git pull で、多くの人に向けて
                ブランチを公開するアップストリームに好適です。)

              o ここで、git rebase は、リモートブランチの履歴の後ろに
                ローカルブランチの履歴が繋がった連続履歴の単一ブラン
                チを生成します。(これは、pull.rebase true カスタマイ
                ゼイションの場合で、残りの我々に好適です。)

      * コミットされたファイルを保持するリモートレポジトリー

          + リモートレポジトリーとの通信は SSH か HTTPS 等のセキュア
            ー通信プロトコルを使います。

    ワーキングツリーは .git/ ディレクトリーの外のファイルです。.git/
    ディレクトリーの内部のファイルはインデックス、ローカルレポジトリ
    ーデーター、いくつかの git 設定のテキストファイルを保持します。

    主要 Git コマンドの概論です。

    表10.12 主要 Git コマンド

    +---------------------------------------------------------------+
    | Git コマンド |                      機能                      |
    |--------------+------------------------------------------------|
    |git init      |(ローカル) レポジトリーを作成します             |
    |--------------+------------------------------------------------|
    |git clone URL |リモートレポジトリーをワーキングツリー付きローカ|
    |              |ルレポジトリーとしてクローンします              |
    |--------------+------------------------------------------------|
    |git pull      |ローカルの main ブランチをリモートレポジトリーの|
    |origin main   |origin を使って更新します                       |
    |--------------+------------------------------------------------|
    |              |インデックス中にのみ既に存在するファイルに関して|
    |git add .     |ワーキングツリー中のファイルをインデックスに追加|
    |              |します                                          |
    |--------------+------------------------------------------------|
    |git add -A .  |ワーキングツリー内の全てのファイルを全てのファイ|
    |              |ルに関するインデックスに削除を含め加えます      |
    |--------------+------------------------------------------------|
    |git rm        |ワーキングツリーとインデックスからファイルを削除|
    |filename      |します                                          |
    |--------------+------------------------------------------------|
    |git commit    |ローカルレポジトリーにインデックス中の挙げられた|
    |              |変更をコミットします                            |
    |--------------+------------------------------------------------|
    |              |ワーキングツリー中の全ての変更をインデックスに追|
    |git commit -a |加し、それらをローカルレポジトリーにコミットしま|
    |              |す (add + commit)                               |
    |--------------+------------------------------------------------|
    |git push -u   |リモートレポジトリー origin をローカルの        |
    |origin        |branch_name ブランチで更新します (最初の呼び出  |
    |branch_name   |し)                                             |
    |--------------+------------------------------------------------|
    |git push      |リモートレポジトリー origin をローカルの        |
    |origin        |branch_name ブランチで更新します (その後の呼び出|
    |branch_name   |し)                                             |
    |--------------+------------------------------------------------|
    |git diff      |treeish1 コミットと treeish2 コミットの間の相違 |
    |treeish1      |を表示します                                    |
    |treeish2      |                                                |
    |--------------+------------------------------------------------|
    |gitk          |VCS レポジトリーのブランチヒストリーツリーの GUI|
    |              |表示をします                                    |
    +---------------------------------------------------------------+


10.5.3. Git ティップ

    以下はGit ティップです。

    表10.13 Git ティップ

    +---------------------------------------------------------------+
    |   Git コマンドライン   |                 機能                 |
    |------------------------+--------------------------------------|
    |                        |Git 全履歴を閲覧し HEAD を別のコミット|
    |gitk --all              |にリセットし、パッチをチェリーピックし|
    |                        |、タグやブランチを生成するような、Git |
    |                        |履歴への操作を加えます                |
    |------------------------+--------------------------------------|
    |git stash               |データーを消失無くクリーンなワーキング|
    |                        |ツリーを得ます                        |
    |------------------------+--------------------------------------|
    |git remote -v           |リモートに関する設定をチェックします  |
    |------------------------+--------------------------------------|
    |git branch -vv          |ブランチに関する設定をチェックします  |
    |------------------------+--------------------------------------|
    |git status              |ワーキングツリーの状態を表示します    |
    |------------------------+--------------------------------------|
    |git config -l           |git 設定のリストをします              |
    |------------------------+--------------------------------------|
    |git reset --hard HEAD;  |全てのワーキングツリーの変更を元に戻し|
    |git clean -x -d -f      |完全にクリーンアップします            |
    |------------------------+--------------------------------------|
    |git rm --cached filename|git add filename で変更された候補のイ |
    |                        |ンデックスを元に戻します              |
    |------------------------+--------------------------------------|
    |                        |レファレンスログを取得します(削除した |
    |git reflog              |ブランチからコミットを復元するのに有用|
    |                        |です)                                 |
    |------------------------+--------------------------------------|
    |git branch              |reflog 情報から新規ブランチを生成しま |
    |new_branch_name HEAD@{6}|す                                    |
    |------------------------+--------------------------------------|
    |git remote add          |URL によって指される new_remote リモー|
    |new_remote URL          |トレポジトリーを追加します            |
    |------------------------+--------------------------------------|
    |git remote rename origin|リモートレポジトリー名を origin から  |
    |upstream                |upstream に変更します                 |
    |------------------------+--------------------------------------|
    |git branch -u upstream/ |リモートレポジトリー upstream とそのブ|
    |branch_name             |ランチ名 branch_name にリモートトラッ |
    |                        |キングを設定します。                  |
    |------------------------+--------------------------------------|
    |git remote set-url      |                                      |
    |origin https://foo/     |origin の URL を変更します            |
    |bar.git                 |                                      |
    |------------------------+--------------------------------------|
    |git remote set-url      |upstream へのプシュを無効化します     |
    |--push upstream DISABLED|(.git/config を編集して再有効化)      |
    |------------------------+--------------------------------------|
    |git remote update       |upstream レポジトリー中の全リモートブ |
    |upstream                |ランチの更新を取得します              |
    |------------------------+--------------------------------------|
    |                        |ローカルの (孤立しているかもしれない) |
    |git fetch upstream      |upstream-foo ブランチを、upstream レポ|
    |foo:upstream-foo        |ジトリー中の foo ブランチのコピーとし |
    |                        |て作成します                          |
    |------------------------+--------------------------------------|
    |git checkout -b         |新規 topic_branch を作成しそれを      |
    |topic_branch ; git push |origin にプシュします                 |
    |-u topic_branch origin  |                                      |
    |------------------------+--------------------------------------|
    |git branch -m oldname   |ローカルブランチ名を変更します        |
    |newname                 |                                      |
    |------------------------+--------------------------------------|
    |git push -d origin      |リモートブランチを削除します (新手法) |
    |branch_to_be_removed    |                                      |
    |------------------------+--------------------------------------|
    |git push origin         |リモートブランチを削除します (旧手法) |
    |:branch_to_be_removed   |                                      |
    |------------------------+--------------------------------------|
    |git checkout --orphan   |新 unconnected ブランチを生成します   |
    |unconnected             |                                      |
    |------------------------+--------------------------------------|
    |git rebase -i origin/   |きれいなブランチ履歴のために、origin/ |
    |main                    |main からのコミットを順序変更/削除/押 |
    |                        |し潰します                            |
    |------------------------+--------------------------------------|
    |git reset HEAD^; git    |最後の 2 コミットを 1 つに押し潰します|
    |commit --amend          |                                      |
    |------------------------+--------------------------------------|
    |git checkout            |全 topic_branch を1 つのコミットに押し|
    |topic_branch ; git merge|潰します                              |
    |--squash topic_branch   |                                      |
    |------------------------+--------------------------------------|
    |git fetch --unshallow   |                                      |
    |--update-head-ok origin |浅いクローンをブランチのフルクローンに|
    |'+refs/heads/*:refs/    |変換します                            |
    |heads/*'                |                                      |
    |------------------------+--------------------------------------|
    |                        |最後のコミットを分割して一連のファイル|
    |git ime                 |毎の小さなコミット等に分割します      |
    |                        |(imediff パッケージが必要)            |
    |------------------------+--------------------------------------|
    |                        |ローカルレポジトリーを単一の梱包に再梱|
    |git repack -a -d; git   |包します(こうすると消去したブランチ等 |
    |prune                   |からのデーター復元の可能性を制限するか|
    |                        |もしれません)                         |
    +---------------------------------------------------------------+


    警告

    たとえ gitk(1) 等の一部ツールが受け付けるからといって、タグ文字列
    中にスペースを使ってはいけません。他の git コマンドで支障が起こる
    かもしれません。

    注意

    もしリモートレポジトリーにプッシュしたローカルブランチがリベース
    したりスクワッシュした場合には、このブランチをプッシュするのはリ
    スクがあるし、--force オプションが必要です。これは main ブランチ
    では通常許容されませんが、main ブランチにマージする前のトピックブ
    ランチでは許容されます。

    注意
   
    git サブコマンドを直接 "git-xyz" としてコマンドラインから起動する
    のは2006年初以来非推奨です。

    ヒント

    $PATH で指定されたパス中に実行可能ファイル git-foo が存在する場合
    、ハイフン無しの "git foo" をコマンドラインに入力するとこの
    git-foo が起動されます。これは git コマンドの機能です。

10.5.4. Git リファレンス

    次を参照下さい。

      * マンページ: git(1) (/usr/share/doc/git-doc/git.html)

      * Git ユーザーマニュアル (/usr/share/doc/git-doc/
        user-manual.html)

      * git へのチュートリアル導入 (/usr/share/doc/git-doc/
        gittutorial.html)
   
      * git へのチュートリアル導入: 第2部 (/usr/share/doc/git-doc/
        gittutorial-2.html)

      * 約20のコマンドを使って毎日 GIT (/usr/share/doc/git-doc/
        giteveryday.html)

      * Git マジック (/usr/share/doc/gitmagic/html/index.html)

10.5.5. 他のバージョンコントロールシステム

    バージョンコントロールシステム (VCS) はリビジョンコントロールシス
    テム (RCS) とかソフトウェアー設定管理 (SCM) という別名もあります
    。

    Debian システム上で利用可能な特記すべき他の非Git の VCS のまとめ
    を以下に記します。

    表10.14 他のバージョンコントロールシステムツールのリスト

    +---------------------------------------------------------------+
    |          |ポプコ |サイ |          |VCS |                      |
    |パッケージ|  ン   | ズ  |  ツール  |タイ|       コメント       |
    |          |       |     |          | プ |                      |
    |----------+-------+-----+----------+----+----------------------|
    |mercurial |V:3,   |2575 |Mercurial |分散|Python と一部 C で書か|
    |          |I:26   |     |          |型  |れた DVCS             |
    |----------+-------+-----+----------+----+----------------------|
    |darcs     |V:0.2, |38856|Darcs     |分散|パッチに関して賢い計算|
    |          |I:3.3  |     |          |型  |をする DVCS (遅い)    |
    |----------+-------+-----+----------+----+----------------------|
    |tla       |V:0.04,|1022 |GNU arch  |分散|主に Tom Lord による  |
    |          |I:0.72 |     |          |型  |DVCS (歴史的)         |
    |----------+-------+-----+----------+----+----------------------|
    |          |V:0.1, |     |          |分散|tla に影響され Python |
    |bzr       |I:4.3  |28   |GNU Bazaar|型  |で書かれた DVCS (歴史 |
    |          |       |     |          |    |的)                   |
    |----------+-------+-----+----------+----+----------------------|
    |          |V:10,  |     |          |リモ|"良く出来た CVS"、新し|
    |subversion|I:57   |4849 |Subversion|ート|いリモート VCS の標準 |
    |          |       |     |          |    |(歴史的)              |
    |----------+-------+-----+----------+----+----------------------|
    |cvs       |V:3,   |4835 |CVS       |リモ|リモート VCS の過去の |
    |          |I:25   |     |          |ート|標準 (歴史的)         |
    |----------+-------+-----+----------+----+----------------------|
    |          |V:0.12,|     |          |リモ|VCS (CVS, Subversion, |
    |tkcvs     |I:0.88 |34   |CVS, …    |ート|RCS) レポジトリーツリ |
    |          |       |     |          |    |ーの GUI 表示         |
    |----------+-------+-----+----------+----+----------------------|
    |rcs       |V:1.7, |578  |RCS       |ロー|"Unix SCCS の本来ある |
    |          |I:9.5  |     |          |カル|べき姿" (歴史的)      |
    |----------+-------+-----+----------+----+----------------------|
    |cssc      |V:0.01,|2044 |CSSC      |ロー|Unix SCCS のクローン  |
    |          |I:0.35 |     |          |カル|(歴史的)              |
    +---------------------------------------------------------------+



---------------------------------------------------------------------

    ^[4] 重要データーは上書き事故を防ぐために CD/DVD-R のような1回書
    込みメディアに貯蔵するのが好ましいです。(シェルコマンドラインから
    ストレージメディアにどうして書き込むかについては「バイナリーデー
    ター」を参照下さい。GNOME デスクトップの GUI 環境ではメニュー:
    "Places→CD/DVD Creator" で簡単に書込みできます。)

    ^[5] このようなデーターの一部は、システムに同一の入力文字列を入力
    しても再生成できません。

    ^[6] もし、"~/.vim/vimrc" に代えて "~/.vimrc" を使う場合は、それ
    に合わせて置換して下さい。

第11章データー変換

    Debian システム上のデーターフォーマット変換のツールとティップを記
    します。

    標準に準拠したツールは非常に良い状態ですが、プロプライエタリデー
    ターフォーマットのサポートは限定的です。

11.1. テキストデーター変換ツール

    テキストデーター変換のための以下のパッケージが著者の目に止まりま
    した。

    表11.1 テキストデーター変換ツールのリスト

    +---------------------------------------------------------------+
    |パッケー|ポプコ |サイ|キーワー |             説明              |
    |   ジ   |  ン   | ズ |   ド    |                               |
    |--------+-------+----+---------+-------------------------------|
    |        |V:940, |    |文字セッ |iconv(1) によるロケール間のテキ|
    |libc6   |I:999  |5355|ト       |スト符号化方式変換ソフト (基本 |
    |        |       |    |         |的)                            |
    |--------+-------+----+---------+-------------------------------|
    |        |V:2,   |    |文字セッ |ロケール間のテキスト符号化方式 |
    |recode  |I:13   |528 |ト + 行末|変換ソフト (機能豊富、より多い |
    |        |       |    |文字     |エイリアスと機能)              |
    |--------+-------+----+---------+-------------------------------|
    |konwert |V:2,   |137 |文字セッ |ロケール間のテキスト符号化方式 |
    |        |I:42   |    |ト       |変換ソフト (高級機能)          |
    |--------+-------+----+---------+-------------------------------|
    |nkf     |V:0.4, |359 |文字セッ |日本語のための文字セット翻訳ソ |
    |        |I:8.5  |    |ト       |フト                           |
    |--------+-------+----+---------+-------------------------------|
    |tcs     |V:0.01,|518 |文字セッ |文字セット翻訳ソフト           |
    |        |I:0.14 |    |ト       |                               |
    |--------+-------+----+---------+-------------------------------|
    |unaccent|V:0.03,|35  |文字セッ |アクセント付き文字をアクセント |
    |        |I:0.30 |    |ト       |の無しの等価文字に置換         |
    |--------+-------+----+---------+-------------------------------|
    |        |V:1,   |    |         |DOS と Unix 間のテキストフォー |
    |tofrodos|I:13   |50  |行末文字 |マット変換ソフト: fromdos(1) と|
    |        |       |    |         |todos(1)                       |
    |--------+-------+----+---------+-------------------------------|
    |        |V:0.04,|    |         |Macintosh と Unix 間のテキスト |
    |macutils|I:0.45 |319 |行末文字 |フォーマット変換ソフト: frommac|
    |        |       |    |         |(1) and tomac(1)               |
    +---------------------------------------------------------------+


11.1.1. テキストファイルを iconv を使って変換

    ヒント

    iconv(1) はlibc6 パッケージの一部として提供されていて、文字の符号
    化方式変換のために実質的に全てのUnix的システムで常に利用可能です
    。

    以下のようにするとテキストファイルを iconv(1) を使って変換できま
    す。

    $ iconv -f encoding1 -t encoding2 input.txt >output.txt

    符号化方式 (エンコーディング) 値をマッチングする際には、大文字小
    文字の区別は無く、"-" や "_" を無視します。"iconv -l" コマンドに
    より、サポートされている符号化方法が確認できます。

    表11.2 符号化方式値とその使い方リスト

    +---------------------------------------------------------------+
    |符号化方式 |                      使い方                       |
    |    値     |                                                   |
    |-----------+---------------------------------------------------|
    |ASCII      |情報交換用米国標準コード (ASCII); アクセント文字無 |
    |           |しの7ビットコード                                  |
    |-----------+---------------------------------------------------|
    |UTF-8      |全現代的 OS のための現行多言語標準                 |
    |-----------+---------------------------------------------------|
    |ISO-8859-1 |西欧州言語用の旧標準、ASCII + アクセント文字       |
    |-----------+---------------------------------------------------|
    |ISO-8859-2 |東欧州言語用の旧標準、ASCII + アクセント文字       |
    |-----------+---------------------------------------------------|
    |ISO-8859-15|西欧州言語用の旧標準、ユーロ文字付き ISO-8859-1    |
    |-----------+---------------------------------------------------|
    |CP850      |コードページ 850、西欧州言語用グラフィック文字付き |
    |           |Microsoft DOS 文字、ISO-8859-1 の変種              |
    |-----------+---------------------------------------------------|
    |CP932      |コードページ 932、日本語用 Microsoft Windows スタイ|
    |           |ル Shift-JIS の変種                                |
    |-----------+---------------------------------------------------|
    |CP936      |コードページ 936、簡体中国語用 Microsoft Windows ス|
    |           |タイル GB2312 か GBK か GB18030 の変種             |
    |-----------+---------------------------------------------------|
    |CP949      |コードページ 949、韓国語用 Microsoft Windows スタイ|
    |           |ル EUC-KR か統一ハングルコードの変種               |
    |-----------+---------------------------------------------------|
    |CP950      |コードページ 950、繁体中国語用 Microsoft Windows ス|
    |           |タイル Big5 の変種                                 |
    |-----------+---------------------------------------------------|
    |CP1251     |コードページ 1251、キリル文字用 Microsoft Windows  |
    |           |スタイル符号化方式                                 |
    |-----------+---------------------------------------------------|
    |CP1252     |コードページ 1252、西欧州言語用 Microsoft Windows  |
    |           |スタイル ISO-8859-15 の変種                        |
    |-----------+---------------------------------------------------|
    |KOI8-R     |キリル文字用の旧ロシアの UNIX 標準                 |
    |-----------+---------------------------------------------------|
    |ISO-2022-JP|7ビットコードのみを用いる日本語 email の標準符号化 |
    |           |方式                                               |
    |-----------+---------------------------------------------------|
    |eucJP      |Shift-JIS とはまったく違う、旧日本の UNIX 標準8ビッ|
    |           |トコード                                           |
    |-----------+---------------------------------------------------|
    |Shift-JIS  |日本語のための JIS X 0208 Appendix 1 標準 (CP932 を|
    |           |参照下さい)                                        |
    +---------------------------------------------------------------+


    注記

    一部の符号化方式 (エンコーディング) はデーター変換のみサポートさ
    れており、ロケール値としては使われません (「ロケール」を参照下さ
    い)。

    ASCII や ISO-8859 文字セットのような1バイトに収まる文字セットに付
    いては、文字の符号化方式 (エンコーディング) とは文字セットとほと
    んど同じ事を意味します。

    日本語のための JIS X 0213 や実質的に全ての言語のためのユニコード
    文字セット (UCS, Unicode, ISO-10646-1) のような多くの文字を含む文
    字セットの場合には、バイトデーター列に落とし込む多くの符号化手法
    があります。

      * 日本語用には、EUC と ISO/IEC 2022 (別名 JIS X 0202)
   
      * ユニコード用には、UTF-8 と UTF-16/UCS-2 と UTF-32/UCS-4

    これらに関しては、文字セットと文字符号化方式の間にはっきりとした
    区別があります。

    コードページは、一部のベンダー固有のコードページで文字符号化テー
    ブルと同義語として使用されています。

    注記

    ほとんどの符号化システムが7ビット文字に関して ASCII と同じコード
    を共有している事を承知下さい。もちろん例外はありますが。もし古い
    日本語の C プログラムや URL のデーターをカジュアルにシフト JIS と
    呼ばれている符号化フォーマットから UTF-8 フォーマットに変換する際
    には、期待される結果を得るために "shift-JIS" ではなく "CP932" を
    使います: 0x5C → "\" と 0x7E → "~"。こうしないと、これらが間違っ
    た文字に変換されます。

    ヒント

    recode(1) は、十分使えますし、iconv(1) と fromdos(1) と todos(1)
    と frommac(1) と tomac(1) を組み合わせ以上の機能を提供します。詳
    しくは "info recode" を参照下さい。

11.1.2. ファイルが UTF-8 であると iconv を使い確認

    以下のようにするとテキストファイルが UTF-8 でエンコードされている
    と iconv(1) を使って確認できます。

    $ iconv -f utf8 -t utf8 input.txt >/dev/null || echo "non-UTF-8 found"

    ヒント
   
    最初の非 UTF-8 文字を見つけるには上記例中で "--verbose" オプショ
    ンを使います。

11.1.3. iconv を使ってファイル名変換

    次に、単一ディレクトリー中の旧 OS 下で作成されたファイル名から現
    代的な UTF-8 のファイル名に符号化方式を変換するスクリプト例を示し
    ます。

    #!/bin/sh
    ENCDN=iso-8859-1
    for x in *;
     do
     mv "$x" "$(echo "$x" | iconv -f $ENCDN -t utf-8)"
    done

    "$ENCDN" 変数値には、旧OS下で用いられたファイル名に用いられた元と
    なる表11.2「符号化方式値とその使い方リスト」中にあるエンコーディ
    ングを指定します。

    もっと複雑な場合にはそのようなファイル名を含有するファイルシステ
    ム (ディスクドライブ上のパーティション等) を mount(8) オプション
    に適正な符号化方式 (エンコーディング) (「ファイル名の符号化方式」
    を参照下さい) を指定してマウントし、その全内容を他の UTF-8 でマウ
    ントされたファイルシステムに "cp -a" コマンドを使ってコピーします
    。

11.1.4. 行末変換

    テキストファイルのフォーマット、特に行末 (EOL) コード、はプラット
    フォーム依存です。

    表11.3 異なるプラットフォーム上での行末スタイルのリスト

    +--------------------------------------------------------+
    | プラットフォーム |行末コード|コントロール|10進数|16進数|
    |------------------+----------+------------+------+------|
    |Debian (unix)     |LF        |^J          |10    |0A    |
    |------------------+----------+------------+------+------|
    |MSDOS と Windows  |CR-LF     |^M^J        |13 10 |0D 0A |
    |------------------+----------+------------+------+------|
    |Apple の Macintosh|CR        |^M          |13    |0D    |
    +--------------------------------------------------------+


    行末 (EOL) フォーマット変換プログラムに関して、fromdos(1) と
    todos(1) と frommac(1) と tomac(1) は非常に便利です。recode(1) も
    また役に立ちます。

    注記

    python-moinmoin パッケージ用の wiki のデーター等の Debian システ
    ム上の一部データーは、MSDOS スタイルの CR-LF を行末コードとして用
    います。あくまで上記は一般則と言うだけです。

    注記
   
    ほとんどのエディター (例えば vim や emacs や gedit 等) は MSDOS
    スタイルの行末を透過的に取り扱えます。

    ヒント

    MSDOS と Unix スタイルが混在する行末スタイルを MSDOS スタイルに統
    一するには、todos(1) を使う代わりに "sed -e '/\r$/!s/$/\r/'" を使
    う方がより好ましいです。(例えば、2つの MSDOS スタイルファイルを
    diff3(1) を使ってマージした後。) todos は全ての行に CR を追加する
    というのがこの理由です。

11.1.5. タブ変換

    タブコードを変換するための良く使われる専用プログラムがいくつかあ
    ります。

    表11.4 bsdmainutils と coreutils パッケージ中のタブ変換コマンドの
    リスト

    +---------------------------------------------------+
    |            機能            |bsdmainutils|coreutils|
    |----------------------------+------------+---------|
    |タブからスペースに展開する  |"col -x"    |expand   |
    |----------------------------+------------+---------|
    |スペースからタブに逆展開する|"col -h"    |unexpand |
    +---------------------------------------------------+


    indent パッケージにある indent(1) コマンドは C プログラム中のホワ
    イトスペースを完全にリフォーマットします。

    vim や emacs 等のエディタープログラムもまたタブ変換に使えます。例
    えば vim を使うと、":set expandtab" として ":%retab" するコマンド
    シーケンスでタブ変換が出来ます。これを元に戻すのは、":set
    noexpandtab" として ":%retab!" とするコマンドシーケンスです。

11.1.6. 自動変換付きエディター

    vim プログラムなどのインテリジェントな現代的なエディターは大変良
    く出来ていていかなる符号化方式やいかなるファイルフォーマットでも
    機能します。これらのエディターを UTF-8 ロケール下で UTF-8 を扱え
    るコンソール中で使用することで最良の互換性が得られます。

    latin1 (iso-8859-1) 符号化方式で保存された古い西欧州の Unix テキ
    ストファイル "u-file.txt" は、単純に vim を使って以下のようにして
    編集出来ます。

    $ vim u-file.txt

    vim 中の符号化方式自動判定機構が、最初は UTF-8 符号化方式を仮定し
    、それが上手く行かなかった際に latin1 を仮定するから可能です。

    latin2 (iso-8859-2) 符号化方式で保存された古いポーランドの Unix
    テキストファイル "pu-file.txt" は、vim を使って以下のようにして編
    集出来ます。

    $ vim '+e ++enc=latin2 pu-file.txt'

    eucJP 符号化方式で保存された古い日本の Unix テキストファイル
    "ju-file.txt" は、vim を使って以下のようにして編集出来ます。

    $ vim '+e ++enc=eucJP ju-file.txt'

    shift-JIS 符号化方式 (より正確には: CP932) で保存された古い日本の
    MS-Windows テキストファイル "jw-file.txt" は、vim を使って以下の
    ようにして編集出来ます。

    $ vim '+e ++enc=CP932 ++ff=dos jw-file.txt'

    "++enc" や "++ff" オプションを使ってファイルが開かれた時は、Vim
    コマンドライン中の ":w" がオリジナルのファイルフォーマットでオリ
    ジナルのファイルを上書きします。例えば ":w ++enc=utf8 new.txt" 等
    と Vim コマンドライン中で保存フォーマットや保存ファイル名を指定す
    ることも出来ます。

    vim オンラインヘルプ中の mbyte.txt "multi-byte text support" と、
    "++enc" に使われるロケール値に関する表11.2「符号化方式値とその使
    い方リスト」を参照下さい。

    emacs ファミリーのプログラムもまた同様の機能の実行ができます。

11.1.7. プレーンテキスト抽出

    以下はウェッブページを読みテキストファイルに落とします。ウェッブ
    から設定を取ってくる時や grep(1) 等の基本的な Unix テキストツール
    をウェッブページに適用するときに非常に有用です。

    $ w3m -dump https://www.remote-site.com/help-info.html >textfile

    同様に、次を用いることで他のフォーマットからプレーンテキストデー
    ターを抽出出来ます。

    表11.5 プレーンテキストデーター抽出ツールのリスト

    +---------------------------------------------------------------+
    |パッケー |ポプコ |サイ|  キーワード   |          機能          |
    |   ジ    |  ン   | ズ |               |                        |
    |---------+-------+----+---------------+------------------------|
    |         |V:11,  |    |               |"w3m -dump" コマンドを使|
    |w3m      |I:137  |2853|html→text      |う HTML からテキストへの|
    |         |       |    |               |変換ソフト              |
    |---------+-------+----+---------------+------------------------|
    |         |V:3,   |    |               |高度な HTML からテキスト|
    |html2text|I:68   |298 |html→text      |への変換ソフト (ISO     |
    |         |       |    |               |8859-1)                 |
    |---------+-------+----+---------------+------------------------|
    |         |V:28,  |    |               |"lynx -dump" コマンドを |
    |lynx     |I:449  |2031|html→text      |使う HTML からテキストへ|
    |         |       |    |               |の変換ソフト            |
    |---------+-------+----+---------------+------------------------|
    |         |V:3,   |    |               |"elinks -dump" コマンド |
    |elinks   |I:16   |1789|html→text      |を使う HTML からテキスト|
    |         |       |    |               |への変換ソフト          |
    |---------+-------+----+---------------+------------------------|
    |         |V:2,   |    |               |"links -dump" コマンドを|
    |links    |I:21   |2321|html→text      |使う HTML からテキストへ|
    |         |       |    |               |の変換ソフト            |
    |---------+-------+----+---------------+------------------------|
    |         |V:1,   |    |               |"links2 -dump" コマンド |
    |links2   |I:10   |5466|html→text      |を使う HTML からテキスト|
    |         |       |    |               |への変換ソフト          |
    |---------+-------+----+---------------+------------------------|
    |catdoc   |V:15,  |682 |MSWord→text,TeX|MSWord ファイルをプレー |
    |         |I:171  |    |               |ンテキストか TeX に変換 |
    |---------+-------+----+---------------+------------------------|
    |antiword |V:0.9, |587 |MSWord→text,ps |MSWord ファイルをプレー |
    |         |I:6.5  |    |               |ンテキストか ps に変換  |
    |---------+-------+----+---------------+------------------------|
    |unhtml   |V:0.04,|40  |html→text      |HTML ファイルからマーク |
    |         |I:0.50 |    |               |アップタグを削除        |
    |---------+-------+----+---------------+------------------------|
    |odt2txt  |V:1,   |60  |odt→text       |OpenDocument テキストか |
    |         |I:21   |    |               |らテキストへの変換ソフト|
    +---------------------------------------------------------------+


11.1.8. プレーンテキストデーターをハイライトとフォーマット

    以下のようにしてプレーンテキストデーターをハイライトとフォーマッ
    ト出来ます。

    表11.6 プレーンテキストデーターをハイライトするツールのリスト

    +---------------------------------------------------------------+
    |   パッケージ   |ポプコ |サイズ|キーワード|        説明        |
    |                |  ン   |      |          |                    |
    |----------------+-------+------+----------+--------------------|
    |                |       |      |          |":source $VIMRUNTIME|
    |                |V:17,  |      |          |/syntax/html.vim" を|
    |vim-runtime     |I:365  |38706 |ハイライト|使ってソースコードを|
    |                |       |      |          |HTML に変換するため |
    |                |       |      |          |の Vim MACRO        |
    |----------------+-------+------+----------+--------------------|
    |                |V:0.03,|      |          |C プログラムから    |
    |cxref           |I:0.23 |1191  |c→html    |latex か HTML への変|
    |                |       |      |          |換ソフト (C 言語)   |
    |----------------+-------+------+----------+--------------------|
    |                |V:0.02,|      |          |多くのソースコードの|
    |src2tex         |I:0.18 |1799  |ハイライト|TeX への変換ソフト  |
    |                |       |      |          |(C 言語)            |
    |----------------+-------+------+----------+--------------------|
    |                |       |      |          |多くのソースコードを|
    |                |       |      |          |HTML と XHTML と    |
    |                |V:0.5, |      |          |LaTeX と Texinfo と |
    |source-highlight|I:3.2  |2131  |ハイライト|ANSI カラーエスケー |
    |                |       |      |          |プシーケンスと      |
    |                |       |      |          |DocBook にハイライト|
    |                |       |      |          |付きで変換 (C++)    |
    |----------------+-------+------+----------+--------------------|
    |                |       |      |          |多くのソースコードを|
    |                |V:0.4, |      |          |HTML と XHTML と    |
    |highlight       |I:3.1  |1411  |ハイライト|LaTeX と Tex と     |
    |                |       |      |          |AXSL-FO にハイライト|
    |                |       |      |          |付きで変換 (C++)    |
    |----------------+-------+------+----------+--------------------|
    |grc             |V:1.0, |208   |text→color|汎用着色化ソフト    |
    |                |I:6.0  |      |          |(Python)            |
    |----------------+-------+------+----------+--------------------|
    |pandoc          |V:10,  |208068|text→any  |汎用マークアップコン|
    |                |I:47   |      |          |バーター (Haskel)   |
    |----------------+-------+------+----------+--------------------|
    |                |       |      |          |ReStructured テキス |
    |python3-docutils|V:12,  |2009  |text→any  |ト文書の XML へのフ |
    |                |I:52   |      |          |ォーマット化ソフト  |
    |                |       |      |          |(Python)            |
    |----------------+-------+------+----------+--------------------|
    |                |       |      |          |Markdown テキスト文 |
    |markdown        |V:0.5, |56    |text→html |書の (X)HTML へのフ |
    |                |I:5.9  |      |          |ォーマット化ソフト  |
    |                |       |      |          |(Perl)              |
    |----------------+-------+------+----------+--------------------|
    |                |       |      |          |AsciiDoc テキスト文 |
    |asciidoctor     |V:0.4, |101   |text→any  |書の XML/HTML へのフ|
    |                |I:4.8  |      |          |ォーマット化ソフト  |
    |                |       |      |          |(Ruby)              |
    |----------------+-------+------+----------+--------------------|
    |                |V:6,   |      |          |ReStructured テキス |
    |python3-sphinx  |I:27   |3235  |text→any  |トを使う文書出版シス|
    |                |       |      |          |テム (Python)       |
    |----------------+-------+------+----------+--------------------|
    |                |V:0.8, |      |          |Markdown テキストを |
    |hugo            |I:5.1  |66608 |text→html |使うサイト出版システ|
    |                |       |      |          |ム (Go)             |
    +---------------------------------------------------------------+


11.2. XML データー

    Extensible Markup Language (XML) は構造化情報を含む文書のためのマ
    ークアップ言語です。

    XML.COM にある入門情報を参照下さい。

      * "What is XML?"

      * "What Is XSLT?"
   
      * "What Is XSL-FO?"

      * "What Is XLink?"

11.2.1. XML に関する基本ヒント

    XML テキストはちょっと HTML のようにも見えます。これを使うと一つ
    の文書から複数のフォーマットのアウトプット管理できるようになりま
    す。簡単な XML システムの一つはここで使っている docbook-xsl パッ
    ケージです。

    各 XML ファイルは以下のような標準的な XML 宣言でスタートします。

    <?xml version="1.0" encoding="UTF-8"?>

    XML 要素の基本的シンタックスは以下のようにマークアップされます。

    <name attribute="value">content</name>

    空の XML 要素は以下の短縮形を使ってマークアップされます。

    <name attribute="value" />

    上記例中の "attribute="value"" はオプションです。

    XML 中のコメントセクションは以下のようにマークアップされます。

    <!-- comment -->

    マークアップを追加する以外に、XML は以下の文字に関して事前定義さ
    れたエンティティを使い内容を少し改変する必要があります。

    表11.7 XML で事前定義されているエントリーのリスト

    +---------------------------------------------+
    |事前定義されたエンティティ|   変換先の文字   |
    |--------------------------+------------------|
    |&quot;                    |" : 引用符        |
    |--------------------------+------------------|
    |&apos;                    |' : アポストロフィ|
    |--------------------------+------------------|
    |&lt;                      |< : 以下          |
    |--------------------------+------------------|
    |&gt;                      |> : 以上          |
    |--------------------------+------------------|
    |&amp;                     |& : アンパサンド  |
    +---------------------------------------------+


    注意
   
    "<" と "&" はアトリビュートやエレメントには使えません。

    注記

    例えば "&some-tag;" 等の SGML スタイルのユーザー定義エンティティ
    が使われた場合、他の定義は無効で最初の定義が有効です。エンティテ
    ィ定義は "<!ENTITY some-tag "entity value">" と表現されます。

    注記

    XML のマークアップがタグ名の何らかの組み合わせで (あるデーターを
    内容としてであれアトリビュート値としてであれ) 整合性を持ってされ
    ている限り、他の XML の変換は拡張可能スタイルシート言語変換
    (XSLT) を使うととっても簡単な作業です。

11.2.2. XML 処理

    拡張可能スタイルシート言語 (XSL) のような XML ファイルを処理に利
    用可能なツールは沢山あります。

    基本的に、良くできた XML ファイルを一度作ると、いかなるフォーマッ
    トへも拡張可能なスタイルシート言語変換 (XSLT) を使って変換できま
    す。

    フォーマットオブジェクト用拡張可能スタイルシート言語 (XSL-FO) が
    フォーマットのための答えとなるはずです。fop パッケージは Java プ
    ログラム言語に依存するため Debian の main アーカイブでは新規です
    。このため、 LaTeX コードが XML から XSLT を使って通常作成され、
    DVI や PostScript や PDF 等のプリンタブルなファイルが LaTeX シス
    テムを使って作成されます。

    表11.8 XML ツールのリスト

    +---------------------------------------------------------------+
    |パッケージ |ポプコ |サイ |キーワ|             説明             |
    |           |  ン   | ズ  | ード |                              |
    |-----------+-------+-----+------+------------------------------|
    |docbook-xml|V:15,  |2126 |xml   |DocBook 用 XML ドキュメントタ |
    |           |I:408  |     |      |イプ定義 (DTD)                |
    |-----------+-------+-----+------+------------------------------|
    |           |V:14,  |     |xml/  |DocBook XML を XSLT を使って各|
    |docbook-xsl|I:145  |14823|xslt  |種アウトプットへ処理する XSL  |
    |           |       |     |      |スタイルシート                |
    |-----------+-------+-----+------+------------------------------|
    |           |V:15,  |     |      |XSLT コマンドラインプロセスソ |
    |xsltproc   |I:73   |83   |xslt  |フト (XML→ XML, HTML, plain   |
    |           |       |     |      |text, 他)                     |
    |-----------+-------+-----+------+------------------------------|
    |xmlto      |V:0.5, |124  |xml/  |XSLT を用いて XML から全てへの|
    |           |I:8.6  |     |xslt  |変換ソフト                    |
    |-----------+-------+-----+------+------------------------------|
    |fop        |V:0.7, |281  |xml/  |Docbook XML ファイルを PDF に |
    |           |I:8.1  |     |xsl-fo|変換                          |
    |-----------+-------+-----+------+------------------------------|
    |           |V:0.9, |     |xml/  |XSLT を使って Docbook ファイル|
    |dblatex    |I:5.8  |4636 |xslt  |を DVI, PostScript, PDF 文書へ|
    |           |       |     |      |変換                          |
    |-----------+-------+-----+------+------------------------------|
    |dbtoepub   |V:0.05,|37   |xml/  |DocBook XML から .epub へのコ |
    |           |I:0.50 |     |xslt  |ンバーター                    |
    +---------------------------------------------------------------+


    XML は標準一般化マークアップ言語 (SGML) のサブセットなので、ドキ
    ュメントスタイル構文規程言語 (DSSSL) 等の SGML 用として利用可能な
    広範なツールで処理できます。

    表11.9 DSSLツールのリスト

    +---------------------------------------------------------------+
    |             |ポプコ|サイ|キー |                               |
    | パッケージ  |  ン  | ズ |ワー |             説明              |
    |             |      |    | ド  |                               |
    |-------------+------+----+-----+-------------------------------|
    |openjade     |V:1,  |1066|dsssl|ISO/IEC 10179: 1996 標準 DSSSL |
    |             |I:22  |    |     |プロセッサ (最新版)            |
    |-------------+------+----+-----+-------------------------------|
    |             |V:0.5,|    |xml/ |DocBook XML を各種出力フォーマ |
    |docbook-dsssl|I:7.9 |2594|dsssl|ットに DSSSL を使って処理するた|
    |             |      |    |     |めの DSSSL スタイルシート      |
    |-------------+------+----+-----+-------------------------------|
    |             |      |    |     |docbook2* コマンドで DSSSL を使|
    |             |V:0.4,|    |xml/ |って DocBook ファイルを他のフォ|
    |docbook-utils|I:5.6 |287 |dsssl|ーマットに (HTML, RTF, PS, man,|
    |             |      |    |     |PDF) 変換するなどのユーティリテ|
    |             |      |    |     |ィー                           |
    +---------------------------------------------------------------+


    ヒント
   
    GNOME の yelp は DocBook XML ファイルを X 上に体裁良く表示するの
    で時々便利です。

11.2.3. XML データー抽出

    他のフォーマットから以下を使うと HTML とか XML のデーターを抽出出
    来ます。

    表11.10 テキストデーター変換ツールのリスト

    +---------------------------------------------------------------+
    |パッケー |ポプコ |サイ|  キーワード   |          説明          |
    |   ジ    |  ン   | ズ |               |                        |
    |---------+-------+----+---------------+------------------------|
    |man2html |V:0.1, |142 |manpage→html   |manpage から HTML への変|
    |         |I:1.3  |    |               |換ソフト (CGI サポート) |
    |---------+-------+----+---------------+------------------------|
    |doclifter|V:0.01,|487 |troff→xml      |troff から DocBook XML  |
    |         |I:0.05 |    |               |への変換ソフト          |
    |---------+-------+----+---------------+------------------------|
    |texi2html|V:0.2, |1847|texi→html      |Texinfo から HTML への変|
    |         |I:3.0  |    |               |換ソフト                |
    |---------+-------+----+---------------+------------------------|
    |         |V:0.9, |    |               |GNU info から HTML への |
    |info2www |I:1.5  |76  |info→html      |変換ソフト (CGI サポー  |
    |         |       |    |               |ト)                     |
    |---------+-------+----+---------------+------------------------|
    |         |V:0.2, |    |               |Microsoft Word から HTML|
    |wv       |I:2.5  |733 |MSWord→any     |や LaTeX 等への文書変換 |
    |         |       |    |               |ソフト                  |
    |---------+-------+----+---------------+------------------------|
    |unrtf    |V:0.3, |159 |rtf→html       |RTF から HTML 等への文書|
    |         |I:2.9  |    |               |変換ソフト              |
    |---------+-------+----+---------------+------------------------|
    |         |       |    |               |WordPerfect 5.0 と 5.1  |
    |wp2x     |V:0.01,|200 |WordPerfect→any|ファイルから TeX と     |
    |         |I:0.09 |    |               |LaTeX と troff と GML と|
    |         |       |    |               |HTML への変換ソフト     |
    +---------------------------------------------------------------+


11.2.4. XML データーの静的解析

    非 XML の HTML ファイルの場合は、これらを整合性ある XML である
    XHTML に変換できます。XHTML は XML ツールで処理できます。

    XML ファイルのシンタックスやファイル中で見かける URL の適正性が確
    認されるかもしれません。

    表11.11 XML整形印刷ツールのリスト

    +---------------------------------------------------------------+
    |             |ポプコ |サ |              |                      |
    | パッケージ  |  ン   |イ |     機能     |         説明         |
    |             |       |ズ |              |                      |
    |-------------+-------+---+--------------+----------------------|
    |             |       |   |              |xmllint(1) (シンタクス|
    |             |V:62,  |   |              |チェック、リフォーマッ|
    |libxml2-utils|I:209  |211|xml↔html↔xhtml|ト、静的解析、他) を含|
    |             |       |   |              |むコマンドライン XML  |
    |             |       |   |              |ツール                |
    |-------------+-------+---+--------------+----------------------|
    |             |V:0.9, |   |              |HTML シンタックスチェ |
    |tidy         |I:7.3  |79 |xml↔html↔xhtml|ックソフトとリフォーマ|
    |             |       |   |              |ットソフト            |
    |-------------+-------+---+--------------+----------------------|
    |             |V:0.06,|   |              |HTML 用のシンタックス |
    |weblint-perl |I:0.91 |32 |静的解析(lint)|最小限の文体チェックソ|
    |             |       |   |              |フト                  |
    |-------------+-------+---+--------------+----------------------|
    |             |V:0.06,|   |              |高速リンクチェックソフ|
    |linklint     |I:0.47 |343|リンクチェック|トとウェッブサイトメン|
    |             |       |   |              |テツール              |
    +---------------------------------------------------------------+


    一度適正な XML が生成されれば、XSLT 技術を使ってマークアップコン
    テキスト等に基づいてデーターを抽出出来ます。

11.3. タイプセッティング

    Unix のtroff プログラムは最初 AT&T で開発されました。それはマンペ
    ージを作成するのに通常使われます。

    Donald Knuth 氏によって作成された TeX は非常に強力な組版ツールで
    デファクト標準です。最初 Leslie Lamport 氏によって書かれた LaTeX
    は TeX の力への高レベルアクセスを可能にします。

    表11.12 タイプ設定ツールのリスト

    +--------------------------------------------------------------+
    |パッケ |ポプコ |サイ |キーワ |              説明              |
    | ージ  |  ン   | ズ  | ード  |                                |
    |-------+-------+-----+-------+--------------------------------|
    |texlive|V:1,   |55   |(La)TeX|組版、校正、印刷のための TeX シ |
    |       |I:28   |     |       |ステム                          |
    |-------+-------+-----+-------+--------------------------------|
    |groff  |V:2,   |16514|troff  |GNU troff テキストフォーマティン|
    |       |I:24   |     |       |グシステム                      |
    +--------------------------------------------------------------+


11.3.1. roff タイプセッティング

    伝統的には、roff が主な Unix テキスト処理システムです。roff(7) と
    groff(7) と groff(1) と grotty(1) と troff(1) と groff_mdoc(7) と
    groff_man(7) と groff_ms(7) と groff_me(7) と groff_mm(7) と
    "info groff" を参照下さい。

    groff パッケージをインストールすると "/usr/share/doc/groff/" 中に
    "-me"マクロに関する良い入門書や参考書が読めます。

    ヒント

    "groff -Tascii -me -" はANSI エスケープコードを含むプレーンテキス
    トを生成します。もしマンページのような多くの "^H" や "_" を含む出
    力が欲しい場合には、この代わりに "GROFF_NO_SGR=1 groff -Tascii
    -me -" を使います。

    ヒント
   
    groff が生成した "^H" や "_" をテキストから削除するには、それを
    "col -b -x" でフィルターします。

11.3.2. TeX/LaTeX

    TeX Live ソフトウェアーディストリビューションは完全な TeX システ
    ムを提供します。texlive メタパッケージは、ほとんどの一般的タスク
    に十分な TeX Live パッケージのまともな選択を提供します。

    TeX と LaTeX に関する多くの参考書が利用可能です。

      * The teTeX HOWTO: The Linux-teTeX Local Guide

      * tex(1)

      * latex(1)

      * texdoc(1)

      * texdoctk(1)

      * "The TeXbook"、Donald E. Knuth 著 (Addison-Wesley)

      * "LaTeX - A Document Preparation System"、Leslie Lamport 著
        (Addison-Wesley)

      * "The LaTeX Companion"、Goossens と Mittelbach と Samarin 著
        (Addison-Wesley)

    これはもっとも強力な組版環境です。多くの SGML 処理ソフトはこれを
    バックエンドのテキスト処理ソフトとしています。多くの人が Emacs や
    Vim をソースのエディターとして使う一方、lyx パッケージが提供する
    Lyx と texmacs パッケージが提供する GNU TeXmacs は洒落た LaTeX の
    WYSIWYG 編集環境を提供します。

    多くのオンラインリソースが利用可能です。

      * TEX Live ガイド - TEX Live 2007 ("/usr/share/doc/
        texlive-doc-base/english/texlive-en/live.html")
        (texlive-doc-base パッケージ)
   
      * A Simple Guide to Latex/Lyx

      * Word Processing Using LaTeX

    文書が大きくなると、TeX はエラーを発生する事があります。この問題
    の解決には (正しくは "/etc/texmf/texmf.d/95NonPath" を編集し
    update-texmf(8) を実行することで) "/etc/texmf/texmf.cnf" 中のプー
    ルの数を増やし修正しなければいけません。

    注記

    "The TeXbook" の TeX ソースは www.ctan.org tex-archive site for
    texbook.tex にあります。このファイルには必要なマクロのほとんど全
    てが含まれます。この文書は7から10行をコメントして "\input manmac
    \proofmodefalse" を追加すると tex(1) で処理できると聞いた事があり
    ます。オンラインバージョンを使うのではなくこの本 (さらに Donald
    E. Knuth 氏による全ての本) を購入される事を強く勧めます。しかし、
    そのソースは TeX の入力の非常に良い例です！

11.3.3. マニュアルページを綺麗に印刷

    以下のコマンドでマンページを PostScript で上手く印刷できます。

    $ man -Tps some_manpage | lpr

11.3.4. マニュアルページの作成

    プレーンな troff フォーマットでマンページ (マニュアルページ) を書
    く事は可能ですが、それを作成するヘルパーパッケージがあります。

    表11.13 マンページ作成を補助するパッケージのリスト

    +---------------------------------------------------------------+
    |              |ポプコ |サ |            |                       |
    |  パッケージ  |  ン   |イ | キーワード |         説明          |
    |              |       |ズ |            |                       |
    |--------------+-------+---+------------+-----------------------|
    |              |V:0.6, |   |            |DocBook SGML から roff |
    |docbook-to-man|I:5.7  |189|SGML→manpage|man マクロへの変換ソフ |
    |              |       |   |            |ト                     |
    |--------------+-------+---+------------+-----------------------|
    |help2man      |V:0.6, |542|text→manpage|--help からの自動マンペ|
    |              |I:6.3  |   |            |ージ生成ソフト         |
    |--------------+-------+---+------------+-----------------------|
    |info2man      |V:0.01,|134|info→manpage|GNU info から POD かマ |
    |              |I:0.19 |   |            |ンページへの変換ソフト |
    |--------------+-------+---+------------+-----------------------|
    |txt2man       |V:0.06,|112|text→manpage|ベタの ASCII テキストか|
    |              |I:0.64 |   |            |らマンページ形式へ変換 |
    +---------------------------------------------------------------+


11.4. 印刷可能データー

    Debian システム上では印刷可能なデーターは PostScript フォーマット
    で表現されます。共通 Unix 印刷システム (CUPS) は非 PostScript プ
    リンタ用のラスタ化のバックエンドプログラムとして Ghostscript を使
    用します。

    最近のDebian システム上では印刷可能なデータは PDF フォーマットで
    でも表現されます。

    Evince や Okular (「GUI アプリケーション」参照)のような GUI ビュ
    ーワーツールや; Chromium のような現代的なブラウザーを使うと、PDF
    ファイルの内容表示をしたりその入力欄を埋めたりできます。

    LibreOffice や Scribus や Inkscape (「画像データーツール」参照)の
    ようなグラフィックツールを使うと、PDF ファイルの内容を編集できま
    す。

    ヒント

    PDF ファイルは、GIMP を用いると、解像度 300 dpi 以上を使い PNG フ
    ォーマットに変換し読み込めます。これを、LibreOffice のバックグラ
    ウンド画像に用いれば最小限の努力で望ましい変更済み印刷が作れます
    。

11.4.1. Ghostscript

    印刷データー処理の核心はラスタ画像を生成する Ghostscript という
    PostScript (PS) インタープリタです。

    表11.14 Ghostscript PostScript インタープリタのリスト

    +---------------------------------------------------------------+
    |    パッケージ     |ポプコ|サイ |             説明             |
    |                   |  ン  | ズ  |                              |
    |-------------------+------+-----+------------------------------|
    |ghostscript        |V:142,|177  |GPL 版 Ghostscript PostScript/|
    |                   |I:563 |     |PDF インタープリタ            |
    |-------------------+------+-----+------------------------------|
    |                   |V:0,  |     |GPL 版 Ghostscript PostScript/|
    |ghostscript-x      |I:15  |88   |PDF インタープリタ - X ディス |
    |                   |      |     |プレーサポート                |
    |-------------------+------+-----+------------------------------|
    |libpoppler156      |V:9,  |4989 |xpdf PDF ビューワー派生PDF レ |
    |                   |I:16  |     |ンダリングライブラリー        |
    |-------------------+------+-----+------------------------------|
    |libpoppler-glib8t64|V:68, |576  |PDF レンダリングライブラリー  |
    |                   |I:297 |     |(GLib 準拠共有ライブラリー)   |
    |-------------------+------+-----+------------------------------|
    |poppler-data       |V:150,|13086|PDF レンダリングライブラリー用|
    |                   |I:585 |     |CMaps (CJK サポート: Adobe-*) |
    +---------------------------------------------------------------+


    ヒント
   
    "gs -h" とすると Ghostscript の設定が表示されます。

11.4.2. 2つの PS や PDF ファイルをマージ

    2つの PostScript (PS) や Portable Document Format (PDF) ファイル
    は Ghostscript のgs(1) をつかってマージできます。

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

    注記

    PDF は、クロスプラットフォームの印刷可能フォーマットとして広範に
    使われていて、本質的にいくつかの追加機能と拡張がされている、圧縮
    PS フォーマットです。

    ヒント

    コマンドラインの場合、psutils パッケージ中の psmerge(1) 等のコマ
    ンドは PostScript 文書を操作するのに便利です。pdftk パッケージの
    pdftk(1) も PDF 文書を操作するのに便利です。

11.4.3. 印刷可能データーユーティリティー

    印刷可能なデーターに用いる以下のパッケージが著者の目に止まりまし
    た。

    表11.15 プリントできるデーターのユーティリティーのリスト

    +---------------------------------------------------------------+
    | パッケージ  |ポプコ |サイ| キーワード  |         説明         |
    |             |  ン   | ズ |             |                      |
    |-------------+-------+----+-------------+----------------------|
    |             |       |    |             |PDF ユーティリティー: |
    |poppler-utils|V:106, |756 |pdf→ps,text,…|pdftops, pdfinfo,     |
    |             |I:474  |    |             |pdfimages, pdftotext, |
    |             |       |    |             |pdffonts              |
    |-------------+-------+----+-------------+----------------------|
    |psutils      |V:4,   |34  |ps→ps        |PostScript 文書変換ツ |
    |             |I:51   |    |             |ール                  |
    |-------------+-------+----+-------------+----------------------|
    |poster       |V:0.1, |57  |ps→ps        |PostScript ページから |
    |             |I:1.7  |    |             |大きなポスターを作る  |
    |-------------+-------+----+-------------+----------------------|
    |             |       |    |             |ASCII テキストから    |
    |enscript     |V:1,   |2138|text→ps,     |PostScript か HTML か |
    |             |I:11   |    |html, rtf    |RTF か Pretty-Print へ|
    |             |       |    |             |の変換                |
    |-------------+-------+----+-------------+----------------------|
    |             |V:0.7, |    |             |全てを PostScript に変|
    |a2ps         |I:7.1  |4109|text→ps      |換するソフトと綺麗印刷|
    |             |       |    |             |ソフト                |
    |-------------+-------+----+-------------+----------------------|
    |pdftk        |V:1,   |28  |pdf→pdf      |PDF 文書変換ツール:   |
    |             |I:22   |    |             |pdftk                 |
    |-------------+-------+----+-------------+----------------------|
    |html2ps      |V:0.1, |256 |html→ps      |HTML から PostScript  |
    |             |I:1.7  |    |             |への変換ソフト        |
    |-------------+-------+----+-------------+----------------------|
    |gnuhtml2latex|V:0.05,|26  |html→latex   |html から latex への変|
    |             |I:0.58 |    |             |換ソフト              |
    |-------------+-------+----+-------------+----------------------|
    |             |V:0.1, |    |             |LaTeX から MS Word で |
    |latex2rtf    |I:2.1  |495 |latex→rtf    |読める RTF へと文書変 |
    |             |       |    |             |換                    |
    |-------------+-------+----+-------------+----------------------|
    |             |       |    |             |PostScript から EPS   |
    |ps2eps       |V:2,   |95  |ps→eps       |(カプセル化済み       |
    |             |I:33   |    |             |PostScript) への変換ソ|
    |             |       |    |             |フト                  |
    |-------------+-------+----+-------------+----------------------|
    |             |       |    |             |日本語符号化サポート付|
    |e2ps         |V:0.01,|104 |text→ps      |きの Text から        |
    |             |I:0.11 |    |             |PostScript への変換ソ |
    |             |       |    |             |フト                  |
    |-------------+-------+----+-------------+----------------------|
    |impose+      |V:0.1, |118 |ps→ps        |PostScript ユーティリ |
    |             |I:1.5  |    |             |ティー                |
    |-------------+-------+----+-------------+----------------------|
    |             |       |    |             |多くのソースコード (C,|
    |             |V:0.01,|    |             |C++, Java, Pascal,    |
    |trueprint    |I:0.09 |148 |text→ps      |Perl, Pike, Sh,       |
    |             |       |    |             |Verilog) の PostScript|
    |             |       |    |             |への綺麗印刷 (C 言語) |
    |-------------+-------+----+-------------+----------------------|
    |             |       |    |             |PDF からスケール可のベ|
    |pdf2svg      |V:0.2, |33  |pdf→svg      |クトルグラフィクス    |
    |             |I:3.0  |    |             |(SVG) フォーマットへの|
    |             |       |    |             |変換ソフト            |
    |-------------+-------+----+-------------+----------------------|
    |             |V:0.01,|    |             |PDF から IPE の XML フ|
    |pdftoipe     |I:0.46 |70  |pdf→ipe      |ォーマットへの変換ソフ|
    |             |       |    |             |ト                    |
    +---------------------------------------------------------------+


11.4.4. CUPS を使って印刷

    Common Unix Printing System (CUPS) が提供する、lp(1) と lpr(1) コ
    マンドの両方が印刷可能なデーターの印刷をカスタム化するオプション
    を提供します。

    以下のコマンドの内のひとつを使い一つのファイルに対し３部の印刷を
    ページ順に揃えてできます。

    $ lp -n 3 -o Collate=True filename

    $ lpr -#3 -o Collate=True filename

    さらに、コマンドライン印刷とオプションに書かれているように "-o
    number-up=2" や "-o page-set=even", "-o page-set=odd" や "-o
    scaling=200" や "-o natural-scaling=200" 等の印刷オプションを使っ
    てカスタム化できます。

11.5. メールデーター変換

    テキストデーター変換のための以下のパッケージが著者の目に止まりま
    した。

    表11.16 メールデーター変換を補助するパッケージのリスト

    +---------------------------------------------------------------+
    |パッケー |ポプコ|サイ|キーワ |              説明               |
    |   ジ    |  ン  | ズ | ード  |                                 |
    |---------+------+----+-------+---------------------------------|
    |sharutils|V:3,  |1436|メール |shar(1) と unshar(1) と uuencode |
    |         |I:28  |    |       |(1) と uudecode(1)               |
    |---------+------+----+-------+---------------------------------|
    |mpack    |V:0.9,|109 |MIME   |MIME メッセージの符号化と逆符号化|
    |         |I:8.0 |    |       |のソフト: mpack(1) と munpack(1) |
    |---------+------+----+-------+---------------------------------|
    |         |V:0.4,|    |       |Microsoft のみのフォーマットの   |
    |tnef     |I:4.1 |103 |ms-tnef|"application/ms-tnef" タイプの   |
    |         |      |    |       |MIME アタッチメントを開梱        |
    |---------+------+----+-------+---------------------------------|
    |         |V:0.2,|    |       |以下のフォーマットのエンコーダー |
    |uudeview |I:1.8 |105 |メール |とデコーダー: uuencode, xxencode,|
    |         |      |    |       |BASE64, quoted printable, BinHex |
    +---------------------------------------------------------------+


    ヒント

    インターネットメッセージアクセスプロトコルバージョン4 (IMAP4) サ
    ーバーは、プロプライエタリメールシステムのクライアントソフトが
    IMAP4 サーバーも使えるように設定できる場合、プロプライエタリメー
    ルシステムからメールを取り出すのに利用できるかもしれません。

11.5.1. メールデーターの基本

    メイル (SMTP) データーは7ビットデーター列に限定されるべきです。だ
    からバイナリーデーターや8ビットテキストデーターはMultipurpose
    Internet Mail Extensions (MIME) を用いたり文字セット (表11.2「符
    号化方式値とその使い方リスト」を参照下さい) を選択して7ビットのフ
    ォーマットにエンコードされます。

    標準のメールストレージフォーマットは RFC2822 (RFC822 の更新版) に
    より定義される mbox フォーマットです。mbox(5) (mutt パッケージが
    提供) を参照下さい。

    欧州言語の場合、ほとんど8ビット文字が無いので ISO-8859-1 文字セッ
    トとともに "Content-Transfer-Encoding: quoted-printable" がメール
    に通常使われます。欧州のテキストが UTF-8 符号化された場合、ほとん
    どが7ビット文字なので "Content-Transfer-Encoding:
    quoted-printable" が大体使われます。

    日本語には、テキストを7ビットにしておくために伝統的に
    "Content-Type: text/plain; charset=ISO-2022-JP" がメールに通常使
    われます。しかし、古い Microsoft システムは適正な宣言無しに
    Shift-JIS でメールデーターを送るかもしれません。日本語のテキスト
    が UTF-8 で符号化される場合、多くの8ビットデーターを含むので
    Base64 が大体使われます。他のアジアの言語でも状況は同様です。

    注記

    もし IMAP4 サーバーと話せる非 Debian クライアントからあなたの非
    Unix メールデーターがアクセス出きるなら、あなた自身の IMAP4 サー
    バーを実行することでメールデーターを引き出せるかもしれません。

    注記

    もし他のメールストレージフォーマットを使っている場合、mbox フォー
    マットに移動するのが良い第一歩です。mutt(1) のような汎用クライア
    ントプログラムはこれに非常に便利です。

    メールボックスの内容は procmail(1) と formail(1) を使って各メッセ
    ージに分割できます。

    各メールメッセージは mpack パッケージにある munpack(1) (または他
    の専用ツール) を使って開梱して MIME 符号化された内容を取り出せま
    す。

11.6. 画像データーツール

    gimp(1) のような GUI プログラムは非常に強力ですが、imagemagick(1)
    等のコマンドラインツールはスクリプトでイメージ操作を自動化するの
    に非常に便利です。

    デジタルカメラのファイルフォーマットのデファクト標準は、追加のメ
    タデーター付きの JPEG 画像ファイルフォーマットである交換可能な画
    像ファイルフォーマット (EXIF) です。EXIF は日付や時間やカメラ設定
    等の情報を保持できます。

    Lempel-Ziv-Welch (LZW) ロス無しデーター圧縮特許の期限は切れました
    。LZW データー圧縮を使う画像交換フォーマット (GIF) ユーティリティ
    ーは Debian システム上で自由に利用可能となりました。

    ヒント

    リムーバブル記録メディア付きのどのデジタルカメラやスキャナーも、
    カメラファイルシステム用デザインルールに準拠し FAT ファイルシステ
    ムを使っているので USB ストレージ読取り機を経由すれば Linux で必
    ず機能します。「リムーバブルストレージデバイス」を参照下さい。

11.6.1. 画像データーツール (メタパッケージ)

    以下のメタパッケージは aptitude(8) を使って画像データーツールを探
    す良いスタート地点です。"Packages overview for Debian PhotoTools
    Maintainers" も別のスタート地点です。

    表11.17 画像データーツールのリスト (メタパッケージ)

    +---------------------------------------------------------------+
    |                        |ポプコ|サ|キーワ|                     |
    |       パッケージ       |  ン  |イ| ード |        説明         |
    |                        |      |ズ|      |                     |
    |------------------------+------+--+------+---------------------|
    |                        |      |  |svg,  |画像や絵画芸術教育用 |
    |education-graphics      |I:0.35|25|jpeg, |のメタパッケージ     |
    |                        |      |  |…     |                     |
    |------------------------+------+--+------+---------------------|
    |                        |      |  |ttf,  |オープンフォントデザ |
    |open-font-design-toolkit|I:0.04|9 |ps, … |イン用のメタパッケー |
    |                        |      |  |      |ジ                   |
    +---------------------------------------------------------------+


    ヒント
   
    aptitude(8) の正規表現 "~Gworks-with::image" (「aptitude を使った
    探索方法」を参照下さい) を使ってさらなる画像ツールを探します。

11.6.2. 画像データーツール (GUI)

    以下の GUI の画像データー変換、編集、整理用パッケージが著者の目に
    止まりました。

    表11.18 画像データーツール (GUI) のリスト

    +---------------------------------------------------------------+
    |   パッケージ   |ポプコ |サイズ|キーワー|         説明         |
    |                |  ン   |      |   ド   |                      |
    |----------------+-------+------+--------+----------------------|
    |gimp            |V:44,  |32791 |画像    |GNU イメージ操作プログ|
    |                |I:216  |      |(bitmap)|ラム                  |
    |----------------+-------+------+--------+----------------------|
    |                |       |      |        |GTK に基づく SANE     |
    |xsane           |V:9,   |1512  |画像    |(Scanner Access Now   |
    |                |I:129  |      |(bitmap)|Easy) 用の X11 フロン |
    |                |       |      |        |トエンド              |
    |----------------+-------+------+--------+----------------------|
    |scribus         |V:1,   |32423 |ps/pdf/ |Scribus DTP エディター|
    |                |I:13   |      |SVG/…   |                      |
    |----------------+-------+------+--------+----------------------|
    |libreoffice-draw|V:82,  |10995 |画像    |LibreOffice office ス |
    |                |I:418  |      |(vector)|イート - ドロー       |
    |----------------+-------+------+--------+----------------------|
    |                |V:12,  |      |画像    |SVG (スケーラブルベク |
    |inkscape        |I:78   |112538|(vector)|トルグラフィクス) エデ|
    |                |       |      |        |ィター                |
    |----------------+-------+------+--------+----------------------|
    |dia             |V:1,   |3802  |画像    |ダイアグラムエディター|
    |                |I:17   |      |(vector)|(Gtk)                 |
    |----------------+-------+------+--------+----------------------|
    |xfig            |V:0.6, |7951  |画像    |X11 下でインテラクティ|
    |                |I:8.9  |      |(vector)|ブ生成するソフト      |
    |----------------+-------+------+--------+----------------------|
    |gocr            |V:0.5, |549   |画像→テ |フリー OCR ソフト     |
    |                |I:3.9  |      |キスト  |                      |
    |----------------+-------+------+--------+----------------------|
    |eog             |V:26,  |10524 |画像    |画像ビューアープログラ|
    |                |I:143  |      |(Exif)  |ム Eye of GNOME       |
    |----------------+-------+------+--------+----------------------|
    |gthumb          |V:3,   |5162  |画像    |画像ビューアー兼ブラウ|
    |                |I:12   |      |(Exif)  |ザー (GNOME)          |
    |----------------+-------+------+--------+----------------------|
    |geeqie          |V:3,   |2903  |画像    |GTK を用いた画像ビュー|
    |                |I:11   |      |(Exif)  |アー                  |
    |----------------+-------+------+--------+----------------------|
    |shotwell        |V:14,  |6334  |画像    |デジタル写真オーガナイ|
    |                |I:246  |      |(Exif)  |ザー (GNOME)          |
    |----------------+-------+------+--------+----------------------|
    |gwenview        |V:40,  |6000  |画像    |画像ビューア (KDE)    |
    |                |I:115  |      |(Exif)  |                      |
    |----------------+-------+------+--------+----------------------|
    |kamera          |I:114  |992   |画像    |KDE アプリケーション用|
    |                |       |      |(Exif)  |デジタルカメラサポート|
    |----------------+-------+------+--------+----------------------|
    |digikam         |V:1.5, |324   |画像    |デジタル写真管理アプリ|
    |                |I:8.3  |      |(Exif)  |ケーション            |
    |----------------+-------+------+--------+----------------------|
    |darktable       |V:4,   |35876 |画像    |写真家のための仮想ライ|
    |                |I:11   |      |(Exif)  |トボックスと暗室      |
    |----------------+-------+------+--------+----------------------|
    |hugin           |V:0.5, |6476  |画像    |パノラマ写真合成機    |
    |                |I:5.6  |      |(Exif)  |                      |
    |----------------+-------+------+--------+----------------------|
    |librecad        |V:1,   |9164  |DXF, ...|2D CAD データーエディ |
    |                |I:14   |      |        |ター                  |
    |----------------+-------+------+--------+----------------------|
    |freecad         |V:1,   |112   |DXF, ...|3D CAD データーエディ |
    |                |I:21   |      |        |ター                  |
    |----------------+-------+------+--------+----------------------|
    |                |V:2,   |      |blend,  |アニメーション等用の  |
    |blender         |I:20   |92911 |TIFF,   |3D コンテントエディタ |
    |                |       |      |VRML, … |ー                    |
    |----------------+-------+------+--------+----------------------|
    |                |V:0.02,|      |ms3d,   |OpenGL 準拠の 3D モデ |
    |mm3d            |I:0.21 |4123  |obj,    |ルエディター          |
    |                |       |      |dxf, …  |                      |
    |----------------+-------+------+--------+----------------------|
    |                |V:0.6, |      |ttf, ps,|PS と TrueType と     |
    |fontforge       |I:5.6  |4054  |…       |OpenType のフォント用 |
    |                |       |      |        |フォントエディター    |
    |----------------+-------+------+--------+----------------------|
    |                |       |      |        |TrueType フォントをグ |
    |xgridfit        |V:0.01,|878   |ttf     |リッドフィッティングと|
    |                |I:0.08 |      |        |ヒンティング用のプログ|
    |                |       |      |        |ラム                  |
    +---------------------------------------------------------------+


11.6.3. 画像データーツール (CLI)

    以下の CLI の画像データー変換、編集、整理用パッケージが著者の目に
    止まりました。

    表11.19 画像データーツールのリスト (CLI)

    +---------------------------------------------------------------+
    |   パッケージ    |ポプコ |サイ| キーワード |       説明        |
    |                 |  ン   | ズ |            |                   |
    |-----------------+-------+----+------------+-------------------|
    |imagemagick      |V:9,   |79  |画像        |画像操作プログラム |
    |                 |I:278  |    |(bitmap)    |                   |
    |-----------------+-------+----+------------+-------------------|
    |                 |V:1.0, |    |画像        |画像操作プログラム |
    |graphicsmagick   |I:8.6  |5816|(bitmap)    |(imagemagick のフォ|
    |                 |       |    |            |ーク)              |
    |-----------------+-------+----+------------+-------------------|
    |netpbm           |V:27,  |8435|画像        |画像変換ツール     |
    |                 |I:288  |    |(bitmap)    |                   |
    |-----------------+-------+----+------------+-------------------|
    |                 |       |    |            |High Efficiency    |
    |                 |       |    |            |Image File Format  |
    |libheif-examples |V:0.3, |438 |heif→jpeg   |(HEIF) を JPEG や  |
    |                 |I:3.5  |    |(bitmap)    |PNG や Y4M フォーマ|
    |                 |       |    |            |ットに heif-convert|
    |                 |       |    |            |(1) コマンドで変換 |
    |-----------------+-------+----+------------+-------------------|
    |                 |       |    |            |MS Windows のアイコ|
    |                 |V:3,   |    |png↔ico     |ンやカーソールと   |
    |icoutils         |I:34   |221 |(bitmap)    |PNG フォーマット間 |
    |                 |       |    |            |の変換             |
    |                 |       |    |            |(favicon.ico)      |
    |-----------------+-------+----+------------+-------------------|
    |                 |       |    |            |PostScript と PDF  |
    |                 |V:2,   |    |ps/pdf→画像 |ファイルから編集可 |
    |pstoedit         |I:39   |1075|(vector)    |能なベクトルグラフ |
    |                 |       |    |            |ィクスへの変換ソフ |
    |                 |       |    |            |ト (SVG)           |
    |-----------------+-------+----+------------+-------------------|
    |                 |V:5,   |    |Windows/画像|Windows メタファイ |
    |libwmf-bin       |I:83   |149 |(vector)    |ル (ベクトル画像デ |
    |                 |       |    |            |ーター) 変換ツール |
    |-----------------+-------+----+------------+-------------------|
    |                 |V:0.03,|    |fig→sxd     |XFig ファイルを    |
    |fig2sxd          |I:0.18 |158 |(vector)    |OpenOffice.org Draw|
    |                 |       |    |            |フォーマットに変換 |
    |-----------------+-------+----+------------+-------------------|
    |                 |V:2,   |    |            |OCR 用のスキャンし |
    |unpaper          |I:16   |417 |画像→画像   |たページの後処理ツ |
    |                 |       |    |            |ール               |
    |-----------------+-------+----+------------+-------------------|
    |                 |       |    |            |HP の商用 OCR エン |
    |tesseract-ocr    |V:8,   |2209|画像→テキス |ジンの基づくフリー |
    |                 |I:33   |    |ト          |の OCR ソフトウェア|
    |                 |       |    |            |ー                 |
    |-----------------+-------+----+------------+-------------------|
    |                 |       |    |            |OCR エンジンデータ |
    |tesseract-ocr-eng|V:8,   |4032|画像→テキス |ー: tesseract-ocr  |
    |                 |I:33   |    |ト          |の英文用言語ファイ |
    |                 |       |    |            |ル                 |
    |-----------------+-------+----+------------+-------------------|
    |ocrad            |V:0.3, |608 |画像→テキス |フリー OCR ソフト  |
    |                 |I:2.4  |    |ト          |                   |
    |-----------------+-------+----+------------+-------------------|
    |                 |       |    |            |JPEG ファイル中の  |
    |exif             |V:3,   |335 |画像(Exif)  |EXIF 情報を表示する|
    |                 |I:51   |    |            |コマンドラインユー |
    |                 |       |    |            |ティリティー       |
    |-----------------+-------+----+------------+-------------------|
    |exiv2            |V:2,   |429 |画像(Exif)  |EXIF/IPTC メタデー |
    |                 |I:19   |    |            |ター操作ツール     |
    |-----------------+-------+----+------------+-------------------|
    |exiftran         |V:1,   |81  |画像(Exif)  |デジタルカメラの   |
    |                 |I:11   |    |            |jpeg 画像を変換    |
    |-----------------+-------+----+------------+-------------------|
    |                 |       |    |            |デジタルカメラの   |
    |exiftags         |V:0.3, |309 |画像(Exif)  |JPEG ファイルから  |
    |                 |I:2.7  |    |            |Exif タグを読むユー|
    |                 |       |    |            |ティリティー       |
    |-----------------+-------+----+------------+-------------------|
    |                 |V:0.2, |    |            |デジタル写真からメ |
    |exifprobe        |I:2.1  |506 |画像(Exif)  |タデーターを読み出 |
    |                 |       |    |            |す                 |
    |-----------------+-------+----+------------+-------------------|
    |dcraw            |V:0.8, |428 |画像(Raw)   |生のデジタルカメラ |
    |                 |I:7.3  |    |→ppm        |画像のデコード     |
    |-----------------+-------+----+------------+-------------------|
    |findimagedupes   |V:0.1, |75  |画像        |視覚的な類似画像と |
    |                 |I:1.1  |    |→fingerprint|重複画像の検出     |
    |-----------------+-------+----+------------+-------------------|
    |                 |V:0.02,|    |            |忠実度を上げたりモ |
    |ale              |I:0.16 |850 |画像→画像   |ザイクを作成するた |
    |                 |       |    |            |めの画像のマージ   |
    |-----------------+-------+----+------------+-------------------|
    |                 |V:0.2, |    |画像(Exif)  |イメージから静的な |
    |imageindex       |I:1.2  |143 |→html       |HTML ギャラリーを生|
    |                 |       |    |            |成                 |
    |-----------------+-------+----+------------+-------------------|
    |                 |V:0.11,|    |            |普遍的             |
    |outguess         |I:0.99 |230 |jpeg,png    |Steganographic ツー|
    |                 |       |    |            |ル                 |
    |-----------------+-------+----+------------+-------------------|
    |jpegoptim        |V:0.6, |59  |jpeg        |JPEG ファイルの最適|
    |                 |I:6.0  |    |            |化                 |
    |-----------------+-------+----+------------+-------------------|
    |optipng          |V:2,   |187 |png         |PNG ファイルのロス |
    |                 |I:40   |    |            |レス最適化         |
    |-----------------+-------+----+------------+-------------------|
    |pngquant         |V:1,   |62  |png         |PNG ファイルのロッ |
    |                 |I:10   |    |            |シー最適化         |
    +---------------------------------------------------------------+


11.7. その他のデーター変換

    多くのデーター変換プログラムがあります。aptitude(8) で
    "~Guse::converting" という正規表現 (「aptitude を使った探索方法」
    を参照下さい) を使い以下のプログラムが私の目に止まりました。

    表11.20 その他のデーター変換ツールのリスト

    +---------------------------------------------------------------+
    |パッケー |ポプコ |サイ |キーワー |            説明             |
    |   ジ    |  ン   | ズ  |   ド    |                             |
    |---------+-------+-----+---------+-----------------------------|
    |alien    |V:1,   |150  |rpm/     |外来のパッケージの Debian パ |
    |         |I:13   |     |tgz→deb  |ッケージへの変換ソフト       |
    |---------+-------+-----+---------+-----------------------------|
    |         |       |     |         |"Electric Book" (日本で人気) |
    |freepwing|V:0.00,|447  |EB→EPWING|から単一の JIS X 4081 フォー |
    |         |I:0.02 |     |         |マット (EPWING V1 のサブセッ |
    |         |       |     |         |ト) への変換ソフト           |
    |---------+-------+-----+---------+-----------------------------|
    |calibre  |V:7,   |65193|any→EPUB |e-book コンバーターとライブラ|
    |         |I:24   |     |         |リーの管理                   |
    +---------------------------------------------------------------+


    RPM フォーマットからのデーター抽出もまた以下のようにするとできま
    す。

    $ rpm2cpio file.src.rpm | cpio --extract

第12章プログラミング

    Debian システム上でプログラミングを学ぶ人がパッケージ化されたソー
    スコードを読み込めるようになるための指針を示します。以下はプログ
    ラムに関する特記すべきパッケージと対応する文書パッケージです。

    オンラインリファレンスは manpages と manpages-dev パッケージをイ
    ンストールした後で "man name" とタイプすると利用可能です。GNU ツ
    ールのオンラインリファレンスは該当する文書パッケージをインストー
    ルした後で "info program_name" とタイプすると使えます。一部の
    GFDL 文書は DFSG に準拠していないと考えられているので main アーカ
    イブに加えて contrib や non-free アーカイブを含める必要があるかも
    しれません。

    バージョンコントロールシステムツールの使用を考えましょう。「Git」
    を参照下さい。

    警告
   
    "test" を実行可能なテストファイルの名前に用いてはいけません。
    "test" はシェルのビルトインです。

    注意

    ソースから直接コンパイルしたソフトウェアープログラムは、システム
    プログラムとかち合わないように、"/usr/local" か "/opt" の中にイン
    ストールします。

    ヒント
   
    "99ボトルのビールの歌" 作成のコード例はほとんど全てのプログラム言
    語に関する理解のための非常に好適です。

12.1. シェルスクリプト

    シェルスクリプトは実行ビットがセットされたテキストファイルで、以
    下に示すフォーマットのコマンドを含んでいます。

    #!/bin/sh
     ... command lines

    最初の行はこのファイル内容を読み実行するシェルインタープリタを指
    定します。

    シェルスクリプトを読むのは Unix 的なシステムがどのように機能して
    いるのかを理解する最良の方法です。ここでは、シェルプログラムに関
    する指針や心がけを記します。失敗から学ぶために "シェルの失敗"
    (https://www.greenend.org.uk/rjk/2001/04/shell.html) を参照下さい
    。

    シェル対話モード (「シェルプロンプト」と「Unix 的テキスト処理」を
    参照下さい) と異なり、シェルスクリプトは変数や条件文やループを繁
    用します。

12.1.1. POSIX シェル互換性

    多くのシステムスクリプトは POSIX シェル (表1.13「シェルプログラム
    のリスト」を参照下さい) のどれで解釈されるか分かりません。

      * デフォールトの非インタラクティブなシェル "/usr/bin/sh" は /
        usr/bin/dash をさしているシムリンクで、多くのシステムプログラ
        ムで使われます。

      * デフォルトのインタラクティブなシェルは /usr/bin/bash です。

    全ての POSIX シェル間でポータブルとするために bashisms や zshisms
    を使うシェルスクリプトを書くのを避けます。checkbashisms(1) を使う
    とこれがチェックできます。

    表12.1 典型的 bashizms のリスト

    +---------------------------------------------------------------+
    |          推薦: POSIX          |      回避すべき: bashism      |
    |-------------------------------+-------------------------------|
    |if [ "$foo" = "$bar" ] ; then …|if [ "$foo" == "$bar" ] ; then |
    |                               |…                              |
    |-------------------------------+-------------------------------|
    |diff -u file.c.orig file.c     |diff -u file.c{.orig,}         |
    |-------------------------------+-------------------------------|
    |mkdir /foobar /foobaz          |mkdir /foo{bar,baz}            |
    |-------------------------------+-------------------------------|
    |funcname() { … }               |function funcname() { … }      |
    |-------------------------------+-------------------------------|
    |8進表記: "\377"                |16進表記: "\xff"               |
    +---------------------------------------------------------------+


    "echo" コマンドはその実装がシェルビルトインや外部コマンド間で相違
    しているので以下の注意点を守って使わなければいけません。

      * "-n" 以外のどのコマンドオプション使用も避けます。
   
      * 文字列中にエスケープシーケンスはその取扱いに相違があるので使
        用を避けます。

    注記
   
    "-n" オプションは実は POSIX シンタックスではありませんが、一般的
    に許容されています。

    ヒント
   
    出力文字列にエスケープシーケンスを埋め込む必要がある場合には、
    "echo" コマンドの代わりに "printf" コマンドを使います。

12.1.2. シェル変数

    特別なシェルパラメーターがシェルスクリプト中ではよく使われます。

    表12.2 シェル変数のリスト

    +-------------------------------------------------------+
    |シェル変数|                   変数値                   |
    |----------+--------------------------------------------|
    |$0        |シェルまたはシェルスクリプトの名前          |
    |----------+--------------------------------------------|
    |$1        |最初 (1番目) のシェル引数                   |
    |----------+--------------------------------------------|
    |$9        |9番目のシェル引数                           |
    |----------+--------------------------------------------|
    |$#        |シェル引数の数                              |
    |----------+--------------------------------------------|
    |"$*"      |"$1 $2 $3 $4 … "                            |
    |----------+--------------------------------------------|
    |"$@"      |"$1" "$2" "$3" "$4" …                       |
    |----------+--------------------------------------------|
    |$?        |最新のコマンドの終了状態                    |
    |----------+--------------------------------------------|
    |$$        |このシェルスクリプトの PID                  |
    |----------+--------------------------------------------|
    |$!        |最近スタートしたバックグラウンドジョブの PID|
    +-------------------------------------------------------+


    覚えておくべき基本的なパラメーター展開を次に記します。

    表12.3 シェル変数展開のリスト

    +---------------------------------------------------------------+
    |パラメーター |var が設定されて |var が設定されていないときの値 |
    |    式形     |  いるときの値   |                               |
    |-------------+-----------------+-------------------------------|
    |$            |"$var"           |"string"                       |
    |{var:-string}|                 |                               |
    |-------------+-----------------+-------------------------------|
    |$            |"string"         |"null"                         |
    |{var:+string}|                 |                               |
    |-------------+-----------------+-------------------------------|
    |${var:=      |"$var"           |"string" (合わせて "var=string"|
    |string}      |                 |を実行)                        |
    |-------------+-----------------+-------------------------------|
    |${var:?      |"$var"           |"string" をstderr に出力 (エラ |
    |string}      |                 |ーとともに exit する)          |
    +---------------------------------------------------------------+


    ここで、これら全てのオペレーターのコロン ":" は実際はオプションで
    す。

      * ":" 付き = 演算子は存在と非ヌル文字列をテストします
   
      * ":" 無し = 演算子は存在のみをテストします

    表12.4 重要なシェル変数置換のリスト

    +-----------------------------------------------------+
    |パラメーター置換形|               結果               |
    |------------------+----------------------------------|
    |${var%suffix}     |最短のサフィックスパターンを削除  |
    |------------------+----------------------------------|
    |${var%%suffix}    |最長のサフィックスパターンを削除  |
    |------------------+----------------------------------|
    |${var#prefix}     |最短のプレフィックスパターンを削除|
    |------------------+----------------------------------|
    |${var##prefix}    |最長のプレフィックスパターンを削除|
    +-----------------------------------------------------+


12.1.3. シェル条件式

    各コマンドは条件式に使えるエグジットステイタスを返します。

      * 成功: 0 ("真")
   
      * エラー: 非0 ("偽")

    注記
   
    シェル条件文の文脈において "0" は "真" を意味しますが、C 条件文の
    文脈では "0" は "偽" を意味します。

    注記
   
    "[" は、"]" までの引数を条件式として評価する、test コマンドと等価
    です。

    覚えておくべき基本的な条件文の慣用句は次です。

      * "command && 成功したらこのcommandも実行 || true"

      * "command || もしcommandが成功しないとこのコマンドも実行 ||
        true"

      * 以下のような複数行のスクリプト断片

    if [ conditional_expression ]; then
     if_success_run_this_command
    else
     if_not_success_run_this_command
    fi

    ここで、シェルが "-e" フラグ付きで起動された際にシェルスクリプト
    がこの行で誤って exit しないようにするために、末尾の "|| true" が
    必要です。

    表12.5 条件式中のファイル比較演算子

    +------------------------------------------------------------+
    |      式       |              論理真を返す条件              |
    |---------------+--------------------------------------------|
    |-e file        |file が存在する                             |
    |---------------+--------------------------------------------|
    |-d file        |file が存在しディレクトリーである           |
    |---------------+--------------------------------------------|
    |-f file        |file が存在し通常ファイルである             |
    |---------------+--------------------------------------------|
    |-w file        |file が存在し書込み可能である               |
    |---------------+--------------------------------------------|
    |-x file        |file が存在し実行可能である                 |
    |---------------+--------------------------------------------|
    |file1 -nt file2|file1 が file2 よりも新しい (変更)          |
    |---------------+--------------------------------------------|
    |file1 -ot file2|file1 が file2 よりも古い (変更)            |
    |---------------+--------------------------------------------|
    |file1 -ef file2|file1 と file2 は同デバイス上の同 inode 番号|
    +------------------------------------------------------------+


    表12.6 条件式中での文字列比較演算子のリスト

    +---------------------------------------------------------+
    |     式     |              論理真を返す条件              |
    |------------+--------------------------------------------|
    |-z str      |str の長さがゼロ                            |
    |------------+--------------------------------------------|
    |-n str      |str の長さが非ゼロ                          |
    |------------+--------------------------------------------|
    |str1 = str2 |str1 と str2 は等しい                       |
    |------------+--------------------------------------------|
    |str1 != str2|str1 と str2 は等しく無い                   |
    |------------+--------------------------------------------|
    |str1 < str2 |str1 のソート順が str2 より前 (ロケール依存)|
    |------------+--------------------------------------------|
    |str1 > str2 |str1 のソート順が str2 より後 (ロケール依存)|
    +---------------------------------------------------------+


    条件式中の算術整数比較演算子は "-eq" と "-ne" と "-lt" と "-le"
    と "-gt" と "-ge" です。

12.1.4. シェルループ

    POSIX シェル中で使われるループの慣用句があります。

      * "for x in foo1 foo2 … ; do コマンド ; done" は "foo1 foo2 …"
        リストの項目を変数 "x" に代入し "コマンド" を実行してループし
        ます。

      * "while 条件 ; do コマンド ; done" は"条件" が真の場合 "コマン
        ド" を繰り返します。
   
      * "until 条件 ; do コマンド ; done" は"条件" が真でない場合 "コ
        マンド" を繰り返します。

      * "break" によってループから脱出できます。

      * "continue" によってループ初めに戻り次の反復実行を再開します。

    ヒント
   
    C 言語のような数字の繰り返しは "foo1 foo2 ..." 生成に seq(1) 使っ
    て実現します。

    ヒント
   
    「ファイルに関してループしながらコマンドを反復実行」を参照下さい
    。

12.1.5. シェル環境変数

    普通の人気あるシェルコマンドプロンプトがあなたのスクリプト実行環
    境下使えないかもしれません。

      * "$USER" には "$(id -un)" を使います

      * "$UID" には "$(id -u)" を使います

      * "$HOME" に関して、"$(getent passwd "$(id -u)"|cut -d ":" -f
        6)" を使います (これは「集中システム管理」上でも機能します。)

12.1.6. シェルコマンドライン処理シーケンス

    シェルはおおよそ以下のシーケンスでスクリプトを処理します。

      * シェルは1行読み込みます。

      * シェルは、もし "…" や '…' の中なら、行の一部を1つのトークンと
        してグループします。

      * シェルは1行を以下のによってトークンに分割します。

          + 空白: space tab newline

          + メタ文字: < > | ; & ( )

      * "…" や '…' の中でない場合、シェルは各トークンを予約語に対して
        チェックしその挙動を調整します。

          + 予約語: if then elif else fi for in while unless do done
            case esac

      * "…" や '…' の中でない場合、シェルはエイリアスを展開します。

      * "…"や'…'の中でない場合、シェルはティルダを展開します。

          + "~" → 現ユーザーのホームディレクトリー

          + "~user" → user のホームディレクトリー

      * '…' の中でない場合、シェルはパラメーター"をその値に展開します
        。

          + パラメーター: "$PARAMETER" or "${PARAMETER}"

      * '…' の中でない場合、シェルはコマンド置換を展開します。

          + "$( command )" → "command" の出力

          + "` command `" → "command" の出力

      * "…" や '…' の中でない場合、シェルはパス名のグロブを展開します
        。

          + * → あらゆる文字

          + ? → 1文字

          + […] → "…" 中の1つ

      * シェルはコマンドを次から検索して実行します。

          + 関数定義

          + ビルトインコマンド

          + "$PATH" 中の実行ファイル

      * シェルは次行に進みこのプロセスを一番上から順に反復します。

    ダブルクォート中のシングルクォートに効果はありません。

    シェル環境中で "set -x" を実行したり、シェルを "-x" オプションで
    起動すると、シェルは実行するコマンドを全てプリントするようになり
    ます。これはデバグをするのに非常に便利です。

12.1.7. シェルスクリプトのためのユーティリティープログラム

    Debian システム上でできるだけポータブルなシェルプログラムとするに
    は、ユーティリティープログラムを essential パッケージで提供される
    プログラムだけに制約するのが賢明です。

      * "aptitude search ~E" はessential (必須) パッケージをリストし
        ます。
   
      * "dpkg -L パッケージ名 |grep '/man/man.*/'" はパッケージ名パッ
        ケージによって提供されるコマンドのマンページをリストします。

    表12.7 シェルスクリプト用の小さなユーティリティープログラムを含む
    パッケージのリスト

    +---------------------------------------------------------------+
    | パッケージ  | ポプコン |サイ |              説明              |
    |             |          | ズ  |                                |
    |-------------+----------+-----+--------------------------------|
    |dash         |V:928,    |207  |sh 用の小型で高速の POSIX 準拠シ|
    |             |I:998     |     |ェル                            |
    |-------------+----------+-----+--------------------------------|
    |coreutils    |V:911,    |17994|GNU コアユーティリティー        |
    |             |I:1000    |     |                                |
    |-------------+----------+-----+--------------------------------|
    |grep         |V:783,    |1297 |GNU grep, egrep and fgrep       |
    |             |I:1000    |     |                                |
    |-------------+----------+-----+--------------------------------|
    |sed          |V:753,    |987  |GNU sed                         |
    |             |I:1000    |     |                                |
    |-------------+----------+-----+--------------------------------|
    |mawk         |V:484,    |295  |小さく高速な awk                |
    |             |I:998     |     |                                |
    |-------------+----------+-----+--------------------------------|
    |debianutils  |V:935,    |225  |Debian 特有の雑多なユーティリテ |
    |             |I:996     |     |ィー                            |
    |-------------+----------+-----+--------------------------------|
    |bsdutils     |V:443,    |334  |4.4BSD-Lite 由来の基本ユーティリ|
    |             |I:999     |     |ティー                          |
    |-------------+----------+-----+--------------------------------|
    |bsdextrautils|V:753,    |378  |4.4BSD-Lite 由来の追加のユーティ|
    |             |I:859     |     |リティー                        |
    |-------------+----------+-----+--------------------------------|
    |moreutils    |V:17, I:39|232  |追加の Unix ユーティリティー    |
    +---------------------------------------------------------------+


    ヒント

    moreutils は Debian の外では存在しないかも知れませんが、興味深い
    小さなプログラムを提供します。もっとも特記すべきは、オリジナルフ
    ァイルを上書きしたいときに非常に有効な sponge(8) です。

    例は「Unix 的テキスト処理」を参照下さい。

12.2. インタープリター言語でのスクリプティング

    表12.8 インタープリター関連のパッケージのリスト

    +---------------------------------------------------------------+
    |       パッケージ        |ポプコ |サイ|          文書          |
    |                         |  ン   | ズ |                        |
    |-------------------------+-------+----+------------------------|
    |dash                     |V:928, |207 |sh: sh 用の小型高速     |
    |                         |I:998  |    |POSIX 準拠シェル        |
    |-------------------------+-------+----+------------------------|
    |bash                     |V:888, |7276|sh: bash-doc が提供する |
    |                         |I:999  |    |"info bash"             |
    |-------------------------+-------+----+------------------------|
    |mawk                     |V:484, |295 |AWK: 小型高速 awk       |
    |                         |I:998  |    |                        |
    |-------------------------+-------+----+------------------------|
    |gawk                     |V:252, |3289|AWK: gawk-doc が提供する|
    |                         |I:303  |    |"info gawk"             |
    |-------------------------+-------+----+------------------------|
    |                         |       |    |Perl: perl-doc and      |
    |perl                     |V:668, |838 |perl-doc-html　が提供す |
    |                         |I:992  |    |る perl(1) と html ペー |
    |                         |       |    |ジ                      |
    |-------------------------+-------+----+------------------------|
    |                         |V:2,   |    |GNU ReadLine/History ラ |
    |libterm-readline-gnu-perl|I:28   |439 |イブラリーのための Perl |
    |                         |       |    |拡張: perlsh(1)         |
    |-------------------------+-------+----+------------------------|
    |libreply-perl            |V:0.00,|171 |PerlのREPL: reply(1)    |
    |                         |I:0.09 |    |                        |
    |-------------------------+-------+----+------------------------|
    |libdevel-repl-perl       |V:0.03,|237 |PerlのREPL: re.pl(1)    |
    |                         |I:0.54 |    |                        |
    |-------------------------+-------+----+------------------------|
    |                         |V:721, |    |Python: python-doc が提 |
    |python3                  |I:973  |81  |供する python3(1) と    |
    |                         |       |    |html ページ             |
    |-------------------------+-------+----+------------------------|
    |                         |V:23,  |    |Tcl: tcl-doc が提供する |
    |tcl                      |I:178  |20  |tcl(3) と詳細なマンペー |
    |                         |       |    |ジ                      |
    |-------------------------+-------+----+------------------------|
    |tk                       |V:18,  |20  |Tk: tk-doc が提供する tk|
    |                         |I:172  |    |(3) と詳細なマンページ  |
    |-------------------------+-------+----+------------------------|
    |ruby                     |V:71,  |32  |Ruby: ruby(1), erb(1),  |
    |                         |I:160  |    |irb(1), rdoc(1), ri(1)  |
    +---------------------------------------------------------------+


    Debian 上のタスクを自動化したい場合には、まず最初にインタープリタ
    ー言語でタスクをスクリプト化すべきです。インタープリター言語選択
    のガイドラインは:

      * もしタスクがシェルプログラムでできた CLI プログラムを組み合わ
        せる簡単なタスクなら、dash を使います。

      * もしタスクが簡単なタスクではなく何もないところから書くなら、
        python3 を使います。

      * もしタスクをするための加筆をする必要がある perl, tcl, ruby,
        ... で書かれたコードが Debian 上にすでに存在する場合には、そ
        の言語を使います。

    もし出来上がったコードがおそすぎる場合には、実行速度にクリチカル
    な部分のみコンパイラー言語で書き直しインタープリター言語から呼び
    ます。

12.2.1. インタープリター言語コードのデバグ

    ほとんどのインタープリターは基本的文法チェックやコード追跡の機能
    を提供します。

      * “dash -n script.sh” - シェルスクリプトの文法チェック

      * “dash -x script.sh” - シェルスクリプトのトレース

      * “python -m py_compile script.py” - Python スクリプトの文法チ
        ェック
   
      * “python -mtrace --trace script.py” - Python スクリプトのトレ
        ース

      * “perl -I ../libpath -c script.pl” - Perl スクリプトの文法チェ
        ック

      * “perl -d:Trace script.pl” - Perl スクリプトのトレース

    dash のコードチェックの際には、 bash のようなインタラクティブ環境
    を用意する「Readline のラッパー」を試します。

    perl のコードチェックの際には、Pythonのような REPL (=READ + EVAL
    + PRINT + LOOP) 環境を提供するPerl 用の環境を試しましょう。

12.2.2. シェルスクリプトを使った GUI プログラム

    シェルスクリプトは魅力的な GUI プログラムを作るまで改善できます。
    echo や read コマンドを使う鈍いやりとりに代えて、いわゆるダイアロ
    グプログラムを使うのがこのトリックです。

    表12.9 ダイアログプログラムのリスト

    +---------------------------------------------------------------+
    |パッケー |ポプコ |サイ |                 説明                  |
    |   ジ    |  ン   | ズ  |                                       |
    |---------+-------+-----+---------------------------------------|
    |x11-utils|V:225, |651  |xmessage(1): window 中にメッセージや質 |
    |         |I:555  |     |問を表示 (X)                           |
    |---------+-------+-----+---------------------------------------|
    |whiptail |V:307, |61   |シェルスクリプトからユーザーフレンリー |
    |         |I:997  |     |なダイアログボックスを表示 (newt)      |
    |---------+-------+-----+---------------------------------------|
    |dialog   |V:8,   |520  |シェルスクリプトからユーザーフレンリー |
    |         |I:80   |     |なダイアログボックスを表示 (ncurses)   |
    |---------+-------+-----+---------------------------------------|
    |zenity   |V:77,  |193  |シェルスクリプトからグラフィカルなダイ |
    |         |I:342  |     |アログボックスを表示 (GTK)             |
    |---------+-------+-----+---------------------------------------|
    |         |V:0.01,|     |シェルスクリプトフロントエンドツール   |
    |ssft     |I:0.15 |75   |(gettext を使った zenity や kdialog や |
    |         |       |     |dialog のラッパー)                     |
    |---------+-------+-----+---------------------------------------|
    |gettext  |V:51,  |20468|"/usr/bin/gettext.sh": メッセージ翻訳  |
    |         |I:219  |     |                                       |
    +---------------------------------------------------------------+


    簡単なシェルスクリプトだけでできるほど GUI プログラムがいかに簡単
    ということを示す GUI プログラムの例は以下です。

    このスクリプトはファイルの選択(デフォルトは/etc/motd) に zenity
    を使い、それを表示します。

    このスクリプトの GUI ローンチャーは以下のようにして生成できます「
    GUI からプログラムをスタート」.

    #!/bin/sh -e
    # Copyright (C) 2021 Osamu Aoki <osamu@debian.org>, Public Domain
    # vim:set sw=2 sts=2 et:
    DATA_FILE=$(zenity --file-selection --filename="/etc/motd" --title="Select a file to check") || \
      ( echo "E: File selection error" >&2 ; exit 1 )
    # Check size of archive
    if ( file -ib "$DATA_FILE" | grep -qe '^text/' ) ; then
      zenity --info --title="Check file: $DATA_FILE" --width 640  --height 400 \
        --text="$(head -n 20 "$DATA_FILE")"
    else
      zenity --info --title="Check file: $DATA_FILE" --width 640  --height 400 \
        --text="The data is MIME=$(file -ib "$DATA_FILE")"
    fi

    シェルスクリプトでの GUI プログラムへのこのようなアプローチは簡単
    な選択ケースでのみ有効です。何らかの複雑のあるプログラムを書く場
    合には、もっと能力あるプラットフォームで書くことを考えましょう。

12.2.3. GUI フィルター用のカスタム動作集

    GUI ファイラープログラムは、追加の拡張パッケージを使って選択され
    たファイルに対していくつかの人気ある動作を実行するように拡張でき
    ます。また、GUI ファイラープログラムはあなたの特定のスクリプトを
    追加することで非常に特定のカスタム動作を実行するようにもできます
    。

      * GNOME の場合、NautilusScriptsHowtoを参照下さい。

      * KDE の場合、Creating Dolphin Service Menusを参照下さい。
   
      * Xfce の場合、Thunar - Custom Actions and https://
        help.ubuntu.com/community/ThunarCustomActionsを参照下さい。

      * LXDEの場合、Custom Actionsを参照下さい。

12.2.4. 究極の短い Perl スクリプト

    データー処理をするためには、cut や grep や sed 等を実行するサブプ
    ロセスを起動する必要が sh ではあり、遅いです。一方、データーを処
    理する内部機能が perl ではあり、高速です。そのため、多くの Debian
    のシステムメンテナンススクリプトは perl を使います。

    以下の AWK スクリプトとそれと等価Perl スクリプトの断片を考えまし
    ょう。

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

    これは以下の数行のどれとも等価です。

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

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

    perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |

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

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

    最後のスクリプトは謎々状態です。Perl の以下の機能を利用しています
    。

      * ホワイトスペースはオプション。

      * 数字から文字列への自動変換が存在します。
   
      * コマンドラインオプション経由の Perl 実行トリック集: perlrun
        (1)

      * Perl の特別な変数集: perlvar(1)

    このフレキシビリティーは Perl の強みです。同時に、これは我々に読
    解不能な絡まったコードを書くことを許容します。だから注意して下さ
    い。

12.3. コンパイル言語でのコーディング

    表12.10 コンパイラ関連のパッケージのリスト

    +---------------------------------------------------------------+
    |   パッケージ   |ポプコ |サイ |              説明              |
    |                |  ン   | ズ  |                                |
    |----------------+-------+-----+--------------------------------|
    |gcc             |V:157, |36   |GNU C コンパイラ                |
    |                |I:565  |     |                                |
    |----------------+-------+-----+--------------------------------|
    |libc6-dev       |V:268, |12676|GNU C ライブラリー: 開発用ライブ|
    |                |I:584  |     |ラリーとヘッダーファイル集      |
    |----------------+-------+-----+--------------------------------|
    |g++             |V:59,  |13   |GNU C++ コンパイラー            |
    |                |I:531  |     |                                |
    |----------------+-------+-----+--------------------------------|
    |libstdc++-15-dev|V:5,   |25228|GNU 標準 C++ ライブラリー v3 (開|
    |                |I:23   |     |発用ファイル集)                 |
    |----------------+-------+-----+--------------------------------|
    |cpp             |V:338, |18   |GNU C プリプロセッサ            |
    |                |I:721  |     |                                |
    |----------------+-------+-----+--------------------------------|
    |gettext         |V:51,  |20468|GNU 国際化ユーティリティ        |
    |                |I:219  |     |                                |
    |----------------+-------+-----+--------------------------------|
    |glade           |V:0.2, |1613 |GTK ユーザーインターフェースビル|
    |                |I:2.8  |     |ダー                            |
    |----------------+-------+-----+--------------------------------|
    |valac           |V:0.3, |533  |GObject システム用の C# に似た言|
    |                |I:3.0  |     |語                              |
    |----------------+-------+-----+--------------------------------|
    |flex            |V:6,   |1247 |LEX 互換の高速字句解析ジェネレー|
    |                |I:68   |     |タ                              |
    |----------------+-------+-----+--------------------------------|
    |bison           |V:7,   |3122 |YACC互換のパーサジェネレータ    |
    |                |I:72   |     |                                |
    |----------------+-------+-----+--------------------------------|
    |susv2           |I:0.03 |16   |"The Single UNIX Specifications |
    |                |       |     |v2" を取得                      |
    |----------------+-------+-----+--------------------------------|
    |susv3           |I:0.05 |16   |"The Single UNIX Specifications |
    |                |       |     |v3" を取得                      |
    |----------------+-------+-----+--------------------------------|
    |susv4           |I:0.04 |16   |"The Single UNIX Specifications |
    |                |       |     |v4" を取得                      |
    |----------------+-------+-----+--------------------------------|
    |golang          |I:21   |12   |Go プログラミング言語コンパイラ |
    |                |       |     |ー                              |
    |----------------+-------+-----+--------------------------------|
    |rustc           |V:5,   |13061|Rust システムプログラム言語     |
    |                |I:19   |     |                                |
    |----------------+-------+-----+--------------------------------|
    |gfortran        |V:5,   |15   |GNU Fortran 95 コンパイラー     |
    |                |I:50   |     |                                |
    |----------------+-------+-----+--------------------------------|
    |fpc             |I:2.3  |101  |Free Pascal                     |
    +---------------------------------------------------------------+


    ここで、「Flex — 改良版 Lex」と「Bison — 改良版 Yacc」は、コンパ
    イラーのようなプログラムがどのように高レベル記述を C 言語にするこ
    とで C 言語で書かれているかを示すために含めています。

12.3.1. C

    C プログラム言語で書かれたプログラムをコンパイルする適正な環境を
    以下のようにして設定できます。

    # apt-get install glibc-doc manpages-dev libc6-dev gcc build-essential

    GNU C ライブラリーパッケージである libc6-dev パッケージは、C プロ
    グラム言語で使われるヘッダーファイルやライブラリールーチンの集合
    である C 標準ライブラリーを提供します。

    C のリファレンスは以下を参照下さい。

      * "info libc" (C ライブラリー関数リファレンス)

      * gcc(1) と "info gcc"
   
      * 各 C ライブラリー関数名(3)

      * Kernighan & Ritchie 著, "The C Programming Language", 第2版
        (Prentice Hall)

12.3.2. 単純な C プログラム (gcc)

    簡単な例の "example.c" は"libm" ライブラリーを使って実行プログラ
    ム "run_example" に以下のようにしてコンパイル出来ます。

    $ cat > example.c << EOF
    #include <stdio.h>
    #include <math.h>
    #include <string.h>

    int main(int argc, char **argv, char **envp){
            double x;
            char y[11];
            x=sqrt(argc+7.5);
            strncpy(y, argv[0], 10); /* prevent buffer overflow */
            y[10] = '\0'; /* fill to make sure string ends with '\0' */
            printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]);
            return 0;
    }
    EOF
    $ gcc -Wall -g -o run_example example.c -lm
    $ ./run_example
            1, 2.915, ./run_exam,     (null)
    $ ./run_example 1234567890qwerty
            2, 3.082, ./run_exam, 1234567890qwerty

    ここで、"-lm" はsqrt(3) のために libc6 パッケージで提供されるライ
    ブラリー "/usr/lib/libm.so" をリンクするのに必要です。実際のライ
    ブラリーは "/lib/" 中にあるファイル名 "libm.so.6" で、それは
    "libm-2.7.so" にシムリンクされています。

    出力テキスト中の最後のパラメーターを良く見ましょう。"%10s" が指定
    されているにもかかわらず10文字以上あります。

    上記のオーバーラン効果を悪用するバッファーオーバーフロー攻撃を防
    止のために、sprintf(3) や strcpy(3) 等の境界チェック無しのポイン
    ターメモリー操作関数の使用は非推奨です。これに代えて snprintf(3)
    や strncpy(3) を使います。

12.3.3. Flex — 改良版 Lex

    Flex はLex 互換の高速字句解析生成ソフトです。

    flex(1) の入門書は "info flex" の中にあります。

    シンプルな例が "/usr/share/doc/flex/examples/" の下にあります。 ^
    [7]

12.3.4. Bison — 改良版 Yacc

    Yacc 互換の前方参照可能な LR パーサーとか LALR パーサー生成ソフト
    は、いくつかのパッケージによって Debian 上で提供されています。

    表12.11 Yacc 互換の LALR パーサー生成ソフトのリスト

    +---------------------------------------------------------------+
    |パッケ |ポプコン |サイ|                  説明                  |
    | ージ  |         | ズ |                                        |
    |-------+---------+----+----------------------------------------|
    |bison  |V:7, I:72|3122|GNU LALR パーサー生成ソフト             |
    |-------+---------+----+----------------------------------------|
    |byacc  |V:0.2,   |263 |Berkeley LALR パーサー生成ソフト        |
    |       |I:3.1    |    |                                        |
    |-------+---------+----+----------------------------------------|
    |btyacc |V:0.01,  |247 |byacc に基づいたバックトラッキング機能付|
    |       |I:0.06   |    |きパーサー生成ソフト                    |
    +---------------------------------------------------------------+


    bison(1) の入門書は "info bison" の中にあります。

    あなた自身の "main()" と "yyerror()" を供給する必要があります。
    "main()" は、Flex によって通常作成された "yylex()" を呼び出す
    "yyparse()" を呼び出します。

    シンプルなターミナル上の計算機プログラムの作成例をここに示します
    。

    example.y を作成しましょう:

    /* calculator source for bison */
    %{
    #include <stdio.h>
    extern int yylex(void);
    extern int yyerror(char *);
    %}

    /* declare tokens */
    %token NUMBER
    %token OP_ADD OP_SUB OP_MUL OP_RGT OP_LFT OP_EQU

    %%
    calc:
     | calc exp OP_EQU    { printf("Y: RESULT = %d\n", $2); }
     ;

    exp: factor
     | exp OP_ADD factor  { $$ = $1 + $3; }
     | exp OP_SUB factor  { $$ = $1 - $3; }
     ;

    factor: term
     | factor OP_MUL term { $$ = $1 * $3; }
     ;

    term: NUMBER
     | OP_LFT exp OP_RGT  { $$ = $2; }
      ;
    %%

    int main(int argc, char **argv)
    {
      yyparse();
    }

    int yyerror(char *s)
    {
      fprintf(stderr, "error: '%s'\n", s);
    }


    example.l を作成しましょう:

    /* calculator source for flex */
    %{
    #include "example.tab.h"
    %}

    %%
    [0-9]+ { printf("L: NUMBER = %s\n", yytext); yylval = atoi(yytext); return NUMBER; }
    "+"    { printf("L: OP_ADD\n"); return OP_ADD; }
    "-"    { printf("L: OP_SUB\n"); return OP_SUB; }
    "*"    { printf("L: OP_MUL\n"); return OP_MUL; }
    "("    { printf("L: OP_LFT\n"); return OP_LFT; }
    ")"    { printf("L: OP_RGT\n"); return OP_RGT; }
    "="    { printf("L: OP_EQU\n"); return OP_EQU; }
    "exit" { printf("L: exit\n");   return YYEOF; } /* YYEOF = 0 */
    .      { /* ignore all other */ }
    %%

    そして、これを試すためにシェルプロンプトから以下を実行しましょう:

    $ bison -d example.y
    $ flex example.l
    $ gcc -lfl example.tab.c lex.yy.c -o example
    $ ./example
    1 + 2 * ( 3 + 1 ) =
    L: NUMBER = 1
    L: OP_ADD
    L: NUMBER = 2
    L: OP_MUL
    L: OP_LFT
    L: NUMBER = 3
    L: OP_ADD
    L: NUMBER = 1
    L: OP_RGT
    L: OP_EQU
    Y: RESULT = 9

    exit
    L: exit

12.4. 静的コード分析ツール

    静的解析(lint) のようなツールは、自動静的コード分析に役立ちます。

    Indent のようなツールは整合性をもってソースコードの再フォーマット
    することで人間によるコードレビューを助けます。

    Ctags のようなツールは、ソースコード中に見つかる名前のインデック
    ス(とかタグ)を生成することで、人間がコードのレビューするのを助け
    ます。

    ヒント

    あなたの好きなエディター (emacs か vim) を非同期の lint エンジン
    プラグインを使うように設定することはあなたがコードを書く際に役立
    ちます。このようなプラグインは Language Server Protocol を利用す
    ることで非常にパワフルになっています。プラグインは非常に変化の激
    しいので、Debian パッケージではなくアップストリームコードを使うの
    は良い方策かもしれません。

    表12.12 静的コード分析ツールのリスト

    +---------------------------------------------------------------+
    |  パッケージ   |ポプコ |サイ |              説明               |
    |               |  ン   | ズ  |                                 |
    |---------------+-------+-----+---------------------------------|
    |vim-ale        |I:0.78 |2833 |Vim 8 や NeoVim 用の非同期静的解 |
    |               |       |     |析エンジン                       |
    |---------------+-------+-----+---------------------------------|
    |vim-syntastic  |I:2.0  |1379 |Vim 用のシンタックスシェックのハ |
    |               |       |     |ック                             |
    |---------------+-------+-----+---------------------------------|
    |elpa-flycheck  |V:0.1, |815  |Emacs 用の現代的な同時進行のシン |
    |               |I:1.6  |     |タックスチェック                 |
    |---------------+-------+-----+---------------------------------|
    |elpa-relint    |V:0.01,|150  |Emacs Lisp の正規表現 (regexp) の|
    |               |I:0.05 |     |間違い検出器                     |
    |---------------+-------+-----+---------------------------------|
    |cppcheck-gui   |V:0.11,|7722 |静的 C/C++ コード分析ツール (GUI)|
    |               |I:0.99 |     |                                 |
    |---------------+-------+-----+---------------------------------|
    |shellcheck     |V:3,   |22860|シェルスクリプトの静的解析(lint) |
    |               |I:16   |     |ツール                           |
    |---------------+-------+-----+---------------------------------|
    |pyflakes3      |V:1,   |20   |Python 3 の受動チェッカー        |
    |               |I:14   |     |                                 |
    |---------------+-------+-----+---------------------------------|
    |pylint         |V:3,   |2089 |Python コード静的チェックソフト  |
    |               |I:20   |     |                                 |
    |---------------+-------+-----+---------------------------------|
    |perl           |V:668, |838  |静的コードチェックソフト付きのイ |
    |               |I:992  |     |ンタープリタ: B::Lint(3perl)     |
    |---------------+-------+-----+---------------------------------|
    |rubocop        |V:0.07,|4157 |Ruby 静的コード分析ツール        |
    |               |I:1.00 |     |                                 |
    |---------------+-------+-----+---------------------------------|
    |clang-tidy     |V:2,   |21   |Clang に基づく C++ の静的解析    |
    |               |I:11   |     |(lint)ツール                     |
    |---------------+-------+-----+---------------------------------|
    |splint         |V:0.06,|2325 |C プログラムを静的にバグのチェッ |
    |               |I:0.94 |     |クするためのツール               |
    |---------------+-------+-----+---------------------------------|
    |flawfinder     |V:0.07,|205  |C/C++ ソースコードを検査してセキ |
    |               |I:0.44 |     |ュリティーの脆弱性を探すツール   |
    |---------------+-------+-----+---------------------------------|
    |black          |V:3,   |10057|非妥協的な Python コードフォーマ |
    |               |I:16   |     |ッター                           |
    |---------------+-------+-----+---------------------------------|
    |perltidy       |V:0.4, |3086 |Perl スクリプトのインデントとリフ|
    |               |I:3.0  |     |ォーマット                       |
    |---------------+-------+-----+---------------------------------|
    |indent         |V:0.3, |438  |C 言語ソースコードフォーマッター |
    |               |I:5.1  |     |プログラム                       |
    |---------------+-------+-----+---------------------------------|
    |astyle         |V:0.2, |770  |C と C++ と Objective-C と C# と |
    |               |I:2.5  |     |Java のソースコードインデンター  |
    |---------------+-------+-----+---------------------------------|
    |bcpp           |V:0.02,|114  |C(++) の美化プログラム           |
    |               |I:0.25 |     |                                 |
    |---------------+-------+-----+---------------------------------|
    |xmlindent      |V:0.08,|52   |XML ストリームリフォーマッタ     |
    |               |I:0.77 |     |                                 |
    |---------------+-------+-----+---------------------------------|
    |global         |V:0.2, |1923 |ソースコードの検索と閲覧のツール |
    |               |I:1.6  |     |                                 |
    |---------------+-------+-----+---------------------------------|
    |exuberant-ctags|V:2,   |341  |ソースコード定義のタグファイルの |
    |               |I:13   |     |インデックスの構築               |
    |---------------+-------+-----+---------------------------------|
    |universal-ctags|V:1,   |4238 |ソースコード定義のタグファイルの |
    |               |I:12   |     |インデックスの構築               |
    +---------------------------------------------------------------+


12.5. デバグ

    デバッグはプログラミング活動において重要です。プログラムのデバッ
    グ法を知ることで、あなたも意味あるバグリポートを作成できるような
    良い Debian ユーザーになれます。

    表12.13 デバッグパッケージのリスト

    +------------------------------------------------------------+
    |パッケージ|  ポプコン  |サイズ|            文書             |
    |----------+------------+------+-----------------------------|
    |gdb       |V:87, I:159 |12456 |gdb-doc が提供する "info gdb"|
    |----------+------------+------+-----------------------------|
    |ddd       |V:0.3, I:5.2|4210  |ddd-doc が提供する "info ddd"|
    +------------------------------------------------------------+


12.5.1. 基本的な gdb 実行

    Debian 上の第一義的デバッガは、実行中のプログラムを検査できるよう
    にする gdb(1) です。

    gdb と関連プログラムを以下のようにインストールしましょう。

    # apt-get install gdb gdb-doc build-essential devscripts

    gdb のよいチュートリアルについては以下を参照下さい:

      * “info gdb”

      * /usr/share/doc/gdb-doc/html/gdb/index.html 中の “Debugging
        with GDB”

      * “ウェブ上のチュートリアル”

    次は gdb(1) を"-g" を使ってデバッグ情報を付けてコンパイルされた
    "program" に使う簡単な例です。

    $ gdb program
    (gdb) b 1                # set break point at line 1
    (gdb) run args           # run program with args
    (gdb) next               # next line
    ...
    (gdb) step               # step forward
    ...
    (gdb) p parm             # print parm
    ...
    (gdb) p parm=12          # set value to 12
    ...
    (gdb) quit

    ヒント
   
    多くの gdb(1) コマンドは省略できます。タブ展開はシェル同様に機能
    します。

12.5.2. Debian パッケージのデバグ

    全てのインストールされたバイナリーはデフォルトでは Debian システ
    ム上ではストリップされているべきなので、ほとんどのデバグシンボル
    は普通のパッケージからは除かれています。gdb(1) を使って Debian パ
    ッケージをデバグするためには、*-dbgsym パッケージ(例えばcoreutils
    の場合は coreutils-dbgsym)をインストールする必要があります。ソー
    スパッケージは、普通のバイナリーパッケージとともに *-dbgsym パッ
    ケージを自動生成し、そうしたデバグパッケージは別にして
    debian-debug アーカイブ中に置かれます。詳細は Debian Wiki の記事
    を参照下さい。

    デバッグしようとしているパッケージに*-dbgsym パッケージが無い場合
    は、以下のようにしてリビルドした後でインストールする必要がありま
    す。

    $ mkdir /path/new ; cd /path/new
    $ sudo apt-get update
    $ sudo apt-get dist-upgrade
    $ sudo apt-get install fakeroot devscripts build-essential
    $ apt-get source package_name
    $ cd package_name*
    $ sudo apt-get build-dep ./

    必要に応じてバグを修正します。

    例えば以下のように、既存パッケージを再コンパイルする時は
    "+debug1" を後ろに付けたり、リリース前のパッケージをコンパイルす
    る時は "~pre1" を後ろに付けたりと、正規の Debian バージョンとかち
    合わないようにパッケージバージョンを増やします。

    $ dch -i

    以下のようにしてデバグシンボル付きでパッケージをコンパイルしてイ
    ンストールします。

    $ export DEB_BUILD_OPTIONS="nostrip noopt"
    $ debuild
    $ cd ..
    $ sudo debi package_name*.changes

    パッケージのビルドスクリプトを確認して、バイナリーのコンパイルに
    確実に "CFLAGS=-g -Wall" が使われているようにします。

12.5.3. バックトレースの収集

    プログラムがクラッシュするのに出会った場合に、バックトレース情報
    をバグレポートに切り貼りして報告するのは良い考えです。

    バックトレースはgdb(1) によって以下のような段取りで得られます。

      * GDBの中でクラッシュアプローチ:

          + GDB からプログラムを実行します。

          + プログラムがクラッシュします。

          + GDB プロンプトで "bt" と打ちます。

      * 先にクラッシュアプローチ:

          + “/etc/security/limits.conf” ファイルを更新して以下を含め
            ます:
   
            * soft core unlimited

          + シェルプロンプトで "ulimit -c unlimited" と打ちます。

          + このシェルプロンプトからプログラムを実行します。

          + プログラムがクラッシュしてコアダンプファイルができます。

          + "gdb gdb ./program_binary core" として core dump ファイル
            を GDB にロードします。

          + GDB プロンプトで "bt" と打ちます。

    無限ループやキーボードが凍結した場合、Ctrl-\ か Ctrl-C を押すか
    “kill -ABRT PID” を実行することでプログラムを強制終了できます。(
    「プロセスの停止」を参照下さい)

    ヒント

    しばしば、一番上数行が "malloc()" か "g_malloc()" 中にあるバック
    トレースを見かけます。こういったことが起こる場合は、大体あまりあ
    なたのバックトレースは役に立ちません。有用な情報を見つけるもっと
    も簡単な方法は環境変数 "$MALLOC_CHECK_" の値を 2と設定することで
    す (malloc(3))。gdb を実行しながらこれを実行するには以下のように
    します。

     $ MALLOC_CHECK_=2 gdb hello

12.5.4. 高度な gdb コマンド

    表12.14 高度な gdb コマンドのリスト

    +---------------------------------------------------------------+
    |     コマンド      |            コマンド目的の説明             |
    |-------------------+-------------------------------------------|
    |(gdb) thread apply |マルチスレッドプログラムの全てのスレッドの |
    |all bt             |バックトレースを取得                       |
    |-------------------+-------------------------------------------|
    |(gdb) bt full      |関数コールのスタック上に来たパラメーターを |
    |                   |取得                                       |
    |-------------------+-------------------------------------------|
    |(gdb) thread apply |異常のオプションの組み合わせでバックトレー |
    |all bt full        |スとパラメーターを取得                     |
    |-------------------+-------------------------------------------|
    |(gdb) thread apply |無関係の出力を切り最後の10のコールに関する |
    |all bt full 10     |バックトレースとパラメーターを取得         |
    |-------------------+-------------------------------------------|
    |(gdb) set logging  |gdb アウトプットをファイルに書き出す (デフ |
    |on                 |ォールトは "gdb.txt")                      |
    +---------------------------------------------------------------+


12.5.5. ライブラリーへの依存の確認

    以下のように ldd(1) を使ってプログラムのライブラリーへの依存関係
    をみつけだします。

    $ ldd /usr/bin/ls
            librt.so.1 => /lib/librt.so.1 (0x4001e000)
            libc.so.6 => /lib/libc.so.6 (0x40030000)
            libpthread.so.0 => /lib/libpthread.so.0 (0x40153000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

    `chroot` された環境下で ls(1) が機能するには、上記ライブラリーが
    あなたの `chroot` された環境内で利用可能である必要があります。

    「プログラム活動の追跡」を参照下さい。

12.5.6. 動的呼び出し追跡ツール

    Debian 中に複数の動的呼び出し追跡ツールがあります。「プログラム活
    動の監視と制御と起動」を参照下さい。

12.5.7. X エラーのデバグ

    GNOME プログラム preview1 が X エラーを受けると、以下のようなメッ
    セージが見つかります。

    The program 'preview1' received an X Window System error.

    このような場合には、プログラムを "--sync" 付きで実行して、バック
    トレースを得るために "gdk_x_error" 関数上で停止するようにしてみま
    す。

12.5.8. メモリーリーク検出ツール

    Debian にはメモリーリークを検出するプログラムがいくつか利用可能で
    す。

    表12.15 メモリーリーク検出ツールのリスト

    +---------------------------------------------------------------+
    |  パッケージ  |ポプコ |サイ |               説明               |
    |              |  ン   | ズ  |                                  |
    |--------------+-------+-----+----------------------------------|
    |libc6-dev     |V:268, |12676|mtrace(1): glibc 中の malloc デバ |
    |              |I:584  |     |ッグ機能                          |
    |--------------+-------+-----+----------------------------------|
    |valgrind      |V:5,   |87847|メモリーデバッガとプロファイラ    |
    |              |I:33   |     |                                  |
    |--------------+-------+-----+----------------------------------|
    |electric-fence|V:0.2, |69   |malloc(3) デバッガ                |
    |              |I:2.4  |     |                                  |
    |--------------+-------+-----+----------------------------------|
    |libdmalloc5   |V:0.01,|373  |メモリーアロケーションのデバグ用ラ|
    |              |I:0.66 |     |イブラリー                        |
    |--------------+-------+-----+----------------------------------|
    |              |V:0.01,|     |C および C++ プログラムのバッファ |
    |duma          |I:0.06 |297  |オーバーランとアンダーランを検出す|
    |              |       |     |るライブラリー                    |
    |--------------+-------+-----+----------------------------------|
    |leaktracer    |I:0.39 |56   |C++ プログラム用のメモリーリーク追|
    |              |       |     |跡ソフト                          |
    +---------------------------------------------------------------+


12.5.9. バイナリーのディスアッセンブリー

    以下のように objdump(1) を使ってバイナリーコードをディスアッセン
    ブルできます。

    $  objdump -m i386 -b binary -D /usr/lib/grub/x86_64-pc/stage1

    注記
   
    gdb(1) は対話的にコードをディスアッセンブルするのに使えます。

12.6. ビルドツール

    表12.16 ビルドツールパッケージのリスト

    +---------------------------------------------------------------+
    |パッケージ |ポプコ |サイ |                文書                 |
    |           |  ン   | ズ  |                                     |
    |-----------+-------+-----+-------------------------------------|
    |make       |V:152, |1762 |make-doc が提供する "info make"      |
    |           |I:567  |     |                                     |
    |-----------+-------+-----+-------------------------------------|
    |autoconf   |V:27,  |2244 |autoconf-doc が提供する "info        |
    |           |I:199  |     |autoconf                             |
    |-----------+-------+-----+-------------------------------------|
    |automake   |V:27,  |1932 |automake1.10-doc が提供する "info    |
    |           |I:199  |     |automake"                            |
    |-----------+-------+-----+-------------------------------------|
    |libtool    |V:23,  |1245 |libtool-doc が提供する "info libtool"|
    |           |I:182  |     |                                     |
    |-----------+-------+-----+-------------------------------------|
    |cmake      |V:19,  |59735|クロスプラットフォームでオープンソー |
    |           |I:122  |     |スの make システム cmake(1)          |
    |-----------+-------+-----+-------------------------------------|
    |ninja-build|V:8,   |456  |Make と似た精神の小さなビルドシステム|
    |           |I:53   |     |ninja(1)                             |
    |-----------+-------+-----+-------------------------------------|
    |meson      |V:6,   |4277 |ninja の上に構築された高生産性のビル |
    |           |I:28   |     |ドシステム meson(1)                  |
    |-----------+-------+-----+-------------------------------------|
    |xutils-dev |V:0.5, |1495 |imake(1), xmkmf(1), 他               |
    |           |I:6.9  |     |                                     |
    +---------------------------------------------------------------+


12.6.1. Make

    Make はプログラムのグループを管理するためのユーティリティーです。
    make(1) を実行すると、make は"Makefile" というルールファイルを読
    み、ターゲットが最後に変更された後で変更された前提ファイルにター
    ゲットが依存している場合やターゲットが存在しない場合にはターゲッ
    トを更新します。このような更新は同時並行的にされるかもしれません
    。

    ルールファイルのシンタックスは以下の通りです。

    target: [ prerequisites ... ]
     [TAB]  command1
     [TAB]  -command2 # ignore errors
     [TAB]  @command3 # suppress echoing

    上記で、"[TAB]" は TAB コードです。各行は make による変数置換後シ
    ェルによって解釈されます。スクリプトを継続する行末には "\" を使い
    ます。シェルスクリプトの環境変数のための "$" を入力するためには
    "$$" を使います。

    ターゲットや前提に関するインプリシット (暗黙) ルールは、例えば以
    下のように書けます。

    %.o: %.c header.h

    上記で、ターゲットは "%" という文字を (1つだけ) 含んでいます。"%"
    は実際のターゲットファイル名の空でないいかなる部分文字列ともマッ
    チします。前提もまた同様にそれらの名前が実際のターゲットファイル
    名にどう関連するかを示すために "%" を用いることができます。

    表12.17 make の自動変数のリスト

    +---------------------------------------------------+
    |自動変数|                  変数値                  |
    |--------+------------------------------------------|
    |$@      |ターゲット                                |
    |--------+------------------------------------------|
    |$<      |最初の前提条件                            |
    |--------+------------------------------------------|
    |$?      |全ての新規の前提条件                      |
    |--------+------------------------------------------|
    |$^      |全ての前提条件                            |
    |--------+------------------------------------------|
    |$*      |"%" はターゲットパターンの軸にマッチします|
    +---------------------------------------------------+


    表12.18 make 変数の展開のリスト

    +--------------------------+
    | 変数展開  |     説明     |
    |-----------+--------------|
    |foo1 := bar|一回だけの展開|
    |-----------+--------------|
    |foo2 = bar |再帰的展開    |
    |-----------+--------------|
    |foo3 += bar|後ろに追加    |
    +--------------------------+


    "make -p -f/dev/null" を実行して自動的な内部ルールを確認下さい。

12.6.2. Autotools

    Autotools は多くの Unix-like システムに移植可能なソースコードパッ
    ケージを作ることを援助するように設計された一連のプログラムツール
    です。

      * Autoconf は "configure.ac" から "configure" を生成します。

          + その後、"configure" は "Makefile.in" から "Makefile" を生
            成します。
   
      * Automake は "Makefile.am" から "Makefile.in" を生成します。

      * Libtool は共有ライブラリーをソースコードからコンパイルする時
        のソフトウェアー移植性問題を解決するためのシェルプログラムで
        す。

12.6.2.1. プログラムをコンパイルとインストール

    警告
   
    システムファイルをあなたがコンパイルしたプログラムでインストール
    する時に上書きしてはいけません。

    Debian は"/usr/local/" とか "/opt" 中のファイルに触れません。プロ
    グラムをソースからコンパイルする場合、Debian とかち合わないように
    それを "/usr/local/" の中にインストールします。

    $ cd src
    $ ./configure --prefix=/usr/local
    $ make # this compiles program
    $ sudo make install # this installs the files in the system

12.6.2.2. プログラムのアンインストール

    オリジナルのソースを保有し、それが autoconf(1)/automake(1) と使用
    しあなたがそれをどう設定したかを覚えているなら、以下のように実行
    してソフトウェアーをアンイストールします。

    $ ./configure all-of-the-options-you-gave-it
    $ sudo make uninstall

    この代わりに、"/usr/local/" の下にだけインストールプロセスがファ
    イルを置いたことが絶対に確実でそこに重要なものが無いなら、以下の
    ようにしてその内容を消すことが出来ます。

    # find /usr/local -type f -print0 | xargs -0 rm -f

    どこにファイルがインストールされるか良く分からない場合には、
    checkinstall パッケージにある checkinstall(8) を使いアンインスト
    ールする場合クリーンなパスとなるようにすることを考えましょう。こ
    れは "-D" オプションを使うと Debian パッケージを作成できます。

12.6.3. Meson

    ソフトウェアービルドシステムは進化してきています:

      * Make の上に構築された Autotools は 1990 年代より移植可能なビ
        ルドインフラのデファクトスタンダードです。これは非常に遅いで
        す。

      * 2000 年に最初にリリースされた CMake は、スピードが大幅向上さ
        せたが、依然として本質的に遅い Make の上に構築されていました
        。(現在は、Ninja がバックエンドで使えます。)

      * 2012 年に最初にリリースされた Ninja は、さらなるビルド速度の
        向上のために Make の置き換えを意図し、その入力ファイルはハイ
        レベルビルドシステムが生成するように設計されています。

      * 2013 年に最初にリリースされた Meson は、新しく人気ある Ninja
        をバックエンドに使うハイレベルビルドシステムです。

    "The Meson Build system" や "The Ninja build system" にある文書を
    参照下さい。

12.7. ウェッブ

    基本的な対話式動的ウェッブページは以下のようにして作られます。

      * 質問 (クエリー) はブラウザーのユーザーに HTML フォームを使っ
        て提示されます。

      * フォームのエントリーを埋めたりクリックすることによって以下の
        符号化されたパラメーター付きの URL 文字列をブラウザーからウェ
        ッブサーバーに送信します。

          + "https://www.foo.dom/cgi-bin/program.pl?VAR1=VAL1&VAR2=
            VAL2&VAR3=VAL3"

          + "https://www.foo.dom/cgi-bin/program.py?VAR1=VAL1&VAR2=
            VAL2&VAR3=VAL3"
   
          + "https://www.foo.dom/program.php?VAR1=VAL1&VAR2=VAL2&VAR3
            =VAL3"

      * URL 中の "%nn" は16進数で nn の値の文字と置き換えられます。

      * 環境変通は以下のように設定されます: "QUERY_STRING="VAR1=VAL1
        VAR2=VAL2 VAR3=VAL3"".

      * ウェッブサーバー上の CGI プログラム ("program.*" のいずれで
        も) が環境変数 "$QUERY_STRING" の下で実行されます。

      * CGI プログラムの STDOUT (標準出力) がウエブブラウザーに送られ
        対話式の動的なウェッブページとして表示されます。

    セキュリティー上、CGI パラメーターを解釈する手作りの急ごしらえの
    プログラムは作らない方が賢明です。Perl や Python にはこのための確
    立したモジュールが存在します。PHP はこの様な機能が同梱されていま
    す。クライアントでのデーターのストレージの必要がある場合、HTTP ク
    ッキーが使われます。クライアントサイドのデーター処理が必要な場合
    、Javascript が良く使われます。

    詳しくは、Common Gateway Interface や The Apache Software
    Foundation や JavaScript を参照下さい。

    https://www.google.com/search?hl=en&ie=UTF-8&q=CGI+tutorial を
    URL として直接ブラウザーのアドレスに入れ Google で"CGI tutorial"
    を検索するとグーグルサーバー上の CGI スクリプトが動いているのを観
    察する良い例です。

12.8. ソースコード変換

    ソースコード変換するプログラムがあります。

    表12.19 ソースコード変換ツールのリスト

    +---------------------------------------------------------------+
    |パッケー |ポプコ |サ |キーワー |                               |
    |   ジ    |  ン   |イ |   ド    |             説明              |
    |         |       |ズ |         |                               |
    |---------+-------+---+---------+-------------------------------|
    |perl     |V:668, |838|AWK→PERL |AWK から PERL へのソースコード |
    |         |I:992  |   |         |変換シフト: a2p(1)             |
    |---------+-------+---+---------+-------------------------------|
    |f2c      |V:0.1, |443|FORTRAN→C|FORTRAN 77 から C/C++ へのソー |
    |         |I:2.0  |   |         |スコード変換ソフト: f2c(1)     |
    |---------+-------+---+---------+-------------------------------|
    |         |V:0.03,|   |         |NASM (Intel フォーマット) から |
    |intel2gas|I:0.18 |178|intel→gas|GNU Assembler (GAS) への変換ソ |
    |         |       |   |         |フト                           |
    +---------------------------------------------------------------+


12.9. Debian パッケージ作成

    Debian パッケージを作りたい場合には、次を読みましょう。

      * 基本的なパッケージシステムの理解には2章Debian パッケージ管理

      * 基本的なポーティングプロセスの理解のために、「安定版システム
        へのパッケージ移植」

      * 基本的な chroot 技術の理解のために、「Chroot システム」

      * debuild(1) と sbuild(1)
   
      * リコンパイルとデバグは「Debian パッケージのデバグ」

      * Guide for Debian Maintainers (debmake-doc パッケージ)

      * Debian Developer's Reference (developers-reference パッケー
        ジ)

      * Debian ポリシーマニュアル (debian-policy パッケージ)

    debmake や dh-make や dh-make-perl 等のパッケージングを補助するパ
    ッケージがあります。


---------------------------------------------------------------------

    ^[7] 現行のシステム下でこれらを動かすには少々微調整が必要かもしれ
    ません。

付録A 補遺

    以下が本文書の背景です。

A.1. Debian 迷路

    Linux システムはネットワーク化されたコンピューターのための非常に
    パワフルなコンピュータープラットフォームです。しかし、Linux の全
    能力を利用する方法を学ぶことはたやすいことではありません。非
    PostScript プリンタが接続された LPR プリンタの設定がこんなつまず
    く点の良い例でした。(最近のインストールでは CUPS システムが使われ
    るのでもうこの様な問題はありません。)

    "ソースコード" という完全かつ詳細なマップが存在します。これは非常
    に正確ですが理解することが難しいものです。また、HOWTO や
    mini-HOWTO と呼ばれるリファレンスもあります。これらは理解はしやす
    いのですが、詳細過ぎて全体像を失いがちです。ちょっとコマンドを実
    行する必要がある時に、長大な HOWTO の該当する章を探すのには骨が折
    れることが時々あります。

    この "Debian リファレンス (第2.143版)" (2026-07-10 14:59:15 UTC)
    が Debian 迷路の真っ只中にいる皆様にとって解決の糸口となることを
    望みます。

A.2. 著作権の経緯

    Debian リファレンスは青木修 <osamu at debian dot org> が個人用シ
    ステム管理メモとして書き始められました。多くの内容が debian-user
    メーリングリストや他の Debian のリソースから得られた知識由来です
    。

    当時 Debian Documentation Project で非常にアクティブであった、
    Josip Rodin 氏の助言に従い、 DDP 文書の一部として "Debian リファ
    レンス (第1版、2001-2007)"を作りました。

    6年経った時点で、青木はオリジナルの "Debian リファレンス (第1版)"
    が時代遅れとなっている事に気づき多くの内容を書き換え始めました。
    新たな "Debian リファレンス (第2版)" が2008年にリリースされました
    。

    著者は、新規トピックス (Systemd, Wayland, IMAP, PipeWire, Linux
    kernel 5.10) を取り扱い、旧式のトピックス (SysV init, CVS,
    Subversion, SSH protocol 1, Linux kernels before 2.5) を削除して
    、"Debian Reference (version 2)" を更新しました。Jessie 8
    (2015-2020) リリースやそれ以前の状況は、ほぼ削除しました。

    この "Debian Reference (version 2.143)" (2026-07-10 14:59:15 UTC)
    は、主に Trixie (=stable) と Forky (=testing) Debian リリースカバ
    ーします。

    チュートリアルの内容はその内容とインスピレーションを次から得まし
    た。

      * "Linux User's Guide" Larry Greenfield 著 (1996年12月)

          + "Debian Tutorial" によって陳腐化

      * "Debian Tutorial" Havoc Pennington 著。 (1998年12年11日)

          + Oliver Elphick と Ole Tetlie と James Treacy と Craig
            Sawyer と Ivan E. Moore II による一部著作

          + "Debian GNU/Linux: Guide to Installation and Usage" によ
            って陳腐化

      * "Debian GNU/Linux: Guide to Installation and Usage" John
        Goerzen and Ossama Othman 著(1999年)

          + "Debian リファレンス (第1版)" によって陳腐化

    パッケージやアーカイブに関する記述はそのオリジンやインスピレーシ
    ョンの一部を次に遡ることができます。

      * "Debian FAQ" (Josip Rodin が維持していた 2002年3月版)

    他の内容はそのオリジンやインスピレーションを次に遡ることができま
    す。

      * "Debian リファレンス (第1版)" 青木修著 (2001年〜2007年)
   
          + 2018年のより新しい "Debian リファレンス (第2版)" によって
            陳腐化

    以前の "Debian リファレンス (第1版)" は次によって作られました。

      * ネットワーク設定に関する大部分の内容は Thomas Hood が寄稿

      * X と VCS に関連するかなりの内容は Brian Nelson が寄稿

      * ビルドスクリプトや多くの内容に関する訂正で Jens Seidel が寄与

      * David Sewell による徹底的な校正

      * 翻訳者やコントリビューターやバグ報告者達による多くの寄与

    Debian システム上の多くのマニュアルページや info ページやアップス
    トリームのウエッブページやWikipediaの文書が本文書を書く上での第一
    義的参照情報として使われました。青木修が公正な使用と考える範囲内
    で、それらの多くの部分、特にコマンドの定義が、本文書の文体と目的
    に合うように注意深い編集をした後、断片的文言として使われました。

    gdb デバッガーに関する記述は Arii Pollak と Loïc Minier と Dafydd
    Harries の了承のもと backtrace に関する Debian wiki の内容を拡張
    して使いました。

    既に上記で触れた項目を除く現在の "Debian リファレンス (第2.143版)
    " (2026-07-10 14:59:15 UTC) の内容はほとんど私自身の仕事です。こ
    れらはコントリビュータ−によっても更新されています。

    "Debian リファレンス (第1版)" は、角田慎一さんがすべて日本語訳し
    ました。

    "Debian リファレンス (第2版)" は、英文原著者の青木修自身がすべて
    を日本語訳しました。その際に "Debian リファレンス (第1版)" から内
    容が比較的変更されていない「第1章 GNU/Linux チュートリアル」等で
    は、角田さんの旧訳文を青木が文体や内容を調整した上で一部再利用さ
    せて頂きました。

    著者である青木修は本文書を世に送ることにご助力戴いた皆様に感謝い
    たします。

A.3. 文書のフォーマット

    英語の元文書のソースは現在 DocBook XML ファイルで書かれています。
    この Docbook XML ソースは HTML やプレーンテキストや PostScript や
    PDF に変換されます。 (一部書式は頒布時にスキップされるかもしれま
    せん。)

