第10章 データー管理

目次

10.1. 共有とコピーとアーカイブ
10.1.1. アーカイブと圧縮ツール
10.1.2. コピーと同期ツール
10.1.3. アーカイブの慣用句
10.1.4. コピーの慣用句
10.1.5. ファイル選択の慣用句
10.1.6. アーカイブメディア
10.1.7. リムーバブルストレージデバイス
10.1.8. データー共有用のファイルシステム選択
10.1.9. ネットワーク経由でのデーター共有
10.2. バックアップと復元
10.2.1. Backup and recovery policy
10.2.2. バックアプユーティリティーのスイート
10.2.3. Personal backup
10.3. データーセキュリティーのインフラ
10.3.1. Gnupg のためのキー管理
10.3.2. GnuPG をファイルに使用
10.3.3. Mutt で GnuPG を使用
10.3.4. Vim で GnuPG を使用
10.3.5. MD5 和
10.3.6. Password keyring
10.4. ソースコードマージツール
10.4.1. ソースファイル間の相違の抽出
10.4.2. ソースファイルに更新をマージ
10.4.3. Interactive merge
10.5. Git
10.5.1. Git クライアントの設定
10.5.2. Basic Git commands
10.5.3. Git tips
10.5.4. Git リファレンス
10.5.5. Other version control systems

バイナリーとテキストのデーターを Debian システム上で管理するツールとティップを記します。

[警告] 警告

競合状態とならないようにするために、アクティブにアクセスされているデバイスやファイルに複数プロセスから調整なく書き込みアクセスをしてはいけません。flock(1) を使ったファイルロック機構がこの回避に使えます。

データーのセキュリティーとそのコントロールされた共有はいくつかの側面があります。

  • データーアーカイブの作成

  • 遠隔ストレージアクセス

  • 複製

  • 変更履歴の追跡

  • データー共有のアシスト

  • 不正なファイルへのアクセスの防止

  • 不正なファイルの改変の検出

こういったことは次の組み合わせを使うことで実現できます。

  • アーカイブと圧縮ツール

  • コピーと同期ツール

  • ネットワークファイルシステム

  • リムーバブルストレージメディア

  • セキュアーシェル

  • 認証システム

  • バージョンコントロールシステムツール

  • ハッシュや暗号学的暗号化ツール

Debian システム上で利用可能なアーカイブと圧縮ツールのまとめを以下に記します。

表10.1 アーカイブと圧縮ツールのリスト

パッケージ ポプコン サイズ 拡張子 コマンド コメント
tar V:920, I:999 3144 .tar tar(1) 標準アーカイバー (デファクト標準)
cpio V:416, I:998 1141 .cpio cpio(1) Unix System V スタイルのアーカイバー、find(1) とともに使用
binutils V:160, I:642 109 .ar ar(1) 静的ライブラリー生成用のアーカイバー
fastjar V:1, I:19 183 .jar fastjar(1) Java 用のアーカイバー (zip 類似)
pax V:10, I:18 170 .pax pax(1) 新規 POSIX 標準アーカイバー、tarcpio の間の妥協点
gzip V:882, I:999 252 .gz gzip(1), zcat(1), … GNU LZ77 圧縮ユーティリティー (デファクト標準)
bzip2 V:161, I:970 121 .bz2 bzip2(1), bzcat(1), … gzip(1) より高い圧縮比 (gzip より遅い、類似シンタックス) の Burrows-Wheeler ブロック並び替え圧縮ユーティリティー
lzma V:1, I:20 149 .lzma lzma(1) LZMA compression utility with higher compression ratio than gzip(1) (deprecated)
xz-utils V:432, I:979 1216 .xz xz(1), xzdec(1), … bzip2(1) より高い圧縮比の XZ 圧縮ユーティリティー (gzip より遅いが bzip2 より早い、LZMA 圧縮ユーティリティーの代替)
zstd V:34, I:91 2027 .zstd zstd(1), zstdcat(1), … Zstandard fast lossless compression utility
p7zip V:111, I:454 987 .7z 7zr(1), p7zip(1) 高い圧縮比をもつ 7-Zip 圧縮ユーティリティー (LZMA 圧縮)
p7zip-full V:116, I:460 4664 .7z 7z(1), 7za(1) 高い圧縮比をもつ 7-Zip 圧縮ユーティリティー (LZMA 圧縮、他)
lzop V:13, I:133 164 .lzo lzop(1) gzip(1) より高い圧縮と解凍の速度 (gzip より低い圧縮比、類似シンタックス) の LZO 圧縮ユーティリティー
zip V:47, I:398 623 .zip zip(1) InfoZIP: DOS アーカイブと圧縮ツール
unzip V:100, I:772 385 .zip unzip(1) InfoZIP: DOS アーカイブ解凍と圧縮解凍ツール

