Linux操作系统之文件系统详解
Posted 欢喜躲在眉梢里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux操作系统之文件系统详解相关的知识,希望对你有一定的参考价值。
目录
Linux内核中的五大子系统
CPU:
① 进程调度
② 进程通信
进程通信的方式:管道(匿名管道、命令管道)、消息队列、信息、信号量、共享内存、socket(文件socket、网络socket)
③ 内存管理:内存
④ 网络接口:网络
⑤ 文件系统
共享内存:为了在多个进程之间交换信号,内核专门留出一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间(逻辑上感觉是自己的私有地址空间,其实物理上是内核预留出的内存空间)进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高了效率。
信号量:是一个计数器(让分组好的一组先访问,另一个组后访问)(一个组产生日志,一个组消费日志)。用于多进程对共享数据的访问,信号量的意图在于进程间的同步,为了获得共享内存。
文件系统知识点框架图如下所示:
1、文件系统的基本组成
文件系统是操作系统中负责管理持久数据的子系统,实际上,就是将用户的文件存放在磁盘硬件中,即使计算机断电了,磁盘里的数据并不会丢失,所以文件系统就可以持久化的保存文件。
文件系统是管理文件和目录的一套机制(方法)。文件大小为2T,ext3:不超过2T;fat32:4G。
文件系统的基本数据单位是文件,它主要是对磁盘上面的文件进行组织管理,组织的方式不同,形成的文件系统也会不同。
在Linux中,一切皆文件,不仅普通的文件和目录,块设备、管道、socket等等,都是由文件系统管理的。在Linux中的文件系统会给每个文件分配两个数据结构:索引节点(index node)和目录项(directory entry),它们都主要是被用来记录文件的元信息和目录层次结构。
- 索引节点,inode,用来记录文件的元信息,比如inode编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等。索引节点是文件的唯一标识,它们之间一一对应,也同样都是被存储在硬盘当中,索引节点也是会占用磁盘的存储空间的。
- 目录项,dentry,用来记录文件的名字,索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但是它与索引节点不相同的是,目录项是由内核维护的一个数据结构,不是存放咋磁盘中,而是缓存在内存里面。目录项包括文件名和inode节点号。
- inode映射表:inode bitmap:位图:记录着哪些inode使用了,哪些没有使用。
- block映射表:block bitmap:记录着哪些block使用了,哪些没有使用。
其中,目录也是文件,也是用索引节点唯一标识,和普通文件不同的是,普通文件在磁盘里面保存着的是文件数据,而目录文件在磁盘里面保存子目录或者文件。
1、目录和目录项分别指的是什么?
目录是一个文件,它是被持久化的存储在磁盘里面,而目录项是内核中的一个数据结构,缓存在内存里面。
如果查询目录就会频繁的从磁盘读取,效率会很低,所以内核就会把已经读过的目录用目录项这个数据结构先缓存在内存里面,等到下次读取到相同的目录的时候,就只需要从内存里面去读取,这样就大大提升了文件系统的效率。
2、文件数据是如何存储在磁盘空间的?
磁盘读写的最小单位是扇区,扇区的大小只有512B的大小,如何每次读写的时候都是这么小的单位,会导致读写的效率非常低。
所以,文件系统就把多个扇区组成了一个逻辑块,每次读写的最下单位就是逻辑块(数据块),Linux中的逻辑块的每个块的大小为4KB,也就是一次性可以读取8个扇区,这将会大大提高了磁盘的读写效率。
索引节点是存储在硬盘上的数据,为了加速文件的访问,通常会把索引节点加载到内存当中。
当磁盘进行格式化的时候,会被分成三个存储区域,分别为超级块、索引节点、数据块区。
超级块:superblock,用来存储文件系统的详细信息,包括inode/block的总量、使用量、剩余量(块个数、块大小、空闲块等),以及文件系统的格式。
- dumpe2fs: 超级块中的幻数有错 尝试打开 /dev/sdb1 时
- 找不到有效的文件系统超级块。 /dev/sdb1 有一个 xfs 文件系统
索引节点区:用来存储索引节点。
数据块区:用来存储文件或目录数据。
我们不可能把超级块和索引节点区全部加载到内存在,这样内存是撑不住的,所以只有当需要使用的时候,才会将它加载进内存,它们加载进入内存的时机是不同的。
超级块:当文件系统挂载时进入内存当中;
索引节点区:当文件系统被访问时进入内存中。
2、常见文件系统的类型
1、硬盘的文件系统:file system
xfs(主流)
ext4---centos6
ext3---centos5
2、网络文件系统
nfs:network file system
tfs:taobao file system;淘宝内部使用的专门用来存放淘宝的图片和文件的文件系统,分布式的
gfs:google存放搜索数据存放的文件系统。分布式
hdfs:Hadoop file system
其中的ext4和xfs文件系统的区别:xfs的使用比ext4好。
xfs是一个全64-bit的文件系统,可以支持上百万T字节的存储空间。对于特大文件及小尺寸文件的支持都表现很出众,支持特大数量的目录。最大可支持的文件大小为263=9x1018=9exabytes,最大文件系统尺寸为18exabytes。
xfs支持大文件和大分区。读写文件速度快。
/boot:ext4:/boot分区本来就不大,文件都是小文件,启动的时候,应该是ext4的驱动加载更加快速。
- 单个文件的大小:ext4可以是16GB到16TB,而XFS可以是16TB到 8 exbibytes 的最大文件大小。
- 最大文件系统大小:
- ext4存放在/boot下面可以是1EB,而xfs可以是8EB。
- EXT4受限于磁盘结构和兼容问题,可扩展性和scalability不如XFS。
===扩展====
开机不自启服务
/etc/systemd/system/multi-user-target.wants 把服务启动的配置连接文件删除
systemctl disable firewalld 关闭防火墙
设置开机自启:
systemctl enable firewalld
[root@localhost ~]# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
lsof -i :80 查看端口占用情况
lsof -p 1055 查看当前进程打开了哪些文件
lsof 列举出当前系统所有的打开文件
查看cpu内核参数: cat /proc/cpuinfo
======
3、交换分区的文件系统:swap
[root@sc-fs software]# cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
[root@sc-fs software]# swapoff -a
[root@sc-fs software]# cat /proc/swaps
Filename Type Size Used Priority
[root@sc-fs software]# swapon -a
[root@sc-fs software]# cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
扩展和减少swap分区的大小:
[root@sc-fs software]# swapon /dev/sdd2
[root@sc-fs software]# cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
/dev/sdd2 partition 10485756 0 -3
[root@sc-fs software]# free -m
total used free shared buff/cache available
Mem: 1829 133 1424 10 271 1518
Swap: 12287 0 12287
[root@sc-fs software]# swapoff /dev/sdd2
[root@sc-fs software]# free -m
total used free shared buff/cache available
Mem: 1829 126 1431 10 271 1525
Swap: 2047 0 2047
Linux文件系统经典分区方案:
1、标准分区:centos8经典方案:
/ 剩下的空间全备给根分区
/boot Linux 里面存放的是启动、驱动以及grub文件。1000M左右--用来存放启动系统所需要的文件,相当于Windows里的硬盘。
/swap 交换分区,当物理内存不足(物理内存的2倍)的时候,启动磁盘上的交换分区来做内存使用(用来临时存放数据)。一般不建议开启,因为会导致程序速度变慢。swap还存在磁盘上面,把它错当做内存来使用。当内存不足的时候,就会开启一片空间:swap,将磁盘当做内存使用,swap速度会变慢。
/home 单独的分区。
/lib 里面存放很多库,很多服务的库。
/proc 里面存放很多运行的进程、系统程序(proc/sys/vm:管理内存的),以进程号作为目录名
2、自定义方案:
/ xfs 剩下的空间
/boot ext4 1G 不需要特别大的空间
swap swap 物理内存的2倍
/mysql_date xfs 200G 专门存放数据库的数据的分区
① 设置swap,什么时候触发swap分区的使用: 当物理内存只剩30%的时候就会启动swap交换分区
[root@localhost ~]# cd /proc/sys/vm 正在运行的sys系统vm与内存相关virtual memory虚拟内存
[root@localhost vm]# cat swappiness
30 #当物理内存只剩30%的时候就会启动swap交换分区
修改设置为当物理内存用尽的时候启动交换分区。
[root@localhost vm]# cat swappiness#当物理内存用尽的时候启动交换分区
0
[root@localhost dev]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
/etc.sysctl.conf:存放的是内核参数。
[root@localhost etc]# cd /proc/sys
[root@localhost sys]# ls
abi crypto debug dev fs kernel net user vm
如果要修改里面的参数,就进入/etc/sysctl.conf文件加入以下:
net.ipv4.ip_forward = 10 路由转发 根据路径修改(修改的是/etc/prpc/sys/net/ipv4下的ip_forward)
vm.swappiness =10
[root@localhost vm]# sysctl -p #####使修改的参数生效
net.ipv4.ip_forward = 10
vm.swappiness = 10
[root@localhost vm]# cat swappiness ###查看是否生效
10
临时关闭:磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载。
[root@localhost vm]# cat /etc/fstab
[root@localhost vm]# free -m # swap处于开启状态
total used free shared buff/cache available
Mem: 972 196 583 7 192 601
Swap: 2047 0 2047
[root@localhost vm]# cat /etc/fstab
............
/dev/mapper/centos-root / xfs defaults 0 0
UUID=0615b8e8-3e85-45eb-9b7d-4f7e08a00eac /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
UUID=e0b23637-b723-4680-8d8c-a6f4238095e8 /mount xfs defaults 0 0
UUID=f9acf10e-e259-4995-8526-93270f658d96 /mount1 xfs defaults 0 0
UUID=8ecd11ac-a55e-4709-9a0d-19da5207f1bb /mount2 xfs defaults 0 0
UUID=7d44e927-00d2-43b6-823a-89d9e6e30478 /mount1/hyrz ext4 defaults 0 0
UUID=96da6031-ac65-4754-8453-56c8d4c21959 /mount2/hzw ext4 defaults 0 0
使用swapoff命令;进行关闭swap交换分区。
[root@localhost vm]# swapoff /dev/mapper/centos-swap
[root@localhost vm]# free -m 查看是否被关闭
total used free shared buff/cache available
Mem: 972 195 584 7 192 602
Swap: 0 0 0
swapon -a : 开启swap
[root@localhost vm]# swapon -a
[root@localhost vm]# free -m
total used free shared buff/cache available
Mem: 972 196 583 7 192 601
Swap: 2047 0 2047
永久关闭:可以修改配置文件: /etc/fstab,将里面的/dev/mapper/centos
swap swap swap defaults 0 0 : swap 行注释掉。
[root@localhost vm]# vim /etc/fstab
[root@localhost vm]# free -m 查看是否被关闭
total used free shared buff/cache available
Mem: 972 194 584 7 192 602
Swap: 0 0 0
4、 临时文件系统:tmpfs:内存
5、 iso9660 :光盘中
需要提前将光盘放入到光驱当中。
6、虚拟的文件系统层VFS
1、什么是虚拟文件系统VFS
文件系统的种类很多,而操作系统为了实现对用户提供一个统一的接口,于是在用户层与为文件系统层引入了中间层,这个中间层就被称为虚拟文件系统。
VFS定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解VFS提供的统一接口就可。
虚拟文件系统在文件系统挂载之后,将文件系统的一些元数据加载到内存中,虚拟文件系统只存在于内存中,VFS作用就是屏蔽给各类文件系统的差异,给用户、应用程序一个统一的接口。
2、虚拟文件系统使用的方式?
VFS描述文件系统使用的是超级块和inode的方式。
在文件系统挂载之后,将文件系统Linux可以同时支持多种文件系统。我们接触到的虚拟文件系统,VFS。虚拟文件系统有的超级块真实文件也有,只是有差异。
在Linux文件系统中,用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间的关系为:
3、VFS主要定义了四种对象类型
1、超级块对象:super block
2、记录文件系统的总体信息:inode数量、block数量
3、索引节点:inode,里面包含了文件的元信息、字节数、所属主和组、权限、修改、创建时间、block的位置、文件对象file、目录项对象dentry、filename inode号。
磁盘文件系统格式化之初,就会将磁盘大体上分为两个部分,一个存放inode索引的,一个存放数据的inode实在文件系统初始化之初就已经存在的。
先去调用虚拟文件中的super block,记录了文件系统中的super block,然后导入到真实的文件系统中,ext4和xfs两种文件类型中都有自己的super block。
Superblock backups stored on blocks: #3#backups superblock的备份
32768, 98304, 163840, 229376, 294912
[root@localhost vm]# dumpe2fs /dev/sdc4
磁盘进行格式化之后分为两个区:一块存放文件元数据的:inode;一块存放真正的数据:block。
查看超级块内容:
查看ext4文件系统信息:
[root@nginx-filebeat-01 ~]# dumpe2fs /dev/sdb2|more
查看 xfs文件系统信息:
[root@nginx-filebeat-01 ~]# xfs_info /data
查看文件信息:stat a.tx
4、磁盘、硬盘详解
disk磁盘,磁盘和硬盘有什么区别?还有u盘、移动硬盘?
1、主体不同:
① 磁盘:利用磁记录技术存储数据的存储器。
② 硬盘:是计算机最主要的存储设备。
2、范围不同:
① 磁盘:是计算机主要的存储介质,包括软盘和硬盘。
② 硬盘:属于磁盘的一种,采用温彻斯特式结构。
3、发展不同:
① 磁盘:软盘已经被淘汰,磁盘也正在别固态硬盘所取代。
② 发展为固态硬盘跟机械硬盘相结合。
硬盘的分类:
固态硬盘:类似于磁盘、ssd固态硬盘(价格贵)、读写速度快、本质是半导体存储、抗震、大容量小。
ssd固态硬盘就是把磁存储改为集成电路存储。集成电路存储即固态存储靠的是电路的扫描和开关作用将信息读出和写入,不存在机械动作。固态硬盘内主体其实就是一块PCB板,而这块PCB板上最基本的配件就是控制芯片,缓存芯片和用于存储数据的闪存芯片。
机械硬盘:(类似于唱片机、触摸是震动的)、机械运转、价格便宜、本质是电磁存储、怕摔、大容量大。读写速度低于固态硬盘。
硬盘是磁盘中的一种,软盘也是磁盘。磁盘就是通过磁性进行读写功能的设备,断电后保存的文件不会丢失。内存也可以储存,但存储的载体和磁盘不同,断电后就不能保存数据。
U盘也可以储存数据但也和磁盘不同。
接口:硬盘接口是硬盘与主机系统之间的连接部件,作用就是在硬盘缓存和主机内存之间传输数据。不同硬件接口决定着硬件与计算机之间的连接速度,在整个系统中,硬盘接口的优劣直接影响着程序运行快慢和系统性能的好坏。
接口的分类:
- IDE
- SCSI SCSI(小型计算机设备接口),接SCSI硬盘,一般用于服务器上。
- SATA SATA接口, SATA3.0 600MB/S
- SAS 串行SCSI(SAS:Serial Attached SCSI)是一种电脑集线的技术,其功能主要是做周边零件的数据传输。
- 光纤通道:光纤通道现能支持的最高速率是8Gbit/s以上,1000MB/s左右isp主流运营商。
磁盘的物理概念:磁盘的结构
- 磁头 :header,磁头数,每个盘区一般都有上下面,分别对应1个磁头,共2个磁头。
- 磁道:track--63个扇区;磁道数,磁道是从盘片外圈往内圈编号0磁道,1磁道。靠近主轴的同心圆用于停靠磁头,不存储数据。
- 柱面:cylinder--不同盘片上的相同磁道组成。柱面数,同磁道数量。
- 扇区:sector 512个字节 --最小物理存储数据的单元。扇区数,每个磁道都被切分成很多扇形区域,每道的扇区数量相同。
- 圆盘:圆盘数,就是盘片的数量。
逻辑上的概念:
- 块
- 分区
5、磁盘的分区管理
1、主分区:可以引导操作系统,基本磁盘上可以建立一到四个主分区。
2、扩展分区:如果需要超过4个小时分区,就可以将剩余空间作为一个扩展分区。扩展分区会占用一个主分区的位置。
3、逻辑分区:扩展分区不能直接存储文件:需要再划分逻辑分区使用。
Linux中将硬盘、分区等设备都表示为文件。
Linux中分区的查看:
scsi接口盘一般是以sd开头的。
ide接口的盘:hd开头。
虚拟云磁盘:vd开头。
7、 windows里的文件系统
fat32:淘汰了。
ntfs:主流。微软的专利技术。new technology file system
8、内存的文件系统
内存的文件系统不是将数据存储在硬盘中,而是占用内存空间的,我们经常用到的/proc和/sys文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据。
/proc:表示正在运行的程序、系统,以及当前主机的一些硬件情况。
/proc/cpuinfo:cpu的使用情况
/proc/meminfo:内存的使用情况
3、文件系统实现的功能
对磁盘里的文件进行管理:新建、删除、修改、移动、重命名。
问题:
1、删除一个小文件2k快,还是删除一个大文件2T快,还是一样的快?
删除小文件快,因为小文件和大文件里都含有一个inode和目录项,然后会有很多个block,所以很大的区别在于:block里面存储的某个分区新建文件的时候,提示没有磁盘空间,df查看是还有空间的,文件系统就相当于一个社会制度。
2、删除一个文件删除了哪些东西,为什么数据可以恢复?
删除了目录项,把inode映射表里使用的inode标志位未使用,把block映射表里的block标志为未使用。inode没有删除;block没有删除。
删除文件之后,要马上停止新建文件操作,最好是关机,使用恢复软件去恢复。
文件系统里有日志--会去记录磁盘的相关操作,可以找回目录项等信息。
文件=目录项+inode+数据块(block)
3、inode的数量比例和block数量比例不一致 ,一般inode的数量会少一点。如果你的系统里面小文件过多,会造成你的inode耗尽 你的block明明还有磁盘空间 但是创建不了文件了?
将其进行标注,使用的标注为使用,未使用的标注为未使用,如果文件已经不存在,直接将其写成0。删除文件时没有删除数据,只是将其覆盖。
4、文件系统的工作流程
1、文件系统工作流程:一个盘在进行格式化的时候,一开始就会自动的分为两个区,一个区是存放inode,一个区存放block真正的文件系统。inode去存放文件的属性相关的信息,block存放去存放真正的数据的内容。初始化的时候会创建一个super block,这个就相当于一个block,这个block里面保存的信息是整个盘的信息(比如用dumpe2fs /dev/sdc4|less 查看到的信息都是来自于super block,整个盘的信息,super block都有备份),super block中存放的的inode的数量、block的数量,使用了多少、还剩多少,具体系统调用,操控虚拟文件系统的super block,虚拟文件系统的super block最终是要落地到真实的文件系统super block(到系统调用之后的是系统进行管理)。
查找一个文件首先是通过文件的路径找到相对应目录项信息,通过目录项知道它的inode号,通过inode号找到它inode table中的inode位置(inode里面存放了block位置、文件的元信息、所属的主和组等信息)信息可以通过stat命令查看:(stat a.txt),inode中有block的位置,其中记录了你真正存放数据的位置,然后通过其中的指针找到block,然后读取里面的数据内容。删除文件的时候,会将目录项删除。
文件夹也是文件,只不过里面保存的都是要放在这个文件夹里面的文件对应的目录项。
2、文件系统如何读取到文件:
- 1、根据文件名通过目录项知道它的inode号。
- 2、通过inode号找到inode table里的inode(位置)
- 3、通过inode里的block指针,找到对应的数据块。
df -i +文件: 查看具体文件的inode号。
3、inode的管理 block的管理
- 哪些是空闲的 ,哪些是使用了的。
- inode位图 使用了标注1 没有使用的标注为0
- block位图。
[root@localhost boot]# df -i 查看文件的i_node号
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
访问文件系统的流程图解:
3、如果一个程序在对某个文件进行读写,进程里有文件描述符,文件描述符里记录了文件具体的存放的路径,不需要通过目录项去找具体的位置了。
[root@sanchuang jd]# cat file_write.py
with open("nginx.log","a+") as f:
while True:
f.write("hello,world,sanchuang \\n")
[root@sanchuang jd]# python3 file_write.py
4、移动文件:只是把目录项改变到其他的目录里,inode和block的位置没有发生变化。
5、文件的使用
我们对文件的使用,是通过系统来调用来打开一个文件。
fd = open(name,flag);打开文件
write(fd,....) 写入文件
close(fd);关闭文件
首先使用open系统调用打开文件,open的参数中包含文件的路径名和文件名。使用write写入数据,其他write使用使用open所返回的文件描述符,不使用文件名作为参数。使用完文件之后,用close系统调用关闭文件,避免资源的泄露。
我们打开一个文件之后,操作系统会跟踪进程打开所有文件,就是操作系统为每个进程维护一个打开文件表,文件表里的每一项代表文件描述符,文件描述符是打开文件的 标识。
1、文件描述符
文件描述符(file descripter)FD:Linux内容默认情况下一个进程只能打开1024个文件,内核为了管理进程,当一个进程打开了哪些文件,内核就会维护一个表,这个表就会记录这个进程打开了哪些文件,然后给每个文件进行编号,这个编号就叫文件描述符(句柄),默认文件描述符的范围为0-1023。
2、进程
进程(process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。
进程的组成:pcb+code+data
pcb是进程控制块:user、pid、satue、address等,证明一个进程存在的唯一凭证。
process control block
code:程序代码--c语言程序的代码(编译好的代码)
data:程序在运行过程中会产生数据。
进程在内存和cpu之间打转转,产生的数据可以存放在内存里面,也可以存储在磁盘里。
以上是关于Linux操作系统之文件系统详解的主要内容,如果未能解决你的问题,请参考以下文章