[Feelings & Sharing] 【小知识】GNU/Linux的文件系统层级
Tofloor
poster avatar
enforcee
deepin
2023-05-02 00:28
Author

这部分内容我以前也写过一些,这次是重新整理的版本

blush

首先是一些比较零碎的小知识:

GNU/Linux乃至所有类Unix操作系统都采用树形的文件结构。文件共有三种类型:文件、目录(文件夹)和链接文件。这里说的文件并不完全等同于硬盘上用来保存数据的文件,也有一些「抽象的」的文件,他们有类似文件的读(输出)或写(输入)等等能力,因此也被作为文件对待。目录没有文件的读写功能,但是目录可以包含其他的文件(因此也被称为文件夹)。链接文件是一个指向其他文件或者目录的链接,通俗的说就是他是其他文件的「马甲」,访问或者修改链接文件就会变成对原文件的操作。Linux的文件结构并不是基于一个硬盘分区中的文件结构,而是在一个虚拟的树上,把各个文件系统「嫁接」过来,有的文件系统成为「根」,有的成为「梢」,这样一个树上的文件并不都是来自于一个硬盘分区,而有的文件也并非存在于硬盘中。

不在物理设备上的文件系统叫虚拟文件系统(VFS)。要查看当前使用的文件系统和类型可以采用 df -T命令,如果用 df -aT可以列出更多挂载的文件系统,多出来的一部分就都是一些虚拟的文件系统。tmpfs是比较常用的虚拟文件系统,通常用来保存临时文件,由于他的数据记录在内存中,所以断电关机后数据就会消失。

