4-文件系统简介
本文简要介绍一下Linux的文件存储系统,inode,文件目录结构等内容。
Linux最基础的设计理念之一就是 一切对象皆文件。所有的目录、文件、命令、设备等,在Linux看来都是文件,这些文件被拆分为若干的基本存储单元,存放在磁盘的不同物理地址上,并具有特定的读写执行权限。
文件类型
在终端输入ls -al
命令可以查看当前目录内的所有文件的详细信息。其中,第一个字母是文件类型,常见的文件类型如下:
-
:普通文件,也就是纯粹的文本文件。d
:目录(Directory)文件。操作系统会用处理目录文件的方式处理这类文件,而非直接把纯粹的文本展现出来。l
:软链接(Link)文件,相当于Windows系统下的链接文件。例如有个可执行文件
test
,那么可以使用ln -s test test.s
来生成链接至test
的软链接文件test.s
。执行test.s
就是在执行test
。b
:块设备(Block)文件,就是存储数据的设备,简单来说就是硬盘。c
:字符设备(Character)文件,主要有鼠标、键盘、显示器、打字机等。因为这些设备是以字符的方式进行数据传输的,所以叫做字符设备文件。p
:管道(Pipe)文件,用于进程间通信。s
:套接字(Socket)文件,用于网络通信。
文件系统
文件是依靠文件系统来管理的,常见的文件系统有Ext2
,Ext3
,Ext4
,JFS2
,XFS
等。
文件存储相关概念
磁盘
就是用来存储数据的硬盘,是长期存储数据的硬件。
分区
可以被当做独立空间使用的物理磁盘的一部分,这是 软件层面 上的概念,操作系统是可以设置的。
磁盘的分区可以分为 主分区 和 扩展分区 两种:
- 主分区:在分区后就可以被马上使用,例如Windows的C盘。
- 扩展分区:要继续划分才能使用,继续划分出来的就叫做逻辑分区。在Windows中,扩展分区可以被继续划分为D、E盘等,这些盘被称为逻辑分区。
为什么要分区,分区有诸多好处:
- 有利于管理:
- 操作系统系统一般单独放一个区(主分区),这个区由于只放操作系统相关文件,产生的磁盘碎片较少,系统也就比较稳定。
- 软件放一个区,软件的升级、安装与卸载会产生磁盘碎片。单独将软件放一个分区有利于管理软件,也易于整理磁盘碎片。
- 多媒体相关内容/设备最好再放一个区,这些设备对硬件都会有一些损坏,即使程度很低。
- 多个分区会相对更安全一点,即使一个分区发生损坏,其他分区也不会受到较大的影响。
对于Linux系统,它的分区是隐藏的,只有一个根目录/
。这是因为Linux的目录其实是分区的 逻辑映射,每个分区可以作为一个目录载入到Linux的文件系统中,根目录也是一个分区的映射。
可以使用df
命令查看分区情况:
zeroize@client:~/Desktop$ df
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 396356 1968 394388 1% /run
/dev/sda3 40453376 13917156 24449104 37% /
tmpfs 1981768 0 1981768 0% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
/dev/sda2 524252 6220 518032 2% /boot/efi
tmpfs 396352 96 396256 1% /run/user/1000
一般来说分区有/boot
,/home
,/var/log
,swap
等,至少要有/
和swap
分区。对于swap
分区,当内存不够时,可以将部分数据存放在swap
分区中。
如果需要操作分区,可以使用fdisk
命令。例如可以用fdisk -l
列出所有分区的情况:
zeroize@client:~/Desktop$ sudo fdisk -l
Disk /dev/loop0: 4 KiB, 4096 bytes, 8 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
......
硬件设备
在上面发现多个/dev/*
的文件名,这些都是硬件设备:
- IDE硬盘:
/dev/hd[a-d]
。例如第一个IDE设备是hda
,它可以分区为hda1
,hda2
等。 - SCSI/SATA/USB硬盘:
/dev/sd[a-p]
。 - 光驱:
/dev/cdrom
。 - 软盘:
/dev/fd[0-1]
。 - 伪设备:
/dev/loop[n]
。对于虚拟机来说,很多设备都是模拟出来的,所以虚拟机上伪设备很多。
块
块(Block)是文件系统读写,存放数据的最小单元,可以自己设置大小(1kbyte, 2kbyte, 4kbyte)。每个块只能存放一个文件的数据,如果文件大于块的大小,就会用多个块来存储该文件;如果文件小于块的大小,当前块也只能被该文件占用,剩余空间不会被再使用。
块是软件层面的概念,它是文件系统的一个概念,因此可以被设置大小。如果块太大,会导致空间浪费严重;如果块太小,会导致块数量变多,影响效率。
扇区
磁盘控制器每次对磁盘读写的最小单位,一般为512byte。
扇区是硬件层面的概念,扇区大小是硬件厂商设定的,用户无法更改。
inode
是Linux系统的一个非常重要的设计,它 将文件的属性、权限等信息与文件实际数据分开存储。inode用来记录文件的属性,一个文件占用一个inode,同时记录该文件数据所存储的块。
Linux系统读取文件的过程:操作系统通过文件名称找到对应的inode,再通过inode找到文件真正存储的block。然后磁盘控制器开始读取block对应的扇区,磁盘读取到的数据达到一个block,就传输到内存中。
可以认为inode就是一个文件索引,它具有如下属性:
- 文件的权限:读、写、可执行
- 文件所有者,所属组
- ctime,atime,mtime
- 文件数据存储的位置
- ……
注意,文件的名称不存储在inode中,而是存储在所属的目录文件中。也就是说文件的名称本身就是目录文件的数据,文件的名称正是文件inode的索引。
文件目录结构
LInux的文件系统为倒树状,根目录存放众多目录文件的名称,可以根据这些目录文件的名称打开下一级目录,直至找到我们想要的文件。
常用的目录如下:
/bin/
:存放二进制可执行文件(Binary),也就是存储普通用户用到的命令。/dev/
:设备文件(Device)目录,对应硬件的文件就存储在这里。/etc/
:配置文件目录,但并不是所有配置文件都存放在/etc/
中。/usr/
:存放 各种软件资源(Unix Software Resource) 的目录,不是存放用户信息的目录。/home/
:各个用户的工作目录。/var/
:存一些日志。/lib/
:存一些安装包、头文件、运行库等。/proc/
:存一些进程相关的信息。
参考资料
- Linux系统编程 - 飘零的落花
- Linux基础课 - Acwing