关于Linux文件系统

Posted 李建明180

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Linux文件系统相关的知识,希望对你有一定的参考价值。

前言

文件系统是在内核中实现,能够对存储在磁盘上的二进制数据进行有效的层次化管理的一种软件。而用户程序为了实现在磁盘上使用或者创建文件,向内核发起系统调用(实际由文件系统向内核发起的系统调用)并转换为对应磁盘设备的电气信号的请求(数据存储在硬盘上,用户的”0,1”代码信号数据转换成磁盘能识别的存储机制)。

MBR:主引导记录

分区信息放在主引导记录中,为了让操作系统能识别分区
MBR(512bytes):
1,bootloader(引导加载器):446bytes
2,fat(文件系统分配表):64bytes(16bytes一个分区,共4个分区)
3,5A(MBR有效性标记):2bytes
注:3个主分区,1扩展分区:引用额外的分区表–划分为逻辑分区

文件系统

特性:
文件系统通常将权限和属性放置于inode中,实际数据则放到data block中,还有一个超级块会记录整个文件系统的整体信息,包括inode和block的总量,使用量和剩余量

super block:记录此文件系统的整体信息,inode和block的总量,使用量和剩余量和文件系统的格式和相关信息
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件数据所在的block号码
block:实际记录文件内容,文件过大时,会占用多个block

基本功能是按文件名称实现存取,所以各文件系统的不同指内部存放读取文件(内部的实现细节)的格式不同。
注:计算器上,当两个层次不能结合时,就需要添加中间层
VFS:虚拟文件系统(中间层)

1,基本文件系统:Ext2,Ext3,Ext4,Reiserfs,xfs,JFS,vfat,NTFS
2,交换分区:Swap
3,集群文件系统:GFS2,OCFS2
4,网络文件系统:NFS,Smbfs(CIFS)
5,光盘文件系统:ISO9660

磁盘管理工具

fdisk查看磁盘分区列表以及实现磁盘分区管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000da36d

Device Boot Start End Blocks Id System
/dev/xvda1 * 2048 41940991 20969472 83 Linux

Sector size:每块扇区512bytes
I/O size:一次I/O操作读取的数据量
Disk identifier:disk的唯一标识符(16进制)
Device:分区
Boot: '*' => 表示可引导分区
Start:表示起始柱面
End:表示结束柱面
Blocks:块数
Id:文件系统的id号
1
2
3
4
5
6
7
d:删除
n:新建
p:列出已有分区
t:调整分区ID
l:列出内核支持的分区ID
w:存盘并退出
q:不保存退出

kpartx|partx通知内核重读硬件设备的分区信息表

1
2
-a:添加分区信息
-f:强制添加
1
cat  /proc/partitions: 查看分区信息

mke2fs创建ext文件系统

配置文件:/etc/mke2fs.conf

1
2
3
4
5
6
7
8
-t 指定文件系统类型  {ext2|ext3|ext4}
-L Label 指定卷标 e2label(此命令可以查看/指定磁盘接口设备文件名的卷标)
-b:{1024|2048|4096} 指定块大小(小文件多时使用小磁盘块)
-O:指定分区特性
-#:#个字节预留一个inode
-N #:指定预留的inode数目
-I #:Inode大小(inode保存元数据信息:文件大小,属主属组,存放的磁盘块位置)
-m #:预留给管理员的空间百分比,默认为5

注:超级块中存放块组信息,块分配情况(有备份)

e2label创建ext文件系统

查看卷标和设定卷标

dumpe2fs查看块信息

1
-h:仅查看超级块中保存的信息

tune2fs查看或调整ext文件系统信息

1
2
3
4
5
6
7
-l:显示超级块信息
-L label:设定卷标
-m:预留管理员空间百分比
-j:如果原文件系统为ext2,-J能够将其提升为ext3
-o:设定其默认挂载选项
-O:调整分区特性(^表示关闭该特性)
ex:tune2fs -O ^huge_file /dev/sda3

fsck|e2fsck检查修复文件系统的命令

1
2
3
4
-t:指定文件系统
-f:
-a:自动修复错误
-r:交互式修复错误

关于交换分区(虚拟内存)

注:交换分区格式化后内部的存储格式和内存一样,必须是单独分区
当物理内存容量过低时,把部分不经常使用数据置换到交换分区上,单位是页面(page),页面大小取决于cpu。

linux使用物理内存和交换分区的比例通过/proc/sys/vm/swapiness文件定义

mkswap 创建交换分区
1
-L:指定label
swapon|swapoff 启动和关闭交换分区
1
2
-a:标记所有swap为启用状态
-P #:指定启用的swap优先级

hdparm 读取或设置设备信息

1
2
-i:从内核读取
-I:从磁盘读取

文件信息查看 大专栏  关于Linux文件系统

1
2
3
4
5
/proc/cpuinfo:cpu信息
/proc/partitions:分区信息
/proc/meminfo:内存信息
/proc/filesystems:内核识别的文件系统信息
/proc/mounts:挂载信息

