保留权限和文件所有者的压缩/存档?

E.D*_*D.A 7 permissions archive compression

我知道有人问过关于权限的类似问题,但是哪种形式的压缩或存档保留了每个文件和目录的权限和文件所有者?

我正在考虑tar.gz格式,但这对吗?

我需要将 37GB 的文件和目录移动到另一台服务器,并且在解压缩时需要所有内容完全相同。

mik*_*erv 6

如果您在谈论 linux 系统,那么您的另一个选择是squashfs。它通常可以实现非常高的压缩率——而且压缩过程本身是多线程的——这意味着您可以将所有处理器内核应用于压缩任务。

squashfs 存档与大多数其他类型的不同之处在于它是一个文件系统。如果您曾经启动过 linux live 光盘,那么您很可能已经看到了这一点 - 几乎所有这些工作都是通过将 squashfs 存档安装为它们的根文件系统来工作的。自 2.6.34 版以来,vanilla linux 内核支持 squashfs。所以它对任何现代 linux 系统都是相当普遍的。

Squash 支持任何 gzip、lzma、lzo、xz 或(自内核 3.19 起) lz4 压缩方法。要挂载和访问壁球档案的内容,您根本不需要任何工具,只需执行以下操作:

mount ./img.sfs /mnt; cd /mnt
Run Code Online (Sandbox Code Playgroud)

......得到它。然后,内核的本机vfs将为您提供存档的内容作为只读挂载,您可以像读取任何其他类型的文件一样读取其中的所有文件,而无需解压缩存档(由 linux 内核本身根据需要动态处理到磁盘缓存中)。事实上,借助最新内核的 lz4 支持,您可能也可以以本机速度 (在某些情况下甚至可能更快)执行此操作- 尽管压缩文件访问的 CPU 使用率会增加。

要创建或解压缩 squashfs 档案,您需要安装 squashfs-tools 包。我知道的任何发行版通常不会默认安装它,但我也不知道任何不通过包管理器提供包的发行版。安装后,您可以创建一个存档,如:

mount ./img.sfs /mnt; cd /mnt
Run Code Online (Sandbox Code Playgroud)
echo 'this is my new file' >~/Downloads/newfile.txt
mksquashfs ~/Downloads ./mysqsh.sfs -comp xz
Run Code Online (Sandbox Code Playgroud)

正如您所看到的 - 它显然尊重文件权限 -在大多数情况下甚至保留和尊重扩展文件系统文件属性(xattrs)。你看到的压缩率是除了我的常规文件系统的默认 lzo 压缩之外的 - (我的根 fs 是 btrfs 并且所有文件都已经用 lzo 压缩了) - 更不用说大部分~/Downloads被下载了首先压缩档案。

它本身就可以作为适当的文件系统立即安装:

Parallel mksquashfs: Using 6 processors
Creating 4.0 filesystem on ./mysqsh.sfs, block size 131072.
[===================================================-] 1018/1018 100%

Exportable Squashfs 4.0 filesystem, xz compressed, data block size 131072
    compressed data, compressed metadata, compressed fragments, compressed xattrs
    duplicates are removed
Filesystem size 12592.01 Kbytes (12.30 Mbytes)
    57.19% of uncompressed filesystem size (22019.04 Kbytes)
Inode table size 8482 bytes (8.28 Kbytes)
    23.91% of uncompressed inode table size (35477 bytes)
Directory table size 10210 bytes (9.97 Kbytes)
    42.90% of uncompressed directory table size (23802 bytes)
Xattr table size 3976 bytes (3.88 Kbytes)
    48.67% of uncompressed xattr table size (8170 bytes)
Number of duplicate files found 61
Number of inodes 1064
Number of files 926
Number of fragments 68
Number of symbolic links  6
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 132
Number of ids (unique uids + gids) 1
Number of uids 1
    mikeserv (1000)
Number of gids 1
    mikeserv (1000)
mksquashfs ... 7.08s user 0.35s system 462% cpu 1.607 total
Run Code Online (Sandbox Code Playgroud)
 sudo mount ./mysqsh.sfs /mnt;   \
 cd /mnt; cat newfile.txt; cd -; \
 sudo umount /mnt
Run Code Online (Sandbox Code Playgroud)

与往常一样,任意挂载通常都需要 root 权限,但是/etc/fstab如果您愿意,可以像任何其他挂载一样命名 squashfs 挂载。

最后,你不需要任何提升的权限来解压一个 squashfs 档案,只需要这个unsquashfs工具(它也在 squashfs-tools 包中提供)

this is my new file
Run Code Online (Sandbox Code Playgroud)
unsquashfs -d /tmp/mysqsh ./mysqsh.sfs; \
cd /tmp/mysqsh; cat newfile.txt
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 5

传统归档工具tarcpio 都保留所有权和 Unix 权限(用户/组/其他)以及时间戳(使用 cpio,-m解压时一定要通过)。如果你不喜欢他们神秘的语法¹,你可以使用他们的 POSIX 替换pax ( pax -w -pe) 所有这些输出一个未压缩的存档;将存档通过管道传输到类似工具中gzip或对其xz进行压缩(GNU tar 可以选择进行压缩)。用户和组由其名称标识;GNU tar 有一个选项。

这些工具都没有保留现代功能,例如 ACL、功能、安全上下文或其他扩展属性。

某些版本的 tar 可以存储 ACL。请参阅使用什么来备份文件,保留 ACL?使用 GNU tar,--acls在创建和提取存档时都通过。

正如mikeserv建议的,squashfs 文件系统存储功能和扩展属性,包括 SELinux 上下文,但不存储 ACL。(您需要不太老的版本。)如果您同时具有 ACL 和安全上下文,则可以使用 squashfs 文件系统,并通过getfacl -R在原始文件系统的根目录下运行来保存 ACL,并在使用setfacl --restore.

如果您想绝对保存所有内容,包括 ACL、亚秒级时间戳、扩展属性和特定于文件系统的属性,您可以克隆文件系统。这种方法的缺点是您不能方便地直接编写压缩副本。克隆文件系统的最终方法是复制块设备;当然,这是浪费,因为它复制了空白空间。或者,创建一个足够大的文件系统来存储所有文件,并使用来自 GNU coreutilscp -acp命令来复制文件;GNU cp 非常擅长复制所有内容,包括非传统功能,例如扩展属性和 ACL。

¹虽然这个真的被夸大了。