コメント

コメント

それぞれが50 GBの2つのファイルAとBと無視できるサイズの約100ファイルがあるとします。ディスク容量は120 GBしかありません(そのうち100 GBはファイルAとBが占めます)。ファイルAとB、そして100の異なるファイルを含むtarアーカイブを作成したいと思います。残りのディスク容量が20GB未満の場合でも可能ですか?

tarアーカイブは、長期クラウドストレージソリューション(Amazon S3 Glacier Deep Archive、Google Cloud Archive Storageなど)にアップロードされます。

答え1

tarアーカイブは、長期クラウドストレージソリューション(Amazon S3 Glacier Deep Archive、Google Cloud Archive Storageなど)にアップロードされます。

ああ!だからディスクにtarアーカイブは必要ありません!

代わりに、Amazon S3または他の場所にアップロード中にすぐにtarアーカイブを作成できます。さらに、あなたは本物容量に応じて費用を支払うので、圧縮したいです。

解決策は非常に簡単でなければなりません。

tar c fileA fileB | aws s3 cp s3://mybucket/backup.tar -
    : :     :     :           :                        :
    : :     :     :           :                        \- read data from stdin
    : :     :     :           \- How to call the object
    : :     :     \- unix pipe: the stdout of the
    : :     :        tar command becoms the stdin
    : :     :        of the aws command.
    : \-----\- files to be compressed
    \--compression command

個人的に特に非常に小さなファイルが数千個あるとすると、tarフォーマットによるオーバーヘッドが非常に大きくなります。使用することをお勧めします

tar c --zstd file1 file2 … file1000 | aws s3 cp s3://mybucket/backup.tar.zst -

すぐにデータを圧縮します。クラウドホストへのアップロード時間と有料スペースを節約し、通常はここで行うことが正しいことです。

答え2

コメント

この解決策は、後で質問者が2つの大きなファイルに関するものではなく、実際にtarアーカイブをローカルに保存することに関するものでもないと指摘したため、不適切です。しかし、まだ問題の元のタイトルが解決されるのを見て後世に任せると思いました。

回答

したがって、問題は次のとおりです。ファイルの読み取りが完了するまでファイルが使用するスペースを「解放」できないため、デフォルトではtarファイルをアーカイブに保存する標準的な方法は機能しません。

  • 最初のファイルの属性(名前、長さ、所有者など)を読みます。
  • この情報を含むヘッダーを.tarファイルのゼロ位置に書き込みます。ヘッダーの長さは512バイトです。
  • ヘッダーの後の最初のファイルの内容をコピーし、512バイトの次の倍数でゼロで埋められます(ゼロで埋められます)。
  • 2番目のファイルの属性を読む
  • 最初のファイルの最後に2番目のファイルのヘッダーを書き込みます。
  • 512 Bの次の倍数に合わせて配置された2番目のファイルの内容をコピーします。
  • 最後に、これら2つのファイルを削除してください。

ご覧のとおり、tarアーカイブは非常に簡単に接続できます。残念ながら、あるファイルの内容をtarアーカイブにコピーし、そのファイルを削除して次のファイルをアーカイブすることもできません。最初のファイルの書き込みが完了する前にスペースが不足しているためです(そしてPOSIXはありません)。その文書を切り取る方法)スタートすでに読んだ文書の一部)。したがって、上記のCamilleのコメントへのアプローチは機能しません。

したがって、ファイルシステムが再リンクをサポートしていない限り部分ファイルでは不可能です。 (2021年6月現在、この機能をサポートするLinuxファイルシステムはXFSとbtrfsのみです。ただし、ソフトウェアを直接作成する必要があります。確認する必要があります。使用されているman ioctl_ficlonerangeメモリファイルを共有できます。 )


しかし、100GBのtarファイルを持つこと自体は役に立たないように聞こえます。それで何をするのですか?他のデバイスまたはネットワーク経由でコピーできます。いいえあなたが直接運転する必要があります!

まず、ハードドライブにtarアーカイブを構築してからコピーするのではなく、すぐにtarアーカイブを作成します。tar結果をファイル、ブロックデバイスに書き込むかどうかは関係ありません(tar時間アルゴンとにかくスパイス! )またはネットワークソケット。

だから自分がやりたいことが不可能になれば苦しいかもしれませんが、おそらく問題ではないことを解決していると思います。

¹ファイルがすべて同じXFSまたはbtrfsファイルシステムにあり、anioctlが何であるかを知り、コードを書く意志がない場合

関連情報