Linux 文件系统
文件系统的作用
数据存放在硬盘中, 但是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,里面存放源数据的路径
软连接是可以跨文件系统的
查看当前文件系统挂载磁盘的情况
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: -