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

目次

9.1. screen プログラム
9.1.1. screen(1) の使い方のシナリオ
9.1.2. screen コマンドのキーバインディング
9.2. データーの記録と表現
9.2.1. ログデーモン
9.2.2. ログアナライザー
9.2.3. シェルの活動を綺麗に記録
9.2.4. テキストデーターのカスタム化表示
9.2.5. 時間と日付のカスタム化表示
9.2.6. 着色化されたシェル出力
9.2.7. 着色化されたコマンド
9.2.8. 複雑な反復のためにエディターでの活動を記録
9.2.9. X アプリケーションの画像イメージの記録
9.2.10. 設定ファイルの変更記録
9.3. プログラム活動の監視と制御と起動
9.3.1. プロセスの時間計測
9.3.2. スケジューリングのプライオリティー
9.3.3. ps コマンド
9.3.4. top コマンド
9.3.5. プロセスによって開かれているファイルのリスト
9.3.6. プログラム活動の追跡
9.3.7. ファイルやソケットを使っているプロセスの識別
9.3.8. 一定間隔でコマンドを反復実行
9.3.9. ファイルに関してループしながらコマンドを反復実行
9.3.10. GUI からプログラムをスタート
9.3.11. スタートするプログラムのカスタム化
9.3.12. プロセスの停止
9.3.13. タスク1回実行のスケジュール
9.3.14. タスク定期実行のスケジュール
9.3.15. Alt-SysRq キー
9.4. システム管理ティップ
9.4.1. だれがシステム上にいる?
9.4.2. 全員への警告
9.4.3. ハードウエアーの識別
9.4.4. ハードウエアー設定
9.4.5. システムとハードウエアーの時間
9.4.6. ターミナルの設定
9.4.7. 音のインフラ
9.4.8. スクリーンセーバーの無効化
9.4.9. ブザー音の無効化
9.4.10. 使用メモリー
9.4.11. システムのセキュリティーと整合性のチェック
9.5. データー保存のティップ
9.5.1. ディスク空間の利用状況
9.5.2. ディスクパーティション設定
9.5.3. UUID を使ってパーティションをアクセス
9.5.4. LVM2
9.5.5. ファイルシステム設定
9.5.6. ファイルシステムの生成と整合性チェック
9.5.7. マウントオプションによるファイルシステムの最適化
9.5.8. スーパーブロックによるファイルシステムの最適化
9.5.9. ハードディスクの最適化
9.5.10. ソリッドステートドライブの最適化
9.5.11. SMART を用いたハードディスクの破壊の予測
9.5.12. $TMPDIR 経由で一時保存ディレクトリーを指定
9.5.13. LVM を使う使用可能なストレージ空間の拡張
9.5.14. 他パーティションをマウントする使用可能なストレージ空間の拡張
9.5.15. 他ディレクトリをバインドマウントする使用可能なストレージ空間の拡張
9.5.16. シムリンクを使う使用可能なストレージ空間の拡張
9.5.17. overlayfsを使う使用可能なストレージ空間の拡張
9.6. ディスクイメージ
9.6.1. ディスクイメージの作成
9.6.2. ディスクに直接書込み
9.6.3. ディスクイメージファイルをマウント
9.6.4. ディスクイメージのクリーニング
9.6.5. 空のディスクイメージ作成
9.6.6. ISO9660 イメージファイル作成
9.6.7. CD/DVD-R/RW に直接書込み
9.6.8. ISO9660 イメージファイルをマウント
9.7. バイナリーデーター
9.7.1. バイナリーデーターの閲覧と編集
9.7.2. ディスクをマウントせずに操作
9.7.3. データーの冗長性
9.7.4. データーファイルの復元と事故の証拠解析
9.7.5. 大きなファイルを小さなファイルに分割
9.7.6. ファイル内容の消去
9.7.7. ダミーファイル
9.7.8. ハードディスクの全消去
9.7.9. ハードディスク未使用部分の全消去
9.7.10. 削除されたがまだオープン中のファイルの復活法
9.7.11. 全てのハードリンクを検索
9.7.12. 見えないディスクスペースの消費
9.8. データー暗号化ティップ
9.8.1. dm-crypt/LUKS を使ったリムーバブルディスクの暗号化
9.8.2. dm-crypt を使って swap パーティションを暗号化
9.8.3. dm-crypt/LUKS で暗号化されたディスクのマウント
9.8.4. eCryptfs を使って自動的にファイルを暗号化
9.8.5. eCryptfs を自動的にマウント
9.9. カーネル
9.9.1. Linux カーネル 2.6/3.x
9.9.2. カーネル変数
9.9.3. カーネルヘッダー
9.9.4. カーネルと関連モジュールのコンパイル
9.9.5. カーネルソースのコンパイル: Debian カーネルチーム推奨
9.9.6. ハードウエアードライバーとファームウエアー
9.10. 仮想化システム
9.10.1. 仮想化ツール
9.10.2. 仮想化の業務フロー
9.10.3. 仮想ディスクイメージファイルをマウント。
9.10.4. Chroot システム
9.10.5. 複数のデスクトップシステム

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

