web-dev-qa-db-ja.com

スタンドアロンボリュームへのタール分割

100 GBを超えるデータを含むディレクトリがいくつかあります。私はそれらを小さなボリュームにアーカイブしようとしています。つまり、それぞれが10Gb 独立/スタンドアロンです。

問題は、tar + splitを使用すると、独立していない複数のtarパーツが生成されることです。最初にすべてをまとめて単一の大きなファイルに戻す/結合しない限り、パーツの1つからファイルを抽出することはできません。

また、tar -c -L1000M ...を使用してボリュームを分割しようとしましたが、それも機能せず、長いファイル名が切り捨てられるという問題があります。

starも試しましたが、その分割ボリュームも独立していないようです。一方、7ZipはUNIXの権限を保持しません。

独立した分割アーカイブが必要な理由は、安全のためです。分割ファイルの1つが破損した場合でも、他のアーカイブからデータを取得できます。また、すべてのアーカイブを1つの大きなボリュームに戻す必要なく、特定のファイル/フォルダーのみを抽出したい場合も、はるかに高速です。

これを達成するにはどうすればよいですか?ありがとうございました。


解決策が見つかりました

@Haxielの回答で示唆されているように、tarを使用した解決策を見つけました。答えは以下に掲載されています。

ボリュームの境界を越えて次のボリュームが利用できない場合、ファイルが1つまたは2つ失われる可能性がありますが、他のパーツが欠落している場合でも、少なくとも個別のボリュームを個別に抽出できます。

3
Mongrel Jedi

@Haxielの回答で示唆されているように、tarを使用した解決策を見つけました。使用するコマンドは次のとおりです。

tar -c -L1G -H posix -f /backup/somearchive.tar -F '/usr/bin/tar-volume.sh' somefolder

-L:アーカイブサイズの制限、つまり1Gbを定義します

-H:posix形式を使用する必要があります。そうでない場合、長いファイル名は切り捨てられます

-F:tarのシーケンシャルアーカイブファイル名を生成するには、ボリュームスクリプトが必要です

このコマンドは、somearchive.tar、somearchive.tar-2、somearchive.tar-3 ...の形式でマルチボリュームアーカイブを作成します。

以下は、この チュートリアル から変更されたmytar-volume.shです。

#!/bin/bash

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE
name=`expr $TAR_ARCHIVE : '\(.*\)\(-[0-9]*\)$'`

case $TAR_SUBCOMMAND in
-c)       ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || exit 1
          ;;
*)        exit 1
esac

echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

たとえば第3アーカイブボリュームの内容を一覧表示するには:

tar -tf /backup/somearchive.tar-3

特定のアーカイブボリュームを抽出するには:

tar -xf /backup/somearchive.tar-3

単一のボリュームを1つだけ抽出すると、アーカイブの最初または最後で別のボリュームに分割された不完全なファイルが存在する可能性があることに注意してください。 Tarは、不完全なファイルを含むGNUFileParts.xxxx/filenameというサブフォルダーを作成します。

Unixでボリュームのセット全体を抽出するには、ボリュームスクリプトを再度実行する必要があります。

tar -xf /backup/somearchive.tar -F '/usr/bin/tar-volume.sh'

Windowsでそれらを抽出している場合、bashシェルが必要なため、tarコマンドはボリュームスクリプトを適切に実行できません。最初に次のコマンドを実行して、コマンドラインでボリュームファイル名を手動で入力する必要があります。

tar -xf somearchive.tar -M

-Mは、これがマルチボリュームアーカイブであることを示します。 tarが最初のボリュームの抽出を完了すると、すべてのボリュームが抽出されるまで、次のボリュームの名前を入力するように求められます。

多くのボリュームがある場合は、最初にすべてのボリューム名シーケンスを入力し、最初のボリュームが抽出されたら、バッチ全体をコピーしてtarのコマンドラインプロンプトに貼り付けることができます。

n somearchive.tar-2
n somearchive.tar-3
n somearchive.tar-4

前のnに注意してください。これは、次のパラメーターが新しいボリュームファイル名であることを示すtarコマンドです。

ボリュームの境界を越えて次のボリュームが利用できない場合に失われる可能性のあるファイルがまだ1つか2つある可能性がありますが、他の部分が欠落している場合でも、少なくとも個別のボリュームを個別に抽出できます。

詳細については、 tarドキュメント を参照してください。 H

1
Mongrel Jedi

これは完璧な解決策ではありませんが、GNU tarのマルチボリュームアーカイブは、探しているものに近いようです。このオプションはあなたの質問ですでに言及されていますが、これが可能なオプションである理由を明確にする GNU tar manual からの参照を追加したいと思います。

マルチボリュームアーカイブは単一のtarアーカイブであり、固定サイズの複数のメディアボリュームに保存されます。このセクションでは「ボリューム」をテープと呼ぶことがよくありますが、マルチボリュームアーカイブをテープに保存する必要はまったくありません。代わりに、ユーザーが便利だと思うメディアタイプを使用でき、ファイルに配置することもできます。

マルチボリュームアーカイブを作成する場合、GNU tarはスペースがなくなるまで現在のボリュームを使い続け、その後、次のボリュームに切り替えます(通常、オペレーターはこの時点でテープを交換するように照会されます)、新しいボリュームの作業を続行します。この操作は、要求されたすべてのファイルがダンプされるまで続きます。 GNU tarがファイルのダンプ中にメディアの終わりを検出した場合、そのようなファイルは分割形式でアーカイブされます。一部の非常に大きなファイルは複数のボリュームに分割することもできます。

各ボリュームはそれ自体が有効なGNU tarアーカイブであるため、特別なオプションなしで読み取ることができます。したがって、1つのボリュームに完全に存在するファイルメンバーは、他のボリュームを必要とせずに抽出または操作できます。案の定、分割メンバーを抽出するには、そのパーツが存在するすべてのボリュームが必要になります。

マルチボリュームアーカイブにはいくつかの制限があります。特に、圧縮することはできません。

この定義では、問題となる唯一のファイルは、サイズの境界を越えて分割されるファイルです。 1つのボリューム内に完全に含まれているファイルは、他のボリュームから独立しているものとして扱うことができます。

ボリュームごとに、-vオプションを使用して分割ファイルを識別することができます。

$ tar -tf multi-test2.tar -v
M--------- 0/0          658432 1970-01-01 03:00 file1--Continued at byte 7341568--
-rw-r--r-- test/users 4000000 2019-03-06 12:12 file2

完全に含まれているファイルは、単一のアーカイブの場合と同じように抽出できます。 tarは分割ファイルが不完全であると不平を言っているようですが、問題なく完全なファイルを抽出することができます。

分割ファイルは、-Mオプションを使用して、複数のボリュームから単一のユニットとして抽出することもできます。これにより、次のボリュームの名前を入力するように求められます。使用法は文書化されています here 。代わりに、ボリュームを単一のアーカイブに連結する場合は、 tarcatユーティリティ も検討できます。

1
Haxiel