[警告] 警告

何が起こるかを理解せずに "$TAPE" 変数を設定してはいけません。設定すると tar(1) の挙動が変わります。

Debian システム上で利用可能な単純なコピーとバックアップツールのまとめを以下に記します。


rsync(8) を使ってのファイルのコピーには他の方法より豊かな機能があります。

  • 転送元のファイルと転送先の既存ファイル間の相違のみを送信する差分転送アルゴリズム

  • サイズか最終変更時間に変更があったファイルのみを探す (デフォルトで採用される) 急速確認アルゴリズム

  • tar(1) 類似の "--exclude" や "--exclude-from" オプション

  • 転送先に追加ディレクトリーレベルを作成しなくする「転送元ディレクトリ後スラシュ (/) 付加」文法

[ヒント] ヒント

表10.14「List of other version control system tools」に記されたバージョンコントロールシステム (VCS) ツールは多方向のコピーと同期のツールとして機能します。

"./source" ディレクトリー中の全内容を異なるツールを用いてコピーするいくつかの方法を以下に記します。

  • ローカルコピー: "./source" ディレクトリー → "/dest" ディレクトリー

  • リモートコピー: ローカルホストの "./source" ディレクトリー → "user@host.dom" ホストの "/dest" ディレクトリー

rsync(8):

# cd ./source; rsync -aHAXSv . /dest
# cd ./source; rsync -aHAXSv . user@host.dom:/dest

「転送元ディレクトリー後スラシュ付加」文法を上記の代わりに使えます。

# rsync -aHAXSv ./source/ /dest
# rsync -aHAXSv ./source/ user@host.dom:/dest

この代わりに、次のようにも出来ます。

# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest
# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . user@host.dom:/dest

GNU cp(1) と openSSH scp(1):

# cd ./source; cp -a . /dest
# cd ./source; scp -pr . user@host.dom:/dest

GNU tar(1):

# (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - )
# (cd ./source && tar cf - . ) | ssh user@host.dom '(cd /dest && tar xvfp - )'

cpio(1):

# cd ./source; find . -print0 | cpio -pvdm --null --sparse /dest

"." を含むすべての例で "." は"foo" で代替でき、ファイルを "./source/foo" ディレクトリーから "/dest/foo" ディレクトリにコピーできます。

"." を含むすべての例で "." を絶対パスの "/path/to/source/foo" で代替でき、"cd ./source;" を削除することができます。これらは使うツール次第で異なる場所にファイルをコピーします。

  • "/dest/foo": rsync(8)、GNU cp(1)、scp(1)

  • "/dest/path/to/source/foo": GNU tar(1) と cpio(1)

[ヒント] ヒント

rsync(8) や GNU cp(1) には転送先のファイルが新しい場合にスキップする "-u" オプションがあります。

アーカイブやコピーコマンド (「アーカイブの慣用句」「コピーの慣用句」参照下さい) のためや xargs(1) (「ファイルに関してループしながらコマンドを反復実行」参照下さい) のためにファイルを選択するのに find(1) が使われます。これの操作は find(1) のコマンド引数を使うことで強化できます。

find(1) の基本シンタックスは次のようにまとめられます。

  • 条件の引数は左から右へと評価されます。

  • 結果が決まった時点で評価は終了します。

  • "論理 OR" (条件間に "-o" で指定) は、"論理 AND" (条件間に "-a" または何もなしで指定) より低い優先順位です。

  • "論理 NOT" (条件前に "!" で指定) は、"論理 AND" より高い優先順位です。

  • "-prune" は常に論理真 (TRUE) を返し、ディレクトリーの場合にはこの点以降のファイル探索を停止します。

  • "-name" はシェルのグロブ (「シェルグロブ」参照下さい) を使ってファイル名のベースにマッチし、さらに "*" and "?" 等のメタ文字で最初の "." ともマッチします。(新規の POSIX 機能)

  • "-regex" はデフォールトでは emacs スタイルの BRE (「正規表現」参照下さい) を用いてフルパスをマッチします。

  • "-size" はファイルサイズ ("+" が前に付いた値はより大きい、"-" が前に付いた値はより小さい) に基づいてファイルをマッチします。

  • "-newer" はその引数に指定されたファイルより新しいファイルとマッチします。

  • "-print0" は常に論理真 (TRUE) を返し、フルファイル名を (null 終端処理して) 標準出力へプリントします。

