如何理解Ubuntu文件系统布局?

在Windows中,可能只有几个重要的文件夹(我所说的重要是指在我的逻辑上对Windows文件系统的重要性)位于安装驱动器中(在我的情况下是C:\)。即Program FilesWindows。我只是远离Windows文件夹,而“添加或删除程序”足以处理Windows的program files文件夹。当然,还有一个名为Users的文件夹,用户(非管理员)只能访问自己的文件夹。
因此,在我的脑海中,在某个层面上,对Windows文件系统有一个清晰的图像。在Ubuntu中,当我到达位置/时,有一个庞大的文件夹列表,其中大部分我都不知道它们包含什么。 /bin文件夹似乎相当于Windows中的Windows文件夹。 /usr文件夹看起来就像是Windows中的Users文件夹的等价物。但是,甚至/home文件夹看起来也可以胜任。
请理解,我确实明白Ubuntu(Linux)与Windows有不同的特点,即在Ubuntu中不需要完全等效于Windows功能。我只是希望对Ubuntu文件系统有一个更清晰的了解。
这个问题是我将一个更大的问题分解成可回答的部分之一。原始问题可以在这里找到:
http://sgsawant.wordpress.com/2012/05/17/whats-the-equivalent-of-add-or-remove-programs-in-ubuntu/

3请参阅unix.se上的目录结构标签。所有Linux发行版都遵循相同的模型。 - Gilles 'SO- stop being evil'
非常感谢您的回答。有几个问题让我有点困惑: 在Windows中,安装程序通常会通过提示提供一种选择,即为所有用户安装软件。在Ubuntu中应该如何区分呢? 此外,在配置开发软件到其集成开发环境中时,也经常遇到类似的问题。比如,在Windows中,“Program Files\MiKTeX\bin”文件夹中有一个名为“pdflatex.exe”的文件。因此,我可以将开发环境指向这个文件并进行配置。在Ubuntu中该如何进行这个过程呢?从配置角度来看,与软件相关的通用二进制文件存放在哪里呢? - Shashank Sawant
2在Ubuntu中,通常是为所有用户安装软件。通过软件包管理器进行的所有操作都是针对所有用户的。我不理解你评论中的其他部分;一个人不会“配置”与软件相关的“二进制文件”。你应该将这个问题单独提出,并更好地解释你想要做什么。 - Gilles 'SO- stop being evil'
明白了。我会提出一个新问题。即便如此,我还是简单解释一下我的意思:在Windows系统中,.exe文件很容易找到。例如:"C:\Python27\python.exe"。所以我知道Python程序从哪里开始运行。现在如果我要使用Eclipse集成开发环境,我只需指定它的python.exe路径,这就是我所说的“配置”。我为Python配置了IDE。在Ubuntu系统中,程序安装的位置在哪里?这仍然困扰着我。 - Shashank Sawant
2@Gilles 说“全部”时要小心。GoboLinux 项目 实际上使用更类似于 Windows 的目录结构。 - new123456
请参考:http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/Linux-Filesystem-Hierarchy.html - Pandya
6个回答

你可以在维基百科等网站上阅读相关内容。以下是一段摘录:
文件系统层次标准(FHS)定义了Linux操作系统中主要目录及其内容。在很大程度上,它是对传统BSD文件系统层次结构的正式化和扩展。
FHS由Linux基金会维护,该组织是一个由主要软件和硬件供应商组成的非营利性机构,如惠普、红帽、IBM和戴尔。 当前版本为3.0,于2015年6月3日发布。
以下是一个简短描述的可视化表示:

enter image description here

基本上,Linux根据系统安全所需的最少权限,将目录结构进行了划分。否则,某人就不得不做很多可避免的工作。

请记住,Unix和Linux是为多用户系统而设计的,而Windows则是为单用户而创建的。从这个想法可以解释其他一切。当考虑到它是多用户和安全性时,您可以解释每个目录。

3个例子:

