Linux分区管理系统

在学习文件系统管理之前,我个人觉得还是很有必要将磁盘的种类和磁盘的基本结构做一个基本的了解。所以本章将从磁盘的结构---分区---格式化---挂载四个部分来描绘出Linux文件系统的基本管理手段。

磁盘种类

磁盘的类型

从磁盘的类型来说的话可以将磁盘分为机械硬盘和固态硬盘两种。一个常识性的知识就是固态硬盘会被比机械硬盘的速度更快,那么这到底是为什么呢?我们来简单看一下这两者的工作原理。

机械硬盘

机械硬盘的基本结构(图片源自网络,如构成侵权请联系删除)

上图是机械硬盘的一张基本结构图。用户的数据都是存储在磁盘之上的。当需要读写数据的时候,马达会转动机械臂,主轴马达会转动磁盘,从而进行数据的读写。

数据是存储在磁盘之上的,这个很重要。下面这张图就是磁盘的基本结构。

磁盘的基本结构(图片源自网络,如构成侵权请联系删除)

 磁盘结构

可以看到在磁盘上会被同心圆(这些同心圆又称为磁道)切出很多个小区块,在每个小区块里面又有很多的磁粒,磁粒是具有一定的极性的。比如磁性为N代表1,磁性为S代表0。我们将这些小区块统称为扇区。当我们拿到硬盘的时候,为了能够提高硬盘的利用率,通常需要对磁盘进行分区。在早期的时候每个扇区的大小通常是512Bytes,随着技术的发展,目前已经有了4KBytes的扇区设计。磁盘的通常有两面,每一面都可以进行数据的存储,所以每一块磁盘上会有两个磁头。一块机械硬盘可能是由多块磁盘组成,所以我们将在所有的盘片上同一磁道的组合称为柱面。因此一块硬盘的存储容量一般为:

硬盘的存储容量=磁头数*磁道数(柱面数)*每磁道扇区数*每扇区的字节数

磁盘的基本结构(图片源自网络,如构成侵权请联系删除)

数据读取

当我们需要对数据进行读取的时候,马达会转动机械臂到对应的位置,然后由磁头感应对应位置的极性,比如感应到N级代表1,感应到S极代表0。

数据写入

当我们需要对数据进行写入的时候,磁头就会产生磁盘,改变对应位置的极性。由此就可以完成数据的写入或改写。

 工作原理

机械臂转动到对应的磁道;
主轴马达转动磁盘到对应扇区,将扇区转动到磁头下方,进行数据的读取;

总结

机械硬盘的数据读取的延迟会很高,因为进行数据读取的时候需要分别转动机械臂和磁盘,并且如果一个数据被分散在许多不同的扇区,那么这个数据的读取将会更加漫长。因此就诞生了纯电路结构的固态硬盘。

固态硬盘

固态硬盘的数据存储则是使用一个又一个的浮栅晶体管,其基本结构如下:

其中浮栅级是用来存储电子的。 当电子数量高于一定的值的时候就是0,低于一定值的时候就是1。

数据的读取

往控制级施加一定的电压时,如果源级别和漏极之间导通,就说明浮栅里有大量的电子判断为0,否则判断为1。

数据的写入

在进行数据写入的时候,往P级施加电压,就可以将浮栅级中的电子吸出,往控制级施加电压的时候就可以将电子吸回浮栅级中。

磁盘的接口

概述

其实硬盘的性能并不仅仅取决于这块硬盘是机械硬盘还是固态硬盘,它还很多参数相关。毕竟大家平时在选购硬盘的时候也会发现,同样是固态硬盘,它们的价格也能相差很多。比如以下这两块固态硬盘同样都是三星生产的,价格差了两倍多。

 其实数据读取的快与慢一般取决于三个东西,分别是总线(Bus)、协议(Protocol)、接口(Interface)。

总线(Bus)

我们的个人电脑上有很多的硬件,比如CPU、硬盘、内存、显卡等等。这些不同的电子元器件之间必然有通信的需求。假设CPU想和内存通信,那么CPU和硬盘之间就需要去建立一条物理的电路。我们就把这个通路称为总线。

协议(Protocol)