find(1) はしばしば慣用的なスタイルで使われます。

# find /path/to \
    -xdev -regextype posix-extended \
    -type f -regex ".*\.cpio|.*~" -prune -o \
    -type d -regex ".*/\.git" -prune -o \
    -type f -size +99M -prune -o \
    -type f -newer /path/to/timestamp -print0

これは次のアクションをすることを意味します。

  1. "/path/to" からはじまる全ファイルを探索

  2. 探索開始したファイルシステムに探索を全体的に制約し、デフォールトの代わりに ERE (「正規表現」参照下さい) を使用

  3. 正規表現 ".*\.cpio" か ".*~" にマッチするファイルを処理停止をすることで探索から除外

  4. 正規表現 ".*/\.git" にマッチするディレクトリーを処理停止をすることで探索から除外

  5. 9MiB(1048576バイトの単位) より大きいファイルを処理停止をすることで探索から除外

  6. 上記の探索条件に合致し "/path/to/timestamp" より新しいファイル名をプリントします

上記例中でファイルを検索から除外するときの "-prune -o" の慣用的な使い方に注目して下さい。

[注記] 注記

非 Debian のUnix 的システムでは、一部のオプションは find(1) によってサポートされていないかもしれません。そのような場合には、マッチング方法を調整したり "-print0" を"-print" で置き換えることを考慮します。これに関連するコマンドも調整する必要があるかもしれません。

重要なデーターアーカイブのためのコンピューターデーターストレージメディアを選ぶ時にはそれらの限界について注意を払うべきです。小さな個人的なバックアップのためには、著者としては名前が知られている会社の CD-R と DVD-R を使い、クールで日陰の乾燥した埃の無い環境に保存しています。(プロ用途ではテープアーカイブメディアに人気があるようです。)

[注記] 注記

耐火金庫は紙の文書のためのものです。ほとんどのコンピューターデーターストレージメディアは紙よりも耐熱性がありません。著者は通常複数の安全な場所に保管された複数のセキュアーな暗号化されたコピーに頼っています。

ネット上に散見するアーカイブメディアの楽観的なストレージ寿命 (ほとんどベンダー情報由来)。

  • 100+年: インクと中性紙

  • 100年: オプティカルストレージ (CD/DVD、CD/DVD-R)

  • 30年: 磁気ストレージ (テープ、フロッピー)

  • 20年: 相変化オプティカルストレージ (CD-RW)

これらは取扱いによる機械的故障等は考慮していません。

ネット上に散見するアーカイブメディアの楽観的な書込み回数 (ほとんどベンダー情報由来)。

  • 250,000+回: ハードディスク

  • 10,000+回: フラッシュメモリー

  • 1,000回: CD/DVD-RW

  • 1回: CD/DVD-R、紙

[注意] 注意

ここにあるストレージ寿命や書込み回数の数字はクリチカルなデーターストレージに関する決定に使うべきではありません。製造者によって提供される特定の製品情報を参照下さい。

[ヒント] ヒント

CD/DVD-R や紙は1回しか書けないので、本質的に重ね書きで間違ってデーターを消すことを防げます。これは、利点です!

[ヒント] ヒント

もし高速で頻繁な大量のデーターのバックアップをする必要がある場合、高速のネットワーク接続でつながっているリモートホスト上のハードディスクが唯一の現実的なオプションかもしれません。

[ヒント] ヒント

If you use re-writable media for your backups, use of filesystem such as btrfs or zfs which supports read-only snapshots may be a good idea.

リムーバブルストレージデバイスは次の何れも指します。

これらは次の何れかで接続できます。

GNOME や KDE のような最近のデスクトップ環境は、"/etc/fstab" エントリーにマッチが無いリムーバブルデバイスを自動的にマウントする事ができます。

  • udisks2 package provides a daemon and associated utilities to mount and unmount these devices.

  • D-bus は、自動的なプロセスを開始するイベントを作成します。

  • PolicyKit が必要な特権を提供します。

[ヒント] ヒント

