linux-磁盘相关

具体参考鸟叔的私房菜 以下内容为学习总结之用,以及自己的心得

磁盘的组成

磁盘由磁盘盘,机械手臂,磁盘读取头、主轴马达组成
磁盘盘有两种单位,1.扇区,2.磁道
扇区的物理量设计有两种大小,1. 512bytes,2.4Kbytes
复制代码

盘片 片面 和 磁头

参考地 址https://www.cnblogs.com/jswang/p/9071847.html

硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。
受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。
盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。
如下图:
复制代码

图1

扇区 和 磁道

下图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,
从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图践绿色部分)。
扇区是磁盘的最小组成单元,通常是512字节。(由于不断提高磁盘的大小,部分厂商设定每个扇区的大小是4096字节)
复制代码

图2

磁头 和 柱面

硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。
磁盘的柱面数与一个盘面上的磁道数是相等的。由于每个盘面都有自己的磁头,因此,盘面数等于总的磁头数。 如下图
复制代码

图3

磁盘分区

为什么需要磁盘分区

把不同文件放于不同分区
ex:1.系统文件在一分区,2.数据文件在二分区,3.日志文件在三分区
1.易于管理和使用
2.有利于数据安全;
3.节约寻找文件的时间
复制代码

磁盘分区方式-MSDOS(MBR)|GPT

一圈一圈的磁柱与分区有什么关系呢?爱的魔力转圈圈

从外圈0开始形成一个一个的磁柱,磁柱是分区槽的最小单位,意味着比如A分区最少为1磁柱,这个是MBR分区方式
但是GPT,由于GPT的分区表有更大的空间支持,所以分区的最小单位为1扇区
复制代码

MBR简介

MSDOS 全称Microsoft Disk Operating system 微软磁盘操作系统
MBR 全称 Master Boot record-主要开机记录取
由于linux早期为了兼容Windows磁盘,因此使用的是Windows的MBR的方式来处理开机管理程序与分区表
复制代码

MBR

MBR一般存在磁盘的第一个扇区
磁盘的第一个扇区
1.由主要启动记录器MBR:可以安装开机管理程序的地方,446bytes
2.分区表:记录整颗磁盘的分区状态,64bytes;
由于分区表只有64bytes,所以只能记录4组记录,意味着只能有4个分区
复制代码

分区类型

分区类型有两种1.主分区primary partion和2.Extended partion 扩展分区
主分区最多有4个,扩展分区最多有一个
因为扩展分区Extened还可以拆分成多个逻辑分区Logical partion
同时由于分区的最小单位为连续的磁道组成的磁柱,因此把扩展分区Extended partion放在最后一个分区
同时Extended 也方便扩容
推荐的分区方式 P P P E(L,L,L...)
复制代码

MBR的限制

1.操作系统无法抓取到2.2T以上的磁盘容量,因此要把磁盘一个一个拆出来 拆成逻辑分区
2.同时MBR只存在于一个扇区,如果损坏,将无法使用
3.MBR的开机管理程序区块只有446bytes,无法容纳更多的代码
复制代码

所以出现了GPT分区,GPT分区解决了上述问题

GPT

GPT扇区大小 512bytes----4KBytes
早期的扇区大小为:512bytes
GPT为了兼容所有磁盘,因此在扇区的定义上,大多使用逻辑区块地址(Logical Address,LBA)512bytes
GPT使用了34个LBA区块记录分区信息,整个磁盘的最后33个LBA也拿来做备份
这样GPT就解决了
1.操作系统无法抓取2.2T以上的磁盘容量
2.如果GPT的扇区损坏,可以用备份扇区
LBA0,存储了第一个阶段的开机管理程序
LBA1,GPT表头,记录了分区表的位置和大小和备份的分区表位置
LBA2-LBA33,实际记录分区信息

复制代码

lsblk(list block devices)

[root@VM_158_86_centos ~]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  50G  0 disk  #硬盘
└─vda1 253:1    0  50G  0 part / #分区

复制代码

查看分区类型 parted

[root@VM_158_86_centos ~]# parted /dev/vda1 print
Model: Virtio Block Device (virtblk)
Disk /dev/vda1: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: loop #这里显示为loop其实是为MBR,如果为GPT会显示gpt
                            
