基本概念
所谓分区就表示将多个连续的扇区组成一个单独的逻辑区域
分区表
目前有两种格式的分区表MBR(Master Boot Record)和GPT(GUID partition table)
MBR
MBR其实是Windows用来处理开机管理程序与分区表的方式,MBR约定了将开机引导程序和分区表通通存放在硬盘的第一个扇区,这个扇区通常是512字节(Bytes)大小、
其中分区表占用64字节,而分区表记录一个分区需要使用16字节,这就导致了该分区表最多只能记录4个(64/16)分区。这里的四个分区就叫主分区(Primary Partition)
扩展分区,解决想分区第5个分区。扩展分区也要占用16字节,所以只能有3个主分区,1个扩展分区(操作系统限制,扩展分区至多只能有一个)。
逻辑分区,扩展分区不能直接使用,还要用它来创建1个逻辑分区
只有主分区和扩展分区占用分区表(64Bytes)的空间。所以扩展分区只需要记录一下自身的边界以及第一个逻辑分区的EBR地址,他就能以链表的形式找到所有的逻辑分区。
MBR痛点:不能正常识别2TB以上的硬盘,原因在于MBR分区表使用32位来表示分区的起始和结束位置(每个扇区大小512字节 2^ 32,所以最大扇区也就2TBytes)
GPT
为了同时兼容512字节和4k扇区,GPT分区表引出了LBA(Logical Block Addressing逻辑区块地址)的概念,每个逻辑区块默认为512字节大小,对应过去的一个扇区大小。
GPT使用了硬盘的前34个LBA。假设硬盘的物理扇区是4K,那每个扇区就可以有8(4*1024*512)个LBA。34个LBA就只需要5个不到的(24/8=4.25)扇区就能记录。
第一个LBA称为LBA0(从0开始编号),为了避免这些LBA损坏就凉凉,还会使用最后的33个LBA来备份前边的LBA1-33
LBA0 - MBR兼容区块,结构跟MBR的第一个扇区一样,前446字节依然是引导程序,MBR保存分区表的64字节被GPT设置成了一个特殊标记用来识别此硬盘使用GPT格式。
LBA1 - 用作GPT表头记录,他记录了分区表位置、分区表校验码(如果不对通过备份还原)、以及硬盘最后备份LBA区块的位置等信息
LBA2-33 - 则用作分区表记录,每个LBA对应区块可以记录4个分区信息,所以2-33 一共可以记录128个分区信息
总结
注意UEFI的支持
硬盘分区实践
查看块设备及硬盘分区信息
插入 新硬盘后查看块设备 lsblk
part就是已经分区了的硬盘,这里可以对sda进行分区
# 查看当前各个硬盘的分区信息
fdisk -l
Disklable type:分区表类型 gpt
哪块硬盘已经分区,多少扇区,大小是多少(409600*512/1024/1024=200M)每个扇区512字节转kb mb
分区操作
默认MBR分区表形式分区
# 对sda进行分区
fdisk /dev/sda
# 输入m查看帮助
# 输出n创建分区默认第一个主分区
# 设置起始扇区-结束扇区 如果想20G。就不用计算了直接 输入 +20G
# p 命令查看
# 注意doc 就是mbr分区表 只能4个主分区 的限制 或者3个主分区 1个扩展分区,在扩展分区里添加逻辑分区
# w 保存
更改为GPT分区表形式分区
# 对sda进行分区
fdisk /dev/sda
# 输入g 转换成GPT格式分区表
# 输入p 已经变成GPT分区表
# 输入n 创建分区即可
# p 查看。 w 保存
文件系统概念
分区完成后需要对硬盘进行格式化,而格式化这个操作就是在硬盘设备内组织一个文件系统。
文件系统解决管理文件在硬盘的存放等信息,便于快速找到文件,提高效率
不同操作系统所设计的文件属性、权限并不相同,所以不同操作系统都有适合自身的文件系统
通过stat命令查看的内容也是文件属性
文件系统通常会将文件属性和文件的实际内容存放在不同的地方,
存放属性的地方叫inode
存放实际内容的地方这叫做data block 也叫数据块
另外还有一个存放文件系统整体信息的super block 也叫超级块
每个inode和data block都有一个编号。一个文件会占用一个inode ,这个inode会同时记录该文件实际内容数据所在的data block编号,文件很大时data block会很多
super block记录的包括inode、data block 的总量、已使用量、剩余量、文件系统格式等信息
索引式文件系统(ext2/3/4)
根据inode存放的属性,一次很快找到所有存放文件的data block
FAT 是链接式,即上一个data block保存下一个data block的信息,硬盘碎片优化就是尽量让一个数据的data block在一起
索引式操作系统的细枝末节
格式化时候,文件系统就将inode 与block 规划好了
当存储的文件太多的时候,能不能快速找到inode都是个问题,为此ext2 文件系统在格式化时实际会多划分多个区块群组,也叫block group
每个block group中都有独立的inode、data block 、super block这样管理起来就更加高效了。
ext2文件系统中的各个概念的实现
ext2的data block只能是1k 2k 4k的大小,格式化时固定,由于block 的大小的差异会导致文件系统所支持的单一文件大小和最大硬盘容量不同
一个inode所能指向的block是有限的,比如它最多指向n个block
inode 概念:该文件的访问权限(r/w/x);该文件的拥有者与群组(owner/group);该文件的容量;该文件创建或状态改变的时间(ctime);最近一次读取的时间(ctime);最近修改的时间(mtime);特殊权限,如(suid,sgid,sticky);该文件真正内容的block指向(pointer)
# 创建一个a文件,只有一个a字符。
# 发现他的大小是4k 也就是占用4k 一个block
root@debian:/home/gu# echo a > a
root@debian:/home/gu# cat a
a
root@debian:/home/gu# du -sh a
4.0K a
root@debian:/home/gu#
super block概念
blkid
# 与lsblk不同 他会列出块设备使用的文件系统类型
# 只能使用于ext文件系统。 一些信息
dumpe2fs /dev/sdXY -h
目录也是文件
ll -i /
# 查询文件的inod编号
268 -rw-r--r-- 1 root root 2 Apr 30 13:32 a
263 -rw------- 1 hc users 0 May 19 1996 .bash_history
264 -rw-r--r-- 1 hc users 1177 May 7 2022 .bashrc
262 drwxr-xr-x 1 hc users 0 Mar 15 2022 bin
# 第一列即为inode编号
# - 代表文件 d代表目录
目录于目录下文件的关系
如果你有目录的读权限,你就可以读取目录block以查看到目录下有哪些文件。这就是说有目录的读权限时才可以ls目录
链接文件
链接文件分为硬连接(实体链接)和软链接(符号链接)两种
ln a a1
# 为a 创建硬连接a1
ln -s a a1
# 为a文件创建软链接a2
修改硬软链接的文件都会 修改源文件
区别 硬连接的inode编号与源文件相同
对于硬连接删除源文件对硬连接没有任何影响
删除源文件,软链接保存的源文件的路径,所以查看软链接就提示文件不存在
硬连接不能连接向目录。软链接可以链接向目录
硬连接不能夸文件系统(因为inode的原因),软链接可以,他指向路径所以无所谓
硬盘分区-格式化-总结
整块硬盘-格式化文件系统
# 第一步 、查询系统块设备
lsblk
# 查询块设备信息 uuid 文件系统格式ext4 xfs等
blkid
# 查询硬盘分区的详细状态
fdisk -l
# 第二步、 格式化整块硬盘。格式化文件系统
mkfs.ext4 /dev/sda
# 如果要更改文件系统类型 -f强制更改为xfs
mkfs.xfs /dev/sda -f
# 查询块设备信息 uuid 文件系统格式ext4
blkid
硬盘分区-格式化文件系统
#### 第一步 、查询系统块设备
lsblk
# 查询块设备信息 uuid 文件系统格式ext4 xfs等
blkid
# 查询硬盘分区的详细状态
fdisk -l
####
#### 第二步、分区
fdisk /dev/sda
# 输入g 创建gpt分区表
g
# 新建分区
n
# 开始扇区默认,结束扇区 +20G
+20G
# 新建第二个分区
n
# 开始扇区默认,结束扇区 +20G
+30G
# 2.2、查看块设备,查看分好的分区
lsblk
# 查看分区的链接 例如 /dev/sda1
blkid
####
#### 第三步、给分区格式化文件系统. 这样一块硬盘两个分区,有不同的文件系统
mkfs.ext4 /dev/sda1
mkfs.xfs /dev/sda2
# 查询块设备信息 uuid 文件系统格式ext4 xfs等
blkid
xfs文件系统格式化时候,inode和block不是一下子全部分配好的,而是在后续使用中动态分配的。
ext4 是在格式化的时候全部分配好,所以硬盘比较大的时候会比较慢。
文件系统的挂载
概念
从文件系统的角度来看,挂载操作其实就是让一个目录的inode编号指向另一个文件系统的root inode
从系统管理者的角度来看,挂载操作其实就是让一个目录和另一个文件系统建立关系,以让该目录作为另一个文件系统的入口
挂载点其实就是一个目录,当一个目录为挂载点时,该目录就是对应文件系统的入口了
将目录的inode编号指向其他文件系统的inode的操作就叫做挂载
每个文件系统都默认有一个专门用于挂载指向的inode,这种inode可以称之为root inode
ls -di /
# 查看根目录的inode编号 为2
# ext4文件系统的root inode为2
2 /
挂载操作
# 查看文件系统对应的设备路径
blkid
# 创建目录
mkdir a b
# mount 挂载文件系统. 将sda1 目录挂载到a目录
mount /dev/sda1 a
mount /dev/sda2 b
# 可以看到挂载后目录的inode发生了变化。指向了文件系统的root inode
# 查看挂载的设备信息
df -h
# 查看块设备信息
lsblk
现在在对应的目录操作实际就相当于在另一个文件系统中操作
开机自动挂载
mount 命令挂载不保存,重启机器后会消失
# 查看块设备的信息 uuid 路径
blkid
# 打开fstab 配置开机自动挂载
vim /etc/fstab
# 第一列为要挂载的设备,可以使用设备路径,也可以使用设备的uuid
# 第二列为挂载点的路径
# 第三列是设备的文件系统类型
# 第四列用于指定一些文件系统的参数 一般使用defults
# 第五六列很早起的配置 0 0 即可
# 下面是例子 与 参数
### vim的方便化操作 写入
# 输入
:r !blkid
# 然后按下 Enter。这将执行blkid命令并将其输出插入到当前光标所在位置下方。
### 复制粘贴
#按下 v 进入普通可视模式。
# 选中文本后,按下 y。这会将选中的文本复制到Vim的剪贴板中。
# 按下 p 将复制的文本粘贴到光标后,或者按下 P 在光标前粘贴