协议规定了通信双方之间如何去识别对方,如何建立连接等等。举一个简单的例子,如果没有协议,那么在一个闭合电路里面我们只能设置开关的开和断。但是有了协议之后,我可以规定将1s分为10个周期,通电为1,断电为0。那么此时就可以通过大量的通电和断电将想要发送的信息以10bit/s发送给对方,这个规定就可以简单称为协议。这个协议我们也可以理解为是对数据进行编码。不同的协议它传输数据的效率是不一样的。

接口(Interface)

接口就比较好理解了,词如其意,就是指的硬盘的物理接口。

常见的硬盘接口(图片源自网络,如构成侵权请联系删除)

协议、总线和接口都会限制硬盘的发挥,但是通常来说厂商都会将它们去做好对应的匹配,所以我们在选购硬盘的时候一般只需要去关心它们的总线即可。而一般在Linux中我们说的添加SATA硬盘,添加IDE硬盘则指的是硬盘的接口类型。

Linux系统中常用的磁盘管理命令

df命令:df 【选项】

df命令用来查看文件系统的硬盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,以及目前还有多少空间等信息,还可以利用该命令获得文件系统的挂载位置。

  • -a 显示特殊文件系统
  • -h 以人性化的方式显示,即单位换成常用单位,默认是以块为单位。
  • -T 显示文件系统类型