Disk Flags: 

Number  Start  End     Size    File system  标志
 1      0.00B  53.7GB  53.7GB  ext3

复制代码

文件系统

文件系统简诉

磁盘分区完毕后需要格式化,之后操作系统才能使用这个文件系统,为什么需要格式化呢?
因为每种操作系统设定的文件属性/权限并不相同

文件系统格式
windows98:FAT16
windows2000...:NTFS
Linux:Ext2

传统的磁盘与文件系统应用中,
一个分区槽只能被格式化成为一个文件系统,也就是一个partion对应一个文件系统

新的磁盘与文件系统应用中,
LVM:Logical Volume Manager,可以把一个partion格式化为多个文件系统
RAID:Redundant Arrays of Independent Drives,将多个分区槽合成一个文件系统
因此,目前我们在格式化时已经不再说针对partition来格式化了,一个可被挂载的数据为一个文件件系统,而不是一个分区槽
复制代码

文件系统三元素

superblock:记录此filesystem 的整体资讯,包括inode/block的总量、使用量、剩余量, 以及档案系统的格式与相关资讯等;
inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的资料所在的block 号码;
block:实际记录档案的内容,若档案太大时,会占用多个block 。
复制代码

索引式文件系统

索引式
EXT2:有inode 记录了该文件所有占用的block号,可以直接通过inode取出所有block
非索引式
FAT:没有inode,不能直接取出全部,只能通过上一个block记录的下一个block取出
复制代码

文件系统一开始将inode与block规划好了

档案系统一开始就将inode与block规划好了,除非重新格式化(或者利用resize2fs等指令变更档案系统大小),否则inode与block固定后就不再变动
复制代码

为什么需要 block group

当文件系统高达数百GB时,如果把inode和block放在一起,inode和block就会太过于庞大,为了方便管理 引入 block group 来处理

ext2文件系统格式化时候基本上是区分多个block group,每个block group都有独立的inode/block/superblock 并且文件系统最前面有一个启动扇区,相当于每个文件系统的挂载点,可以安装不同的开机管理程序

block的特性

原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
每个block 内最多只能够放置一个档案的资料;
承上,如果档案大于block 的大小,则一个档案会占用多个block 数量;
承上,若档案小于block ,则该block 的剩余容量就不能够再被使用了(磁碟空间会浪费)。
复制代码

inode记录的属性

该文件的存取模式(read/write/excute);
该文件的拥有者与群组(owner/group);
该文件的容量;
该文件建立或状态改变的时间(ctime);
最近一次的读取时间(atime);
最近修改的时间(mtime);
定义文件特性的旗标(flag),如SetUID...;
该文件真正内容的指向(pointer);
复制代码

inode特性

每个inode 大小均固定为128 bytes (新的ext4 与xfs 可设定到256 bytes);
每个文件都仅会占用一个inode 而已;
承上,因此文件系统能够建立文件案数量与inode 的数量有关;
系统读取文件时需要先找到inode,并分析inode 所记录的权限与使用者是否符合,若符合才能够开始实际读取 block 的内容。
复制代码

block 与inode 的大小

block 为1, 2, 4K,
inode 为128bytes 或256bytes
复制代码

假设我一个档案有400MB 且每个block 为4K 时, 那么至少也要十万笔block 号码的记录呢!inode 哪有这么多可记录的资讯?

因此Inode记录block号码的区域被系统灵活的设计为
12个直接指向,1个间接指向,1个双间接指向,1个三间接指向,
复制代码

当block大小为1k(1024byte)时,每个block号码占用4byte,也就是1k能记录256个block号码 对应这256个block

inode以及对应的1k单位block的单一文件大小限制

12个直接指向: 12*1K=12K 
由于是直接指向,所以总共可记录12笔记录,因此总额大小为如上所示;

间接: 256*1K=256K 
每笔block号码的记录会花去4bytes,因此1K的大小能够记录256笔记录,因此一个间接可以记录的档案大小如上; 

双间接: 256*256*1K=256 2 K 
第一层block会指定256个第二层,每个第二层可以指定256个号码,因此总额大小如上;

