[Tutorials] 入门教程三--系统目录(文件系统)
Tofloor
poster avatar
Jack
deepin
2021-01-14 15:58
Author

一、文件系统是什么?

 

文件系统是对一个存储设备上的数据和元数据进行组织的机制。它的最终目的是把大量数据有组织的放入持久性(persistant)的存储设备中,比如硬盘和磁盘。文件系统(file system)是就是文件在逻辑上组织形式,它以一种更加清晰的方式来存放各个文件。数据被存入到某个分区中。

 

二、常见的文件系统:

 

NTFS:

 

Windows当前的默认文件系统,NTFS文件系统是一个基于安全性的文件系统,是Windows NT所采用的独特的文件系统结构,它是建立在保护文件和目录数据基础上,同时照顾节省存储资源、减少磁盘占用量的一种先进的文件系统。

 

ExTN:

 

Ext系列是Linux的老牌文件系统了,一直是Linux的主打,从Ext3开始支持日志,Ext4更加完善了很多功能。由于其组织形式的限制,很难将很多现代文件系统的功能加进去,所以Linux才会出Btrfs项目企图重头开发一个功能强劲的文件系统。

 

Btrfs:

 

BTRFS(通常念成Butter FS),由Oracle于2007年宣布并进行中的COW(copy-on-write式)文件系统。目标是取代Linuxext3文件系统,改善ext3的限制,特别是单一文件大小的限制,总文件系统大小限制以及加入文件校验和特性。加入ext3/4未支持的一些功能,例如可写的磁盘快照(snapshots),以及支持递归的快照(snapshots of snapshots),内建磁盘阵列(RAID)支持,支持子卷(Subvolumes)的概念,允许在线调整文件系统大小。

 

ZFS:

 

被称为真正的下一代文件系统,ZFS 提供卷管理(能够在单个文件系统中处理多个单独的存储设备),块级加密校验和(允许以极高的准确率检测数据损坏),自动损坏修复(其中冗余或奇偶校验存储可用),快速异步增量复制,内联压缩等,以及更多

 

linux 可以实现在一个根系统下,挂载多个文件系统。比如:双系统中 /media 目录下挂载 NTFS文件系统,/mnt 目录下,挂载U盘的文件系统。

 

三、虚拟文件系统(VFS)

 

Linux支持的 文件系统有上百种,难道Linux内核需要对上百种一一适配吗?

 

不需要。为了支持各种不同的文件系统,Linux 内核在用户进程和文件系统的中间,又引入了一个抽象层,也就是虚拟文件系统 VFS(Virtual File System)。

 

VFS 定义了一组所有文件系统都支持的数据结构和标准接口。这样,用户进程和内核中的其他子系统,只需要跟 VFS 提供的统一接口进行交互就可以了,而不需要再关心底层各种文件系统的实现细节。

 

下图是:系统调用、VFS、缓存、文件系统以及块存储之间的关系。

图源:极客时间

四、挂载文件系统:

先来介绍一下根文件系统:

根文件系统首先是一种文件系统,相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。

挂载:

在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。

挂载文件系统的过程:

在 Linux 系统启动阶段的最初阶段,root 文件系统就会被挂载到 root 目录下(/)。其它文件系统在之后通过 SystemV 下的 rc 或更新一些的 Linux 发行版中的 systemd 等 Linux 启动程序挂载。在启动进程中文件系统的挂载是由 /etc/fstab 配置文件管理的。

 

 

五、如何分区?

 

首先,在Linux下谈分区并不准确。

 

与Windows分区,一个分区一个盘符不同。Linux是一整个目录树,如下图。Linux先划分固定大小的磁盘空间,设置好文件系统后,将磁盘空间挂载到固定目录下。

 

Linux目录结构,最顶层的目录称为根目录。图源:拉勾教育

 

在开始之前先介绍一下,Linux不同目录的功能。

 

Linux根目录

 

目录

描述

/(root文件系统)

root 文件系统是文件系统的顶级目录。它必须包含在挂载其它文件系统前需要用来启动 Linux 系统的全部文件。它必须包含需要用来启动剩余文件系统的全部可执行文件和库。文件系统启动以后,所有其他文件系统作为 root 文件系统的子目录挂载到标准的、预定义好的挂载点上。

/bin

/bin 目录包含用户的可执行文件(ls,cat,mkdir等),常用命令一般在这里

/boot

存放用于系统引导时使用的各种文件

/dev

该目录包含每一个连接到系统的硬件设备的设备文件。这些文件不是设备驱动,而是代表计算机上的每一个计算机能够访问的设备。

/etc

包含主机计算机的本地系统配置文件

/home

存放所有用户文件的根目录,是用户主目录的基点每一个用户都有一个位于 /home 目录中的子目录(作为其主目录)。

