文件系统的作用

磁盘图片

数据存放在硬盘中, 但是linux不会让用户直接针对磁盘进行操作,这太底层了,对用户说,想存储个文件还得去学学硬盘的构成??? linux推出文件系统作为用户和底层针对磁盘读写之间的缓冲,

文件系统是一种结构, 用来组织管理文件, 比如磁盘的可用信息, 已占用和剩下的空间

常见的文件系统

名称 描述
ext2 Linux基本文件系统
ext3 ext2的增强版本
ext4 ext文件系统的第四个版本,centos6常用
xfs centos7使用
swap 交换文件系统
nfs 网络文件系统,适合Linux或Unix机器间共享
smbfs 适合Linux或Unix和windows机器间共享
vfat windows早期文件系统
ntfs windows默认文件系统,功能非常强大
so9660 CD光盘的只读文件系统
GFS google专用存储海量搜索数据而设计的专用文件系统
reiserfs 早期linux使用的日志功能的文件系统

VFS(虚拟文件系统)

Linux支持多文件系统

Linux内核是采用 vfs 虚拟文件系统,通过这个中间层对各类文件系统提供了完美的支持,对于用户来说,这些文件系统几乎是透明的,用户不再需要关系底层的文件系统的具体实现

VFS 基本结构

  • super block
  • dentry
  • inode
  • data

什么是 块?

若干个物理相邻的扇区成为一个块, 文件系统每次读取的数据都是按照快为单位的,每次读取一个块 ,这就引发了一个问题, 块划分的越小,空间的利用率就越高,但是读写的性能就降低, 块划分的越大,可能就会出现空间浪费严重的情况,但是读写性能好

一般默认每一块大小 4k

Super block 超级块

超级块是文件系统中存放的第一个块,如果他被破坏了,文件系统就完蛋了, 因为它存储了文件系统的整体信息, 包括inode/block,以及文件系统的格式

Inode 索引节点

索引节点保存的就是文件的元数据, 比如文件大小,文件所有者,文件属性,权限,文件读取,修改的时间戳等, 与此同时,它还记录了文件的数据所在的block号码和文件类型

文件数据 = 元数据+数据本身

一般inode的数量在格式化时就已经确定了,一般的都是2kb大小, 当我们创建一个目录, 这个目录下能存储的文件数=inode数, 并且一般是使用不完的

inode号是唯一的,表示不同的文件,Linux内核访问文件也是通过inode号来实现的, 所谓的文件名,其实就是inode的别名,作用就是方便给用户看

linux如何找到指定的文件?
linux系统根据文件名找到这个文件的inode号,拿着这个inode号去 inode table 中查找pointer指针,找到指定的blocks数据块

文件系统如果存取文件

dentry 目录项

目录项是描述文件的逻辑属性,只存在内存中,有了它可以提高查询的性能,不管是目录和文件,他们都属于dentry目录项所有的目录项在一起组成了一颗庞大的目录树

目录也是文件,也存在自己的inode, 打开目录 = 打开目录文件

例: 用户查询 /opt/data/a.txt

其中的 / opt/ data/ a.txt 都是目录项, VFS 会从/开始的inode开始,层层找到a.txt 的inode

链接文件

硬链接文件

不同的文件名,拥有相同的inode,实际上就是给inode取了多个别名,但是对应内核来说, 他俩其实就是一个文件

ln  [原文件] [目标文件]

ln  a.txt  a.hard 

101226430 -rw-r--r--. 2 root root   0 Sep  5 01:35 a.hard
101159754 lrwxrwxrwx. 1 root root   5 Sep  5 02:33 a.soft -> a.txt
101226430 -rw-r--r--. 2 root root   0 Sep  5 01:35 a.txt

软连接文件

相当于window里面的快捷方式,一方存储的是另一方的inode信息

软链接的文件有自己的inode,里面存放源数据的路径

软连接是可以跨文件系统的

查看当前文件系统挂载磁盘的情况

inode-block图

df

格式: df [可选项] [设备名]

  • -a: 列出全部文件系统
  • -i: 显示文件系统的inode信息
  • -h: 显示单位(K M)
  • -T: 列出文件系统的类型

