第9章 システムに関するティップ

# 第9章 システムに関するティップ

主にコンソールからシステムを設定や管理する基本的なティップを次に記します。

## 9.1. コンソールのティップ

コンソール活動を補助するユーティリティー プログラムがいくつかあります。

表9.1 コンソールの活動をサポートするプログラムのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`mc` | V:39, I:179 | 1590 | 「ミッドナイトコマンダー (MC)」を参照
`bsdutils` | V:445, I:1000 | 338 | ターミナル セッションの記録を作成する `script` コマンド
`screen` | V:52, I:198 | 991 | VT100/ANSI ターミナルエミュレーションを使ってのターミナルマルチプレクサ
`tmux` | V:100, I:164 | 1391 | 代替のターミナルマルチプレクサ (代わりに "Control-B" を用いる)
`ripgrep` | V:15, I:46 | 5284 | 自動フィルタリング付きのソースコード中の高速再帰文字検索
`fzf` | V:8, I:34 | 5064 | ファジーテキストファインダ
`fzy` | V:0.07, I:0.38 | 59 | ファジーテキストファインダ
`rlwrap` | V:1, I:11 | 328 | readline 機能のコマンドライン ラッパー
`ledit` | V:0.4, I:7.8 | 375 | readline 機能のコマンドライン ラッパー
`rlfe` | V:0.02, I:0.50 | 45 | readline 機能のコマンドライン ラッパー

### 9.1.1. シェルの活動を綺麗に記録

単に script(1) を使ってシェル活動を記録すると (「シェル活動の記録」を参照下さい)、コントロール文字の入ったファイルが生成されます。このような事は以下のようにして col(1) を使うことで避けられます。

    $ script
    Script started, file is typescript

何なりとします … そして `script` から脱出するために `Ctrl-D` を押します。

    $ col -bx < typescript > cleanedfile
    $ vim cleanedfile

シェルの活動を記録する他の方法もあります:

- `tee` を使う (initramfs 中のブートプロセスで有用):

      $ sh -i 2>&1 | tee typescript

- スクロールバック用バッファーを拡張した `gnome-terminal` を使います。

- screen(1) を"`^A H`" で使い (「screen プログラム」を参照下さい) コンソールの記録をします。

- `vim` を"`:terminal`" で使ってコンソールの記録します。"`C-W N`" として TERMINAL モードから NORMAL モードに出ます。"`:w typescript`" としてバッファーをファイルに書き出します。

- `emacs` を"`M-x shell`" か "`M-x eshell`" か "`M-x term`" で使ってコンソールの記録します。"`C-x C-w`" としてバッファーをファイルに書き出します。

### 9.1.2. screen プログラム

screen(1) は複数のプロセスを1つのターミナルウィンドウでうまく動作させるのみならず、接続が中断してもリモートシェルプロセスを生き延びさせる事もできます。screen(1) の使われ方の典型的シナリオは次です。

1. リモート機器にログインします。

2. 単一のコンソール上で `screen` を起動します。

3. `^A c` ("Control-A" に続いて "c") によって作られた `screen` のウィンドウ中で複数のプログラムを実行します。

4. `^A n` ("Control-A" に続いて "n") によって、複数の `screen` のウィンドウ間を切り替えます。

5. 突然ターミナルを離れる必要ができたけれども、接続を継続してあなたのアクティブな作業を失いたくありません。

6. いかなる方法ででも、`screen` のセッションをデタッチできます。

   - 暴力的にネットワーク接続を引き抜く

   - `^A d` ("Control-A" に続いて "d") とタイプしてリモート接続から手動でログアウト

   - `^A DD` ("Control-A" に続いて "DD") とタイプして `screen` をデタッチしてログアウト

7. 同じリモート機器に (たとえ異なるターミナルからでも) 再びログインします。

8. `screen` を"`screen -r`" として起動します。

9. `screen` は全アクティブなプログラムが実行されている過去の全 `screen` ウィンドウを魔法のようにリアタッチします。

| ヒント
`screen` を使うと、切断してもプロセスをアクティブにしておけその後で再接続した時にリアタッチできるので、ダイヤルアップやパケット接続のような計量されたネットワーク接続での接続料金の節約ができます。

`screen` セッションではコマンドキーストローク以外の全てのキーボード入力は現在のウィンドウに送られます。全ての `screen` コマンドキーストロークは `^A` ("Control-A") と単一キー [プラス何らかのパラメーター] をタイプすることによって入力されます。次に覚えておくべき重要なコマンドキーストロークを記します。

表9.2 screen キーバインディングのリスト

キーバインディング | 意味
--- | ---
`^A ?` | ヘルプスクリーンを表示 (キーバインディングを表示)
`^A c` | 新規ウィンドウを作成しそれに切り替える
`^A n` | 次のウィンドウに切り替える
`^A p` | 前のウィンドウに切り替える
`^A 0` | 0番のウィンドウに切り替える
`^A 1` | 1番のウィンドウに切り替える
`^A w` | ウィンドウのリストを表示
`^A a` | Ctrl-A を現在のウィンドウにキーボード入力として送る
`^A h` | 現在のウィンドウのハードコピーをファイルに書く
`^A H` | 現在のウィンドウのファイルへのロギングを開始/終了する
`^A ^X` | ターミナルをロック (パスワードで保護)
`^A d` | ターミナルから screen のセッションをデタッチ
`^A DD` | screen のセッションをデタッチしてログアウト

詳細は screen(1) を参照下さい。

代替コマンドの機能については tmux(1) を参照下さい。

### 9.1.3. ディレクトリー間移動

「Bash のカスタム化」にて、ディレクトリー間の俊敏な移動を可能にする 2 つのティップが記述されています: `$CDPATH` と `mc`。

ファジー テキスト フィルターを使えば、正確なパスをタイプ無しでも可能です。`fzf` の場合だと、`~/.bashrc` に以下を含めます。

    FZF_KEYBINDINGS_PATH=/usr/share/doc/fzf/examples/key-bindings.bash
    if [ -f $FZF_KEYBINDINGS_PATH ]; then
      . $FZF_KEYBINDINGS_PATH
    fi

たとえば:

- 最小限の努力で非常に奥深いサブディレクトリーまでジャンプできます。最初に "`cd **`" とタイプして `Tab` を押します。すると、候補のパスとともに入力を促されます。例えば、`s/d/b foo` のような部分パス文字列をタイプすると候補パスが絞られます。`cd` が使うパスをカーソールとリターンキーで選択します。

- 最小限の努力でコマンド履歴からより効率的にコマンドを選択できます。コマンドプロンプトで `Ctrl-R` を押します。すると、候補のコマンドとともに入力を促されます。例えば、`vim d` のような部分コマンド文字列をタイプすると候補が絞られます。使うコマンドをカーソールとリターンキーで選択します。

### 9.1.4. Readline のラッパー

`/usr/bin/dash` のようなコマンドライン履歴編集能力のないコマンドは `rlwrap` もしくはその等価プログラムのもとで透過的にそのような機能を追加できます。

     $ rlwrap dash -i

これは、`bash` のようなフレンドリーな環境下で、`dash`に関する微妙な点をテストする便利なプラットフォームを提供します。

### 9.1.5. ソースコードツリーのスキャン

`ripgrep` パッケージ中にある rg(1) コマンドは、典型的な状況にあるソースコード ツリーをスキャンするための grep(1) コマンド代替の高速コマンドを提供します。現代的なマルチコア CPU をうまく利用するとともに、いくつかのファイルをスキップする合理的なフィルターを自動的に適用します。

## 9.2. Vim のカスタム化

「Vim 利用法」 で vim(1) の基本を学んだ後は、`vim` を以下に使うべきかを理解するために、Bram Moolenaar 氏の"Seven habits of effective text editing (2000)" を読んで下さい。

### 9.2.1. 内部機能を使った vim のカスタマイズ

`vim` の挙動は "`set ...`" 等の `Ex` モードコマンドを通して、その内部機能を有効にすることで大幅に変更できます。

`Ex` コマンドは、伝統的な "`~/.vimrc`" または git-friendly な "`~/.vim/vimrc`" という、ユーザーの vimrc ファイルに含められます。以下は非常に単純な一例です [2]:

    """ Generic baseline Vim and Neovim configuration (~/.vimrc)
    """   - For NeoVim, use "nvim -u ~/.vimrc [filename]"
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    let mapleader = ' '             " :h mapleader
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    set nocompatible                " :h 'cp -- sensible (n)vim mode
    syntax on                       " :h :syn-on
    filetype plugin indent on       " :h :filetype-overview
    set encoding=utf-8              " :h 'enc (default: latin1) -- sensible encoding
    """ current vim option value can be verified by :set encoding?
    set backspace=indent,eol,start  " :h 'bs (default: nobs) -- sensible BS
    set statusline=%<%f%m%r%h%w%=%y[U+%04B]%2l/%2L=%P,%2c%V
    set listchars=eol:¶,tab:⇄\ ,extends:↦,precedes:↤,nbsp:␣
    set viminfo=!,'100,<5000,s100,h " :h 'vi -- bigger copy buffer etc.
    """ Pick "colorscheme" from blue darkblue default delek desert elflord evening
    """ habamax industry koehler lunaperche morning murphy pablo peachpuff quiet ron
    """ shine slate torte zellner
    colorscheme industry
    """ don't pick "colorscheme" as "default" which may kill SpellUnderline settings
    set scrolloff=5                 " :h 'scr -- show 5 lines around cursor
    set laststatus=2                " :h 'ls (default 1)  k
    """ boolean options can be unset by prefixing "no"
    set ignorecase                  " :h 'ic
    set smartcase                   " :h 'scs
    set autoindent                  " :h 'ai
    set smartindent                 " :h 'si
    set nowrap                      " :h 'wrap
    "set list                        " :h 'list (default nolist)
    set noerrorbells                " :h 'eb
    set novisualbell                " :h 'vb
    set t_vb=                       " :h 't_vb -- termcap visual bell
    set spell                       " :h 'spell
    set spelllang=en_us,cjk         " :h 'spl -- english spell, ignore CJK
    set clipboard=unnamedplus       " :h 'cb -- cut/copy/paste with other app
    set hidden                      " :h 'hid
    set autowrite                   " :h 'aw
    set timeoutlen=300              " :h 'tm

`vim` のキーマップはユーザーの vimrc ファイルで変更可能です。 例えば:

| 注意
よほどいい理由がない限りデフォルトのキーバインディングを変えようとしてはいけません。

    """ Popular mappings (imitating LazyVim etc.)
    """ Window moves without using CTRL-W which is dangerous in INSERT mode
    nnoremap <C-H> <C-W>h
    nnoremap <C-J> <C-W>j
    nnoremap <C-K> <C-W>k
    silent! nnoremap <C-L> <C-W>l
    """ Window resize
    nnoremap <C-LEFT> <CMD>vertical resize -2<CR>
    nnoremap <C-DOWN> <CMD>resize -2<CR>
    nnoremap <C-UP> <CMD>resize +2<CR>
    nnoremap <C-RIGHT> <CMD>vertical resize +2<CR>
    """ Clear hlsearch with <ESC> (<C-L> is mapped as above)
    nnoremap <ESC> <CMD>noh<CR><ESC>
    inoremap <ESC> <CMD>noh<CR><ESC>
    """ center after jump next
    nnoremap n nzz
    nnoremap N Nzz
    """ fast "jk" to get out of INSERT mode (<ESC>)
    inoremap  jk <CMD>noh<CR><ESC>
    """ fast "<ESC><ESC>" to get out of TERM mode (CTRL-\ CTRL-N)
    tnoremap <ESC><ESC> <C-\><C-N>
    """ fast "jk" to get out of TERM mode (CTRL-\ CTRL-N)
    tnoremap jk <C-\><C-N>
    """ previous/next trouble/quickfix item
    nnoremap [q <CMD>cprevious<CR>
    nnoremap ]q <CMD>cnext<CR>
    """ buffers
    nnoremap <S-H> <CMD>bprevious<CR>
    nnoremap <S-L> <CMD>bnext<CR>
    nnoremap [b <CMD>bprevious<CR>
    nnoremap ]b <CMD>bnext<CR>
    """ Add undo break-points
    inoremap  , ,<C-G>u
    inoremap  . .<C-G>u
    inoremap  ; ;<C-G>u
    """ save file
    inoremap <C-S> <CMD>w<CR><ESC>
    xnoremap <C-S> <CMD>w<CR><ESC>
    nnoremap <C-S> <CMD>w<CR><ESC>
    snoremap <C-S> <CMD>w<CR><ESC>
    """ better indenting
    vnoremap < <gv
    vnoremap > >gv
    """ terminal (Somehow under Linux, <C-/> becomes <C-_> in Vim)
    nnoremap <C-_> <CMD>terminal<CR>
    "nnoremap <C-/> <CMD>terminal<CR>
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    if ! has('nvim')
    """ Toggle paste mode with <SPACE>p for Vim (no need for Nvim)
    set pastetoggle=<leader>p
    """ nvim default mappings for Vim.  See :h default-mappings in nvim
    """ copy to EOL (no delete) like D for d
    noremap Y y$
    """ sets a new undo point before deleting
    inoremap <C-U> <C-G>u<C-U>
    inoremap <C-W> <C-G>u<C-W>
    """ <C-L> is re-purposed as above
    """ execute the previous macro recorded with Q
    nnoremap Q @@
    """ repeat last substitute and *KEEP* flags
    nnoremap & :&&<CR>
    """ search visual selected string for visual mode
    xnoremap * y/\V<C-R>"<CR>
    xnoremap # y?\V<C-R>"<CR>
    endif