三间接: 256*256*256*1K=256 3 K 
第一层block会指定256个第二层,每个第二层可以指定256个第三层,每个第三层可以指定256个号码,因此总额大小如上;

总额:将直接、间接、双间接、三间接加总,得到12 + 256 + 256*256 + 256*256*256 (K) = 16GB
复制代码

当block为2k或4k时,计算结果也会相应的增大,分别为256GB和2TB

但是有些软件或文件系统不支持大于2k的block设计

superblock特性

block 与inode 的总量;
未使用与已使用的inode / block 数量;
block 与inode 的大小(block 为1, 2, 4K,inode 为128bytes 或256bytes);
filesystem 的挂载时间、最近一次写入资料的时间、最近一次检验磁碟(fsck) 的时间等档案系统的相关资讯;
一个valid bit 数值,若此档案系统已被挂载,则valid bit 为0 ,若未被挂载,则valid bit 为1 
复制代码

为什么一个文件系统只有一个superblock 而不是一个block group一个superblock

每个block group 都可能含有superblock
但是我们也说一个档案系统应该仅有一个superblock 而已,那是怎么回事啊?
事实上除了第一个block group 内会含有superblock 之外,
后续的block group不一定含有superblock , 
而若含有superblock 则该superblock 主要是做为第一个block group 内superblock 的备份,
这样可以进行superblock的救援
复制代码

EXT家族查询inode block superblock

[root@VM_158_86_centos ~]# blkid
/dev/vda1: UUID="49f819fd-e56d-48a4-86d3-7ebe0a68ec88" TYPE="ext3" 
[root@VM_158_86_centos ~]# dumpe2fs -h /dev/vda1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          49f819fd-e56d-48a4-86d3-7ebe0a68ec88
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              3276800
Block count:              13106944
Reserved block count:     655341
Free blocks:              10647845
Free inodes:              3163700
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      508
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Thu Apr 21 15:00:29 2016
Last mount time:          Thu May 23 12:02:40 2019
Last write time:          Thu May 23 12:01:29 2019
Mount count:              16
Maximum mount count:      -1
Last checked:             Thu Apr 21 15:00:29 2016
Check interval:           0 (<none>)
Lifetime writes:          736 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:	          256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       139996
Default directory hash:   half_md4
Directory Hash Seed:      e74c0d45-bdb1-4aaa-9864-f29ad06e91c1
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
日志大小:             128M
Journal length:           32768
Journal sequence:         0x0066dd50
Journal start:            22289


Group 0: (Blocks 0-32767)-   ##这个就是block group 0
  主 superblock at 0, Group descriptors at 1-4
  保留的GDT块位于 5-512
  Block bitmap at 513 (+513), Inode bitmap at 514 (+514)
  Inode表位于 515-1026 (+515)
  26201 free blocks, 8173 free inodes, 2 directories
复制代码

查询inode号码

[root@VM_158_86_centos ~]# ls -li
总用量 16
131079 -rw-------. 1 root root 2523 4月  21 2016 anaconda-ks.cfg
131086 drwxr-xr-x  2 root root 4096 9月   4 2018 dockerTest
133347 drwxr-xr-x  4 root root 4096 5月  17 16:08 linux_learn
223431 drwxr-xr-x  3 root root 4096 9月  29 2018 project
复制代码

目录的inode和block

当创建一个目录时,文件系统会分配一个inode以及至少一个block给目录
目录的inode:记录了目录的属性和权限,以及目录对应的block
目录的block:记录了该目录下的文件的inode和文件名

为什么文件系统会分配至少一个block,而不是一个?
一个block号占用4byte,一个文件名(文件名不相同)大概就6byte,
这样假如1个1k的block只能记录100个文件,那当超出的文件就只能有inode的下一个直接指向来处理
复制代码

目录的block图:

文件的inode和block

当创建一个文件时,其他都目录类似,只是文件的block存储的是真实的数据
当第一个block容量不够时,会用下一个直接指向,间接指向...
复制代码

转载于:https://juejin.im/post/5cf72e7f6fb9a07ed5248d95

猜你喜欢

转载自blog.csdn.net/weixin_34419321/article/details/91448440