screen(1) は、ネットワーク接続中断をサポートするので信頼性が低く断続的な接続経由でリモートサイトをアクセスする人にとっては非常に有用なツールです。


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

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

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

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

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

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

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

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

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

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

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

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

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

[ヒント] ヒント

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

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

$ script
Script started, file is typescript

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

$ col -bx <typescript >cleanedfile
$ vim cleanedfile

(例えば、initramfs 中のブートプロセスの途中のように) script が無い場合には、その代わりに次のようにすれば良いです。

$ sh -i 2>&1 | tee typescript
[ヒント] ヒント

gnome-terminal のような一部の x-terminal-emulator は記録できます。スクロールバック用バッファーを拡大するのが良いかもしれません。

[ヒント] ヒント

screen(1) を"^A H" と一緒に使っても (「screen コマンドのキーバインディング」参照下さい) コンソールの記録が録れます。

[ヒント] ヒント

emacs(1) を"M-x shell" か "M-x eshell" か "M-x term" と一緒に使ってもコンソールの記録が録れます。後で "C-x C-w" とするとバッファーをファイルに書き出せます。

more(1)less(1) 等のページャーツール (「ページャー」参照下さい) や、ハイライトやフォーマット用のカスタムツール (「プレーンテキストデーターをハイライトとフォーマット」参照下さい) はテキストデーターを綺麗に表示できますが、汎用エディター (「テキストエディター」参照下さい) が最も汎用性がありカスタム化が可能です。

[ヒント] ヒント

vim(1) やそのページャーモードのエリアス view(1) では、":set hls" とするとハイライトサーチが可能になります。

"ls -l" コマンドによる時間と日付のデフォールトの表示形式はロケール (値は「タイムスタンプ」を参照下さい) に依存します。"$LANG" 変数が最初に参照され、それを "$LC_TIME" 変数によりオーバーライドする事ができます。

実際の各ロケールでのデフォールトの表示形式は使われた標準 C ライブラリー (libc6 パッケージ) のバージョンに依存します。つまり Debian の異なるリリースは異なるデフォールトです。

ロケール以上にこの時間や日付の表示フォーマットをカスタム化したいと真摯に望むなら、"--time-style" 引数か "$TIME_STYLE" 値を使って時間スタイル値を設定するべきです (ls(1)date(1) と "info coreutils 'ls invocation'" を参照下さい)。


[ヒント] ヒント

例えば "alias ls='ls --time-style=+%d.%m.%y\ %H:%M'" とするコマンドエリアスを使うことでコマンドライン上に長いオプションを入力しなくてよくなります (「コマンドエリアス」を参照下さい)。

[ヒント] ヒント

このような iso フォーマットは ISO 8601 に準拠しています。

殆どの現代的なターミナルへのシェル出力は 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}"

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

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

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

  • … エディターでの活動

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

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

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

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

  • … エディターでの活動

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

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

DVCS システムを使って設定ファイルの変更を記録する専用ツールがあります。


git(1) which put entire "/etc" 全てを VCS のコントロール下に置くように、git(1) とともに etckeeper パッケージを使うことをお薦めします。そのインストール案内とチュートリアルは "/usr/share/doc/etckeeper/README.gz" にあります。

本質的に "sudo etckeeper init" を実行すると、"/etc" に関する git レポジトリーが、徹底的な手順を踏む特別のフックスクリプト付きでちょうど「設定履歴記録のための Git」と同様に初期化されます。

あなたが設定を変える毎に、普通に git(1) を使って記録できます。パッケージ管理コマンドを使うと、変更に関して上手に毎回自動記録もします。

[ヒント] ヒント

"/etc" の変更履歴を閲覧するには、"sudo GIT_DIR=/etc/.git gitk" と実行すると、新規インストールされたパッケージや削除されたパッケージやパッケージのバージョンの変化が一目瞭然です。

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

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

パッケージ ポプコン サイズ 説明
coreutils V:876, I:999 14642 nice(1): スケジューリングの優先順位の変更してプログラムを実行
bsdutils V:846, I:999 238 renice(1): 実行中プロセスのスケジューリングの優先順位を変更
procps V:800, I:999 690 "/proc" ファイルシステムのユーティリティー: ps(1)top(1)kill(1)watch(1)
psmisc V:590, I:974 588 "/proc" ファイルシステムのユーティリティー: killall(1)fuser(1)pstree(1)pstree(1)
time V:43, I:842 81 time(1): 時間に関するシステムリソース使用状況を報告するためにプログラムを実行
sysstat V:95, I:113 1332 sar(1)iostat(1)mpstat(1)、…: Linux 用のシステムパーフォーマンスツール
isag V:0, I:4 106 sysstat の対話型システムアクティビティーグラフ化ソフト
lsof V:361, I:944 440 lsof(8): "-p" オプションを使い実行中のプロセスが開いているファイルをリスト
strace V:23, I:165 1223 strace(1): システムコールやシグナルを追跡
ltrace V:1, I:23 323 ltrace(1): ライブラリーコールを追跡
xtrace V:0, I:1 336 xtrace(1): X11 のクライアントとサーバーの間の通信を追跡
powertop V:6, I:229 563 powertop(1): システムの電力消費情報
cron V:874, I:997 194 cron(8) デーモンからバックグランドでスケジュール通りプロセスを実行
anacron V:452, I:539 62 1日24時間動作でないシステム用の cron 類似のコマンドスケジューラー
at V:500, I:850 145 at(1)batch(1) コマンド: 特定の時間や特定のロードレベル以下でジョブを実行

