Debian リファレンス [FAMILY Given] 製作著作 © 2013-2024 Osamu Aoki (青木 修) 本 Debian リファレンス (第2.125版) (2024-11-15 13:32:55 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. 古いユーザーの設定との非互換性 2.6.4. 重複するファイルを持つ相異なるパッケージ 2.6.5. 壊れたパッケージスクリプトの修正 2.6.6. dpkg コマンドを使っての救済 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. Systemd 3.2.1. Systemd init 3.2.2. Systemd login 3.3. カーネルメッセージ 3.4. システムメッセージ 3.5. システム管理 3.6. 他のシステムモニター 3.7. システム設定 3.7.1. ホスト名 3.7.2. ファイルシステム 3.7.3. ネットワークインターフェースの初期化 3.7.4. クラウドシステムの初期化 3.7.5. sshd サービスを調整するカスタム化例 3.8. udev システム 3.9. カーネルモジュール初期化 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. 日本語の例 8.3. ディスプレー出力 8.4. 東アジア不明瞭文字幅文字 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.5.11. システムのセキュリティーと整合性のチェック 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とエンジンパッケージのリスト 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.125版) (2024-11-15 13:32:55 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. ポプコン ポプコンのデーターは各パッケージの客観的人気の指標として提示され     います。それがダウンロードされた日付は 2024-03-03 11:51:37 UTC で 、 198687 を越すバイナリーパッケージ数と 27 のアーキテクチャーに またがる 237734 つの提出レポートからなります。 注記     amd64 の不安定版 unstable アーカイブは現在高々 74165 つのパッケー ジしか含まないことを承知下さい。ポプコンデーターは多くの旧式設置 システムからのレポートを含みます。 "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、 …) を確 保しましょう 5. 新規ユーザーへの引用文     新規ユーザーを啓蒙する Debian のメーリングリストで見つけた興味深 い引用文を記します。 * "This is Unix. It gives you enough rope to hang yourself." 「 これは Unix です。首を括るのに十分なロープをあてがってくれま すよ。」 --- Miquel van Smoorenburg     * "Unix IS user friendly... It's just selective about who its friends are." 「 Unix はユーザーフレンドリー ( 使う人に優し い) です... 誰にフレンドリー ( 優しく) にするかの人見知りする だけです。」 --- Tollef Fog Heen     ウイキペディアの "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:50, |1542 |テキストモードの全画面ファイルマネージャ| | |I:209 | |ー | |---------+------+-----+----------------------------------------| |sudo |V:688,|6550 |ユーザーに限定的な root 権限を与えるプロ| | |I:841 | |グラム | |---------+------+-----+----------------------------------------| | |V:95, | |Unix テキストエディター Vi IMproved (改 | |vim |I:369 |3743 |良版 Vi)、プログラマーのためのテキストエ|     | | | |ディター (標準版) | |---------+------+-----+----------------------------------------| | |V:58, | |Unix テキストエディター Vi IMproved (改 | |vim-tiny |I:975 |1722 |良版 Vi)、プログラマーのためのテキストエ| | | | |ディター (軽量版) | |---------+------+-----+----------------------------------------| |emacs-nox|V:4, |39647|GNU プロジェクト Emacs、Lisp に基づく拡 | | |I:16 | |張可能なテキストエディター | |---------+------+-----+----------------------------------------| |w3m |V:15, |2837 |テキストモード WWW ブラウザー | | |I:187 | | | |---------+------+-----+----------------------------------------| |gpm |V:10, |521 |テキストコンソール上の Unix 式のカットア| | |I:12 | |ンドペースト (daemon) | +---------------------------------------------------------------+     いくつかの参考資料を読むのも良いことです。 表1.2 有用な文書パッケージのリスト +---------------------------------------------------------------+ | パッケージ |ポプコ|サイ | 説明 | | | ン | ズ | | |--------------------+------+-----+-----------------------------| |doc-debian |I:867 |187 |Debian プロジェクトの文書、 | | | | |(Debian FAQ) 他 | |--------------------+------+-----+-----------------------------| |debian-policy |I:14 |4659 |Debian ポリシーマニュアルと関|     | | | |連文書 | |--------------------+------+-----+-----------------------------| |developers-reference|V:0, |2601 |Debian 開発者のためのガイドラ| | |I:5 | |インと情報 | |--------------------+------+-----+-----------------------------| |debmake-doc |I:0 |11701|Debian メンテナ向けガイド | |--------------------+------+-----+-----------------------------| |debian-history |I:0 |4692 |Debian プロジェクトの歴史 | |--------------------+------+-----+-----------------------------| |debian-faq |I:865 |790 |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 を追記します。     * 以下のいずれか一つを使い設定を適用します。 + コールドリブートとログイン。(最適選択肢) + "kill -TERM -1" を実行し、"systemctl restart NetworkManager.service" 等のような何らかの修正操作をしま す。 + 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 システム上では一種のファイルでし     かありません。CD-ROM や USB メモリースティックのようなデバイスを ユーザーアカウントからアクセスするのに問題があった場合にはそのユ ーザーを該当するグループのメンバーにします。     いくつかのシステムが供給するグループはそのメンバーに root 権限無 しに特定のファイルやデバイスにアクセスすることを可能にします。 表1.7 ファイルアクセスのためにシステムが供給する特記すべきグルー プのリスト +---------------------------------------------------------------+ |グルー | アクセスできるファイルやデバイスの説明 | | プ | | |-------+-------------------------------------------------------| |dialout|シリアルポート ("/dev/ttyS[0-3]") への全面的かつ直接の | | |アクセス | |-------+-------------------------------------------------------| |dip |信頼できるピアーにダイヤルアップ IP 接続をするためのシ | | |リアルポートへの制限付きアクセス | |-------+-------------------------------------------------------|     |cdrom |CD-ROM や DVD+/-RW のドライバー | |-------+-------------------------------------------------------| |audio |音声デバイス | |-------+-------------------------------------------------------| |video |映像デバイス | |-------+-------------------------------------------------------| |scanner|スキャナー | |-------+-------------------------------------------------------| |adm |システムモニターのログ | |-------+-------------------------------------------------------| |staff |下級管理業務のためのディレクトリー: "/usr/local"、"/ | | |home" | +---------------------------------------------------------------+ ヒント モデムの設定をしたりどこにでも電話したり等するには dialout グルー     プに所属する必要があります。もし信頼できるピアーに関する事前定義 された設定ファイル "/etc/ppp/peers/" が root によって作られている と、dip グループに属するだけで pppd(8) や pon(1) や poff(1) コマ ンドを用いてダイヤルアップ IP 接続が作成できます。     いくつかのシステムが供給するグループはそのメンバーに root 権限無 しに特定のコマンドを実行することを可能にします。 表1.8 特定コマンド実行のためにシステムが供給する特記すべきグルー プのリスト +---------------------------------------------------------------+ |グルー | 実行可能なコマンド | | プ | |     |-------+-------------------------------------------------------| |sudo |パスワード無しに sudo を実行 | |-------+-------------------------------------------------------| |lpadmin|プリンターのデーターベースからプリンターを追加や変更や | | |削除するコマンドを実行 | +---------------------------------------------------------------+ システムが供給するユーザーやグループの完全なリストは、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 ドメインソケッ トです。 ヒント     "netstat -an" を実行すると特定のシステム上のソケットの全般状況が よく分かります。 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.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:838,|7175|はい |Bash: GNU Bourne Again SHell | | |I:999 | | |(デファクトスタンダード) | |---------------+------+----+-----+-----------------------------| |bash-completion|V:32, |1454|N/A |bash シェルのプログラム可能な| | |I:933 | | |コンプリーション | |---------------+------+----+-----+-----------------------------| |dash |V:884,|191 |はい |Debian の Almquist シェル、シ| | |I:997 | | |ェルスクリプトに好適 | |---------------+------+----+-----+-----------------------------| |zsh |V:40, |2463|はい |Z shell: 多くの拡張された標準| | |I:73 | | |シェル | |---------------+------+----+-----+-----------------------------| |tcsh |V:6, |1355|いい |TENEX C Shell: 拡張バージョン|     | |I:20 | |え |の Berkeley csh | |---------------+------+----+-----+-----------------------------| |mksh |V:6, |1579|はい |Korn シェルの1バージョン | | |I:11 | | | | |---------------+------+----+-----+-----------------------------| |csh |V:1, |339 |いい |OpenBSD の C シェル、Berkeley| | |I:6 | |え |csh の派生 | |---------------+------+----+-----+-----------------------------| | |V:0, | | |組み込みコマンド付きの独立シ | |sash |I:5 |1157|はい |ェル (標準の "/usr/bin/sh" に| | | | | |は不向き) | |---------------+------+----+-----+-----------------------------| |ksh |V:1, |61 |はい |真の AT&T バージョンの Korn | | |I:10 | | |シェル | |---------------+------+----+-----+-----------------------------| |rc |V:0, |178 |いい |AT&T Plan 9 の rc シェルの実 | | |I:1 | |え |装 | |---------------+------+----+-----+-----------------------------| |posh |V:0, |190 |はい |ポリシー準拠の通常のシェル | | |I:0 | | |(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 - |一つ前のディレクトリーにディレクトリーを変更 | |-----------+---------------------------------------------------| ||"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" によって環境変数を設定 できます。     * gdm3 のようなディスプレーマネージャーはGUIセッション向けの環 境変数を "~/.profile" を使って再設定します。 * ユーザー特定のプログラム初期化は "~/.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) を参照下さい。     例えば、次を試してみて下さい:     $ foo $ exec 3bar # 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). + pcregrep パッケージの pcregrep(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 < 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 パッケージ管理 注記 本章は最新安定版リリースがコード名: bookworm と言う前提で書かれて います。     APT システムのデーターソースは本文書中では集合的にソースリストと 表記されます。これは、"/etc/apt/sources.list" ファイルか、 "/etc/ apt/sources.list.d/*.list" ファイルか、 "/etc/apt/sources.list.d/ *.source" ファイルの中の何処かに定義されます。 2.1. Debian パッケージ管理の前提条件 2.1.1. Debian パッケージ管理システム Debian は、フリーソフトウェアーのコンパイル済みバイナリーパッケー     ジからなる整合性あるディストリビューションを作り、そのアーカイブ を通じてそれらを頒布するボランティア組織です。 Debian のアーカイブは、HTTP や FTP 法によるアクセスされるための多     くのリモートのミラーサイトとして提供されています。それは、CD-ROM/ DVD によっても提供されています。     これら全てのリソースを利用できる現行の Debian パッケージ管理シス テムは Advanced Packaging Tool (APT) です。 Debian のパッケージ管理システムは、適正に使われれば、バイナリーパ     ッケージの整合性ある組み合わせがアーカイブからシステムにインスト ールされるようになっています。現在、amd64 アーキテクチャーでは 74165 つのパッケージが利用できます。 Debian のパッケージ管理システムは、多彩な歴史があり、使用されるフ     ロントエンドのユーザープログラムやバックエンドのアーカイブへのア クセス方法に多くの選択肢があります。現在は以下を推薦します。 * パッケージのインストールや削除や dist-upgrade を含む全ての対 話的コマンドライン操作を提供する、apt(8)。 * スクリプトから Debian のパッケージ管理をするためによぶ、     apt-get(8)。(古い Debian システム等で)apt が使えない際の控え のオプション。 * インストールされたパッケージを管理したり、使用可能なパッケー ジを探索するためのインタラクティブなテキストインターフェース を提供する、aptitude(8) 表2.1 Debian のパッケージ管理ツールのリスト +---------------------------------------------------------------+ | パッケージ |ポプコ|サイ| 説明 | | | ン | ズ | | |-------------------+------+----+-------------------------------| |dpkg |V:912,|6388|Debian のための低水準パッケージ| | |I:999 | |管理システム(ファイルベース) | |-------------------+------+----+-------------------------------| | |V:865,| |CLI でパッケージを管理する APT | |apt |I:999 |4318|フロントエンド: apt/apt-get/ | | | | |apt-cache | |-------------------+------+----+-------------------------------| | | | |フルスクリーンコンソール中でイ | |aptitude |V:48, |4389|ンタラクティブにパッケージを管 | | |I:253 | |理する APT フロントエンド: | | | | |aptitude(8) | |-------------------+------+----+-------------------------------| | |V:34, | |選択されたタスクをインストール | |tasksel |I:980 |347 |する APT フロントエンド: | | | | |tasksel(8) | |-------------------+------+----+-------------------------------| | |V:182,| |セキュリティー更新の自動インス | |unattended-upgrades|I:278 |301 |トールを可能にする APT の拡張パ| | | | |ッケージ |     |-------------------+------+----+-------------------------------| |gnome-software |V:153,|3085|GNOME用のソフトウェアーセンター| | |I:263 | |(GUI APT フロントエンド) | |-------------------+------+----+-------------------------------| |synaptic |V:46, |7627|グラフィカルなパッケージマネー | | |I:375 | |ジャー (GTK APT フロントエンド)| |-------------------+------+----+-------------------------------| | | | |APT ユーティリティープログラム:| |apt-utils |V:379,|1065|apt-extracttemplates(1) と | | |I:998 | |apt-ftparchive(1) と | | | | |apt-sortpkgs(1) | |-------------------+------+----+-------------------------------| |apt-listchanges |V:358,|398 |パッケージ変更履歴の通知ツール | | |I:872 | | | |-------------------+------+----+-------------------------------| |apt-listbugs |V:6, |477 |APT による各インストール前にク | | |I:8 | |リチカルバグをリストする | |-------------------+------+----+-------------------------------| | |V:17, | |APT パッケージ探索ユーティリテ | |apt-file |I:67 |89 |ィー -- コマンドラインインター | | | | |フェース | |-------------------+------+----+-------------------------------| |apt-rdepends |V:0, |39 |パッケージの依存関係を再帰的に | | |I: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 スイーツに該当するコードネーム (bookworm が 安定版 stable であるリリース期間の場合"trixie") をソースリス ト中に設定します。 * メジャースイートリリースの約一ヶ月後に自分自身で状況を確認し た後でソースリストの中のこのコードネームを新しいコードネーム に手動で更新します。Debian user と developer のメーリングリス トもこれに関する良好な情報源です。 非安定版 unstable スイーツを使うことは推奨できません。非安定版 unstable スイーツは開発者としてパッケージのデバグには好適ですが、     普通のデスクトップ使用ではあなたを不要なリスクに晒してしまいます 。Debian システムの非安定版 unstable スイーツは、ほぼいつも非常に 安定に見えるとはいえ、過去パッケージ上の問題をいくつか経験して来 てるし、その一部は簡単には解決できないものでした。     Debian パッケージのバグからの早急かつ簡単な復元を確実にするいくつ かの予防策のアイデアです。 * Debian システムの安定版 stable スイーツを別のパーティションに インストールし、システムをヂュアルブータブル化 * レスキューブートのためのインストール用 CD を手元に確保     * apt-listbugs をインストールしてアップグレードの前に Debian バ グトラッキングシステム (BTS) をチェックを考慮 * 問題回避するのに十分なだけのパッケージシステムの基盤を学習 注意     これらの予防策の何れもできないなら、テスト版 testing や不安定版 unstable スイーツを使うのには、きっとあなたは準備不足です。 2.1.5. Debian アーカイブの基本 ヒント     Debian アーカイブの正式のポリシーは Debian ポリシーマニュアル、第 2章 - Debian アーカイブに規定されています。     Debian アーカイブをシステムユーザーの視点から見てみます。     システムユーザーから見ると、Debian アーカイブは APT システムを用 いてアクセスされます。     APT システムは、そのデーターソースをソースリストとして指定し、そ れは sources.list(5) に説明されています。     典型的 HTTP アクセスを使う bookworm システムに関する一行スタイル のソースリストは以下です: deb http://deb.debian.org/debian/ bookworm main non-free-firmware contrib non-free deb-src http://deb.debian.org/debian/ bookworm main non-free-firmware contrib non-free     deb http://security.debian.org/debian-security bookworm-security main non-free-firmware contrib non-free deb-src http://security.debian.org/debian-security bookworm-security main non-free-firmware contrib non-free     これに代わりうる、deb822スタイルの等価なソースリストは以下です。 Types: deb deb-src URIs: http://deb.debian.org/debian/ Suites: bookworm Components: main non-free-firmware contrib non-free     Types: deb deb-src URIs: http://security.debian.org/debian-security/ Suites: bookworm-security Components: main non-free-firmware contrib non-free     ソースリストの要点は以下です。 * 一行スタイル様式 + その定義ファイルは "/etc/apt/sources.list" ファイルと "/ etc/apt/sources.list.d/*.list" ファイルです。 + 各行は APT システムのデーターソースを定義します。 + "deb" 行がバイナリーパッケージのための定義です。 + "deb-src" 行がソースパッケージのための定義です。 + 一番目の引数は、Debian アーカイブの root URL です。 + 二番目の引数は、スイーツ名かコード名のどちらかで与えられ るディストリビューション名です。 + 三番目以下の引数は、Debian アーカイブの中の有効なアーカイ ブのエリア名のリストです。     * deb822スタイル様式 + その定義ファイルは "/etc/apt/sources.list.d/*.source" フ ァイルです。 + 空行で分離されている複数行の各ブロックは APT システムのデ ーターソースを定義します。 + "Types:" スタンザは"deb" や "deb-src" といったタイプのリ ストを定義します。 + The "URIs:" スタンザは Debian アーカイブのルート URI のリ ストを定義します。 + "Suites:" スタンザはスイート名かコードネームのいずれかを 用いてディストリビューションのリストを定義します。 + "Components:" スタンザは Debian アーカイブの中の有効なア ーカイブのエリア名のリストを定義します。 ソース関連のメタデーターにアクセスしない aptitude のためだけなら     "deb-src" 行は安全に省略することができます。こうするとアーカイブ のメタデーターの更新速度が向上します。     URL は "https://", "http://", "ftp://", "file://", … のいずれも可 能です。     "#" で始まる行はコメントで無視されます。 上記で、次期安定版 stable がリリースされて驚かされ無いように、私     はスイート名の "stable" や "testing" でなくコード名の "bookworm" や "trixie" を使います。 ヒント     もし上記の例で "bookworm" ではなく "sid" が使われる場合には、 "deb: http://security.debian.org/ ..." 行やそのdeb822相当の内容は ソースリストには不要です。これは"sid" (不安定版 unstable) には、 セキュリティー更新のアーカイブが存在しないからです。     次は、bookworm リリース後の設定ファイル中に用いられる Debian アー カイブサイトの URL とスイーツ名もしくはコード名です。 表2.2 Debian アーカイブサイトのリスト +---------------------------------------------------------------------------------------------+ | アーカイブの URL | スイート名 | コードネーム | レポジトリーの用途 | |-------------------+-----------------------+-------------------------+-----------------------| |http:// | | |徹底的な確認後の擬似静 | |deb.debian.org/ |stable |bookworm |的 stable (安定版)リリ | |debian/ | | |ース | |-------------------+-----------------------+-------------------------+-----------------------| |http:// | | |適度の確認と短い待機後 | |deb.debian.org/ |testing |trixie |の動的 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|bookworm-proposed-updates|イントリリース用の更新 | |debian/ | | |(任意) | |-------------------+-----------------------+-------------------------+-----------------------| | | | |タイムゾーンデーターの | |http:// | | |ような緊急更新が必要な | |deb.debian.org/ |stable-updates |bookworm-updates |stable-proposed-updates| |debian/ | | |スイートの部分集合 (任 | | | | |意) | |-------------------+-----------------------+-------------------------+-----------------------| |http:// | | |主に testing リリースか| |deb.debian.org/ |stable-backports |bookworm-backports |ら再コンパイルされたパ | |debian/ | | |ッケージのランダムな集 | | | | |合 | |-------------------+-----------------------+-------------------------+-----------------------| |http:// | | |stable リリース用のセキ| |security.debian.org|stable-security |bookworm-security |ュリティーアップデート | |/debian-security/ | | |(重要) | |-------------------+-----------------------+-------------------------+-----------------------| |http:// | | |セキュリティーチームに | |security.debian.org|testing-security |trixie-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 |72806|DFSG に完全準拠し、non-free のパッケー | | | |ジに非依存 (main = 主要) | |-----------------+-----+---------------------------------------|     | | |DFSG 非コンプライアント、合理的なシステ| |non-free-firmware|39 |ムインステレーション経験のために必要な | | | |ファームウエアー | |-----------------+-----+---------------------------------------| |contrib |356 |DFSG に完全準拠だが、non-free のパッケ | | | |ージに依存有り (contrib = 寄与) | |-----------------+-----+---------------------------------------| |non-free |964 |DFSG に非準拠で non-free-firmware に含 | | | |まれない | +---------------------------------------------------------------+ ここで、上記にあるパッケージ数は amd64 アーキテクチャーに関する数     字です。main エリアのアーカイブのみが Debian システムです(「 Debian は 100% フリーソフトウェアーです」を参照下さい)。     Debian アーカイブの構成は、各アーカイブの URL の後ろに dists か pool をつけた URL にブラウザーを向ければ学習できます。 ディストリビューションは、スイーツとコード名の2つの方法で言及され     ます。この他にディストリビューションと言う言葉は多くの文書でスイ ーツの同義語としても使われています。スイーツとコード名の関係は以 下のようにまとめられます。 表2.4 スイーツとコード名の関係 +---------------------------------------------------------------+ | タイミング |スイーツ = 安定|スイーツ = テス |スイーツ = 不安定| | | 版 stable | ト版 testing | 版 unstable | |------------+---------------+----------------+-----------------|     |bookworm リ |コード名 = |コード名 = |コード名 = sid | |リース後 |bookworm |trixie | | |------------+---------------+----------------+-----------------| |trixie リリ |コード名 = |コード名 = forky|コード名 = sid | |ース後 |trixie | | | +---------------------------------------------------------------+     コード名の歴史は、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-10)     * ポプコン: 投票やインストールの数が多い * 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{bookworm,trixie,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 リリースが bookworm の期間中の、安定版 stable から     テスト版 testing や不安定版 unstable にアップグレードするには、「 Debian アーカイブの基本」にあるソースリスト例の "bookworm" を "trixie" か "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 等には特別な配慮が必要でした。     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 レベルのパッケージ選択状態情報| | /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. 依存関係の欠落により失敗したインステレーション 依存パッケージをインストールせず"sudo dpkg -i ..." でパッケージを     強制インストールした場合、パッケージのインストールは部分インスト ールとなり失敗します。     APT システムか "sudo dpkg -i ..." を使って全ての依存パッケージを すべきです。     そして、全ての部分的にインストールされたパッケージを以下のコマン ドで設定します。     # dpkg --configure -a 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. 古いユーザーの設定との非互換性 もしデスクトップ GUI プログラムが上流の大きなバージョンアップグレ ードの後に不安定性を経験した際には、そのプログラムが作った古いロ     ーカル設定ファイルとの干渉を疑うべきです。もし新規作成したユーザ ーアカウントでそのプログラムが安定なら、この仮説が裏付けられます 。(これはパッケージングのバグで、通常パッケージャーによって回避さ れます。) 安定性を復元するには、対応するローカル設定ファイルを移動し GUI プ     ログラムを再スタートします。後日設定情報を復元するために古い設定 ファイルの内容を読む必要があるかもしれません。(あまり慌てて消去し ないようにしましょう。) 2.6.4. 重複するファイルを持つ相異なるパッケージ 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.5. 壊れたパッケージスクリプトの修正 パッケージスクリプト内のコマンドが何らかの理由でエラーを返しスク リプトがエラーで終了した場合には、パッケージ管理システムは動作を     途中終了するので部分的にインストールされたパッケージのある状況が 生まれます。パッケージがその削除スクリプト内にバグを持つ場合には 、パッケージが削除不能になりうるので大変厄介です。     "パッケージ名" のパッケージスクリプトの問題に関しては、以下のパッ ケージスクリプトの内容を確認するべきです。 * "/var/lib/dpkg/info/パッケージ名.preinst" * "/var/lib/dpkg/info/パッケージ名.postinst"     * /var/lib/dpkg/info/パッケージ名.prerm * "/var/lib/dpkg/info/パッケージ名.prerm"     スクリプトの問題原因部分を以下のようなテクニックを使い root から 編集します。 * 行頭に "#" を挿入し問題行を無効にします     * 行末に "|| true" を挿入し強制的に成功をリターンします     そして、「壊れたシステムからの復元」の通りにします。 2.6.6. dpkg コマンドを使っての救済 dpkg は非常に低レベルのパッケージツールなのでネットワーク接続もな     いブート不能な非常に劣悪な状況下でも機能します。foo パッケージが 壊れていて置き換える必要があると仮定します。 バグの無い古いバージョンの foo パッケージが "/var/cache/apt/ archives/" にあるパッケージキャッシュの中に見つかるかもしれません     。(ここにみつからなければ、https://snapshot.debian.org/ アーカイ ブからダウンロードしたり、機能している機器のパッケージキャッシュ からコピーできます。)     もしブート不可能な場合には、以下のコマンドを使ってインストールす ることもできます。     # dpkg -i /path/to/foo_old_version_arch.deb ヒント     システムがそれほど壊れていないなら、「緊急ダウングレード」に書か れているようにして、より高レベルの APT システムを通じてシステム全 体をダウングレードする手もあります。     ハードディスクからブートできない場合は、他の方法でのブート方法を 考えるべきです。 1. Debian インストーラー (debian-installer) の CD を使ってレスキ ューモードでブートします。     2. ブートできないハードディスク上のシステムを "/target" にマウン トします。 3. 古いバージョンの foo パッケージを以下のようにしてインストール します。     # dpkg --root /target -i /path/to/foo_old_version_arch.deb     この例は、たとえハードディスク上の dpkg コマンドが壊れていても機 能します。 ヒント     ハードディスク上の別のシステムであれ、GNU/Linux のライブ CD であ れ、ブート可能な USB キードライブであれ、ネットブートであれ、どの ように起動された GNU/Linux システムでも同様にして壊れたシステムを 救済するのに使えます。 もしこの方法でパッケージをインストールしようとして何らかの依存関 係違反のためにうまくいかなくてどうしようもなくなった場合には、     dpkg の "--ignore-depends" や "--force-depends" や他のオプション を使って依存関係をオーバーライドすることができます。こうした場合 には、後で適正な依存関係を修復するように真剣に取り組む必要があり ます。詳細は dpkg(8) を参照下さい。 注記     システムがひどく壊れた場合には、システムを安全な場所に完全バック アップし (「バックアップと復元」を参照下さい)、クリーンインストー ルを実行するべきです。こうすることは時間の節約でもあり最終的に良 い結果に結びつきます。 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. パッケージ管理のヒント     簡単のため、本セクション中のソースリスト例はbookworm リリース後の 1行スタイルの "/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 リリースが bookworm の期間中の "bookworm-updates") や backports.debian.org アーカイブがあります。     これらのアーカイブを使うには、以下に示すように "/etc/apt/ preferences" ファイル中に全ての必要なアーカイブをリストします。 deb http://deb.debian.org/debian/ bookworm main non-free-firmware contrib non-free     deb http://security.debian.org/debian-security bookworm-security main non-free-firmware contrib non-free deb http://deb.debian.org/debian/ bookworm-updates main non-free-firmware contrib non-free deb http://deb.debian.org/debian/ bookworm-backports main non-free-firmware contrib non-free "/etc/apt/preferences" ファイル中に Pin-Priority 値を明示的に設定 する必要はありません。より新しいパッケージが利用可能となった場合     はいつも、デフォルトの設定によりもっとも合理的なアップグレードが なされます (「アーカイブレベルの "Release" ファイル」参照下さい) 。 * 全てのインストールされている古いパッケージが bookworm-updates からのより新しいパッケージにアップグレードされます。     * bookworm-backports からインストールしされた古いパッケージのみ が bookworm-backports からのより新しいパッケージにアップグレ ードされます。 "package-name" という名前のパッケージをその依存関係ともども     bookworm-backports アーカイブからインストールしたい時には、"-t" オプションでターゲットリリースを切り替えながら以下のコマンドを使 います。     $ sudo apt-get install -t bookworm-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/ bookworm-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/ trixie 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 アーカイブ専用のプロキシツールのリスト +---------------------------------------------------------------+ | パッケージ |ポプ|サイ| 説明 | | |コン| ズ | | |-------------+----+----+---------------------------------------| | |V:0,| |Debian アーカイブファイルのキャッシュプ| |approx |I:0 |7124|ロキシサーバー (コンパイルされた OCaml |     | | | |プログラム) | |-------------+----+----+---------------------------------------| |apt-cacher |V:0,|266 |Debian パッケージとソースファイルのキャ| | |I:0 | |ッシュプロキシ (Perl プログラム) | |-------------+----+----+---------------------------------------| | |V:4,| |ソフトウェアーパッケージの頒布ためのキ | |apt-cacher-ng|I:4 |1816|ャッシュプロキシ (コンパイルされた 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|ブートロ| 説明 | | |コン | ズ | | ーダー | | |--------------+-----+----+------+--------+---------------------| | | | | | |ディスクパーティショ | | | | |サポー|GRUB |ンや vfat や ext4 等 | |grub-efi-amd64|I:339|184 |ト |UEFI |のファイルシステムを | | | | | | |理解するぐらいスマー | | | | | | |トです。(UEFI) | |--------------+-----+----+------+--------+---------------------| | | | | | |ディスクパーティショ | | |V:21,| |サポー| |ンや vfat や ext4 等 | |grub-pc |I:634|557 |ト |GRUB 2 |のファイルシステムを | | | | | | |理解するぐらいスマー | | | | | | |トです。(BIOS) | |--------------+-----+----+------+--------+---------------------| | | | | | |GRUB 2 のブート可能な| |grub-rescue-pc|V:0, |6625|サポー|GRUB 2 |レスキューイメージ | | |I:0 | |ト | |(CD とフロッピー) (PC|     | | | | | |/BIOS バージョン) | |--------------+-----+----+------+--------+---------------------| | | | | | |ISO9660 ファイルシス | |syslinux |V:3, |344 |サポー|Isolinux|テムを理解します。ブ | | |I:36 | |ト | |ート CD に使われてい | | | | | | |ます。 | |--------------+-----+----+------+--------+---------------------| | | | | | |MSDOS ファイルシステ | |syslinux |V:3, |344 |サポー|Syslinux|ム (FAT) 理解します。| | |I:36 | |ト | |ブートフロッピーで使 | | | | | | |われます。 | |--------------+-----+----+------+--------+---------------------| | |V:0, | |サポー| |新しいシステムが | |loadlin |I:0 |90 |ト |Loadlin |FreeDOS/MSDOS システ | | | | | | |ムから起動されます。 | |--------------+-----+----+------+--------+---------------------| | | | | | |MSDOS の MBR を代替す| | |V:0, | |非サポ|Neil |るフリーソフトウェア | |mbr |I:4 |47 |ート |Turton |ーです。ディスクパー | | | | | |の MBR |ティションを理解する | | | | | | |だけです。 | +---------------------------------------------------------------+ 警告     grub-rescue-pc パッケージのイメージから作ったブート可能なレスキュ ーメディア (CD かフロッピー) 無しにブートローダーを試してはいけま せん。これさえあると、ハードディスク上に機能するブートローダーが 無くともシステムのブートができます。 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 イメージパス | | +---------------------------------------------------------------+ ヒント     "/boot/grub/grub.cfg" 中の quiet を除くことでカーネルブートログを 見えるようにできます。恒久的変更をするには、"/etc/default/grub" 中の "GRUB_CMDLINE_LINUX_DEFAULT="quiet"" 行を編集して下さい。 ヒント     "/etc/default/grub" 中の GRUB_BACKGROUND 変数をイメージファイル指 すように設定するか、 "/boot/grub/" 中にイメージファイル自体を置く ことで、GRUB のスプラシュイメージをカスタマイズできます。     "info grub" と grub-install(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:860,| |並行処理のためのイベント依存の| |systemd |I:966 |11168|init(8) デーモン (sysvinit 代 | | | | |替) | |-------------------+------+-----+------------------------------| |cloud-init |V:3, |2870 |インフラストラクチャークラウド| | |I:5 | |インスタンス用の初期化システム| |-------------------+------+-----+------------------------------| | |V:832,| |systemd で sysvinit を置換する| |systemd-sysv |I:964 |80 |のに必要な、マニュアルページと| | | | |リンク | |-------------------+------+-----+------------------------------| |init-system-helpers|V:699,|130 |sysvinit と systemd 間を切り替| | |I:974 | |える補助ツール | |-------------------+------+-----+------------------------------| |initscripts |V:33, |198 |システムの始動と停止のためのス| | |I:133 | |クリプト | |-------------------+------+-----+------------------------------| |sysvinit-core |V:4, |361 |System-V 的な init(8) ユーティ| | |I:5 | |リティー |     |-------------------+------+-----+------------------------------| |sysv-rc |V:66, |88 |System-V 的なランレベル変更メ | | |I:145 | |カニズム | |-------------------+------+-----+------------------------------| |sysvinit-utils |V:897,|102 |System-V 的なユーティリティー | | |I:999 | |(startpar(8)、bootlogd(8)、…) | |-------------------+------+-----+------------------------------| |lsb-base |V:634,|12 |Linux Standard Base 3.2 の | | |I:675 | |init スクリプト機能 | |-------------------+------+-----+------------------------------| | |V:88, | |LSB init.d スクリプト依存関係 | |insserv |I:144 |132 |を使いブート順序を整理するツー| | | | |ル | |-------------------+------+-----+------------------------------| |kexec-tools |V:1, |316 |kexec(8) リブートのための | | |I:6 | |kexec ツール (ワームリブート) | |-------------------+------+-----+------------------------------| |systemd-bootchart |V:0, |131 |ブートプロセスのパーフォンマン| | |I:0 | |スアナライザー | |-------------------+------+-----+------------------------------| |mingetty |V:0, |36 |コンソール専用 getty(8) | | |I:2 | | | |-------------------+------+-----+------------------------------| |mgetty |V:0, |315 |インテリジェントモデム用の代替| | |I:0 | |getty(8) | +---------------------------------------------------------------+ ヒント     ブートプロセスを高速化する最新のティップは Debian wiki: BootProcessSpeedup を参照下さい。 3.2. Systemd 3.2.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.2.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.3. カーネルメッセージ     コンソールに表示されるカーネルのエラーメッセージは、その閾値て設 定できる。     # 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.4. システムメッセージ 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.5. システム管理     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.6. 他のシステムモニター     以下は、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.7. システム設定 3.7.1. ホスト名 カーネルがシステムのホスト名を維持管理します。 systemd-hostnamed.service により起動されたシステム unit が "/etc/     hostname" に保存された名前を使ってブート時にホスト名を設定します 。このファイルには、完全修飾ドメイン名ではなく、システムのホスト 名のみが含まれているべきです。     現在のホスト名を確認するには、hostname(1) を引数無しで実行します 。 3.7.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.7.3. ネットワークインターフェースの初期化 systemd下の現代的な Debian デスクトップ環境では、ネットワークイン     ターフェースは、lo が "networking.service" で、他のインターフェー スが "NetworkManager.service" で典型的には初期化されます。     どのように設定するのかは 5章ネットワークの設定を参照下さい。. 3.7.4. クラウドシステムの初期化 クラウドシステムインスタンス "Debian オフィッシャルクラウドイメー ジ" とか類似のイメージのクローンとしてローンチされるかもしれませ ん。そのようなシステムインスタンスの場合、ホスト名やファイルシス テムやネットワーキングやロケールや SSH キーやユーザーとかグループ     とかは cloud-init や netplan.io パッケージが提供する機能を使って 、オリジナルのシステムイメージ中に置かれたファイルとかそのローン チ時に供給される外部データー等の複数のデーターソースを用いて設定 されます。これらのパッケージは YAML データーを使った宣言的なシス テム設定を可能にします。 詳しくは "Debian とその系統でのクラウドコンピューティング"や     "Cloud-init ドキュメンテーション"や「クラウドのための現代的なネッ トワーク設定」を参照下さい。 3.7.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.8. 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.9. カーネルモジュール初期化 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" ファイルに対する機能と同様の機能がありますが、実際には使われてい ません。 注記     もし "authoptionalpam_group.so" 行が "/etc/pam.d/common-auth" に 書き加えれ、"/etc/security/group.conf" に対応する設定がされていれ ば、実際のユーザーのグループメンバーシップは動的に割り当てられま す。pam_group(8) を参照下さい。 注記     base-passwd パッケージはユーザーとグループに関する権威のあるリス トが含まれます: "/usr/share/doc/base-passwd/ users-and-groups.html"。 4.2. アカウントとパスワードの情報管理     アカウント情報管理のための重要コマンドを記します。 表4.3 アカウント情報を管理するコマンドのリスト +---------------------------------------------------------------+ | コマンド | 機能 | |----------------+----------------------------------------------| |getent passwd |"user_name" のアカウント情報の閲覧 | |user_name | | |----------------+----------------------------------------------| |getent shadow |"user_name" のシャドーされたアカウント情報の閲| |user_name |覧 |     |----------------+----------------------------------------------| |getent group |"group_name" のグループ情報の閲覧 | |group_name | | |----------------+----------------------------------------------| |passwd |アカウントのパスワード管理 | |----------------+----------------------------------------------| |passwd -e |アカウントのアクティベーションのために一回だけ| | |使えるパスワードの設定 | |----------------+----------------------------------------------| |chage |パスワードのエージング情報管理 | +---------------------------------------------------------------+     一部機能が機能するには root 権限が必要な場合があります。パスワー ドとデーターの暗号化は crypt(3) を参照下さい。 注記     Debian が提供する 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:25, |387 |mkpasswd |crypt(3) ライブラリーの充実しす| | |I:251 | | |ぎたフロントエンド | |-------+--------+----+---------+-------------------------------| |openssl|V:841, |2111|openssl |パスワードハッシュの計算 | | |I:995 | |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:889,|984 |差し替え可能な認証モジュール | | |I:999 | |(基本サービス) | |-------------------+------+-----+------------------------------| | |V:0, | |LDAP インターフェースを可能に | |libpam-ldap |I:6 |249 |する差し替え可能な認証モジュー| | | | |ル | |-------------------+------+-----+------------------------------| |libpam-cracklib |V:0, |117 |cracklib のサポートを可能にす | | |I:8 | |る差し替え可能な認証モジュール| |-------------------+------+-----+------------------------------| | |V:571,| |logind のために登録ユーザーセ | |libpam-systemd |I:936 |627 |ッションを登録するプラガブルオ| | | | |ーセンティケーション (PAM) | |-------------------+------+-----+------------------------------| |libpam-doc |I:0 |152 |差し替え可能な認証モジュール | | | | |(html と text の文書) |     |-------------------+------+-----+------------------------------| | |V:917,| |GNU C ライブラリー: "ネームサ | |libc6 |I:999 |12988|ービススイッチ" も提供する共有| | | | |ライブラリー | |-------------------+------+-----+------------------------------| |glibc-doc |I:8 |3503 |GNU C ライブラリー: マンページ| |-------------------+------+-----+------------------------------| | | | |GNU C ライブラリー: info と | |glibc-doc-reference|I:4 |13841|pdf と html フォーマットでのリ| | | | |ファレンスマニュアル | | | | |(non-free) | |-------------------+------+-----+------------------------------| |libnss-mdns |I:510 |141 |マルチキャスト DNS を使った名 | | | | |前解決のための NSS モジュール | |-------------------+------+-----+------------------------------| |libnss-ldap |I:5 |265 |LDAP をネームサービスとして使 | | | | |う NSS モジュール | |-------------------+------+-----+------------------------------| | | | |LDAP をネームサービスとして使 | |libnss-ldapd |I:15 |129 |う NSS モジュール (libnss-ldap| | | | |の新たなフォーク) | +---------------------------------------------------------------+ * 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-ldap と libnss-ldap パッケージで提供され る PAM と NSS を使うことで Debian システムにアカウント情報を提供     します。この実現ためにはいくつかの設定が必要です (著者は本設定を 使っていないため、以下の情報は完全に二次情報です。ご理解の上お読 み下さい。)。 * スタンドアローンの LDAP デーモンである slapd(8) 等のプログラ ムを実行することで集中化された LDAP サーバーを設置します。 * デフォールトの "pam_unix.so" に代えて "pam_ldap.so" を使うに は "/etc/pam.d/" ディレクトリー中の PAM 設定ファイルを変更し ます。 + Debian では、"/etc/pam_ldap.conf" をlibpam-ldap の設定フ ァイル、"/etc/pam_ldap.secret" を root のパスワードを保存 するファイルとして使っています。 * デフォールト ("compat" または "file") に代えて "ldap" を使う には "/etc/nsswitch.conf" ファイル中の NSS 設定を変更します。     + Debian では、"/etc/libnss-ldap.conf" をlibnss-ldap の設定 ファイルとして使っています。 * パスワードのセキュリティー確保のために libpam-ldap が SSL (も しくは TLS) 接続を使うよう設定しなければいけません。 * LDAP のネットワークオーバーヘッドのコストは掛かりますが、デー タの整合性確保のために libnss-ldap が SSL (もしくは TLS) 接続 を使うように設定できます。 * LDAP のネットワークトラフィックを減少させるために LDAP サーチ 結果を一時保持するための nscd(8) をローカルで走らせるべきです 。 libpam-doc パッケージで提供される pam_ldap.conf(5) や "/usr/share     /doc/libpam-doc/html/" や glibc-doc パッケージで提供される "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, |110 |小さなポートノックのデーモン knockd |     | |I:2 | |(1) とクライアント konck(1) | |-------------+------+----+-------------------------------------| |fail2ban |V:98, |2126|複数回の認証エラーを発生させる IP を | | |I:111 | |使用禁止にします | |-------------+------+----+-------------------------------------| |libpam-shield|V:0, |115 |パスワード推測によるリモートからの攻 | | |I:0 | |撃者を締め出す | +---------------------------------------------------------------+ 4.6.4. root パスワードのセキュリティー確保     あなたの機器に第三者が root 権限を持ってアクセスするのを阻止する には、以下のアクションが必要です。 * ハードディスクへの物理的アクセスを阻止 * UEFI/BIOS をロックして、リムーバブルメディアからのブートを阻     止 * GRUB のインタラクティブセッションのパスワードを設定 * GRUB のメニュー項目編集に施錠     ハードディスクへの物理的アクセスがあれば、パスワードをリセットす ることは以下の手順を使うと比較的簡単です。 1. ハードディスクを CD からブート可能な UEFI/BIOS のついた PC に 移動します。 2. レスキューメディア (Debian ブートディスク、Knoppix CD、GRUB CD、…) でシステムをブートします。     3. ルートパーティションを読出し / 書込みアクセスでマウントします 。 4. ルートパーティションの "/etc/passwd" を編集し、root アカウン トの2番目の項目を空にします。 grub-rescue-pc のブート時に GRUB のメニュー項目を編集可能 (「2段     目: ブートローダー」を参照下さい) なら、以下の手順を使えてさらに 簡単です。 1. カーネルパラメーターを "root=/dev/hda6 rw init=/bin/sh" のよ うな感じに変更してシステムをブートします。     2. "/etc/passwd" を編集し、root アカウントの2番目の項目を空にし ます。 3. システムをリブートします。     これで、システムの root シェルにパスワード無しに入れるようになり ました。 注記 root シェルにアクセスさえできれば、システム上の全てにアクセスでき システム上のどのパスワードでもリセットできます。さらに。john とか     crack パッケージ (「システムのセキュリティーと整合性のチェック」 を参照下さい) のようなブルートフォースのパスワードクラッキングツ ールを使ってすべてのユーザーアカウントのパスワードが破られるかも しれません。こうして破られたパスワードは他のシステムへの侵入を引 き起こしかねません。 この様な懸念を回避できる唯一の合理的なソフトウェアー的解決法は、 dm-crypt と initramfs (「データー暗号化ティップ」参照下さい) をつ     かう、ソフトウェアー暗号化されたルートパーティション (もしくは "/ etc" パーティション) を使うことです。でも、パスワードがシステムの ブート毎に必要になってしまいます。 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:392,|15542|設定::NM |(デーモン): ネッ| | |I:459 | | |トワークを自動管| | | | | |理 | |---------------------+------+-----+---------------+----------------| | |V:121,| | |NetworkManager | |network-manager-gnome|I:369 |5583 |設定::NM |(GNOME フロント | | | | | |エンド) | |---------------------+------+-----+---------------+----------------| | | | | |Netplan (生成 | | | | | |器): | | | | | |NetworkManager | |netplan.io |V:1, |319 |設 |と | | |I:5 | |定::NM+networkd|systemd-networkd| | | | | |バックエンド用の| | | | | |統一的で宣言的な| | | | | |インターフェース| |---------------------+------+-----+---------------+----------------| | | | | |ネットワークを接| | |V:608,| | |続したり切断した| |ifupdown |I:979 |199 |設定::ifupdown |りする標準化され| | | | | |たツール (Debian| | | | | |特定) | |---------------------+------+-----+---------------+----------------| |isc-dhcp-client |V:217,|2875 |設定::低レベル |DHCP クライアン | | |I:981 | | |ト | |---------------------+------+-----+---------------+----------------| |pppoeconf |V:0, |186 |設定::ヘルパー |PPPoE コネクショ| | |I:5 | | |ンの設定ヘルパー| |---------------------+------+-----+---------------+----------------| | | | | |WPA と WPA2 | |wpasupplicant |V:353,|3862 |設定::ヘルパー |(IEEE 802.11i) | | |I:513 | | |のためのクライア| | | | | |ントサポート | |---------------------+------+-----+---------------+----------------| | |V:0, | | |wpa_supplicant | |wpagui |I:1 |774 |設定::ヘルパー |の Qt GUI クライ| | | | | |アント | |---------------------+------+-----+---------------+----------------| | |V:179,| | |Linux のワイヤレ| |wireless-tools |I:244 |292 |設定::ヘルパー |ス拡張を操作する| | | | | |ツール | |---------------------+------+-----+---------------+----------------| | |V:34, | | |Linux のワイヤレ| |iw |I:475 |302 |設定::ヘルパー |スデバイスを設定| | | | | |するツール | |---------------------+------+-----+---------------+----------------| | | | | |iproute2、IPv6 | |iproute2 |V:736,|3606 |設定::iproute2 |や他の高度なネッ| | |I:972 | | |トワーク設定: ip| | | | | |(8) や tc(8) 等 | |---------------------+------+-----+---------------+----------------| | | | | |パケットフィルタ| |iptables |V:319,|2414 |設定::Netfilter|ーと NAT のため | | |I:718 | | |の管理ツール | | | | | |(Netfilter) | |---------------------+------+-----+---------------+----------------| | | | | |パケットフィルタ| | | | | |ーと NAT のため | |nftables |V:106,|182 |設定::Netfilter|の管理ツール | | |I:701 | | |(Netfilter) | | | | | |({ip,ip6,arp,eb}| | | | | |tables の後継) | |---------------------+------+-----+---------------+----------------| | | | | |ホスト名か IP ア| | | | | |ドレスによってリ| |iputils-ping |V:194,|122 |テスト |モートホストのネ| | |I:997 | | |ットワークからの| | | | | |到達性をテスト | | | | | |(iproute2) |     |---------------------+------+-----+---------------+----------------| | | | | |ARP アドレスによ| | |V:3, | | |って特定されるリ| |iputils-arping |I:36 |50 |テスト |モートホストのネ| | | | | |ットワークからの| | | | | |到達性をテスト | |---------------------+------+-----+---------------+----------------| | |V:2, | | |リモートホストへ| |iputils-tracepath |I:30 |47 |テスト |のネットワークパ| | | | | |スを追跡 | |---------------------+------+-----+---------------+----------------| | |V:95, | | |Ethernet デバイ | |ethtool |I:267 |739 |テスト |ス設定の表示と変| | | | | |更 | |---------------------+------+-----+---------------+----------------| | | | | |リモートホストへ| |mtr-tiny |V:5, |156 |テスト::低レベ |のネットワークパ| | |I:46 | |ル |スを追跡するツー| | | | | |ル (curses) | |---------------------+------+-----+---------------+----------------| | | | | |リモートホストへ| | |V:4, | |テスト::低レベ |のネットワークパ| |mtr |I:41 |209 |ル |スを追跡するツー| | | | | |ル (curses と | | | | | |GTK) | |---------------------+------+-----+---------------+----------------| | |V:0, | |テスト::低レベ |共通のネットワー| |gnome-nettool |I:17 |2492 |ル |ク情報操作のため| | | | | |のツール (GNOME)| |---------------------+------+-----+---------------+----------------| | | | | |ネットワークマッ| |nmap |V:25, |4498 |テスト::低レベ |パー / ポートス | | |I:199 | |ル |キャナー (Nmap、| | | | | |コンソール) | |---------------------+------+-----+---------------+----------------| | | | | |ネットワークトラ| |tcpdump |V:17, |1340 |テスト::低レベ |フィックアナライ| | |I:175 | |ル |ザー (Tcpdump、 | | | | | |コンソール) | |---------------------+------+-----+---------------+----------------| | | | | |ネットワークトラ| |wireshark |I:45 |10417|テスト::低レベ |フィックアナライ| | | | |ル |ザー (Wireshark | | | | | |、GTK) | |---------------------+------+-----+---------------+----------------| | | | | |ネットワークトラ| |tshark |V:2, |400 |テスト::低レベ |フィックアナライ| | |I:25 | |ル |ザー (コンソー | | | | | |ル) | |---------------------+------+-----+---------------+----------------| | |V:0, | |テスト::低レベ |tcpdump の出力か| |tcptrace |I:2 |401 |ル |ら接続状況のまと| | | | | |めを作成 | |---------------------+------+-----+---------------+----------------| | |V:0, | |テスト::低レベ |柔軟なネットワー| |snort |I:0 |2203 |ル |ク侵入検知システ| | | | | |ム (Snort) | |---------------------+------+-----+---------------+----------------| | |V:0, | |テスト::低レベ |ネットワークの使| |ntopng |I:1 |15904|ル |用状況をウェッブ| | | | | |ブラウザーで表示| |---------------------+------+-----+---------------+----------------| | | | | |BIND によって提 | | | | | |供されるネットワ| |dnsutils |V:16, |276 |テスト::低レベ |ーククライアン | | |I:280 | |ル |ト: nslookup(8) | | | | | |と nsupdate(8) | | | | | |と dig(8) | |---------------------+------+-----+---------------+----------------| | | | | |ネームサーバーの| |dlint |V:0, |53 |テスト::低レベ |閲覧で DNS のゾ | | |I:3 | |ル |ーン情報をチェッ| | | | | |ク | |---------------------+------+-----+---------------+----------------| |dnstracer |V:0, |59 |テスト::低レベ |DNS サーバーをそ| | |I:1 | |ル |の源流まで追跡 | +-------------------------------------------------------------------+ 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 foo netdev 2. "/etc/network/interfaces" の設定を以下のようにできるだけ簡単     にします。 auto lo iface lo inet loopback 3. 以下のようにして NM を再起動します。 $ sudo systemctl restart network-manager 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 |パケットフィルターの確認 | |--------------------+------------------------------------------| |netstat -a |オープンポートの発見 | |--------------------+------------------------------------------| |netstat -l --inet |聴取中のポートの発見 | |--------------------+------------------------------------------| |netstat -ln --tcp |聴取中の TCP ポートの発見 (数字) | |--------------------+------------------------------------------| |dlint example.com |"examle.com" の DNS ゾーン情報を確認 | +---------------------------------------------------------------+ ヒント     これらの低レベルネットワーク設定ツールは "/usr/sbin/" 中にありま す。"/usr/sbin/ifconfig" 等のような完全コマンドパスを使うか、 "~ /.bashrc" 中の "$PATH" リストに "/usr/sbin" を追加する必要がある かもしれません。 5.6. ネットワークの最適化     一般的なネットワークの最適化は本書の射程外です。ここでは消費者用 の接続に関する課題にのみ触れます。 表5.5 ネットワーク最適化ツールのリスト +---------------------------------------------------------------+ |パッケー |ポプコ |サイ| 説明 | | ジ | ン | ズ | | |---------+-------+----+----------------------------------------| |iftop |V:7, |93 |ネットワークインターフェースの帯域利用情| | |I:100 | |報を表示 | |---------+-------+----+----------------------------------------| |iperf |V:3, |360 |インターネットプロトコルのバンド幅測定ツ| | |I:43 | |ール | |---------+-------+----+----------------------------------------| |ifstat |V:0, |60 |インターフェース統計モニター | | |I:7 | | | |---------+-------+----+----------------------------------------| |bmon |V:1, |144 |可搬型バンド幅モニター兼速度推定機 |     | |I:18 | | | |---------+-------+----+----------------------------------------| |ethstatus|V:0, |40 |ネットワークデバイスのスループットを迅速| | |I:3 | |に測定するスクリプト | |---------+-------+----+----------------------------------------| |bing |V:0, |80 |経験則的確率バンド幅試験ソフト | | |I:0 | | | |---------+-------+----+----------------------------------------| |bwm-ng |V:1, |95 |簡単軽量のコンソール式のバンド幅モニター| | |I:13 | | | |---------+-------+----+----------------------------------------| |ethstats |V:0, |23 |コンソール式のイーサーネット統計モニター| | |I:0 | | | |---------+-------+----+----------------------------------------| |ipfm |V:0, |82 |帯域分析ツール | | |I:0 | | | +---------------------------------------------------------------+ 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:106,| |パケットフィルターと NAT のための管| |nftables |I:701 |182 |理ツール (Netfilter) | | | | |({ip,ip6,arp,eb}tables の後継) | |---------------+------+----+-----------------------------------| | |V:319,| |netfilter の管理ツール(IPv4 用の | |iptables |I:718 |2414|iptables(8)、IPv6 用の ip6tables | | | | |(8)) | |---------------+------+----+-----------------------------------| |arptables |V:0, |100 |netfilter の管理ツール(ARP 用の | | |I:1 | |arptables(8)) | |---------------+------+----+-----------------------------------| |ebtables |V:14, |276 |netfilter の管理ツール(Ethernet ブ | | |I:29 | |リッジング用の ebtables(8)) | |---------------+------+----+-----------------------------------| |iptstate |V:0, |119 |netfilter の状態を常時モニター (top| | |I:2 | |(1) と類似) | |---------------+------+----+-----------------------------------| | |V:55, | |Uncomplicated Firewall (UFW) | |ufw |I:77 |859 |netfilter ファイアーウォールの管理 | | | | |プログラム | |---------------+------+----+-----------------------------------|     |gufw |V:5, |3660|Uncomplicated Firewall (UFW) 用のグ| | |I:10 | |ラフィカルユーザーインターフェース | |---------------+------+----+-----------------------------------| | |V:11, | |firewalld はネットワークゾーンをサ | |firewalld |I:16 |2613|ポートする動的管理ファイアーウォー | | | | |ルプログラム | |---------------+------+----+-----------------------------------| |firewall-config|V:0, |1163|firewalld 用のグラフィカルユーザー | | |I:3 | |インターフェース | |---------------+------+----+-----------------------------------| |shorewall-init |V:0, |88 |Shoreline ファイアーウォール初期化 | | |I:0 | | | |---------------+------+----+-----------------------------------| |shorewall |V:3, |3090|Shoreline ファイアーウォール、 | | |I:8 | |netfilter 設定ファイル生成システム | |---------------+------+----+-----------------------------------| | |V:0, | |Shoreline ファイアーウォール、 | |shorewall-lite |I:0 |71 |netfilter 設定ファイル生成システム | | | | |(軽装備バージョン) | |---------------+------+----+-----------------------------------| | |V:0, | |Shoreline ファイアーウォール、 | |shorewall6 |I:1 |1334|netfilter 設定ファイル生成システム | | | | |(IPv6 バージョン) | |---------------+------+----+-----------------------------------| | |V:0, | |Shoreline ファイアーウォール、 | |shorewall6-lite|I:0 |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:35, |234084|X |Chromium、(Google からのオ | | |I:108 | | |ープンオースブラウザー) | |----------------+------+------+----+---------------------------| | | | | |Firefox, (Mozilla からのオ | |firefox |V:10, |239492|, , |ープンソースのブラウザー、 | | |I:15 | | |Debian Unstable でのみ入手 | | | | | |可能) | |----------------+------+------+----+---------------------------| |firefox-esr |V:198,|228981|, , |Firefox ESR, (Firefox 延長 | | |I:435 | | |サポートリリース) | |----------------+------+------+----+---------------------------| |epiphany-browser|V:3, |2154 |, , |GNOME、HIG 準拠、Epiphany | | |I:15 | | | | |----------------+------+------+----+---------------------------| |konqueror |V:24, |25905 |, , |KDE、Konqueror |     | |I:106 | | | | |----------------+------+------+----+---------------------------| |dillo |V:0, |1565 |, , |Dillo, (軽量ブラウザー, | | |I:5 | | |FLTK 準拠) | |----------------+------+------+----+---------------------------| |w3m |V:15, |2837 |テキ|w3m | | |I:187 | |スト| | |----------------+------+------+----+---------------------------| |lynx |V:25, |1948 |, , |Lynx | | |I:344 | | | | |----------------+------+------+----+---------------------------| |elinks |V:3, |1654 |, , |ELinks | | |I:20 | | | | |----------------+------+------+----+---------------------------| |links |V:3, |2314 |, , |Links (テキストのみ) | | |I:28 | | | | |----------------+------+------+----+---------------------------| | |V:1, | |グラ|Links (X を使わないコンソー| |links2 |I:12 |5492 |フィ|ルグラフィクス) | | | | |クス| | +---------------------------------------------------------------+ 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) 注意     偽装されたユーザーエージェント文字列は Java に対して良からぬ副次 効果を引き起こすかもしれません。 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:30, |486 |X GUI プログラム (GNOME3、グループウ| | |I:239 | |エアスイート) | |-----------+-------+------+------------------------------------| |thunderbird|V:48, |224760|X GUI プログラム (GTK、Mozilla |     | |I:119 | |Thunderbird) | |-----------+-------+------+------------------------------------| |kmail |V:38, |23871 |X GUI プログラム (KDE) | | |I:97 | | | |-----------+-------+------+------------------------------------| |mutt |V:16, |7104 |きっと vim とともに使われるキャラク | | |I:149 | |ターターミナルプログラム | |-----------+-------+------+------------------------------------| |mew |V:0, |2319 |(x)emacs の下でキャラクターターミナ | | |I:0 | |ルプログラム | +---------------------------------------------------------------+ 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:217,|1575|Exim4 メール転送エージェント | | |I:227 | |(MTA: Debian のデフォルト) | |------------------+------+----+--------------------------------| |exim4-daemon-heavy|V:6, |1743|Exim4 メール転送エージェント | | |I:6 | |(MTA: 柔軟な代替候補) | |------------------+------+----+--------------------------------| |exim4-base |V:224,|1699|Exim4 文書 (text) と共通ファイル| | |I:234 | | | |------------------+------+----+--------------------------------| |exim4-doc-html |I:1 |3746|Exim4 文書 (html) | |------------------+------+----+--------------------------------| |exim4-doc-info |I:0 |637 |Exim4 文書 (info) | |------------------+------+----+--------------------------------| |postfix |V:124,|4039|Postfix メール転送エージェント | | |I:133 | |(MTA: セキュアな代替候補) | |------------------+------+----+--------------------------------| |postfix-doc |I:6 |4646|Postfix 文書 (html+text) | |------------------+------+----+--------------------------------| |sasl2-bin |V:5, |371 |Cyrus SASL API の実装 (SMTP AUTH| | |I:13 | |について postfix を補完) | |------------------+------+----+--------------------------------| |cyrus-sasl2-doc |I:0 |2154|Cyrus SASL - 文書 |     |------------------+------+----+--------------------------------| |msmtp |V:6, |667 |軽量 MTA | | |I:11 | | | |------------------+------+----+--------------------------------| |msmtp-mta |V:4, |124 |軽量 MTA (msmtp の sendmail 互換| | |I:6 | |性拡張) | |------------------+------+----+--------------------------------| |esmtp |V:0, |129 |軽量 MTA | | |I:0 | | | |------------------+------+----+--------------------------------| |esmtp-run |V:0, |32 |軽量 MTA (esmtp の sendmail 互換| | |I:0 | |性拡張) | |------------------+------+----+--------------------------------| |nullmailer |V:8, |474 |超軽量 MTA、ローカルメール無し | | |I:9 | | | |------------------+------+----+--------------------------------| |ssmtp |V:5, |2 |超軽量 MTA、ローカルメール無し | | |I:8 | | | |------------------+------+----+--------------------------------| |sendmail-bin |V:13, |1901|高機能 MTA (既に慣れている場合) | | |I:13 | | | |------------------+------+----+--------------------------------| |courier-mta |V:0, |2407|超高機能 MTA (ウェブインターフェ| | |I:0 | |ースなど) | |------------------+------+----+--------------------------------| | |V:0, | |パッチの集合の email として送信 | |git-email |I:10 |1087|する 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:866,| | |アーシ | |openssh-client |I:996 |4959|ssh(1) |ェルク | | | | | |ライア | | | | | |ント | |----------------------+------+----+----------------------+-------| | | | | |セキュ | |openssh-server |V:730,|1804|sshd(8) |アーシ | | |I:814 | | |ェルサ | | | | | |ーバー | |----------------------+------+----+----------------------+-------| | | | | |ユーザ | | | | | |ーに | | | | | |ssh-add| | | | | |用のパ | |ssh-askpass |I:23 |102 |ssh-askpass(1) |スフレ | | | | | |ーズを | | | | | |尋ねる | | | | | |(プレー| | | | | |ン X) | |----------------------+------+----+----------------------+-------| | | | | |ユーザ | | | | | |ーに | | | | | |ssh-add|     |ssh-askpass-gnome |V:0, |200 |ssh-askpass-gnome(1) |用のパ | | |I:3 | | |スフレ | | | | | |ーズを | | | | | |尋ねる | | | | | |(GNOME)| |----------------------+------+----+----------------------+-------| | | | | |見た目 | | | | | |良くユ | | | | | |ーザー | | | | | |に | |ssh-askpass-fullscreen|V:0, |48 |ssh-askpass-fullscreen|ssh-add| | |I:0 | |(1) |用のパ | | | | | |スフレ | | | | | |ーズを | | | | | |尋ねる | | | | | |(GNOME)| |----------------------+------+----+----------------------+-------| | | | | |ブラウ | | | | | |ザーア | | | | | |クセス | | | | | |可能な | | | | | |VT100 | | |V:0, | | |ターミ | |shellinabox |I:1 |507 |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-agent(1) と 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 は現     在 Windows XP や Mac OS X 等の他の OS でもサポートされ、新たなク ロスプラットフォームの両方向通信能力のあるリモート印刷のデファク ト標準となっています。 CUPS システムのファイルフォーマット依存の自動変換機能のおかげで、     どんなデーターでも lpr コマンドに供給すると期待される印刷出力が生 成されます。(CUPS では、lpr はcups-bsd パッケージをインストールす ると有効となります。)     Debian システムには、プリントサーバーやユーティリティーで留意すべ きパッケージがいくつかあります。 表6.11 プリントサーバーとユーティリティーのリスト +---------------------------------------------------------------+ | パッケージ |ポプコ|サイ|ポート | 説明 | | | ン | ズ | | | |-------------------------+------+----+-------+-----------------| | |V:2, | |printer|BSD lpr/lpd (ライ| |lpr |I:3 |367 |(515) |ンプリンターデー | | | | | |モン) | |-------------------------+------+----+-------+-----------------| |lprng |V:0, |3051|, , |, , (拡張) | | |I:0 | | | | |-------------------------+------+----+-------+-----------------| |cups |V:97, |1061|IPP |インターネット印 | | |I:441 | |(631) |刷 CUPS サーバー | |-------------------------+------+----+-------+-----------------| | | | | |CUPS 用System V |     | | | | |プリンターコマン | | | | | |ド: lp(1) と | | |V:119,| | |lpstat(1) と | |cups-client |I:461 |426 |, , |lpoptions(1) と | | | | | |cancel(1) と | | | | | |lpmove(8) と | | | | | |lpinfo(8) と | | | | | |lpadmin(8) 等 | |-------------------------+------+----+-------+-----------------| | | | | |CUPS 用BSD プリン| | |V:32, | | |ターコマンド: lpr| |cups-bsd |I:219 |131 |, , |(1) と lpq(1) と | | | | | |lprm(1) と lpc(8)| | | | | |等 | |-------------------------+------+----+-------+-----------------| |printer-driver-gutenprint|V:20, |1219|非該当 |CUPS 用のプリンタ| | |I:114 | | |ードライバー | +---------------------------------------------------------------+ ヒント     CUPS システムはウェッブブラウザーを "http://localhost:631/" に向 けることで設定できます。 6.5. 他のネットワークアプリケーションサーバー     他のネットワークアプリケーションサーバーを次に示します。 表6.12 他のネットワークアプリケーションサーバー +---------------------------------------------------------------+ | パッケージ |ポプコ|サイ|プロト| 説明 | | | ン | ズ | コル | | |-----------------+------+----+------+--------------------------| |telnetd |V:0, |54 |TELNET|TELNET サーバー | | |I:2 | | | | |-----------------+------+----+------+--------------------------| |telnetd-ssl |V:0, |159 |, , |, , (SSL サポート) | | |I:0 | | | | |-----------------+------+----+------+--------------------------| |nfs-kernel-server|V:49, |769 |NFS |Unix 式ファイル共有 | | |I:63 | | | | |-----------------+------+----+------+--------------------------| |samba |V:108,|3995|SMB |Windows のファイルとプリン| | |I:131 | | |ター共有 | |-----------------+------+----+------+--------------------------|     |netatalk |V:1, |2003|ATP |Apple/Mac のファイルとプリ| | |I:1 | | |ンター共有 (AppleTalk) | |-----------------+------+----+------+--------------------------| |proftpd-basic |V:8, |452 |FTP |汎用ファイルダウンロード | | |I:16 | | | | |-----------------+------+----+------+--------------------------| |apache2 |V:214,|561 |HTTP |汎用ウェッブサーバー | | |I:263 | | | | |-----------------+------+----+------+--------------------------| |squid |V:11, |9265|, , |汎用ウェッブプロキシサーバ| | |I:12 | | |ー | |-----------------+------+----+------+--------------------------| |bind9 |V:43, |1124|DNS |他のホストの IP アドレス | | |I:49 | | | | |-----------------+------+----+------+--------------------------| |isc-dhcp-server |V:18, |6082|DHCP |クライアント自身の IP アド| | |I:36 | | |レス | +---------------------------------------------------------------+ コモンインターネットファイルシステムプロトコル (CIFS) はサーバー     メッセージブロック (SMB) と同じプロトコルで Microsoft Windows で 広く使われています。 ヒント     サーバーシステムの統合には、「集中システム管理」を参照下さい。 ヒント ホスト名の解決は通常 DNS サーバーによって提供されます。ホストの     IP アドレスが DHCP によって動的にアサインされる場合には Debian wiki 上のDDNS ページに書かれているようにして bind9 と isc-dhcp-server を使いホスト名解決のためのダイナミック DNS が設定 できます。 ヒント     Debian アーカイブの全内容のローカルのミラーサーバーを使うより、 squid 等のプロキシサーバーを使う方がはるかにバンド幅を節約上では るかに効率的です。 6.6. 他のネットワークアプリケーションクライアント     他のネットワークアプリケーションクライアントを次に示します。 表6.13 他のネットワークアプリケーションクライアント +---------------------------------------------------------------+ | パッケージ |ポプコ|サイ|プロト| 説明 | | | ン | ズ | コル | | |---------------+------+----+------+----------------------------| |netcat |I:27 |16 |TCP/IP|TCP/IP 用万能ツール (スイス | | | | | |陸軍ナイフ) | |---------------+------+----+------+----------------------------| | |V:841,| | |セキュアソケットレイヤー | |openssl |I:995 |2111|SSL |(SSL) のバイナリーと関連する| | | | | |暗号化ツール | |---------------+------+----+------+----------------------------| |stunnel4 |V:7, |548 |, , |万能 SSL ラッパー | | |I:12 | | | | |---------------+------+----+------+----------------------------| |telnet |V:29, |54 |TELNET|TELNET クライアント | | |I:511 | | | | |---------------+------+----+------+----------------------------| |telnet-ssl |V:0, |196 |, , |, , (SSL サポート) | | |I:2 | | | | |---------------+------+----+------+----------------------------| |nfs-common |V:152,|1124|NFS |Unix 式ファイル共有 | | |I:234 | | | | |---------------+------+----+------+----------------------------| |smbclient |V:24, |2071|SMB |MS Windows のファイルとプリ | | |I:204 | | |ンター共有 | |---------------+------+----+------+----------------------------| | |V:29, | | |リモートの MS Windows ファイ| |cifs-utils |I:121 |317 |, , |ルをマウントやアンマウントす| | | | | |るコマンド | |---------------+------+----+------+----------------------------|     |ftp |V:7, |53 |FTP |FTP クライアント | | |I:114 | | | | |---------------+------+----+------+----------------------------| |lftp |V:4, |2361|, , |, , | | |I:30 | | | | |---------------+------+----+------+----------------------------| |ncftp |V:1, |1389|, , |フルスクリーンの FTP クライ | | |I:14 | | |アント | |---------------+------+----+------+----------------------------| |wget |V:208,|3681|HTTP |ウェッブダウンローダー | | |I:981 | |と FTP| | |---------------+------+----+------+----------------------------| |curl |V:185,|517 |, , |, , | | |I:620 | | | | |---------------+------+----+------+----------------------------| |axel |V:0, |224 |, , |加速ダウンローダー | | |I:3 | | | | |---------------+------+----+------+----------------------------| |aria2 |V:3, |1981|, , |BitTorrent と Metalink サポ | | |I:20 | | |ート付き、加速ダウンローダー| |---------------+------+----+------+----------------------------| |bind9-host |V:115,|393 |DNS |bind9 由来の host(1) コマン | | |I:939 | | |ド、"Priority: standard" | |---------------+------+----+------+----------------------------| |dnsutils |V:16, |276 |, , |bind 由来の dig(1) コマンド | | |I:280 | | |、"Priority: standard" | |---------------+------+----+------+----------------------------| |isc-dhcp-client|V:217,|2875|DHCP |IP アドレスの獲得 | | |I:981 | | | | |---------------+------+----+------+----------------------------| |ldap-utils |V:12, |767 |LDAP |LDAP サーバーからデーター獲 | | |I:63 | | |得 | +---------------------------------------------------------------+ 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:198|9 |GNOME デスクトップ環境 | |----------------------------+-----+----+-----------------------| |task-xfce-desktop |I:96 |9 |Xfce デスクトップ環境 | |----------------------------+-----+----+-----------------------| |task-kde-desktop |I:81 |6 |KDE Plasma デスクトップ| | | | |環境 |     |----------------------------+-----+----+-----------------------| |task-mate-desktop |I:43 |9 |MATE デスクトップ環境 | |----------------------------+-----+----+-----------------------| |task-cinnamon-desktop |I:41 |9 |Cinnamon デスクトップ環| | | | |境 | |----------------------------+-----+----+-----------------------| |task-lxde-desktop |I:29 |9 |LXDE デスクトップ環境 | |----------------------------+-----+----+-----------------------| |task-lxqt-desktop |I:18 |9 |LXQt デスクトップ環境 | |----------------------------+-----+----+-----------------------| |task-gnome-flashback-desktop|I:13 |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 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, |187 |GNOME の mutter ウィン| | |I:60 | |ドウマネージャ [自動] | |---------------------------+------+-----+----------------------| |xwayland |V:240,|2388 |wayland 上で実行される|     | |I:319 | |X サーバー [自動] | |---------------------------+------+-----+----------------------| | | | |GNOME のための | |gnome-remote-desktop |V:35, |1068 |PipeWire を使うリモー | | |I:221 | |トデスクトップデーモン| | | | |[自動] | |---------------------------+------+-----+----------------------| |gnome-tweaks |V:21, |1170 |GNOME のための高度な構| | |I:229 | |成設定 | |---------------------------+------+-----+----------------------| |gnome-shell-extension-prefs|V:13, |60 |GNOME シェル拡張を有効| | |I:213 | |化・無効化するツール | +---------------------------------------------------------------+     ここで、"[自動]" は 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:30, |486 |GNOME |個人情報管理 (グループ| | |I:239 | | |ウエアと電子メール) | |-------------------+------+------+------+----------------------| |thunderbird |V:48, |224760|GTK |Eメールクライアント | | |I:119 | | |(Mozilla Thunderbird) | |-------------------+------+------+------+----------------------| |kontact |V:1, |2208 |KDE |個人情報管理 (グループ| | |I:12 | | |ウエアと電子メール) | |-------------------+------+------+------+----------------------| |libreoffice-writer |V:117,|31474 |LO |ワードプロセッサ | | |I:435 | | | | |-------------------+------+------+------+----------------------| |abiword |V:1, |3542 |GNOME |ワードプロセッサ | | |I:8 | | | | |-------------------+------+------+------+----------------------| |calligrawords |V:0, |6097 |KDE |ワードプロセッサ | | |I:7 | | | | |-------------------+------+------+------+----------------------| | |V:1, | | |PDF ファイルを編集する| |scribus |I:16 |31345 |KDE |ためのデスクトップパブ| | | | | |リッシング | |-------------------+------+------+------+----------------------| |glabels |V:0, |1338 |GNOME |ラベルエディター | | |I:3 | | | | |-------------------+------+------+------+----------------------| |libreoffice-calc |V:111,|26009 |LO |スプレッドシート | | |I:432 | | | | |-------------------+------+------+------+----------------------| |gnumeric |V:4, |9910 |GNOME |スプレッドシート | | |I:14 | | | | |-------------------+------+------+------+----------------------| |calligrasheets |V:0, |11396 |KDE |スプレッドシート | | |I:5 | | | | |-------------------+------+------+------+----------------------| |libreoffice-impress|V:69, |2646 |LO |プレゼンテーション | | |I:429 | | | | |-------------------+------+------+------+----------------------| |calligrastage |V:0, |5339 |KDE |プレゼンテーション | | |I:5 | | | | |-------------------+------+------+------+----------------------| |libreoffice-base |V:26, |5003 |LO |データーベース管理 | | |I:121 | | | | |-------------------+------+------+------+----------------------| |kexi |V:0, |7118 |KDE |データーベース管理 | | |I:1 | | | | |-------------------+------+------+------+----------------------| |libreoffice-draw |V:72, |10312 |LO |ベクトル画像エディター| | |I:430 | | |(ドロー) | |-------------------+------+------+------+----------------------| |inkscape |V:15, |99800 |GNOME |ベクトル画像エディター| | |I:112 | | |(ドロー) | |-------------------+------+------+------+----------------------| |karbon |V:0, |3610 |KDE |ベクトル画像エディター| | |I:6 | | |(ドロー) | |-------------------+------+------+------+----------------------| |dia |V:2, |3741 |GTK |フローチャートやダイア| | |I:22 | | |グラムエディター | |-------------------+------+------+------+----------------------|     |gimp |V:50, |19304 |GTK |ビットマップ画像エディ| | |I:252 | | |ター (ペイント) | |-------------------+------+------+------+----------------------| |shotwell |V:17, |6263 |GTK |デジタル写真オーガナイ| | |I:255 | | |ザー | |-------------------+------+------+------+----------------------| |digikam |V:1, |293 |KDE |デジタル写真オーガナイ| | |I:9 | | |ザー | |-------------------+------+------+------+----------------------| |darktable |V:4, |30554 |GTK |写真家のためのライトボ| | |I:13 | | |ックスと暗室 | |-------------------+------+------+------+----------------------| |planner |V:0, |1394 |GNOME |プロジェクト管理 | | |I:4 | | | | |-------------------+------+------+------+----------------------| |calligraplan |V:0, |19013 |KDE |プロジェクト管理 | | |I:2 | | | | |-------------------+------+------+------+----------------------| |gnucash |V:2, |28928 |GNOME |個人会計 | | |I:8 | | | | |-------------------+------+------+------+----------------------| |homebank |V:0, |1218 |GTK |個人会計 | | |I:2 | | | | |-------------------+------+------+------+----------------------| |lilypond |V:0, |16092 |- |音楽用タイプセッター | | |I:7 | | | | |-------------------+------+------+------+----------------------| |kmymoney |V:0, |13937 |KDE |個人会計 | | |I:2 | | | | |-------------------+------+------+------+----------------------| |librecad |V:1, |8963 |Qt ア |コンピューター支援設計| | |I:15 | |プリ |(CAD) システム (2D) | |-------------------+------+------+------+----------------------| |freecad |I:18 |36 |Qt ア |コンピューター支援設計| | | | |プリ |(CAD) システム (3D) | |-------------------+------+------+------+----------------------| |kicad |V:3, |236461|GTK |電気回路図と PCB デザ | | |I:14 | | |インソフトウェアー | |-------------------+------+------+------+----------------------| |xsane |V:12, |2339 |GTK |スキャナーのフロントエ| | |I:144 | | |ンド | |-------------------+------+------+------+----------------------| |libreoffice-math |V:51, |1898 |LO |数式エディター | | |I:432 | | | | |-------------------+------+------+------+----------------------| |calibre |V:6, |63385 |KDE |e-book コンバーターと | | |I:28 | | |ライブラリーの管理 | |-------------------+------+------+------+----------------------| |fbreader |V:1, |3783 |GTK |e-book リーダー | | |I:9 | | | | |-------------------+------+------+------+----------------------| |evince |V:92, |941 |GNOME |文書 (pdf) ビューワー | | |I:314 | | | | |-------------------+------+------+------+----------------------| |okular |V:40, |17728 |KDE |文書 (pdf) ビューワー | | |I:123 | | | | |-------------------+------+------+------+----------------------| | |V:31, | |純粋な| | |x11-apps |I:463 |2460 |X アプ|xeyes(1) など。 | | | | |リ | | |-------------------+------+------+------+----------------------| | |V:192,| |純粋な|xev(1), xwininfo(1) 等| |x11-utils |I:566 |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:216,| | | | |Cantarell | |fonts-cantarell |I:306 |572 |59 |- |- |(GNOME 3, 画面| | | | | | | |表示) | |-------------------------+------+-----+---+--+--+--------------| | | | | | | |Noto フォント | |fonts-noto |I:153 |31 |61 |63|40|(Google, | | | | | | | |multi-lingual | | | | | | | |with CJK) | |-------------------------+------+-----+---+--+--+--------------| | | | | | | |DejaVu (GNOME | | | | | | | |2, | |fonts-dejavu |I:421 |35 |58 |68|40|MCM:Verdana, | | | | | | | |拡張 Bitstream| | | | | | | |Vera) | |-------------------------+------+-----+---+--+--+--------------| | | | | | | |LibreOffice 用| |fonts-liberation2 |V:130,|15 |56 |60|40|の Liberation | | |I:427 | | | | |フォント (Red | | | | | | | |Hat, MCMATC) | |-------------------------+------+-----+---+--+--+--------------| | | | | | | |Chrome OS: | | |V:20, | | | | |Arimo, Tinos | |fonts-croscore |I:40 |5274 |56 |60|40|と Cousine | | | | | | | |(Google, | | | | | | | |MCMATC) | |-------------------------+------+-----+---+--+--+--------------| | | | | | | |Chrome OS: | |fonts-crosextra-carlito |V:21, |2696 |57 |- |- |Carlito | | |I:131 | | | | |(Google, | | | | | | | |MCM:Calibri ) | |-------------------------+------+-----+---+--+--+--------------| | | | | | | |Chrome OS: | | | | | | | |Caladea | |fonts-crosextra-caladea |I:128 |347 |- |55|- |(Google, |     | | | | | | |MCM:Cambria ) | | | | | | | |(Latin文字の | | | | | | | |み) | |-------------------------+------+-----+---+--+--+--------------| | |V:76, | | | | |GNU FreeFont | |fonts-freefont-ttf |I:218 |14460|57 |59|40|(拡張 URW | | | | | | | |Nimbus) | |-------------------------+------+-----+---+--+--+--------------| | | | | | | |Debian | | |V:123,| | | | |task-desktop, | |fonts-quicksand |I:438 |392 |56 |- |- |Quicksand (画 | | | | | | | |面表示, Latin | | | | | | | |文字のみ) | |-------------------------+------+-----+---+--+--+--------------| | | | | | | |ソースコードの| | |V:24, | | | |40|ためにデザイン| |fonts-hack |I:120 |2508 |- |- |P |されたタイプフ| | | | | | | |ェース Hack | | | | | | | |(Facebook) | |-------------------------+------+-----+---+--+--+--------------| |fonts-sil-gentiumplus |I:32 |14345|- |54|- |Gentium SIL | |-------------------------+------+-----+---+--+--+--------------| |fonts-sil-charis |I:27 |6704 |- |59|- |Charis SIL | |-------------------------+------+-----+---+--+--+--------------| | | | | | | |URW Nimbus | | |V:167,| | | | |(Nimbus Sans, | |fonts-urw-base35 |I:472 |15560|56 |60|40|Roman No. 9 L,| | | | | | | |Mono L, | | | | | | | |MCAHTC) | |-------------------------+------+-----+---+--+--+--------------| |fonts-ubuntu |V:2, |4339 |58 |- |33|Ubuntu フォン | | |I:5 | | | |P |ト (画面表示) | |-------------------------+------+-----+---+--+--+--------------| | |V:0, | | | | |クールなレトロ| |fonts-terminus |I:3 |452 |- |- |33|なターミナルフ| | | | | | | |ォント | |-------------------------+------+-----+---+--+--+--------------| | | | | | | |Microsoft の非| | |V:1, | | | | |フリーフォント| |ttf-mscorefonts-installer|I:49 |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:560, |938 |FreeType フォントラスター化| | |I:997 | |ライブラリー | |---------------------+--------+----+---------------------------| |libfontconfig1 |V:554, |587 |Fontconfig、フォント設定ラ |     | |I:849 | |イブラリー | |---------------------+--------+----+---------------------------| |fontconfig |V:437, |680 |fc-*: Fontconfig の CLI コ | | |I:721 | |マンド | |---------------------+--------+----+---------------------------| |font-manager |V:2, I:8|1022|Font Manager: Fontconfig の| | | | |GUI コマンド | |---------------------+--------+----+---------------------------| |nautilus-font-manager|V:0, I:0|37 |Font ManagerのNautilus拡張 | +---------------------------------------------------------------+ ヒント 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:65, |7499 |の Flatpak アプリケ | | |I:70 | |ーションデプロイメン| | | | |トフレームワーク | |-----------------------------+------+-----+--------------------| | |V:20, | |GNOME ソフトウェアー| |gnome-software-plugin-flatpak|I:29 |254 |への Flatpak サポー | | | | |ト | |-----------------------------+------+-----+--------------------| | |V:67, | |snap パッケージを有 | |snapd |I:70 |60022|効化するデーモンやツ| | | | |ール | |-----------------------------+------+-----+--------------------| |gnome-software-plugin-snap |V:1, |121 |GNOME ソフトウェアー| | |I:2 | |への Snap サポート | |-----------------------------+------+-----+--------------------|     | |V:303,| |Flatpak や Snap デス| |xdg-desktop-portal |I:394 |1936 |クトップインテグレー| | | | |ションポータル | |-----------------------------+------+-----+--------------------| | |V:274,| |gtk 用の | |xdg-desktop-portal-gtk |I:392 |715 |xdg-desktop-portal | | | | |バックエンド (GNOME)| |-----------------------------+------+-----+--------------------| | |V:53, | |Qt 用の | |xdg-desktop-portal-kde |I:72 |1438 |xdg-desktop-portal | | | | |バックエンド (KDE) | |-----------------------------+------+-----+--------------------| | | | |wltools 用の | |xdg-desktop-portal-wlr |V:0, |135 |xdg-desktop-portal | | |I:4 | |バックエンド | | | | |(Wayland) | |-----------------------------+------+-----+--------------------| | | | |AppImage に用いる | |firejail |V:1, |1771 |SUID のセキュリティ | | |I:4 | |ーサンドボックスプロ| | | | |グラム firejail | +---------------------------------------------------------------+     このサンドボックス環境技術はアプリが制御されたリソースアクセス下 で実行されるスマートフォンの OS 上のアプリと非常に似ています。     ウエッブブラウザーのようないくつかの大きな GUI アプリも、より安全 にするために内部的にサンドボックス環境技術を使います。 7.8. リモートデスクトップ 表7.7 特記すべきリモートアクセスサーバーのリスト Wayland プロトコルを使いリモートホスト上で実行されるデスクトップ やアプリへのローカルクライアントからのアクセスは VNC や RDP 経由 の GNOME リモートデスクトップによってサポートされています。 全ての QEMU 仮想マシンのデスクトップ環境へのアクセスは SPICE (the Simple Protocol for Independent Computing Environments) プロトコ ルによってサポートされています。 +---------------------------------------------------------------+ | パッケージ |ポプ |サイ|プロト | 説明 | | |コン | ズ | コル | | |--------------------------+-----+----+-------+-----------------| |gnome-remote-desktop |V:35,|1068|RDP |GNOME Remote | | |I:221| | |Desktop サーバー | |--------------------------+-----+----+-------+-----------------| | | | | |xrdp, リモートデ | |xrdp |V:22,|3202|RDP |スクトッププロト | | |I:24 | | |コル (RDP) サーバ| | | | | |ー | |--------------------------+-----+----+-------+-----------------| | | | | |x11vnc, リモート | |x11vnc |V:6, |2107|RFB |フレームバッファ | | |I:23 | |(VNC) |ープロトコル | | | | | |(VNC) サーバー | |--------------------------+-----+----+-------+-----------------| | | | | |TigerVNC, リモー | |tigervnc-standalone-server|V:4, |2768|RFB |トフレームバッフ | | |I:15 | |(VNC) |ァープロトコル | | | | | |(VNC) サーバー | |--------------------------+-----+----+-------+-----------------|     | |V:0, | |RDP, |GNOME リモートデ | |gnome-connections |I:1 |1356|RFB |スクトップクライ | | | | |(VNC) |アント | |--------------------------+-----+----+-------+-----------------| | | | |RDP, | | | |V:2, | |RFB |Vinagre: GNOME リ| |vinagre |I:68 |4249|(VNC), |モートデスクトッ | | | | |SPICE, |プクライアント | | | | |SSH | | |--------------------------+-----+----+-------+-----------------| | | | |RDP, | | | | | |RFB |Remmina: GTK リモ| |remmina |V:15,|953 |(VNC), |ートデスクトップ | | |I:72 | |SPICE, |クライアント | | | | |SSH, | | | | | |... | | |--------------------------+-----+----+-------+-----------------| | |V:1, | |RDP, |KRDC: KDE リモー | |krdc |I:17 |3873|RFB |トデスクトップク | | | | |(VNC) |ライアント | |--------------------------+-----+----+-------+-----------------| | | | |RDP, |Apache Guacamole:| | |V:0, | |RFB |クライアントレス | |guacd |I:0 |83 |(VNC), |リモートデスクト | | | | |SSH / |ップゲートウェー | | | | |HTML5 |(HTML5) | |--------------------------+-----+----+-------+-----------------| | | | |RFB |仮想マシンマネー | |virt-viewer |V:5, |1284|(VNC), |ジャーのゲスト OS| | |I:52 | |SPICE |の GUI 表示クライ| | | | | |アント | +---------------------------------------------------------------+ 7.9. Xサーバ接続     ローカルホスト上の xwayland も含めた X サーバーにリモートホスト上 のアプリが接続する方法がいくつかあります。 表7.8 X サーバーへの接続方法のリスト +---------------------------------------------------------------+ | パッケージ |ポプコ|サイ| コマンド | 説明 | | | ン | ズ | | | |-----------------+------+----+------------------+--------------| | |V:730,| |X11-forwarding オ |SSH サーバ (セ| |openssh-server |I:814 |1804|プション付きの |キュア) | | | | |sshd | |     |-----------------+------+----+------------------+--------------| |openssh-client |V:866,|4959|ssh -X |SSH クライアン| | |I:996 | | |ト (セキュア) | |-----------------+------+----+------------------+--------------| |xauth |V:165,|81 |xauth |X 認証ファイル| | |I:961 | | |ユーティリティ| |-----------------+------+----+------------------+--------------| |x11-xserver-utils|V:302,|568 |xhost |X のサーバアク| | |I:528 | | |セス制御 | +---------------------------------------------------------------+ 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:9, |55 |X |X 選択のコマンドラインインタ | | |I:42 | | |ーフェース (クリップボード) | |------------+-----+------+-------+-----------------------------|     |xclip |V:12,|62 |X |X 選択のコマンドラインインタ | | |I:63 | | |ーフェース (クリップボード) | |------------+-----+------+-------+-----------------------------| | |V:3, | | |wl-copy wl-paste: Wayland ク | |wl-clipboard|I:14 |162 |Wayland|リップボードへのコマンドライ | | | | | |ンインターフェース | |------------+-----+------+-------+-----------------------------| | |V:10,| |Linux |Linux コンソールのマウスイベ | |gpm |I:12 |521 |コンソ |ントを捉えるデーモン | | | | |ール | | +---------------------------------------------------------------+ 第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. バイナリー形式にコンパイルしたい全ての必要なロケールデーター を選択します。(少なくとも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 メモリーを自動マウントする時のマウントオプションを設定 できます。次回このメモリースティックをマウントする際には 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. キーボード入力 8.2.1. Linux コンソールと X Window 用のキーボードインプット Debian システムは keyboard-configuration と console-setup パッケ     ージを使い多くの国際キーボード配列として機能するように設定できま す。     # dpkg-reconfigure keyboard-configuration # dpkg-reconfigure console-setup Linux コンソールや X Window システムでは、これは "/etc/default/ keyboard" と "/etc/default/console-setup" 内の設定パラメーターを     更新します。これは Linux コンソールのフォントも設定します。多くの 欧州言語で用いられるアクセント付き文字を含めた多くの非 ASCII 文字 はデッドキーや AltGr キーやコンポーズキーを用い提供されます。 8.2.2. Wayland 向けのキーボード入力 Wayland 上の GNOME デスクトップシステムでは、「Linux コンソールと X Window 用のキーボードインプット」は非英語の欧州言語をサポートで きません。IBus がアジア言語のみならず欧州言語もサポートします。     GNOME デスクトップ環境のパッケージ依存関係が "gnome-shell" 経由で "ibus" を推薦します。"ibus" のコードは setxkbmap と XKB オプショ ン機能を統合するように更新されています。多言語キーボード入力には "GNOME Settings" か "GNOME Tweaks" から ibus を設定する必要があり ます。 注記 もし ibus がアクティブな場合、たとえ古典的 X 上のデスクトップ環境     下でも、あなたの setxkbmap による古典的 X キーボード設定は ibus によってオーバーライドされるかもしれません。im-config を使ってイ ンプットメソッドを "None" と設定すると、インストールされた ibus は無効化できます。詳細は、キーボードに関する Debian Wiki を参照下 さい。 8.2.3. IBus を使うインプットメソッドのサポート     GNOME デスクトップ環境が "gnome-shell" 経由で "ibus" を推薦するの で、"ibus" はインプットメソッドの良い選択肢です。     アプリケーションへの多言語入力は以下のように処理されます。 Keyboard Application | ^     | | +-> Linux kernel -> Input method (ibus) -> Gtk, Qt, X, Wayland +-- Engine--+     IBus とそのエンジンパッケージのリストは以下の通りです。 表8.1 IBusとエンジンパッケージのリスト +---------------------------------------------------------------+ | パッケージ |ポプコ|サイ | サポートされたロケール | | | ン | ズ | | |---------------------+------+-----+----------------------------| |ibus |V:198,|1723 |dbus を用いるインプットメソ | | |I:245 | |ッドのフレームワーク | |---------------------+------+-----+----------------------------| |ibus-mozc |V:1, |944 |日本語 | | |I:3 | | | |---------------------+------+-----+----------------------------| |ibus-anthy |V:0, |8856 |, , | | |I:1 | | | |---------------------+------+-----+----------------------------| |ibus-skk |V:0, |242 |, , | | |I:0 | | | |---------------------+------+-----+----------------------------| |ibus-kkc |V:0, |210 |, , | | |I:0 | | | |---------------------+------+-----+----------------------------| |ibus-libpinyin |V:1, |2761 |中国語 (zh_CN 用) | | |I:3 | | | |---------------------+------+-----+----------------------------| |ibus-chewing |V:0, |247 |, , (zh_TW 用) | | |I:0 | | | |---------------------+------+-----+----------------------------| |ibus-libzhuyin |V:0, |40995|, , (zh_TW 用) | | |I:0 | | |     |---------------------+------+-----+----------------------------| |ibus-rime |V:0, |73 |, , (zh_CN/zh_TW 用) | | |I:0 | | | |---------------------+------+-----+----------------------------| |ibus-cangjie |V:0, |119 |, , (zh_HK 用) | | |I:0 | | | |---------------------+------+-----+----------------------------| |ibus-hangul |V:0, |264 |韓国語 | | |I:2 | | | |---------------------+------+-----+----------------------------| |ibus-libthai |I:0 |90 |タイ語 | |---------------------+------+-----+----------------------------| |ibus-table-thai |I:0 |58 |タイ語 | |---------------------+------+-----+----------------------------| |ibus-unikey |V:0, |318 |ベトナム語 | | |I:0 | | | |---------------------+------+-----+----------------------------| |ibus-keyman |V:0, |161 |多言語: 2000 語以上のための | | |I:0 | |Keyman エンジン | |---------------------+------+-----+----------------------------| |ibus-table |V:0, |2176 |IBus 用のテーブルエンジン | | |I:1 | | | |---------------------+------+-----+----------------------------| |ibus-m17n |V:0, |395 |多言語: インド系言語、アラビ| | |I:1 | |ア語、他 | |---------------------+------+-----+----------------------------| | |V:50, | |キーボードインジケーターを含| |plasma-widgets-addons|I:100 |1992 |む Plasma 5 用の追加ウイジェ| | | | |ット | +---------------------------------------------------------------+ 注記 中国語にとっては、"fcitx5" が代替のインプットメソッドフレームワー     クかもしれません。Emacs 愛好家にとっては、"uim" が代替かもしれま せん。いずれの場合でも、im-config で追加の手動設定が必要かもしれ ません。いくつかの古く古典的な "kinput2" のようなインプットメソッ ドが Debian レポジトリー中に依然として存在するかもしれませんが、 現代的な環境ではお薦めできません。 8.2.4. 日本語の例 日本語インプットメソッドを英語環境 ("en_US.UTF-8") 下で起動するの     が非常に便利です。Wayland 環境下で IBus を使ってどう実現したかを 以下に記します。 1. 日本語インプットツールパッケージの ibus-mozc (または ibus-anthy) を im-config 等の推奨 (recommended) されたパッケ ージとともにインストールします。 2. アクティベートされていない場合は "Settings" → "Keyboard" → "Input Sources" → click "+" in "Input Sources" → "Japanese" → "Japanese mozc (or anthy)" を選択し "Add" をクリックします。     3. インプットソースはいくつ選んでも構いません。 4. ユーザーアカウントに再ログインします。 5. GUI ツールバーアイコンを右クリックして各インプットソースを設 定します。 6. インプットソース間を、SUPER-SPACE を用いて切り替えます。 (SUPER は普通 Windows キーです。) ヒント シフト2 が " (ダブルクォーテーションマーク)の刻印のある物理的な日     本語キーボードでアルファベットのみのキーボード環境にアクセスする には、上記の手順で "Japanese" を選びます。シフト2 が @ (アットマ ーク)の刻印のある物理的な US 英語キーボードを "Japanese mozc (も しくは anthy)" を使うと日本語が入力できます。 * 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.4. 東アジア不明瞭文字幅文字 東アジアのロケールでは、箱描画文字やギリシャ文字やキリル文字はあ     なたが望むよりも広い幅で表示されて、ターミナル出力が揃わなくなる かもしれません(Unicode標準附属書 #11 参照)。     この問題は回避可能です: * 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:50, |1542|「ミッドナイトコマンダー (MC)」を参照 | | |I:209 | | | |--------+-------+----+-----------------------------------------| |bsdutils|V:519, |356 |ターミナルセッションの記録を作成する | | |I:999 | |script コマンド | |--------+-------+----+-----------------------------------------| |screen |V:71, |1003|VT100/ANSI ターミナルエミュレーションを使| | |I:230 | |ってのターミナルマルチプレクサ | |--------+-------+----+-----------------------------------------| |tmux |V:43, |1180|代替のターミナルマルチプレクサ (代わりに | | |I:146 | |"Control-B" を用いる) | |--------+-------+----+-----------------------------------------|     |fzf |V:4, |3648|ファジーテキストファインダ | | |I:16 | | | |--------+-------+----+-----------------------------------------| |fzy |V:0, |54 |ファジーテキストファインダ | | |I:0 | | | |--------+-------+----+-----------------------------------------| |rlwrap |V:1, |330 |readline 機能のコマンドラインラッパー | | |I:15 | | | |--------+-------+----+-----------------------------------------| |ledit |V:0, |331 |readline 機能のコマンドラインラッパー | | |I:11 | | | |--------+-------+----+-----------------------------------------| |rlfe |V:0, |45 |readline 機能のコマンドラインラッパー | | |I:0 | | | |--------+-------+----+-----------------------------------------| |ripgrep |V:5, |5152|自動フィルタリング付きのソースコード中の | | |I:19 | |高速再帰文字検索 | +---------------------------------------------------------------+ 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 h nnoremap j nnoremap k silent! nnoremap l """ Window resize nnoremap vertical resize -2 nnoremap resize -2 nnoremap resize +2 nnoremap vertical resize +2 """ Clear hlsearch with ( is mapped as above) nnoremap noh inoremap noh """ center after jump next nnoremap n nzz nnoremap N Nzz """ fast "jk" to get out of INSERT mode () inoremap jk noh """ fast "" to get out of TERM mode (CTRL-\ CTRL-N) tnoremap """ fast "jk" to get out of TERM mode (CTRL-\ CTRL-N) tnoremap jk """ previous/next trouble/quickfix item nnoremap [q cprevious nnoremap ]q cnext """ buffers nnoremap bprevious nnoremap bnext nnoremap [b bprevious nnoremap ]b bnext """ Add undo break-points     inoremap , ,u inoremap . .u inoremap ; ;u """ save file inoremap w xnoremap w nnoremap w snoremap w """ better indenting vnoremap < >gv """ terminal (Somehow under Linux, becomes in Vim) nnoremap terminal "nnoremap terminal """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" if ! has('nvim') """ Toggle paste mode with p for Vim (no need for Nvim) set pastetoggle=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 u inoremap u """ is re-purposed as above """ execute the previous macro recorded with Q nnoremap Q @@ """ repeat last substitute and *KEEP* flags nnoremap & :&& """ search visual selected string for visual mode xnoremap * y/\V" xnoremap # y?\V" 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: and """ \%#\@w nnoremap w :WMToggle 新しいネイティブの 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 システムログアナライザーのリスト +---------------------------------------------------------------+ |パッケージ|ポプコ |サイ| 説明 | | | ン | ズ | | |----------+-------+----+---------------------------------------| |logwatch |V:11, |2328|綺麗な出力の Perl で書かれたログアナラ | | |I:13 | |イザー | |----------+-------+----+---------------------------------------| |fail2ban |V:98, |2126|複数回の認証エラーを発生させる IP を使 | | |I:111 | |用禁止にします | |----------+-------+----+---------------------------------------| |analog |V:3, |3739|ウェッブサーバーのログアナライザー | | |I:96 | | | |----------+-------+----+---------------------------------------| |awstats |V:6, |6928|強力で機能の多いウェッブサーバーのログ | | |I:10 | |アナライザー | |----------+-------+----+---------------------------------------| |sarg |V:1, |845 |squid の分析レポートジェネレター |     | |I:1 | | | |----------+-------+----+---------------------------------------| |pflogsumm |V:1, |109 |Postfix ログ項目サマライザー | | |I:4 | | | |----------+-------+----+---------------------------------------| |fwlogwatch|V:0, |481 |ファイアウォールログアナライザー | | |I:0 | | | |----------+-------+----+---------------------------------------| |squidview |V:0, |189 |squid の access.log ファイルのモニター | | |I:0 | |と分析 | |----------+-------+----+---------------------------------------| |swatch |V:0, |99 |正規表現マッチ、ハイライト、フック機能 | | |I:0 | |付きログファイルビューワー | |----------+-------+----+---------------------------------------| |crm114 |V:0, |1119|制御可能な正規表現切断機とスパムフィル | | |I:0 | |ター (CRM114) | |----------+-------+----+---------------------------------------| |icmpinfo |V:0, |44 |ICMP メッセージの解釈 | | |I:0 | | | +---------------------------------------------------------------+ 注記     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:18, |1134 |Wayland|GNOME 用のスクリーンショ | | |I:173 | | |ットアプリケーション | |----------------+------+-----+-------+-------------------------| |flameshot |V:7, |3364 |Wayland|強化されたスクリーンショ | | |I:15 | | |ットアプリケーション |     |----------------+------+-----+-------+-------------------------| |gimp |V:50, |19304|Wayland|GUI メニュー中のスクリー | | |I:252 | |+ X |ンショット | |----------------+------+-----+-------+-------------------------| |x11-apps |V:31, |2460 |X |xwd(1) | | |I:463 | | | | |----------------+------+-----+-------+-------------------------| |imagemagick |I:317 |74 |X |import(1) | |----------------+------+-----+-------+-------------------------| |scrot |V:5, |131 |X |scrot(1) | | |I:63 | | | | +---------------------------------------------------------------+ 9.3.9. 設定ファイルの変更記録     DVCS の助力で設定ファイルの変更を記録したり、Btrfs の上でシステム のスナップショットを作成したりする専用のツールがあります。 表9.7 設定の履歴を記録するパッケージのリスト +---------------------------------------------------------------+ |パッケー |ポプ |サイ| 説明 | | ジ |コン | ズ | | |---------+-----+----+------------------------------------------| | |V:26,| |Git (デフォールト) か Mercurial か GNU | |etckeeper|I:30 |168 |Bazaar を使って設定ファイルとそのメタデー |     | | | |ターを保存 | |---------+-----+----+------------------------------------------| |timeshift|V:5, |3506|rsync か BTRFS スナップショットを使うシス | | |I:10 | |テム回復ユーティリティー | |---------+-----+----+------------------------------------------| |snapper |V:4, |2392|Linux ファイルシステムスナップショット管理| | |I:5 | |ツール | +---------------------------------------------------------------+     ローカルスクリプト「バックアップのティップ」アプローチも一策です 。 9.4. プログラム活動の監視と制御と起動     プログラム活動は専用ツールを用いて監視と制御できます。 表9.8 プログラム活動の監視と制御のツールのリスト +---------------------------------------------------------------+ |パッケー |ポプコ|サイ | 説明 | | ジ | ン | ズ | | |---------+------+-----+----------------------------------------| |coreutils|V:880,|18307|nice(1): スケジューリングの優先順位の変 | | |I:999 | |更してプログラムを実行 | |---------+------+-----+----------------------------------------| |bsdutils |V:519,|356 |renice(1): 実行中プロセスのスケジューリ | | |I:999 | |ングの優先順位を変更 | |---------+------+-----+----------------------------------------| | |V:766,| |"/proc" ファイルシステムのユーティリティ| |procps |I:999 |2389 |ー: ps(1) と top(1) と kill(1) と watch | | | | |(1) 等 | |---------+------+-----+----------------------------------------| | |V:420,| |"/proc" ファイルシステムのユーティリティ| |psmisc |I:775 |908 |ー: killall(1) と fuser(1) と pstree(1) | | | | |と pstree(1) | |---------+------+-----+----------------------------------------| |time |V:7, |129 |time(1): 時間に関するシステムリソース使 | | |I:132 | |用状況を報告するためにプログラムを実行 | |---------+------+-----+----------------------------------------| |sysstat |V:148,|1904 |sar(1)、iostat(1)、mpstat(1)、…: Linux | | |I:170 | |用のシステムパーフォーマンスツール | |---------+------+-----+----------------------------------------|     |isag |V:0, |109 |sysstat の対話型システム活動グラフ化ソフ| | |I:3 | |ト | |---------+------+-----+----------------------------------------| |lsof |V:422,|482 |lsof(8): "-p" オプションを使い実行中のプ| | |I:945 | |ロセスが開いているファイルをリスト | |---------+------+-----+----------------------------------------| |strace |V:12, |2897 |strace(1): システムコールやシグナルを追 | | |I:119 | |跡 | |---------+------+-----+----------------------------------------| |ltrace |V:0, |330 |ltrace(1): ライブラリーコールを追跡 | | |I:16 | | | |---------+------+-----+----------------------------------------| |xtrace |V:0, |353 |xtrace(1): X11 のクライアントとサーバー | | |I:0 | |の間の通信を追跡 | |---------+------+-----+----------------------------------------| |powertop |V:18, |677 |powertop(1): システムの電力消費情報 | | |I:217 | | | |---------+------+-----+----------------------------------------| |cron |V:872,|244 |cron(8) デーモンからバックグランドでスケ| | |I:995 | |ジュール通りプロセスを実行 | |---------+------+-----+----------------------------------------| |anacron |V:396,|93 |1日24時間動作でないシステム用の cron 類 | | |I:479 | |似のコマンドスケジューラー | |---------+------+-----+----------------------------------------| |at |V:101,|158 |at(1) と batch(1) コマンド: 特定の時間や| | |I:154 | |特定のロードレベル以下でジョブを実行 | +---------------------------------------------------------------+ ヒント     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 3 では: * $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. スタートするプログラムのカスタム化     一部のプログラムは他のプログラムを自動的にスタートします。このプ ロセスをカスタム化する上でのチェックポイントを次に記します。 * アプリケーション設定メニュー: + GNOME3 デスクトップ: "Settings" → "System" → "Details" → "Default Applications" + KDE デスクトップ: "K" → "Control Center" → "KDE Components" → "Component Chooser" + 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 <> $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:249, |213 |Linux PCI ユーティリティー: lspci(8)| | |I:991 | | | |-----------+---------+----+------------------------------------| |usbutils |V:68, |325 |Linux USB ユーティリティー: lsusb(8)| | |I:869 | | | |-----------+---------+----+------------------------------------| |nvme-cli |V:15, |1642|Linux 用の NVMe ユーティリティー: | | |I:22 | |nvme(1) | |-----------+---------+----+------------------------------------|     |pcmciautils|V:6, I:10|91 |Linux のための PCMCIA ユーティリティ| | | | |ー: pccardctl(8) | |-----------+---------+----+------------------------------------| |scsitools |V:0, I:2 |346 |SCSI ハードウエアー管理のためのツー | | | | |ル集: lsscsi(8) | |-----------+---------+----+------------------------------------| |procinfo |V:0, I:9 |132 |"/proc" から得られるシステム情報: | | | | |lsdev(8) | |-----------+---------+----+------------------------------------| |lshw |V:13, |919 |ハードウエアー設定に関する情報: lshw| | |I:89 | |(1) | |-----------+---------+----+------------------------------------| |discover |V:40, |98 |ハードウエアー識別システム: discover| | |I:958 | |(8) | +---------------------------------------------------------------+ 9.5.4. ハードウエアー設定 GNOME や KDE のような現代的な GUI のデスクトップ環境ではほとんど     のハードウエアー設定が付随する GUI 設定ツールを通じて管理できます が、それらの設定の基本的手法を知っておくのは良い事です。 表9.14 ハードウエアー設定ツールのリスト +---------------------------------------------------------------+ | パッケージ |ポプコ|サイ | 説明 | | | ン | ズ | | |-----------------+------+-----+--------------------------------| |console-setup |V:88, |428 |Linux コンソールのフォントとキー| | |I:967 | |テーブルユーティリティー | |-----------------+------+-----+--------------------------------| |x11-xserver-utils|V:302,|568 |X サーバーユーティリティー: xset| | |I:528 | |(1)、xmodmap(1) | |-----------------+------+-----+--------------------------------| | |V:84, | |Advanced Configuration and Power| |acpid |I:148 |158 |Interface (ACPI) によって起こる | | | | |イベントの管理のためのデーモン | |-----------------+------+-----+--------------------------------| |acpi |V:9, |47 |ACPI デバイス上の情報を表示する | | |I:136 | |ユーティリティー | |-----------------+------+-----+--------------------------------| |sleepd |V:0, |86 |非使用状況のときにラップトップを| | |I:0 | |スリープさせるデーモン |     |-----------------+------+-----+--------------------------------| | |V:178,| |ハードディスクアクセスの最適化 (| |hdparm |I:335 |256 |「ハードディスクの最適化」を参照| | | | |下さい) | |-----------------+------+-----+--------------------------------| |smartmontools |V:207,|2358 |S.M.A.R.T. を使ってストレージシ | | |I:250 | |ステムを制御監視 | |-----------------+------+-----+--------------------------------| |setserial |V:4, |103 |シリアルポートの管理ツール集 | | |I:6 | | | |-----------------+------+-----+--------------------------------| |memtest86+ |V:1, |12711|メモリーハードウエアー管理のため| | |I:21 | |のツール集 | |-----------------+------+-----+--------------------------------| |scsitools |V:0, |346 |SCSI ハードウエアー管理のための | | |I:2 | |ツール集 | |-----------------+------+-----+--------------------------------| |setcd |V:0, |37 |コンパクトデバイスアクセス最適化| | |I:0 | | | |-----------------+------+-----+--------------------------------| |big-cursor |I:0 |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. ターミナルの設定     文字コンソールと ncurses(3) システム機能を設定するのはいくつかの 要素があります。 * "/etc/terminfo/*/*" ファイル (terminfo(5))     * "$TERM" 環境変数 (term(7)) * setterm(1)、stty(1)、tic(1)、toe(1) もし xterm 用の terminfo エントリーが非 Debian のxterm でうまく機 能しない場合には、リモートから Debian システムにログインする時に     ターミナルタイプ、"$TERM"、を "xterm" から "xterm-r6" のような機 能限定版に変更します。詳細は "/usr/share/doc/libncurses5/FAQ" を 参照下さい。"dumb" は"$TERM" の最低機能の共通項です。 9.5.7. 音のインフラ 現在の 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:330,|2605|ALSA を設定し使用するユーティリテ| | |I:466 | |ィー | |-----------------+------+----+---------------------------------| |oss-compat |V:1, |18 |ALSA の下で "/dev/dsp not found" | | |I:17 | |エラーを防ぐ OSS 互換性 | |-----------------+------+----+---------------------------------| | |V:265,| |オーディオとビデオ処理エンジンの | |pipewire |I:319 |120 |マルチメディアサーバー - メタパッ| | | | |ケージ | |-----------------+------+----+---------------------------------| | |V:274,| |オーディオとビデオ処理エンジンの | |pipewire-bin |I:319 |1631|マルチメディアサーバー - オーディ| | | | |オサーバーと CLI プログラム | |-----------------+------+----+---------------------------------| | |V:105,| |オーディオとビデオ処理エンジンの | |pipewire-alsa |I:157 |206 |マルチメディアサーバー - ALSA 代 | | | | |替オーディオサーバー |     |-----------------+------+----+---------------------------------| | |V:160,| |オーディオとビデオ処理エンジンの | |pipewire-pulse |I:214 |50 |マルチメディアサーバー - | | | | |PulseAudio 代替オーディオサーバー| |-----------------+------+----+---------------------------------| |pulseaudio |V:256,|6472|PulseAudio サーバー | | |I:308 | | | |-----------------+------+----+---------------------------------| |libpulse0 |V:413,|975 |PulseAudio クライアントライブラリ| | |I:580 | |ー | |-----------------+------+----+---------------------------------| |jackd |V:2, |9 |JACK Audio Connection Kit. (JACK)| | |I:18 | |サーバー (低遅延) | |-----------------+------+----+---------------------------------| |libjack0 |V:1, |326 |JACK Audio Connection Kit. (JACK)| | |I:9 | |ライブラリー (低遅延) | |-----------------+------+----+---------------------------------| |libgstreamer1.0-0|V:429,|4455|GStreamer: GNOME サウンドエンジン| | |I:597 | | | |-----------------+------+----+---------------------------------| |libphonon4qt5-4 |V:72, |594 |Phonon: KDE サウンドエンジン | | |I:162 | | | +---------------------------------------------------------------+ 9.5.8. スクリーンセーバーの無効化     スクリーンセーバーを無効にするには、以下のコマンドを使います。 表9.16 スクリーンセーバーを無効にするコマンドのリスト +---------------------------------------------------------------+ | 環境 | コマンド | |-------------------------------------+-------------------------| |Linux コンソール |setterm -powersave off | |-------------------------------------+-------------------------|     |X Window (スクリーンセーバー消去) |xset s off | |-------------------------------------+-------------------------| |X Window (dpms 無効) |xset -dpms | |-------------------------------------+-------------------------| |X Window (スクリーンセーバーの GUI 設|xscreensaver-command | |定) |-prefs | +---------------------------------------------------------------+ 9.5.9. ブザー音の無効化     PC スピーカーのコネクタを外すとブザー音は確実に無効にできます。 pcspkr カーネルモジュールを削除すると同じ事ができます。     以下のようにすると bash(1) が使う readline(3) プログラムが警告文 字 (ASCII=7) に出会った際にブザー音を発生するのを防げます。     $ echo "set bell-style none">> ~/.inputrc 9.5.10. メモリー使用状況     メモリー使用状況を確認するのに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.11. システムのセキュリティーと整合性のチェック     ダメなシステム管理をするとあなたのシステムを外界からの攻撃にさら すことになるかもしれません。     システムのセキュリティーと整合性のチェックには、以下の事から始め るべきです。 * debsums パッケージ、debsums(1) と「トップレベルの "Release" ファイルと信憑性」を参照下さい。 * chkrootkit パッケージ、chkrootkit(1) 参照下さい。     * clamav パッケージ類、clamscan(1) と freahclam(1) 参照下さい。 * Debian セキュリティー FAQ. * Securing Debian Manual. 表9.18 システムセキュリティーや整合性確認のためのツールリスト +---------------------------------------------------------------+ |パッケージ|ポプ|サイ | 説明 | | |コン| ズ | | |----------+----+-----+-----------------------------------------| |logcheck |V:6,|110 |システムログの異常を管理者にメールするデ | | |I:7 | |ーモン | |----------+----+-----+-----------------------------------------| | |V:5,| |MD5 チェックサムを使ってインストールされ | |debsums |I:35|98 |たパッケージファイルを検証するユーティリ | | | | |ティー | |----------+----+-----+-----------------------------------------| |chkrootkit|V:8,|925 |ルートキット検出ソフト | | |I:17| | | |----------+----+-----+-----------------------------------------| |clamav |V:9,|27455|Unix 用アンチウィルスユーティリティー - | | |I:45| |コマンドラインインターフェース |     |----------+----+-----+-----------------------------------------| |tiger |V:1,|7800 |システムセキュリティーの脆弱性を報告 | | |I:2 | | | |----------+----+-----+-----------------------------------------| |tripwire |V:1,|5016 |ファイルやディレクトリーの整合性チェック | | |I:2 | |ソフト | |----------+----+-----+-----------------------------------------| |john |V:1,|471 |アクティブなパスワードクラッキングツール | | |I:9 | | | |----------+----+-----+-----------------------------------------| |aide |V:1,|293 |先進的進入検出環境 - 静的ライブラリー | | |I:1 | | | |----------+----+-----+-----------------------------------------| |integrit |V:0,|2659 |ファイル整合性確認プログラム | | |I:0 | | | |----------+----+-----+-----------------------------------------| |crack |V:0,|149 |パスワード推定プログラム | | |I:1 | | | +---------------------------------------------------------------+     以下のシンプルなスクリプトを使うと、典型的な間違いの全員書込み可 のファイルパーミッションをチェックできます。     # find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \) 注意     debsums パッケージはローカルに保存された MD5 チェックサムを使うの で、悪意ある攻撃に対抗するセキュリティー監査ツールとしては完全に は信頼できません。 9.6. データー保存のティップ Linux のlive CDs とかレスキューモードで debian-installer CDs であ     なたのシステムをブートすることでブートデバイス上のデーターストレ ージの再設定が簡単にできます。 あるデバイスが GUI デスクトップシステム自動マウントされた場合、そ     れらに操作を加える前に手動でコマンドラインからそのデバイスを umount(8) する必要があるかもしれません。 9.6.1. ディスク空間の利用状況     ディスク空間使用状況は mount と coreutils と xdu パッケージが提供 するプログラムで評価できます: * mount(8) はマウントされたファイルシステム (= ディスク) すべて を報告します。     * df(1) はファイルシステムのディスク空間使用状況を報告します。 * du(1) はディレクトリーツリーのディスク空間使用状況を報告しま す。 ヒント     du(8) の出力を xdu(1x) に "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:881, |5283|fdisk(8) と cfdisk(8) を含む雑多なシス| | |I:999 | |テムユーティリティー | |----------+--------+----+--------------------------------------| |parted |V:417, |122 |GNU Parted ディスクパーティションとリ |     | |I:568 | |サイズのプログラム | |----------+--------+----+--------------------------------------| |gparted |V:15, |2175|libparted ベースの GNOME パーティショ | | |I:102 | |ンエディター | |----------+--------+----+--------------------------------------| |gdisk |V:338, |885 |GPT/MBR ハイブリッドディスク用パーティ| | |I:511 | |ションエディター | |----------+--------+----+--------------------------------------| |kpartx |V:22, |77 |パーティション用のデバイスマッピングを| | |I:33 | |作成するプログラム | +---------------------------------------------------------------+ 注意     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:767,|1499|ext2/ext3/ext4 ファイルシステムのた | | |I:999 | |めのユーティリティー | |--------------+------+----+------------------------------------| |btrfs-progs |V:44, |5078|btrfs ファイルシステムのためのユーテ| | |I:72 | |ィリティー | |--------------+------+----+------------------------------------| |reiserfsprogs |V:12, |473 |Reiserfs ファイルシステムのためのユ | | |I:25 | |ーティリティー | |--------------+------+----+------------------------------------| |zfsutils-linux|V:29, |1762|OpenZFS ファイルシステムのためのユー| | |I:30 | |ティリティー | |--------------+------+----+------------------------------------| | |V:196,| |FAT ファイルシステムのためのユーティ| |dosfstools |I:541 |315 |リティー (Microsoft: MS-DOS, | | | | |Windows) | |--------------+------+----+------------------------------------| | |V:29, | |三星によってメンテナンスされている | |exfatprogs |I:371 |301 |exFAT ファイルシステムのためのユーテ| | | | |ィリティー | |--------------+------+----+------------------------------------|     |exfat-fuse |V:5, |73 |FUSE によるexFAT ファイルシステム | | |I:120 | |(Microsoft) の読み書きドライバー。 | |--------------+------+----+------------------------------------| | |V:4, | |exfat-fuse の作者によってメンテナン | |exfat-utils |I:106 |231 |スされている exFAT ファイルシステム | | | | |のためのユーティリティー | |--------------+------+----+------------------------------------| |xfsprogs |V:21, |3476|XFS ファイルシステムのためのユーティ| | |I:95 | |リティー (SGI: IRIX) | |--------------+------+----+------------------------------------| | |V:197,| |FUSE による NTFS ファイルシステム | |ntfs-3g |I:513 |1474|(Microsoft: Windows NT, …) の読み書 | | | | |きドライバー。 | |--------------+------+----+------------------------------------| |jfsutils |V:0, |1577|JFS ファイルシステムのためのユーティ| | |I:8 | |リティー (IBM: AIX, OS/2) | |--------------+------+----+------------------------------------| |reiser4progs |V:0, |1367|Reiser4 ファイルシステムのためのユー| | |I:2 | |ティリティー | |--------------+------+----+------------------------------------| |hfsprogs |V:0, |394 |HFS と HFS Plus ファイルシステムのた| | |I:4 | |めのユーティリティー (Apple: Mac OS)| |--------------+------+----+------------------------------------| |zerofree |V:5, |25 |ext2/3/4 ファイルシステムのフリーブ | | |I:131 | |ロックをゼロにセットするプログラム | +---------------------------------------------------------------+ ヒント 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/hda3" や "/dev/hda3" 等の普通のブロックデバイス名の代わりに ブロックデバイスを指定するのに使えます。     Linux 2.6.30 以来、カーネルは "relatime" オプションで提供される挙 動をデフォルトとしています。     fstab(5) と mount(8) を参照下さい。 9.6.8. スーパーブロックによるファイルシステムの最適化     tune2fs(8) コマンドを用いてファイルシステムのスーパーブロックによ ってファイルシステムを最適化できます。 * "sudo tune2fs -l /dev/hda1" を実行すると"/dev/hda1" 上のファ イルシステムスーパーブロックを表示します。 * "sudo tune2fs -c 50 /dev/hda1" を実行すると"/dev/hda1" 上のフ ァイルシステムのチェック (ブートアップ時の fsck 実行) の頻度 を50回のブート毎に変更します。     * "sudo tune2fs -j /dev/hda1" の実行は ext2 から ext3 へと"/dev /hda1" 上のファイルシステム変換してファイルシステムにジャーナ リングの機能を追加します。(アンマウントしたファイルシステムに 対して実行します。) * "sudo tune2fs -O extents,uninit_bg,dir_index /dev/hda1 && fsck -pf /dev/hda1" の実行は"/dev/hda1" 上のファイルシステム を ext3 から ext4 に変換します。(アンマウントしたファイルシス テムに対して実行します。) ヒント     tune2fs(8) は、その名前にもかかわらず、ext2 ファイルシステムに機 能するだけでなく ext3 とか ext4 ファイルシステムに関しても機能し ます。 9.6.9. ハードディスクの最適化 警告     ハードディスクの設定はデーターの整合性にとって非常に危険な事なの で、その設定をさわる前にお使いのハードウエアーをチェックし hdparm (8) のマンページをチェックします。 例えば "/dev/hda" に対して "hdparm -tT /dev/hda" とするとハードデ ィスクのアクセス速度をテストできます。(E)IDE を使って接続された一     部のハードディスクでは、"(E)IDE 32ビット I/O サポート" を有効にし "using_dma フラグ" を有効にし "interrupt-unmask フラグ" を設定し "複数16セクター I/O" を設定するように、"hdparm -q -c3 -d1 -u1 -m16 /dev/hda" とすると高速化できます (危険です!)。 例えば "/dev/sda" に対して "hdparm -W /dev/sda" とするとハードデ     ィスクの書込みキャッシュ機能をテストできます。"hdparm -W 0 /dev/ sda" とするとハードディスクの書込みキャッシュ機能を無効にできます 。     不良プレスの CDROM を現代的な高速 CD-ROM ドライブで読むには、 "setcd -x 2" としてそれを減速して使えば読めるかもしれません。 9.6.10. ソリッドステートドライブの最適化     現在、ソリッドステートドライブ (SSD) は自動検出されます。 揮発性のデーターパスの上に "tmpfs" を /etc/fstab でマウントするこ     とで、不必要なディスクアクセスを減らしてディスクの消耗りを防ぎま す。 9.6.11. SMART を用いたハードディスクの破壊の予測     smartd(8) デーモンを使うと SMART に文句を言うハードディスクの監視 と記録ができます。 1. BIOS のSMART 機能を有効にします。 2. smartmontools パッケージをインストールします。 3. df(1) を使ってリストすることであなたのハードディスクを識別し ます。 + 監視対象のハードディスクを "/dev/hda" と仮定します。 4. SMART 機能が実際に有効となっているかを "smartctl -a /dev/hda"     のアウトプットを使ってチェックします。 + もし有効でない場合には、"smartctl -s on -a /dev/hda" とし て有効にします。 5. 以下のようにして smartd(8) デーモンを実行します。 + "/etc/default/smartmontools" ファイル中の "start_smartd= yes" をアンコメントします。 + "sudo 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" はcp(1) か dd(1) を用いれば以下のようにして作れます。     # cp /dev/sdb disk.img # dd if=/dev/sdb of=disk.img プライマリ IDE ディスクの最初のセクターにある伝統的 PC のマスター     ブートレコード (MBR) (「ディスクパーティション設定」を参照下さい) のディスクイメージは、dd(1) を用いれば以下のようにして作れます。 # dd if=/dev/hda of=mbr.img bs=512 count=1     # dd if=/dev/hda of=mbr-nopart.img bs=446 count=1 # dd if=/dev/hda of=mbr-part.img skip=446 bs=1 count=66 * "mbr.img": パーティションテーブル付きの MBR     * "mbr-nopart.img": パーティションテーブル抜きの MBR。 * "mbr-part.img": MBR のパーティションテーブルのみ。     ブートディスクとして SCSI ドライブもしくはシリアル ATA デバイスが 使われる場合、"/dev/hda" を"/dev/sda" に置き換えて下さい。     オリジナルディスクのパーティションのイメージを作る場合には、"/dev /hda" を"/dev/hda1" 等で置き換えます。 9.7.2. ディスクに直接書込み ディスクイメージファイル "disk.img" はサイズがマッチする例えば "/     dev/sdb" という2番目の SCSI ドライブに以下のようにして書き込むこ とができます。     # dd if=disk.img of=/dev/sdb 同様にディスクパーティションイメージファイル "partition.img" はサ     イズがマッチする例えば "/dev/sdb1" という2番目の SCSI ドライブの1 番目のパーティションに以下のようにして書き込むことができます。     # dd if=partition.img of=/dev/sdb1 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 イメージファイル作成 "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 は、cdrkit が提供する wodim(1) にとっては単に大きな CD です。     使えるデバイスは以下のようにするとみつかります。     # wodim --devices そしてブランクの CD-R をドライブに挿入して、例えば "/dev/hda" と     いうこのデバイスに ISO9660 イメージファイル "cd.iso" にwodim(1) を使って以下のようにして書込みます。     # wodim -v -eject dev=/dev/hda cd.iso     もし CD-R ではなく CD-RW が使われている場合には、次を代わりに実行 して下さい。     # wodim -v -eject blank=fast dev=/dev/hda cd.iso ヒント     もしあなたのデスクトップシステムが CD を自動的にマウントする場合 、wodim(1) を使う前に "sudo unmount /dev/hda" として CD をアンマ ウントします。 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:880,| |ファイルをダンプする od(1) がある | |coreutils |I:999 |18307|基本パッケージ (HEX, ASCII, OCTAL,| | | | |…) | |---------------+------+-----+----------------------------------| | |V:11, | |ファイルをダンプする hd(1) がある | |bsdmainutils |I:315 |17 |ユーティリティーパッケージ (HEX, | | | | |ASCII, OCTAL, …) | |---------------+------+-----+----------------------------------|     |hexedit |V:0, |73 |バイナリーエディターとビューワー | | |I:9 | |(HEX, ASCII) | |---------------+------+-----+----------------------------------| |bless |V:0, |924 |フル機能の16進エディター (GNOME) | | |I:2 | | | |---------------+------+-----+----------------------------------| |okteta |V:1, |1585 |フル機能の16進エディター (KDE4) | | |I:12 | | | |---------------+------+-----+----------------------------------| |ncurses-hexedit|V:0, |130 |バイナリーエディターとビューワー | | |I:1 | |(HEX, ASCII, EBCDIC) | |---------------+------+-----+----------------------------------| |beav |V:0, |137 |バイナリーエディターとビューワー | | |I:0 | |(HEX, ASCII, EBCDIC, OCTAL, …) | +---------------------------------------------------------------+ ヒント HEX は底が16の16進フォーマットです。OCTAL は底が8の8進フォーマッ     トです。ASCII (アスキー) は情報交換用アメリカ標準コードで、普通の 英文テキストです。EBCDIC (エビシディック) は IBM メインフレームオ ペレーティングシステム上で使われる拡張二進化十進数互換コードです 。 9.8.2. ディスクをマウントせずに操作     ディスクをマウントせずに読出しや書込みをするツールがあります。 表9.22 ディスクをマウントせずに操作するパッケージのリスト +---------------------------------------------------------------+ |パッケー|ポプコン|サイ | 説明 | | ジ | | ズ | | |--------+--------+-----+---------------------------------------|     |mtools |V:8, |390 |MSDOS ファイルをマウントせずに使うツー | | |I:63 | |ル | |--------+--------+-----+---------------------------------------| |hfsutils|V:0, I:5|184 |HFS や HFS+ ファイルをマウントせずに使 | | | | |うツール | +---------------------------------------------------------------+ 9.8.3. データーの冗長性 Linux カーネルが提供するソフトウェアー RAID システムは高いレベル     のストレージ信頼性を達成するためにカーネルのファイルシステムのレ ベルでデーターの冗長性を提供します。     アプリケーションプログラムレベルでストレージの高い信頼性を達成す るようにデーター冗長性を付加するツールもあります。 表9.23 ファイルにデーターの冗長性を追加するツールのリスト +---------------------------------------------------------------+ |パッケージ|ポプコ|サイ| 説明 | | | ン | ズ | | |----------+------+----+----------------------------------------| |par2 |V:9, |268 |ファイルのチェックと修理のためのパリティ|     | |I:94 | |ーアーカイブセット | |----------+------+----+----------------------------------------| |dvdisaster|V:0, |1422|CD/DVD メディアのデーターロス/傷つき/老 | | |I:1 | |化の防止 | |----------+------+----+----------------------------------------| |dvbackup |V:0, |413 |MiniDV カメラレコーダを使うバックアップ | | |I:0 | |ツール (rsbep(1) を提供) | +---------------------------------------------------------------+ 9.8.4. データーファイルの復元と事故の証拠解析     データーファイルの復元と事故の証拠解析のツールがあります。 表9.24 データーファイルの復元と事故の証拠解析のリスト +---------------------------------------------------------------+ | パッケージ |ポプ |サイ| 説明 | | |コン | ズ | | |-------------+-----+----+--------------------------------------| |testdisk |V:2, |1413|パーティションのスキャンとディスク復元| | |I:28 | |のためのユーティリティー | |-------------+-----+----+--------------------------------------| |magicrescue |V:0, |255 |マジックバイトを探してファイルを復元す| | |I:2 | |るユーティリティー | |-------------+-----+----+--------------------------------------| |scalpel |V:0, |89 |質素で高性能なファイル彫刻刀 | | |I:3 | | | |-------------+-----+----+--------------------------------------| |myrescue |V:0, |83 |破壊したハードディスクからデーターを救| | |I:2 | |出 | |-------------+-----+----+--------------------------------------| |extundelete |V:0, |147 |ext3/4 ファイルシステム上のファイルの | | |I:8 | |削除復元ユーティリティー | |-------------+-----+----+--------------------------------------| |ext4magic |V:0, |233 |ext3/4 ファイルシステム上のファイルの | | |I:4 | |削除復元ユーティリティー | |-------------+-----+----+--------------------------------------|     |ext3grep |V:0, |293 |ext3 ファイルシステム上のファイルの削 | | |I:2 | |除復元ヘルプツール | |-------------+-----+----+--------------------------------------| |scrounge-ntfs|V:0, |50 |NTFS ファイルシステム上のデーター復元 | | |I:2 | |プログラム | |-------------+-----+----+--------------------------------------| |gzrt |V:0, |33 |gzip 復元ツールキット | | |I:0 | | | |-------------+-----+----+--------------------------------------| |sleuthkit |V:3, |1671|証拠解析のためのツール (Sleuthkit) | | |I:24 | | | |-------------+-----+----+--------------------------------------| |autopsy |V:0, |1026|SleuthKit のための GUI | | |I:1 | | | |-------------+-----+----+--------------------------------------| |foremost |V:0, |102 |データー復元のための証拠解析アプリケー| | |I:5 | |ション | |-------------+-----+----+--------------------------------------| |guymager |V:0, |1021|Qt 使用の証拠解析用イメージ作成ソフト | | |I:0 | | | |-------------+-----+----+--------------------------------------| |dcfldd |V:0, |114 |証拠解析とセキュリティーのための dd の| | |I:3 | |強化版 | +---------------------------------------------------------------+ ヒント     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/hda" や "/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 はdevice-mapper を使って最低限のユーザー努力でネイティブ     Linux カーネルモジュール経由で自動データー暗号化を提供します。 encryption via native Linux kernel modules with minimal user efforts using 表9.25 データー暗号化ユーティリティーのリスト +---------------------------------------------------------------+ | パッケージ |ポプ |サイ| 説明 | | |コン | ズ | | |--------------+-----+----+-------------------------------------| | |V:19,| |暗号化されたブロックデバイス | |cryptsetup |I:79 |417 |(dm-crypt / LUKS) のためのユーティリ | | | | |ティー | |--------------+-----+----+-------------------------------------|     | | | |ノーマルユーザーによるマウント/アンマ| |cryptmount |V:2, |231 |ウントに焦点を当てた暗号化されたブロ | | |I:3 | |ックデバイス (dm-crypt / LUKS) のため| | | | |のユーティリティー | |--------------+-----+----+-------------------------------------| |fscrypt |V:0, |5520|Linux ファイルシステム暗号化 | | |I:1 | |(fscrypt) 用のユーティリティー | |--------------+-----+----+-------------------------------------| |libpam-fscrypt|V:0, |5519|Linux ファイルシステム暗号化 | | |I:0 | |(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 |I:480 |17 |Debian パッケージをビルドする上で| | | | |不可欠なパッケージ: make、gcc、… | |----------------+------+-----+---------------------------------| |bzip2 |V:166,|112 |bz2 ファイルのための圧縮と解凍ユ | | |I:970 | |ーティリティー | |----------------+------+-----+---------------------------------| |libncurses5-dev |I:71 |6 |ncurses のためのデベロッパ用ライ | | | | |ブラリーと文書 | |----------------+------+-----+---------------------------------| | |V:351,| |git: Linux カーネルによって使われ|     |git |I:549 |46734|ている分散型リビジョンコントロー | | | | |ルシステム | |----------------+------+-----+---------------------------------| |fakeroot |V:29, |224 |パッケージを非 root としてビルド | | |I:486 | |するための fakeroot 環境を提供 | |----------------+------+-----+---------------------------------| |initramfs-tools |V:430,|113 |initramfs をビルドするツール | | |I:989 | |(Debian 固有) | |----------------+------+-----+---------------------------------| |dkms |V:74, |196 |動的カーネルモジュールサポート | | |I:162 | |(DKMS) (汎用) | |----------------+------+-----+---------------------------------| |module-assistant|V:0, |406 |モジュールパッケージ作成用ヘルパ | | |I:19 | |ーツール (Debian 固有) | |----------------+------+-----+---------------------------------| |devscripts |V:6, |2658 |Debian パッケージメンテナ用ヘルパ| | |I:40 | |ースクリプト (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:880,|18307 |chroot(8)を含むGNU core | | |I:999 | |utilities | |------------------+------+------+------------------------------| | |V:53, | |systemd-nspawn(1) を含む | |systemd-container |I:61 |1330 |systemd の container/nspawn ツ| | | | |ール | |------------------+------+------+------------------------------| |schroot |V:5, |2579 |Debian バイナリーパッケージを | | |I:7 | |chroot 中で実行する専用ツール | |------------------+------+------+------------------------------| | |V:1, | |Debian ソースから Debian バイ | |sbuild |I:3 |243 |ナリーパッケージをビルドするツ| | | | |ール | |------------------+------+------+------------------------------| | |V:5, | |基本的な Debian システムのブー| |debootstrap |I:54 |314 |トストラップ (sh で書かれてい | | | | |る) | |------------------+------+------+------------------------------| |cdebootstrap |V:0, |115 |Debian システムのブートストラ | | |I:1 | |ップ (C で書かれている) | |------------------+------+------+------------------------------| |cloud-image-utils |V:1, |66 |クラウドイメージ管理ユーティリ| | |I:17 | |ティー | |------------------+------+------+------------------------------| |cloud-guest-utils |V:3, |71 |クラウドゲストユーティリティー| | |I:13 | | | |------------------+------+------+------------------------------| | |V:11, | |仮想マシンマネージャー: 仮想マ| |virt-manager |I:44 |2296 |シンを管理するデスクトップアプ| | | | |リケーション | |------------------+------+------+------------------------------| |libvirt-clients |V:46, |1241 |libvirt ライブラリー用のプログ| | |I:65 | |ラム | |------------------+------+------+------------------------------| | |V:0, | |Incus: システムコンテナーと仮 | |incus |I:0 |56209 |想マシンマネージャー (Debian | | | | |13 "Trixie" 用) | |------------------+------+------+------------------------------| | |V:0, | |LXD: システムコンテナーと仮想 | |lxd |I:0 |52119 |マシンマネージャー (Debian 12 | | | | |"Bookworm" 用) | |------------------+------+------+------------------------------| |podman |V:14, |41948 |podman: OCI ベースのコンテナー| | |I:16 | |をPod中で実行するエンジン | |------------------+------+------+------------------------------| | |V:0, | |OCI-ベースのコンテナをPod中で | |podman-docker |I:0 |249 |実行するエンジン - docker 用の| | | | |ラッパー |     |------------------+------+------+------------------------------| |docker.io |V:41, |150003|docker: Linux コンテナーランタ| | |I:43 | |イム | |------------------+------+------+------------------------------| |games-emulator |I:0 |21 |games-emulator: Debian のゲー | | | | |ム用エミュレーター | |------------------+------+------+------------------------------| |bochs |V:0, |6956 |Bochs: IA-32 PC エミュレーター| | |I:0 | | | |------------------+------+------+------------------------------| |qemu |I:14 |97 |QEMU: 高速で汎用のプロセッサエ| | | | |ミュレーター | |------------------+------+------+------------------------------| |qemu-system |I:22 |66 |QEMU: フルシステムエミュレーシ| | | | |ョンのバイナリ | |------------------+------+------+------------------------------| |qemu-user |V:1, |93760 |QEMU: ユーザーモードエミュレー| | |I:6 | |ションのバイナリ | |------------------+------+------+------------------------------| |qemu-utils |V:12, |10635 |QEMU: ユーティリティー | | |I:106 | | | |------------------+------+------+------------------------------| | |V:33, | |KVM: ハードウエア補助仮想化を | |qemu-system-x86 |I:91 |58140 |利用する x86 ハードウエア上の | | | | |フル仮想化 | |------------------+------+------+------------------------------| |virtualbox |V:6, |130868|VirtualBox: i386 と amd64 上で| | |I:8 | |の x86 仮想化解決策 | |------------------+------+------+------------------------------| |gnome-boxes |V:1, |6691 |Boxes: 仮想システムにアクセス | | |I:7 | |するシンプルな GNOME アプリ | |------------------+------+------+------------------------------| |xen-tools |V:0, |719 |Debian XEN 仮想サーバーの管理 | | |I:2 | |ツール | |------------------+------+------+------------------------------| |wine |V:13, |132 |Wine: Windows API の実装 (標準| | |I:60 | |スイート) | |------------------+------+------+------------------------------| | |V:1, | |DOSBox: Tandy/Herc/CGA/EGA/VGA| |dosbox |I:15 |2696 |/SVGA グラフィクス、サウンド、| | | | |DOS 付きの x86 エミュレーター | |------------------+------+------+------------------------------| |lxc |V:9, |25890 |Linux コンテナーユーザースペー| | |I:12 | |スツール | |------------------+------+------+------------------------------| |python3-venv |I:88 |6 |仮想 python 環境を作るための | | | | |venv (システムライブラリー) | |------------------+------+------+------------------------------| |python3-virtualenv|V:9, |356 |隔離された仮想 python 環境を作| | |I:50 | |るための virtualenv | |------------------+------+------+------------------------------| |pipx |V:3, |3324 |隔離された環境に python アプリ| | |I:19 | |をインストールするための 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:902,|3077|.tar |tar(1) |標準アーカイバー (デファク| | |I:999 | | | |ト標準) | |----------+------+----+-----+-------+--------------------------| | |V:440,| | | |Unix System V スタイルのア| |cpio |I:998 |1199|.cpio|cpio(1)|ーカイバー、find(1) ととも| | | | | | |に使用 | |----------+------+----+-----+-------+--------------------------| |binutils |V:172,|144 |.ar |ar(1) |静的ライブラリー生成用のア| | |I:629 | | | |ーカイバー | |----------+------+----+-----+-------+--------------------------| |fastjar |V:1, |183 |.jar |fastjar|Java 用のアーカイバー (zip| | |I:13 | | |(1) |類似) | |----------+------+----+-----+-------+--------------------------| | |V:8, | | | |新規 POSIX 標準アーカイバ | |pax |I:14 |170 |.pax |pax(1) |ー、tar と cpio の間の妥協| | | | | | |点 | |----------+------+----+-----+-------+--------------------------| | | | | |gzip | | |gzip |V:876,|252 |.gz |(1), |GNU LZ77 圧縮ユーティリテ | | |I:999 | | |zcat |ィー (デファクト標準) | | | | | |(1), … | | |----------+------+----+-----+-------+--------------------------| | | | | |bzip2 |gzip(1) より高い圧縮比 | | |V:166,| | |(1), |(gzip より遅い、類似シンタ| |bzip2 |I:970 |112 |.bz2 |bzcat |ックス) の Burrows-Wheeler| | | | | |(1), … |ブロック並び替え圧縮ユーテ| | | | | | |ィリティー | |----------+------+----+-----+-------+--------------------------|     | |V:1, | | | |gzip(1) より高い圧縮比の | |lzma |I:16 |149 |.lzma|lzma(1)|LZMA 圧縮ユーティリティー | | | | | | |(非推奨) | |----------+------+----+-----+-------+--------------------------| | | | | | |bzip2(1) より高い圧縮比の | | |V:360,| | |xz(1), |XZ 圧縮ユーティリティー | |xz-utils |I:980 |1203|.xz |xzdec |(gzip より遅いが bzip2 よ | | | | | |(1), … |り早い、LZMA 圧縮ユーティ | | | | | | |リティーの代替) | |----------+------+----+-----+-------+--------------------------| | | | | |zstd | | |zstd |V:193,|2158|.zstd|(1), |Zstandard 高速ロスレス圧縮| | |I:481 | | |zstdcat|ユーティリティー | | | | | |(1), … | | |----------+------+----+-----+-------+--------------------------| | |V:20, | | |7zr(1),|高い圧縮比をもつ 7-Zip 圧 | |p7zip |I:463 |8 |.7z |p7zip |縮ユーティリティー (LZMA | | | | | |(1) |圧縮) | |----------+------+----+-----+-------+--------------------------| | |V:110,| | |7z(1), |高い圧縮比をもつ 7-Zip 圧 | |p7zip-full|I:480 |12 |.7z |7za(1) |縮ユーティリティー (LZMA | | | | | | |圧縮、他) | |----------+------+----+-----+-------+--------------------------| | | | | | |gzip(1) より高い圧縮と解凍| |lzop |V:15, |164 |.lzo |lzop(1)|の速度 (gzip より低い圧縮 | | |I:142 | | | |比、類似シンタックス) の | | | | | | |LZO 圧縮ユーティリティー | |----------+------+----+-----+-------+--------------------------| |zip |V:48, |616 |.zip |zip(1) |InfoZIP: DOS アーカイブと | | |I:380 | | | |圧縮ツール | |----------+------+----+-----+-------+--------------------------| |unzip |V:105,|379 |.zip |unzip |InfoZIP: DOS アーカイブ解 | | |I:771 | | |(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:880,|18307|GNU |ファイルやディレクトリーのロー| | |I:999 | |cp |カルコピー ("-a" で再帰的実行)| |--------------+------+-----+----+------------------------------| | |V:866,| | |ファイルやディレクトリーのリモ| |openssh-client|I:996 |4959 |scp |ートコピー (クライアント、"-r"|     | | | | |で再帰実行) | |--------------+------+-----+----+------------------------------| |openssh-server|V:730,|1804 |sshd|ファイルやディレクトリーのリモ| | |I:814 | | |ートコピー (リモートサーバー) | |--------------+------+-----+----+------------------------------| |rsync |V:246,|781 | |単方向リモート同期とバックアッ| | |I:552 | | |プ | |--------------+------+-----+----+------------------------------| |unison |V:3, |14 | |双方向リモート同期とバックアッ| | |I:15 | | |プ | +---------------------------------------------------------------+     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. データー共有用のファイルシステム選択 リムーバブルストレージデバイスを使ってデーターを共有する際には、     両方のシステムにサポートされた共通のファイルシステムでそれをフォ ーマットするべきです。ファイルシステム選択のリストを次に示します 。 表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 &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:554,| | |GNU プライバシーガード| |gnupg |I:906 |885 |gpg(1) |- OpenPGP 暗号化ト署名| | | | | |ツール | |---------------+------+-----+-----------+----------------------| |gpgv |V:893,|922 |gpgv(1) |GNU プライバシガード -| | |I:999 | | |署名確認ツール | |---------------+------+-----+-----------+----------------------| |paperkey |V:1, |58 |paperkey(1)|OpenPGP の秘密キーから| | |I:14 | | |秘密の情報だけを抜粋 | |---------------+------+-----+-----------+----------------------| | | | | |暗号化されたブロックデ| |cryptsetup |V:19, |417 |cryptsetup |バイス (dm-crypt / | | |I:79 | |(8), … |LUKS) のためのユーティ|     | | | | |リティー | |---------------+------+-----+-----------+----------------------| |coreutils |V:880,|18307|md5sum(1) |MD5 メッセージダイジェ| | |I:999 | | |ストを計算やチェック | |---------------+------+-----+-----------+----------------------| |coreutils |V:880,|18307|sha1sum(1) |SHA1 メッセージダイジ | | |I:999 | | |ェストを計算やチェック| |---------------+------+-----+-----------+----------------------| | | | | |"openssl dgst" を使っ | |openssl |V:841,|2111 |openssl |てメッセージダイジェス| | |I:995 | |(1ssl) |トを計算やチェック | | | | | |(OpenSSL) | |---------------+------+-----+-----------+----------------------| |libsecret-tools|V:0, |41 |secret-tool|パスワードの保存と読出| | |I:10 | |(1) |し (CLI) | |---------------+------+-----+-----------+----------------------| |seahorse |V:80, |7987 |seahorse(1)|キー管理ツール (GNOME)| | |I:269 | | | | +---------------------------------------------------------------+ 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 --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 |究極の信用 | +----------------------------------+     以下のようにすると私のキー "1DD8D791" をポピュラーなキーサーバー "hkp://keys.gnupg.net" にアップロード出来ます。     $ gpg --keyserver hkp://keys.gnupg.net --send-keys 1DD8D791     "~/.gnupg/gpg.conf" (もしくは古い場所 "~/.gnupg/options") 中の良 いデフォールトのキーサーバーの設定は次を含みます。     keyserver hkp://keys.gnupg.net     次によってキーサーバーから知らないキーが獲得できます。     $ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\ cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys OpenPGP 公開キーサーバー (バージョン0.9.6以前) に2つ以上サブキー     のあるキーを壊すバグがありました。新しい gnupg (>1.2.1-2) パッケ ージはこのような壊れたサブキーを取り扱えます。gpg(1) の "--repair-pks-subkey-bug" オプションの説明を参照下さい。 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:97, |248 |patch(1) |差分ファイルをオリジナルに適| | |I:700 | | |用 | |----------+------+----+-----------+----------------------------| |vim |V:95, |3743|vimdiff(1) |vim で2つのファイルを並べて | | |I:369 | | |比較 | |----------+------+----+-----------+----------------------------| |imediff |V:0, |200 |imediff(1) |対話型フルスクリーンの2方/3 | | |I:0 | | |方マージツール | |----------+------+----+-----------+----------------------------| |meld |V:7, |3536|meld(1) |ファイルを比較やマージ (GTK)| | |I:30 | | | | |----------+------+----+-----------+----------------------------| |wiggle |V:0, |175 |wiggle(1) |リジェクトされたパッチを適用| | |I:0 | | | | |----------+------+----+-----------+----------------------------| |diffutils |V:862,|1735|diff(1) |1行ごとにファイルを比較 | | |I:996 | | | | |----------+------+----+-----------+----------------------------| |diffutils |V:862,|1735|diff3(1) |1行ごとにファイルを比較やマ | | |I:996 | | |ージ | |----------+------+----+-----------+----------------------------| |quilt |V:2, |871 |quilt(1) |パッチのシリーズを管理 | | |I:22 | | | | |----------+------+----+-----------+----------------------------| |wdiff |V:7, |648 |wdiff(1) |テキストファイル間のワードの| | |I:51 | | |相違表示 | |----------+------+----+-----------+----------------------------| |diffstat |V:13, |74 |diffstat(1)|差分ファイルによる変化のヒス| | |I:121 | | |トグラム作成 | |----------+------+----+-----------+----------------------------| |patchutils|V:16, |232 |combinediff|2つの積み重ねパッチから1つの| | |I:119 | |(1) |合計パッチを生成 | |----------+------+----+-----------+----------------------------| |patchutils|V:16, |232 |dehtmldiff |HTML ページから差分ファイル | | |I:119 | |(1) |を抽出 | |----------+------+----+-----------+----------------------------| |patchutils|V:16, |232 |filterdiff |差分ファイルから差分ファイル|     | |I:119 | |(1) |を抽出や削除 | |----------+------+----+-----------+----------------------------| | |V:16, | |fixcvsdiff |CVS により作成された patch | |patchutils|I:119 |232 |(1) |(1) が誤解する差分ファイルを| | | | | |修正 | |----------+------+----+-----------+----------------------------| |patchutils|V:16, |232 |flipdiff(1)|古い2つのパッチを交換 | | |I:119 | | | | |----------+------+----+-----------+----------------------------| | |V:16, | | |正規表現にマッチするパッチに| |patchutils|I:119 |232 |grepdiff(1)|よって変更されるファイルを表| | | | | |示 | |----------+------+----+-----------+----------------------------| |patchutils|V:16, |232 |interdiff |2つのユニファイド差分ファイ | | |I:119 | |(1) |ル間の違いを表示 | |----------+------+----+-----------+----------------------------| |patchutils|V:16, |232 |lsdiff(1) |どのファイルがパッチによって| | |I:119 | | |変更されるかを表示 | |----------+------+----+-----------+----------------------------| | |V:16, | |recountdiff|ユニファイドコンテキスト差分| |patchutils|I:119 |232 |(1) |ファイルのカウントやオフセッ| | | | | |トを再計算 | |----------+------+----+-----------+----------------------------| |patchutils|V:16, |232 |rediff(1) |手編集された差分ファイルのカ| | |I:119 | | |ウントやオフセットを再計算 | |----------+------+----+-----------+----------------------------| |patchutils|V:16, |232 |splitdiff |増分パッチの分離 | | |I:119 | |(1) | | |----------+------+----+-----------+----------------------------| |patchutils|V:16, |232 |unwrapdiff |ワードラップされたパッチを復| | |I:119 | |(1) |元 | |----------+------+----+-----------+----------------------------| |dirdiff |V:0, |167 |dirdiff(1) |ディレクトリーツリー間で相違| | |I:1 | | |点の表示と変更のマージ | |----------+------+----+-----------+----------------------------| |docdiff |V:0, |553 |docdiff(1) |2つのファイルをワード毎/文字| | |I:0 | | |毎に比較 | |----------+------+----+-----------+----------------------------| |makepatch |V:0, |100 |makepatch |拡張パッチファイルの生成 | | |I:0 | |(1) | | |----------+------+----+-----------+----------------------------| |makepatch |V:0, |100 |applypatch |拡張パッチファイルの適用 | | |I:0 | |(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: 高速、スケ | |git |V:351,|46734|git(7) |ーラブル、分散型| | |I:549 | | |リビジョンコント| | | | | |ロールシステム | |----------------+------+-----+----------------+----------------| | |V:5, | | |GUI による履歴付| |gitk |I:33 |1838 |gitk(1) |き Git レポジト | | | | | |リーブラウザー | |----------------+------+-----+----------------+----------------| |git-gui |V:1, |2429 |git-gui(1) |Git 用の GUI (履| | |I:18 | | |歴無し) | |----------------+------+-----+----------------+----------------| | |V:0, | |git-send-email |Git からパッチの| |git-email |I:10 |1087 |(1) |集合の email と | | | | | |して送信 | |----------------+------+-----+----------------+----------------|     | |V:1, | |git-buildpackage|Git を使って | |git-buildpackage|I:9 |1988 |(1) |Debian パッケー | | | | | |ジ化を自動化 | |----------------+------+-----+----------------+----------------| | |V:0, | | |Debian アーカイ | |dgit |I:1 |473 |dgit(1) |ブと git の相互 | | | | | |運用性 | |----------------+------+-----+----------------+----------------| | | | | |インタラクティブ| |imediff |V:0, |200 |git-ime(1) |な git コミット | | |I:0 | | |分割ヘルパーツー| | | | | |ル | |----------------+------+-----+----------------+----------------| |stgit |V:0, |601 |stg(1) |Git 上の quilt | | |I:0 | | |(Python) | |----------------+------+-----+----------------+----------------| |git-doc |I:12 |13208|N/A |正式 Git 文書 | |----------------+------+-----+----------------+----------------| | | | | |"Git マジック"、| |gitmagic |I:0 |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|(Edit .git/config to re-enable) |     |------------------------+--------------------------------------| |git remote update |upstream レポジトリー中の全リモートブ | |upstream |ランチの更新を取得しますrepository | |------------------------+--------------------------------------| | |ローカルの (孤立しているかもしれない) | |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:5, |2019 |Mercurial |分散|Python と一部 C で書かれ| | |I:32 | | |型 |た DVCS | |----------+-----+-----+----------+----+------------------------| |darcs |V:0, |34070|Darcs |分散|パッチに関して賢い計算を| | |I:5 | | |型 |する DVCS (遅い) | |----------+-----+-----+----------+----+------------------------| |bzr |I:8 |28 |GNU Bazaar|分散|tla に影響され Python で| | | | | |型 |書かれた DVCS (歴史的) | |----------+-----+-----+----------+----+------------------------| |tla |V:0, |1022 |GNU arch |分散|主に Tom Lord による | | |I:1 | | |型 |DVCS (歴史的) |     |----------+-----+-----+----------+----+------------------------| | |V:13,| | |リモ|"良く出来た CVS"、新しい| |subversion|I:72 |4837 |Subversion|ート|リモート VCS の標準 (歴 | | | | | | |史的) | |----------+-----+-----+----------+----+------------------------| |cvs |V:4, |4753 |CVS |リモ|リモート VCS の過去の標 | | |I:30 | | |ート|準 (歴史的) | |----------+-----+-----+----------+----+------------------------| | |V:0, | | |リモ|VCS (CVS, Subversion, | |tkcvs |I:1 |1498 |CVS, … |ート|RCS) レポジトリーツリー | | | | | | |の GUI 表示 | |----------+-----+-----+----------+----+------------------------| |rcs |V:2, |564 |RCS |ロー|"Unix SCCS の本来あるべ | | |I:13 | | |カル|き姿" (歴史的) | |----------+-----+-----+----------+----+------------------------| |cssc |V:0, |2044 |CSSC |ロー|Unix SCCS のクローン (歴| | |I:1 | | |カル|史的) | +---------------------------------------------------------------+ --------------------------------------------------------------------- ^[4] 重要データーは上書き事故を防ぐために CD/DVD-R のような1回書 込みメディアに貯蔵するのが好ましいです。(シェルコマンドラインから     ストレージメディアにどうして書き込むかについては「バイナリーデー ター」を参照下さい。GNOME デスクトップの GUI 環境ではメニュー: "Places→CD/DVD Creator" で簡単に書込みできます。)     ^[5] このようなデーターの一部は、システムに同一の入力文字列を入力 しても再生成できません。     ^[6] もし、"~/.vim/vimrc" に代えて "~/.vimrc" を使う場合は、それ に合わせて置換して下さい。 第11章データー変換     Debian システム上のデーターフォーマット変換のツールとティップを記 します。     標準に準拠したツールは非常に良い状態ですが、プロプライエタリデー ターフォーマットのサポートは限定的です。 11.1. テキストデーター変換ツール     テキストデーター変換のための以下のパッケージが著者の目に止まりま した。 表11.1 テキストデーター変換ツールのリスト +---------------------------------------------------------------+ |パッケー|ポプコ|サイ |キーワー | 説明 | | ジ | ン | ズ | ド | | |--------+------+-----+---------+-------------------------------| | |V:917,| |文字セッ |iconv(1) によるロケール間のテキ| |libc6 |I:999 |12988|ト |スト符号化方式変換ソフト (基本 | | | | | |的) | |--------+------+-----+---------+-------------------------------| | |V:2, | |文字セッ |ロケール間のテキスト符号化方式 | |recode |I:18 |602 |ト + 行末|変換ソフト (機能豊富、より多い | | | | |文字 |エイリアスと機能) | |--------+------+-----+---------+-------------------------------| |konwert |V:1, |134 |文字セッ |ロケール間のテキスト符号化方式 | | |I:48 | |ト |変換ソフト (高級機能) | |--------+------+-----+---------+-------------------------------|     |nkf |V:0, |360 |文字セッ |日本語のための文字セット翻訳ソ | | |I:9 | |ト |フト | |--------+------+-----+---------+-------------------------------| |tcs |V:0, |518 |文字セッ |文字セット翻訳ソフト | | |I:0 | |ト | | |--------+------+-----+---------+-------------------------------| |unaccent|V:0, |35 |文字セッ |アクセント付き文字をアクセント | | |I:0 | |ト |の無しの等価文字に置換 | |--------+------+-----+---------+-------------------------------| | |V:1, | | |DOS と Unix 間のテキストフォー | |tofrodos|I:17 |51 |行末文字 |マット変換ソフト: fromdos(1) と| | | | | |todos(1) | |--------+------+-----+---------+-------------------------------| | |V:0, | | |Macintosh と Unix 間のテキスト | |macutils|I:0 |312 |行末文字 |フォーマット変換ソフト: 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:15,| | |"w3m -dump" コマンドを使う| |w3m |I:187|2837|html→text |HTML からテキストへの変換 | | | | | |ソフト | |---------+-----+----+---------------+--------------------------| |html2text|V:3, |243 |html→text |高度な HTML からテキストへ| | |I:53 | | |の変換ソフト (ISO 8859-1) | |---------+-----+----+---------------+--------------------------| | |V:25,| | |"lynx -dump" コマンドを使 | |lynx |I:344|1948|html→text |う HTML からテキストへの変| | | | | |換ソフト | |---------+-----+----+---------------+--------------------------| | |V:3, | | |"elinks -dump" コマンドを | |elinks |I:20 |1654|html→text |使う HTML からテキストへの| | | | | |変換ソフト |     |---------+-----+----+---------------+--------------------------| | |V:3, | | |"links -dump" コマンドを使| |links |I:28 |2314|html→text |う HTML からテキストへの変| | | | | |換ソフト | |---------+-----+----+---------------+--------------------------| | |V:1, | | |"links2 -dump" コマンドを | |links2 |I:12 |5492|html→text |使う HTML からテキストへの| | | | | |変換ソフト | |---------+-----+----+---------------+--------------------------| |catdoc |V:14,|686 |MSWord→text,TeX|MSWord ファイルをプレーン | | |I:155| | |テキストか TeX に変換 | |---------+-----+----+---------------+--------------------------| |antiword |V:1, |589 |MSWord→text,ps |MSWord ファイルをプレーン | | |I:7 | | |テキストか ps に変換 | |---------+-----+----+---------------+--------------------------| |unhtml |V:0, |40 |html→text |HTML ファイルからマークア | | |I:0 | | |ップタグを削除 | |---------+-----+----+---------------+--------------------------| |odt2txt |V:2, |60 |odt→text |OpenDocument テキストから | | |I:40 | | |テキストへの変換ソフト | +---------------------------------------------------------------+ 11.1.8. プレーンテキストデーターをハイライトとフォーマット     以下のようにしてプレーンテキストデーターをハイライトとフォーマッ ト出来ます。 表11.6 プレーンテキストデーターをハイライトするツールのリスト +---------------------------------------------------------------+ | パッケージ |ポプ |サイズ|キーワード| 説明 | | |コン | | | | |----------------+-----+------+----------+----------------------| | | | | |":source $VIMRUNTIME/ | | |V:18,| | |syntax/html.vim" を使 | |vim-runtime |I:395|36525 |ハイライト|ってソースコードを | | | | | |HTML に変換するための | | | | | |Vim MACRO | |----------------+-----+------+----------+----------------------| | |V:0, | | |C プログラムから latex| |cxref |I:0 |1190 |c→html |か HTML への変換ソフト| | | | | |(C 言語) | |----------------+-----+------+----------+----------------------| | |V:0, | | |多くのソースコードの | |src2tex |I:0 |622 |ハイライト|TeX への変換ソフト (C | | | | | |言語) | |----------------+-----+------+----------+----------------------| | | | | |多くのソースコードを | | | | | |HTML と XHTML と LaTeX| |source-highlight|V:0, |2114 |ハイライト|と Texinfo と ANSI カ | | |I:5 | | |ラーエスケープシーケン| | | | | |スと DocBook にハイラ | | | | | |イト付きで変換 (C++) | |----------------+-----+------+----------+----------------------| | | | | |多くのソースコードを | | |V:0, | | |HTML と XHTML と LaTeX| |highlight |I:5 |1371 |ハイライト|と Tex と AXSL-FO にハ|     | | | | |イライト付きで変換 | | | | | |(C++) | |----------------+-----+------+----------+----------------------| |grc |V:0, |208 |text→color|汎用着色化ソフト | | |I:5 | | |(Python) | |----------------+-----+------+----------+----------------------| |pandoc |V:9, |194495|text→any |汎用マークアップコンバ| | |I:45 | | |ーター (Haskel) | |----------------+-----+------+----------+----------------------| | | | | |ReStructured テキスト | |python3-docutils|V:14,|1804 |text→any |文書の XML へのフォー | | |I:51 | | |マット化ソフト | | | | | |(Python) | |----------------+-----+------+----------+----------------------| | |V:0, | | |Markdown テキスト文書 | |markdown |I:9 |58 |text→html |の (X)HTML へのフォー | | | | | |マット化ソフト (Perl) | |----------------+-----+------+----------+----------------------| | |V:0, | | |AsciiDoc テキスト文書 | |asciidoctor |I:7 |98 |text→any |の XML/HTML へのフォー| | | | | |マット化ソフト (Ruby) | |----------------+-----+------+----------+----------------------| | |V:6, | | |ReStructured テキスト | |python3-sphinx |I:24 |2756 |text→any |を使う文書出版システム| | | | | |(Python) | |----------------+-----+------+----------+----------------------| | |V:0, | | |Markdown テキストを使 | |hugo |I:5 |78678 |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 要素の基本的シンタックスは以下のようにマークアップされます。     content     空の XML 要素は以下の短縮形を使ってマークアップされます。         上記例中の "attribute="value"" はオプションです。     XML 中のコメントセクションは以下のようにマークアップされます。         マークアップを追加する以外に、XML は以下の文字に関して事前定義さ れたエンティティを使い内容を少し改変する必要があります。 表11.7 XML で事前定義されているエントリーのリスト +---------------------------------------------+ |事前定義されたエンティティ| 変換先の文字 | |--------------------------+------------------| |" |" : 引用符 | |--------------------------+------------------|     |' |' : アポストロフィ| |--------------------------+------------------| |< |< : 以下 | |--------------------------+------------------| |> |> : 以上 | |--------------------------+------------------| |& |& : アンパサンド | +---------------------------------------------+ 注意     "<" と "&" はアトリビュートやエレメントには使えません。 注記     例えば "&some-tag;" 等の SGML スタイルのユーザー定義エンティティ が使われた場合、他の定義は無効で最初の定義が有効です。エンティテ ィ定義は "" と表現されます。 注記     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|I:403|2134 |xml |DocBook 用 XML ドキュメントタイ | | | | | |プ定義 (DTD) | |-----------+-----+-----+------+--------------------------------| | |V:13,| |xml/ |DocBook XML を XSLT を使って各種| |docbook-xsl|I:146|14851|xslt |アウトプットへ処理する XSL スタ | | | | | |イルシート | |-----------+-----+-----+------+--------------------------------| | |V:16,| | |XSLT コマンドラインプロセスソフ |     |xsltproc |I:79 |162 |xslt |ト (XML→ XML, HTML, plain text, | | | | | |他) | |-----------+-----+-----+------+--------------------------------| |xmlto |V:1, |130 |xml/ |XSLT を用いて XML から全てへの変| | |I:14 | |xslt |換ソフト | |-----------+-----+-----+------+--------------------------------| |fop |V:0, |284 |xml/ |Docbook XML ファイルを PDF に変 | | |I:11 | |xsl-fo|換 | |-----------+-----+-----+------+--------------------------------| |dblatex |V:2, |4636 |xml/ |XSLT を使って Docbook ファイルを| | |I:10 | |xslt |DVI, PostScript, PDF 文書へ変換 | |-----------+-----+-----+------+--------------------------------| |dbtoepub |V:0, |37 |xml/ |DocBook XML から .epub へのコン | | |I:0 | |xslt |バーター | +---------------------------------------------------------------+ XML は標準一般化マークアップ言語 (SGML) のサブセットなので、ドキ     ュメントスタイル構文規程言語 (DSSSL) 等の SGML 用として利用可能な 広範なツールで処理できます。 表11.9 DSSLツールのリスト +---------------------------------------------------------------+ | |ポプ|サイ|キー | | | パッケージ |コン| ズ |ワー | 説明 | | | | | ド | | |-------------+----+----+-----+---------------------------------| |openjade |V:1,|1061|dsssl|ISO/IEC 10179: 1996 標準 DSSSL プ| | |I:26| | |ロセッサ (最新版) | |-------------+----+----+-----+---------------------------------| | |V:0,| |xml/ |DocBook XML を各種出力フォーマッ |     |docbook-dsssl|I:13|2605|dsssl|トに DSSSL を使って処理するための| | | | | |DSSSL スタイルシート | |-------------+----+----+-----+---------------------------------| | | | | |docbook2* コマンドで DSSSL を使っ| |docbook-utils|V:0,|287 |xml/ |て DocBook ファイルを他のフォーマ| | |I:9 | |dsssl|ットに (HTML, RTF, PS, man, PDF) | | | | | |変換するなどのユーティリティー | |-------------+----+----+-----+---------------------------------| |sgml2x |V:0,|90 |SGML/|DSSSL スタイルシートを使う SGML | | |I:0 | |dsssl|や XML からの変換ソフト | +---------------------------------------------------------------+ ヒント     GNOME の yelp は DocBook XML ファイルを X 上に体裁良く表示するの で時々便利です。 11.2.3. XML データー抽出     他のフォーマットから以下を使うと HTML とか XML のデーターを抽出出 来ます。 表11.10 テキストデーター変換ツールのリスト +---------------------------------------------------------------+ |パッケー |ポプ|サイ| キーワード | 説明 | | ジ |コン| ズ | | | |---------+----+----+---------------+---------------------------| |man2html |V:0,|142 |manpage→html |manpage から HTML への変換 | | |I:1 | | |ソフト (CGI サポート) | |---------+----+----+---------------+---------------------------| |doclifter|I:0 |472 |troff→xml |troff から DocBook XML への| | | | | |変換ソフト | |---------+----+----+---------------+---------------------------| |texi2html|V:0,|1847|texi→html |Texinfo から HTML への変換 | | |I:5 | | |ソフト |     |---------+----+----+---------------+---------------------------| |info2www |V:1,|74 |info→html |GNU info から HTML への変換| | |I:2 | | |ソフト (CGI サポート) | |---------+----+----+---------------+---------------------------| |wv |V:0,|733 |MSWord→any |Microsoft Word から HTML や| | |I:4 | | |LaTeX 等への文書変換ソフト | |---------+----+----+---------------+---------------------------| |unrtf |V:0,|148 |rtf→html |RTF から HTML 等への文書変 | | |I:3 | | |換ソフト | |---------+----+----+---------------+---------------------------| | | | | |WordPerfect 5.0 と 5.1 ファ| |wp2x |V:0,|200 |WordPerfect→any|イルから TeX と LaTeX と | | |I:0 | | |troff と GML と HTML への変| | | | | |換ソフト | +---------------------------------------------------------------+ 11.2.4. XML データーの静的解析     非 XML の HTML ファイルの場合は、これらを整合性ある XML である XHTML に変換できます。XHTML は XML ツールで処理できます。     XML ファイルのシンタックスやファイル中で見かける URL の適正性が確 認されるかもしれません。 表11.11 XML整形印刷ツールのリスト +---------------------------------------------------------------+ | |ポプ |サ | | | | パッケージ |コン |イ | 機能 | 説明 | | | |ズ | | | |-------------+-----+---+--------------+------------------------| | | | | |xmllint(1) (シンタクスチ| |libxml2-utils|V:21,|180|xml↔html↔xhtml|ェック、リフォーマット、| | |I:213| | |静的解析、他) を含むコマ| | | | | |ンドライン XML ツール |     |-------------+-----+---+--------------+------------------------| | |V:1, | | |HTML シンタックスチェッ | |tidy |I:9 |75 |xml↔html↔xhtml|クソフトとリフォーマット| | | | | |ソフト | |-------------+-----+---+--------------+------------------------| |weblint-perl |V:0, |32 |静的解析(lint)|HTML 用のシンタックス最 | | |I:1 | | |小限の文体チェックソフト| |-------------+-----+---+--------------+------------------------| | |V:0, | | |高速リンクチェックソフト| |linklint |I:0 |343|リンクチェック|とウェッブサイトメンテツ| | | | | |ール | +---------------------------------------------------------------+     一度適正な XML が生成されれば、XSLT 技術を使ってマークアップコン テキスト等に基づいてデーターを抽出出来ます。 11.3. タイプセッティング     Unix のtroff プログラムは最初 AT&T で開発されました。それはマンペ ージを作成するのに通常使われます。 Donald Knuth 氏によって作成された TeX は非常に強力な組版ツールで     デファクト標準です。最初 Leslie Lamport 氏によって書かれた LaTeX は TeX の力への高レベルアクセスを可能にします。 表11.12 タイプ設定ツールのリスト +--------------------------------------------------------------+ |パッケ |ポプコ |サイ |キーワ | 説明 | | ージ | ン | ズ | ード | | |-------+-------+-----+-------+--------------------------------|     |texlive|V:2, |56 |(La)TeX|組版、校正、印刷のための TeX シ | | |I:35 | | |ステム | |-------+-------+-----+-------+--------------------------------| |groff |V:2, |20720|troff |GNU troff テキストフォーマティン| | |I:36 | | |グシステム | +--------------------------------------------------------------+ 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 マンページ作成を補助するパッケージのリスト +---------------------------------------------------------------+ | |ポプ|サ | | | | パッケージ |コン|イ | キーワード | 説明 | | | |ズ | | | |--------------+----+---+------------+--------------------------| |docbook-to-man|V:0,|191|SGML→manpage|DocBook SGML から roff man| | |I:8 | | |マクロへの変換ソフト |     |--------------+----+---+------------+--------------------------| |help2man |V:0,|542|text→manpage|--help からの自動マンペー | | |I:7 | | |ジ生成ソフト | |--------------+----+---+------------+--------------------------| |info2man |V:0,|134|info→manpage|GNU info から POD かマンペ| | |I:0 | | |ージへの変換ソフト | |--------------+----+---+------------+--------------------------| |txt2man |V:0,|112|text→manpage|ベタの ASCII テキストから | | |I:0 | | |マンページ形式へ変換 | +---------------------------------------------------------------+ 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:161,|179 |GPL 版 Ghostscript PostScript/PDF| | |I:583 | |インタープリタ | |----------------+------+-----+---------------------------------| | |V:2, | |GPL 版 Ghostscript PostScript/PDF| |ghostscript-x |I:38 |87 |インタープリタ - X ディスプレーサ|     | | | |ポート | |----------------+------+-----+---------------------------------| |libpoppler102 |V:16, |4274 |xpdf PDF ビューワー派生PDF レンダ| | |I:129 | |リングライブラリー | |----------------+------+-----+---------------------------------| |libpoppler-glib8|V:260,|484 |PDF レンダリングライブラリー | | |I:485 | |(GLib 準拠共有ライブラリー) | |----------------+------+-----+---------------------------------| |poppler-data |V:134,|13086|PDF レンダリングライブラリー用 | | |I:607 | |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:152,|728 |pdf→ps,text,…|pdftops, pdfinfo, | | |I:471 | | |pdfimages, pdftotext, | | | | | |pdffonts | |-------------+------+----+-------------+-----------------------| |psutils |V:4, |219 |ps→ps |PostScript 文書変換ツー| | |I:67 | | |ル | |-------------+------+----+-------------+-----------------------| |poster |V:0, |57 |ps→ps |PostScript ページから大| | |I:3 | | |きなポスターを作る | |-------------+------+----+-------------+-----------------------| | | | | |ASCII テキストから | |enscript |V:1, |2130|text→ps, |PostScript か HTML か | | |I:14 | |html, rtf |RTF か Pretty-Print へ | | | | | |の変換 | |-------------+------+----+-------------+-----------------------| | |V:0, | | |全てを PostScript に変 | |a2ps |I:10 |3979|text→ps |換するソフトと綺麗印刷 | | | | | |ソフト | |-------------+------+----+-------------+-----------------------| |pdftk |I:37 |28 |pdf→pdf |PDF 文書変換ツール: | | | | | |pdftk | |-------------+------+----+-------------+-----------------------| |html2ps |V:0, |261 |html→ps |HTML から PostScript へ| | |I:2 | | |の変換ソフト | |-------------+------+----+-------------+-----------------------| |gnuhtml2latex|V:0, |27 |html→latex |html から latex への変 |     | |I:0 | | |換ソフト | |-------------+------+----+-------------+-----------------------| |latex2rtf |V:0, |495 |latex→rtf |LaTeX から MS Word で読| | |I:4 | | |める RTF へと文書変換 | |-------------+------+----+-------------+-----------------------| | | | | |PostScript から EPS (カ| |ps2eps |V:2, |95 |ps→eps |プセル化済み | | |I:42 | | |PostScript) への変換ソ | | | | | |フト | |-------------+------+----+-------------+-----------------------| | | | | |日本語符号化サポート付 | |e2ps |V:0, |109 |text→ps |きの Text から | | |I:0 | | |PostScript への変換ソフ| | | | | |ト | |-------------+------+----+-------------+-----------------------| |impose+ |V:0, |118 |ps→ps |PostScript ユーティリテ| | |I:0 | | |ィー | |-------------+------+----+-------------+-----------------------| | | | | |多くのソースコード (C, | | |V:0, | | |C++, Java, Pascal, | |trueprint |I:0 |149 |text→ps |Perl, Pike, Sh, | | | | | |Verilog) の PostScript | | | | | |への綺麗印刷 (C 言語) | |-------------+------+----+-------------+-----------------------| | | | | |PDF からスケール可のベ | |pdf2svg |V:0, |32 |pdf→svg |クトルグラフィクス | | |I:3 | | |(SVG) フォーマットへの | | | | | |変換ソフト | |-------------+------+----+-------------+-----------------------| | |V:0, | | |PDF から IPE の XML フ | |pdftoipe |I:0 |65 |pdf→ipe |ォーマットへの変換ソフ | | | | | |ト | +---------------------------------------------------------------+ 11.4.4. CUPS を使って印刷 Common Unix Printing System (CUPS) が提供する、lp(1) と lpr(1) コ     マンドの両方が印刷可能なデーターの印刷をカスタム化するオプション を提供します。     以下のコマンドの内のひとつを使い一つのファイルに対し3部の印刷を ページ順に揃えてできます。     $ 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:2,|1415|メール |shar(1) と unshar(1) と uuencode(1)| | |I:36| | |と uudecode(1) | |---------+----+----+-------+-----------------------------------| |mpack |V:1,|108 |MIME |MIME メッセージの符号化と逆符号化の|     | |I:11| | |ソフト: mpack(1) と munpack(1) | |---------+----+----+-------+-----------------------------------| | |V:0,| | |Microsoft のみのフォーマットの | |tnef |I:6 |110 |ms-tnef|"application/ms-tnef" タイプの MIME| | | | | |アタッチメントを開梱 | |---------+----+----+-------+-----------------------------------| | |V:0,| | |以下のフォーマットのエンコーダーと | |uudeview |I:3 |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, |画像デザイナー用のメタ| |design-desktop-graphics |I:0 |13 |jpeg, |パッケージ |     | | | |… | | |------------------------+----+---+------+----------------------| | | | |svg, |画像や絵画芸術教育用の| |education-graphics |I:0 |30 |jpeg, |メタパッケージ | | | | |… | | |------------------------+----+---+------+----------------------| |open-font-design-toolkit|I:0 |9 |ttf, |オープンフォントデザイ| | | | |ps, … |ン用のメタパッケージ | +---------------------------------------------------------------+ ヒント     aptitude(8) の正規表現 "~Gworks-with::image" (「aptitude を使った 探索方法」を参照下さい) を使ってさらなる画像ツールを探します。 11.6.2. 画像データーツール (GUI)     以下の GUI の画像データー変換、編集、整理用パッケージが著者の目に 止まりました。 表11.18 画像データーツール (GUI) のリスト +---------------------------------------------------------------+ | パッケージ |ポプ |サイ |キーワー| 説明 | | |コン | ズ | ド | | |----------------+-----+-----+--------+-------------------------| |gimp |V:50,|19304|画像 |GNU イメージ操作プログラ | | |I:252| |(bitmap)|ム | |----------------+-----+-----+--------+-------------------------| | |V:12,| |画像 |GTK に基づく SANE | |xsane |I:144|2339 |(bitmap)|(Scanner Access Now Easy)| | | | | |用の X11 フロントエンド | |----------------+-----+-----+--------+-------------------------| |scribus |V:1, |31345|ps/pdf/ |Scribus DTP エディター | | |I:16 | |SVG/… | | |----------------+-----+-----+--------+-------------------------| |libreoffice-draw|V:72,|10312|画像 |LibreOffice office スイー| | |I:430| |(vector)|ト - ドロー | |----------------+-----+-----+--------+-------------------------| |inkscape |V:15,|99800|画像 |SVG (スケーラブルベクトル| | |I:112| |(vector)|グラフィクス) エディター | |----------------+-----+-----+--------+-------------------------| |dia |V:2, |3741 |画像 |ダイアグラムエディター | | |I:22 | |(vector)|(Gtk) | |----------------+-----+-----+--------+-------------------------| |xfig |V:0, |7849 |画像 |X11 下でインテラクティブ | | |I:11 | |(vector)|生成するソフト | |----------------+-----+-----+--------+-------------------------| |gocr |V:0, |540 |画像→テ |フリー OCR ソフト | | |I:7 | |キスト | | |----------------+-----+-----+--------+-------------------------| |eog |V:64,|7770 |画像 |画像ビューアープログラム | | |I:277| |(Exif) |Eye of GNOME | |----------------+-----+-----+--------+-------------------------| |gthumb |V:3, |5032 |画像 |画像ビューアー兼ブラウザ | | |I:16 | |(Exif) |ー (GNOME) | |----------------+-----+-----+--------+-------------------------| |geeqie |V:4, |2522 |画像 |GTK を用いた画像ビューア | | |I:15 | |(Exif) |ー |     |----------------+-----+-----+--------+-------------------------| |shotwell |V:17,|6263 |画像 |デジタル写真オーガナイザ | | |I:255| |(Exif) |ー (GNOME) | |----------------+-----+-----+--------+-------------------------| |gwenview |V:33,|11755|画像 |画像ビューア (KDE) | | |I:106| |(Exif) | | |----------------+-----+-----+--------+-------------------------| |kamera |I:105|998 |画像 |KDE アプリケーション用デ | | | | |(Exif) |ジタルカメラサポート | |----------------+-----+-----+--------+-------------------------| |digikam |V:1, |293 |画像 |デジタル写真管理アプリケ | | |I:9 | |(Exif) |ーション | |----------------+-----+-----+--------+-------------------------| |darktable |V:4, |30554|画像 |写真家のための仮想ライト | | |I:13 | |(Exif) |ボックスと暗室 | |----------------+-----+-----+--------+-------------------------| |hugin |V:0, |5208 |画像 |パノラマ写真合成機 | | |I:8 | |(Exif) | | |----------------+-----+-----+--------+-------------------------| |librecad |V:1, |8963 |DXF, ...|2D CAD データーエディター| | |I:15 | | | | |----------------+-----+-----+--------+-------------------------| |freecad |I:18 |36 |DXF, ...|3D CAD データーエディター| |----------------+-----+-----+--------+-------------------------| | |V:3, | |blend, |アニメーション等用の 3D | |blender |I:28 |84492|TIFF, |コンテントエディター | | | | |VRML, … | | |----------------+-----+-----+--------+-------------------------| | |V:0, | |ms3d, |OpenGL 準拠の 3D モデルエ| |mm3d |I:0 |3881 |obj, |ディター | | | | |dxf, … | | |----------------+-----+-----+--------+-------------------------| | |V:0, | |ttf, ps,|PS と TrueType と | |fontforge |I:6 |3993 |… |OpenType のフォント用フォ| | | | | |ントエディター | |----------------+-----+-----+--------+-------------------------| | |V:0, | | |TrueType フォントをグリッ| |xgridfit |I:0 |806 |ttf |ドフィッティングとヒンテ | | | | | |ィング用のプログラム | +---------------------------------------------------------------+ 11.6.3. 画像データーツール (CLI)     以下の CLI の画像データー変換、編集、整理用パッケージが著者の目に 止まりました。 表11.19 画像データーツールのリスト (CLI) +---------------------------------------------------------------+ | パッケージ |ポプ |サイ| キーワード | 説明 | | |コン | ズ | | | |-----------------+-----+----+------------+---------------------| |imagemagick |I:317|74 |画像 |画像操作プログラム | | | | |(bitmap) | | |-----------------+-----+----+------------+---------------------| | |V:1, | |画像 |画像操作プログラム | |graphicsmagick |I:11 |5565|(bitmap) |(imagemagick のフォー| | | | | |ク) | |-----------------+-----+----+------------+---------------------| |netpbm |V:28,|8526|画像 |画像変換ツール | | |I:326| |(bitmap) | | |-----------------+-----+----+------------+---------------------| | | | | |High Efficiency Image| | | | | |File Format (HEIF) を| |libheif-examples |V:0, |191 |heif→jpeg |JPEG や PNG や Y4M フ| | |I:2 | |(bitmap) |ォーマットに | | | | | |heif-convert(1) コマ | | | | | |ンドで変換 | |-----------------+-----+----+------------+---------------------| | | | | |MS Windows のアイコン| |icoutils |V:7, |221 |png↔ico |やカーソールと PNG フ| | |I:50 | |(bitmap) |ォーマット間の変換 | | | | | |(favicon.ico) | |-----------------+-----+----+------------+---------------------| | | | | |PostScript と PDF フ | |pstoedit |V:2, |1011|ps/pdf→画像 |ァイルから編集可能な | | |I:52 | |(vector) |ベクトルグラフィクス | | | | | |への変換ソフト (SVG) | |-----------------+-----+----+------------+---------------------| | |V:7, | |Windows/画像|Windows メタファイル | |libwmf-bin |I:119|151 |(vector) |(ベクトル画像データ | | | | | |ー) 変換ツール | |-----------------+-----+----+------------+---------------------| | |V:0, | |fig→sxd |XFig ファイルを | |fig2sxd |I:0 |151 |(vector) |OpenOffice.org Draw | | | | | |フォーマットに変換 | |-----------------+-----+----+------------+---------------------| |unpaper |V:2, |412 |画像→画像 |OCR 用のスキャンした | | |I:17 | | |ページの後処理ツール | |-----------------+-----+----+------------+---------------------| | |V:7, | |画像→テキス |HP の商用 OCR エンジ | |tesseract-ocr |I:33 |2228|ト |ンの基づくフリーの | | | | | |OCR ソフトウェアー | |-----------------+-----+----+------------+---------------------| | |V:7, | |画像→テキス |OCR エンジンデーター:|     |tesseract-ocr-eng|I:34 |4032|ト |tesseract-ocr の英文 | | | | | |用言語ファイル | |-----------------+-----+----+------------+---------------------| |ocrad |V:0, |587 |画像→テキス |フリー OCR ソフト | | |I:3 | |ト | | |-----------------+-----+----+------------+---------------------| | | | | |JPEG ファイル中の | |exif |V:2, |339 |画像(Exif) |EXIF 情報を表示するコ| | |I:42 | | |マンドラインユーティ | | | | | |リティー | |-----------------+-----+----+------------+---------------------| |exiv2 |V:2, |275 |画像(Exif) |EXIF/IPTC メタデータ | | |I:27 | | |ー操作ツール | |-----------------+-----+----+------------+---------------------| |exiftran |V:1, |69 |画像(Exif) |デジタルカメラの jpeg| | |I:14 | | |画像を変換 | |-----------------+-----+----+------------+---------------------| | | | | |デジタルカメラの JPEG| |exiftags |V:0, |292 |画像(Exif) |ファイルから Exif タ | | |I:3 | | |グを読むユーティリテ | | | | | |ィー | |-----------------+-----+----+------------+---------------------| |exifprobe |V:0, |499 |画像(Exif) |デジタル写真からメタ | | |I:3 | | |データーを読み出す | |-----------------+-----+----+------------+---------------------| |dcraw |V:1, |583 |画像(Raw) |生のデジタルカメラ画 | | |I:12 | |→ppm |像のデコード | |-----------------+-----+----+------------+---------------------| |findimagedupes |V:0, |77 |画像 |視覚的な類似画像と重 | | |I:1 | |→fingerprint|複画像の検出 | |-----------------+-----+----+------------+---------------------| | |V:0, | | |忠実度を上げたりモザ | |ale |I:0 |839 |画像→画像 |イクを作成するための | | | | | |画像のマージ | |-----------------+-----+----+------------+---------------------| |imageindex |V:0, |145 |画像(Exif) |イメージから静的な | | |I:1 | |→html |HTML ギャラリーを生成| |-----------------+-----+----+------------+---------------------| |outguess |V:0, |230 |jpeg,png |普遍的 Steganographic| | |I:1 | | |ツール | |-----------------+-----+----+------------+---------------------| |jpegoptim |V:0, |59 |jpeg |JPEG ファイルの最適化| | |I:7 | | | | |-----------------+-----+----+------------+---------------------| |optipng |V:3, |213 |png |PNG ファイルのロスレ | | |I:43 | | |ス最適化 | |-----------------+-----+----+------------+---------------------| |pngquant |V:0, |61 |png |PNG ファイルのロッシ | | |I:9 | | |ー最適化 | +---------------------------------------------------------------+ 11.7. その他のデーター変換 多くのデーター変換プログラムがあります。aptitude(8) で     "~Guse::converting" という正規表現 (「aptitude を使った探索方法」 を参照下さい) を使い以下のプログラムが私の目に止まりました。 表11.20 その他のデーター変換ツールのリスト +---------------------------------------------------------------+ |パッケー |ポプ|サイ |キーワー | 説明 | | ジ |コン| ズ | ド | | |---------+----+-----+---------+--------------------------------| |alien |V:1,|163 |rpm/ |外来のパッケージの Debian パッケ| | |I:19| |tgz→deb |ージへの変換ソフト |     |---------+----+-----+---------+--------------------------------| | | | | |"Electric Book" (日本で人気) か | |freepwing|V:0,|424 |EB→EPWING|ら単一の JIS X 4081 フォーマット| | |I:0 | | |(EPWING V1 のサブセット) への変 | | | | | |換ソフト | |---------+----+-----+---------+--------------------------------| |calibre |V:6,|63385|any→EPUB |e-book コンバーターとライブラリ | | |I:28| | |ーの管理 | +---------------------------------------------------------------+     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:884, |191 |sh 用の小型で高速の POSIX 準拠シ| | |I:997 | |ェル | |-------------+----------+-----+--------------------------------| |coreutils |V:880, |18307|GNU コアユーティリティー | | |I:999 | | | |-------------+----------+-----+--------------------------------| |grep |V:782, |1266 |GNU grep, egrep and fgrep | | |I:999 | | | |-------------+----------+-----+--------------------------------|     |sed |V:790, |987 |GNU sed | | |I:999 | | | |-------------+----------+-----+--------------------------------| |mawk |V:442, |285 |小さく高速な awk | | |I:997 | | | |-------------+----------+-----+--------------------------------| |debianutils |V:907, |224 |Debian 特有の雑多なユーティリテ | | |I:999 | |ィー | |-------------+----------+-----+--------------------------------| |bsdutils |V:519, |356 |4.4BSD-Lite 由来の基本ユーティリ| | |I:999 | |ティー | |-------------+----------+-----+--------------------------------| |bsdextrautils|V:596, |339 |4.4BSD-Lite 由来の追加のユーティ| | |I:713 | |リティー | |-------------+----------+-----+--------------------------------| |moreutils |V:15, I:38|231 |追加の Unix ユーティリティー | +---------------------------------------------------------------+ ヒント     moreutils は Debian の外では存在しないかも知れませんが、興味深い 小さなプログラムを提供します。もっとも特記すべきは、オリジナルフ ァイルを上書きしたいときに非常に有効な sponge(8) です。     例は「Unix 的テキスト処理」を参照下さい。 12.2. インタープリター言語でのスクリプティング 表12.8 インタープリター関連のパッケージのリスト +---------------------------------------------------------------+ | パッケージ |ポプコ|サイ| 文書 | | | ン | ズ | | |-------------------------+------+----+-------------------------| |dash |V:884,|191 |sh: sh 用の小型高速 POSIX| | |I:997 | |準拠シェル | |-------------------------+------+----+-------------------------| |bash |V:838,|7175|sh: bash-doc が提供する | | |I:999 | |"info bash" | |-------------------------+------+----+-------------------------| |mawk |V:442,|285 |AWK: 小型高速 awk | | |I:997 | | | |-------------------------+------+----+-------------------------| |gawk |V:285,|2906|AWK: gawk-doc が提供する | | |I:349 | |"info gawk" | |-------------------------+------+----+-------------------------| | |V:707,| |Perl: perl-doc and | |perl |I:989 |673 |perl-doc-html が提供する| | | | |perl(1) と html ページ | |-------------------------+------+----+-------------------------|     | |V:2, | |GNU ReadLine/History ライ| |libterm-readline-gnu-perl|I:29 |380 |ブラリーのための Perl 拡 | | | | |張: perlsh(1) | |-------------------------+------+----+-------------------------| |libreply-perl |V:0, |171 |PerlのREPL: reply(1) | | |I:0 | | | |-------------------------+------+----+-------------------------| |libdevel-repl-perl |V:0, |237 |PerlのREPL: re.pl(1) | | |I:0 | | | |-------------------------+------+----+-------------------------| | |V:718,| |Python: python-doc が提供| |python3 |I:953 |81 |する python3(1) と html | | | | |ページ | |-------------------------+------+----+-------------------------| |tcl |V:25, |21 |Tcl: tcl-doc が提供する | | |I:218 | |tcl(3) と詳細なマンページ| |-------------------------+------+----+-------------------------| |tk |V:20, |21 |Tk: tk-doc が提供する tk | | |I:211 | |(3) と詳細なマンページ | |-------------------------+------+----+-------------------------| |ruby |V:86, |29 |Ruby: ruby(1), erb(1), | | |I:208 | |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:192,|651 |xmessage(1): window 中にメッセージや質問 | | |I:566 | |を表示 (X) | |---------+------+----+-----------------------------------------| |whiptail |V:284,|56 |シェルスクリプトからユーザーフレンリーな | | |I:996 | |ダイアログボックスを表示 (newt) | |---------+------+----+-----------------------------------------|     |dialog |V:11, |1227|シェルスクリプトからユーザーフレンリーな | | |I:99 | |ダイアログボックスを表示 (ncurses) | |---------+------+----+-----------------------------------------| |zenity |V:76, |183 |シェルスクリプトからグラフィカルなダイア | | |I:363 | |ログボックスを表示 (GTK) | |---------+------+----+-----------------------------------------| | |V:0, | |シェルスクリプトフロントエンドツール | |ssft |I:0 |75 |(gettext を使った zenity や kdialog や | | | | |dialog のラッパー) | |---------+------+----+-----------------------------------------| |gettext |V:56, |5818|"/usr/bin/gettext.sh": メッセージ翻訳 | | |I:259 | | | +---------------------------------------------------------------+     簡単なシェルスクリプトだけでできるほど GUI プログラムがいかに簡単 ということを示す GUI プログラムの例は以下です。     このスクリプトはファイルの選択(デフォルトは/etc/motd) に zenity を使い、それを表示します。     このスクリプトの GUI ローンチャーは以下のようにして生成できます「 GUI からプログラムをスタート」. #!/bin/sh -e # Copyright (C) 2021 Osamu Aoki , 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:167, |36 |GNU C コンパイラ | | |I:550 | | | |----------------+-------+-----+--------------------------------| |libc6-dev |V:248, |12053|GNU C ライブラリー: 開発用ライブ| | |I:567 | |ラリーとヘッダーファイル集 | |----------------+-------+-----+--------------------------------| |g++ |V:56, |13 |GNU C++ コンパイラー | | |I:501 | | | |----------------+-------+-----+--------------------------------| |libstdc++-10-dev|V:14, |17537|GNU 標準 C++ ライブラリー v3 (開| | |I:165 | |発用ファイル集) | |----------------+-------+-----+--------------------------------| |cpp |V:334, |18 |GNU C プリプロセッサ | | |I:727 | | | |----------------+-------+-----+--------------------------------| |gettext |V:56, |5818 |GNU 国際化ユーティリティ | | |I:259 | | | |----------------+-------+-----+--------------------------------| |glade |V:0, |1204 |GTK ユーザーインターフェースビル| | |I:5 | |ダー | |----------------+-------+-----+--------------------------------| |valac |V:0, |725 |GObject システム用の C# に似た言| | |I:4 | |語 |     |----------------+-------+-----+--------------------------------| |flex |V:7, |1243 |LEX 互換の高速字句解析ジェネレー| | |I:73 | |タ | |----------------+-------+-----+--------------------------------| |bison |V:7, |3116 |YACC互換のパーサジェネレータ | | |I:80 | | | |----------------+-------+-----+--------------------------------| |susv2 |I:0 |16 |"The Single UNIX Specifications | | | | |v2" を取得 | |----------------+-------+-----+--------------------------------| |susv3 |I:0 |16 |"The Single UNIX Specifications | | | | |v3" を取得 | |----------------+-------+-----+--------------------------------| |susv4 |I:0 |16 |"The Single UNIX Specifications | | | | |v4" を取得 | |----------------+-------+-----+--------------------------------| |golang |I:20 |11 |Go プログラミング言語コンパイラ | | | | |ー | |----------------+-------+-----+--------------------------------| |rustc |V:3, |8860 |Rust システムプログラム言語 | | |I:14 | | | |----------------+-------+-----+--------------------------------| |haskell-platform|I:1 |12 |標準 Haskell ライブラリーとツー | | | | |ル | |----------------+-------+-----+--------------------------------| |gfortran |V:6, |15 |GNU Fortran 95 コンパイラー | | |I:62 | | | |----------------+-------+-----+--------------------------------| |fpc |I:2 |103 |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 #include #include 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, |3116|GNU LALR パーサー生成ソフト |     | |I:80 | | | |-------+-------+----+-------------------------------------------| |byacc |V:0, |258 |Berkeley LALR パーサー生成ソフト | | |I:4 | | | |-------+-------+----+-------------------------------------------| |btyacc |V:0, |243 |byacc に基づいたバックトラッキング機能付き | | |I:0 | |パーサー生成ソフト | +----------------------------------------------------------------+     bison(1) の入門書は "info bison" の中にあります。 あなた自身の "main()" と "yyerror()" を供給する必要があります。     "main()" は、Flex によって通常作成された "yylex()" を呼び出す "yyparse()" を呼び出します。     シンプルなターミナル上の計算機プログラムの作成例をここに示します 。     example.y を作成しましょう: /* calculator source for bison */ %{ #include 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 |2591 |Vim 8 や NeoVim 用の非同期静的解析| | | | |エンジン | |---------------+------+-----+----------------------------------| |vim-syntastic |I:3 |1379 |Vim 用のシンタックスシェックのハッ| | | | |ク | |---------------+------+-----+----------------------------------| |elpa-flycheck |V:0, |808 |Emacs 用の現代的な同時進行のシンタ| | |I:1 | |ックスチェック | |---------------+------+-----+----------------------------------| |elpa-relint |V:0, |147 |Emacs Lisp の正規表現 (regexp) の | | |I:0 | |間違い検出器 | |---------------+------+-----+----------------------------------| |cppcheck-gui |V:0, |7224 |静的 C/C++ コード分析ツール (GUI) | | |I:1 | | | |---------------+------+-----+----------------------------------| |shellcheck |V:2, |18987|シェルスクリプトの静的解析(lint)ツ| | |I:13 | |ール | |---------------+------+-----+----------------------------------| |pyflakes3 |V:2, |20 |Python 3 の受動チェッカー | | |I:15 | | | |---------------+------+-----+----------------------------------| |pylint |V:4, |2018 |Python コード静的チェックソフト | | |I:20 | | | |---------------+------+-----+----------------------------------| |perl |V:707,|673 |静的コードチェックソフト付きのイン| | |I:989 | |タープリタ: B::Lint(3perl) | |---------------+------+-----+----------------------------------| |rubocop |V:0, |3247 |Ruby 静的コード分析ツール | | |I:0 | | | |---------------+------+-----+----------------------------------|     |clang-tidy |V:2, |21 |Clang に基づく C++ の静的解析 | | |I:11 | |(lint)ツール | |---------------+------+-----+----------------------------------| |splint |V:0, |2320 |C プログラムを静的にバグのチェック| | |I:2 | |するためのツール | |---------------+------+-----+----------------------------------| |flawfinder |V:0, |205 |C/C++ ソースコードを検査してセキュ| | |I:0 | |リティーの脆弱性を探すツール | |---------------+------+-----+----------------------------------| |black |V:3, |660 |非妥協的な Python コードフォーマッ| | |I:13 | |ター | |---------------+------+-----+----------------------------------| |perltidy |V:0, |2493 |Perl スクリプトのインデントとリフ | | |I:4 | |ォーマット | |---------------+------+-----+----------------------------------| |indent |V:0, |431 |C 言語ソースコードフォーマッタープ| | |I:7 | |ログラム | |---------------+------+-----+----------------------------------| |astyle |V:0, |785 |C と C++ と Objective-C と C# と | | |I:2 | |Java のソースコードインデンター | |---------------+------+-----+----------------------------------| |bcpp |V:0, |111 |C(++) の美化プログラム | | |I:0 | | | |---------------+------+-----+----------------------------------| |xmlindent |V:0, |53 |XML ストリームリフォーマッタ | | |I:1 | | | |---------------+------+-----+----------------------------------| |global |V:0, |1908 |ソースコードの検索と閲覧のツール | | |I:2 | | | |---------------+------+-----+----------------------------------| |exuberant-ctags|V:2, |341 |ソースコード定義のタグファイルのイ| | |I:20 | |ンデックスの構築 | |---------------+------+-----+----------------------------------| |universal-ctags|V:1, |3386 |ソースコード定義のタグファイルのイ| | |I:11 | |ンデックスの構築 | +---------------------------------------------------------------+ 12.5. デバグ デバッグはプログラミング活動において重要です。プログラムのデバッ     グ法を知ることで、あなたも意味あるバグリポートを作成できるような 良い Debian ユーザーになれます。 表12.13 デバッグパッケージのリスト +----------------------------------------------------------+ |パッケージ| ポプコン |サイズ| 文書 |     |----------+----------+------+-----------------------------| |gdb |V:14, I:96|11637 |gdb-doc が提供する "info gdb"| |----------+----------+------+-----------------------------| |ddd |V:0, I:7 |4105 |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:248,|12053|mtrace(1): glibc 中の malloc デバッ| | |I:567 | |グ機能 | |--------------+------+-----+-----------------------------------| |valgrind |V:6, |78191|メモリーデバッガとプロファイラ | | |I:37 | | | |--------------+------+-----+-----------------------------------|     |electric-fence|V:0, |73 |malloc(3) デバッガ | | |I:3 | | | |--------------+------+-----+-----------------------------------| |libdmalloc5 |V:0, |390 |メモリーアロケーションのデバグ用ラ | | |I:2 | |イブラリー | |--------------+------+-----+-----------------------------------| | |V:0, | |C および C++ プログラムのバッファオ| |duma |I:0 |296 |ーバーランとアンダーランを検出する | | | | |ライブラリー | |--------------+------+-----+-----------------------------------| |leaktracer |V:0, |56 |C++ プログラム用のメモリーリーク追 | | |I:1 | |跡ソフト | +---------------------------------------------------------------+ 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:151, |1592 |make-doc が提供する "info make" | | |I:555 | | | |-----------+-------+-----+-------------------------------------| |autoconf |V:31, |2025 |autoconf-doc が提供する "info | | |I:230 | |autoconf | |-----------+-------+-----+-------------------------------------| |automake |V:30, |1837 |automake1.10-doc が提供する "info | | |I:228 | |automake" | |-----------+-------+-----+-------------------------------------|     |libtool |V:25, |1213 |libtool-doc が提供する "info libtool"| | |I:212 | | | |-----------+-------+-----+-------------------------------------| |cmake |V:17, |36607|クロスプラットフォームでオープンソー | | |I:115 | |スの make システム cmake(1) | |-----------+-------+-----+-------------------------------------| |ninja-build|V:6, |428 |Make と似た精神の小さなビルドシステム| | |I:41 | |ninja(1) | |-----------+-------+-----+-------------------------------------| |meson |V:3, |3759 |ninja の上に構築された高生産性のビル | | |I:22 | |ドシステム meson(1) | |-----------+-------+-----+-------------------------------------| |xutils-dev |V:0, |1484 |imake(1), xmkmf(1), 他 | | |I: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:707,|673|AWK→PERL |AWK から PERL へのソースコード変|     | |I:989 | | |換シフト: a2p(1) | |---------+------+---+---------+--------------------------------| |f2c |V:0, |442|FORTRAN→C|FORTRAN 77 から C/C++ へのソース| | |I:3 | | |コード変換ソフト: f2c(1) | |---------+------+---+---------+--------------------------------| | |V:0, | | |NASM (Intel フォーマット) から | |intel2gas|I:0 |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.125版)" (2024-11-15 13:32:55 UTC)     が Debian 迷路の真っ只中にいる皆様にとって解決の糸口となることを 望みます。 A.2. 著作権の経緯 Debian リファレンスは青木修 が個人用シ     ステム管理メモとして書き始められました。多くの内容が 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.125)" (2024-11-15 13:32:55 UTC)     は、主に Bookworm (=stable) と Trixie (=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.125版)     " (2024-11-15 13:32:55 UTC) の内容はほとんど私自身の仕事です。こ れらはコントリビュータ−によっても更新されています。     "Debian リファレンス (第1版)" は、角田慎一さんがすべて日本語訳し ました。 "Debian リファレンス (第2版)" は、英文原著者の青木修自身がすべて を日本語訳しました。その際に "Debian リファレンス (第1版)" から内     容が比較的変更されていない「第1章 GNU/Linux チュートリアル」等で は、角田さんの旧訳文を青木が文体や内容を調整した上で一部再利用さ せて頂きました。     著者である青木修は本文書を世に送ることにご助力戴いた皆様に感謝い たします。 A.3. 文書のフォーマット 英語の元文書のソースは現在 DocBook XML ファイルで書かれています。     この Docbook XML ソースは HTML やプレーンテキストや PostScript や PDF に変換されます。 (一部書式は頒布時にスキップされるかもしれま せん。)