[root@Server01 ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
devtmpfs               872M     0  872M    0% /dev
tmpfs                  901M     0  901M    0% /dev/shm
tmpfs                  901M  9.7M  891M    2% /run
tmpfs                  901M     0  901M    0% /sys/fs/cgroup
/dev/mapper/rhel-root   10G  143M  9.9G    2% /
/dev/mapper/rhel-usr   8.0G  4.0G  4.1G   49% /usr
/dev/mapper/rhel-tmp  1014M   40M  975M    4% /tmp
/dev/mapper/rhel-home  8.0G   90M  8.0G    2% /home
/dev/nvme0n1p2         495M  213M  283M   43% /boot
/dev/nvme0n1p1         500M  6.8M  493M    2% /boot/efi
/dev/mapper/rhel-var   8.0G  276M  7.8G    4% /var
tmpfs                  181M  1.2M  179M    1% /run/user/42
tmpfs                  181M  4.6M  176M    3% /run/user/0
/dev/sr0               7.9G  7.9G     0  100% /run/media/root/RHEL-8-2-0-BaseOS-x86_64

du命令:du 【选项】【目录/文件名】(PS:查看目录里文件的大小,有朋友可能会说ls -lr不也可以吗,其实如果你做过实验的话就会发现这两个命令看到的大小不一致,这个我们会在后面的文件系统部分做介绍。)

  • -a 显示每个子文件的磁盘占用量,默认只统计子目录的磁盘占用量
  • -h 以人性化的方式显示,即单位换成常用单位
  • -s 统计总占用量,布列出子目录和子文件的占用量
[root@Server01 tmp]# du -h /var/log/
0	/var/log/private
0	/var/log/samba/old
0	/var/log/samba
168K	/var/log/audit
0	/var/log/glusterfs
0	/var/log/chrony
0	/var/log/speech-dispatcher
12K	/var/log/cups
0	/var/log/libvirt/qemu
0	/var/log/libvirt
44K	/var/log/rhsm
12K	/var/log/sssd
0	/var/log/gdm
0	/var/log/swtpm/libvirt/qemu
0	/var/log/swtpm/libvirt
0	/var/log/swtpm
8.0K	/var/log/tuned
0	/var/log/insights-client
0	/var/log/qemu-ga
5.3M	/var/log/anaconda
6.6M	/var/log/

硬盘分区

通过分区可以帮助我们更高效地利用硬盘。对硬盘进行分区是使用一块硬盘的必要条件,分区通常有以下好处:

  • 更利于数据的安全性。当硬盘上的某个分区出现了故障不会影响到整块硬盘。
  • 更便于管理。因为硬盘本身的空间很大,对硬盘进行分区可以更方便地找到对应的文件。

常见的分区方案有两个,MSDOS(MBR)分区和GPT(Partition table)分区。在上文提到了一块机械硬盘通常是由多个磁盘组成,每块磁盘里相同的磁道的位置合在一起就称为柱面,柱面通常是分区的最小单位,随着技术的发展,目前甚至可以使用扇区作为分区的最小单位。

MBR分区

早期的Linux系统为了兼容Windows系统使用的分区方案为支持Windows的MBR(主要开机记录区)分区。

起始扇区

在上文里面我们提到磁盘会被划分成很多个磁道,每个磁道里面又有很多个扇区。值得注意的是,硬盘在读取数据的时候,会从外磁道开启读,所以我们将最外面的磁道的第一个扇区称为起始扇区。这个扇区的大小通常为512Bytes,用来存储开机的引导程序和分区表。

起始扇区(512Bytes)

  • 主要开机记录区(MBR):安装开机管理程序(446Bytes)
  • 分区表:记录分区状态(64Bytes)

分区表

分区表用来记录分区状态,因为其大小为64Bytes,所以最多只能有4组分区。每组记录区里面记录了该分区的起始和结束的柱面号码:

磁盘分区表(图片源自网络,如构成侵权请联系删除)

 使用MBR的分区方案只能分出4个分区,类比成Windows就类似于你的电脑只能有4个盘符。这显然是不太符合现实发展的需要的。因此在MBR里面便有了主分区(Primary)和扩展分区(Extended)之分。

扩展分区的思路是:既然起始扇区只能记录4组的组记录,那么能不能利用其他扇区来记录组记录呢?

其实是可以的,于是在LInux当中我们可以设定4个分区里的任一分区为扩展分区,扩展分区本身并不能直接使用,而是要在扩展分区之下继续划分出逻辑分区,逻辑分区的数量取决于操作系统的限制,目前在Linux当中,SATA硬盘已经可以突破63个以上分区的限制。

总结:

  • 主分区和扩展分区加起来不能超过4个
  • 扩展分区只能有1个
  • 扩展分区无法直接使用,需要继续向下划分逻辑分区
  • 逻辑分区的数量受到操作系统的限制
  • 使用MBR分区,操作系统的系统容量不能超过2.2T以上的容量
  • MBR只有一个存放分区表的区块,硬盘坏了很难救援
  • MBR存放开机管理程序的区块只有446Bytes,无法容纳更多的程序代码

分区工具-fdisk

fdisk -l 查看设备已有的硬盘分区

[root@Server01 ~]# fdisk -l
Disk /dev/nvme0n1:100 GiB,107374182400 字节,209715200 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:19722605-F93B-435F-B827-3CB2BB5A3953
 
设备              起点     末尾     扇区  大小 类型
/dev/nvme0n1p1    2048  1026047  1024000  500M EFI 系统
/dev/nvme0n1p2 1026048  2050047  1024000  500M Linux 文件系统
/dev/nvme0n1p3 2050048 83855359 81805312   39G Linux LVM
 
 
Disk /dev/mapper/rhel-root:10 GiB,10737418240 字节,20971520 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
 
 
Disk /dev/mapper/rhel-swap:4 GiB,4294967296 字节,8388608 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
 
 
Disk /dev/mapper/rhel-usr:8 GiB,8589934592 字节,16777216 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
 
 
Disk /dev/mapper/rhel-home:8 GiB,8589934592 字节,16777216 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
 
 
Disk /dev/mapper/rhel-var:8 GiB,8589934592 字节,16777216 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
 
 
Disk /dev/mapper/rhel-tmp:1 GiB,1073741824 字节,2097152 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
[root@Server01 ~]# 

实验案例:

步骤一:新增一块硬盘

1、关机、点击编辑虚拟机设置

2、点击添加

3、选择硬盘,点击下一步

4、 选择一种硬盘类型,点击下一步,这里选择的是SATA硬盘

5、选择 创建新的虚拟磁盘

6、选择新增硬盘大小

7、选择本地存储硬盘名称,之后点击完成就可以了。

步骤二:使用fdisk工具对硬盘进行分区

1、使用fdisk -l查看,发现新增的硬盘

[root@Server01 ~]# fdisk -l
Disk /dev/nvme0n1:100 GiB,107374182400 字节,209715200 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:19722605-F93B-435F-B827-3CB2BB5A3953
 
设备              起点     末尾     扇区  大小 类型
/dev/nvme0n1p1    2048  1026047  1024000  500M EFI 系统
/dev/nvme0n1p2 1026048  2050047  1024000  500M Linux 文件系统
/dev/nvme0n1p3 2050048 83855359 81805312   39G Linux LVM
 
 
Disk /dev/sda:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

2、新增的硬盘名称

在Linux中,我们不断强调“一切皆为文件”,一般的硬盘设备都会是以“/dev/sd”开头的。而一台主机上可以有多块硬盘,因此系统采用a~p来代表16块不同的硬盘(默认从a开始分配),而且硬盘的分区编号也有如下规定。

  • 主分区或扩展分区的编号从1开始,到4结束。
  • 逻辑分区从编号5开始。

因此新增的硬盘其实也是以文件的方式存储在/dev目录里面的。比如我们新增的sata接口的硬盘名字变为/dev/sd[a-],NVME硬盘名字便为nvme[0-]。

[root@Server01 ~]# find /dev/ -type b
/dev/dm-5
/dev/dm-4
/dev/dm-3
/dev/dm-2
/dev/dm-1
/dev/dm-0
/dev/sr0
/dev/sda
/dev/nvme0n1p3
/dev/nvme0n1p2
/dev/nvme0n1p1
/dev/nvme0n1

3、分区的步骤

3.1 指定分区的硬盘    [root@Server01 ~]# fdisk /dev/sda

[root@Server01 ~]# fdisk /dev/sda 
 
欢迎使用 fdisk (util-linux 2.32.1)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
 
设备不包含可识别的分区表。
创建了一个磁盘标识符为 0xcfc5b0fc 的新 DOS 磁盘标签。
 
命令(输入 m 获取帮助):

常见的分区指令:

  • d   删除分区
  • F   列出未分区的空闲区
  • l   列出已知的分区类型,默认是83
命令(输入 m 获取帮助):l
 
 0  空              24  NEC DOS         81  Minix / 旧 Linu bf  Solaris        
 1  FAT12           27  隐藏的 NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 隐藏 或 In c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux 扩展      c7  Syrinx         
 5  扩展            41  PPC PReP Boot   86  NTFS 卷集       da  非文件系统数据 
 6  FAT16           42  SFS             87  NTFS 卷集       db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux 纯文本    de  Dell 工具      
 8  AIX             4e  QNX4.x 第2部分  8e  Linux LVM       df  BootIt         
 9  AIX 可启动      4f  QNX4.x 第3部分  93  Amoeba          e1  DOS 访问       
 a  OS/2 启动管理器 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad 休 ea  Rufus 对齐     
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs        
 f  W95 扩展 (LBA)  54  OnTrackDM6      a6  OpenBSD         ee  GPT            
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  隐藏的 FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC  
12  Compaq 诊断     5c  Priam Edisk     a9  NetBSD          f1  SpeedStor      
14  隐藏的 FAT16 <3 61  SpeedStor       ab  Darwin 启动     f4  SpeedStor      
16  隐藏的 FAT16    63  GNU HURD 或 Sys af  HFS / HFS+      f2  DOS 次要       
17  隐藏的 HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS    
18  AST 智能睡眠    65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE 
1b  隐藏的 W95 FAT3 70  DiskSecure 多启 bb  Boot Wizard 隐  fd  Linux raid 自动
1c  隐藏的 W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep        
1e  隐藏的 W95 FAT1 80  旧 Minix        be  Solaris 启动    ff  BBT            
 
命令(输入 m 获取帮助):
  • n   添加新分区
  • p   打印分区表
  • t   更改分区类型
  • v   检查分区表
  • i   打印某个分区的相关信息
  • q 不保存退出
  • w 保存退出

3.2 划分出一个主分区(因为操作系统只能装在主分区里,所以主分区一定要有)

命令(输入 m 获取帮助):n
分区类型
   p   主分区 (0个主分区,0个扩展分区,4空闲)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):p