[ヒント] ヒント

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

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

for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done
  • find(1)xargs(1) の組み合わせ:

find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command
  • コマンド付きの "-exec" オプションを使って find(1):

find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;
  • 短いシェルスクリプト付きの "-exec" オプションを使って find(1):

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

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

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

freedesktop.org スタンダード準拠の グラフィカルユーザーインターフェース (GUI) の場合、/usr/share/applications/ ディレクトリ中の *.desktop ファイルにより各プログラムの GUI メニュー表示に必要なアトリビュートが提供されます。「Freedesktop.org メニュー」 参照ください。

例えば 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/ ディレクトリに追加することで生成できます。

[ヒント] ヒント

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

[ヒント] ヒント

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

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

[ヒント] ヒント

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

[ヒント] ヒント

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

[ヒント] ヒント

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

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

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

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

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

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

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

[ヒント] ヒント

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

システム異常に対する保険はカーネルコンパイルオプションの "マジック SysRq キー" (SAK キー) によって提供されます。現在の Debian カーネルではこれがデフォールトです。Alt-SysRq に続いて次のキーの中から1つを押すことでシステムのコントロールを救済するマジックが起きます。


[ヒント] ヒント

常軌を理解するためには、signal(7)kill(1)sync(1) のマンページを読みましょう。.

"Alt-SysRq s" と "Alt-SysRq u" と "Alt-SysRq r" の組み合わせは、非常に悪い状況からの脱出しシステムを止めることなく使えるキーボドアクセスを回復するのに有効です。

"/usr/share/doc/linux-doc-3.*/Documentation/sysrq.txt.gz" を参照下さい。

[注意] 注意

Alt-SysRq 機能があることはユーザーに root 特権機能をアクセスさせることになるのでセキュリティーリスクと考える事もできます。"/etc/rc.local" 中に "echo 0 >/proc/sys/kernel/sysrq" とか "/etc/sysctl.conf" 中に "kernel.sysrq = 0" と置くと Alt-SysRq 機能を無効にできます。

[ヒント] ヒント

SSH ターミナルなどからは、"/proc/sysrq-trigger" に書き込むことで Alt-SysRq 機能が使えます。例えば、リモートのシェルプロンプトから "echo s > /proc/sysrq-trigger; echo u > /proc/sysrq-trigger" とすると、全てのマウントされたファイルシステムを sync (同期) して umount (アンマウント) します。

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


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

[ヒント] ヒント

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

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

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

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

ハードウエアー (BIOS) 時間が UTC に設定されている場合は、"/etc/default/rcS" の中の設定を "UTC=yes" と変更します。

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

# dpkg-reconfigure tzdata

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

[ヒント] ヒント

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

次を参照下さい。

[ヒント] ヒント

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

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

[ヒント] ヒント

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

[ヒント] ヒント

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

アプリケーションソフトはサウンドデバイスに直接アクセスするようにばかりでなく標準的なサウンドサーバーシステム経由で間接的にアクセスするように設定されているかもしれません。


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

メモリー使用状況を確認するのに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 では次のようになっています。


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

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


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

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

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

Linux のlive CDs とかレスキューモードで debian-installer CDs であなたのシステムをブートすることでブートデバイス上のデーターストレージの再設定が簡単にできます。

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

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

[注記] 注記

新規の Intel ベースの Mac のような拡張ファームウェアインターフェイス (EFI) 付きの一部 PC では、ディスクパーティションデーターをセクターの最初以外に保持する GUID Partition Table (GPT) 方式が使われています。

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


[注意] 注意

parted(8) はファイルシステムを生成やリサイズも出きるということですが、そのようなことは mkfs(8) (mkfs.msdos(8)mkfs.ext2(8)mkfs.ext3(8)mkfs.ext4(8) と …) とか resize2fs(8) 等の最もよくメンテされている専用ツールを使って行う方がより安全です。

[注記] 注記

GPTMBR 間で切り替えるには、ディスクの最初数ブロックの内容を直接消去し (「ファイル内容の消去」参照下さい)、"parted /dev/sdx mklabel gpt" か "parted /dev/sdx mklabel msdos" を使ってそれを設定する必要があります。ここで "msdos" がMBR のために使われていることを覚えておきます。

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): 物理ボリュームの情報を報告します

