为什么mount和umount是两个程序,而压缩和解压只需要tar一个程序就够了?
最早的tar是一个操作磁带机的归档工具,不支持压缩和解压操作,只支持归档和提取。
这是最早的tar,Research Unix Version7里的源代码(1979年)
https://github.com/dspinellis/unix-history-repo/blob/Research-V7-Snapshot-Development/usr/src/cmd/tar/tar.c
最后一个包括AT&T Unix源码的BSD版本,BSD 4.3 Tahoe(1988年),包含这份代码的演进版本,同样是主要针对磁带归档的工具。
https://github.com/dspinellis/unix-history-repo/blob/BSD-4_3_Tahoe/usr/src/bin/tar.c
源码里所有有关tar的程序,全部包含在这一个tar.c文件中,根本没有什么静态库、动态库、头文件之类的逻辑拆分操作,总共也就一千多行的C代码,因此只在一个程序中也非常合理。
此外,没有拆分为读取和写入的另一个理由是,tar.c使用的都是标准的IO操作,无论是直接读写块设备/dev/mt1还是普通文件。
而查看早期的mount和umount, 其实是调用对应的两个系统调用,然后修改/etc/mtab的非常简短的程序,只有几十行C代码。
https://github.com/dspinellis/unix-history-repo/blob/Research-V7-Snapshot-Development/usr/src/cmd/mount.c
除开命令行程序之外,还有libc中的mount系统调用的用户态入口,十几行的汇编
https://github.com/dspinellis/unix-history-repo/blob/Research-V7-Snapshot-Development/usr/src/libc/sys/mount.s
以及对应的内核态系统调用的入口
https://github.com/dspinellis/unix-history-repo/blob/Research-V7-Snapshot-Development/usr/sys/sys/sys3.c#L131
虽然不清楚具体的原因,但是具有单独的库文件,可能是mount和umount分成两个c文件的重要原因。
此外,需要注意的是,在Research Unix V7中,并不支持符号连接,只支持硬链接。
John Gilmore在1986年编写的pdtar成为之后的GNU tar的基础。
从这一版tar开始,tar开始支持通过管道处理压缩后的tar文件,首先是LZW算法的compress。
这是1992年的386BSD 0.1中存储的GNU tar 1.10的代码,支持通过compress压缩或者解压tar.Z文件
主程序入口:
https://github.com/dspinellis/unix-history-repo/blob/386BSD-0.1-Snapshot-Development/usr/src/usr.bin/tar/tar.c
调用compress进行压缩解压的代码
https://github.com/dspinellis/unix-history-repo/blob/386BSD-0.1-Snapshot-Development/usr/src/usr.bin/tar/buffer.c#L466
原版的pdtar的代码略有不同
https://github.com/public-domain/pdtar/blob/master/buffer.c#L219
之后的GNU tar,逐渐加入了PKZIP算法的gzip,以及现在更常见的其他压缩算法。
除了GNU tar,libarchive实现的bsdtar也支持了更多的解压格式,并且在macOS、Windows、BSD等系统上作为默认的tar实现。