分区号 (1-4, 默认  1): 1
第一个扇区 (2048-41943039, 默认 2048): 
上个扇区,+sectors 或 +size{K,M,G,T,P} (2048-41943039, 默认 41943039): +1G
 
创建了一个新分区 1,类型为“Linux”,大小为 1 GiB。
 
命令(输入 m 获取帮助):p
Disk /dev/sda:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xcfc5b0fc
 
设备       启动  起点    末尾    扇区 大小 Id 类型
/dev/sda1        2048 2099199 2097152   1G 83 Linux
 
命令(输入 m 获取帮助):
  • 分区号:一共有4个分区号
  • 第一个扇区:扇区的起始值不是从0开始,是因为使用了MBR的分区方案,MBR分区方案的前512Bytes是用来存放系统启动引导和分区表的。这里直接回车,使用默认值就可以了。
  • 上个扇区:指的是当前分区的终止值。使用扇区为单位往往不方便我们查看,所以这里也可以使用常见的存储单位。
  • 分区完成之后可以使用 p 或查看已经建立的好的分区,不过此时还没保存,所以fdisk分区方案还未生效。

3.3 划分扩展分区和逻辑分区

创建扩展分区(只能有一个)

  • 输入 n 创建新的分区
  • 选择 e 创建扩展分区
  • 分区号此时只能从2开始,因为分区1分给了主分区
  • 第一个扇区此时还是使用默认值
  • 最后一个扇区本实验选择扩展分区为5G
  • 输入p 可以查看到扩展分区的分区类型和主分区是不一样的。