ext4 ファイルシステム用に e2fsprogs パッケージは次を提供します。

  • 新規の ext4 ファイルシステムを作成するための mkfs.ext4(8)

  • 既存の ext4 ファイルシステムをチェックと修理するための fsck.ext4(8)

  • ext4 ファイルシステムのスーパーブロックを設定するための tune2fs(8)

  • debugfs(8) を使ってext4 ファイルシステムをインタラクティブにデバグします。(削除したファイルを回復する undel コマンドがあります。)

mkfs(8)fsck(8) コマンドは各種ファイルシステム依存プログラム (mkfs.fstypefsck.fstype) のフロントエンドとして e2fsprogs により提供されています。ext4 ファイルシステム用は、mkfs.ext4(8)fsck.ext4(8) で、それぞれ mke2fs(8)e2fsck(8) にシムリンクされています。

Linux によってサポートされる各ファイルシステムでも、類似コマンドが利用可能です。


[ヒント] ヒント

Ext4 ファイルシステムは Linux システムのためのデフォルトのファイルシステムで、特定の使用しない理由がない限りこれを使用することが強く推奨されます。

[ヒント] ヒント

Btrfs ファイルシステムが Linux カーネル 3.2 (Debian wheezy) では利用可能です。ext4 ファイルシステムは次のデフォルトのファイルシステムとなると期待されています。

[警告] 警告

カーネル空間でのライブ fsck(8) 機能やブートローダーサポートが提供されるようになるまでは、Btrfs をあなたのクリチカルなデーターに用いるべきではありません。

[ヒント] ヒント

一部のツールはファイルシステムへのアクセスを Linux カーネルのサポート無しでも可能にします (「ディスクをマウントせずに操作」参照下さい)。

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

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
UUID=709cbe4c-80c1-56db-8ab1-dbce3146d2f7 / ext4 noatime,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" 等の通常のブロックデバイス名の代わりにブロックデバイスを指定するのに使えます。

ファイルシステムのパーフォーマンスや性格はそれに使われるマウントオプションによって最適化できます (fstab(5)mount(8) 参照下さい)。

  • "defaults" オプションはデフォールトのオプションが次の意味です: "rw,suid,dev,exec,auto,nouser,async"。(一般的)

  • "noatime" もしくは "relatime" オプションは読出しアクセスを高速化するのに非常に効果的です。(一般的)

  • "user" オプションは通常ユーザーがファイルシステムをマウント出来るようにします。このオプションは "noexec,nosuid,nodev" オプションの組み合わせの意味です。(一般的、CD や usbストレージデバイスに使用)

  • "noexec,nodev,nosuid" オプションの組み合わせはセキュリティーの強化に使われます。(一般的)

  • "noauto" オプションは明示的操作のみにマウントを制限します。(一般的)

  • ext3fs への "data=journal" オプションは、書込み速度を犠牲ににしますが、停電時のデーター整合性を強化します。

[ヒント] ヒント

ルートファイルシステムに非デフォールトのジャーナルモードを設定するには、例えば "rootflags=data=journal" 等の、カーネルブートパラメーター (「2段目: ブートローダー」参照下さい) を与える必要があります。lenny の場合、デフォールトのジャーナルモードは "rootflags=data=ordered" です。squeeze の場合、デフォールトのジャーナルモードは "rootflags=data=writeback" です。

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

[ヒント] ヒント

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

ソリッドステートドライブ (SSD) のパーフォーマンスやディスク消耗は以下のようにすると最適化できます。

  • 最新の Linux カーネルを使用。 (>=3.2)

  • ディスク読み出しアクセス時のディスク書き込みの低減。

    • "noatime" か "relatime" マウントオプションを /etc/fstab 中で設定します。

  • TRIM コマンドを有効にします。

    • "discard" マウントオプションを /etc/fstab 中で ext4 ファイルシステム、スワップ (swap) パーティション、 Btrfs、他に設定します。fstab(5) 参照下さい。

    • "discard" オプションを /etc/lvm/lvm.conf 中で LVM に関して設定します。lvm.conf(5) 参照下さい。

    • "discard" オプションを /etc/crypttab 中で dm-crypt に関して設定します。crypttab(5) 参照下さい。

  • SSD に最適化したディスクスペース配分手順の有効化。

    • "ssd" マウントオプションを /etc/fstab 中で Btrfs に関して設定します。

  • ラップトップ PC の場合、システムがデーターをディスクに書き出すのを10 分間隔とします。

    • "commit=600" マウントオプションを /etc/fstab 中で設定します。fstab(5) 参照下さい。

    • AC 操作時も laptop-mode を用いるように pm-utils を設定します。 Debian BTS #659260 参照下さい。

[警告] 警告

書き出しを通常の 5 秒間隔から 10 分間隔に変更すると電源喪失時にデーターが壊れやすくなります。

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

  1. BIOSSMART 機能を有効にします。

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

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

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

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

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

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

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

    • "sudo /etc/init.d/smartmontools restart" として smartd(8) デーモンを再実行します。

[ヒント] ヒント

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

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

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" があることが必要です。

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

例えば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" 等で置き換えます。

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

# losetup -v -f partition.img
Loop device is /dev/loop0
# mkdir -p /mnt/loop0
# mount -t auto /dev/loop0 /mnt/loop0
...hack...hack...hack
# umount /dev/loop0
# losetup -d /dev/loop0

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

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

