tar.gzで丸ごと保存|バックアップ圧縮の実用レシピと注意点

バックアップ・復元

「丸ごと退避しておきたい」「容量は小さく、復元は簡単に」──そんなときは tar.gz が鉄板。ここでは コピペで使える基本レシピ と、事故を避ける 必須の注意点 をまとめます(Linux中心/macOSは末尾メモ)。

最短レシピ(コピペ可)

指定フォルダを日付付きで圧縮保存

STAMP=$(date +%F)                         # 例: 2025-08-23
SRC="/home"                               # 退避したいディレクトリ
DEST="/backup/${STAMP}-home.tar.gz"       # 保存先(要:書込権限)

sudo mkdir -p "$(dirname "$DEST")"
sudo tar -czpf "$DEST" \
  --xattrs --acls --numeric-owner \
  "$SRC"
  • -c作成 -zgzip圧縮 -p権限保持 -f出力先
  • --xattrs --acls で拡張属性/ACLも極力保持(対応FS前提)
  • --numeric-owner はユーザー名差異がある環境間でも整合的

中身だけを詰めたい場合は -C を使う:

sudo tar -czpf "$DEST" --xattrs --acls --numeric-owner -C / home

よく使うパターン

1) 除外パターンでサイズ削減

/etc/tar/exclude.txt を用意(例):

*.iso
*.tmp
cache/
node_modules/
.DS_Store
lost+found

適用:

sudo tar -czpf "$DEST" --exclude-from=/etc/tar/exclude.txt \
  --xattrs --acls --numeric-owner "$SRC"

2) ルート配下をアーカイブ(システム退避)

他のマウントを跨がないように:

sudo tar -czpf "/backup/$STAMP-root.tar.gz" \
  --one-file-system \
  --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run \
  --xattrs --acls --numeric-owner \
  /

3) 進捗を眺めたい(pv or checkpoint)

# pv が入っていれば
sudo tar -cpf - --xattrs --acls --numeric-owner "$SRC" | pv | gzip > "$DEST"

# tarのcheckpointを使う(GNU tar)
sudo tar -czpf "$DEST" --xattrs --acls --numeric-owner \
  --checkpoint=1000 --checkpoint-action=echo="...packed 1000 files" \
  "$SRC"

4) 高速並列圧縮(pigz)

# pigz インストール後
sudo tar -I 'pigz -9' -cpf "$DEST" \
  --xattrs --acls --numeric-owner "$SRC"
# -I/--use-compress-program で gzip 互換の並列圧縮に置き換え

5) 分割して保存(外付けに移す前など)

sudo tar -czpf - --xattrs --acls --numeric-owner "$SRC" \
  | split -b 4G - "/backup/${STAMP}-home.tar.gz.part-"
# 復元時: cat ... | tar -xzpf -

6) そのままリモートへ(ローカルに置かない)

sudo tar -czpf - --xattrs --acls --numeric-owner "$SRC" \
  | ssh user@backup.example.com "cat > /srv/backup/${STAMP}-home.tar.gz"

増分/差分っぽく運用する(tarのスナップショット)

rsyncほどうまくはないですが、tarにも増分があります。

SNAP="/var/backups/home.snar"

# 初回フル
sudo tar -czpf "/backup/$STAMP-home-full.tar.gz" \
  --listed-incremental="$SNAP" \
  --xattrs --acls --numeric-owner "$SRC"

# 2回目以降は増分
sudo tar -czpf "/backup/$STAMP-home-inc.tar.gz" \
  --listed-incremental="$SNAP" \
  --xattrs --acls --numeric-owner "$SRC"

復元は「フル → 時系列順に増分」適用が必要。手軽さは rsync の --link-dest に軍配。

検証と復元(超重要)

1) アーカイブの一覧・整合チェック

# 目次確認
tar -tzf "$DEST" | head

# gzip整合性
gzip -t "$DEST" && echo "gzip OK"

# アーカイブと現状の比較(差分確認)
sudo tar -d -zpf "$DEST"

2) ハッシュで改ざん/破損検出

sha256sum "$DEST" > "$DEST.sha256"
sha256sum -c "$DEST.sha256"  # 後日検証

3) 復元(安全に一部/全体)

# 安全のため一時ディレクトリへ展開してから戻す
mkdir -p /tmp/restore
sudo tar -xzpf "$DEST" -C /tmp/restore

# 特定ファイルだけ
sudo tar -xzpf "$DEST" -C /tmp/restore etc/nginx/nginx.conf

# ルート直下へ戻す場合(破壊的なので要注意)
# sudo tar -xzpf "$DEST" -C / --same-owner --numeric-owner --xattrs --acls

復元テストは定期的に。バックアップは「戻せて初めて成功」です。

定期実行(cron)とローテーション

# /usr/local/sbin/backup_home_tar.sh
#!/usr/bin/env bash
set -euo pipefail
STAMP=$(date +%F)
SRC="/home"
DEST="/backup/${STAMP}-home.tar.gz"
EXC="/etc/tar/exclude.txt"
LOG="/var/log/backup_home_tar.log"

flock -n /tmp/backup_home.lock -c "
  tar -czpf \"$DEST\" --xattrs --acls --numeric-owner \
    --exclude-from=\"$EXC\" \"$SRC\" >>\"$LOG\" 2>&1
  sha256sum \"$DEST\" >>\"$DEST.sha256\"
"
# crontab -e (毎日 02:10)
MAILTO=""
10 2 * * * bash /usr/local/sbin/backup_home_tar.sh

# 30日より古いものを削除(まずはechoでドライラン)
find /backup -name '*-home.tar.gz' -mtime +30 -exec echo rm -f {} +

よくある落とし穴(回避策)

  • 容量がパンパン:除外を見直す/pigzで高速化しつつ保存先を外付けやNASへ
  • 属性が復元されない--xattrs --acls --numeric-owner を付与、保存先FSの対応も確認
  • macOSでオプション差異:BSD tar(bsdtar)とGNU tarで挙動やオプションが異なる。必要なら brew install gnu-targtarコマンド)
  • フルイメージが巨大:分割(split)/増分(--listed-incremental)/rsyncスナップショットへの移行も検討
  • 復元で上書き事故:まずは一時フォルダへ展開して確認、ルート直下展開は最後に

まとめ

  • 手早く“丸ごと”退避するなら tar.gz が簡単確実。
  • 除外・属性保持・検証(gzip/ハッシュ)・復元テストが実運用の要。
  • 容量や回数が増えたら、pigz分割、あるいは rsyncスナップショットと併用すると安定します。

このページのレシピをベースに、まずは「大事なフォルダ」から 今日のバックアップ を作っておきましょう。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする