Linux 文件系统

简介: 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: -
相关文章
|
1月前
|
存储 监控 Shell
【Shell 命令集合 备份压缩 】Linux 备份文件系统 dump命令 使用指南
【Shell 命令集合 备份压缩 】Linux 备份文件系统 dump命令 使用指南
37 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 创建DOS文件系统 mkdosfs命令使用指南
【Shell 命令集合 磁盘维护 】Linux 创建DOS文件系统 mkdosfs命令使用指南
31 2
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 文件系统维护工具 ext2ed命令使用教程
【Shell 命令集合 磁盘维护 】Linux 文件系统维护工具 ext2ed命令使用教程
26 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 创建Minix文件系统 mkfs.minix 命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建Minix文件系统 mkfs.minix 命令使用教程
34 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 建立ext2文件系统 mke2fs命令使用教程
【Shell 命令集合 磁盘维护 】Linux 建立ext2文件系统 mke2fs命令使用教程
30 2
|
1月前
|
安全 Shell Linux
【Shell 命令集合 磁盘维护】Linux 检查和修复Minix文件系统 fsck.minix命令使用教程
【Shell 命令集合 磁盘维护】Linux 检查和修复Minix文件系统 fsck.minix命令使用教程
13 0
|
1月前
|
Shell Linux C语言
【Shell 命令集合 磁盘维护 】Linux 查和修复ext2文件系统 fsck.ext2命令使用教程
【Shell 命令集合 磁盘维护 】Linux 查和修复ext2文件系统 fsck.ext2命令使用教程
32 0
|
1月前
|
存储 Linux Shell
【Shell 命令集合 磁盘维护 】Linux 创建MS-DOS文件系统 mkfs.msdos命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建MS-DOS文件系统 mkfs.msdos命令使用教程
29 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘管理 】Linux 启用指定文件系统上的磁盘配额功能 quotaon 命令使用教程
【Shell 命令集合 磁盘管理 】Linux 启用指定文件系统上的磁盘配额功能 quotaon 命令使用教程
31 1
|
1月前
|
存储 安全 Linux
【Shell 命令集合 磁盘维护 】Linux 在特定的分区上建立 linux 文件系统 mkfs命令使用教程
【Shell 命令集合 磁盘维护 】Linux 在特定的分区上建立 linux 文件系统 mkfs命令使用教程
27 0