自動的にマウントされたデバイスは、umount(8) によって利用される "uhelper=" マウントオプションが設定されているかもしれません。

[ヒント] ヒント

"/etc/fstab" にリムーバブルメディアデバイスの記載が無い時のみ、現代的なデスクトップ環境下での自動マウントは起こります。

Mount point under modern desktop environment is chosen as "/media/username/disk_label" which can be customized by the following.

  • FAT ファイルシステムでは、mlabel(1) を使います。

  • ISO9660 ファイルシステムでは、genisoimage(1) を"-V" オプションとともに使います。

  • ext2/ext3/ext4 ファイルシステムでは、tune2fs(1) を"-L" オプションとともに使います。

[ヒント] ヒント

符号化方式 (エンコーディング) の選択をマウントオプションとして与える必要があるかもしれません (「ファイル名の符号化方式」参照下さい)。

[ヒント] ヒント

ファイルシステムをアンマウンとする際に GUI メニューを使うと、動的に生成された "/dev/sdc" 等のデバイスノード削除するかもしれません。もしそのデバイスノードの削除したくない場合にはシェルのコマンドプロンプトから umount(8) コマンドを使いましょう。

リムーバブルストレージデバイスを使ってデーターを共有する際には、両方のシステムにサポートされた共通のファイルシステムでそれをフォーマットするべきです。ファイルシステム選択のリストを次に示します。

表10.3 典型的な使用シナリオに合わせたリムーバブルストレージデバイスのファイルシステムの選択肢のリスト

filesystem name typical usage scenario
FAT12 フロッピーディスク上のクロスプラットフォームのデーター共有 (<32MiB)
FAT16 小さなハードディスク類似のデバイス上のクロスプラットフォームのデーター共有 (<2GiB)
FAT32 大きなハードディスク類似のデバイス上のクロスプラットフォームのデーター共有 (<8TiB, MS Windows95 OSR2 以降でサポート有り)
exFAT cross platform sharing of data on the large hard disk like device (<512TiB, supported by WindowsXP, Mac OS X Snow Leopard 10.6.5, and Linux kernel since 5.4 release)
NTFS 大きなハードディスク類似のデバイス上のクロスプラットフォームのデーター共有 (MS Windows NT 以降でネイティブにサポート、Linux 上では FUSE 経由の NTFS-3G でサポート)
ISO9660 CD-R and DVD+/-R 上の静的データーのクロスプラットフォームの共有
UDF CD-R や DVD+/-R 上への増分データーの書込み (新規)
MINIX フロッピーディスク上へのスペース効率の良い unix ファイルデーターのストレージ
ext2 古い Linux システムとハードディスク類似デバイス上のデーターを共有
ext3 古い Linux システムとハードディスク類似デバイス上のデーターを共有
ext4 最新の Linux システムとハードディスク類似デバイス上のデーターを共有
btrfs sharing of data on the hard disk like device with current Linux systems with read-only snapshots

[ヒント] ヒント

デバイスレベルの暗号化を使ったクロスプラットフォームのデーター共有に関しては、「dm-crypt/LUKS を使ったリムーバブルディスクの暗号化」を参照下さい。

FAT ファイルシステムはほとんど全ての現代的なオペレーティングシステムでサポートされていて、ハードディスク類似のメディア経由でのデーター交換目的に非常に有用です。

クロスプラットフォームの FAT ファイルシステムを使ったデーター共有にリムーバブルハードディスク類似デバイスをフォーマットする時の安全な選択肢は次です。

  • fdisk(8) か cfdisk(8) か parted(8) (「ディスクパーティション設定」参照下さい) を使ってそれを単一のプライマリパーティションにパーティションしそれを次のようにマークします。

    • 2GB より小さなメディアには FAT16 となるように "6" とタイプします

    • 大きなメディアには FAT32 (LBA) となるように "c" とタイプします

  • 第1パーティションを mkfs.vfat(8) を使って次のようにフォーマットします。

    • FAT16 となるように "/dev/sda1" 等とそのデバイス名だけを使います

    • FAT32 となるように "-F 32 /dev/sda1" 等と明示的なオプション指定とそのデバイス名を使います

FAT とか ISO9660 ファイルシステムを使ってデーターを共有する際の安全への配慮を次に記します。

  • tar(1) や cpio(1) を使ってアーカイブファイルに最初にファイルをアーカイブすることで長いファイル名やシンボリックリンクやオリジナルの Unix ファイルパーミッションとオーナー情報を保持します。

  • split(1) コマンドを使ってアーカイブファイルを 2GiB 以下の塊に分割してファイルサイズの制約から保護します。

  • アーカイブファイルを暗号化してその内容を不正アクセスから保護します。