上記のキーバインディングが適正に機能するには、`Backspace` キーが "ASCII DEL" を生成し、`Delete` キーが "Escape sequence" を生成するように、ターミナルプログラムが設定される必要があります。

他のいろいろな設定もユーザーの vimrc ファイルで変更可能です。 例えば:

    """ Use faster 'rg' (ripgrep package) for :grep
    if executable("rg")
      set grepprg=rg\ --vimgrep\ --smart-case
      set grepformat=%f:%l:%c:%m
    endif
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    """ Retain last cursor position :h '"
    augroup RetainLastCursorPosition
      autocmd!
      autocmd BufReadPost *
        \ if line("'\"") > 0 && line ("'\"") <= line("$") |
        \   exe "normal! g'\"" |
        \ endif
    augroup END
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    """ Force to use underline for spell check results
    augroup SpellUnderline
      autocmd!
      autocmd ColorScheme * highlight SpellBad term=Underline gui=Undercurl
      autocmd ColorScheme * highlight SpellCap term=Underline gui=Undercurl
      autocmd ColorScheme * highlight SpellLocal term=Underline gui=Undercurl
      autocmd ColorScheme * highlight SpellRare term=Underline gui=Undercurl
    augroup END
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    """ highlight tailing spaces except when typing as red (set after colorscheme)
    highlight TailingWhitespaces ctermbg=red guibg=red
    """ \s\+     1 or more whitespace character: <Space> and <Tab>
    """ \%#\@<!  Matches with zero width if the cursor position does NOT match.
    match TailingWhitespaces /\s\+\%#\@<!$/

### 9.2.2. 外部パッケージを使った vim のカスタマイズ

興味深い外部プラグインパッケージがあります:

- Vim - 至る所にあるテキスト エディター -- Vim と vim スクリプトの公式アップストリームサイト

- VimAwsome -- Vim プラグインのリスト

- vim-scripts -- Debian パッケージ: vim スクリプト集

ユーザーの vimrc ファイルを用いて vim-scripts パッケージ中のプラグインパッケージを有効化できます。例えば:

    packadd! secure-modelines
    packadd! winmanager
    " IDE-like UI for files and buffers with <space>w
    nnoremap <leader>w         :WMToggle<CR>

新しいネイティブの Vim パッケージシステムは "`git`" や "`git submodule`" とうまく機能します。そのような設定例のひとつは私の git レポジトリー: dot-vim にあります。これは本質的に以下をします:

- "`git`" と"`git submodule`" を使って、"`name`" のような最新の外部パッケージを `~/.vim/pack/*/opt/name` に置くようなことをします。

- `:packadd! name` ラインをユーザーの vimrc ファイルに追加することで、これらのパッケージは `runtimepath` 上に置かれます。

- Vim はその初期化中に `runtimepath` 上のこのようなパッケージをロードします。

- 初期化の最後に、インストールされたドキュメントのタグが "`helptags ALL`" で更新されます。

詳しくは、`vim` を "`vim --startuptime vimstart.log`" とともに起動し、実際の起動順や各段階の時間を確認しましょう。

`vim` への外部パッケージを管理したりロードするのに多すぎる手法[3]があるのには混乱させられます。オリジナルの情報を確認するのが最適の解決法です。

表9.3 `vim` 初期化に関する情報

キーストローク | 情報
--- | ---
`:help package` | vim パッケージメカニズムに関する説明
`:help runtimepath` | `runtimepath` メカニズムに関する説明
`:version` | vimrc ファイル用の候補を含めた内部状態
`:echo $VIM` | vimrc ファイルを見つけるのに用いる "`$VIM`" 環境変数
`:set runtimepath?` | 全実行時サポートファイルを探す対象のディレクトリーのリスト
`:echo $VIMRUNTIME` | システムが供給した各種実行時サポートファイルを見つけるのに用いる環境変数 "`$VIMRUNTIME`"

## 9.3. データーの記録と表現

### 9.3.1. ログデーモン

多くの伝統的プログラムは "`/var/log/`" ディレクトリーの下にそれぞれの活動をテキストファイル形式で記録します。

logrotate(8) が、大量のログファイルを生成するシステム上のログファイルの管理を簡略化するのに使われます。

多くの新規プログラムは "`/var/log/journal`" ディレクトリーの下に systemd-journald(8) の記録サービスを使ってそれぞれの活動をバイナリファイル形式で記録します。

systemd-cat(1) コマンドを使ってシェルスクリプトから systemd-journald(8) ジャーナルにデーターをログできます。

「システムメッセージ」と「カーネルメッセージ」を参照下さい。

### 9.3.2. ログアナライザー

注目すべきログアナライザー (aptitude(8) で"`~Gsecurity::log-analyzer`") を次に記します。

表9.4 システムログアナライザーのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`fail2ban` | V:102, I:113 | 2191 | 複数回の認証エラーを発生させる IP を使用禁止にします
`logwatch` | V:9, I:11 | 2440 | 綺麗な出力の Perl で書かれたログアナライザー
`awstats` | V:5.3, I:8.4 | 6934 | 強力で機能の多いウェッブサーバーのログアナライザー
`analog` | V:3, I:84 | 3739 | ウェッブサーバーのログアナライザー
`sarg` | V:0.71, I:0.79 | 863 | squid の分析レポートジェネレター
`pflogsumm` | V:1.5, I:3.7 | 173 | Postfix ログ項目サマライザー
`fwlogwatch` | V:0.12, I:0.18 | 487 | ファイアウォールログアナライザー
`squidview` | V:0.02, I:0.43 | 224 | squid の access.log ファイルのモニターと分析
`swatch` | V:0.07, I:0.31 | 99 | 正規表現マッチ、ハイライト、フック機能付きログファイルビューワー
`crm114` | V:0.06, I:0.33 | 1371 | 制御可能な正規表現切断機とスパムフィルター (CRM114)
`icmpinfo` | V:0.01, I:0.38 | 42 | ICMP メッセージの解釈

