「丸ごと退避しておきたい」「容量は小さく、復元は簡単に」──そんなときは 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-tar(gtarコマンド) - フルイメージが巨大:分割(
split)/増分(--listed-incremental)/rsyncスナップショットへの移行も検討 - 復元で上書き事故:まずは一時フォルダへ展開して確認、ルート直下展開は最後に
まとめ
- 手早く“丸ごと”退避するなら
tar.gzが簡単確実。 - 除外・属性保持・検証(gzip/ハッシュ)・復元テストが実運用の要。
- 容量や回数が増えたら、pigz や 分割、あるいは rsyncスナップショットと併用すると安定します。
このページのレシピをベースに、まずは「大事なフォルダ」から 今日のバックアップ を作っておきましょう。
