基于centos7学习总结 -- 文件系统相关内容
个人学习总结,多有不足之处,还望大佬多多指点。
一、文件系统
1. 磁盘的组成与分区:
磁盘的组成:磁盘是由磁头、机械手臂、圆形碟片和主轴马达组成。
扇区:是最小的存储单位,依据磁盘的设计不同,目前主要有512b与4K两种格式。
柱面:将扇区组成一个圆,就是柱面。
磁盘分区主要有两种格式:一种是MBR分区表,一种是GPT分区表。
MBR分区表限制较多,MBR第一个扇区为boot sector,内存储的有主引导记录MBR和分区表,其中MBR占用446b,分区表仅占用64b。
GPT分区表有较多的分区,支持的硬盘容量可以超过2TB。
2. 文件系统
2.1linux早期的ext2文件系统:
ext2文件系统通常会将文件的权限与属性与实际存储的内容分别存储。
权限与属性存放于“inode”中,文件内的数据则存放在“数据区块”中。另外还会有超级区块(superblock)会记录整个文件系统的整体信息,包括inode和数据区块的总量、使用量和剩余量等。
每个inode和数据区块都会有编号。
- 超级区块:记录此文件系统的整体信息,inode和数据区块的总量、使用量和剩余量,以及文件系统格式等相关信息。
- inode:记录文件属性,一个文件占用一个inode,同时记录该文件的数据所在的数据区块号码。
- 数据区块:真正存储文件数据的地方,如果文件较大,这回产生多个数据区块。
其中ext2 的inode 、 数据区块的大小、个数是在格式化文件系统时设置并固定写死的。如需修改则需重新格式化该文件系统。
例如:有一个文件存储的内容很多,理所应当的占用较多的磁盘容量。如果一个数据区块的大小设置为1K,文件总大小为3k,则存储该文件应需要3个大小为1k的数据区块。
此时文件操作系统会根据inode中数据区块地址一口气将3个block内的数据读取出来。这种存取的方法称为 索引式文件系统(indexed allocation)
常见的U盘文件系统格式一般为FAT格式。该文件系统并没有inode的存在,存储数据时,没办法一次性找出所有数据的存储地址,它会找到第一块存储地址,然后读取到末尾时才会知道第二块存储地址。
由于fat文件系统文件存储机制,只有读取到一个data black的末尾才能知道下一个数据区块的地址,如果一个文件有多个数据区块且在磁盘的储存位置较为分散时,读取文件数据就会多消耗一部分时间用于磁盘寻址,读取效率降低。
如何解决:将该文件复制出去再复制回来。
2.2 ext2 的 inode
上面说到ext2 的inode 、 数据区块的大小、个数是在格式化文件系统时设置并固定写死的。如需修改则需重新格式化该文件系统。
如果磁盘较大,将所有的inode和数据区块放到一个磁盘上,是非常不明智的,因为较大的磁盘容量势必会有更多的inode和数据区块,不易管理。
所以ext2文件系统在格式化的时候会分为多个区块群组(block group),每个区块群组都有独立的inode、数据区块、超级区块。就像在部队,一个营分为多个连,每个连都有自己的联络系统,但最终都要向营部汇报。
ext2就有点类似:
每个文件系统的最前端都有一个启动扇区,该扇区可以安装启动引导程序。
每个区块群组包含:超级区块、文件系统描述、inoder对照表、数据区块对照表、inoder table和datablock。
superblock:主要存储文件系统相关信息。
主要存储有:
- inode与数据区块总量。
- inode与数据区块使用、未使用量。
- inode与数据区块的大小。(block为1K、2K、4K,inode为128、256)
- 文件系统挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等文件系统的相关信息。
- 一个有效数字为,以判断该文件系统是否被挂载,0已挂载,1未挂载。
注意:每个区块群组都可能会有一个超级区块,但仅有一个超级区块是为主要的,其余超级区块作为备份,一旦该文件系统故障后可用于恢复。
文件系统描述(filesystem description)
主要记录文件系统中区块群组的开始与结束区块,以及说明每个区段(inode、数据区块、超级区块)所在那个区块之间。
inode对照表
只是记录使用和未使用indoe号码。
数据区块对照表
与inode对照表类似,仅记录使用与未使用数据区块号码。
inode table
主要记录文件或目录的权限(own 的 rwx,group 的 rwx,other 的 rwx)、属性(mtime,ctime,atime、own、group,附属组,filesize 、文件真正内容的指向)。
记录每个inode 的大小。(固定为128b或256b)
还有一部分是存储数据区块的指向:12个直接记录区、1个间接记录区、1个双间接记录区和1个三间接记录区。
每个记录区占用4B。
间接记录区指该位置指向一个数据区块,该数据区块用于存储真正存储数据的数据区块的地址。
三间接记录区也是如此。如下图:
可使用dumpe2fs 文件系统名来查看具体信息。
2.3 与目录树的关系
上面有提到无论是文件还是目录都会占用一个inode,目录在文件系统中又如何存在的呢?
一个目录占用一个inode,其中inode中记录了目录的目录名、权限即各种属性,在inode原指向文件数据存储的数据区块,则在目录中存储的是目录下的文件或目录的inode和文件名对照表。
在读取/etc/passwd 文件时:
- 查找 / 的indoe,根据 / 的inode查找并验证所操作的用户是否有足够权限读取该区块的内容。
- 根据步骤 1 取得数据区块地址,找到 内容有 etc/ 所对应的inode
- 根据步骤2 取得的inode 查找并验证该用户具有r x权限。所以可取该数据区块内的文件内容。
- 经过步骤3取得 内容有passwd 所对应的 inode。
- 读取inode的权限信息,得知该操作用户具有r权限,因此可以让该用户读取该文件内容。
- 找到该inode的数据区块指向,并通过该数据区块读取该区块数据。
2.4 日志文件系统
ext2的元数据:超级区块、inode对照表 和 数据区块对照表,因为每次对文件或目录的新增、删除、编辑都会影响到这三个部分的数据,因此被称为元素局。
数据不一致(inconsistent)状态:
当出现突然断电等来不及将内存中的数据同步到磁盘时,重新启动系统就会出现元数据不一致的状态(指只对inode对照表或数据区块对照表更新,未对超级区块更新或其他元数据未同步的情况)。
早期ext2会根据超级区块中有效数位与文件系统是否有挂载来强行检查数据是否一致。
后来日志式文件系统(Journaling filesystem)专门规划处一个区块,该区块专门记录写入或修改文件时的步骤,以便检查数据一致性问题。
具体步骤
- 预备:当系统要写入一个文件时,会先将即将写入的信息在日志记录区记录。
- 实际写入:文件系统开始写入权限、属性及文件数据,并更新matedata的数据。
- 结束:当metadata数据更新后,系统会在日志记录区快当中完成该文件的记录。
2.5 文件系统的运行
linux未解决较大文件编辑时加载需要频繁的回写到磁盘的问题,采用了异步处理(asynchronously)的方式。
即:编辑一个文件时,如果内存中的数据被修改了,系统会将该数据标记为【脏的(dirty)】,此时对该文件的所有操作都仅限于内存当中。系统会不定时的将标记为dirty的数据回写到磁盘,以保证数据的一致性。
也可用sync强制将dirty数据回写磁盘。
2.6 挂载点的意义(mount point)
将文件系统挂载到某一目录下的操作称为 【挂载】。
注意: 挂载点一定是目录,该目录为进入该文件系统的入口。如该目录下有其他数据,当挂载新文件系统后,这些文件会暂时隐藏,直到文件系统卸载才会重现。
例如:/ /boot /home 的挂载点都是 根目录( / )inode 为 64
新建文件夹的被链接数会自动变为 2 ,是因为创建文件夹时除了源文件外,还会自动在该文件夹下创建 “ . ”,以及上层文件夹内会链接子目录的inode与目录名。
3. xfs文件系统
从CentOS7开始,默认的文件系统由 ext4 变为了 xfs。
ext4 由于格式化慢,支持的硬盘容量有限,对于大容量磁盘的性能、效率相对xfs较低。
xfs:早起被用于高容量磁盘以及高性能文件系统之用。ext4所具有的的功能,xfs基本上也具有。
xfs在数据分布上,主要规划三部分:
3.1 数据区(data section)
与ext系列一样,都包括了inode、数据区块、超级区块等,都放在该区域。该区域与ext系列类似,也具有存储区群组(allocation groups)。
每个AG都包含了:a. 整个文件系统的超级区块b. 剩余空间管理机制c. inode的分配与跟中**注意:** 该文件系统的inode是动态产生的,所以格式化超快。每个数据区块的大小可在512B~64K中调整,linux由于存储控制的关系(页面文件pagesize的容量之故),因此最大区块进4K。每个inode的大小在256B~2MB。(256B够用了)
3.2 文件系统登录区(log section)
类似于日志区。文件系统对文件所有的变化都会在该区记录,知道完成的将文件写入数据区后,才会结束该记录的记录。每当文件系统损坏是,系统都会检查该区块。xfs可以指定外部磁盘作为文件系统的日志区。(mkfs.xfs -l logdev=/dev/sda99 /dev/sda4)
3.3 实时运行区(real section)
当有文件要被建立时,xfs会在这个区段内找到一个到数个的extent区块,将文件当知道该区块内,等分配完毕后,再写入data section的inode与区块中。这个extent的大小在格式化时就指定了,最小4K到1G。一般非磁盘阵列的磁盘默认值为64K,有类似磁盘阵列的stripe情况下,建议将extent与stripe一样大。不要随意乱动extent,因为可能会影响到物理磁盘的性能。
查看下xfs文件系统的数据:
利用xfs_info 挂载点|设备文件名 查看超级区块内容数据
第一行:
isize:inode的大小,512B
agcount:存储区群组的个数(目前有4个AG),与cpu处理器个数有关。
agsize:每个AG共有多少个区块。配合第四行bsize 区块大小为4K,因此整个文件系统的容量为 46553604096这么大
第二行:
sectsz:逻辑扇区(sector)的大小(单位B)
第四行
bsize:数据区块的大小。
blocks:文件系统内共有的区块总量。
第七行:
internal:指 log section 的位置在该文件系统内。且占用了4096*2560这么大。
第九行:
realtime: extent大小为4096,但目前还未使用。
3.4 文件系统的简单操作
3.4.1 查看磁盘容量 df
df [目录或文件名]-a 列出所有文件系统,包括/proc等文件系统-k 以kbytes的容量显示-m 以mbytes的容量显示-h 以较为已读的容量单位自动显示(GBytes、MBytes、KBytes)-T 连同硬盘分区的文件系统名称也列出-H 以 M=1000KB 代替 M=1024K-i 以inode编号代替磁盘容量
在某子目录下进行 df /子目录时,会直接列出该子目录所在的设备即挂载点。
特别注意 /dev/shm/ 这一目录,因为该目录是通过内存模拟出来的磁盘,在此磁盘下建立任何数据文件时,访问速度是非常快的。
3.4.2 查看目录所占的大小 du
du [文件或目录名称]-a 列出目录下所有文件与目录容量,默认只有文件-s 仅列出总量-S 不包括子目录下的统计(仅统计该目录下所占的容量)-k 以KBytes列出容量显示-m 以MBytes列出容量显示-h 以较为已读的容量单位自动显示(GBytes、MBytes、KBytes)
注意:统计到的数值为该文件占用block个数的容量,并非真实大小(比如bsize=4K,file真实大小为2K,则统计出来的大小为4K)。
3.4.3 硬链接和软连接 ln
ln 源文件 目标文件-s 建立软连接-f 如果目标文件存在,删除重新建立
注意:没有选项参数则默认建立硬链接
什么是软链接?可以理解为Windows的快捷方式。
什么是硬链接?硬链接相当于在两家超市都办了VIP卡,可能为了不想让别人知道你叫什么,所以只留了相同的手机号和不同的姓名。而这两家超市都可以通过这手机号联系到你。
在linux中,硬链接只是在目标目录的数据区块中,将链接原文件的inode 拷贝一份,更改/不更改文件名的操作。也就是将其inode信息复制一份到目标目录下,可以修改文件名或不修改文件名。两个目录下记录文件除了文件名外其他均相同。
注意:硬链接并不会消耗inode,因为文件数据同样指向原文件数据区块,所以也不会分配新的data block。硬链接不能夸文件系统!
如果在一个文件建立的有硬链接,删除源文件或链接文件后,不影响源文件或链接文件的正常使用。
软连接:上面说道,类似于Windows的快捷方式,在建立软连接时,系统会为在目标目录下新生成一个inode,也就是新生成一个文件,不过该文件的数据区块记录的是源文件的文件名。访问链接文件就是相当于在访问源文件。
注意:
1、文件建立软链接后,源文件和链接文件对文件数据进行编辑都会直接修改文件数据,源文件删除后,链接文件不能正常打开。
2、链接文件的大小为链接文件名的字符个数*1B的大小。
4. 磁盘分区、格式化、检验与挂载
一个磁盘要想能使用,应该有一下几个步骤:
- 分区:对磁盘进行划分,建立可以使用的硬盘分区(gdisk,fdisk)
- 格式化:建立可以使用的文件系统(mkfs.xfs,mkfs -t ext4)
- 检验:对刚建立的文件系统进行检验(xfs_repair,ckfs.ext4)
- 挂载:对文件系统进行挂载(mount)
4.1 观察磁盘分区状态
lsblk
lsblk list block device 的缩写-t 列出磁盘详情信息-p 同时列出磁盘完整名-f 同时列出磁盘文件系统-d 仅列出磁盘本身,不会列出分区数据-i 使用SCII的字符输出-m 同时输出该设备在/dev下的权限信息
NAME :设备名,-p会加上/dev
MAJ:MIN:主要与次要设备代码
RM:是否为可写卸载设备
SIZE:设备容量
RO:是否只读
TYPE:disk 磁盘,part 分区,rom 只读等
MOUNTPOINT: 挂载点
blkid
查看设备UUID文件系统类型,
blkid [设备名]
也可以使用xfs_admin -u 设备名 查看
parted
查看磁盘分区表类型与分区信息
parted device name print 直接打印磁盘信息rm [partition] 删除分区mkpart [primary | extend | loygic] [xfs | ext4 | vafat] 开始 结束 #新增分区注意:开始 和 结束 使用的是分区 起始位置 或 结束位置 在这块磁盘的多少MB处,以容量为单位。
parted 主要用于脚本内对分区的操作。直接可用命令进行 新增分区 、 删除分区。
4.2 磁盘分区
除了上面的parted可以进行分区外,还可以使用 gdisk,fdisk进行交互式分区:
gdisk
主要用于 xfs 文件系统的分区:
gdisk device name常用命令:n 新增分区d 删除分区p 打印现有分区情况w 保存操作并退出q 不保存操作并退出
注意:分区完成之后需要使用:partprobe [-s 打印分区编号]
来更新linux内核中分区表信息
**在这里值的注意的是:**新增分区的时候,磁盘容量需要使用“+”来作为前缀,如果此选项直接回车(默认值)则会用掉所有剩余空间。(除标红项其余全是回车(默认值))。
fdisk
主要用于对MBR进行分区,用法与gdisk大同小异。暂不过多了解。如有后期需要再来补充。
4.3 磁盘格式化
mkfs.xfs
对分区格式化成xfs格式的文件系统
mkfs.xfs 分区路径-b:后面接区块容量,可由512k到64k,不过最大容量限制为Linux的4K。-d:后面接的是重要的data section的相关数值,主要有:agcount=数值:设置需要几个存储群组的意思(AG),通常和CPU核数有关查看CPU核数数量:grep ‘processor’ /proc/cpuinfoagsize=数值:每个AG设置为多少容量的意思,通常agcount/agsize只选一个设置即可。file:指的是【格式化的设备是个文件而不是设备】的意思(例如虚拟磁盘)size=数值:data section的容量,亦即你可以不将全部的设备容量用完的意思su=数值sw=数值=数值sunit=数值swidth=数值-i:与inode有较相关的设置,主要的设置有:size=数值:最小是256Bytes最大是2K,一般保留256就足够使用了。internal=【0|1】:log设备是否为内置,默认为1内置,如需要用外部设备,使用下面设置:logdev=device:log设备为后面接的那个设备上面的意思,需设置internal=0才行。size=数值:登陆这块登录区的容量,通常最小得要512个区块,大约2M以上才行。-r:指定realtime section的相关设置值,常见的有:extsize=数值:就是重要的extent数值,一班需要设置。-f:如果设备内容已有相关设置,则需使用这个-f来强制格式化才行。
查看linux的CUP个数:
grep 'processor' /proc/cpuinfo
4.4 文件系统检验
xfs_repair 处理xfs文件系统-f:后面的设备其实是个文件而不是实体设备-n:单纯检查并不修改文件系统的任何数据(检查而已)-d:通常在单人维护模式下面,针对根目录(/)进行检查与修复的操作,很危险,不要随便使用。-L:清楚文件系统log缓存
注意:检测的的文件系统必须是为挂载的。Linux有个设备无法被卸载,那就是根目录。如果根目录有问题,则需要进入单人维护或恢复模式,然后通过-d这个选项来处理。
fdisk.ext4 处理ext4文件系统-p:当文件系统在修复时,若有需回复y的,自动回复y继续修复。-f:强制检查,一般来说如果fsck没有发现任何unclean的标识,不会主动进入。-D:针对文件系统下的目录进行最佳化配置。-b:后面接超级区块的位置,一般用不到,如过superblock苏怀,通过这个阐述即可利用文件系统内本分的超级区块来尝试恢复。一般来说,超级区块备份在:
1K区块放在8193,2K区块放在16384,4K区块放在32768.
4.5 挂载 和 卸载
4.5.1 挂载:
mount 设备名 挂载点UUID=“” 挂载点LABLE=“” 挂载点只输入mount会列出目前挂在信息。-l 可增列Label名称-a 依照配置文件/etc/fstab 的数据将所有未挂载的磁盘都挂载上来。-t 后接文件系统种类。-n 一般情况下系统会默认将挂载的文件系统写入到/etc/mtab中,为避免问题会刻意的不写入,该情况刻用-n-o 接一些挂载时额外的参数。async,sync :文件系统是否适用同步写入、或非同步的内存机制,默认asyncro,rw :挂载文件系统成只读、可读写suid,nosuid:是否允许此文件系统含有suid/sgid的文件格式exec,noexec:是否允许fs上拥有可执行二进制文件user,nouser:是否允许fs让任何使用者执行mount,一般来说,mount仅有root可以执行,但执行user参数,可以让一班user也能够对此分区进行mount。atime,noatime:是否修改文件读取时间。为了性能,某些时刻可以使用noatime。auto,noauto:修改此fs被以mount -a自动挂载dev,nodev:是否允许fs可建立设备文件?dev允许default·:默认值:rw、suid、dev、exec、auto、nouser and async。remove:重新挂载,在系统出错或更新参数是有用。--bind:将目录挂载到挂载点是上loop:挂载特殊设备。
挂载时,文件系统是根据UUID来识别文件系统的。所以最好是根据UUID进行挂载。
将一个目录挂载到另一个目录上:需要在选项上加上 --bind
挂载特殊设备loop
mount -o loop 镜像文件路径 挂载点。
也可以用该指令挂载大型文件
挂载iso设备
挂载大型文件
这里用到的 dd 压缩命令,下面会写到。
4.5.2 卸载:
umount device name-f 强行卸载-l 立即卸载,比-f还强-n 不更新/etc/mtab直接卸载
注意:卸载时如果当前所在目录在该文件系统中,需出该挂载点才能卸载。
4.5.3 swap 的挂载和卸载
swap作为交换分区,用于当系统内存不足的情况下将不常用的数据暂放于此。
1、使用gdisk创建一个swap(编号8200)的分区
2、然后格式化为swap格式的分区
3、最后启用swap设备
1、创建swap分区:
gdisk 创建512大小的swap分区:
2、格式化swap分区:
mkswap 设备名
3、挂载或卸载swap分区:
挂载swap设备
swapon 设备名 -s 查看已有的swap使用情况-a 挂载所有swap设备卸载swap设备
swapoff 设备名
挂载时注意:
① 根目录要优于其他挂载点挂载。
② 挂载点必须是以存在的目录,可任意指定,但必须准守系统目录架构原则FHS
③ 所有挂载点在同一时间内只能挂载一次。
④ 所有硬盘分区在同一时间内只能挂载一次。
所有的设备需要写到 /etc/fstab 该配置文件中才能随系统启动 或 通过 mount -a 自动挂载
注意:更新/etc/fstab 该配置文件 系统会自动同步到 /etc/mtab 和 /proc/mounts 中。
在配置/etc/fstab时,如果是文件系统建议使用UUID进行配置,如果是文件格式化的设备,建议使用文件名来配置,因为系统只能查询区块设备的UUID,不会查询文件。
基于centos7学习总结 -- 文件系统相关内容相关推荐
- 数据挖掘课程学习——序列模式发现相关内容调研
数据挖掘课程学习--序列模式发现相关内容调研 本次实验完成"序列模式发现"的相关内容调研,主要内容包括:什么是序列模式发现:应用在哪些领域:经典的算法有哪些:应用在怎样的数据上:得 ...
- 学习图神经网络相关内容
本周学习情况 本周学习任务: 学习图神经网络相关内容 图基本知识(连通分量.度中心性.特征向量中心性.中介中心性.接近中心性.PageRank.HITS)并使用networkx包简单实践. 学习了相关 ...
- 基于深度学习的立体匹配相关论文总结
1.<End-to-End Learning of Geometry and Context for Deep Stereo Regression> 详细内容 发表时间:2017年3月13 ...
- linux创建xfs文件系统命令,通过案例学习xfs文件系统相关命令
在我们另一篇文章中,我带您领略了一下什么是 xfs,xfs 的相关特性等内容.本文我们来看一些常用的 xfs 管理命令.我们将会通过几个例子来讲解如何创建 xfs 文件系统,如何对 xfs 文件系统进 ...
- 基于centos7学习总结 -- vi与vim
vi与vim vi 和 vim 基本上可以分为3种模式:一般模式.编辑模式 和 命令行模式 一般模式:vi 打开一个文件就直接进入一般模式了,可以使用上.下.左.右按键(k.j.h.l)移动光标,也可 ...
- 图论学习NO2.图论相关内容了解
一.图论基础知识 图论相关概念 :https://wenku.baidu.com/view/a65d646858fafab069dc024c.html?sxts=1563948479936 二.Flo ...
- 基于统计学习---面向新闻的发生地与提及地检测
基于统计学习---面向新闻的发生地与提及地检测 一.摘要 二.流程 2.1- 数据构建及数据预处理 2.2- 全国5级地址实体二叉树 2.3- 命名实体识别相关算法 2.4- 新闻中特征信息分析 2. ...
- 三角兽首席科学家分享实录:基于对抗学习的生成式对话模型
本文来自AI新媒体量子位(QbitAI) 对抗学习和对话系统都是近年来的新热点.今年7月,三角兽研究组与哈工大ITNLP实验室合作完成的论文被自然语言领域顶级会议EMNLP录取. 上周三(8月9日)晚 ...
- 基于深度学习的推荐系统(一)Overview
这是对近年来基于深度学习的推荐系统的内容的一份综述,具体来说,大部分内容来自 Deep Learning based Recommender System: A Survey and New Pers ...
最新文章
- go语言json的使用技巧
- 建立数组并写入数据_redis高并发利器:神奇的位操作,底层原理、数据结构剖析...
- 向Hadoop集群添加一个新的节点
- ip打包相对路径 vivado_Vivado自定义IP封装流程
- python开始print_当你使用print时,Python是怎么运行的
- php js获取元素id,javascript通过中文id和class获取元素的方法
- Android总结篇系列:Activity中几个主要函数详解
- 在MySQL中以下属于ddl语句的_ddl语言(以下哪些命令是ddl语句)
- 融思杯 第三届 部分wp
- android为APK新建SELINUX权限域seapp_contexts
- AltiumDesigner16安装教程
- java生成点阵图_点阵字库在JAVA中的实现
- 国外科研论文搜索网站汇总
- 路由器的虚拟服务器干嘛用的,dmz和虚拟服务器(tp路由器虚拟服务器能干嘛)...
- 常用逻辑电平标准总结
- c++中的ignore和tie
- 计算机教师资格证难不难考,教师资格证 信息技术难考吗
- [转载]我的时间管理与方法论
- java读书心得_深入理解Java虚拟机阅读心得(三)
- 使用alist连接百度网盘和阿里云盘挂载到本地磁盘