複数のパーティションを含むディスクイメージ "disk.img" の各パーティションは loop デバイスを使ってマウント出来ます。loop デバイスはパーティションをデフォルトでは管理しないので、次のようにそれをリセットする必要があります。

# modinfo -p loop # verify kernel capability
max_part:Maximum number of partitions per loop device
max_loop:Maximum number of loop devices
# losetup -a # verify nothing using the loop device
# rmmod loop
# modprobe loop max_part=16

これで、loop デバイスは16パーティションまで管理出来ます。

# losetup -v -f disk.img
Loop device is /dev/loop0
# fdisk -l /dev/loop0

Disk /dev/loop0: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x452b6464

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1         600     4819468+  83  Linux
/dev/loop0p2             601         652      417690   83  Linux
# mkdir -p /mnt/loop0p1
# mount -t ext4 /dev/loop0p1 /mnt/loop0p1
# mkdir -p /mnt/loop0p2
# mount -t ext4 /dev/loop0p2 /mnt/loop0p2
...hack...hack...hack
# umount /dev/loop0p1
# umount /dev/loop0p2
# losetup -d /dev/loop0

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

# kpartx -a -v disk.img
...
# mkdir -p /mnt/loop0p2
# mount -t ext4 /dev/mapper/loop0p2 /mnt/loop0p2
...
...hack...hack...hack
# umount /dev/mapper/loop0p2
...
# kpartx -d /mnt/loop0
[注記] 注記

MBR 等をスキップするオフセットを使った loop デバイスによっても、このようなディスクイメージの単一パーティションをマウント出来ます。しかしこれは失敗しがちです。

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

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

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

# losetup -f -v disk.img
Loop device is /dev/loop1
# mkfs.ext4 /dev/loop1
...hack...hack...hack
# losetup -d /dev/loop1
$ du  --apparent-size -h disk.img
5.0G  disk.img
$ du -h disk.img
83M disk.img

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

[ヒント] ヒント

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

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

"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 ファイルシステム先読みバグを注意深く避けなければいけません。

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

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


[ヒント] ヒント

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

ハードリンクのあるファイルは "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

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

dm-crypteCryptfs は最小限のユーザー努力でできる自動的なデーターの暗号化を Linux のカーネルモジュールその物を使って提供します。


Dm-cryptdevice-mapper を使う暗号学的ファイルシステムです。Device-mapper は1つのブロックデバイスをもう1つのブロックデバイスにマップします。

eCryptfs はスタックドファイルシステムを使うもう1つのファイルシステムです。スタックドファイルシステムはマウントされたファイルシステム上の既存のディレクトリーの上に重ね合わせます。

[注意] 注意

データーの暗号化には CPU 時間等の負担がかかります。その利益と負担の両天秤をします。

[注記] 注記

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

[ヒント] ヒント

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

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

# badblocks -c 1024 -s -w -t random -v /dev/sdx
# fdisk /dev/sdx
... "n" "p" "1" "return" "return" "w"
# cryptsetup luksFormat /dev/sdx1
...
# cryptsetup open --type luks /dev/sdx1 sdx1
...
# ls -l /dev/mapper/
total 0
crw-rw---- 1 root root  10, 60 2008-10-04 18:44 control
brw-rw---- 1 root disk 254,  0 2008-10-04 23:55 sdx1
# mkfs.vfat /dev/mapper/sdx1
...
# cryptsetup luksClose sdx1

こうすると暗号化されたディスクは、現代的な GNOME のようなデスクトップ環境では gnome-mount(1) を使ってパスワードを聞く以外は通常のディスクと同様に "/media/<disk_label>" にマウントできます (「リムーバブルストレージデバイス」参照下さい)。全て書込まれるデーターが暗号化されている点が相違点です。上記と違い、例えば "mkfs.ext4 /dev/sdx1" を使って ext4 等の異なったフォーマットで記録メディアをフォーマットしても良いです。

[注記] 注記

もしデーターのセキュリティーが本当に偏執狂的に気になるなら、上記例で複数回の重ね書きをする必要があるかもしれません。でもこの操作は非常に時間がかかります。

オリジナルの "/etc/fstab" が次の内容と仮定します。

/dev/sda7 swap sw 0 0

dm-crypt を使って swap パーティションの暗号化を次のようにして有効にします

# aptitude install cryptsetup
# swapoff -a
# echo "cswap /dev/sda7 /dev/urandom swap" >> /etc/crypttab
# perl -i -p -e "s/\/dev\/sda7/\/dev\/mapper\/cswap/" /etc/fstab
# /etc/init.d/cryptdisks restart
 ...
# swapon -a