| 注記
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 %H:%M` | 任意 | `19.01.09 00:15`
`+%d.%b.%y %H:%M` | `C` または `en_US.UTF-8` | `19.Jan.09 00:15`
`+%d.%b.%y %H:%M` | `es_ES.UTF-8` | `19.ene.09 00:15`

| ヒント

コマンドの別名を使えばコマンドライン上で長いオプションを入力しなくてもよくなります (「コマンドエイリアス」を参照下さい)。

    alias ls='ls --time-style=+%d.%m.%y %H:%M'

### 9.3.5. 着色化されたシェル出力

殆どの現代的なターミナルへのシェル出力は ANSI エスケープコードを使って着色化できます ("`/usr/share/doc/xterm/ctlseqs.txt.gz`" を参照下さい)。

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

    $ RED=$(printf "\x1b[31m")
    $ NORMAL=$(printf "\x1b[0m")
    $ REVERSE=$(printf "\x1b[7m")
    $ echo "${RED}RED-TEXT${NORMAL} ${REVERSE}REVERSE-TEXT${NORMAL}"

### 9.3.6. 着色化されたコマンド

着色化されたコマンドは対話環境で出力を検査するのに便利です。私は、私の "`~/.bashrc`" に次を含めています。

    if [ "$TERM" != "dumb" ]; then
        eval "`dircolors -b`"
        alias ls='ls --color=always'
        alias ll='ls --color=always -l'
        alias la='ls --color=always -A'
        alias less='less -R'
        alias ls='ls --color=always'
        alias grep='grep --color=always'
        alias egrep='egrep --color=always'
        alias fgrep='fgrep --color=always'
        alias zgrep='zgrep --color=always'
    else
        alias ll='ls -l'
        alias la='ls -A'
    fi

エイリアスを使うことで色効果を対話コマンド使用時に限定します。こうすると less(1) 等のページャープログラムの下でも色を見られるので、環境変数 "`export GREP_OPTIONS='--color=auto'`" をエキスポートするより都合が良いです。他のプログラムにパイプする際に色を使いたくなければ、先ほどの "`~/.bashrc`" 例中で代わりに "`--color=auto`" とします。

| ヒント
対話環境でシェルを "`TERM=dumb bash`" として起動することで、このような着色するエイリアスを無効にできます。

### 9.3.7. 複雑な反復のためにエディターでの活動を記録

複雑な反復のためにエディターでの活動を記録できます。

Vim の場合以下のようにします。

- "`qa`": 名前付きレジスタ "`a`" にタイプした文字の記録を開始。

- … エディターでの活動

- "`q`": タイプした文字の記録を終了。

- "`@a`": レジスター "`a`" の内容を実行。

Emacs の場合は以下のようにします。

- "`C-x (`": キーボードマクロの定義開始。

- … エディターでの活動

- "`C-x )`": キーボードマクロの定義終了。

- "`C-x e`": キーボードマクロの実行。

### 9.3.8. X アプリケーションの画像イメージの記録

`xterm` の表示を含めた、X アプリケーションの画像イメージを記録するにはいくつか方法があります。

表9.6 画像の操作ツールのリスト

パッケージ | ポプコン | サイズ | screen | コマンド
--- | --- | --- | --- | ---
`gnome-screenshot` | V:12, I:99 | 1115 | Wayland | GNOME 用のスクリーンショット アプリケーション
`flameshot` | V:7, I:16 | 3542 | Wayland | 強化されたスクリーンショット アプリケーション
`gimp` | V:41, I:214 | 32779 | Wayland + X | GUI メニュー中のスクリーンショット
`x11-apps` | V:30, I:440 | 2461 | X | xwd(1)
`imagemagick` | V:7, I:275 | 81 | X | import(1)
`scrot` | V:4, I:49 | 144 | X | scrot(1)

### 9.3.9. 設定ファイルの変更記録

DVCS の助力で設定ファイルの変更を記録したり、Btrfs の上でシステムのスナップショットを作成したりする専用のツールがあります。

表9.7 設定の履歴を記録するパッケージのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`etckeeper` | V:23, I:26 | 157 | Git (デフォールト) か Mercurial か GNU Bazaar を使って設定ファイルとそのメタデーターを保存
`timeshift` | V:8, I:14 | 4481 | rsync か BTRFS スナップショットを使うシステム回復ユーティリティー
`snapper` | V:6.3, I:8.4 | 2396 | Linux ファイルシステムスナップショット管理ツール

ローカルスクリプト「バックアップのティップ」アプローチも一策です。

## 9.4. プログラム活動の監視と制御と起動

プログラム活動は専用ツールを用いて監視と制御できます。

表9.8 プログラム活動の監視と制御のツールのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`coreutils` | V:910, I:1000 | 17994 | nice(1): スケジューリングの優先順位の変更してプログラムを実行
`bsdutils` | V:445, I:1000 | 338 | renice(1): 実行中プロセスのスケジューリングの優先順位を変更
`procps` | V:828, I:998 | 2691 | "`/proc`" ファイルシステムのユーティリティー: ps(1) と top(1) と kill(1) と watch(1) 等
`psmisc` | V:400, I:720 | 950 | "`/proc`" ファイルシステムのユーティリティー: killall(1) と fuser(1) と pstree(1) と pstree(1)
`time` | V:6, I:79 | 148 | time(1): 時間に関するシステムリソース使用状況を報告するためにプログラムを実行
`sysstat` | V:118, I:168 | 1904 | sar(1)、iostat(1)、mpstat(1)、…: Linux 用のシステムパーフォーマンスツール
`isag` | V:0.1, I:3.3 | 109 | sysstat の対話型システム活動グラフ化ソフト
`lsof` | V:449, I:949 | 492 | lsof(8): "`-p`" オプションを使い実行中のプロセスが開いているファイルをリスト
`strace` | V:11, I:103 | 4393 | strace(1): システムコールやシグナルを追跡
`ltrace` | V:1, I:12 | 420 | ltrace(1): ライブラリーコールを追跡
`xtrace` | V:0.05, I:0.71 | 342 | xtrace(1): X11 のクライアントとサーバーの間の通信を追跡
`powertop` | V:35, I:226 | 696 | powertop(1): システムの電力消費情報
`cron` | V:922, I:997 | 247 | cron(8) デーモンからバックグランドでスケジュール通りプロセスを実行
`anacron` | V:416, I:475 | 110 | 1日24時間動作でないシステム用の cron 類似のコマンドスケジューラー
`at` | V:72, I:96 | 158 | at(1) と batch(1) コマンド: 特定の時間や特定のロードレベル以下でジョブを実行

| ヒント
`procps` パッケージはプログラム活動の監視と制御と起動の基本中の基本を提供します。このすべてを習得するべきです。

### 9.4.1. プロセスの時間計測

コマンドにより呼び出されたプロセスにより使われた時間を表示します。

    # time some_command >/dev/null
    real    0m0.035s       # time on wall clock (elapsed real time)
    user    0m0.000s       # time in user mode
    sys     0m0.020s       # time in kernel mode

### 9.4.2. スケジューリングの優先度

ナイス値はプロセスのスケジューリングの優先度を制御するのに使われます。

表9.9 スケジューリングの優先度のためのナイス値のリスト

ナイス値 | スケジューリングの優先度
--- | ---
19 | 優先度が最低のプロセス (ナイス)
0 | ユーザーにとっての優先度が非常に高いプロセス
-20 | rootにとっての優先度が非常に高いプロセス (非ナイス)

    # nice  -19 top                                      # very nice
    # nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # very fast

極端なナイス値はシステムに害を与えるかもしれません。本コマンドは注意深く使用下さい、

### 9.4.3. ps コマンド

Debian 上の ps(1) コマンドは BSD と SystemV 機能の両方をサポートしプロセスの活動を静的に特定するのに有用です。

表9.10 ps コマンドのスタイルのリスト

スタイル | 典型的コマンド | 特徴
--- | --- | ---
BSD | `ps aux` | %CPU %MEM を表示
System V | `ps -efH` | PPID を表示

ゾンビ (動作していない) 子プロセスに関して、"`PPID`" フィールドで識別される親プロセス ID を使ってプロセスを停止できます。

pstree(1) コマンドはプロセスの木 (ツリー) を表示します。

### 9.4.4. top コマンド

Debian 上の top(1) は機能が豊富で、どのプロセスがおかしな動きをしているかを動的に識別することに役立ちます。

それはインタラクティブなフルスクリーンプログラムです。"h"-キーを押すことで使用法のヘルプが得られ、 "q"-キーを押すことで終了できます。

### 9.4.5. プロセスによって開かれているファイルのリスト

プロセス ID (PID)、例えば1を使うプロセスによって開かれている全ファイルは以下のようにしてリストできます。

    $ sudo lsof -p 1

PID=1 は通常 `init` プログラムです。

### 9.4.6. プログラム活動の追跡

プラグラムの活動状況は、システムコールとシグナルは strace(1) で、ライブラリーコールは ltrace(1) で、X11 のクライアントとサーバーの通信は xtrace(1) でプラグラムの活動状況を追跡できます。

`ls` コマンドのシステムコールを以下のようにして追跡できます。

    $ sudo strace ls

| ヒント
きれいなトリービューを作る /usr/share/doc/strace/examples/ にある strace-graph スクリプトを使いましょう

### 9.4.7. ファイルやソケットを使っているプロセスの識別

例えば "`/var/log/mail.log`" 等のファイルを使っているプロセスは fuser(1) によって以下のようにして識別できます。

    $ sudo fuser -v /var/log/mail.log
                         USER        PID ACCESS COMMAND
    /var/log/mail.log:   root       2946 F.... rsyslogd

"`/var/log/mail.log`" ファイルが rsyslogd(8) コマンドによって書込みのために開かれている事が分かります。

例えば "`smtp/tcp`" 等のソケットを使っているプロセスは fuser(1) によって以下のようにして識別できます。

    $ sudo fuser -v smtp/tcp
                         USER        PID ACCESS COMMAND
    smtp/tcp:            Debian-exim   3379 F.... exim4

SMTP ポート (25) への TCP 接続を処理するためにあなたのシステムでは exim4(8) が実行されている事がこれで分かります。

### 9.4.8. 一定間隔でコマンドを反復実行

watch(1) はプログラムを一定間隔で反復実行しながらフルスクリーンでその出力を表示します。

    $ watch w

こうすると2秒毎更新でシステムに誰がログオンしているかを表示します。

### 9.4.9. ファイルに関してループしながらコマンドを反復実行

例えばグロブパターン "`*.ext`" へのマッチ等の何らかの条件にマッチするファイルに関してループしながらコマンドを実行する方法がいくつかあります。

- シェルの for-loop 法 (「シェルループ」を参照下さい):

    for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done

- find(1) と xargs(1) の組み合わせ:

    find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command

- コマンド付きの "`-exec`" オプションを使って find(1):

    find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;

- 短いシェルスクリプト付きの "`-exec`" オプションを使って find(1):

    find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "command '{}' && echo 'successful'" \;

上記の例はスペースを含む等の変なファイル名でも適正に処理できるように書かれています。find(1) に関する高度な使用法の詳細は「ファイル選択の慣用句」を参照下さい。

### 9.4.10. GUI からプログラムをスタート

コマンドラインインターフェース (CLI) の場合、`$PATH` 環境変数で指定されるディレクトリー中で最初にマッチした名前のプログラムが実行されます。「"`$PATH`" 変数」 を参照下さい。

freedesktop.org スタンダード準拠の グラフィカルユーザーインターフェース (GUI) の場合、`/usr/share/applications/` ディレクトリー中の `*.desktop` ファイルにより各プログラムの GUI メニュー表示に必要なアトリビュートが提供されます。Freedesktop.org の xdg メニューシステムに準拠する各パッケージは "/usr/share/applications/" の下に "*.desktop" で提供されるそのメニューデーターをインストールします。Freedesktop.org 標準に準拠する現代的なデスクトップ環境は xdg-utils パッケージを用いてその環境用のメニューを生成します。"/usr/share/doc/xdg-utils/README" を参照下さい。

例えば `chromium.desktop` ファイルは、プログラム名の "Name" や、プログラムの実行パスと引数の "Exec" や、使用するアイコンの "Icon" 等の属性(Desktop Entry Specification 参照)を "Chromium Web Browser" に関して以下のようにして定義します:

    [Desktop Entry]
    Version=1.0
    Name=Chromium Web Browser
    GenericName=Web Browser
    Comment=Access the Internet
    Comment[fr]=Explorer le Web
    Exec=/usr/bin/chromium %U
    Terminal=false
    X-MultipleArgs=false
    Type=Application
    Icon=chromium
    Categories=Network;WebBrowser;
    MimeType=text/html;text/xml;application/xhtml_xml;x-scheme-handler/http;x-scheme-handler/https;
    StartupWMClass=Chromium
    StartupNotify=true

これは簡略化しすぎた記述ですが、`*.desktop` ファイルは以下のようにしてスキャンされます。

デスクトップ環境は `$XDG_DATA_HOME` と `$XDG_DATA_DIR` 環境変数を設定します。例えば GNOME では:

- `$XDG_DATA_HOME` が未設定。(デフォルト値の `$HOME/.local/share` が使われます。)

- `$XDG_DATA_DIRS` は `/usr/share/gnome:/usr/local/share/:/usr/share/` に設定されます。

以上により、ベースディレクトリー (XDG Base Directory Specification 参照) や `applications` ディレクトリーは以下となります。

- `$HOME/.local/share/` → `$HOME/.local/share/applications/`

- `/usr/share/gnome/` → `/usr/share/gnome/applications/`

- `/usr/local/share/` → `/usr/local/share/applications/`

- `/usr/share/` → `/usr/share/applications/`

`*.desktop` ファイルはこれらの `applications` ディレクトリーでこの順番でスキャンされます。

| ヒント
ユーザーによるカスタムの GUI メニュー項目は `*.desktop` ファイルを `$HOME/.local/share/applications/` ディレクトリーに追加することで生成できます。

| ヒント
"`Exec=...`" 行はシェルが解釈しません。環境変数を設定する場合には env(1) コマンドを使います。

| ヒント
同様に、もしこれらのベースディレクトリーの下の `autostart` ディレクトリーの中に`*.desktop` ファイルが作成されれば、`*.desktop` ファイル中に指定されたプログラムがデスクトップ環境が起動された時点に自動実行されます。Desktop Application Autostart Specification を参照下さい。

| ヒント
同様に、もし`$HOME/Desktop` ディレクトリーの中に`*.desktop` ファイルが作成され、デスクトップ環境がローンチャーアイコンを表示する機能を有効としていれば、そこに指定されたプログラムがアイコンをクリックした際に実行されます。`$HOME/Desktop`ディレクトリー の実際の名前はロケール依存であることを承知下さい。xdg-user-dirs-update(1) を参照下さい。

### 9.4.11. スタートするプログラムのカスタム化

一部のプログラムは他のプログラムを自動的にスタートします。このプロセスをカスタム化する上でのチェックポイントを次に記します。

- アプリケーション設定メニュー:

  - GNOME デスクトップ: "Settings" → "Apps" → "Default Apps"

  - KDE デスクトップ: "Application Launcher" → "System Settings" → "Default Applications"

  - Iceweasel ブラウザー: "Edit" → "Preferences" → "Applications"

  - mc(1): "`/etc/mc/mc.ext`"

- "`$BROWSER`" や "`$EDITOR`" や "`$VISUAL`" や "`$PAGER`" といった環境変数 (environ(7) 参照下さい)

- "`editor`" や "`view`" や "`x-www-browser`" や "`gnome-www-browser`" や "`www-browser`" 等のプログラムに関する update-alternatives(8) システム (「デフォールトのテキストエディターの設定」を参照下さい)

- MIME タイプとプログラムと関係づける、"`~/.mailcap`" や "`/etc/mailcap`" ファイルの内容 (mailcap(5) 参照下さい)

- ファイル拡張子と MIME タイプとプログラムと関係づける、"`~/.mime.types`" や "`/etc/mime.types`" ファイルの内容 (run-mailcap(1) 参照下さい)

| ヒント
update-mime(8) は"`/etc/mailcap.order`" ファイルを使って "`/etc/mailcap`" ファイルを更新します (mailcap.order(5) 参照下さい)。

| ヒント
`debianutils` パッケージは、どのエディターやページャーやウェッブブラウザーを呼び出すかに関してそれぞれ賢明な判断をする sensible-browser(1) や sensible-editor(1) や sensible-pager(1) を提供します。これらのシェルスクリプトを読む事をお薦めします。

| ヒント

GUI の下で `mutt` のようなコンソールアプリケーションをあなたの好むアプリケーションとして実行するには、以下のようにして GUI アプリケーションを作成し、前記の方法であなたの好む起動されるアプリケーションとして "`/usr/local/bin/mutt-term`" を設定します。

    # cat /usr/local/bin/mutt-term <<EOF
    #!/bin/sh
    gnome-terminal -e "mutt \$@"
    EOF
    # chmod 755 /usr/local/bin/mutt-term

### 9.4.12. プロセスの停止

kill(1) を使ってプロセス ID を使ってプロセスを停止 (プロセスへシグナルを送信) します。

killall(1) や pkill(1) プロセスコマンド名や他の属性を使ってプロセスを停止 (プロセスへシグナルを送信) します。

表9.11 kill コマンドが良く使うシグナルのリスト

シグナル値 | シグナル名 | アクション | 注釈
--- | --- | --- | ---
0 | --- | シグナルが送られていません (kill(2) を参照) | プロセスが実行中かチェック
1 | SIGHUP | プロセスの終了 | ターミナル接続の切断（シグナルがハングアップ）
2 | SIGINT | プロセスの終了 | キーボードから割り込み (`CTRL-C`)
3 | SIGQUIT | プロセスを終了してコアをダンプ | キーボードから停止 (`CTRL-\`)
9 | SIGKILL | プロセスの終了 | ブロック不可能なkillシグナル
15 | SIGTERM | プロセスの終了 | ブロック可能な終了シグナル

### 9.4.13. タスク1回実行のスケジュール

at(1) コマンドを以下のように実行して1回だけのジョブをスケジュールします。

    $ echo 'command -args'| at 3:40 monday

### 9.4.14. タスク定期実行のスケジュール

cron(8) コマンドを実行して定期的タスクをスケジュールします。crontab(1) と crontab(5) を参照下さい。

例えば `foo` というノーマルユーザーとして "`crontab -e`" コマンドを使って "`/var/spool/cron/crontabs/foo`" という crontab(5) ファイルを作成することでプロセスをスケジュールして実行する事ができます。

crontab(5) ファイルの例を次に記します。

    # use /usr/bin/sh to run commands, no matter what /etc/passwd says
    SHELL=/bin/sh
    # mail any output to paul, no matter whose crontab this is
    MAILTO=paul
    # Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed)
    # run at 00:05, every day
    5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
    # run at 14:15 on the first of every month -- output mailed to paul
    15 14 1  * *   $HOME/bin/monthly
    # run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc:
    0 22 *   * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%
    23 */2 1 2 *   echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"
    5  4 *   * sun echo "run at 04:05 every Sunday"
    # run at 03:40 on the first Monday of each month
    40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args

| ヒント
連続稼働していないシステムでは、機器のアップタイム上可能な限り指定間隔に近く定期的にコマンドをスケジュールするために `anacron` パッケージをインストールします。anacron(8) と anacrontab(5) を参照下さい。

| ヒント
スケジュールされたシステムメインテナンススクリプトは、そのようなスクリプトを "`/etc/cron.hourly/`" か "`/etc/cron.daily/`" か "`/etc/cron.weekly/`" か "`/etc/cron.monthly/`" 中に置くことで root アカウントからそれらを定期的に実行できます。これらのスクリプトの実行時間は "`/etc/crontab`" と "`/etc/anacrontab`" でカスタム化できます。

Systemd は `cron` デーモンを使わずプログラムをスケジュールする低レベル能力があります。例えば、`/lib/systemd/system/apt-daily.timer` と `/lib/systemd/system/apt-daily.service` は、毎日の apt ダウンロード活動を設定しています。systemd.timer(5) を参照下さい。

### 9.4.15. イベントに合わせたタスクのスケジュール

Systemd は、タイマーイベントのみならずマウントイベントにもプログラムをスケジュールできます。 例は、「タイマーイベントがトリガーするバックアップ」 and 「マウントイベントがトリガーするバックアップ」 を参照下さい。

### 9.4.16. Alt-SysRq キー

Alt-SysRq (PrtScr) に続いて一つのキーを押すとシステムのレスキューコントロールの魔法をできます。

表9.12 特記すべき SAK コマンドキーのリスト

Alt-SysRq に続くキー | アクションの説明
--- | ---
`k` | 全ての現仮想ターミナル上の全てのプロセスを停止 (Kll) (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 (同期) して umount (アンマウント) します。

現在 (2021年) のDebian amd64 Linux カーネルでは `/proc/sys/kernel/sysrq=438=0b110110110` となっています:

- 2 = 0x2 - コンソールロギングレベルのコントロールを有効化 (ON)

- 4 = 0x4 - キーボード (SAK, unraw) のコントロールを有効化 (ON)

- 8 = 0x8 - プロセス等のデバグダンプを有効化 (OFF)

- 16 = 0x10 - sync コマンドを有効化 (ON)

- 32 = 0x20 - remount read-only を有効化 (ON)

- 64 = 0x40 - プロセスのシグナリング (term, kill, oom-kill) を有効化 (OFF)

- 128 = 0x80 - reboot/poweroff を許可する (ON)

- 256 = 0x100 - 全 RT タスクのナイス設定を許可する (ON)

## 9.5. システム管理ティップ

### 9.5.1. だれがシステムを利用している?

だれがシステムを利用しているかは、以下のようにしてチェックできます。

- who(1) は、誰がログオンしているかを表示します。

- w(1) は、誰がログオンしていて何をしているかを表示します。

- last(1) は、最後にログインしたユーザーのリストを表示します。

- lastb(1) は、最後にログイン失敗したユーザーのリストを表示します。

| ヒント
"`/var/run/utmp`" と "`/var/log/wtmp`" はこのようなユーザー情報を保持します。login(1) と utmp(5) を参照下さい。

### 9.5.2. 全員への警告

wall(1) を使うと、以下のようにしてシステムにログオンしている全員にメッセージを送れます。

    $ echo "We are shutting down in 1 hour" | wall

### 9.5.3. ハードウエアーの識別

PCI 的デバイス (AGP、PCI-Express、CardBus、ExpressCard、等) では、 (きっと "`-nn`" オプションとともに使う) lspci(8) がハードウエアー識別の良いスタート点です。

この代わりに、"`/proc/bus/pci/devices`" の内容を読むか、"`/sys/bus/pci`" の下のディレクトリーツリーを閲覧することでハードウエアーの識別ができます (「procfs と sysfs」を参照下さい)。

表9.13 ハードウエアー識別ツールのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`pciutils` | V:258, I:993 | 289 | Linux PCI ユーティリティー: lspci(8)
`usbutils` | V:84, I:888 | 322 | Linux USB ユーティリティー: lsusb(8)
`nvme-cli` | V:26, I:36 | 2222 | Linux 用の NVMe ユーティリティー: nvme(1)
`pcmciautils` | V:4.0, I:6.0 | 92 | Linux のための PCMCIA ユーティリティー: pccardctl(8)
`scsitools` | V:0.2, I:2.2 | 261 | SCSI ハードウエアー管理のためのツール集: lsscsi(8)
`procinfo` | V:0.8, I:6.1 | 149 | "`/proc`" から得られるシステム情報: lsdev(8)
`lshw` | V:12, I:91 | 971 | ハードウエアー設定に関する情報: lshw(1)
`discover` | V:25, I:595 | 81 | ハードウエアー識別システム: discover(8)

### 9.5.4. ハードウエアー設定

GNOME や KDE のような現代的な GUI のデスクトップ環境ではほとんどのハードウエアー設定が付随する GUI 設定ツールを通じて管理できますが、それらの設定の基本的手法を知っておくのは良い事です。

キーボードやターミナルの設定に関しては、「キーボード入力」 と 「ディスプレー出力」 を参照下さい。

表9.14 ハードウエアー設定ツールのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`console-setup` | V:82, I:975 | 422 | Linux コンソールのフォントとキーテーブルユーティリティー
`keyd` | V:1.4, I:1.5 | 1437 | カーネルの下層の入力基本要素 (evdev, uinput) を用いる、キーボード キーのリマッピング デーモン
`keyd-application-mapper` | V:0.00, I:0.07 | 34 | キーボード キーのリマッピング デーモン - 特定アプリケーションリマッパー
`x11-xserver-utils` | V:304, I:528 | 559 | X サーバーユーティリティー: xset(1)、xmodmap(1)
`acpid` | V:55, I:83 | 158 | Advanced Configuration and Power Interface (ACPI) によって起こるイベントの管理のためのデーモン
`acpi` | V:7, I:77 | 49 | ACPI デバイス上の情報を表示するユーティリティー
`sleepd` | V:0.10, I:0.12 | 84 | 非使用状況のときにラップトップをスリープさせるデーモン
`hdparm` | V:114, I:208 | 246 | ハードディスクアクセスの最適化 (「ハードディスクの最適化」を参照下さい)
`smartmontools` | V:239, I:269 | 2455 | S.M.A.R.T. を使ってストレージシステムを制御監視
`setserial` | V:3.2, I:5.2 | 104 | シリアルポートの管理ツール集
`memtest86+` | V:1, I:19 | 12483 | メモリーハードウエアー管理のためのツール集
`scsitools` | V:0.2, I:2.2 | 261 | SCSI ハードウエアー管理のためのツール集
`setcd` | V:0.06, I:0.67 | 33 | コンパクトデバイスアクセス最適化
`big-cursor` | I:0.65 | 26 | X のための大きなマウスカーソール

上記で、ACPI はAPM より新しい電力管理システムの枠組みです。

| ヒント
最近のシステム上の CPU フリーケンシースケーリングは `acpi_cpufreq` のようなカーネルモジュールで管理されています。

### 9.5.5. システムとハードウエアーの時間

以下はシステムとハードウエアーの時間を MM/DD hh:mm, CCYY (月/日 時:分, 年) に設定します。

    # date MMDDhhmmCCYY
    # hwclock --utc --systohc
    # hwclock --show

Debian システムでは時間は地域の時間が普通表示されますが、ハードウエアーとシステムの時間は通常 UTC(GMT) を使います。

ハードウエアーの時間が UTC に設定されていれば "`/etc/default/rcS`" の中の設定を "`UTC=yes`" と変更します。

Debian システムが使うタイムゾーンは以下のようにして再設定できます。

    # dpkg-reconfigure tzdata

ネットワーク経由でシステムの時間を更新したい場合には、`ntp` や `ntpdate` や `chrony` 等のパッケージを使って NTP サービスを利用することを考えます。

| ヒント
systemd の下では、ネットワーク時間同期には上記と代わり `systemd-timesyncd` を使います。詳細は systemd-timesyncd(8) を参照下さい。

次を参照下さい。

- 正確な日時の管理ハウツー

- NTP 公共サービスプロジェクト

- `ntp-doc` パッケージ

| ヒント
`ntp` パッケージ中の ntptrace(8) を使うと、NTP サービスの継がりを第一義的根源まで溯ることができます。

### 9.5.6. 音のインフラ

現在の Linux のためのサウンドカードのためのデバイスドライバーは Advanced Linux Sound Architecture (ALSA) で提供されています。ALSA は過去の Open Sound System (OSS) と互換性のためのエミュレーションモードを提供します。

アプリケーションソフトはサウンドデバイスに直接アクセスするようにばかりでなく標準的なサウンドサーバーシステム経由で間接的にアクセスするように設定されているかもしれません。現在、PulseAudio や JACK や PipeWire がサウンドサーバーシステムとして使われています。最新の状況はサウンドに関する Debian wiki を参照下さい。

各ポピュラーなデスクトップ環境では通常共通のサウンドエンジンがあります。アプリケーションに使われるそれぞれのサウンドエンジンはそれと異なるサウンドサーバーにつなぐようにもできます。

| ヒント
"`cat /dev/urandom > /dev/audio`" か speaker-test(1) を使ってスピーカをテストします。(^C で停止)

| ヒント
音が出ない場合ですが、あなたのスピーカーが消音された出力につながっているかもしれません。現代的なサウンドシステムには多くの出力があります。`alsa-utils` パッケージ中の alsamixer(1) は音量や消音の設定をするのに便利です。

表9.15 サウンドパッケージのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`alsa-utils` | V:337, I:455 | 2700 | ALSA を設定し使用するユーティリティー
`oss-compat` | V:0.5, I:9.7 | 21 | ALSA の下で "`/dev/dsp not found`" エラーを防ぐ OSS 互換性
`pipewire` | V:321, I:364 | 135 | オーディオとビデオ処理エンジンのマルチメディア サーバー - メタパッケージ
`pipewire-bin` | V:328, I:364 | 2219 | オーディオとビデオ処理エンジンのマルチメディア サーバー - オーディオサーバーと CLI プログラム
`pipewire-alsa` | V:168, I:234 | 190 | オーディオとビデオ処理エンジンのマルチメディア サーバー - ALSA 代替オーディオサーバー
`pipewire-pulse` | V:290, I:338 | 53 | オーディオとビデオ処理エンジンのマルチメディア サーバー - PulseAudio 代替オーディオサーバー
`pulseaudio` | V:151, I:177 | 6602 | PulseAudio サーバー
`libpulse0` | V:437, I:575 | 969 | PulseAudio クライアントライブラリー
`jackd` | V:2, I:14 | 8 | JACK Audio Connection Kit. (JACK) サーバー (低遅延)
`libjack0` | V:1.8, I:9.0 | 328 | JACK Audio Connection Kit. (JACK) ライブラリー (低遅延)
`libphonon4qt5-4` | V:20, I:46 | 572 | Phonon: KDE サウンドエンジン

### 9.5.7. スクリーンセーバーの無効化

スクリーンセーバーを無効にするには、以下のコマンドを使います。

表9.16 スクリーンセーバーを無効にするコマンドのリスト

環境 | コマンド
--- | ---
Linux コンソール | `setterm -powersave off`
X Window (スクリーンセーバー消去) | `xset s off`
X Window (dpms 無効) | `xset -dpms`
X Window (スクリーンセーバーの GUI 設定) | `xscreensaver-command -prefs`

### 9.5.8. ブザー音の無効化

PC スピーカーのコネクタを外すとブザー音は確実に無効にできます。`pcspkr` カーネルモジュールを削除すると同じ事ができます。

以下のようにすると bash(1) が使う readline(3) プログラムが警告文字 (ASCII=7) に出会った際にブザー音を発生するのを防げます。

    $ echo "set bell-style none">> ~/.inputrc

### 9.5.9. メモリー使用状況

メモリー使用状況を確認するのに2つのリソースがあります。

- "`/var/log/dmesg`" 中にあるカーネルブートメッセージには、利用可能なメモリーの正確な全サイズが書かれています。

- free(1) や top(1) は稼働中システムのメモリーリソース情報を表示します。

以下がその例です。

    # grep '\] Memory' /var/log/dmesg
    [    0.004000] Memory: 990528k/1016784k available (1975k kernel code, 25868k reserved, 931k data, 296k init)
    $ free -k
                 total       used       free     shared    buffers     cached
    Mem:        997184     976928      20256          0     129592     171932
    -/+ buffers/cache:     675404     321780
    Swap:      4545576          4    4545572

「dmesg は 990 MB 空いているという一方、free -k は 320 MB 空いていると言っている。 600 MB 以上行方不明だ …」 と不思議かもれません。

"`Mem:`" 行の "`used`" のサイズが大きかったり "`free`" のサイズが小さかったりについて悩まないでおきましょう。それらの1行下 (上記例では675404と321780) を読んで安心して下さい。

1GB=1048576k の DRAM (video システムがこのメモリーの一部を使用) が付いている私の MacBook では以下のようになっています。

表9.17 報告されるメモリーサイズのリスト

報告 | サイズ
--- | ---
dmesg 中の全サイズ (Total) | 1016784k = 1GB - 31792k
dmesg 中の未使用 (free) | 990528k
shell 下での全 (total) | 997184k
shell 下での未使用 (free) | 20256k (しかし実質は 321780k)

### 9.5.10. システムのセキュリティーと整合性のチェック

ダメなシステム管理をするとあなたのシステムを外界からの攻撃にさらすことになるかもしれません。

システムのセキュリティーと整合性のチェックには、以下の事から始めるべきです。

- `debsums` パッケージ、debsums(1) と 「トップレベルの "Release" ファイルと信憑性」を参照下さい。

- `chkrootkit` パッケージ、chkrootkit(1) 参照下さい。

- `clamav` パッケージ類、clamscan(1) と freahclam(1) 参照下さい。

- Debian セキュリティー FAQ.

- Securing Debian Manual.

表9.18 システムセキュリティーや整合性確認のためのツールリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`logcheck` | V:4.7, I:5.8 | 120 | システムログの異常を管理者にメールするデーモン
`debsums` | V:4, I:30 | 108 | MD5 チェックサムを使ってインストール済みパッケージファイルを検証するユーティリティー
`chkrootkit` | V:11, I:15 | 988 | ルートキット検出ソフト
`clamav` | V:9, I:40 | 19861 | Unix 用アンチウィルスユーティリティー - コマンドラインインターフェース
`tiger` | V:1.2, I:1.5 | 7800 | システムセキュリティーの脆弱性を報告
`tripwire` | V:1.3, I:1.7 | 5060 | ファイルやディレクトリーの整合性チェックソフト
`john` | V:1.1, I:7.7 | 469 | アクティブなパスワードクラッキングツール
`aide` | V:2.2, I:2.6 | 324 | 先進的進入検出環境 - 静的ライブラリー
`integrit` | V:0.09, I:0.18 | 2759 | ファイル整合性確認プログラム
`crack` | V:0.09, I:0.65 | 153 | パスワード推定プログラム

以下のシンプルなスクリプトを使うと、典型的な間違いの全員書込み可のファイルパーミッションをチェックできます。

    # find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)

| 注意
`debsums` パッケージはローカルに保存された MD5 チェックサムを使うので、悪意ある攻撃に対抗するセキュリティー監査ツールとしては完全には信頼できません。

## 9.6. データー保存のティップ

Linux live システムとしてあなたのシステムをブート (「USB 上の Linux live レスキューシステム」 や 「GRUBからの Linux live レスキューシステム」) すると、インストール済みシステム上のデーターストレージへの再設定が簡単になります。

| 注記
ハードディスク (HDD) に関する文言は、SSD / USB フラッシュデバイス / メモリーカード /... のようなストレージデバイスのような他のストレージデバイスにも適用できます。例中の`/dev/sda` のようなデバイス名は、該当するデバイス名 `/dev/nvme0`, `/dev/mmcblk0`, ... に置き換えます。

あるデバイスが GUI デスクトップ システム自動マウントされた場合、それらに操作を加える前に手動でコマンドラインからそのデバイスを umount(8) する必要があるかもしれません。

### 9.6.1. ディスク空間の利用状況

ディスク空間使用状況は `mount` と `coreutils` と `xdu` パッケージが提供するプログラムで評価できます:

- mount(8) はマウントされたファイルシステム (= ディスク) すべてを報告します。

- df(1) はファイルシステムのディスク空間使用状況を報告します。

- du(1) はディレクトリーツリーのディスク空間使用状況を報告します。

| ヒント
du(8) の出力を xdu(1) に "`du -k . |xdu`" や "`sudo du -k -x / |xdu`" 等として注ぎ込むとそのグラフィカルでインタラクティブな表現が作成できます。

### 9.6.2. ディスクパーティション設定

ディスクのパーティションの設定に関して、fdisk(8) は標準と考えられてきていますが、parted(8) も注目に値します。"ディスクパーティションデーター" や "パーティションテーブル" や "パーティションマップ" や "ディスクラベル" は全て同意語です。

古い PC では、ディスクのパーティションデーターが最初のセクターとなる LBA セクター 0 (512バイト) に保持される、古典的なマスターブートレコード (MBR) 方式が使われています。

Intel ベースの Mac を含む ユニファイド エクステンシブル ファームウェア インタフェース (UEFI) 付きの一部 PC では、ディスクパーティションデーターを最初のセクター以外に保持する GUID Partition Table (GPT) 方式が使われています。

fdisk(8) はディスクパーティションツールの標準でしたが、parted(8) がそれを置き換えつつあります。

表9.19 ディスクパーティション管理パッケージのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`util-linux` | V:914, I:1000 | 4758 | fdisk(8) と cfdisk(8) を含む雑多なシステムユーティリティー
`parted` | V:435, I:565 | 122 | GNU Parted ディスクパーティションとリサイズのプログラム
`gparted` | V:11, I:87 | 2313 | `libparted` ベースの GNOME パーティションエディター
`gdisk` | V:19, I:264 | 967 | GPT/MBR ハイブリッドディスク用パーティションエディター
`kpartx` | V:16, I:26 | 80 | パーティション用のデバイスマッピングを作成するプログラム

| 注意
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:828, I:998 | 1560 | ext2/ext3/ext4 ファイルシステムのためのユーティリティー
`btrfs-progs` | V:52, I:79 | 5255 | btrfs ファイルシステムのためのユーティリティー
`reiserfsprogs` | V:10, I:21 | 473 | Reiserfs ファイルシステムのためのユーティリティー
`zfsutils-linux` | V:33, I:33 | 1904 | OpenZFS ファイルシステムのためのユーティリティー
`dosfstools` | V:260, I:564 | 310 | FAT ファイルシステムのためのユーティリティー (Microsoft: MS-DOS, Windows)
`exfatprogs` | V:35, I:459 | 558 | 三星によってメンテナンスされている exFAT ファイルシステムのためのユーティリティー
`exfat-fuse` | V:2, I:43 | 73 | FUSE によるexFAT ファイルシステム (Microsoft) の読み書きドライバー。
`xfsprogs` | V:41, I:86 | 4382 | XFS ファイルシステムのためのユーティリティー (SGI: IRIX)
`ntfs-3g` | V:175, I:509 | 1507 | FUSE による NTFS ファイルシステム (Microsoft: Windows NT, …) の読み書きドライバー。
`jfsutils` | V:0.4, I:6.7 | 1104 | JFS ファイルシステムのためのユーティリティー (IBM: AIX, OS/2)
`xorriso` | V:14, I:65 | 378 | libburnia提供の、ISO-9660 ファイルシステムとCD/DVD 書き込みユーティリティー
`wodim` | V:7, I:87 | 898 | cdrkit提供の、CD/DVD 書き込みコマンド
`genisoimage` | V:16, I:158 | 1567 | cdrkit提供の、コマンドライン ISO-9660 ファイルシステムツール
`reiser4progs` | V:0.1, I:1.2 | 1367 | Reiser4 ファイルシステムのためのユーティリティー
`hfsprogs` | V:0.3, I:3.2 | 394 | HFS と HFS Plus ファイルシステムのためのユーティリティー (Apple: Mac OS)
`zerofree` | V:7, I:117 | 30 | ext2/3/4 ファイルシステムのフリーブロックをゼロにセットするプログラム

| ヒント
Ext4 ファイルシステムは Linux システムのためのデフォルトのファイルシステムで、特定の使用しない理由がない限りこれを使用することが強く推奨されます。 Btrfs の状態は Debian wiki の btrfs や kernel.org wiki の btrfs に記されています。btrfsファイルシステムは、ext4 ファイルシステム後継のデフォルトのファイルシステムとなると期待されています。 一部のツールはファイルシステムへのアクセスを Linux カーネルのサポート無しでも可能にします (「ディスクをマウントせずに操作」を参照下さい)。

### 9.6.6. ファイルシステムの生成と整合性チェック

mkfs(8) コマンドは Linux システム上でファイルシステムを生成します。fsck(8) コマンドは Linux システム上でファイルシステムの整合性チェックと修理機能を提供します。

現在 Debian は、ファイルシステム形成後に定期的な `fsck` 無しがデフォルトです。

| 注意
一般的に `fsck` をマウントされているファイルシステムに実行することは安全ではありません。

| ヒント
"`/etc/mke2fs.conf`" 中に "`enable_periodic_fsck`" と設定し、"`tune2fs -c0 /dev/partition_name`"を実行して最大マウント回数を 0 と設定すれば、リブート時にfsck(8) コマンドを root ファイルシステムを含む全ファイルシステムに安全に実行可能です。mke2fs.conf(5) と tune2fs(8) を参照下さい。 ブートスクリプトから実行される fsck(8) コマンドの結果を "`/var/log/fsck/`" 中のファイルからチェックします。

### 9.6.7. マウントオプションによるファイルシステムの最適化

"`/etc/fstab`" により静的なファイルシステム設定がなされます。例えば、

    «file system»                   «mount point» «type» «options»    «dump» «pass»
    proc                                      /proc proc   defaults          0 0
    UUID=709cbe4c-80c1-56db-8ab1-dbce3146d2f7 /     ext4   errors=remount-ro 0 1
    UUID=817bae6b-45d2-5aca-4d2a-1267ab46ac23 none  swap   sw                0 0
    /dev/scd0                        /media/cdrom0  udf,iso9660 user,noauto  0 0

| ヒント
UUID (「UUID を使ってパーティションをアクセス」を参照下さい) は、"`/dev/sda3`" や "`/dev/sda3`" 等の普通のブロックデバイス名の代わりにブロックデバイスを指定するのに使えます。

Linux 2.6.30 以来、カーネルは "`relatime`" オプションで提供される挙動をデフォルトとしています。

fstab(5) と mount(8) を参照下さい。

### 9.6.8. スーパーブロックによるファイルシステムの最適化

tune2fs(8) コマンドを用いてファイルシステムのスーパーブロックによってファイルシステムを最適化できます。

- "`sudo tune2fs -l /dev/sda1`" を実行すると"`/dev/sda1`" 上のファイルシステムスーパーブロックを表示します。

- "`sudo tune2fs -c 50 /dev/sda1`" を実行すると"`/dev/sda1`" 上のファイルシステムのチェック (ブートアップ時の `fsck` 実行) の頻度を50回のブート毎に変更します。

- "`sudo tune2fs -j /dev/sda1`" の実行は ext2 から ext3 へと"`/dev/sda1`" 上のファイルシステム変換してファイルシステムにジャーナリングの機能を追加します。(アンマウントしたファイルシステムに対して実行します。)

- "`sudo tune2fs -O extents,uninit_bg,dir_index /dev/sda1 && fsck -pf /dev/sda1`" の実行は"`/dev/sda1`" 上のファイルシステムを ext3 から ext4 に変換します。(アンマウントしたファイルシステムに対して実行します。)

| ヒント
tune2fs(8) は、その名前にもかかわらず、ext2 ファイルシステムに機能するだけでなく ext3 とか ext4 ファイルシステムに関しても機能します。

### 9.6.9. ハードディスクの最適化

| 警告
ハードディスクの設定はデーターの整合性にとって非常に危険な事なので、その設定をさわる前にお使いのハードウエアーをチェックし hdparm(8) のマンページをチェックします。

例えば "`/dev/sda`" に対して "`hdparm -tT /dev/sda`" とするとハードディスクのアクセス速度をテストできます。(E)IDE を使って接続された一部のハードディスクでは、"(E)IDE 32ビット I/O サポート" を有効にし "using_dma フラグ" を有効にし "interrupt-unmask フラグ" を設定し "複数16セクター I/O" を設定するように、"`hdparm -q -c3 -d1 -u1 -m16 /dev/sda`" とすると高速化できます (危険です!)。

例えば "`/dev/sda`" に対して "`hdparm -W /dev/sda`" とするとハードディスクの書込みキャッシュ機能をテストできます。"`hdparm -W 0 /dev/sda`" とするとハードディスクの書込みキャッシュ機能を無効にできます。

不良プレスの CDROM を現代的な高速 CD-ROM ドライブで読むには、"`setcd -x 2`" としてそれを減速して使えば読めるかもしれません。

### 9.6.10. ソリッドステートドライブの最適化

現在、ソリッドステートドライブ (SSD) は自動検出されます。

揮発性のデーターパスの上に "`tmpfs`" を `/etc/fstab` でマウントすることで、不必要なディスクアクセスを減らしてディスクの消耗りを防ぎます。

### 9.6.11. SMART を用いたハードディスクの破壊の予測

smartd(8) デーモンを使うと SMART に文句を言うハードディスクの監視と記録ができます。

1. BIOS のSMART 機能を有効にします。

2. `smartmontools` パッケージをインストールします。

3. df(1) を使ってリストすることであなたのハードディスクを識別します。

   - 監視対象のハードディスクを "`/dev/sda`" と仮定します。

4. SMART 機能が実際に有効となっているかを "`smartctl -a /dev/sda`" のアウトプットを使ってチェックします。

   - もし有効でない場合には、"`smartctl -s on -a /dev/sda`" として有効にします。

5. 以下のようにして smartd(8) デーモンを実行します。

   - "`/etc/default/smartmontools`" ファイル中の "`start_smartd=yes`" をアンコメントします。

   - "`sudo systemctl restart smartmontools`" として smartd(8) デーモンを再実行します。

| ヒント
smartd(8) デーモンは、警告の通知の仕方を含めて `/etc/smartd.conf` ファイルを用いてカスタム化できます。

### 9.6.12. $TMPDIR 経由で一時保存ディレクトリーを指定

普通アプリケーションは一時保存ディレクトリー "`/tmp`" のもとに一時ファイルを作成します。もし "`/tmp`" が十分なスペースを提供できない場合、行儀のいいプログラムなら `$TMPDIR` 変数を使ってそのような一時保存ディレクトリを指定できます。

### 9.6.13. LVM を使う使用可能なストレージ空間の拡張

インストール時に論理ボリュームマネージャー (LVM) (Linux 機能) 上に作られたパーティションは、大掛かりなシステムの再設定無しに複数のストレージデバイスにまたがる LVM 上のエクステントを継ぎ足したりその上のエクステントを切り捨てることで簡単にサイズ変更が出きます。

### 9.6.14. 他パーティションをマウントする使用可能なストレージ空間の拡張

空のパーティションがあれば (例えば "`/dev/sdx`")、それを mkfs.ext4(1) を使ってフォーマットし、それをあなたが空間をより必要とするディレクトリーに mount(8) することができます。(元来あったデーター内容はコピーする必要があります。)

    $ sudo mv work-dir old-dir
    $ sudo mkfs.ext4 /dev/sdx
    $ sudo mount -t ext4 /dev/sdx work-dir
    $ sudo cp -a old-dir/* work-dir
    $ sudo rm -rf old-dir

| ヒント
上記の代わりに、空のディスクイメージファイル (「空のディスクイメージ作成」を参照下さい) をループデバイスとしてマウントする (「ディスクイメージファイルをマウント」を参照下さい) 事もできます。実際のディスク使用は実際にデーターを溜め込むとともに成長します。

### 9.6.15. 他ディレクトリーをバインドマウントする使用可能なストレージ空間の拡張

使える空間がある他のパーティション中に空のディレクトリーがあれば (例えば "`/path/to/emp-dir`")、そのディレクトリーを `--bind`" オプションを使って、空間を必要としているディレクトリー (例えば "`work-dir`")にマウントすることができます。

    $ sudo mount --bind /path/to/emp-dir work-dir

### 9.6.16. 他ディレクトリーをオーバーレーマウントすることで使用可能なストレージ空間を拡張

Linux カーネル 3.18 以降 (Debian Stetch 9.0 以降) を使うと、他のパーティション中に使える空間 (例えば "`/path/to/empty`" と "`/path/to/work`") があれば、その中にディレクトリーを作成し、容量が必要な古いディレクトリー(e.g., "`/path/to/old`")の上に OverlayFS を使って積み重ねることができます。

    $ sudo mount -t overlay overlay \
      -olowerdir=/path/to/old-dir,upperdir=/path/to/empty,workdir=/path/to/work

ここで、"`/path/to/old`" 上に書き込むには、読み書きが許可されたパーティション上に "`/path/to/empty`" と "`/path/to/work`" があることが必要です。

### 9.6.17. シムリンクを使う使用可能なストレージ空間の拡張

| 注意
ここに書かれている事は非推奨です。ソフトウェアーによっては「ディレクトリーへのシムリンク」ではうまく機能しません。上記の「マウントする」アプローチを代わりに使って下さい。

使える空間がある他のパーティション中に空のディレクトリーがあれば (例えば "`/path/to/emp-dir`")、そのディレクトリーへ ln(8) を使ってシムリンクを作成することができます。

    $ sudo mv work-dir old-dir
    $ sudo mkdir -p /path/to/emp-dir
    $ sudo ln -sf /path/to/emp-dir work-dir
    $ sudo cp -a old-dir/* work-dir
    $ sudo rm -rf old-dir

| 警告
"ディレクトリーへのシムリンク" を "`/opt`" のようなシステムが管理するディレクトリーに使用してはいけません。システムがアップグレードされる際にそのようなシムリンクは上書きされるかもしれません。

## 9.7. ディスクイメージ

次に、ディスクイメージの操作を論じます。

### 9.7.1. ディスクイメージの作成

マウントされていない、例えば2番目の SCSI か ATA ドライブの "`/dev/sdb`"、デバイスのディスクイメージファイル "`disk.img`" は、以下のひとつで書き込めます。

    # dd if=/dev/sdb of=disk.img; sync

    # cp /dev/sdb disk.img ; sync

    # cat /dev/sdb > disk.img ; sync

プライマリ IDE ディスクの最初のセクターにある伝統的 PC のマスターブートレコード (MBR) (「ディスクパーティション設定」を参照下さい) のディスクイメージは、dd(1) を用いれば以下のようにして作れます。

    # dd if=/dev/sda of=mbr.img bs=512 count=1
    # dd if=/dev/sda of=mbr-nopart.img bs=446 count=1
    # dd if=/dev/sda of=mbr-part.img skip=446 bs=1 count=66

- "`mbr.img`": パーティションテーブル付きの MBR

- "`mbr-nopart.img`": パーティションテーブル抜きの MBR。

- "`mbr-part.img`": MBR のパーティションテーブルのみ。

オリジナルディスクのパーティションのイメージを作る場合には、"`/dev/sda`" を"`/dev/sda1`" 等で置き換えます。

### 9.7.2. ディスクに直接書込み

ディスクイメージファイル "`disk.img`" は、例えば サイズがマッチする2番目の SCSI ドライブ"`/dev/sdb`" に、、以下のひとつで書き込めます。

    # dd if=disk.img of=/dev/sdb ; sync

    # cp disk.img /dev/sdb ; sync

    # cat disk.img >/dev/sdb ; sync

同様にディスクパーティションイメージファイル "`partition.img`" はサイズがマッチする例えば "`/dev/sdb1`" という2番目の SCSI ドライブの1番目のパーティションに以下のようにして書き込むことができます。

    # dd if=partition.img of=/dev/sdb1 ; sync

### 9.7.3. ディスクイメージファイルをマウント

単一パーティションイメージを含むディスクイメージ "`partition.img`" は以下のように loop デバイスを使いマウントしアンマウントできます。

    # losetup --show -f partition.img
    /dev/loop0
    # mkdir -p /mnt/loop0
    # mount -t auto /dev/loop0 /mnt/loop0
    ...hack...hack...hack
    # umount /dev/loop0
    # losetup -d /dev/loop0

これは以下のように簡略化出来ます。

    # mkdir -p /mnt/loop0
    # mount -t auto -o loop partition.img /mnt/loop0
    ...hack...hack...hack
    # umount partition.img

複数のパーティションを含むディスクイメージ "`disk.img`" の各パーティションは loop デバイスを使ってマウント出来ます。

    # losetup --show -f -P disk.img
    /dev/loop0
    # ls -l /dev/loop0*
    brw-rw---- 1 root disk   7,  0 Apr  2 22:51 /dev/loop0
    brw-rw---- 1 root disk 259, 12 Apr  2 22:51 /dev/loop0p1
    brw-rw---- 1 root disk 259, 13 Apr  2 22:51 /dev/loop0p14
    brw-rw---- 1 root disk 259, 14 Apr  2 22:51 /dev/loop0p15
    # fdisk -l /dev/loop0
    Disk /dev/loop0: 2 GiB, 2147483648 bytes, 4194304 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: gpt
    Disk identifier: 6A1D9E28-C48C-2144-91F7-968B3CBC9BD1

    Device         Start     End Sectors  Size Type
    /dev/loop0p1  262144 4192255 3930112  1.9G Linux root (x86-64)
    /dev/loop0p14   2048    8191    6144    3M BIOS boot
    /dev/loop0p15   8192  262143  253952  124M EFI System

    Partition table entries are not in disk order.
    # mkdir -p /mnt/loop0p1
    # mkdir -p /mnt/loop0p15
    # mount -t auto /dev/loop0p1 /mnt/loop0p1
    # mount -t auto /dev/loop0p15 /mnt/loop0p15
    # mount |grep loop
    /dev/loop0p1 on /mnt/loop0p1 type ext4 (rw,relatime)
    /dev/loop0p15 on /mnt/loop0p15 type vfat (rw,relatime,fmask=0002,dmask=0002,allow_utime=0020,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
    ...hack...hack...hack
    # umount /dev/loop0p1
    # umount /dev/loop0p15
    # losetup -d /dev/loop0

この他、同様の効果は `kpartx` パッケージの kpartx(8) により作られるデバイスマッパーデバイスを用いて以下のようにして実現も出来ます。

    # kpartx -a -v disk.img
    add map loop0p1 (253:0): 0 3930112 linear 7:0 262144
    add map loop0p14 (253:1): 0 6144 linear 7:0 2048
    add map loop0p15 (253:2): 0 253952 linear 7:0 8192
    # fdisk -l /dev/loop0
    Disk /dev/loop0: 2 GiB, 2147483648 bytes, 4194304 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: gpt
    Disk identifier: 6A1D9E28-C48C-2144-91F7-968B3CBC9BD1

    Device         Start     End Sectors  Size Type
    /dev/loop0p1  262144 4192255 3930112  1.9G Linux root (x86-64)
    /dev/loop0p14   2048    8191    6144    3M BIOS boot
    /dev/loop0p15   8192  262143  253952  124M EFI System

    Partition table entries are not in disk order.
    # ls -l /dev/mapper/
    total 0
    crw------- 1 root root 10, 236 Apr  2 22:45 control
    lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p1 -> ../dm-0
    lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p14 -> ../dm-1
    lrwxrwxrwx 1 root root       7 Apr  2 23:19 loop0p15 -> ../dm-2
    # mkdir -p /mnt/loop0p1
    # mkdir -p /mnt/loop0p15
    # mount -t auto /dev/mapper/loop0p1 /mnt/loop0p1
    # mount -t auto /dev/mapper/loop0p15 /mnt/loop0p15
    # mount |grep loop
    /dev/loop0p1 on /mnt/loop0p1 type ext4 (rw,relatime)
    /dev/loop0p15 on /mnt/loop0p15 type vfat (rw,relatime,fmask=0002,dmask=0002,allow_utime=0020,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
    ...hack...hack...hack
    # umount /dev/mapper/loop0p1
    # umount /dev/mapper/loop0p15
    # kpartx -d disk.img

### 9.7.4. ディスクイメージのクリーニング

ディスクイメージファイル "`disk.img`" は消去済みのファイルを綺麗に無くした綺麗なスパースイメージ "`new.img`" に以下のようにしてできます。

    # mkdir old; mkdir new
    # mount -t auto -o loop disk.img old
    # dd bs=1 count=0 if=/dev/zero of=new.img seek=5G
    # mount -t auto -o loop new.img new
    # cd old
    # cp -a --sparse=always ./ ../new/
    # cd ..
    # umount new.img
    # umount disk.img

もし "`disk.img`" が ext2 か ext3 か ext4 の場合には、`zerofree` パッケージの zerofree(8) を使うことも出来ます。

    # losetup --show -f disk.img
    /dev/loop0
    # zerofree /dev/loop0
    # cp --sparse=always disk.img new.img
    # losetup -d /dev/loop0

### 9.7.5. 空のディスクイメージ作成

5GiB まで成長可能な空のディスクイメージファイル "`disk.img`" はdd(1) を用いて以下のようにして作成できます。

    $ dd bs=1 count=0 if=/dev/zero of=disk.img seek=5G

ここで dd(1) の利用に代え、特化した fallocate(8) の利用ができます。

loop デバイスを使ってこのディスクイメージ "`disk.img`" 上に ext4 ファイルシステムを作成できます。

    # losetup --show -f disk.img
    /dev/loop0
    # mkfs.ext4 /dev/loop0
    ...hack...hack...hack
    # losetup -d /dev/loop0
    $ du  --apparent-size -h disk.img
    5.0G  disk.img
    $ du -h disk.img
    83M disk.img

"`sparse`" に関して、そのファイルサイズは 5.0GiB でその実ディスク使用はたったの 83MiB です。この相違は ext4 がスパースファイルを保持できるから可能となっています。

| ヒント
スパースファイルによる実際のディスク使用はそこに書かれるデーターとともに成長します。

「ディスクイメージファイルをマウント」にあるように loop デバイスまたはデバイスマッパーデバイスによりデバイスに同様の操作をすることで、このディスクイメージ "`disk.img`" をparted(8) または fdisk(8) を使ってパーティションし mkfs.ext4(8) や mkswap(8) 等を使ってファイルシステムを作れます。

### 9.7.6. ISO9660 イメージファイル作成

| ヒント
cdrkit が提供するgenisoimage(1) や、Libburnia が提供する xorrisofs(1) はコマンド名以外のコマンドシンタックスを共有しています。

"`source_directory`" のソースディレクトリーツリーから作られる ISO9660 イメージファイル"`cd.iso`" はcdrkit が提供する genisoimage(1) を使って以下のようにして作成できます。

    #  genisoimage -r -J -T -V volume_id -o cd.iso source_directory

同様に、ブート可能な ISO9660 イメージファイル "`cdboot.iso`" は、`debian-installer` のような "`source_directory`" にあるディレクトリーツリーから以下のようにして作成できます。

    #  genisoimage -r -o cdboot.iso -V volume_id \
       -b isolinux/isolinux.bin -c isolinux/boot.cat \
       -no-emul-boot -boot-load-size 4 -boot-info-table source_directory

上記では、Isolinux ブートローダー (「2段目: ブートローダー」を参照下さい) がブートに使われています。

以下のようにすると CD-ROM デバイスから直接 md5sum 値を計算し ISO9660 イメージを作成できます。

    $ isoinfo -d -i /dev/cdrom
    CD-ROM is in ISO 9660 format
    ...
    Logical block size is: 2048
    Volume size is: 23150592
    ...
    # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum
    # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso

| 警告
正しい結果を得るために上記のように Linux の ISO9660 ファイルシステム先読みバグを注意深く避けなければいけません。

### 9.7.7. CD/DVD-R/RW に直接書込み

| ヒント
DVD iは cdrkit が提供するwodim(1) や、Libburnia が提供する xorrrecord(1) にとって、DVDは大きな CD でしかありません。これらコマンドは、コマンド名以外のコマンドシンタックスを共有しています。

使えるデバイスは以下のようにするとみつかります。

    # wodim --devices

そしてブランクの CD-R をドライブに挿入して、例えば "`/dev/sda`" というこのデバイスに ISO9660 イメージファイル "`cd.iso`" にwodim(1) を使って以下のようにして書込みます。

    # wodim -v -eject dev=/dev/sda cd.iso

もし CD-R ではなく CD-RW が使われている場合には、次を代わりに実行して下さい。

    # wodim -v -eject blank=fast dev=/dev/sda cd.iso

| ヒント
もしあなたのデスクトップシステムが CD を自動的にマウントする場合、wodim(1) を使う前に "`sudo unmount /dev/sda`" として CD をアンマウントします。

### 9.7.8. ISO9660 イメージファイルをマウント

もし "`cd.iso`" の内容が ISO9660 イメージの場合、以下のようにするとそれを "`/cdrom`" に手動でマウントできます。

    # mount -t iso9660 -o ro,loop cd.iso /cdrom

| ヒント
現代的なデスクトップシステムではISO9660フォーマットされた CD のようなリムーバブルメディアを自動的にマウントします (「リムーバブルストレージデバイス」を参照下さい)。

## 9.8. バイナリーデーター

次に、ストレージメディア上のバイナリーデーターを直接操作することを論じます。

### 9.8.1. バイナリーデーターの閲覧と編集

もっとも基本的なバイナリーファイルを閲覧方法は "`od -t x1`" コマンドを使うことです。

表9.21 バイナリーデーターを閲覧や編集するパッケージのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`coreutils` | V:910, I:1000 | 17994 | ファイルをダンプする od(1) がある基本パッケージ (HEX, ASCII, OCTAL, …)
`bsdmainutils` | V:4, I:131 | 17 | ファイルをダンプする hd(1) があるユーティリティーパッケージ (HEX, ASCII, OCTAL, …)
`hexedit` | V:0.8, I:8.1 | 70 | バイナリーエディターとビューワー (HEX, ASCII)
`bless` | V:0.1, I:1.4 | 924 | フル機能の16進エディター (GNOME)
`okteta` | V:1, I:10 | 1589 | フル機能の16進エディター (KDE4)
`ncurses-hexedit` | V:0.1, I:1.3 | 130 | バイナリーエディターとビューワー (HEX, ASCII, EBCDIC)
`beav` | V:0.04, I:0.30 | 137 | バイナリーエディターとビューワー (HEX, ASCII, EBCDIC, OCTAL, …)

| ヒント
HEX は底が16の16進フォーマットです。OCTAL は底が8の8進フォーマットです。ASCII (アスキー) は情報交換用アメリカ標準コードで、普通の英文テキストです。EBCDIC (エビシディック) は IBM メインフレームオペレーティングシステム上で使われる拡張二進化十進数互換コードです。

### 9.8.2. ディスクをマウントせずに操作

ディスクをマウントせずに読出しや書込みをするツールがあります。

表9.22 ディスクをマウントせずに操作するパッケージのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`mtools` | V:7, I:53 | 400 | MSDOS ファイルをマウントせずに使うツール
`hfsutils` | V:0.2, I:2.8 | 178 | HFS や HFS+ ファイルをマウントせずに使うツール

### 9.8.3. データーの冗長性

Linux カーネルが提供するソフトウェアー RAID システムは高いレベルのストレージ信頼性を達成するためにカーネルのファイルシステムのレベルでデーターの冗長性を提供します。

アプリケーションプログラムレベルでストレージの高い信頼性を達成するようにデーター冗長性を付加するツールもあります。

表9.23 ファイルにデーターの冗長性を追加するツールのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`par2` | V:9, I:116 | 297 | ファイルのチェックと修理のためのパリティーアーカイブセット
`dvdisaster` | V:0.1, I:1.2 | 1422 | CD/DVD メディアのデーターロス/傷つき/老化の防止
`dvbackup` | V:0.01, I:0.04 | 413 | MiniDV カメラレコーダを使うバックアップツール (rsbep(1) を提供)

### 9.8.4. データーファイルの復元と事故の証拠解析

データーファイルの復元と事故の証拠解析のツールがあります。

表9.24 データーファイルの復元と事故の証拠解析のリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`testdisk` | V:2, I:26 | 2276 | パーティションのスキャンとディスク復元のためのユーティリティー
`magicrescue` | V:0.2, I:1.9 | 257 | マジックバイトを探してファイルを復元するユーティリティー
`scalpel` | V:0.2, I:2.4 | 89 | 質素で高性能なファイル彫刻刀
`myrescue` | V:0.2, I:2.1 | 81 | 破壊したハードディスクからデーターを救出
`extundelete` | V:0.5, I:7.8 | 152 | ext3/4 ファイルシステム上のファイルの削除復元ユーティリティー
`ext4magic` | V:0.3, I:3.7 | 235 | ext3/4 ファイルシステム上のファイルの削除復元ユーティリティー
`ext3grep` | V:0.2, I:2.0 | 299 | ext3 ファイルシステム上のファイルの削除復元ヘルプツール
`scrounge-ntfs` | V:0.2, I:1.7 | 49 | NTFS ファイルシステム上のデーター復元プログラム
`gzrt` | V:0.02, I:0.47 | 34 | gzip 復元ツールキット
`sleuthkit` | V:2, I:25 | 1119 | 証拠解析のためのツール (Sleuthkit)
`autopsy` | V:0.2, I:1.3 | 1026 | SleuthKit のための GUI
`foremost` | V:0.4, I:4.2 | 101 | データー復元のための証拠解析アプリケーション
`guymager` | V:0.14, I:0.82 | 1049 | Qt 使用の証拠解析用イメージ作成ソフト
`dcfldd` | V:0.3, I:2.8 | 113 | 証拠解析とセキュリティーのための `dd` の強化版

| ヒント
`e2fsprogs` パッケージ中の debugfs(8) の `list_deleted_inodes` または `undel` コマンドを用いると ext2 ファイルシステム上でファイルのアンデリートができます。

### 9.8.5. 大きなファイルを小さなファイルに分割

単一ファイルでバックアップするにはデーターが大きすぎる場合、そのファイル内容を例えば 2000MiB の断片にしてバックアップし、それらの断片を後日マージしてオリジナルのファイルに戻せます。

    $ split -b 2000m large_file
    $ cat x* >large_file

| 注意
名前がかち合わないように "`x`" で始まるファイル名のファイルが無いようにします。

### 9.8.6. ファイル内容の消去

ログファイルのようなファイルの内容を消去するためには、rm(1) を使ってファイルを消去しその後新しい空ファイルを作成することは止めます。コマンド実行間にファイルがアクセスされているかもしれないのがこの理由です。以下のようにするのがファイル内容を消去する安全な方法です。

    $ :>file_to_be_cleared

### 9.8.7. ダミーファイル

以下のコマンドはダミーや空のファイルを作成します。

    $ dd if=/dev/zero    of=5kb.file bs=1k count=5
    $ dd if=/dev/urandom of=7mb.file bs=1M count=7
    $ touch zero.file
    $ : > alwayszero.file

以下のファイルを見つかります。

- "`5kb.file`" は5KB のゼロの連続です。

- "`7mb.file`" は7MB のランダムなデーターです。

- "`zero.file`" は0バイト長のファイルかもしれません。もしファイルが存在する時は、その `mtime` を更新しその内容と長さを保持します。

- "`alwayszero.file`" は常に0バイト長ファイルです。もしファイルが存在する時は `mtime` を更新しファイル内容をリセットします。

### 9.8.8. ハードディスクの全消去

"`/dev/sda`" にある USB フラッシュドライブ等のハードディスク類似デバイス全体のデーターを完全に消すいくつかの方法があります。

| 注意
コマンドを実行する前にまず USB フラッシュドライブの場所を mount(8) を使ってチェックします。"`/dev/sda`" によって指し示されるデバイスは、あなたの全システムが存在する、 SCSI ハードディスクやシリアル ATA ハードディスクかも知れません。

以下のようにしてデーターを0にリセットして全消去します。

    # dd if=/dev/zero of=/dev/sda

以下のようにしてランダムデーターを上書きして全消去します。

    # dd if=/dev/urandom of=/dev/sda

以下のようにしてランダムデーターを非常に効率的に上書きして全消去します。

    # shred -v -n 1 /dev/sda

これに代え badblocks(8) を `-t random` オプションとともに用いることができる。

Debian インストーラ CD 等の多くのブート可能な Linux の CD のシェルから dd(1) が利用可能ですから、"`/dev/sda`" や "`/dev/sda`" 等のシステムハードディスクに対して同類のメディアから消去コマンドを実行することでインストールされたシステムを完全に消去することができます。

### 9.8.9. ハードディスク未使用部分の全消去

データーの消去はファイルシステムからアンリンクされているだけなので、例えば "`/dev/sdb1`" のようなハードディスク (USB フラッシュドライブ) 上の使用されていない領域には消去されたデーター自身が含まれているかもしれません。これらに上書きすることで綺麗に消去できます。

    # mount -t auto /dev/sdb1 /mnt/foo
    # cd /mnt/foo
    # dd if=/dev/zero of=junk
    dd: writing to `junk': No space left on device
    ...
    # sync
    # umount /dev/sdb1