[注記] 注記

FAT ファイルシステムはその設計上最大ファイルサイズは (2^32 - 1) bytes = (4GiB - 1 byte) です。古い 32 ビット OS 上の一部アプリケーションは、最大ファイルサイズはさらに小さく (2^31 - 1) bytes = (2GiB - 1 byte) です。Debian は後者の問題に苦しむことはありません。

[注記] 注記

Microsoft 自身も 200MB を越すドライブやパーティションに FAT を使うことを勧めていません。マイクロソフトは、彼らの "Overview of FAT, HPFS, and NTFS File Systems" で非効率的なディスク領域の使用等の欠点をハイライトしています。もちろん私たちは Linux では通常 ext4 ファイルシステムを使うべきです。

[ヒント] ヒント

ファイルシステムとファイルシステムのアクセスに関しての詳細は、"Filesystems HOWTO" を参照下さい。

データーをネットワーク経由で他のシステムと共有するときには、共通のサービスを使うべきです。次に一部のヒントを記します。


このようなネットワーク経由でマウントされたファイルシステムやネットワーク経由のファイル転送法はデーター共有のために非常に便利ですが、インセキュアーかもしれませんこれらのネットワーク接続は次に記すようにしてセキュアーにされなければいけません。

  • SSL/TLS を使い暗号化

  • SSH 経由でそれをトンネル

  • VPN 経由でそれをトンネル

  • セキュアーファイアウォールの背後に限定

さらに「他のネットワークアプリケーションサーバー」「他のネットワークアプリケーションクライアント」を参照下さい。

コンピューターはいつか壊れるとか、人間によるエラーがシステムやデーターをへの損害を及ぼすことは皆知っています。バックアップと復元の操作は正しいシステム管理の必須構成要素です。考えうる全ての故障モードはいつかの日にやって来ます。

[ヒント] ヒント

バックアップのシステムは簡単にしておき、システムのバックアップは頻繁にします。バックアップデーターが存在することは、あなたのバックアップ方法が技術的に如何に良いかよりも重要です。

実際のバックアップと復元の方針を決める上で3つの要素があります。

  1. 何をバックアップし復元するかを知っていること

  2. バックアップと復元の方法を知っていること

    • セキュアーなデーターのストレージ: 上書きやシステム障害の防止

    • 頻繁なバックアップ: スケジュールされたバックアップ

    • 冗長なバックアップ: データーのミラーリング

    • フルプルーフなプロセス: 簡単な単一コマンドバックアップ

  3. 関わっているリスクと費用の評価

    • Risk of data when lost

      • Data should be at least on different disk partitions preferably on different disks and machines to withstand the filesystem corruption. Important data are best stored on a read-only filesystem. [4]

    • Risk of data when breached

      • Sensitive identity data such as "/etc/ssh/ssh_host_*_key", "~/.gnupg/*", "~/.ssh/*", "~/.local/share/keyrings/*", "/etc/passwd", "/etc/shadow", "popularity-contest.conf", "/etc/ppp/pap-secrets", and "/etc/exim4/passwd.client" should be backed up as encrypted. [5] (See 「データー暗号化ティップ」.)

      • Never hard code system login password nor decryption passphrase in any script even on any trusted system. (See 「Password keyring」.)

    • 故障モードとその確率

      • Hardware (especially HDD) will break

      • Filesystem may be corrupted and data in it may be lost

      • Remote storage system can't be trusted for security breaches

      • Weak password protection can be easily compromised

      • File permission system may be compromised

    • バックアップに必要なリソース: 人的、ハードウエアー、ソフトウエアー、…

      • Automatic scheduled backup with cron job or systemd timer job

[注記] 注記

/proc/sys/tmp/run 上にある擬似ファイルシステム (「procfs と sysfs」「tmpfs」 参照) の内容をバックアップしてはいけません。あなた自身が自分がしていることの意味を余程よく分かっていなければ、これらの内容は巨大で無用なデーターです。

[注記] 注記

データーをバックアップする際には MTA (「メール転送エージェント (MTA)」参照下さい) 等のアプリケーションデーモンを停止するのも一計です。

