1.概述
文件系统在磁盘的基础上,提供了一个用来管理文件的树状结构
Linux一切都是文件,不仅不同文件和目录,就连块设备,套接字,管道等都需要文件系统来管理
每个文件都配有两个结构
- 索引节点,和文件一一对应,也会持久化到磁盘
- 目录项,和文件多对一
文件系统把连续的多个扇区组成逻辑块,以逻辑块为最小单元管理数据
磁盘在执行文件系统格式化时,会分成三个存储区域:
- 超级块,存储整个文件系统的状态
- 索引节点区,用来存储索引节点
- 数据块去,用来存储文件数据
Linux系统启动时,首先挂载根文件系统,之后可以自动或手动挂载其他的文件系统,这些文件系统要挂载到挂载点上,与虚拟文件系统(Virtual File System)和通用块设备层(General Block Device Layer)建立联系。因此,一个系统中可以同时存在不同的文件系统
文件系统可以分为三类:
- 基于磁盘的文件系统,如Ext4
- 虚拟文件系统,如/proc和/sys等等
- 网络文件系统,如NFS
2.常用的文件系统
①ext4
ext4是第四代扩展文件系统(英语:Fourth EXtended filesystem,缩写为ext4)是linux系统下的日志文件系统,是ext3文件系统的后继版本
②xfs
xfs是一种非常优秀的日志文件系统,它是SGI公司设计的。xfs被称为业界最先进的、最具可升级性的文件系统技术
xfs是一个64位文件系统,最大支持8EB减1字节的单个文件系统,实际部署时取决于宿主操作系统的最大块限制。对于一个32位Linux系统,文件和文件系统的大小会被限制在16TB
xfs在很多方面确实做的比ext4好,ext4受限制于磁盘结构和兼容问题,可扩展性和scalability确实不如xfs,另外xfs经过很多年发展,各种锁的细化做的也比较好
③tmpfs
tmpfs是Linux/Unix系统上的一种基于内存的文件系统。tmpfs可以使用您的内存或swap分区来存储文件,天生就是为临时目录而生的
tmpfs优点:
- 使用方便:因为tmpfs是建立在VM上的,而不是物理磁盘上,所以不需要格式化就可以使用,所以不用尝试mkfs.tmpfs了:没有这条命令
- 动态调节大小:tmpfs的大小是动态的,用多少才分配多少,删除文件则会释放相应的VM空间,=.=这一点非常令人激动
- 扩展性好:当您的物理内存不足以支撑分配为tmpfs的大小时,它会自动使用swap的页面
- 快:tmpfs大部分时间是驻留在物理内存中,这使得其读写速度超快
tmpfs缺点:
- 不可持久保存:tmpfs的先天优势变成了他的先天劣势:内存的特性导致位于tmpfs上的数据断电会丢失
- 成本高:相比较硬盘的价格来说,内存无疑还是很昂贵的,所以用tmpfs的目录不要放太大的东西
3.虚拟文件系统
虚拟文件系统,简称VFS,是Linux内核的子系统之一,使用它可以屏蔽文件系统和存储介质的差异,统一操作,有了它跨文件系统操作才能实现。
通过文件描述符找到具体文件系统的写方法
4.根目录
[work(caibin)@tjtx145-93-90 /]$ ls
bin dev etc home lib lib64 lost+found media mnt new_proc opt proc root run sbin selinux srv sys tmp usr var
- /: 整个文件系统的唯一根目录
- /bin:Binary,存放常用的系统命令
- /etc: 系统所有的配置文件都在该目录下
- /home: 存放用户家目录的目录,每一个用户都在该目录下有一个家文件夹
- /lib: Library,存放系统的函数库
- lost+fount: 用于存放系统异常时丢失的文件,以便于恢复
- /media: 用于挂载各种媒体,如: 光盘、软盘等
- /mnt: Mount,用于挂载各种文件系统,如: U盘、SD卡等
- /opt: Option,用于存放安装的可选程序
- /proc: Process,此目录的数据在内存中,包含进程等信息,如系统核心,外部设备,网络状态等
- /root: 系统管理员 root 的家目录
- /usr/sbin: 存放系统管理员 root 使用的命令
- /srv: Server,服务启动后需要访问的目录,如 www 服务需要访问的网页数据存放在 /srv/www 内
- /sys: System,存放系统信息
- /tmp: Temp,存放临时文件。一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,不能存放重要的数据
- /usr: User,应用程序存放目录
- /var: Vraiable,用于存放那些在时间、大小、内容上会经常变化的文件。如: 日志文件
5.proc和sysfs
proc是一种伪文件系统(也即虚拟文件系统,并不占用存储空间),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态
sysfs 文件系统总是被挂载在 /sys 挂载点上,
这个文件系统不仅可以把设备(devices)和驱动程序(drivers)的信息从内核输出到用户空间,也可以用来对设备和驱动程序做设置
sysfs和proc文件系统的区别:
sysfs 的设计原则是一个属性文件只做一件事情, sysfs 属性文件一般只有一个值,直接读取或写入。整个 /proc/scsi 目录在2.6内核中已被标记为过时(LEGACY),它的功能已经被相应的 /sys 属性文件所完全取代。新设计的内核机制应该尽量使用 sysfs 机制,而将 proc 保留给纯净的“进程文件系统”
[work(caibin)@tjtx145-93-90 sys]$ ls
block class devices fs kernel power
bus dev firmware hypervisor module
devices 最重要,内核对系统所有设备的分层次表达模型
6.文件系统I/O
把文件系统挂载到挂载点后,你就能通过挂载点,再去访问它管理的文件了。VFS 提供了一组标准的文件访问接口。这些接口以系统调用的方式,提供给应用程序使用。
我们就拿最熟悉的cat来说,其实它调用了三个命令:
int open(const char *pathname, int flags, mode_t mode);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
文件系统的IO又多种多样:
- 经过标准库缓存的是缓冲IO,否则是非缓冲IO
- 经过页缓存的是直接IO,否则是非直接IO
等等。。
7.文件系统检测命令df
[work(caibin)@bjdhj-63-189 ~]$ df -h caibin.txt
Filesystem Size Used Avail Use% Mounted on
/dev/sda6 464G 43G 422G 10% /opt/web/hbg_web_hugopenapi/wf/logs
查看索引节点的使用情况:
[work(caibin)@bjdhj-63-189 ~]$ df -i caibin.txt
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda6 486141952 331685 485810267 1% /opt/web/hbg_web_hugopenapi/wf/logs
当你发现索引节点空间不足,但磁盘空间充足时,很可能就是过多小文件导致的。
所以,一般来说,删除这些小文件,或者把它们移动到索引节点充足的其他磁盘中,就可以解决这个问题。