eCryptfsecryptfs-utils パッケージを使うことで、"~/Private/" の下に書かれるファイルを自動的に暗号化できます。

  • ecryptfs-setup-private(1) を実行してプロンプトに従って "~/Private/" を設定します。

  • ecryptfs-mount-private(1) を実行して "~/Private/" を有効にします。

  • センシティブなデーターファイルを "~/Private/" に移動し、必要に応じてシムリンクを作成します。

    • 候補: "~/.fetchmailrc"、"~/.ssh/identity"、"~/.ssh/id_rsa"、"~/.ssh/id_dsa"、"go-rwx" を持つ他のファイル

  • センシティブなデーターディレクトリーを "~/Private/" 中のサブディレクトリーに移動し、必要に応じてシムリンクを作成します。

    • 候補: "~/.gnupg"、"go-rwx" を持つ他のディレクトリー

  • デスクトップ操作がしやすいように "~/Desktop/Private/" から "~/Private/" までのシムリンクを作成します。

  • ecryptfs-umount-private(1) を実行して "~/Private/" を無効にします。

  • 暗号化されたデーターが必要な際に "ecryptfs-mount-private" を実行して "~/Private/" を有効にします。

[ヒント] ヒント

eCryptfs はセンシティブなファイルのみを選択的に暗号化するので、そのシステムへの負担は dm-crypt を全ルートとか "/home" デバイスとかに使うよりはるかに少ないです。eCryptfs は特段のディスク上のストレージの割り当て努力の必要はありませんが、全てのファイルシステムメタデーターを秘匿することはできません。

もしあなたのログインパスワードを暗号化キーを包むのに使っている場合には、"/etc/pam.d/common-auth" 中の "pam_permit.so" のすぐ前に次に記す行があるようにすることで PAM (プラグ可能な認証モジュール: Pluggable Authentication Modules) を使って eCryptfs を自動的にマウントできます。

"/etc/pam.d/common-auth" の "pam_permit.so" の直前に次の行を挿入します。

auth required pam_ecryptfs.so unwrap

"/etc/pam.d/common-session" の最後に次の行を挿入します。

session optional pam_ecryptfs.so unwrap

"/etc/pam.d/common-password" の最初の有効行に次の行を挿入します。

password required pam_ecryptfs.so

これは非常に便利です。

[警告] 警告

PAM の設定エラーをすると、あなた自身のシステムからあなたを締め出すかもしれません。4章認証を参照下さい。

[注意] 注意

もしあなたのログインパスワードを暗号化キーを包むのに使っている場合には、あなたの暗号化されたデーターのセキュリティーはあなたのユーザーログインパスワードと同程度です (「良好なパスワード」参照下さい)。注意深く強力なパスワードを設定していないと、あなたのラップトップを誰かが盗んだ後にパスワード破りソフトを実行すれば、あなたのデーターは危険にさらされます (「root パスワードのセキュリティー確保」参照下さい)。

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

Linux カーネル 2.4 と比較して特記すべき Linux カーネル 2.6/3.x の機能がいくつかあります。

Linux 2.6.39 から Linux 3.0 へとバージョンが飛んだのは、大きな技術的な変更があったからでは無く 20 周年記念が理由です。

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

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

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


「2段目: ブートローダー」 中で initrd を使う場合、initramfs-tools(8)update-initramfs(8)mkinitramfs(8)initramfs.conf(5) 中の関連情報をしっかり読んで下さい。

[警告] 警告

Linux カーネルソースをコンパイルする時にソースツリー中のディレクトリー (例えば "/usr/src/linux*") から "/usr/include/linux" や "/usr/include/asm" へのシムリンクを張ってはいけません。(古くなった一部文書はまだこれをすることを提案しています。)

[注記] 注記

Debian の stable (安定版) システム上で最新の Linux カーネルをコンパイルする際には、Debian のunstable (非安定版) システムからバックポートされた最新のツールが必要かもしれません。

[注記] 注記

動的カーネルモジュールサポート (DKMS) は、カーネル全体を変えること無く個別カーネルモジュールをアップグレードできるようにする新しいディストリビューションに依存しない枠組みです。これはアウトオブツリーのモジュールの管理方法です。これはあなたがカーネルをアップグレードする際のモジュールの再構築を簡単にもします。

ハードウエアードラーバーとはターゲットシステム上で実行されるコードです。ほとんどのハードウエアードライバーは現在フリーソフトウエアーとして入手可能で通常の main エリアにある Debian カーネルパッケージに含まれています。

  • GPU ドラーバー

    • Intel GPU ドラーバー (main)

    • AMD/ATI GPU ドラーバー(main)

    • NVIDIA GPU ドライバー (nouveau ドライバーは main、ベンダーにサポートされたバイナリーのみ提供のドライバーは non-free 。)

  • ソフトモデムドライバー

    • martian-modem や sl-modem-dkms パーケージ (non-free)

ファームウエアーとはデバイスにロードされるコードやデーター (例えば CPU マイクロコードや、GPU上で実行されるレンダリングコードや、FPGA / CPLD データー等々)です。一部のファームウエアーパッケージはフリーソフトウエアーとして入手可能ですが、多くのファームウエアーパッケージはソースの無いバイナリーデーターを含むためにフリーソフトウエアーとして入手不可能です。

  • firmware-linux-free (main)

  • firmware-linux-nonfree (non-free)

  • firmware-linux-* (non-free)

  • *-firmware (non-free)

  • intel-microcode (non-free)

  • amd64-microcode (non-free)