| 警告
あなたの USB フラッシュドライブではこれで通常十分です。でもこれは完璧ではありません。消去されたファイル名や属性はファイルシステム中に隠れて残っているかもしれません。

### 9.8.10. 削除されたがまだオープン中のファイルの復活法

ファイルをうっかり消去しても、そのファイルが何らかのアプリケーション (読出しか書込み) によって使われている限り、そのようなファイルを復元出来ます。

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

    $ echo foo > bar
    $ less bar
    $ ps aux | grep ' less[ ]'
    bozo    4775  0.0  0.0  92200   884 pts/8    S+   00:18   0:00 less bar
    $ rm bar
    $ ls -l /proc/4775/fd | grep bar
    lr-x------ 1 bozo bozo 64 2008-05-09 00:19 4 -> /home/bozo/bar (deleted)
    $ cat /proc/4775/fd/4 >bar
    $ ls -l
    -rw-r--r-- 1 bozo bozo 4 2008-05-09 00:25 bar
    $ cat bar
    foo

この代わりに、(`lsof` パッケージがインストールされている時) もう一つのターミナルで以下のように実行します。

    $ ls -li bar
    2228329 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:02 bar
    $ lsof |grep bar|grep less
    less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar
    $ rm bar
    $ lsof |grep bar|grep less
    less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar (deleted)
    $ cat /proc/4775/fd/4 >bar
    $ ls -li bar
    2228302 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:05 bar
    $ cat bar
    foo