查看系统上block块信息, 上图的右半部分

[root@localhost tmp]# df
Filesystem                      1K-blocks    Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00  39269648 2867700  36401948   8% /
devtmpfs                           930152       0    930152   0% /dev
tmpfs                              942028       0    942028   0% /dev/shm
tmpfs                              942028   16896    925132   2% /run
tmpfs                              942028       0    942028   0% /sys/fs/cgroup
/dev/sda2                         1038336   90448    947888   9% /boot
tmpfs                              188408       0    188408   0% /run/user/0

df -i 看到的是左边的使用情况

[root@localhost tmp]# df -i
Filesystem                        Inodes IUsed    IFree IUse% Mounted on
/dev/mapper/VolGroup00-LogVol00 19644416 66185 19578231    1% /
devtmpfs                          232538   337   232201    1% /dev
tmpfs                             235507     1   235506    1% /dev/shm
tmpfs                             235507   442   235065    1% /run
tmpfs                             235507    16   235491    1% /sys/fs/cgroup
/dev/sda2                         524288   328   523960    1% /boot
tmpfs                             235507     1   235506    1% /run/user/0

mount

能看全部内容

[root@localhost tmp]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=930152k,nr_inodes=232538,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
.....

修复文件系统

出现非正常开关机,突然断电,设备的读写失误导致了文件系统中supper-block被破坏了,需要修复

命令: fsck (file system check)

格式: fsck [可选项-t] [文件系统类型] [分区设备]

-y: 自动输入yes

例:

对/dev/sdb1分区进行修复
fsck -yt ext3 /dev/sdb1

卸载文件系统

格式:

umount  存储设备位置  
umount  挂载点目录

可能的无法卸载的原因:

  • 设置正在被使用
    • 提示“… device is busy”

退出到这个文件系统外部去,重试卸载

通过 fuser 命令找到那个进程在使用这个文件系统, kill掉它

假设无法卸载的设备为/dev/sdb1 
1)运行下面命令看一下哪个用户哪个进程占用着此设备 
fuser -m -v /dev/sdb1

2)运行下面命令杀掉占用此设备的进程 
fuser -m -v -k /dev/sdb1 
或者fuser -m -v -k -i  /dev/sdb1(每杀掉一下进程会让你确认) 
3)再umount

配置开机自动挂载的文件系统

/etc/fstab 配置文件

[root@localhost tmp]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Thu Apr  6 12:25:22 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup00-LogVol00 /                       xfs     defaults        0 0
UUID=7a0b4526-ffc0-4a51-9a43-d701c30d7c4f /boot                   xfs     defaults        0 0
/dev/mapper/VolGroup00-LogVol01 swap                    swap    defaults        0 0
[root@localhost tmp]# 

例:
将/dev/sdb1分区挂载到/mailbox目录

[root@localhost ~]# vi /etc/fstab
/dev/sdb1        /mailbox        ext3        default        0    0

其他文件系统的命令

du命令

统计(文件系统级别)的目录及文件的空间占用情况

格式: du [选项] [目录/文件名]

  • -a: 统计时包含全部文件
  • -h: 用人类可读的方式显示结果(带单位)
  • -s: 只统计每个参数占用空间大小

例:统计/tmp 目录下的容量

[root@localhost tmp]# du -sh /tmp
48K /tmp

查看目录的inode信息

命令: stat
格式: stat [选项] 文件名

-f:显示文件所在文件系统的信息

[root@localhost tmp]# stat /tmp
  File: ‘/tmp’
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: fd00h/64768d    Inode: 100663365   Links: 11
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:tmp_t:s0
# 访问时间,数据每次被阅读后更新
Access: 2019-09-05 07:18:54.331593449 +0000
# 数据的修改时间
Modify: 2019-09-05 07:50:41.397713275 +0000
# 文件的inode节点被改变时更新
Change: 2019-09-05 07:50:41.397713275 +0000
 Birth: -

版权声明:本文为ZhuChangwu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ZhuChangwu/p/11519609.html