non-freecontrib パッケージは Debian システムの一部でないことに注意して下さい。non-freecontrib エリアへのアクセスの有効化や無効化は 「Debian アーカイブの基本」 に説明されています。 「Debian は 100% フリーソフトウェアーです」 に記載されているように non-freecontrib パッケージを使用に付帯するマイナスを認識すべきです。

仮想化されたシステムを利用すると単一ハード上で同時に複数のシステムのインスタンスを実行することが加能となります。

[ヒント] ヒント

http://wiki.debian.org/SystemVirtualization を参照下さい。

Debian には、単純な chroot ではない仮想化エミュレーション関連のパッケージがあります。一部のパッケージはあなたがそのような環境をセットアップする事を援助します。

表9.26 仮想化ツールのリスト

パッケージ ポプコン サイズ 説明
schroot V:6, I:10 2651 Debian バイナリーパッケージを chroot 中で実行する専用ツール
sbuild V:1, I:3 277 Debian ソースから Debian バイナリーパッケージをビルドするツール
pbuilder V:2, I:18 950 Debian パッケージの個人的なパッケージビルドソフト
debootstrap V:7, I:69 258 基本的な Debian システムのブートストラップ (sh で書かれている)
cdebootstrap V:0, I:4 111 Debian システムのブートストラップ (C で書かれている)
virt-manager V:8, I:30 7426 仮想マシンマネージャー: 仮想マシンを管理するデスクトップアプリケーション
libvirt-clients V:24, I:45 1876 libvirt ライブラリー用のプログラム
bochs V:0, I:1 4086 Bochs: IA-32 PC エミュレーター
qemu I:42 501 QEMU: 高速で汎用のプロセッサエミュレーター
qemu-system I:44 89 QEMU: フルシステムエミュレーションのバイナリ
qemu-user V:3, I:43 57857 QEMU: ユーザーモードエミュレーションのバイナリ
qemu-utils V:10, I:93 4767 QEMU: ユーティリティー
qemu-kvm V:20, I:68 98 KVM: ハードウエア補助仮想化を利用する x86 ハードウエア上のフル仮想化
virtualbox V:59, I:74 71418 VirtualBox: i386 と amd64 上での x86 仮想化解決策
xen-tools V:0, I:7 791 Debian XEN 仮想サーバーの管理ツール
wine V:28, I:108 163 Wine: Windows API の実装 (標準スイート)
dosbox V:3, I:20 2654 DOSBox: Tandy/Herc/CGA/EGA/VGA/SVGA グラフィクス、サウンド、DOS 付きの x86 エミュレーター
dosemu V:0, I:4 4885 DOSEMU: Linux 用 DOS エミュレーター
vzctl V:2, I:4 1058 OpenVZ サーバー仮想化策 - コントロールツール
vzquota V:2, I:5 252 OpenVZ サーバー仮想化策 - クオータツール
lxc V:7, I:13 1297 Linux コンテナ - ユーザースペースツール

異なるプラットフォーム仮想化策の詳細な比較は Wikipedia の記事 Comparison of platform virtual machines を参照下さい。

[注記] 注記

ここに記載された機能の一部は squeeze でのみ利用可能です。

[注記] 注記

lenny以来の Debian のデフォルトカーネルは KVM をサポートしています

仮想化のための典型的な業務フローにはいくつかの段階があります。

  • 空のファイルシステムの作成 (ファイルツリーもしくはディスクイメージ)。

    • ファイルツリーは "mkdir -p /path/to/chroot" として作成できる。

    • raw ディスクイメージファイルは dd(1) を使って作れます (「ディスクイメージの作成」「空のディスクイメージ作成」参照下さい)。

    • qemu-img(1)QEMU によりサポートされたディスクイメージの作成や変換に使えます。

    • raw と VMDK ファイルフォーマットは仮想ツール間の共通フォーマットとして使えます。

  • mount(8) を使ってディスクイメージをファイルシステムにマウントする (任意)。

  • 必要なシステムデーターを用いて対象のファイルシステムを充足。

    • debootstrapcdebootstrap のようなプログラムがこのプロセスを援助します (「Chroot システム」参照下さい)。

    • OS のインストーラーをフルシステムエミュレーション下で利用。

  • 仮想化環境下でプログラムを実行。

    • chroot は、仮想環境の中でプログラムのコンパイルやコンソールアプリケーションの実行やデーモンの実行等をするのに十分な基本的仮想環境を提供します。

    • QEMU: クロスプラットフォームの CPU エミュレーションを提供

    • KVM と共の QEMUハードウエア補助仮想化によるフルシステムエミュレーションを提供します。

    • VirtualBoxハードウエア補助仮想化の有無によらず i386 と amd64 上でのフルシステムエミュレーションを提供します。

raw ディスクイメージファイルに関しては、「ディスクイメージ」を参照下さい。