命令(输入 m 获取帮助):n
分区类型
   p   主分区 (1个主分区,0个扩展分区,3空闲)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):e
分区号 (2-4, 默认  2): 2
第一个扇区 (2099200-41943039, 默认 2099200): 
上个扇区,+sectors 或 +size{K,M,G,T,P} (2099200-41943039, 默认 41943039): +5G
 
创建了一个新分区 2,类型为“Extended”,大小为 5 GiB。
 
命令(输入 m 获取帮助):p
Disk /dev/sda:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xcfc5b0fc
 
设备       启动    起点     末尾     扇区 大小 Id 类型
/dev/sda1          2048  2099199  2097152   1G 83 Linux
/dev/sda2       2099200 12584959 10485760   5G  5 扩展

创建逻辑分区

  • 输入 n 创建新分区,此时只能选择主分区和逻辑分区,因为扩展分区只能有一个
  • 输入 l 选择逻辑分区
  • 逻辑分区的分区ID从5开始,因为分区ID 1~4留给了主分区
  • 创建逻辑分区的大小为2G
命令(输入 m 获取帮助):n
分区类型
   p   主分区 (1个主分区,1个扩展分区,2空闲)
   l   逻辑分区 (从 5 开始编号)
选择 (默认 p):l
 
添加逻辑分区 5
第一个扇区 (2101248-12584959, 默认 2101248): 
上个扇区,+sectors 或 +size{K,M,G,T,P} (2101248-12584959, 默认 12584959): +2G
 
创建了一个新分区 5,类型为“Linux”,大小为 2 GiB。
 
命令(输入 m 获取帮助):p
Disk /dev/sda:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xcfc5b0fc
 
设备       启动    起点     末尾     扇区 大小 Id 类型
/dev/sda1          2048  2099199  2097152   1G 83 Linux
/dev/sda2       2099200 12584959 10485760   5G  5 扩展
/dev/sda5       2101248  6295551  4194304   2G 83 Linux
 
命令(输入 m 获取帮助):w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。

GPT分区

MBR分区因为其本身的缺陷,比如最大只能支持2.2TB的硬盘、只能有4个主分区、只有一个扇区用来存储引导记录和分区表等等,所以目前来说MBR的分区方案已经不常用了,目前常用的分区方案为GPT的分区方案。

