Unix文件系统结构的优点是什么


9

如果我在Linux(例如Debian / Gnu Linux)中安装应用程序,则该应用程序的文件将复制到文件系统中的许多不同目录中。

一些脚本进入/ usr / share .. / usr / local,另一些文件进入/ var .. / log .. etc /,依此类推。

对我而言,这是可以的,因为我了解了一些有关文件系统的知识,并且大多数目录都在其中存放文件以用于特定目的。这非常适合Unix哲学中的“一件事做好”。

但是我的问题是这种目录结构的优点什么?还是仅仅是Unix时代的遗产。(例如,与使用Windows的情况相比,一个应用程序的所有文件都在一个特定的“文件夹”中)

Answers:


9

在我看来,最容易想到的优点是,相似的文件位于同一目录树中。存放配置文件/etc,存放日志文件和/或运行时跟踪文件/var/log,存放可执行文件/usr/bin,存放诸如PID文件之类的运行时信息/var/run。您想知道NTP配置文件中的内容吗?将目录更改为/etcdo并执行ls ntp*。您想让一些程序监视可执行文件,以便某些传统的文件系统病毒不会感染它们吗?一切都在/usr/bin/usr/local/bin需要观望。

我能想到的第二个优点是,Unix的组织风格促进了数据和可执行文件的分离。可执行文件位于一个目录中,该目录与模板(/usr/share可能是)的位置相距甚远,并且与数据的位置相距甚远。这种分离可能是Unix / Linux / * BSD比Windows或旧的Pre-OSX Mac更能抵抗文件系统病毒的原因。


那是好点。为什么将可执行文件与数据文件,模板文件,配置文件分隔开来才能更有效地防御病毒?
Jan Koester

3
由于能够将数据更改为可执行文件,因此世界上许多(但不是全部)病毒和蠕虫得以传播:堆栈溢出,SQL注入和代码注入都以这种方式工作。“ Word”宏病毒至少部分地传播是因为.doc文件中包含“ Word”宏。通过文件将数据与可执行文件分开是一种保护级别,将数据放在一个目录中,将可执行文件放在第二个目录中,将模板放在第三目录中,将模板放在第四目录中,为将数据和可执行文件混淆起来设置了更多的障碍。
Bruce Ediger 2013年

2
数据和可执行的分隔参数是完全废话。文件系统的组织是为了人类的利益。并不是说在位之间存在某种物理上的隔离,以防止它们彼此之间或其他任何事物之间产生共鸣。通常,由于通常具有更强大,更严格执行的权限模型,因此UNIX的安全性历来更好。
蓬松的

@fluffy单独的文件系统提供稍强的分离,但该点是部分没有实际意义,因为它是不可能分离/bin/etc/
jw013

@fluffy-同意,不存在“物理上的”分离或可能的分离。但这是按名称分隔。恶意软件必须在其他目录(而不是“。”或目录名$ 0或其他目录)中查找模板或其他数据。这不是绝对安全,除了关闭玻璃窗之外,绝对是绝对安全。安全是一种经济利益,每增加一个工作单位都具有边际价值。一点点帮助。
Bruce Ediger 2013年

11

无论选择哪个组织,这都会使某些事情变得更容易,某些事情变得更加困难。

按类型,Unix的方式组织文件(成binmanlib/python,...),使得它更容易使用的文件。如果要运行命令,则无论在哪个程序包中都可以找到命令。如果您要搜索文档,则全部集中在一个地方。如果某些程序提供了Vim语法高亮模块,zsh完成函数或Python绑定,则相关文件将位于vim / zsh / python可以找到它的位置。

Unix还通过使用模式来组织文件。配置文件进入/etc,在正常操作中/usr不变的文件进入,而自动变化的文件进入/var。用户数据不足/home。这对于配置管理(管理其中的内容/etc以及已安装软件包的列表)非常有用。定义备份策略也很有用:所包含的内容/etc/home至关重要的内容,而所包含的内容/usr可以轻松地再次下载。

Unix方式的主要成本是安装软件的过程分散在许多目录中。但是,现代的UNIX系统仍然具有包管理器。到目前为止,管理许多目录中的文件并不是最复杂的事情(跟踪依赖关系非常有用并且更加困难)。

与Windows对比。Windows开始时没有包管理,每个应用程序都在某个地方创建了自己的目录。所有文件通常都位于该目录内:程序,静态数据,用户数据……有时,对于某些库,程序会将它们放到公共系统目录中而不考虑冲突(“ DLL地狱”)。随着时间的流逝,Windows成为多用户,需要将用户目录与系统目录分开。Windows还为配置文件(Unix的/etc)和一些系统数据(Unix的/var),注册表。这主要是由于缺乏软件包管理以及作为单用户系统的早期历史而造成的。Windows方法有很多局限性:它不允许软件包轻松交互。例如,大多数已安装的软件并未最终出现在默认的命令搜索路径中,因此它与任何形式的脚本都无法很好地交互。作为特殊情况,安装程序通常会提供一个菜单图标-放入一个单独的系统目录中(在Unix中!)。

Unix方法的局限性在于它不能轻易允许程序包的多个版本共存,这在升级程序包时尤其成问题。兼顾两者的一种方法是将每个程序包解压缩到其自己的目录(/opt结构)中,并创建从程序包目录到/usr结构的符号链接林。这就是像stow一样的软件。

总之,Unix方法使使用文件,管理文件和允许程序包交互变得更加容易。它需要软件包管理软件,但这还是很理想的。Windows方法使手动管理软件包变得更容易,但必须转向Unix模型才能获得有用的功能。


1
太棒了 在我看来,虽然,它只是用来更容易单独管理软件包。Windows注册表的出现改变了所有这些,然后又改变了一些。它不仅是巨大而迷宫的- 故意是这样-在字节码中有一些值,而另一些则不是,并且对结构没有真正的押韵或理由。我想这就是您要开发托管操作系统保护商业秘密和专有方法的方式:令人困惑。
mikeserv

3

上面未提及的主要好处(也是该结构的历史原因之一)是在启动过程中不同阶段可用的多个卷/磁盘上的物理隔离。

另一个好处是,可以将各种目录安装在针对目录数据进行了优化的卷/文件系统上。例如,tmpfs对于/run; 以及/sbin只读媒体/ ROM。

同样,这些卷可以是本地卷或远程卷,个人卷或共享卷。

最后,请参阅“ 应用程序目录”,以获取在UNIX(OS X .app),Linux(ROX Desktop)和Windows(PortableApps.com)中使用的替代方法(由@fluffy提及)。


1

除了易于猜测应用程序的共享文件和配置文件的位置以外,这种布局实际上没有任何优势。UNIX在这种布局上有很长的历史,要打破它是很困难的。但是,某些UNIX发行版已更改了其模型-它们仅提供用于旧版目的的旧位置,而其他应用程序则捆绑在其自己的小目录/软件包中。Mac OS X是最突出的例子,并且有一些晦涩的Linux发行版可以做同样的事情(Android所做的事情类似,只是做得更进一步,还可以使用其自己的用户ID安装和启动每个应用程序)。

文件系统约定提供的主要内容是一项约定,以便人们知道在哪里查找文件(无论是手动还是在代码中)。没有真正的技术理由使它成为另一种方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.