/lib

包含启动系统所需要的共享库文件。

/media

一个挂载外部可移动设备的地方,比如主机可能连接了一个 USB 驱动器。

/mnt

一个普通文件系统的临时挂载点(如不可移动的介质),当管理员对一个文件系统进行修复或在其上工作时可以使用。

/opt

额外安装的可选应用程序包所放置的位置。比如供应商提供的应用程序应该安装在这儿。

/root

这不是 root(/)文件系统。它是 root 用户的主目录。

/sbin

系统二进制文件。这些是用于系统管理的可执行文件。

/tmp

临时目录。被操作系统和许多程序用来存储临时文件。用户也可能临时在这儿存储文件。注意,存储在这儿的文件可能在任何时候在没有通知的情况下被删除。

/usr

用于存放系统应用程序,比较重要的目录/usr/local 本地系统管理员软件安装目录(安装系统级的应用)。这是最庞大的目录,要用到的应用程序和文件几乎都在这个目录。

  • /usr/bin 众多的应用程序  
  • /usr/sbin 超级用户的一些管理程序  
  • /usr/doc linux文档  
  • /usr/include linux下开发和编译应用程序所需要的头文件  
  • /usr/lib 常用的动态链接库和软件包的配置文件  
  • /usr/man 帮助文档  
  • /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里  
  • /usr/local/bin 本地增加的命令  
  • /usr/local/lib 本地增加的库

/var

可变数据文件存储在这儿。这些文件包括日志文件、MySQL 和其他数据库的文件、Web 服务器的数据文件、邮件以及更多。

/lost+found

这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里

Linux 文件系统层次结构的顶层,图源

 

在所有子目录中,粗体的目录组成了 root 文件系统的必需部分。它们(特别是它们包含的内容)必须在系统启动的时候出现,从而系统才能正确启动。剩下的非粗体的目录不需要在系统启动过程中出现,但会在之后挂载到 root 文件系统上,在开机阶段,它们为主机进行准备,从而执行有用的工作。

 

分区

 

以下作为分区的个人理解,如有不同意见,欢迎评论区交流。

 

为什么要分区?

  1. 数据安全:在不损失数据的情况下重装系统,比如独立设置 /home 挂载点,重装系统的时候直接标记回 /home,数据不会有任何损失。
  2. 效率(机械硬盘):将数据集中在某个分区,读取数据时,硬盘只会搜索相应区段,提升读取速度。

 

如何分区?

 

 

目录

建议大小

格式

描述

/

30G

ext4