### 9.8.11. 全てのハードリンクを検索

ハードリンクのあるファイルは "`ls -li`" を使って確認できます、

    $ ls -li
    total 0
    2738405 -rw-r--r-- 1 root root 0 2008-09-15 20:21 bar
    2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 baz
    2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 foo

"`baz`" も "`foo`" もリンク数が "2" (>1) でハードリンクがある事を示しています。これらの inode 番号は共通の "2738404" です。これはこれらがハードリンクされた同じファイルということを意味します。ハードリンクされた全てのファイルを偶然うまく見つけられない場合は、それを例えば "2738404" という inode で以下のようにして探せます。

    # find /path/to/mount/point -xdev -inum 2738404

### 9.8.12. 見えないディスクスペースの消費

削除されたがオープンされたままのファイルは、普通の du(1) では見えませんが、ディスクスペースを消費します。これらは以下のようにすればそのサイズとともにリストできます。

    # lsof -s -X / |grep deleted

## 9.9. データー暗号化ティップ

あなたの PC への物理的アクセスがあると、誰でも簡単に root 特権を獲得できあなたの PC の全てのファイルにアクセスできます (「root パスワードのセキュリティー確保」を参照下さい)。これが意味するところは、あなたの PC が盗まれた場合にログインのパスワードではあなたのプライベートでセンシティブなデーターを守れないと言うことです。それを達成するにはデーターの暗号化技術を適用しなければいけません。GNU プライバシーガード (「データーセキュリティーのインフラ」を参照下さい) はファイルを暗号化できますが、少々手間がかかります。

