まず使うコマンド:作成・中身の確認・解凍
project/というフォルダーを、同じ場所にあるbackup.tar.zstへ圧縮する例です。作成・一覧表示・解凍のいずれも、対応するGNU tarとzstdコマンドが必要です。
# 作成:project/は実在するフォルダー名に置き換える
tar --zstd -cf backup.tar.zst project/
# 収録ファイルの一覧を表示(展開はしない)
tar --zstd -tf backup.tar.zst
# 圧縮データの整合性を検査
zstd -t backup.tar.zst
# 新しいフォルダーへ展開
mkdir restore-check
tar --zstd -xf backup.tar.zst -C restore-check/
-cは作成、-tは一覧、-xは展開です。-fの直後にはアーカイブ名、-Cの直後には移動先のディレクトリを指定します。出力先のbackup.tar.zstは既存ファイルと重ならない名前にしてください。tarで作成すると同名のファイルは上書きされます。
tar.zstとzstの違い
tarは複数のファイルやフォルダーを一つのアーカイブにまとめます。zstdはそのデータを圧縮します。両方を組み合わせた形式が.tar.zstです。
| 拡張子 | 内容 | 展開時の考え方 |
|---|---|---|
.tar | tarアーカイブ | tarで収録ファイルを取り出す |
.zst | zstdで圧縮したデータ | zstdで元のデータへ戻す |
.tar.zst | tarアーカイブをzstdで圧縮したもの | zstdで展開し、tarでファイルを取り出す。対応するtarなら一つのコマンドで実行できる |
単にzstd -d backup.tar.zstを実行すると、通常はbackup.tarができます。その段階ではフォルダーの取り出しは終わっていません。一方、ログを直接圧縮したapplication.log.zstなどは、tarを使わずzstdだけで展開します。拡張子を変更してもデータ形式は変わりません。
GNU tarとzstdを確認する
tar --version
zstd --version
tar --help | grep -F -- --zstd
この記事の基本操作はGNU tar 1.35・zstd 1.5.7で確認しています。macOS標準のtarやBusyBoxのtarなどは実装が異なるため、同じオプションが使えるとは限りません。--zstdが使えない場合は、後述のパイプで組み合わせる方法を検討してください。
zstdが未導入の場合は、使用しているディストリビューションのパッケージを導入します。以下は環境に合う方だけを実行する例です。
# Debian・Ubuntu系
sudo apt install zstd
# Fedora系など、dnfを使う環境
sudo dnf install zstd
フォルダーをtar.zstに圧縮する
基本はtar --zstd -cf
tar --zstd -cf backup.tar.zst project/
この例のアーカイブ内のパスはproject/から始まります。展開先ではその下にproject/が復元されます。元のフォルダーは残ります。アーカイブ自体を入力に含めないよう、出力先は圧縮対象のフォルダーの外に置きます。
絶対パスを直接指定せず、-Cで親ディレクトリへ移動してから対象を選ぶ方法もあります。次の例では/srv/project/をまとめつつ、収録パスをproject/から始めます。/srv/project/は実際の配置に置き換えてください。
tar --zstd -cf backup.tar.zst -C /srv project/
圧縮レベルとスレッド数を指定する
tar -I 'zstd -T2 -3' -cf backup-level3.tar.zst project/
GNU tarの-Iは外部の圧縮プログラムを指定します。-T2は圧縮用のワーカースレッドを2本、-3は圧縮レベル3の指定です。-T0では利用するコア数を自動判定しますが、CPUとメモリの使用量が増えるため、開発作業と併用するときは本数を絞って試します。
圧縮レベルを上げても、データによってはサイズがほとんど変わりません。まず標準設定で確認し、必要な場合に時間とサイズを比較してください。
解凍前に中身と整合性を確認する
# 収録されているパスを確認
tar --zstd -tf backup.tar.zst
# 権限・サイズなども表示
tar --zstd -tvf backup.tar.zst
# zstd圧縮データの整合性を検査
zstd -t backup.tar.zst
tarの-tはアーカイブの一覧表示、zstdの-tは圧縮データの検査です。目的が異なります。zstd -tが成功しても、必要なファイルをすべて収録できたことや、アプリケーションを復元できることまでは保証しません。
バックアップに使う場合は、新しいフォルダーへ試験復元し、必要なファイルを開けることまで確認してください。稼働中のデータベースなどは、tarでまとめるだけでは整合性のあるバックアップにならない場合があります。
指定したフォルダーへ解凍する
mkdir restore-check
tar --zstd -xf backup.tar.zst -C restore-check/
-Cで指定する展開先は、先に作成しておきます。mkdirで「File exists」と表示されたら、その場所をそのまま使わず、新しい空のフォルダー名を選んでください。同じパスのファイルがある場所へ展開すると、上書きする可能性があります。
GNU tarは通常、ファイルから読み込む場合に圧縮形式を自動認識するため、次のようにも展開できます。この記事ではzstdを使うことを明示するため、基本例に--zstdを付けています。
tar -xf backup.tar.zst -C restore-check/
必要なファイルだけを取り出す
一覧にproject/README.mdがある場合の例です。指定するのは元の環境の絶対パスではなく、tar --zstd -tfで表示されたアーカイブ内のパスです。
mkdir restore-selected
tar --zstd -xf backup.tar.zst -C restore-selected/ project/README.md
tarが--zstdに対応しない場合
tarとzstdをパイプで接続すると、tar側の--zstdを使わずに操作できます。以下はBashの例です。pipefailを有効にすると、パイプの途中で失敗した場合も終了ステータスに反映できます。
set -o pipefail
# 作成:標準出力のtarデータをzstdへ渡す
tar -cf - project/ | zstd -T2 -3 -o backup-pipe.tar.zst
# 中身の一覧
zstd -dc backup-pipe.tar.zst | tar -tf -
# 新しい空のフォルダーへ展開
mkdir restore-pipe
zstd -dc backup-pipe.tar.zst | tar -xf - -C restore-pipe/
zstd -dcは展開したデータを標準出力へ送り、tarの-f -は標準入力から読み込みます。途中に大きな.tarファイルを作る必要がありません。シェルやtarの実装による違いは、利用環境のマニュアルで確認してください。
よくあるエラーと確認箇所
| エラーの例 | 確認すること | 対処 |
|---|---|---|
zstd: Cannot exec: No such file or directory/zstd: command not found | zstdが未導入、またはPATHにない | command -v zstdで確認し、必要ならパッケージを導入する |
unrecognized option '--zstd' | tarの実装・対応オプション | tar --versionとヘルプを確認し、対応版かパイプ方式を使う |
Cannot open: No such file or directory | 入力ファイル、圧縮対象、展開先のパス | pwdとlsで配置を確認。展開先は先に作成する |
Not found in archive | 部分展開で指定したパス | 一覧表示で確認し、収録されている名前を指定する |
unsupported format/Unexpected end of file | 別形式、ダウンロードの中断、破損など | file backup.tar.zstとzstd -t backup.tar.zstで確認し、配布元のチェックサムと照合・再取得する |
No space left on device | 展開先の空き容量とinode | df -h restore-check/とdf -i restore-check/で確認する |
エラーの表現はバージョンや言語設定で変わります。失敗した作成物や途中まで展開されたファイルを、正常なバックアップとして扱わないでください。原因を確認してから、新しい出力名・展開先でやり直します。
容量不足の調査は、df・du・lsblkでLinuxのディスク容量を確認する方法で説明しています。
xzとzstdのサイズや処理時間の違いは、圧縮率・速度・メモリ使用量の実測比較も参考にしてください。
参考資料
- GNU tar公式マニュアル:作成、一覧、展開、圧縮プログラムの指定
- zstd 1.5.7公式コマンドマニュアル:整合性検査、圧縮レベル、スレッド数、標準入出力