Debian システム上で利用可能でバックアップユーティリティーのスイートのなかで際立った選ばれたリストを記します。

表10.5 バックアップスイートのユーティリティーのリスト

パッケージ ポプコン サイズ 説明
dump V:1, I:5 351 ext2/ext3/ext4 ファイルシステム用の 4.4 BSD 由来の dump(8) と restore(8)
xfsdump V:0, I:8 848 GNU/Linux と IRIX 上の XFS ファイルシステム用の xfsdump(8) と xfsrestore(8) を使う dump と restore
backupninja V:3, I:4 367 軽量で拡張可のメタバックアップシステム
bacula-common V:10, I:12 2120 Bacula: ネットワークバックアップ、復元および検証 - 共通のサポートファイル
bacula-client I:3 183 Bacula: ネットワークバックアップ、復元および検証 - クライアントメタパッケージ
bacula-console V:0, I:4 104 Bacula: ネットワークバックアップ、復元および検証 - テキストコンソール
bacula-server I:1 183 Bacula: ネットワークバックアップ、復元および検証 - サーバーメタパッケージ
amanda-common V:0, I:2 9937 Amanda: Advanced Maryland Automatic Network Disk Archiver (ライブラリー)
amanda-client V:0, I:2 1085 Amanda: Advanced Maryland Automatic Network Disk Archiver (クライアント)
amanda-server V:0, I:0 1077 Amanda: Advanced Maryland Automatic Network Disk Archiver (サーバー)
backup-manager V:0, I:1 571 コマンドラインのバックアップツール
backup2l V:0, I:0 115 マウントできるメディアのための低メンテナンスのバックアップ/復旧ツール (ディスクベース)
backuppc V:2, I:2 3178 BackupPC は高性能でエンタープライズ級の、PC をバックアップするためのシステム (ディスクベース)
duplicity V:19, I:40 1859 (リモート) 増分バックアップ
flexbackup V:0, I:0 243 (リモート) 増分バックアップ
rdiff-backup V:5, I:12 1162 (リモート) 増分バックアップ
restic V:2, I:5 21593 (リモート) 増分バックアップ
slbackup V:0, I:0 151 (リモート) 増分バックアップ

バックアップツールにはそれぞれの特別な狙いがあります。

  • Mondo Rescue を使うと、通常のインストールプロセスを経ずにバックアップ CD/DVD 等から完全なシステムを迅速に復旧できます。

  • BaculaAmandaBackupPC は、ネットワーク越しの定期的バックアップに焦点のあるフル機能のバックアップスイートです。

  • Regular backups of user data can be realized by a simple script (「Personal backup」).

「アーカイブと圧縮ツール」「コピーと同期ツール」に記された基本的なツールを使うとカスタムスクリプト経由のシステムバックアップができます。そのようなスクリプトは次を使うと強化できます。

  • restic パッケージは差分(遠隔)バックアップを提供します。

  • rdiff-backup パッケージは (リモートの) 増分バックアップを可能にします。

  • dump パッケージは全ファイルシステムの効率的かつ増分のバックアップと復旧を補助します。

[ヒント] ヒント

dump パッケージに関して学ぶには、"/usr/share/doc/dump/" の中のファイルと "Is dump really deprecated?" を参照下さい。

For a personal Debian desktop system running testing suite, I only need to protect personal and critical data. I reinstall system once a year anyway. Thus I see no reason to backup the whole system or to install a full featured backup utility.

At the same time, it is very valuable to have frequent recent snapshots of personal data and system configuration, and occasional full backups of personal data.

I usually make these snapshots and backups with a simple shell script bss. This script is a short shell which uses standard utilities: btrfs subvolume snapshot, rsync. For data encryption, disk image is created by fallocate(1) and configured with cryptsetup(8).

[ヒント] ヒント

debconf の設定データーは "debconf-set-selections debconf-selections" で、dpkg の選択データーは "dpkg --set-selection <dpkg-selections.list" で復元できます。

データーのセキュリティーのインフラはデーターの暗号化のツールとメッセージダイジェストのツールと署名ツールの組み合わせで提供されます。


See 「データー暗号化ティップ」 on dm-crypt and fscrypt which implement automatic data encryption infrastructure via Linux kernel modules.

基本的なキー管理に関する GNU プライバシガードコマンドを次に記します。


トラストコードの意味を次に記します。


次のようにすると私のキー "1DD8D791" をポピュラーなキーサーバー "hkp://keys.gnupg.net" にアップロード出来ます。