dm-crypt は、ネイティブ Linux カーネルモジュール経由での自動データー暗号化を、最小限のユーザー努力で device-mapper 経由で可能にします。

表9.25 データー暗号化ユーティリティーのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`cryptsetup` | V:35, I:80 | 465 | 暗号化されたブロックデバイス (dm-crypt / LUKS) のためのユーティリティー
`cryptmount` | V:2.0, I:2.6 | 236 | ノーマルユーザーによるマウント/アンマウントに焦点を当てた暗号化されたブロックデバイス (dm-crypt / LUKS) のためのユーティリティー
`fscrypt` | V:0.4, I:1.1 | 6545 | Linux ファイルシステム暗号化 (fscrypt) 用のユーティリティー
`libpam-fscrypt` | V:0.29, I:0.34 | 6594 | Linux ファイルシステム暗号化 (fscrypt) 用のPAM モジュール

| 注意
データーの暗号化には CPU 時間等の負担がかかります。暗号化したデーターはそのパスワードを失うとアクセスできなくなります。暗号化の利益と負担の両天秤をして下さい。

| 注記
debian-installer (lenny 以降) を使うと、dm-crypt/LUKS と initramfs を使って、全 Debian システムを暗号化したディスク上にインストールできます。

| ヒント
ユーザー空間での暗号化ユーティリティーに関しては「データーセキュリティーのインフラ」を参照下さい: GNU プライバシーガード。