mount|umount 挂载

创建完文件系统后,需要和当前系统上一个空闲目录关联起来,作为其访问入口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mount [options] [-t fstype] [-o option]  device  挂载点(空闲目录)

-t:文件系统类型
-r:只读挂载
-w:读写挂载
-L:用卷标指定设备
-U:UUID指定设备
-a:挂载所有支持自动挂载的设备

-o 选项:
async:异步I/O,数据的写入操作在内存中完成,然后由内核统一同步磁盘上去
sync:同步I/O
atime/noatime:更新文件访问时间戳(建议noatime)
auto/noauto:是否能够被 mount -a选择自动挂载
diratime/nodiratime:是否更新目录的访问时间戳
exec/noexec:是否允许执行其中的二进制程序
iversion/noiversion:inode修改后,i_version是否+1
_netdev:网络功能启用前不会挂载此种网络设备
remount:重新挂载
acl:启用facl(磁盘分区特性)

注:挂载点挂载后,其原有目录下的文件或目录会被隐藏,卸载后能显示
注:内核启动时只挂着根文件系统所在分区,其他分区的文件系统

fuser

1
2
-km 挂载点  踢出占用挂载设备的进程
-v 挂载点 查看占用挂载设备的进程

df 磁盘空间使用状态报告

1
2
3
-h:hunman-readable
-i:查看inode使用情况
-P:POSIX效果显示

du 评估文件占用磁盘空间情况

1
-sh:hunman-readable显示目录占用磁盘总大小

dd:更低级别的复制工具

1
2
dd if=input_file of=out_file bs=#[b|k|m|g] count=# 
#表示数字

注:copy命令发起系统调用读取一个文件,在新位置创建新文件,把之前读取的文件数据写入到新的文件中;dd命令直接复制磁盘块到另一个位置

关于/etc/fstab

fstab文件中定义了文件系统挂载表,在系统初始化脚本/etc/rc.d/rc.sysinit中定义开机读取fstab

1
2
3
4
5
6
7
8
9
# <file system> <mount point>   <type>  <options>  <dump>  <pass>
ex: UUID=af414ad8-9936-46cd-b074-528854656fcd / ext4 errors=remount-ro 0 1

<file system>:挂载的设备
<mount point>:挂载点(swap挂载点是swap)
<type>:文件系统类型
<options>:挂载选项,逗号隔开多个选项
<dump>:转储(备份)频率,0-从不备份,1-每日备份
<pass>:自检次序,1表示该挂载点首先自检,通常只能被/使用,0表示不自检

文件链接

ln(ln SRC LINKFILE)

硬链接:

> 指向同一个inode号的两个不同路径(inode号指向不能跨分区)
> 不能对目录创建硬链接
> 硬链接会改变文件链接的次数
1
2
-rw-r--r-- 1  root  root  260 Jul 29 2015  backup-my.cnf
其中 1 表示文件的硬链接次数

软链接(符号链接):

> 符号链接文件内记录原文件的路径(**大小为路径的字符串数**)
> 可以跨分区
> 跟原文件不同一个inode
> 可以对目录创建符号链接
> 符号链接不会改变源文件被链接的次数
1
2
lrwxrwxrwx 1 root root    7 Apr  5 2016 test1.sh -> test.sh
-rw-rw-r-- 1 root root 1342 Jul 13 2015 test.sh

压缩工具

gzip

zcat:不解压直接查看压缩文件原内容
后缀为(.gz)

1
2
3
-d:解压缩[gunzip]
-#:#为数字指定压缩比(1-9),压缩比越大占用cpu时钟周期越多,效率越低
-c:将压缩结果到标准输出,可使用重定向将其保存为压缩文件,从而保存原文件

bzip2(压缩比率比gzip大)

bzcat:不解压直接查看压缩文件原内容
后缀为(.bz2)

1
2
3
4
-d:解压缩[bunzip2]
-#:
-c:
-k:压缩完后保存原文件

xz(压缩比率最大)

xzcat:不解压直接查看压缩文件原内容
后缀为(.xz)

1
2
3
-d:解压缩[unxz]
-#:
-c:

zip|unzip:归档压缩工具(可以压缩目录)

tar:归档工具

1
2
3
4
5
6
7
tar [option] -f file.tar pathname
-c:创建归档
-x:还原归档
-t:不展开直接查看被归档的文件
-zcf:调用gzip
-jcf:调用bzip2
-Jcf:调用xz

注:tar命令可以根据文件后缀在解压缩时自动调用相应的解压缩工具(-xf)

以上是关于关于Linux文件系统的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段

Linux文件系统4--打开文件

关于在各浏览器中插入音频文件的html代码片段

请有各位大虾帮我分析下面关于LINUX文件系统编程的代码,然后回答几个问题?

linux下c通过虚拟地址映射读写文件的代码

关于Linux文件系统