文件存储系统
介绍
linux最基础的设计理念之一就是: 一切对象皆文件。
所有的目录, 文件, 命令, 设备等, 在linux系统看来都是文件
设备也被linux系统抽象为文件, 操作设备对应的文件就是在操作设备
这些文件被拆分为若干的基本存储单元, 存放在磁盘的不同物理地址上, 并具有特定的读写, 执行, 权限。
文件类型
普通文件 (-)
纯粹的文本文件
目录文件 (d)
directory的首字母。操作系统会用处理目录文件的方式处理这类文件, 而非直接把纯粹的文本展现出来, 以下的文件同理。
软链接文件 (l)
link的首字。就相当于windows系统下的链接文件。至于实现原理这节课一会儿大家就明白了。
块设备文件 (b)
block的首字母。就是存储数据的设备, 简单来说就是硬盘了
字符设备文件 (c)
character的首字母, 主要有鼠标, 键盘, 显示器, 打字机等。因为这些设备是以字符的方式进行数据传输的, 所以叫做字符设备文件。
管道文件类型 (p)
pipe的首字母, 管道文件这里这需要知道有这么个东西就可以了, 在进程间通信部分有详细解释
套接字文件类型 (s)
socket的首字母, 具体有什么功能下一课再讲。
文件系统
常见的文件系统有ext2, ext3, ext4 等(知道有这些名字就可以了, 具体的不用管)。
在硬盘中依旧储存的是纯粹的字符 但是这些文件系统会把这些字符解析为目录
不管采取哪一种文件管理系统, 文件在磁盘上的存放机制是一样的。
磁盘
就是用来存储数据的硬盘, 大部分人应该都见过, 没见过也无所谓, 知道这是个用来长期存储数据的硬件就可以了。
分区
可以被当做独立空间使用的物理磁盘的一部分。这是一个软件的概念, 操作系统是可以设置的。
- 硬盘的分区可以被分为主分区和扩展分区两种。
- 主分区在分区后就可以马上使用, 在windows中, 就是C盘了。
- 扩展分区必须继续划分才可以继续使用, 继续被划分出来的就叫做逻辑分区。
- 在windows中, 扩展分区就可以被继续划分为D盘, E盘, F盘等。D盘, E盘, F盘等也被称为逻辑分区。
分区原因
为什么要分区?直接把硬盘当做一个区不好吗? 理论上可以不分区, 但分区有诸多好处
- 系统一般单独放一个区, 这个区由于只放系统, 产生的碎片很少, 系统也就比较稳定。
- 软件放一个区, 软件的升级, 安装或卸载会产生碎片。这样比较容易管理软件, 也比较容易整理碎片。
- 多媒体设备最好再放一个区, 这些设备对硬件都会有一些损坏, 虽然程度很低。
- 多个分区, 会比较安全, 即使一个分区损坏, 其它分区也不会受到太大的影响。
硬件设备的文件名
| IDE硬盘 | SCSI/SATA/USB硬盘 | 光驱 | 软盘 | 鼠标 | 伪设备 |
|---|---|---|---|---|---|
| /dev/hd[a-d] | /dev/sd[a-p] | /dev/cdrom | /dev/fd[0-1] | /dev/mouse | /dev/loop[n] |
看上去设备这么多, 实际上大家只要记住几个就可以了。
- hd系列: 第一个IDE设备被称为hda, 第二个IDE设备被称为hdb。hda作为硬盘也可以分区, 就可以分为hda1, hda2等。
- 伪设备系列: 对于虚拟机来说, 很多设备都是模拟出来的, 所以伪设备自然很多。
分区操作
分区有很多, 我们可以用df命令来查看分区。
通常需要/boot分区, /home分区, /var/log, swap分区。当然, 这也没什么硬规定。
一般来说至少有两个分区, "/"分区和swap分区。对于swap分区, 当内存不够时, 可以将部分数据存放在swap分区中。
如果我们要操作linux分区, 可以使用fdisk命令。fdisk命令即使对于专业的运维来说, 仍然属于比较复杂的命令。
总的来说, 分区操作大家有个基本概念就可以了, 这些对于运维来说才是核心。
扇区
磁盘控制器(具体是什么不用管, 只要知道这是一个读取磁盘的硬件设备就可以了)每次对磁盘进行读写的最小单位, 一般为512byte。 注意: 扇区是一个硬件级别的概念, 扇区的大小是硬件厂商设定的, 我们无法更改。
块
一次读取一个扇区效率太低了 因此便有了block的概念 block是一个软件级概念。文件系统读写, 存放数据的最小单元, 可以自己设置大小, 一般只能设置1kbyte, 2kbyte, 4kbyte, 其中4k byte居多。每个block只能存放一个文件的数据, 如果文件大于block的大小, 则该文件会占据多个block。如果文件小于block的大小, 也会完全占用该block, block剩余的空间不会再被使用。
注意: 块是一个软件级别的概念, 它是文件系统的一个概念, 所以块的大小我们是可以设置的。所以, block如果设置太大, 会导致空间浪费严重, 如果设置太小, 会导致block太多, 会影响效率。
block的大小一般也不需要我们自己去设置, 使用默认大小就可以了。
比如一个文件4kb 块也是4kb 一个扇区 512byte 那你就读取8个扇区 然后这8个是一个块 一次读取整个块
inode
linux系统一个非常重要的设计, 将文件的属性, 权限等和文件实际数据分开存储。
前面的磁盘, 分区, 块, 扇区是所有操作系统都有的概念, 而inode windows系统没有
inode用来记录文件的属性, 一个文件占用一个inode, 同时记录该文件数据所存储的block
可以认为inode就是一个文件索引, inode具有以下属性
- 文件的权限: 读, 写, 执行
- 文件所有者, 所属组
- ctime, atime, mtime
- 文件数据存储的位置 其实还有很多, 但那些不重要, 没必要去在意。
注意: 文件的名称不存储在inode中, 文件的名称存储在目录文件中, 也就是说文件的名称本身就是目录文件的数据, 文件的名称正是文件inode的索引。
读取文件的过程
- 操作系统通过文件名称找到对应的inode
- 再通过inode找到文件真正存储的block
- 然后磁盘控制器开始读取block对应的扇区
- 磁盘读取到的数据达到一个block, 就传输到内存中
- 这样以操作系统系统的角度来看, block就成为了文件系统读写文件的最小单元。
文件目录结构
linux的目录结构不同于windows, windows的分区一眼就能看出来, 比如C盘, D盘, E盘, 而linux只有一个目录, 分区是隐藏的。
这其实是因为linux的目录只是分区的逻辑映射, 每个分区可以作为一个目录载入到linux的文件系统中
其实根目录也就是一个分区的映射。这些目录就像windows的快捷方式, 指向真正存储数据的分区。
linux的文件系统为倒树状,根目录存放着众多目录文件的名称,我们可以根据这些目录文件的名称打开下一级目录,以此类推,我们可以打开linux系统的任何一个文件。
很多目录如果没有对应工作场景,记起来就非常困难。但实际上常用的目录就这么几个。
bin目录
binary的简写,linux一切皆文件,bin目录中存放的就是普通用户可以使用的命令。二进制的可执行指令就是命令
dev目录
device的简写,设备文件目录,对应硬件的文件就存储在这里
etc目录
配置文件目录,这个目录很常用,但是新手常常对配置文件的工作方式感到疑惑,而且并不是所有的配置文件都存放在etc目录中。
usr目录
unix software resource的简写,usr可以说是linux最重要的目录了,各种软件资源都要往这里放。