### 9.9.1. dm-crypt/LUKS を使ったリムーバブルディスクの暗号化

例えば "`/dev/sdx`" にある USB フラッシュドライブのようなリムーバブルストレージデバイスの内容を dm-crypt/LUKS を使って暗号化できます。それを単に以下のようにフォーマットします。

    # fdisk /dev/sdx
    ... "n" "p" "1" "return" "return" "w"
    # cryptsetup luksFormat /dev/sdx1
    ...
    # cryptsetup open /dev/sdx1 secret
    ...
    # ls -l /dev/mapper/
    total 0
    crw-rw---- 1 root root  10, 60 2021-10-04 18:44 control
    lrwxrwxrwx 1 root root       7 2021-10-04 23:55 secret -> ../dm-0
    # mkfs.vfat /dev/mapper/secret
    ...
    # cryptsetup close secret

こうすると暗号化されたディスクは、現代的な GNOME のようなデスクトップ環境では gnome-mount(1) を使ってパスワードを聞く以外は普通のディスクと同様に "`/media/disk_label`" にマウントできます (「リムーバブルストレージデバイス」を参照下さい)。全て書込まれるデーターが暗号化されている点が相違点です。パスワード入力はキーリングを使うことで自動化できます (「パスワード キーリング」を参照下さい)。