$ gpg --keyserver hkp://keys.gnupg.net --send-keys 1DD8D791

"~/.gnupg/gpg.conf" (もしくは古い場所 "~/.gnupg/options") 中の良いデフォールトのキーサーバーの設定は次を含みます。

keyserver hkp://keys.gnupg.net

次によってキーサーバーから知らないキーが獲得できます。

$ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\
  cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys

OpenPGP 公開キーサーバー (バージョン0.9.6以前) に2つ以上サブキーのあるキーを壊すバグがありました。新しい gnupg (>1.2.1-2) パッケージはこのような壊れたサブキーを取り扱えます。gpg(1) の"--repair-pks-subkey-bug" オプションの説明を参照下さい。

md5sum(1) はrfc1321 の方法を使ってダイジェストファイルを作成し各ファイルをそれで確認するユーティリティーを提供します。

$ md5sum foo bar >baz.md5
$ cat baz.md5
d3b07384d113edec49eaa6238ad5ff00  foo
c157a79031e1c40f85931829bc5fc552  bar
$ md5sum -c baz.md5
foo: OK
bar: OK
[注記] 注記

MD5 和の計算は GNU プライバシーガード (GnuPG) による暗号学的署名の計算より CPU への負荷がかかりません。通常、一番上のレベルのダイジェストファイルだけがデーターの整合性のために暗号学的に署名されます。

ソースコードをマージする多くのツールがあります。次のコマンドが著者の目に止まりました。

表10.10 ソースコードマージツールのリスト

パッケージ ポプコン サイズ コマンド 説明
patch V:90, I:702 248 patch(1) 差分ファイルをオリジナルに適用
vim V:97, I:390 3570 vimdiff(1) vim で2つのファイルを並べて比較
imediff V:0, I:0 169 imediff(1) 対話型フルスクリーンの2方/3方マージツール
meld V:11, I:34 3500 meld(1) ファイルを比較やマージ (GTK)
wiggle V:0, I:0 174 wiggle(1) リジェクトされたパッチを適用
diffutils V:876, I:995 1597 diff(1) 1行ごとにファイルを比較
diffutils V:876, I:995 1597 diff3(1) 1行ごとにファイルを比較やマージ
quilt V:3, I:26 773 quilt(1) パッチのシリーズを管理
wdiff V:8, I:59 648 wdiff(1) テキストファイル間のワードの相違表示
diffstat V:12, I:127 74 diffstat(1) 差分ファイルによる変化のヒストグラム作成
patchutils V:14, I:125 232 combinediff(1) 2つの積み重ねパッチから1つの合計パッチを生成
patchutils V:14, I:125 232 dehtmldiff(1) HTML ページから差分ファイルを抽出
patchutils V:14, I:125 232 filterdiff(1) 差分ファイルから差分ファイルを抽出や削除
patchutils V:14, I:125 232 fixcvsdiff(1) CVS により作成された patch(1) が誤解する差分ファイルを修正
patchutils V:14, I:125 232 flipdiff(1) 古い2つのパッチを交換
patchutils V:14, I:125 232 grepdiff(1) 正規表現にマッチするパッチによって変更されるファイルを表示
patchutils V:14, I:125 232 interdiff(1) 2つのユニファイド差分ファイル間の違いを表示
patchutils V:14, I:125 232 lsdiff(1) どのファイルがパッチによって変更されるかを表示
patchutils V:14, I:125 232 recountdiff(1) ユニファイドコンテキスト差分ファイルのカウントやオフセットを再計算
patchutils V:14, I:125 232 rediff(1) 手編集された差分ファイルのカウントやオフセットを再計算
patchutils V:14, I:125 232 splitdiff(1) 増分パッチの分離
patchutils V:14, I:125 232 unwrapdiff(1) ワードラップされたパッチを復元
dirdiff V:0, I:2 167 dirdiff(1) ディレクトリーツリー間で相違点の表示と変更のマージ
docdiff V:0, I:0 553 docdiff(1) 2つのファイルをワード毎/文字毎に比較
makepatch V:0, I:0 100 makepatch(1) 拡張パッチファイルの生成
makepatch V:0, I:0 100 applypatch(1) 拡張パッチファイルの適用

Git is the tool of choice these days for the version control system (VCS) since Git can do everything for both local and remote source code management.