根目录(必须分此区

/swap

最大8G

swap

swap目录有两个功能:1.系统休眠时将内存数据存储到 /swap上

2.内存不够时,使用 /swap 目录临时发挥 ‘虚拟内存’的作用。

注:通常,/swap大小 为内存的1~2倍。但我认为当下内存价格低廉,大于8G,直接加装内存,毕竟内存和硬盘的读取速度不可同日而语。(用到休眠功能的必须分此区

/boot

400M~1G

ext4

Linux的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;启动装载文件存放位置,如kernels,initrd,grub。(必须分此区

/home

最大剩余

空间的一半

ext4

用户工作目录;个人配置文件,如个人环境变量等;所有账号分配一个工作目录。建议分此区。

/usr

最大剩余

空间的一半

ext4

储存所安装的程序和系统的配置文件,用户的很多应用程序和文件都放在这个目录下。经常搞机的强烈建议分此区

 

 

关于/usr分区,多说一句,因为我经常搞机,重装比较多,如果单独划分 /usr分区,装完系统,直接挂载就可以使用以前的数据啦。

如果你是普通用户,可以不分此目录。但 建议把 根目录 分得大一点,其他的空间给 /home 分区。

 

其他疑问,评论区交流。

 

 

拓展阅读:

磁盘、分区及Linux文件系统 [Disk, Partition, Linux File System]

Linux各目录及每个目录的详细介绍

带你真正认识Linux 系统结构

linux一定需要文件系统吗?

低调的 Linux 文件系统家族

深入理解ext4等Linux文件系统

何为文件系统,何为根文件系统? - 蓬岸 Dr.Quest的回答 - 知乎

什么是文件系统?

诠释 Linux 中“一切都是文件”概念和相应的文件类型

网络套接字 -- 维基百科

谈谈计算机,说说文件系统 写文章

Linux 文件系统层次标准

分区

Unix/Linux的System V、BSD、Posix概念

Linux系统安装时分区的选择(推荐)

安装Ubuntu Linux系统时硬盘分区最合理的方法

Ubuntu分区方案(菜鸟方案、常用方案和进阶方案)

Linux磁盘分区的详细步骤(图解linux分区命令使用方法)

Linux交换空间(swap space)

分配swap分区swap --ArchLinux

 

 

 

参考资料:

  1. 文件系统--维基百科
  2. Arch安装指南
  3. Linux文件系统概览
  4. linux文件系统是怎么工作的?
  5. Linux下为什么要进行磁盘的分区
  6. 《Linux就该这么学》 -- 刘遄 第6章存储结构与磁盘划分
Reply Favorite View the author
All Replies
1 / 2
To page
Jack
deepin
2021-01-14 17:10
#1

大家有不同的见解可以在评论区发出来哦。

Reply View the author
sammy-621
deepin
2021-01-14 17:41
#2

非常详细,非常用心的教程,点赞!!

Reply View the author
sgb76
deepin
2021-01-14 18:19
#3

楼主辛苦了,非常用心啊!赞👍

Reply View the author
老咸鱼
deepin
2021-01-14 20:32
#4

deepin的全盘安装之所以会爆盘(/)是不是因为没有分usr分区呢?

/ 根分区才分15G也是无语,还不可调

现在百分九十的电脑都500G以上的硬盘吧

这方案分配就很.......那个人才搞的方案啊

Reply View the author
enforcee
deepin
2021-01-14 20:52
#5

做个笔记

/usr里面存放在/usr/share /usr/lib等目录的配置文件是默认的系统配置文件

因为/usr目录在软件更新经常时被覆盖,如果直接在/usr里修改配置,软件更新时不会被保留,因此自定义的系统配置文件通常在/etc

每个用户自己的配置文件在主目录的.开头隐藏文件或者~/.config里

Reply View the author
Jack
deepin
2021-01-14 20:53
#6
sgb76

楼主辛苦了,非常用心啊!赞👍

感谢老铁的持续关注,我会持续生产高质量文章的。

Reply View the author
Jack
deepin
2021-01-14 20:53
#7
sammy-621

非常详细,非常用心的教程,点赞!!

感谢老铁的持续关注,我会持续生产高质量文章的。

Reply View the author
Jack
deepin
2021-01-14 20:58
#8
老咸鱼

deepin的全盘安装之所以会爆盘(/)是不是因为没有分usr分区呢?

/ 根分区才分15G也是无语,还不可调

现在百分九十的电脑都500G以上的硬盘吧

这方案分配就很.......那个人才搞的方案啊

额,你说的爆盘是指根目录空间满了吗?

如果是的话,爆盘就是因为全盘安装分区太少了,和 /usr 分区关系没那么大。

/ 根分区 15G 空间绝对不够,我写的30G,还是考虑到把 /usr 分区分出去,如果是没有其他的分区,500G的硬盘,应当留出 80G根目录来应对以后的文件空间。

Reply View the author
Jack
deepin
2021-01-14 21:02
#9
enforcee

做个笔记

/usr里面存放在/usr/share /usr/lib等目录的配置文件是默认的系统配置文件

因为/usr目录在软件更新经常时被覆盖,如果直接在/usr里修改配置,软件更新时不会被保留,因此自定义的系统配置文件通常在/etc

每个用户自己的配置文件在主目录的.开头隐藏文件或者~/.config里

嗯嗯,是的,感谢留言补充。

Reply View the author
enforcee
deepin
2021-01-14 21:02
#10

笔记#2

现在正在推广的新目录结构中,把/lib和/usr/lib、/bin和/usr/bin等等合并成一个文件夹(即UsrMerge)

具体操作是把所有的库文件放在/usr/lib中,所有的可执行文件都放在/usr/bin中,而为了兼容考虑保留/lib和/bin作为链接文件,关联到/usr中的文件夹

https://www.freedesktop.org/wiki/Software/systemd/TheCaseForTheUsrMerge/

 

本身/usr分家是由于曾经根分区容量有限,将部分文件移动到用户分区(当时的/usr相当于现在的/home),造成的历史遗留,新的标准正在着手解决这个问题

Reply View the author
Jack
deepin
2021-01-14 21:06
#11
enforcee

笔记#2

现在正在推广的新目录结构中,把/lib和/usr/lib、/bin和/usr/bin等等合并成一个文件夹(即UsrMerge)

具体操作是把所有的库文件放在/usr/lib中,所有的可执行文件都放在/usr/bin中,而为了兼容考虑保留/lib和/bin作为链接文件,关联到/usr中的文件夹

https://www.freedesktop.org/wiki/Software/systemd/TheCaseForTheUsrMerge/

 

本身/usr分家是由于曾经根分区容量有限,将部分文件移动到用户分区(当时的/usr相当于现在的/home),造成的历史遗留,新的标准正在着手解决这个问题

大佬,学到了。

Reply View the author
bxkdhao
deepin
2021-02-04 21:16
#12

学到了,下次装系统手动分区,就不全盘安装了。希望安装系统的手动分区界面能有这样的分区提示

Reply View the author
浪云
deepin
2021-02-05 22:43
#13

可以说说,一开始没分区,吼啦你想分区出home和usr,该怎么操作?

最好有详细步骤

Reply View the author
Jack
deepin
2021-02-05 23:13
#14
浪云

可以说说,一开始没分区,吼啦你想分区出home和usr,该怎么操作?

最好有详细步骤

deepin默认安装方式是全盘安装,没有那么多分区的,想要在已经有的电脑上加上 /home 和/usr分区,只能重装系统,重新分区。

另外,你说话的方式让人很不舒服,互联网是免费的,知识是开源的,但这并不意味着我有义务给你解答问题,想要知道过程,自行百度。

Reply View the author
浪云
deepin
2021-02-06 01:12
#15
Jack

deepin默认安装方式是全盘安装,没有那么多分区的,想要在已经有的电脑上加上 /home 和/usr分区,只能重装系统,重新分区。

另外,你说话的方式让人很不舒服,互联网是免费的,知识是开源的,但这并不意味着我有义务给你解答问题,想要知道过程,自行百度。

打错了

 

吼啦你 换成 如果

Reply View the author
191******64
deepin
2021-02-08 23:50
#16

今天按照楼主的方法重新安装了系统,但是有几个问题想要请教一下:

1. 安装的时候提示: /boot 目录需要至少1.5G的空间,比楼主建议的400M~1G要大,不知道是楼主不小心打错了,还是我的系统安装有问题。

2. 分区的时候,有/usr/xxxx(我忘了名字是啥了),没有单独的/usr. 我安装的时候愣了一下,然后就把那个当作是/usr分区了。

3. 最后一个问题是,如果将来我要重新安装系统的话,直接重新安装/根目录就行了吗?其他的盘不用管吗?还是有啥特别操作?

谢谢

Reply View the author
bxkdhao
deepin
2021-02-09 02:25
#17

Reply View the author
Jack
deepin
2021-02-09 05:53
#18
191******64

今天按照楼主的方法重新安装了系统,但是有几个问题想要请教一下:

1. 安装的时候提示: /boot 目录需要至少1.5G的空间,比楼主建议的400M~1G要大,不知道是楼主不小心打错了,还是我的系统安装有问题。

2. 分区的时候,有/usr/xxxx(我忘了名字是啥了),没有单独的/usr. 我安装的时候愣了一下,然后就把那个当作是/usr分区了。

3. 最后一个问题是,如果将来我要重新安装系统的话,直接重新安装/根目录就行了吗?其他的盘不用管吗?还是有啥特别操作?

谢谢

1. 我的妈呀,现在折磨恐怖了吗?deepin15的时候要300m,现在直接1.5G,可怕可怕。我现在/boot分区 300m装了3个系统,1.5G这是要装多少系统?个人认为没有必要。但是深度这样做啦,只能最小1.5G了。以后有机会重新试一下,如果真的/boot 目录有1.5G这是系统设计的问题。

2. 你说的应该是 /usr/local 分区,这个是装系统级软件的分区,如果不是专业用户,用不到这个功能。你的操作没有错。

3. 是的,以后重装系统 直接重装根分区就行,其他的分区直接挂载,资料不会丢失。不过,一些需要系统依赖的应用,因为根分区清除,可能无法继续使用。

Reply View the author
Jack
deepin
2021-02-09 05:53
#19
bxkdhao

学到了,下次装系统手动分区,就不全盘安装了。希望安装系统的手动分区界面能有这样的分区提示

嗯嗯,下次装系统可以尝试一下。

Reply View the author
191******64
deepin
2021-02-09 22:30
#20
Jack

1. 我的妈呀,现在折磨恐怖了吗?deepin15的时候要300m,现在直接1.5G,可怕可怕。我现在/boot分区 300m装了3个系统,1.5G这是要装多少系统?个人认为没有必要。但是深度这样做啦,只能最小1.5G了。以后有机会重新试一下,如果真的/boot 目录有1.5G这是系统设计的问题。

2. 你说的应该是 /usr/local 分区,这个是装系统级软件的分区,如果不是专业用户,用不到这个功能。你的操作没有错。

3. 是的,以后重装系统 直接重装根分区就行,其他的分区直接挂载,资料不会丢失。不过,一些需要系统依赖的应用,因为根分区清除,可能无法继续使用。

多谢答复。

 

PS:

按照楼主的方法重装系统之后,win下就可以看到这种现象,有意思有意思~

Reply View the author
1 / 2
To page