いくつかの文脈では、rootではなくユーザーとしてパッケージのビルドをサポートするパッケージマネージャに似たユーティリティを開発しています。アーカイブを使用tar
してメタデータを無視する代わりに、ルートとしてビルドされたパッケージがルート以外のパッケージと完全に区別されないようにしたいと思います。
tar
アーカイブ内のファイルとディレクトリに、許可ビット、タイムスタンプ、所有権関連情報などのメタデータが含まれていない(理想的には含まれない)形式/ユーティリティはありますか?私はアーカイブがその中にあるディレクトリとファイル、そしてファイルの内容で完全に説明したいと思います(したがってシンボリックリンクやハードリンクも保存できません)。
また、絶対パスと相対パスを区別しないアーカイブ形式も問題ありません(つまり、アーカイブパスの概念がUnixパスと異なるため、同じものにマップされ/a/b
ます)。a/b
答え1
tar(またはcpio)を使用するときにユーザー情報を削除する方法はありませんが、パッケージを作成した人が誰であるかを区別しないように強制することはできます。パッケージを作成したユーザーを区別しないようにtarを使用し、いくつかのパラメータを強制します(参考文献を参照man tar
)。
-P
、--absolute-names
:tarが先行する「/」を削除しないように強制します(デフォルトではこれを行います)。コマンドラインに絶対パスを入力できない場合は、上記のパスが保持されます(必要なルートディレクトリでcdできない場合は、-Cまたは--change-directoryを使用してみてください)。--owner
:ファイル/ディレクトリの実際の所有者を無視し、ユーザーをtarファイルに強制的に保存します(例:--owner = root)。--group
:グループをtarファイルに強制的に保存します(例:--group = root)。--no-acls
:tarファイルに独自のACLが重複しないようにしてください。--numeric-owner
、--numeric-group
:UID / GIDのみローカルに保存されているアカウントの実際の名前をマスクします(ルートは常に0なので、ルートを強制する場合は必要ありません)。--mtime
:実際に変更されたときにすべてのファイル/ディレクトリの修正時間を強制的にマスクします。
絶対パスを持つシンボリックリンクはそのまま保存されます。ただし、パッケージツリー内を指すときは常に相対シンボリックリンクを使用するのが最善です。
答え2
私が見つけた最高は次のとおりです。
- ファイルリストの並べ替え
- 所有者とグループを表すには、数値 0 を使用します。
- 所有者のための削除とビット
r
、w
みんな他人の権限 mtime
UNIXエポックでは修正される予定です。
find <files> -print0 \
| sort -z \
| tar -cf <output>.tar \
--format=posix \
--numeric-owner \
--owner=0 \
--group=0 \
--mode="go-rwx,u-rw" \
--mtime='1970-01-01' \
--no-recursion \
--null \
--files-from -
私はこれについてもっと書いた:http://h2.jaguarpaw.co.uk/posts/reproducible-tar/