在过去,一个扇区的大小固定为512Bytes,但是目前已经有了4K的扇区设计出现,为了兼容所有的方案,所以目前大多会使用逻辑区块地址(Logical Block Address,LBA)来处理,GPT将磁盘的所有区块都使用LBA(默认也是512Bytes)来规划,第一个LBA称为LBA0。(简单来说就是MBR方案使用扇区进行规划,GPT方案使用LBA方案规划

MBR仅仅使用第一个区块来记录分区信息,GPT使用前34个LBA来记录分区信息,后33个LBA来做备份。所以会更加安全。GPT分区默认可以提供128笔记录。

  • LBA0 MBR兼容模块 446Bytes存放开机管理程序,剩下部分为特殊标志位,表示这是一个GPT分区的硬盘
  • LBA1 GPT表头记录,存储以下内容:分区表本身的位置和大小;备份GPT分区的位置
  • LBA 2-33 实际记录分区信息处

gdisk 分区工具

实验案例:

步骤一:使用相同的方法添加硬盘(本文使用恢复快照的方式使用刚刚添加的硬盘)

步骤二:使用gdisk 工具进行分区

  • 输入 n 创建新的分区
  • 输入 1 创建新的分区(gdisk默认的分区ID是从1开始,1-128)
  • 直接回车,选择默认的起始扇区ID
  • 输入 +1G 创建1G的GPT分区
  • 输入 w 保存
[root@Server01 ~]# gdisk /dev/sda 
GPT fdisk (gdisk) version 1.0.3
 
Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present
 
 
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************
Command (? for help): n
Partition number (1-128, default 1): 1   
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +1G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.
[root@Server01 ~]# 

分区完成之后可以使用 fdisk -l来查看结果。MBR分区的磁盘磁盘标签类型为DOS,GPT的磁盘标签类型为GPT。

文件系统与格式化

因为不同的操作系统所设置的文件属性和权限并不相同,所以为了存放这些文件所需要的数据就必须在磁盘上写入文件系统。这个过程也称作格式化(Format)。一般情况下,一个分区只能有一个文件系统,但这也并不绝对,比如LVM(逻辑卷)技术。

一个文件的数据可以被分为以下两个部分

  • 文件的实际内容
  • 文件的属性信息,比如文件的权限,文件的拥有者,拥有组、时间等参数(使用ls -l 查看到的信息)这个也就是为什么你使用ls -l 查看的信息和du -h查看到的信息不一样,ls -l 查看的是文件的属性信息。

文件系统会将这两部分的信息分开存储。其中文件的内容存放在数据区块(Data Block)中,文件的属性信息存放在inode中。此外还有一个超级区块(super block )记录整个文件系统的整体信息。

  • superblock:记录文件系统的整体信息,包括 inode/block的总量、剩余量、使用量、文件系统的格式等信息
  • inode:记录文件的属性信息,一个文件占用一个inode,inode记录文件数据所在的Block号码。inode 可以使用stat 或者ls -i或者df -i查看
[root@Server01 ~]# stat /etc/passwd
  文件:/etc/passwd
  大小:2664      	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:8396039     硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:system_u:object_r:passwd_file_t:s0
最近访问:2022-09-25 17:09:02.162007998 +0800
最近更改:2022-09-05 18:31:38.523946111 +0800
最近改动:2022-09-05 18:31:38.524946111 +0800
创建时间:-
[root@Server01 ~]# 
  • block:数据实际存放的位置。操作系统读取数据的时候不会一个一个扇区去读取数据,而是连续读取多个扇区,因此多个连续的扇区就可以称为块(block),文件的最小单位起始就是块。比如可以使用1kb(连续的两个扇区,一个扇区为512Bytes)、2kb、4kb作为一个Block。一个文件最少都会占用一个Block,只要Block被文件占用就无法存储其他文件。Block类似于在Windows里格式化看到的分配单元大小。

Block调大

  • 优点:速度快(总的Block数量更少),节约寻址时间
  • 缺点:空间浪费

 文件系统与目录的关系

首先我们要明确一个概念,文件本身才是实际记录数据的地方,文件所在的目录一般只记录了文件名和相关的属性信息。

当我们创建一个目录的时候,文件系统就会分配一个inode号和至少一个block给该目录。inode号用来记录该目录的权限信息,block用来记录该目录里的文件名和属性信息。所以在权限管理的时候当我们想删除一个文件需要用到目录的w权限,原因便在这里。

系统打开一个文件的过程

  • 系统找到文件名对应的inode号
  • 通过inode号获取inode信息
  • 根据inode信息找到文件数据所在的block,读出数据

Linux格式化(写入文件系统)实例

目前来说在Linux当中,新建一个分区的时候通常会写入xfs文件系统,常见的文件系统还有很多,如果感兴趣的话可以在baidu/bing中进行查询,或者查看《鸟哥的Linux私房菜第四版》这里就简单地去介绍一下文件系统的写入实例。

使用mkfs写入文件系统

mkfs格式:mkfs   [参数]   文件系统 

  • -t:指定要创建的文件系统类型。
  • -c:建立文件系统前首先检查坏块。
  • -l file:从文件file中读硬盘坏块列表,file文件一般是由硬盘坏块检查程序产生的。
  • -V:输出建立文件系统详细信息。

示例:

[root@Server01 ~]# mkfs.xfs /dev/sda1 
meta-data=/dev/sda1              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@Server01 ~]# 