你会注意到,只有管理员才能访问的文件和目录被收集在同一个目录中:`/sbin`,`/usr/sbin`和`/usr/local/sbin`中的`s`代表系统。普通用户甚至不能启动那些在这些目录中的程序。普通用户可以启动的文件位于`/bin`,`/usr/bin`和`/usr/local/bin`中,根据逻辑它们应该放置在哪个目录下。但是,如果它们只限管理员使用,那么应该放置在相应目录的`s`版本中。 有一个著名的实用程序叫做`fuser`。你可以用它来终止进程。如果普通用户能使用它,他就能终止你的会话。
对于`/home`也是一样的情况:`/home/user1`是user1的属性,`/home/user2`是user2的属性。user2没有理由在user1的主目录中操作(反过来也是一样的:user1没有理由在user2的主目录中操作)。如果所有文件都在以用户名为子目录的`/home`下面,你将不得不给每个文件设置权限,并判断谁有权写入/删除这些文件。如果你有数十个用户,那将是一场噩梦。
关于库的问题,请查看Addition
`/lib/`,`/usr/lib/`和`/usr/local/lib/`是在多库系统出现之前的原始位置,并且存在的目的是为了避免破坏。而`/usr/lib32`,`/usr/lib64`,`/usr/local/lib32/`和`/usr/local/lib64/`则是32位/64位多库的新发明。

这绝不是一个静态概念。其他Linux发行版对此布局进行了调整。例如,目前你会看到Debian和Ubuntu在FHS的布局中进行了很多变化,因为SSD对只读文件更有优势。有一种趋势是朝着一个新的布局方向发展,其中文件被分成“只读”和“可写”目录/组,这样我们就可以有一个可以以只读方式挂载(SSD的分区)和可写方式挂载(SATA硬盘)的根分区。 用于此目的的新目录(图像中没有显示)是/run/


20+1 Rinzwind。我喜欢这张图片,实际上我正在寻找一张。 - Luis Alvarado
6哈,我以为这会引起注意:+ @LuisAlvarado - Rinzwind
1几年前,不是/mnt现在就是/media吗? - RobinJ
9@RobinJ:区别在于/mnt历来都是手动管理的。随着许多临时设备(闪存驱动器等)的出现和自动挂载变得标准化,需要自动处理挂载点。为了避免与现有的手动配置冲突,需要一个新的目录。因此,如今/mnt已经被降级为提供方便的临时挂载点的角色。 - Scott Severance
@RobinJ Scott 是正确的:http://www.pathname.com/fhs/pub/fhs-2.3.html#MEDIAMOUNTPOINT 这里有更多信息 :) - Rinzwind
1实际上,至少现在,在/sbin目录下的许多应用程序可以由普通用户运行(例如shutdown不再需要root权限,与swapon一样)。那么与/bin相比有什么区别呢? - Byte Commander
解释应该是有意义的,同时也不应该让人感到无聊。 - Vitaliy Terziev


1好主意!我总是忘记那个,尽管它总是存在的(即使网络断了;)) - Rinzwind
“man hier” 现在是我最喜欢的命令之一!对于我来说,它的解释比 FHS 文档更清晰,特别是在区分“本地机器”和“全局”的方面,对于一个经验不足的 Ubuntu 用户来说,尤其是从适度的 DOS/Windows 经验过渡过来的。 - WillC
1顺便说一句,数字7是指在这个人页的“杂项”部分。你可以在这里找到更多信息。 - Pablo Bianchi
嗯。不管怎样,这有点让我想起只有链接的回答,即使每个Ubuntu版本都可能有这个。你能把man页面的内容加入到你的回答中吗? - jrh

晚回答 - 我为初学者创建了一份路线图,供他们参考。如果他们正在寻找一个文件但不知道在哪里找,他们可以使用这张地图来大致导航。你可以在这里下载高分辨率的PNG文件here。你可以在这里找到相关的帖子here。我会在有时间的时候持续更新文件和帖子,并纳入有用的评论。


有一个有趣且有帮助的想法来制作流程图,但不幸的是它似乎存在一些死胡同。我的问题是,如果我正在执行mysqldump命令,应该将文件输出到哪里? - BadHorsie
@BadHorsie 当然,这完全取决于您的具体用例,但将其转储到“/home/badhorsie/mysqldump”目录中就足够了。如果您运行多个应用程序,可以为每个应用程序创建一个新用户,并将其转储到该应用程序/用户的“home”目录中。 - d4nyll
很棒而且有用的解释!谢谢。但我有一个问题。如果它既不是从源代码安装的,也不是使用软件包管理器安装的,那它是什么呢?你说它会被安装到 /usr 目录中,但 FHS 文档强调本地软件不能安装在 /usr 目录中,因为在系统升级时可能会被覆盖,应该使用 /usr/local 目录代替。 - aderchox
非常有用!如果不会使图表过于拥挤,我会添加~/.local/,其中包含特定用户的数据和可执行文件,例如个人脚本。 - Matthias Braun
通常在流程图中,你会以一个椭圆形开始(就像你以一个椭圆形结束一样)。 - Adam

