保留權限和文件所有者的壓縮/歸檔?
我知道有人問過關於權限的類似問題,但是哪種壓縮或歸檔形式可以保留每個文件和目錄的權限和文件所有者?
我正在考慮
tar.gz
格式,但這對嗎?我需要將 37GB 的文件和目錄移動到另一台伺服器,並且需要在解壓縮時一切都完全相同。
傳統的歸檔工具tar和cpio都保留所有權和 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 coreutils
cp -a
的cp
命令來複製文件;GNU cp 非常擅長複製所有內容,包括擴展屬性和 ACL 等非傳統特性。¹雖然這個真的被誇大了。
如果您正在談論 linux 系統,那麼您的另一個選擇是squashfs。它通常可以實現非常高的壓縮比——而且壓縮過程本身是多執行緒的——這意味著您可以將所有處理器核心應用於壓縮任務。
squashfs 存檔不同於大多數其他類型,因為它是一個文件系統。如果您曾經啟動過 linux live 光碟,那麼您很可能已經看到了這一點 - 幾乎所有這些工作都是通過將 squashfs 存檔安裝為它們的根文件系統來完成的。自版本 2.6.34 起,香草 linux 核心支持 squashfs。因此它對任何現代 linux 系統都相當普遍。
Squash 支持任何 gzip、lzma、lzo、xz 或*(自核心 3.19 起)* lz4 壓縮方法。要掛載和訪問 squash 存檔的內容,您根本不需要任何工具,只需執行以下操作:
mount ./img.sfs /mnt; cd /mnt
……得到它。然後,核心的本機vfs將存檔的內容作為只讀掛載提供給您,您可以像讀取任何其他類型的文件一樣讀取其中的所有文件 - 而無需解壓縮存檔*(由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 壓縮之外,您看到的壓縮率還有- (我的根 fs 是 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