挂载

既然分区是为了更好地利用磁盘,格式化是因为在不同的操作系统之间文件的属性信息不一致,那么挂载又是为了什么呢?

每个文件系统都有自己独有的inode记录文件属性信息,有Block存放文件的内容,有Superblock存放总体的一个概况,但是唯独缺少一个进入到文件系统的入口。因此挂载的意义也就因此诞生,挂载就是为了给系统提供一个访问硬盘的入口。所以挂载点一定是目录。Linux系统中提供了/mnt和/media两个专门的挂载点。通常将光盘和软盘挂载到/media/cdrom(或者/mnt/cdrom)和/media/floppy(或者/mnt/ floppy)中,其对应的设备文件名分别为/dev/cdrom和/dev/fd0。

挂载的方法:

1、临时挂载

所谓临时挂载就是当下次电脑重启的时候必须进行重新挂载。典型的例子就是将RHEL的光盘文件挂载在/media之下。临时挂载通常使用mount命令,其语法格式为:mount 选项 设备 挂载点

mount命令的主要选项如下。

  • -t:指定要挂载的文件系统的类型。
  • -r:如果不想修改要挂载的文件系统,可以使用该选项以只读方式挂载。
  • -w:以可写的方式挂载文件系统。
  • -a:挂载/etc/fstab文件中记录的设备。
[root@Server01 ~]# mount -t iso9660 /dev/cdrom /media/
mount: /media: WARNING: device write-protected, mounted read-only.

卸载命令通常使用umount,其语法格式为  umount 设备 挂载点

[root@Server01 ~]# umount /media 

2、永久挂载

如果要实现每次开机自动挂载文件系统,可以通过编辑/etc/fstab文件来实现,例如将在上一步已经创建好文件系统的sda1执行永久挂载。

第一步:在根目录下新建sda的挂载点

[root@Server01 /]# mkdir sda1

第二步:编辑fstab文件(重启后生效)

# Created by anaconda on Mon Sep  5 06:25:16 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=3973fe2f-abe0-453d-b9f3-7c27ff180bd2 /boot                   xfs     defaults        0 0
UUID=E897-CB17          /boot/efi               vfat    umask=0077,shortname=winnt 0 2
/dev/mapper/rhel-home   /home                   xfs     defaults        0 0
/dev/mapper/rhel-tmp    /tmp                    xfs     defaults        0 0
/dev/mapper/rhel-usr    /usr                    xfs     defaults        0 0
/dev/mapper/rhel-var    /var                    xfs     defaults        0 0
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
/dev/sda1               /sda1                   xfs     defaults        0 0

第三步:验证

[root@Server01 ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
devtmpfs               872M     0  872M    0% /dev
tmpfs                  901M     0  901M    0% /dev/shm
tmpfs                  901M  9.7M  891M    2% /run
tmpfs                  901M     0  901M    0% /sys/fs/cgroup
/dev/mapper/rhel-root   10G  143M  9.9G    2% /
/dev/mapper/rhel-usr   8.0G  4.0G  4.1G   49% /usr
/dev/mapper/rhel-tmp  1014M   40M  975M    4% /tmp
/dev/sda1             1014M   40M  975M    4% /sda1
/dev/mapper/rhel-home  8.0G   90M  8.0G    2% /home
/dev/nvme0n1p2         495M  213M  283M   43% /boot
/dev/nvme0n1p1         500M  6.8M  493M    2% /boot/efi
/dev/mapper/rhel-var   8.0G  276M  7.8G    4% /var
tmpfs                  181M  1.2M  179M    1% /run/user/42
tmpfs                  181M  4.6M  176M    3% /run/user/0
/dev/sr0               7.9G  7.9G     0  100% /run/media/root/RHEL-8-2-0-BaseOS-x86_64

总结:

全文1w4字左右,其实想要表达的东西就是在Linux当中如何去使用一块硬盘。使用一块硬盘一共需要经历三个步骤:

  • 分区:分区是为了提高硬盘的利用率和可靠性
  • 格式化:格式化就是给硬盘写入文件系统
  • 挂载:挂载就是给用户提供一个访问硬盘的接口

猜你喜欢

转载自blog.csdn.net/Jason_Lee155/article/details/131459509