Linux的文件系统层级是有Linux Standard Base(LSB)制作的规范,称为Filesystem Hierarchy Standard(FHS)。虽然LSB创立是为了解决各种GNU/Linux二进制兼容的问题,但实际上流行的发行版都不愿接受,因此各种发行版与LSB也只能说是部分兼容。他们家的规范也可以作为一种参考,但是实际情况是真正的话语权都在发行版的开发者本身。(Linux基金会的规范参见:https://refspecs.linuxfoundation.org/)

系统中名称相同但是在不同位置的目录,比如说到处都有的bin和lib,他们包含的文件类型是类似的,只是他们使用的目的不同(比如修改所需的权限,创建的程序,生效的范围等等),这一点熟悉GNU/Linux的用户都会体会到的。

下面进入正题(用粗体表示的是虚拟文件系统):

/:我们称为根目录(Root Directory),这个是最低层,用一个单独的正斜杠「/」表示。

/dev:设备文件(Device file)目录。他的文件系统是devtmpfs。硬件设备的输出和输入可以被看作是文件的读写操作,比如鼠标键盘等输入设备可以看作是只读文件,硬盘分区可以看作是可读可写文件。设备文件是由驱动程序(内核模块)提供的。

/run:运行时变量数据(Run-time variable data)目录。文件系统是tmpfs。实际上他的意义就是「把所有关机后就要清空的数据都堆到一块来」。其实这个目录以前有一部分是在/var里面的,后来的设计是把/var那边的融合到/run进来。(参考:https://wiki.debian.org/ReleaseGoals/RunDirectory)

/proc:进程(Process)目录,文件系统是proc,每一个进程都被抽象成了一个目录,目录的名称就是他的进程序号(PID)。进程的命令、工作目录、环境变量等信息都可以从这里读出来。除此之外,还包括一些内核和内核模块的数据等。

/sys:系统(System)目录,文件系统是sys。所有内核和内核模块的参数都被抽象成了文件,可以进行修改。(内核参数就是大家在修改grub引导参数的时候在linux一行后面添加的),除此之外还包含了一些硬件信息。

/tmp:临时文件(Temporary files)目录。文件系统是tmpfs。我们都有/run了,为什么还要/tmp呢?他们最大的不同是/run是root权限专用的,而/tmp是大家都能读写的目录。另外还有一个 /run/user/用户自己的id,这个是每个用户专用的。

/media:可移除媒体(Removable Media)比如U盘、移动硬盘和没有设置挂载点的内置硬盘会自动挂载到这里。文件系统是tmpfs。有的发行版会选择/run/media,好处就是少用一个tmpfs(冷笑话)。

/bin、/sbin:见「/usr/bin」

/lib:见「/usr/lib」

/usr:这是一个比较重要的区域,过去这个位置其实是用户(User)目录,和现在的/home是一样的,后来是因为早期程序员用的存储设备容量较小,于是他们把本来在根目录里的内容移动了进来,后来的系统也一直保持了这个习惯。而且现在/usr的内容要远多于根目录。现在我们叫他Unix系统资源(Unix System Resources)目录。这个目录是由系统的包管理器主要操作的空间,如果通过其他方法来修改可能会造成问题。

/usr/bin:二进制(Binary)文件目录。虽然二进制文件有很多种,但是这个目录实际上存放的是可执行文件(有些脚本其实不是二进制文件,但是也放在这个目录里)。过去不同命令被存放在不同目录,理由是「重要性不同」,但实际上大家已经厌倦了来回分类,在最新的标准里,这些目录通通合并进了/usr/bin,而原处的/bin则是一个通往/usr/bin的链接,这种设计称为UsrMerge。另外这个目录通常是不允许再包括其他子目录的。

/usr/lib:库(Library)文件目录。单独的可执行文件很多情况下是不能独立完成功能的,而必须有其他资料所相互配合。在这个目录中存放的二进制程序文件通常不是让用户来执行的,而是让其他程序来调用。这样的程序我们叫动态链接文件(dll/Dymanic Link Library),特点是他们的后缀是.so(Shared Object),名字通常用lib开头。在UsrMerge后/lib被合并进/usr/lib

/usr/lib32:amd64的CPU架构支持兼容x86的程序运行。如果使用的是amd64架构的CPU,x86的库文件会被单独放到这里。

/usr/share:架构无关数据目录。他和/usr/lib很像,但是/usr/lib存储的数据通常是二进制文件,和CPU架构有关,而这个目录里的数据的使用可以不分CPU架构。简单来说这里面存放的都是图像、字体、文本、配置等内容,而不包括程序。

/usr/include:包含(Include)文件目录。如果想开发一个链接到其他库的程序,需要库文件(运行包)和头文件(开发包,在debian系统上用于开发的软件包名都有一个-dev的后缀)。用C语言写代码的时候会包含(include)相应的头文件,这个目录就是这么来的。

/usr/local:这也是个单独的区域,与/usr不同,/usr/local是不归包管理器管的。他里面也有bin,lib,share这些目录。如果想在包管理器之外安装程序(比如自己编译安装),建议选择这个目录而不是/usr。另一个选择是/opt。由于他的内容不会和软件源同步,所以被称为本地(Local)目录。

/var:变量数据(Variable data)目录。他容纳一些其他程序产生的文件,比如日志、数据库、临时文件(不会自动清除的临时文件)。这些数据尽管删除以后也能重新生成,但是可能会比较麻烦和费时,所以会将他们保存下来,而不是像/run和/tmp一样每次断电都清空。

/etc:全局配置文件。这些是系统管理员来修改的设置,会对全部用户生效。/usr/share里面也会有一些配置,如果在/etc里面有同名的配置,他的效果就会覆盖掉/usr/share里面的。因此/usr/share被称为默认配置,/etc称为手动配置。

/boot:给操作系统引导器(Bootloader)使用的文件。linux内核(vmlinuz)和初始化内存盘(initramfs)放在这里。

/boot/efi:EFI分区挂载到这里了。我们常用的操作系统引导器(Bootloader),比如GRUB2就安装到这个分区。他是由电脑的BIOS读取和启动的。

/opt:附加(Add-on)应用软件目录,也叫可选(Optional)软件目录。这个目录和/usr/local类似,都是用来安装用户在系统之外加装的软件,不同的是/opt通常用来安装体积较大的应用程序。在/opt中的软件通常是每个软件有一个单独的目录,在这个目录中再分成/bin、/lib、/share等。当然既然每个软件都有独自的目录,软件的开发者随便设计目录结构也是可以的。(另一种用法是和/usr/local一样,直接使用/opt/bin、/opt/lib等目录,不常见)

/srv:如果你有一个网络服务器(Server),这个目录用来存放服务器的根目录。比如http服务器的根目录通常在/srv/http,ftp则是/srv/ftp。但是实际上服务器的配置都是可以修改的,给他改到别的地方也没关系,只是大家习惯放在这里了。

/mnt:这个目录通常是空的,但是他不是毫无作用,在修理其他系统的时候,大家喜欢把其他系统的根分区挂载(Mount)到这。

/root:root用户的家目录。

/home:其他用户的家目录都存放在这里。这个目录下每个用户都有以他的用户名命名的目录,称为他的家(Home)目录或主目录。登录系统后环境变量$HOME就会被设置成家目录的位置,另外也被简称成波浪线~(以下的波浪线均指用户的家目录)。家目录是存放每个用户私人信息和配置的地方。对于家目录的规范不是LSB作出的,而是源自freedesktop。(参见https://www.freedesktop.org/wiki/Specifications/basedir-spec/)

以点号.开头的文件为隐藏文件。

~/.local:相当于/usr/local,但是这个是每个用户专属的目录。其下有bin、lib、share等目录。对于 ~/.local/share,则有点特殊,他存放的资源也会被系统应用读取(用户自己安装的字体、启动器等都放在这里),并且也被作为保存数据的目录(比如游戏存档)。

~/.config:类似/etc,但是他主要用来配置图形应用和以用户身份执行的应用。具体看各个软件的设计,有的软件会同时读取两个目录,但是有的软件只有一个配置文件的地方。

~/.cache:类似/var/cache,是不会自动删除的临时文件。

其他主目录下的隐藏目录和文件:也是各个程序的资源或者配置文件,通过文件名就能看出是谁创建的。这些文件和 ~/.config里面的或者 ~/.local/share的功能基本没什么区别,只是不同的开发者的喜好差异(可能是觉得用户眼不见心不烦吧)。

Reply Favorite View the author
All Replies
阿尼樱奈奈
deepin
2023-05-02 00:34
#1

like

Reply View the author
兆兆嘟嘟嘟
Moderator
2023-05-02 00:43
#2

请问你知不知道-rwxrwxrwx的机制?

Reply View the author
enforcee
deepin
2023-05-02 00:48
#3
兆兆嘟嘟嘟

请问你知不知道-rwxrwxrwx的机制?

这个叫文件权限,网上有一些现成的文章

blush

如果非想看我写作,我有时间再写写

Reply View the author
兆兆嘟嘟嘟
Moderator
2023-05-02 00:53
#4
enforcee

这个叫文件权限,网上有一些现成的文章

blush

如果非想看我写作,我有时间再写写

好的,我只是不明白这个文件权限和文件所有者有什么关系。为什么文件权限已经是rwxrwxrwx但root用户还是无法操作普通用户文件。

Reply View the author
enforcee
deepin
2023-05-02 01:01
#5
兆兆嘟嘟嘟

好的,我只是不明白这个文件权限和文件所有者有什么关系。为什么文件权限已经是rwxrwxrwx但root用户还是无法操作普通用户文件。

最好单独开一个帖子说别的问题,要不很容易被误解

Reply View the author
Lwh2008-Equinox
deepin
2023-05-02 01:08
#6
enforcee

最好单独开一个帖子说别的问题,要不很容易被误解

你可以试一试问他用的什么文件系统...(比如说AIXFS)

Reply View the author
浪云
deepin
2023-05-02 01:32
#7

能不能介绍一下,V23对比V20,直接上层一下,有什么优点缺点

Reply View the author
enforcee
deepin
2023-05-02 01:38
#8
浪云

能不能介绍一下,V23对比V20,直接上层一下,有什么优点缺点

这个我也不会

blush

Reply View the author
浪云
deepin
2023-05-02 01:55
#9
enforcee

这个我也不会

blush

感觉深度这样做,是要付出很多的,但是不懂为什么?

以前不是也是源自debian吗?

Reply View the author
enforcee
deepin
2023-05-02 02:24
#10
浪云

感觉深度这样做,是要付出很多的,但是不懂为什么?

以前不是也是源自debian吗?

你可以开个其他的帖子讨论

Reply View the author
浪云
deepin
2023-05-02 03:00
#11
enforcee

你可以开个其他的帖子讨论

官方介绍了三点,

我感觉不出来,

不知道有没有其他听得懂的缘由

Reply View the author
neko
deepin
Ecological co-builder
Q&A Team
2023-05-02 05:10
#12
兆兆嘟嘟嘟

好的,我只是不明白这个文件权限和文件所有者有什么关系。为什么文件权限已经是rwxrwxrwx但root用户还是无法操作普通用户文件。

这种怕不是在非linux文件系统里的文件,比如ntfs

Reply View the author
寰宇ζ
deepin
2023-05-02 05:35
#13
enforcee

这个叫文件权限,网上有一些现成的文章

blush

如果非想看我写作,我有时间再写写

借楼问问,我电脑上的图片(来自压缩包解压),必须要777权限才能被文件管理识别,这个问题可能出哪里了

如图
截图_20230501212419.jpg

Reply View the author
兆兆嘟嘟嘟
Moderator
2023-05-02 05:36
#14
neko

这种怕不是在非linux文件系统里的文件,比如ntfs

Linux文件系统也是一样,要操作时终端提示“…is not owned by you”之类的话。

Reply View the author
enforcee
deepin
2023-05-02 06:28
#15
寰宇ζ

借楼问问,我电脑上的图片(来自压缩包解压),必须要777权限才能被文件管理识别,这个问题可能出哪里了

如图
截图_20230501212419.jpg

最好的做法应该是开个新帖问

blush

Reply View the author
enforcee
deepin
2023-05-02 06:42
#16

与主题内容关系不大的请大家不要在这个帖子里询问,而且因为论坛的机制原因发新帖受到的关注会更多,更容易解决问题。

如果大家非要让我看到,可以在帖子中输入 @enforcee (先输入一个空格,再输入一个@符号,再输入我的用户名,就会弹出一个框来,点击用户名,看到文本变蓝),这样发帖后我就能收到系统提示。

Reply View the author
青稚
deepin
2023-05-03 00:20
#17

虽然我很想给你置顶加精华,但你也是版主,也知道规定的。joy

Reply View the author