異なるファイルシステム、例えば、"`mkfs.ext4 /dev/mapper/sdx1`" として ext4 にメディアをフォーマットするのも一策です。これに替え btrfs が使われた場合には、`udisks2-btrfs` パッケージがインストールされている必要があります。このようなファイルシステムの場合、ファイルのオウナーシップやパーミッションも設定する必要があるかもしれません。

### 9.9.2. dm-crypt/LUKS で暗号化されたディスクのマウント

例えば、dm-crypt/LUKS を用いて "`/dev/sdc5`" 上に作成された暗号化されたディスクパーティションは以下のようにして "`/mnt`" マウントできます:

    $ sudo cryptsetup open /dev/sdc5 ninja --type luks
    Enter passphrase for /dev/sdc5: ****
    $ sudo lvm
    lvm> lvscan
      inactive          '/dev/ninja-vg/root' [13.52 GiB] inherit
      inactive          '/dev/ninja-vg/swap_1' [640.00 MiB] inherit
      ACTIVE            '/dev/goofy/root' [180.00 GiB] inherit
      ACTIVE            '/dev/goofy/swap' [9.70 GiB] inherit
    lvm> lvchange -a y /dev/ninja-vg/root
    lvm> exit
      Exiting.
    $ sudo mount /dev/ninja-vg/root /mnt

## 9.10. カーネル

Debian はモジュール化された Linux カーネルをサポートされるアーキテクチャに対してパッケージとしてディストリブートしています。

本ドキュメンテーションを読んでいるなら、あなた自身で Linux カーネルをコンパイルする必要はきっとありません。

### 9.10.1. カーネル変数

多くの Linux の機能はカーネル変数を使い以下のように設定されます。

- ブートローダーにより初期化されたカーネル変数 (「2段目: ブートローダー」を参照下さい)

- 実行時に sysfs によりアクセスできるカーネル変数に関して sysctl(8) を用い変更されたカーネル変数 (「procfs と sysfs」を参照下さい)

- モジュールがアクティベートされた際の modprobe(8) の引数により設定されるモジュール変数 (「ディスクイメージファイルをマウント」を参照下さい)

詳細は、"The Linux kernel user’s and administrator’s guide » The kernel’s command-line parameters" を参照下さい。

### 9.10.2. カーネルヘッダー

ほとんどの普通のプログラムはカーネルヘッダーを必要としませんし、コンパイルするのにそれらを直接用いるとコンパイルがうまくいかないかもしれません。普通のプログラムは Debian システム上では (`glibc` ソースパッケージから生成される) `libc6-dev` パッケージが提供する "`/usr/include/linux`" や "`/usr/include/asm`" 中のヘッダを使ってコンパイルするべきです。

| 注記
外部ソースからのカーネルモジュールやオートマウンターデーモン (`amd`) のようなカーネル固有の一部プログラムをコンパイルする場合、例えば "`-I/usr/src/linux-particular-version/include/`" 等の対応するカーネルヘッダーへのパスをコマンドラインで指定しなければいけません。

### 9.10.3. カーネルと関連モジュールのコンパイル

Debian にはカーネルと関連モジュールをコンパイルする独自の方法があります。

表9.26 Debian システム上でカーネルの再コンパイルためにインストールする重要パッケージのリスト

パッケージ | ポプコン | サイズ | 説明
--- | --- | --- | ---
`build-essential` | V:18, I:512 | 17 | Debian パッケージをビルドする上で不可欠なパッケージ: `make`、`gcc`、…
`bzip2` | V:159, I:972 | 113 | bz2 ファイルのための圧縮と解凍ユーティリティー
`libncurses5-dev` | I:34 | 6 | ncurses のためのデベロッパ用ライブラリーと文書
`git` | V:409, I:623 | 52512 | git: Linux カーネルによって使われている分散型リビジョンコントロールシステム
`fakeroot` | V:32, I:514 | 225 | パッケージを非 root としてビルドするための fakeroot 環境を提供
`initramfs-tools` | V:479, I:988 | 49 | initramfs をビルドするツール (Debian 固有)
`dkms` | V:81, I:149 | 235 | 動的カーネルモジュールサポート (DKMS) (汎用)
`module-assistant` | V:1, I:13 | 395 | モジュールパッケージ作成用ヘルパーツール (Debian 固有)
`devscripts` | V:5, I:33 | 2766 | Debian パッケージメンテナ用ヘルパースクリプト (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/v7.x/linux-7.1.7.tar.xz
    $ tar --xz -xvf linux-7.1.7.tar.xz
    $ cd linux-7.1.7
    $ cp /boot/config-7.1.7.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-7.*
    $ 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:910, I:1000 | 17994 | chroot(8)を含むGNU core utilities
`util-linux` | V:914, I:1000 | 4758 | chroot(8)を含むGNU core utilitiesunshare(1) を含む雑多なシステムユーティリティー
`systemd-container` | V:74, I:77 | 2726 | systemd-nspawn(1) を含むsystemd の container/nspawn ツール
`schroot` | V:7.6, I:9.5 | 2222 | Debian バイナリーパッケージを chroot 中で実行する専用ツール
`sbuild` | V:3.8, I:7.2 | 155 | Debian ソースから Debian バイナリーパッケージをビルドするツール
`debootstrap` | V:4, I:46 | 331 | 基本的な Debian システムのブートストラップ (sh で書かれている)
`mmdebstrap` | V:8, I:13 | 574 | Debian システムのブートストラップ (Perl で書かれている)
`cdebootstrap` | V:0.1, I:1.3 | 114 | Debian システムのブートストラップ (C で書かれている)
`cloud-image-utils` | V:1, I:14 | 52 | クラウドイメージ管理ユーティリティー
`cloud-guest-utils` | V:5, I:23 | 67 | クラウドゲストユーティリティー
`virt-manager` | V:11, I:48 | 2309 | 仮想マシンマネージャー: 仮想マシンを管理するデスクトップ アプリケーション
`libvirt-clients` | V:48, I:72 | 1164 | libvirt ライブラリー用のプログラム
`docker.io` | V:50, I:52 | 81699 | docker: Linux コンテナーランタイム
`podman` | V:33, I:36 | 84895 | podman: OCI ベースのコンテナーをPod中で実行するエンジン
`podman-docker` | V:2.7, I:3.3 | 270 | OCI-ベースのコンテナをPod中で実行するエンジン - docker 用のラッパー
`incus` | V:0.8, I:3.2 | 23 | Incus: システム コンテナーと仮想マシンマネージャー
`games-emulator` | I:0.19 | 21 | games-emulator: Debian のゲーム用エミュレーター
`bochs` | V:0.05, I:0.62 | 8180 | Bochs: IA-32 PC エミュレーター
`qemu-system` | I:21 | 64 | QEMU: フルシステム エミュレーションのバイナリ
`qemu-user` | V:5.8, I:9.6 | 471927 | QEMU: ユーザーモード エミュレーションのバイナリ
`qemu-utils` | V:13, I:113 | 12634 | QEMU: ユーティリティー
`qemu-system-x86` | V:53, I:96 | 69241 | KVM: ハードウエア補助仮想化を利用する x86 ハードウエア上のフル仮想化
`virtualbox` | V:2.7, I:3.4 | 151006 | VirtualBox: i386 と amd64 上での x86 仮想化解決策
`gnome-boxes` | V:1.1, I:6.5 | 7074 | Boxes: 仮想システムにアクセスするシンプルな GNOME アプリ
`xen-tools` | V:0.1, I:1.5 | 719 | Debian XEN 仮想サーバーの管理ツール
`wine` | V:13, I:56 | 204 | Wine: Windows API の実装 (標準スイート)
`dosbox` | V:1, I:12 | 2697 | DOSBox: Tandy/Herc/CGA/EGA/VGA/SVGA グラフィクス、サウンド、DOS 付きの x86 エミュレーター
`lxc` | V:10, I:13 | 1681 | Linux コンテナー ユーザースペースツール
`python3-venv` | V:8, I:153 | 6 | 仮想 python 環境を作るための venv (システム ライブラリー)
`python3-virtualenv` | V:7, I:39 | 374 | 隔離された仮想 python 環境を作るための virtualenv
`pipx` | V:8, I:50 | 4412 | 隔離された環境に python アプリをインストールするための 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 は人気がありました。

第8章 I18N と L10N |  | 第10章 データー管理