我知道有人问过关于权限的类似问题,但是哪种形式的压缩或归档保留每个文件和目录的权限和文件所有者?
我正在考虑tar.gz
格式,但是这样合适吗?
我需要将 37GB 的文件和目录移动到另一台服务器,并且需要在未压缩时一切都完全相同。
答案1
两种传统归档工具柏油和CPIO保留所有权和 Unix 权限(用户/组/其他)以及时间戳(使用 cpio,请务必-m
在提取时通过)。如果你不喜欢他们的晦涩的语法1,您可以使用他们的 POSIX 替代品帕克斯( pax -w -pe
) 所有这些都输出未压缩的存档;将存档通过管道传输到类似gzip
或 之类的工具中xz
以对其进行压缩(GNU tar 有进行压缩的选项)。用户和组通过其名称进行识别; GNU tar 有一个选项。
这些工具都没有保留现代功能,例如 ACL、功能、安全上下文或其他扩展属性。
某些版本的 tar 可以存储 ACL。看使用什么来备份文件、保留 ACL?使用 GNU tar,--acls
在创建和解压存档时传递两者。
一个squashfs文件系统,如由迈克塞夫建议,存储功能和扩展属性,包括 SELinux 上下文,但不包括 ACL。 (你需要不太古董的版本.) 如果您同时拥有 ACL 和安全上下文,则可以使用 squashfs 文件系统,并通过在原始文件系统的根目录运行来保存 ACL getfacl -R
,并在使用 . 解压文件后恢复它们setfacl --restore
。
如果您想保存所有内容,包括 ACL、亚秒时间戳、扩展属性和文件系统特定属性,您可以克隆文件系统。这种方法的缺点是您无法方便地直接编写压缩副本。克隆文件系统的最终方法是复制块设备;当然,这是浪费的,因为它复制了空白空间。或者,创建一个足够大的文件系统来存储所有文件,并使用GNU coreutils 中的cp -a
命令cp
来复制文件; GNU cp 非常擅长复制所有内容,包括非传统功能,例如扩展属性和 ACL。
1虽然这个确实有点夸张了。
答案2
如果您正在谈论 Linux 系统,那么您的另一个选择是南瓜文件系统。它通常可以实现非常高的压缩比 - 并且压缩过程本身是多线程的 - 这意味着您可以将所有处理器核心应用于压缩任务。
squashfs 存档与大多数其他类型的不同之处在于它是一个文件系统。如果您曾经启动过 Linux Live 光盘,那么您很可能已经看到了这一点 - 几乎所有这些工作都是通过安装一个 squashfs 存档作为其根文件系统来实现的。从版本 2.6.34 开始,squashfs 在 vanilla Linux 内核中得到支持。因此它对于任何现代 Linux 系统都是相当通用的。
Squash 支持任何 gzip、lzma、lzo、xz 或(从内核 3.19 开始)lz4 压缩方法。要安装和访问壁球存档的内容,您根本不需要任何工具,只需执行以下操作即可:
mount ./img.sfs /mnt; cd /mnt
...去了解它。然后,内核的本机将为您提供存档的内容虚拟文件系统作为只读安装,您可以像读取任何其他类型的文件一样读取其中的所有文件 - 并且无需解压缩存档(由 Linux 内核本身根据需要即时处理到磁盘缓存中)。事实上,借助最新内核的 lz4 支持,您可以在原生速度 (在某些情况下甚至可能更快)同样 - 尽管压缩文件访问的 CPU 使用率会增加。
要创建或解压缩squashfs存档,您需要安装squashfs-tools包。我所知道的任何发行版通常都不会默认安装它,但我也不知道有任何发行版不通过包管理器提供包。安装后,您可以创建一个存档,例如:
echo 'this is my new file' >~/Downloads/newfile.txt
mksquashfs ~/Downloads ./mysqsh.sfs -comp xz
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
正如您所看到的 - 它显然尊重文件权限 - 甚至保留和尊重扩展文件系统文件属性(xattrs)在多数情况下。你看到的压缩比是此外我的常规文件系统的默认 lzo 压缩 -(我的根文件系统是 btrfs,所有文件都已用 lzo 压缩)- 更不用说那么多了~/Downloads
首先被下载的压缩档案占用。
它本身就可以立即作为适当的文件系统安装:
sudo mount ./mysqsh.sfs /mnt; \
cd /mnt; cat newfile.txt; cd -; \
sudo umount /mnt
this is my new file
与往常一样,任意挂载通常都需要 root 权限,但/etc/fstab
如果您愿意,可以像任何其他挂载一样命名 squashfs 挂载。
最后,您不需要任何提升的权限来解压缩 squashfs 存档,只需要unsquashfs
工具(squashfs-tools 包中也提供了):
unsquashfs -d /tmp/mysqsh ./mysqsh.sfs; \
cd /tmp/mysqsh; cat newfile.txt
Parallel unsquashfs: Using 6 processors
933 inodes (1025 blocks) to write
[=================================================|] 1025/1025 100%
created 927 files
created 132 directories
created 6 symlinks
created 0 devices
created 0 fifos
this is my new file