我一直很好奇:作為一個文件打包的格式,tar 包為什麼在解壓後,使用 ls -l 命令查看,文件的許可權、文件 owner 和 group、修改時間等等各種屬性都在? 除了正常的文件,連設備文件也可以打包,因為如此,tar 命令可以用來備份整個 Linux 操作系統,一旦玩崩了,用備份恢復,什麼都不會丟。

tar 命令是 Unix/Linux 平臺用的最多的命令之一。 原始的 tar 只具備打包和解包的功能, Tape ARchive, 本義就是把文件打包備份到磁帶機。 GNU 為 tar 增加了很多新功能,比如支持各種壓縮格式。本文只討論原始的 tar,它只打包而不做壓縮。

我搜索到了 GNU tar 的官網文檔,在看到了 TAR 文件的格式定義後,一切全明白了。

Basic Tar Format?

www.gnu.org

在 Unix 中一切都是文件:普通文件,文件夾,符號鏈接,設備文件等等。tar 包就是由一個個文件順序排列而成,每個文件由兩部分組成:文件頭和文件內容。

文件頭的格式用C語言結構體定義如下:

struct posix_header
{ /* byte offset */
char name[100]; /* 0 */ 文件名
char mode[8]; /* 100 */ 用戶許可權
char uid[8]; /* 108 */ user id
char gid[8]; /* 116 */ group id
char size[12]; /* 124 */ 文件大小
char mtime[12]; /* 136 */ 修改時間
char chksum[8]; /* 148 */ 校驗值
char typeflag; /* 156 */ 文件類型標誌
char linkname[100]; /* 157 */ 符號鏈接指向
char magic[6]; /* 257 */
char version[2]; /* 263 */
char uname[32]; /* 265 */ user name
char gname[32]; /* 297 */ group name
char devmajor[8]; /* 329 */ 設備文件 major
char devminor[8]; /* 337 */ 設備文件 minor
char prefix[155]; /* 345 */
/* 500 */
};

文件類型標誌定義,包含了所有 Unix 系統中的文件類型

#define REGTYPE 0 /* regular file */
#define LNKTYPE 1 /* link */
#define SYMTYPE 2 /* reserved */
#define CHRTYPE 3 /* character special */
#define BLKTYPE 4 /* block special */
#define DIRTYPE 5 /* directory */
#define FIFOTYPE 6 /* FIFO special */
#define CONTTYPE 7 /* reserved */

可以看到,文件頭裡麪包含了很豐富的信息,tar 為啥能夠打包各種文件格式,已經不言自明。

值得一提的是,在解包時,應該用 root 身份,否則文件的 uid 和 gid 等會修改為當前的用戶 id。


推薦閱讀:
相關文章