为什么mount和umount是两个程序,而压缩和解压只需要tar一个程序就够了?

发布时间:
2024-09-07 23:14
阅读量:
38

最早的tar是一个操作磁带机的归档工具,不支持压缩和解压操作,只支持归档和提取。

这是最早的tar,Research Unix Version7里的源代码(1979年)

github.com/dspinellis/u

最后一个包括AT&T Unix源码的BSD版本,BSD 4.3 Tahoe(1988年),包含这份代码的演进版本,同样是主要针对磁带归档的工具。

github.com/dspinellis/u

源码里所有有关tar的程序,全部包含在这一个tar.c文件中,根本没有什么静态库、动态库、头文件之类的逻辑拆分操作,总共也就一千多行的C代码,因此只在一个程序中也非常合理。

此外,没有拆分为读取和写入的另一个理由是,tar.c使用的都是标准的IO操作,无论是直接读写块设备/dev/mt1还是普通文件。

而查看早期的mount和umount, 其实是调用对应的两个系统调用,然后修改/etc/mtab的非常简短的程序,只有几十行C代码。

github.com/dspinellis/u

除开命令行程序之外,还有libc中的mount系统调用的用户态入口,十几行的汇编

github.com/dspinellis/u

以及对应的内核态系统调用的入口

github.com/dspinellis/u

虽然不清楚具体的原因,但是具有单独的库文件,可能是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文件

主程序入口:

github.com/dspinellis/u

调用compress进行压缩解压的代码

github.com/dspinellis/u

原版的pdtar的代码略有不同

github.com/public-domai

之后的GNU tar,逐渐加入了PKZIP算法的gzip,以及现在更常见的其他压缩算法。

除了GNU tar,libarchive实现的bsdtar也支持了更多的解压格式,并且在macOS、Windows、BSD等系统上作为默认的tar实现。

END