1磁盘管理
1.1硬盘的构造原理
硬盘分类:
机械式硬盘,固态硬盘
硬盘出厂会进行低级格式化,分磁盘,再分扇区,硬盘的第一个磁道的一个扇区就是MBR 512Bytes
Master boot record
446 bytes bootloader主引导程序
64bytes:主分区存储16bytes表示一个主分区,最多4个主分区
2bytes:magic number表示mbr是否有效
硬盘的注意事项:
a)1.硬盘需要绝对的无尘环境,生活环境拆开,硬盘基本上就是挂掉的
b)2.硬盘的外圈读写速度较快,C盘一般在外圈,因此一般把系统安装在C盘
c)3.机械硬盘是盘面不端旋转,磁头固定读取数据
硬盘组成:
a)圆形的盘片(存储数据)
b)机械手臂(旋转读取数据)
c)主轴马达,转动盘片,让这个机械手臂来读取数据
硬盘构造原理:
a.硬盘由多个盘片组成,每个盘面都有一个磁头,所以磁头数决定盘面数。一般读写数据都是几个磁头同时进行,这样速度会比较快
b.盘片划分成多个磁道,外圈…中圈….内圈..每个盘面从外圈向内圈编号,具有相同编号的磁道就形成一个圆柱,称之为柱面
c.磁盘上的每个磁道被等分为多个弧段,这些弧段就称为磁盘的扇区,扇区是存储的最小单位512bytes
d.多个扇区组成磁道,多个磁道组成柱面,柱面是分区的最小单位。
e.g:Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
硬盘的容量=柱面数*磁头数*扇区数*512B。
每个柱面通过255个磁头来控制,每个磁头控制63个扇区,所以一个柱面的大小为
255*63*512=8225280 bytes
这里就有个问题,扇区肯定是外围磁道的大,就是相对面积大,但是为什么磁盘做成一样的大小的呢?
a)磁头单位时间内读取的字节数是一定的;
b)不管是在这个外圈中圈内圈单位时间扫过的扇区数量是一样的(角速度一样)单位时间略过的面积是不一样(线速度不同);
c)基于前面的两点,扇区的容量不是按照这个面积作为衡量标准,而是单位时间能够读取的字节数来决定的,所以每个扇区的存储容量做成一样是最合理的
硬盘的代号和分区关系:
SCSI USB SATA FLASH接口的磁盘
/dev/sd[a-p][1-15]a-p是硬盘数量,1-15是分区的数量
IDE接口的磁盘
/dev/hd[1-p][1-63]
逻辑分区:
1)主分区和扩展分区最多只能有四个(硬盘的限制)
2)扩展分区最多只能一个(操作系统限制)
3)逻辑分区是通过扩展分区分出来的
4)扩展分区是无法使用的,是不能被格式化分区,能够使用的是逻辑分区
5)逻辑分区数量是和这个操作系统有关系的,linux中的IDE最多有59个逻辑分区,1-3是主分区4是扩展分区
6)这个SATA USB SCSI硬盘最多有11个逻辑分区。
2文件系统
Linux文件系统支持的类型:
基本文件系统:Ext2, Ext3, Ext4, Reiserfs(支持小文件), xfs(支持大文件), btrfs, JFS, vfat(支持WindowsFAT32), NTFS
交换分区:swap
集群文件系统:GFS2(全局文件系统), OCFS2
网络文件系统:NFS, smbfs(CIFS) Common Internet File System
光盘:iso9660
分布式文件系统:ceph
moosefs, mogilefs, hdfs, gfs, glusterfs
(1)日志型文件系统:
非日志型文件系统:ext2
日志型文件系统:ext3
(2)swap:交换分区
VFS(virtual File System)的作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统,即为各类文件系统提供了一个统一的操作界面和应用编程接口。VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。
文件系统是通过一层VFS(virtual file system)层来屏蔽所有的文件系统的差异,提供统一的调度接口给用户使用,让用户操作每个文件系统都是一致的。
vfs详解:
cpu有4个级别
ring 0内核运行级别内核空间(内核模式)
ring 1 2历史原因,没有使用
ring 3进程运行的级别(用户模式用户空间)
文件系统是操作硬盘硬件,因此要在内核空间下进行system call,功能调用接口
vfs弥合了所有文件系统的不同之处,提供一个统一的调用接口给程序的开发者
#查看系统支持的文件系统
#说明这些是内核有装载的内核模块,以后要新增文件系统类型,需要自己去装载模块
2.1linux Ext2和Ext3文件系统的特性分析(非常重要)
文件系统:分区--格式化成相应操作系统支持的文件系统格式。
分区就是文件系统,文件系统是一个分区?这句话在传统时代是没问题的。
不过现在有了这个lvm raid技术,一个分区可以再逻辑的分为多个分区。所以现在一般认为是一个可以挂载的数据文件为一个文件系统,记得dd一个磁盘镜像么,它也可以单独格式化成相应的文件系统,然后挂载。
现在就开始介绍这个linux的ext2文件系统是如何来运行的,怎么记录文件的权限等元数据和存储真实数据的。
主要有下面的集中存储数据的块:
1.data block:实际存储数据的块
2.inode:存储数据的元数据(权限,时间戳,文件大小,block存储位置等)
3.super block:主要记录block inode的总量和已使用量,和文件系统的格式等一堆相关信息,dump2fs可以查询
4.inode bitmap:利用bit来记录这个inode是否已经使用了。
5.block bitmap:利用这个bit来记录这个block是否已经使用了
linux文件系统和windows的fat,ntfs系统对比
a.linux文件系统是利用这个索引文件查找方式,所以一个inode记录的数据库都可以快速查找到。相当一下指向所有block的存储位置,这样就可以马上进去数据的读取。
b.FAT格式的系统是利用链表的形式来读取这个数据,所以要第一个读取了才能知道下一个数据在哪里,效率比较低。
c.这就涉及到这个磁盘碎片整理了,假如FAT格式的文件系统读写太频繁,这个数据比较乱,可能盘片需要旋转很多圈才能读取到,很正常。但是linux的ext2系统就不需要这样,索引方式一次遍历就能全部找到可能有时会有点分散,还是需要一定寻道时间。
综上可知:
A.windows下的NTFS和FAT一般使用一段时间后需要进行这个磁盘碎片整理;如果这个文件系统分区存储的数据比较少,建议备份,然后重新格式化,这样可以减少这个读写次数,保护磁盘;
B.linux系统不需要磁盘碎片整理;
inode详解:
一个文件占用一个inode
inode记录了文件数据存储的data block块位置,各类权限,时间戳,文件大小等元数据
inode的大小为128bytes
由于一个磁盘过大,一般会把一个分区分成多个block group,每个组都有一套inode,data block
inode bitmap,block bitmap
superblock: block和inode的总量
block和inode的使用量,为使用量自然就可以算出来剩余量
block块大小
block gourp组个数
superblock只有部分block group中有,一般是1 3 5 7 9包含,备份
GDT:第一个block bitmap所在的block号
第一个inode bitmap所在的block号
第一个inode tables所在的block号
group中空闲的block总数
group中空闲的inode总数
目录数
block的大小为1024bytes 2048bytes 4096bytes
block大小102420484096
最大的单一文件限制16GB256GB2TB
最大的文件系统容量2TB8TB16TB
由于一个文件占用一个inode,因此创建的文件数量要小于等于inode的数量
由于inode里面有存放这个data block的位置,存放单个block num要4bytes,但是inode的大小是固定的128bytes,因此inode做成了多重索引的形式,12个直接索引,1个间接索引,1个双间接索引和1个三间接索引.
假如block=1K,则单个文件最大支持多少?
直接:12*1K(一个直接索引放一个block)
单间接=256*1K=256K
双间接=256*256*1K=64M
三间接=256*256*256*1K=16G
一个block可以存储block num 1024/4=256个
2K 4K由于文件系统的限制,无法这样计算。
通过stat来查看这个文件的属性信息,存储在inode里面。
为什么block的大小为1K 2K 4K 2的n次方的?
答:数据块是要存在内存中,而内存是按页框来计算的,页框一般就是4K。
为什么设备文件没有大小?
答:设备文件只是一个入口,只占用inode,没有存储数据。
block块大小是事先设定好的,inode的预留数量要多少比较合适,比例多少?
答:其实根据系要存的文件的大小的整体情况来定义,尽量多点inode,以防止不够使用
2.2创建文件系统
创建文件系统需要两个条件
1.内核支持这种文件系统
2.用户空间有这个文件系统的管理工具
2.2.1文件系统的基本操作和查看工具
dfduls ln
ls
ls命令
功能:查看文件的inode号
语法:
ls [option]
常用的选项
-i:显示inode号
-d:显示目录
-l:显示详细信息
例子:
df
df命令
功能:列出文件系统的整体使用量
语法:
df[option][目录|文件名|文件系统]
常用的选项:
-h human-readable人类易看
-k KB显示,默认
-m MB显示
-i inode数量显示
-a列出文件系统后面无参数
-T:system type ext2 ext3
例子:
#查看分区sdb2
[root@localhost ~]# df /dev/sdb2
Filesystem1K-blocksUsed Available Use% Mounted on
/dev/sdb2403168074104 37527762% /home
#查看已经挂载的分区(真实文件系统)的使用情况
#查看所有的文件系统的情况
#显示/etc目录的情况
#显示当前系统挂载的分区的文件系统格式
mount命令也可以查看
du
du命令
功能:估计文件的占用空间量(误差)
语法:
du [OPTION]... [FILE]...
常用的选项:
-a:列出当前目录的所有数据,包括目录和文件
-s:计算总量
-m:MB显示
-k:KB显示
-h:人类易看的方式
-S:不包括当前目录的子目录的大小(文件则只显示文件)
会显示每个目录的大小
例子:
1..显示/etc/目录下的大小
2.显示根目录下每个目录的大小,proc,sys为0,可能会部分报错
3.列出当前目录的所有数据,包括目录和文件,最底部计算总量
4.显示tmp目录下各个目录的大小/tmp不包括子目录
ln
ln命令
功能:链接文件
语法:
ln [OPTION]...TARGET LINK_NAME
默认是硬链接
常用的选项:
-s:创建符号链接,建议使用绝对路径
-v:打印链接结果
-f:目标文件存在则删除后创建
硬链接文件:每个文件都有一个inode,而一个inode可以被多个文件所指
而之前说到的读取文件是要从这个目录来读取,而目录也是一个文件
目录也是占用一个inode,而inode指向的block存放着目录文件下
的文件名和对应的inode号。
所以硬链接就是在文件的所在的目录的block里面的对应项写着不同
文件名,但是是同一个inode。就是这么简单。
硬连接的好处:
1.将一个硬连接产生的文件名删除后,该文件对应的inode和block都还是存在
(真正删除需要最后一个连接到该inode的文件删除,这时候对应的inode和block才会回收)
2.对任何一个文件名进行修改,其实都是修改了相同的inode和block文件,结果一样
3.设置了硬连接后磁盘空间一般不会改变,除非存放硬连接文件的目录的block超过block大小
缺点:
1不能跨文件系统,每个文件系统都一套inode和block bitmap,无法指向同个inode
2不能连接到目录,链接目录后,目录下的文件和子目录也要做硬连接,linux暂时不支持,太过复杂
符号链接symbolic link
1.符号连接其实是该文件在自己所在目录下面有一个单独的inode和文件名
2.inode存储的block里面存放着这个符号连接原文件的文件名,因此,符号文件的大小是这个链接的原文件名长度
3.只要指定目录有文件名一致,则符号链接有效,即使该文件(更换后)的inode不同也没关系
4.可以创建目录链接,相当进入指定的目录下
5.源target建议使用绝对路径
符号连接的好处:
1:可以连接不同的文件系统和这个目录,应用广泛(链接只是包含文件的路径名)
2:删除数据原本数据后比较安全,不怕有备份
坏处:
1占用这个独立的inode和block
2删除原文件后,符号连接文件成为无效连接,打不开,占用磁盘存储空间
例子:
1.创建硬链接和软链接,显示其区别
2.删除源文件后,硬链接和软链接的区别
硬链接正常,软链接找不到目标。
3.创建目录的软链接
2.2.2磁盘的分区,格式化,检验和挂载
mknod ,fdisk,mkfs,mke2fs,e2lable,blkid,dumpe2fs,tune2fs,fsck,e2fsck
mknod
mknod命令
功能:创建设备文件
设备文件:(没有大小)
b:按块为单位,随机访问的设备;
c:按字符为单位,线性设备;
b:硬盘
c:键盘
/dev
主设备号(major number)
标识设备类型
次设备号(minor number)
标识同一种类型中不同设备
语法:
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
常用的选项
-m MODE:文件的权限
设备文件只是作为硬件的访问入口,需要有内核能够识别一个设备的主设备号为66的才可以使用
例子:
1.创建一个设备文件
2.创建设备文件,手动指定权限
3.发送信息给xshell登录的伪终端设备
fdisk
2.2.2.1分区
fdisk命令
功能:磁盘分区
硬盘设备的设备文件名:
IDE, ATA:hd
SATA:sd
SCSI: sd
USB: sd
a,b,c,...来区别同一种类型下的不同设备
sda1:第一个主分区
sda2:
sda3:
sda4:
sda5:第一个逻辑分区(即使主分区只是用了2个)
语法:
fdisk[-uc][-b sectorsize] [-C cyls] [-H heads] [-S
sects] device
fdisk -l [-u] [device...]显示所有磁盘的分区情况或者是特定的磁盘
fdisk -s partition...显示分区或者磁盘的大小(block的大小)
fdisk –v:显示版本
fdisk –h:显示帮助信息
常用的选项
fdisk device常用选项:
p:显示当前硬件的分区,包括没保存的改动
n:创建新分区
e:扩展分区
p:主分区
d:删除一个分区
w:保存退出
q:不保存退出
t:修改分区类型
L: list code
l:显示所支持的所有类型
这个命令是比较特殊的交换命令,不用背,进入按提示操作即可
记得q可以不保存退出w则是保存,别按错后悔了。
m|h:帮助信息
新建完分区后,需要让内核识别:
rhel5使用命令partprobe device如partprobe /dev/sdc
rhel6版本的系统在新建分区后,w保存,会自动调用内核识别
Calling ioctl() to re-read partition table.
假如没有可以使用命令partx device如:partx /dev/sdc
例子:
1.显示系统上的所有分区
2.新建一个分区为1G的逻辑分区,修改系统的格式给lvm
mkfs
2.2.2.2格式化
mkfs命令
功能:磁盘分区格式化
支持ext2 ext3 ext4 vfat
语法:
mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
常用的选项
-t fstype指定要创建何种文件类型
-c在制做档案系统前,检查该分区是否有坏道
-fs指定建立文件系统时的参数
使用方法:
[root@localhost ~]# mkfs.
mkfs.cramfsmkfs.ext3mkfs.ext4devmkfs.msdos
mkfs.ext2mkfs.ext4mkfs.minixmkfs.vfat
mkfs –t ext3 /dev/sdc6 == mkfs.ext3 /dev/sdc6
事实上mkfs是调用了命令mke2fs
例子:
[root@localhost ~]# mkfs.ext2 /dev/sdc6
[root@localhost ~]# mkfs.ext3 /dev/sdc6
[root@localhost ~]# mkfs.ext4 /dev/sdc6
mke2fs
mke2fs命令
功能:创建文件系统
专门创建ex系列的文件系统
[root@localhost ~]# cat /etc/mke2fs.conf #查看创建的文件系统的默认配置
[defaults]
base_features = sparse_super,filetype,resize_inode,dir_index,ext_attr
blocksize = 4096 #block的大小是4K
inode_size = 256 #inode大小是256字节,上面的128字节是比较老的数据
inode_ratio = 16384
[fs_types]
ext3 = {
features = has_journal
}
ext4 = {
features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize
inode_size = 256
}
……
语法:
mke2fs [-b block大小] [-i多少容量给一个inode(block计算)] [-L卷标] [-cj]设备
常用的选项
-c fsck检查磁盘错误,一个-c,进行快速的读取测试
两个-c -c进行这个读写测试
-j默认创建ext2,加入这个命令后就创建这个journal成为这个ext3
-m #:指定预留给超级用户使用的块数百分比
注解:卷标的作用是为了用于引用使用,方便,类型域名了。
-b BLOCK_SIZE:指定块大小,默认为4096;可用取值为1024、2048或4096;
-L LABEL:指定分区卷标;
-t fs-type:文件系统类型
-m #:指定预留给超级用户的块数百分比默认是百分之5
-i #:用于指定为多少字节的空间创建一个inode,默认为8192;这里给出的数值应该为块大小的2^n倍;
-N #:指定inode个数;
-F:强制创建文件系统;被挂载也可以强制创建文件系统
-E:用户指定额外文件系统属性;
例子:创建一个2G大小的ext4的文件系统,卷标指定为test,block大小为2048
1.fdisk创建一个分区
2.确保分区已经被内核识别
[root@localhost ~]# cat /proc/partitions
8392104483 sdc7
如果未识别,则让内核重新读取
3.创建文件系统
blkid
blkid命令
功能:查询或查看磁盘设备(已有文件系统)的相关属性
UUID
TYPE
LABEL
语法:
blkid [device]
e2label
e2label命令
功能:用于查看和定义卷标
语法:
设定卷标:e2label设备文件卷标
查看卷标:e2label分区
例子:
dumpe2fs
dumpe2fs命令
功能:显示文件系统的属性信息等
block group的信息
一般0 1 3 5 7 9包含superblock的信息1个主5个备
语法:
dumpe2fs partition
常用选项
-h:仅查看超级块中的信息
例子
tune2fs
tune2fs命令
功能:调整ex2,ex3和ex4文件系统的参数
语法:
tune2fs [option]device
常用的选项
-j:不损害原有数据,将ext2升级为ext3;
-L LABEL:设定或修改卷标;
-m #:调整预留百分比;
-r #:指定预留块数;
-o:设定默认挂载选项;
如acl
-c #:指定挂载次数达到#次之后进行自检,0或-1表关闭此功能;
-i #:每挂载使用多少天后进行自检;0或-1表示关闭此功能;
-l:显示超级块中的信息;
例子:
#把预留块比例改为百分之三,挂载多少次都不自检,卷标修改为test4
2.2.2.3检查
e2fsck
e2fsck命令
功能:专门修复ext2/ext3/ext4
语法:
e2fsck [option]device
常用的选项
-f:强制检查
-p:自动修复
-v:执行时显示详细的信息
-y:对问题自动回答为yes
e2fsck执行后的传回值及代表意义如下:
0没有任何错误发生。
1文件系统发生错误,并且已经修正。
2文件系统发生错误,并且已经修正。
4文件系统发生错误,但没有修正。
8运作时发生错误。
16使用的语法发生错误。
128共享的函数库发生错误
注意:通常是这个系统有问题的时候才使用root用户来检查文件系统的一致性
如果正常情况下使用可能会造成文件系统的损害。
由于fsck扫描磁盘的时候会对这个文件系统造成损坏,所以一定不要把要检查的
分区挂载上去,意思就是要在卸载的情况下检查
每个分区格式化成为这个文件系统后都会自动生成一个lost+found的目录,
作用其实就是来存放fsck检查后有问题的数据的,一般里面是没有数据的,
假如有数据的话,那肯定是这个文件系统有问题了。
例子:
修复/dev/sdc7
fsck
fsck命令
功能:磁盘检验,保证文件系统的统一,调用e2fsck
语法:
fsck [-t文件系统] [-ACay]设备名称|挂载点
常用的选项
-text2 ext3一般不需要linux自动检测blkid检测
-A根据/etc/fstab的内容,将需要的设备扫描检测一次,通常开机会执行这个命令
-a自动修复有问题的分区,不用手动y确认
-y类似a部分文件系统仅仅支持-y
-C检测过程中用直方图显示这个进度
-f强制检查,一般没有发现unclean标志,不会进入细化检查,要细化检查需要这个参数
2.2.2.4挂载与卸载
挂载点的选择注意事项:
1单一文件系统不应该重复挂载在不同的目录(挂载点)
2单一目录不应该被多次挂载,一定要一一对应
3挂载点应该是空目录才合理,如果该目录有东西的话,那会被暂时隐藏
直到该文件系统卸载后才能看到。
mount
mount命令
功能:挂载文件系统
语法:
mount设备挂载点
设备:
设备文件:/dev/sda5
卷标:LABEL=“”
UUID:UUID=“”
挂载点:目录
要求:
1、此目录没有被其它进程使用;
2、目录得事先存在;
3、目录中的原有的文件将会暂时隐藏;
常用的选项
-a mount all file system base /etc/fstab
-l单纯输入mount会输出当前的挂载信息,-l加上多显示label信息
-t加上这个文件系统,不加则系统使用blkid去获取文件系统的类型
-n默认情况下,这个系统挂载会实时写入这个/etc/mstab中,以给其他
程序运行使用,但是某些情况(例如单用户模式)为了避免问题,
会刻意不写入-n就是这个效果了
-L:利用卷标来挂载,必须独一无二使用这个就不用-t了
-r:只读挂载,常用于光盘
-w:读写挂载
-o:后面跟一些挂载的参数,
ro,rw只读,读写
async,sync:文件系统同步写入还是异步,肯定是异步效率高了
数据先保存在内存,定时或者隔一段时间写回硬盘,属于异步操作
dev,nodev:是否允许创建设备
suid,nosuid:是否允许文件有suid/sgid文件格式
auto,noauto:是否允许被自动挂载-a
exec,noexec:是否可以执行二进制文件
user,nouser:下达user允许一般用户挂载
default:rw,suid,dev,exec,auto,nouser,sync
remount:重新挂载,系统出错,更新参数的时候特别有用
suid比较危险,如果我在自己机子赋予suid,然后挂载到其他机子,被挂载,很可能就有了suid,可以执行恶意程序
注意:挂载文件系统的时候可以不指定类型,系统会去自行测试,主要根据配置文件/etc/filesystems
[root@localhost ~]# cat /etc/filesystems
ext4
ext3
ext2
nodev proc
nodev devpts
iso9660
vfat
hfs
hfsplus
LINUX系统支持的文件系统的驱动所在目录为:[root@localhost ~]# ll /lib/modules/`uname -r`/kernel/fs/
例子:
1.挂载label为test4的文件系统到/media/test4下,挂载属性为user,noexec,ro
[root@localhost ~]# mount LABEL="test4" /media/test4/ -o user,noexec
2.查看挂载的文件系统
2,挂载光驱,前面提到,系统会自动去检测系统的类型iso9660包括在检测列表,由于光盘是写保护的,会自动挂载为只读ro
[root@localhost ~]# mount /dev/cdrom /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
指定类型:
[root@localhost ~]# mount -t iso9660 /dev/cdrom/ /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
3.挂载U盘
通过fdisk -l来查找这个新添加的设备的名称
mount -t vfat -o iocharset=cp950 /dev/sdb4 /mnt/flash
iocharset用来指定这个语系cp950是这个中文语系
4.重新挂载,出故障的时候特别管用
[root@localhost ~]# mount -o remount,rw,auto /media/test4/
根目录是最重要的部分,而根目录是没有办法卸载的,假如要修改挂载参数
那要如何重新挂载?重启,其实可以不用的
[root@localhost ~]# mount -o remount,rw,auto /
umount
umount命令
功能:卸载设备
语法:
umount [-fn]设备文件名或者挂载点
常用的选项
-f强制卸载
-n不更新/etc/mtab,正常挂载会把记录在此文件,卸载则移除
卸载注意事项:
挂载的设备没有进程使用,如果有,则无法卸载,需要使用fuser命令
例子:
1.卸载/dev/sdc7,label为test4
[root@localhost ~]# umount /media/test4/
[root@localhost ~]# umount /dev/sdc7
fuser
fuser命令
功能:验证某个进程正在使用的文件或者套接字
强制杀掉挂载点上的所有进程
语法:
fuser [option]name(挂载点)
常用的选项
-v查看某文件上正在运行的进程
-k kill文件
-km mount—point:终止正在访问此挂载点的所有进程,bash终端会被干掉
例子:
1.查看光驱挂载点运行的程序
2.强制卸载有程序运行的设备
同时会把bash终端也杀掉。
2.3读取文件的底层详解
2.3.1目录树读取文件的原理:
由于在目录下操作文件需要有写权限,首先需要这个目录有写权限
系统通过挂在信息可以得到/根的inode号,通过stat查看是inode号是2,,然后就可以根据inode号读取blocknum,去blocknum里面找到对应的信息主要是inode号码文件名字,依次类推,就可以找到对应的文件所在的位置
例子:读取文件/etc/passwd的过程:,root身份
1.首先找到/的inode号是2,并且具有rx权限,找到对应的block,来找到etc对应的inode
2.接着在etc目录对应的block里面找到相应的passwd的inode号
3.最后通过passwd的inode来查找对应block,由于具有rw权限,因此可以读取passwd里面的数据
在目录/backup/下创建文件test的步骤是:
1.扫描inode位图,找到一个空闲的inode
2.找/,通过挂载点获取inode,然后在其block中找是否有backup(无则报错结束)
3.通过backup的inode号找到其block,在里面把test文件的inode和文件名写进去
4.再扫描bitmap,占用,然后把block分配给文件存储(一般会多分配block(未使用),防止增长而造成文件碎片)
在目录/backup下删除文件test的步骤:
1.把/backup目录的block文件的条目删除
2.把test的inode条目清除,inode bitmap位图也释放
3.bitmap块位图也释放test文件占用的块
同个分区下剪切文件为什么那么快?
答:把文件名和inode在旧目录下删除,在新的目录下写入一样的inode和文件名
那是不是一个目录就占用一个block呢?
答:当然不是了,那要看下这个目录本身存放的文件的多少
2.3.2linux系统下新建一个文件要怎么处理呢?
1.首先看下该用户要在该目录下是不是有这个r权限与这个x权限,有则进入该目录
2.再看下该用户是否有这个w,有的话才有资格添加文件
3.查看这个inode bitmap找到一个空余的inode号码,并将这个权限和属性写进去,
并且写入这个目录的block文件名对应条目
4.查看这个block bitmap找到没有使用block,根据大小选择相对应数量的block,
把该文件的数据写进去,并且更新inode指向的block号码
5.将这个block和inode,inode bitmap和block bitmap等信息写入这个superblock和备份的superblock中去
其中这个superblock和inode bitmap和block bitmap是在每次文件添加,删除,更新过程经常会变化的,属于中间数据
从上面可以看出,要创建一个文件必须保持5个步骤一次性完成,才不会造成文件系统的不一致。
因此这些操作必须异步进行,所以最后一定要同步到各个记录数据点去。那假如系统在文件创建一半的时候崩溃了
那该如何解决这个问题呢?
ext2系统只能同fsck e2fsck文件系统一致性检查,看下有没有这个unclean数据,如这个该inode bitmap使用了,
但是这个inode里面却还是空数据的情况。不过要检查整个文件系统,这是非常浪费时间的。那有什么办法能够在系统挂掉的时候记录挂掉之前还未完成的任务呢?
那就是日志文件系统了,类似数据库学过的保持数据完整性的方法是一样的。
1.当系统要写入一个文件的时候,先把给文件要写入的关键信息记录在日志中
2.进行数据的正常写入
3.正常完成数据的写入,在日志记录中完成文件的正常写入
windows系统异常关机也会进行磁盘的一致性修正,类似ext3,windows也有日志的功能,因此速度快点。
2.3.3linux文件系统采取异步模式
linux文件系统是采用这个异步操作的模式,这样可以提高这个系统的运行速度
众所周知,内存速度比硬盘快了很多,所以如果把经常用到的数据写到这个内存
中,这样可以提高系统性能;当这个内存文件被修改过,就会被定义为dirty数据,此时
就按照某种机制写回硬盘,sync就是强制内存数据写回硬盘的操作的。
所以关机的时候系统会自动调用sync来写回数据回硬盘,记得多调用几次sync,比较安全
如果意外断电了,那就要花很多时间了检查文件系统的一致性了,甚至是文件系统部分数据
的丢失损坏.
2.3.4挂载点的意义:
挂载点一定是目录,目录是文件系统的入口
3练习
练习:
1、创建一个1G的分区,文件系统为ext4,卷标为DATA,块大小为1024,预留管理空间为磁盘分区的8%;挂载至/backup目录,要求使用卷标进行挂载,且在挂载时启动此文件系统上的acl功能;
mke2fs –t ext4 –L DATA –b 1024 –m 8
mount –o acl LABEL=”DATA” /backup
2、将此文件系统的超级块中的信息中包含了block和inode的行保存至/tmp/partition.txt中;
[root@localhost ~]# dumpe2fs -h /dev/sdc7 | grep -E "block|inode" > /tmp/partition.txt
3、复制/etc目录中的所有文件至此文件系统;而后调整此文件系统类型为ext3,要求不能损坏已经复制而来的文件;
ext2已经不使用了,此题不做
4、调整其预留百分比为3%;
tune2fs –m 3 /dev/sdc7
5、以重新挂载的方式挂载此文件系统为不更新访问时间戳,并验正其效果;
[root@localhost backup]# cp /etc/inittab .
[root@localhost ~]# mount -o remount,noatime /dev/sdc7 /backup
访问文件[root@localhost backup]# cat inittab
时间戳不变
6、对此文件系统强行做一次检测;
[root@localhost ~]# umount /backup/ #必须先卸载
[root@localhost ~]# e2fsck -f /dev/sdc7
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
DATA: 12/131584 files (0.0% non-contiguous), 69386/2104480 blocks
7、删除复制而来的所有文件,并将此文件系统重新挂载为同步(sync);而后再次复制/etc目录中的所有文件至此挂载点,体验其性能变化;
cp –r /etc/* /backup/ #速度非常快
rm –rf /backup/*
[root@localhost ~]# mount -o remount,sync /dev/sdc7 /backup
cp –r /etc/* /backup/#速度相当慢