这段文字显示了目录结构。
mtk4@laptop:/$ pwd
/
mtk4@laptop:/$ tree -L 1
.
|-- bin
|-- boot
|-- cdrom
|-- dev
|-- etc
|-- home
|-- lib
|-- lost+found
|-- media
|-- mnt
|-- opt
|-- proc
|-- root
|-- run
|-- sbin
|-- selinux
|-- srv
|-- sys
|-- tmp
|-- usr
|-- var

主要组件如下:
  1. /boot:包含引导加载程序。

  2. /home:包含用户的主目录。

  3. /bin:存放系统上所有用户使用的可执行二进制文件和命令。

  4. /sbin:存放系统管理员通常使用的系统可执行二进制文件。

  5. /lib:包含支持/bin和/sbin中二进制文件的系统库。

  6. /etc:包含网络、启动时间等配置文件。

  7. /dev:包含设备文件,例如USB、终端设备或其他连接到系统的设备。

  8. /proc:包含有关正在运行的进程的信息。

  9. /tmp:这是临时目录,许多进程在此创建所需的临时文件。每次启动机器时都会清除该目录。

更多详细信息,请查看Thegeekstuff链接,该链接完美解释了通用的Linux文件系统。


\Users等同于/home。而/usr的名称则是一个历史遗物。

\Windows\Program Files的组合等同于/bin/boot/etc/lib/sbin/tmp/usr/var的组合。Linux和Windows在安装软件时有不同的分割方式。Windows区分操作系统和伴随程序,而Linux则没有以同样的方式进行区分;大部分(如果不是全部)软件都通过Ubuntu(发行商)提供,并且安装在相同的目录层次结构中。由于软件由软件包管理器跟踪,因此无需将每个程序存储在自己的目录中。在Linux上:

  • /etc 是用于系统配置文件的目录:这些配置文件会影响所有用户,无论是应用于整个操作系统还是特定应用程序。
  • /usr 是用于系统代码和数据(程序、库、文档等)的目录。
  • /var 是用于存储变量或临时数据的目录:临时文件、日志、软件包管理器数据库、打印机队列、游戏保存文件等。还有一个 /tmp 目录,用于存放可以在重启后被删除的临时文件。
  • 根目录下的 /bin/lib/sbin 目录在 /usr 目录中都有对应的目录。位于 /usr 之外的文件是在引导过程中早期需要的文件。这是一个遗留问题,因为磁盘容量较小,/usr 可能位于网络上多台工作站共享的文件系统上,但在大多数系统上并没有实际意义。
  • /boot 目录包含一些仅用于引导操作系统而不用于日常操作的文件。

还有一些额外的目录与 Windows 没有对应关系:

  • /root 是根用户的主目录。根用户是一个管理员账户,不与任何特定用户关联;当你运行sudo时,你会切换到这个用户。Ubuntu默认不允许根用户登录。
  • /media/mnt 是挂载点:它们是你可以看到其他操作系统和远程驱动器的文件系统的地方。在Windows中,相当于其他驱动器字母。
  • /proc/sys 显示系统信息。在Windows上,你需要浏览菜单、调用系统命令或安装第三方程序才能查看这些信息。

Ubuntu和其他Linux发行版一样,通常遵循Linux 文件系统层次结构标准


Ubuntu(像所有类UNIX系统一样)以分层树的方式组织文件,其中关系被视为子节点和父节点之间的团队。目录可以包含其他目录以及树的“叶子”——常规文件。树中的任何元素都可以通过路径名引用;绝对路径名以字符/开头(标识根目录,其中包含所有其他目录和文件),然后列出必须遍历以达到该元素的每个子目录,每个子目录之间用/分隔。
相对路径名是不以/开头的路径名;在这种情况下,从一个给定点开始遍历目录树,该点根据上下文而变化,称为当前目录。在每个目录中,有两个特殊目录分别称为.和..,它们分别指向目录本身和其父目录。
所有文件和目录都有一个共同的根的事实意味着,即使系统上存在多个不同的存储设备,一旦将它们挂载到所需位置,它们都被视为树中的某个目录。 在此处查找示例和更多信息