Debian は Debian Salsa サービス経由でフリーの Git サービスを提供します。その説明文書は https://wiki.debian.org/Salsa にあります。

Here are some Git related packages.


Git operation involves several data.

  • The working tree which holds user facing files and you make changes to them.

    • The changes to be recorded must be explicitly selected and staged to the index. This is git add and git rm commands.

  • The index which holds staged files.

    • Staged files will be committed to the local repository upon the subsequent request. This is git commit command.

  • The local repository which holds committed files.

    • Git records the linked history of the committed data and organizes them as branches in the repository.

    • The local repository can send data to the remote repository by git push command.

    • The local repository can receive data from the remote repository by git fetch and git pull commands.

      • The git pull command performs git merge or git rebase command after git fetch command.

      • Here, git merge combines two separate branches of history at the end to a point. (This is default of git pull without customization and may be good for upstream people who publish branch to many people.)

      • Here, git rebase creates one single branch of sequential history of the remote branch one followed by the local branch one. (This is pull.rebase true customization case and may be good for rest of us.)

  • The remote repository which holds committed files.

    • The communication to the remote repository uses secure communication protocols such as SSH or HTTPS.

The working tree is files outside of the .git/ directory. Files inside of the .git/ directory hold the index, the local repository data, and some git configuration text files.

Here is an overview of main Git commands.


Here are some Git tips.

表10.13 Git tips

Git command line 機能
gitk --all see complete Git history and operate on them such as resetting HEAD to another commit, cheery-picking patches, creating tags and branches ...
git stash get the clean working tree without loosing data
git remote -v check settings for remote
git branch -vv check settings for branch
git status show working tree status
git config -l list git settings
git reset --hard HEAD; git clean -x -d -f revert all working tree changes and clean them up completely
git rm --cached filename revert staged index changed by git add filename
git reflog get reference log (useful for recovering commits from the removed branch)
git branch new_branch_name HEAD@{6} create a new branch from reflog information
git remote add new_remote URL add a new_remote remote repository pointed by URL
git remote rename origin upstream rename the remote repository name from origin to upstream
git branch -u upstream/branch_name set the remote tracking to the remote repository upstream and its branch name branch_name.
git remote set-url origin https://foo/bar.git change URL of origin
git remote set-url --push upstream DISABLED disable push to upstream (Edit .git/config to re-enable)
git checkout -b topic_branch ; git push -u topic_branch origin make a new topic_branch and push it to origin
git branch -m oldname newname rename local branch name
git push -d origin branch_to_be_removed remove remote branch (new method)
git push origin :branch_to_be_removed remove remote branch (old method)
git checkout --orphan unconnected create a new unconnected branch
git fetch upstream foo:upstream-foo create a local (possibly orphan) upstream-foo branch as a copy of foo branch the upstream repository
git rebase -i origin/main reorder/drop/squish commits from origin/main to clean branch history
git reset HEAD^; git commit --amend squash last 2 commits into one
git checkout topic_branch ; git merge --squash topic_branch squash entire topic_branch into a commit
git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*' convert a shallow clone to the full clone of all branches
git ime split the last commit into a series of file-by-file smaller commits etc. (imediff package required)
git repack -a -d; git prune repack the local repository into single pack (this may limit chance of lost data recovery from erased branch etc.)

[警告] 警告

たとえ gitk(1) 等の一部ツールが受け付けるからといって、タグ文字列中にスペースを使ってはいけません。他の git コマンドで支障が起こるかもしれません。

[注意] 注意

If a local branch which has been pushed to remote repository is rebased or squashed, pushing this branch has risks and requires --force option. This is usually not an acceptable for main branch but may be acceptable for a topic branch before merging to main branch.

[注意] 注意

git サブコマンドを直接 "git-xyz" としてコマンドラインから起動するのは2006年初以来推奨されません。

[ヒント] ヒント

If there is a executable file git-foo in the path specified by $PATH, entering "git foo" without hyphen to the command line invokes this git-foo. This is a feature of the git command.

次を参照下さい。



[4] A write-once media such as CD/DVD-R can prevent overwrite accidents. (See 「バイナリーデーター」 for how to write to the storage media from the shell commandline. GNOME desktop GUI environment gives you easy access via menu: "Places→CD/DVD Creator".)

[5] Some of these data can not be regenerated by entering the same input string to the system.

[6] If you use "~/.vimrc" instead of "~/.vim/vimrc", please substitute accordingly.