他の仮想ディスクイメージに関しては、qemu-nbd(1) を使ってネットワークブロックデバイスプロトコルを用いてそれらをエクスポートし nbd カーネルモジュールを使ってそれらをマウントできます。

qemu-nbd(1)QEMU がサポートする次のディスクフォーマットをサポートします: raw、qcow2、qcowvmdkvdibochs、cow (user-mode Linux の copy-on-write)、parallelsdmgcloopvpc、vvfat (virtual VFAT)、host_device。

ネットワークブロックデバイスloop デバイスと同様の方法でパーティションをサポートします (「ディスクイメージファイルをマウント」参照下さい)。"image.img" の最初のパーティションは次のようにするとマウントできます。

# modprobe nbd max_part=16
# qemu-nbd -v -c /dev/nbd0 disk.img
...
# mkdir /mnt/part1
# mount /dev/nbd0p1 /mnt/part1
[ヒント] ヒント

qemu-nbd(8) に"-P 1" オプションを用いると、"disk.img" の最初のパーティションだけをエクスポートできます。

chroot(8) を使うのは、GNU/Linux 環境の異なったインスタンスをリブートすることなく単一システム上で同時に実行する最も基本的な手法です。

[注意] 注意

次の例は親システムと chroot システムが同じ CPU アーキテクチャを共有していると仮定しています。

pbuilder(8) プログラムを script(1) の下で次のように実行すると chroot(8) の設定と使い方が学べます。

$ sudo mkdir /sid-root
$ sudo pbuilder --create --no-targz --debug --buildplace /sid-root

"sid-root" の下に sid 環境のためのシステムデーターをどのようにして充足するかは debootstrap(8)cdebootstrap(1) を見ると分かります。

[ヒント] ヒント

この debootstrap(8)cdebootstrap(1) は、Debian インストーラーが Debian をインストールするのに使われています。これらは Debian のインストールディスクを使わず他の GNU/Linux ディストリビューションから Debian をインストールするのにも使えます。

$ sudo pbuilder --login --no-targz  --debug --buildplace /sid-root

どのようにして sid 環境下で実行されるシステムシェルが作られるかが次で観察できます。

  1. ローカル設定のコピー ("/etc/hosts" と "/etc/hostname" と "/etc/resolv.conf")

  2. "/proc" ファイルシステムのマウント

  3. "/dev/pts" ファイルシステムのマウント

  4. 常に101でプログラム終了する "/usr/sbin/policy-rc.d" を作成

  5. "chroot /sid-root bin/bash -c 'exec -a -bash bin/bash'" を実行

[注記] 注記

プログラムによっては機能するために chroot の下で pbuilder が提供するより多くの親システムのファイルへのアクセスする必要があります。例えば、"/sys" や "/etc/passwd" や "/etc/group" や "/var/run/utmp" や "/var/log/wtmp" 等が bind マウントもしくはコピーされる必要があるかもしれません。

[注記] 注記

"/usr/sbin/policy-rc.d" ファイルは、Debian システム上でデーモンプログラムが自動的に起動されることを防ぎます。"/usr/share/doc/sysv-rc/README.policy-rc.d.gz" を参照下さい。

[ヒント] ヒント

pbuilder という特化した chroot パッケージの本来の目的は、chroot システムを作りその chroot 中でパッケージをビルドすることです。それはパッケージのビルド依存関係が正しいことをチェックし、不必要で間違ったビルド依存関係が出来上がったパッケージに混入しないようにする理想的なシステムです。

[ヒント] ヒント

類似の schroot パッケージは i386 の chroot システムを amd64 の親システムの下で実行方法を教えてくれます。

仮想化を使って複数のデスクトップシステムを安全に実行するには、Debian 安定版 (stable) システム上で QEMUVirtualBox を使うことをお勧めします。これらを使うと通常ありがちなリスクに晒されずに Debian テスト版 (testing) や不安定版 (unstable) システムのデスクトップアプリケーションを実行できるようになります。

純粋な QEMU は非常に遅いので、ホストシステムがサポートする際には KVM を使って加速することをお勧めします。

QEMU 用の Debian システムを含む仮想ディスクイメージ "virtdisk.qcow2" はdebian-installer: 小さな CD を使って次のように作成できます。

$ wget http://cdimage.debian.org/debian-cd/5.0.3/amd64/iso-cd/debian-503-amd64-netinst.iso
$ qemu-img create -f qcow2 virtdisk.qcow2 5G
$ qemu -hda virtdisk.qcow2 -cdrom debian-503-amd64-netinst.iso -boot d -m 256
...

更なるティップに関しては Debian wiki: QEMU を参照下さい。

VirtualBoxQt の GUI ツールとして提供され非常に直感的に理解できます。その GUI とコマンドラインツールは VirtualBox User ManualVirtualBox User Manual (PDF) で説明されています。

[ヒント] ヒント

UbuntuFedra 等の GNU/Linux ディストリビューションを仮想化の下で実行するのは設定ティップを学ぶ非常に良い方法です。他のプロプライエタリな OS もこの GNU/Linux の仮想化の下で上手く実行できます。