Linux磁盘存储的经典描述

磁盘要放入计算机且被Linux系统识别,到可以使用磁盘存储数据,过程如下:

  1. 磁盘要存数据,相当于人盖房子

  2. 磁盘要分区后才能够存储数据,相当于房子改好了,需要隔断分出卧室,厨房,卫生间等区域

  3. 磁盘分区完成后,还得格式化后才能使用,且创建文件系统后才可以存储数据,相当于家里得装修后才能开始住人,不同的文件系统相当于不同的装修风格

  4. 磁盘分区,格式化,创建文件系统后,还得进行挂载到不同的文件夹,才能存放数据,相当于房子还得安装门、窗,才能和外界通信,进出

image-20220730075146306

机械硬盘内部原理

基本概念

扇区(sector)是硬盘的最小单位0.5kb=512Bytes;

多个连续的扇区称为(block)8个扇区,4kb大小(Linux);

将物理相邻的若干个扇区称为了一个(windows)。


在Linux系统中,规定

一个block只能存放一个文件的内容,因此文件占用的空间大小,只能是block的整数倍。


计算机单位

容量单位

对于计算机而言,只认识二进制

1 byte(字节) = 8 bit(位)

……

查询大小的命令

1
2
du -h ./*
ls -hl

常见的文件系统

windows

fat16 fat32 最早的Windows系统文件系统,缺点是单个文件不能超过2GB;

NTFS文件系统,支持文件加密,采用日志形式的文件系统,详细的记录磁盘读写的系统;

exfat 文件系统,新式的文件系统,单个文件支持16GB大小,能够在Windows和linux、macos中同时识别

磁盘转速与平均寻道时间

磁盘RPM,硬盘盘片在一分钟内能够完成的最大旋转数。

5400和7200是哪里来的?

5400转一定比7200转慢吗?

以送报为例:

  1. 相同密度的小区

电动车比自行车快

  1. 住宅十分稀疏与紧凑

自行车虽慢但容易配送,效率更高

磁盘分区

分区编辑器

partion editor

在Linux中,使用fdisk命令对硬盘进行分区

1
fdisk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
用法:
fdisk [选项] <磁盘> 更改分区表
fdisk [选项] -l <磁盘> 列出分区表
fdisk -s <分区> 给出分区大小(块数)

选项:
-b <大小> 扇区大小(512、1024、2048或4096)
-c[=<模式>] 兼容模式:“dos”或“nondos”(默认)
-h 打印此帮助文本
-u[=<单位>] 显示单位:“cylinders”(柱面)或“sectors”(扇区,默认)
-v 打印程序版本
-C <数字> 指定柱面数
-H <数字> 指定磁头数
-S <数字> 指定每个磁道的扇区数

mbr分区

master boot record,主分区引导记录

关注:硬盘容量受限制,最大2T

gbt分区

现在大多的硬盘分区表都是gpt分区表

优点:容量不受限制、分区个数没有限制、自带磁盘保护机制

分区流程

image-20220730092002511

  • 主分区,primary partition
  • 拓展分区,extended partition
    • 逻辑分区

Linux一切皆文件,磁盘设备在系统中也以文件形式展现

linux常见设备文件名

设备 文件名
SCSI/SATA/USB接口硬盘驱动器或U盘 /dev/sd[a-p]
IDE接口硬盘驱动器(已逐步被SATA接口取代) /dev/hd[a-d]
虚拟机内的Virt I/O设备 /dev/vd[a-p]
软盘驱动器 /dev/fd[0-7]
打印机 /dev/lp[0-2] (25针串口) /dev/usb/lp[0-15] (USB接口)
鼠标 /dev/input/mouse[0-15] (通用) /dev/psaux (PS/2接口) /dev/mouse (当前鼠标)
CDROM/DVDROM /dev/scd[0-1] (通用) /dev/sr[0-1] (通用,CentOS较常见) /dev/cdrom (当前CDROM)
磁带机 /dev/ht0 (IDE接口) /dev/st0 (SATA/SCSI接口) /dev/tape (当前磁带)

分区类型

硬盘设备,在Linux中会被识别为

/dev/sda 第一块硬盘名

​ 格式化分区

​ 主分区 /dev/sda1

​ 拓展分区 /dev/sda2

​ 逻辑分区 /dev/sda5或者/dev/sda6 …

/dev/sdb 第二块硬盘名

系统默认将1~4留给主分区和拓展分区

  • 主分区1*(星号代表引导分区)
  • 主分区2
  • 主分区3
  • 主分区4(extended)
    • 逻辑分区n

分区命令

fdisk命令

针对小于2TB的磁盘分区

这里跳过了新加入一块硬盘,我使用的是vware虚拟机,大家可以自行添加,我就不做演示了。

查看分区信息

1
fdisk -l

image-20220730094413174

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# fdisk -l
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0009d23b

设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

以下是对新加入的硬盘/dev/sdb进行操作

开始分区

1
fdisk /dev/sdb

执行结果

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x2ad371ed 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):

从上发现,使用的是DOS磁盘标签,说明是采用mbr分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
命令(输入 m 获取帮助):m
命令操作
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

命令(输入 m 获取帮助):

p 打印现有分区表

1
2
3
4
5
6
7
8
9
10
11
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2ad371ed

设备 Boot Start End Blocks Id System

命令(输入 m 获取帮助):

n 添加新的分区,分区类型:

p 主分区

e 拓展分区

1
2
3
4
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
1
2
3
4
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048

设置分区大小

1
2
3
4
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+256M
分区 1 已设置为 Linux 类型,大小设为 256 MiB

命令(输入 m 获取帮助):

查询分区表1

1
2
3
4
5
6
7
8
9
10
11
12
13
命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2ad371ed

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 526335 262144 83 Linux

命令(输入 m 获取帮助):

创建一个拓展分区

1
2
3
4
5
6
7
8
9
10
11
12
13
   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1 2048 526335 262144 83 Linux

命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e
分区号 (2-4,默认 2):
起始 扇区 (526336-41943039,默认为 526336):
Last 扇区, +扇区 or +size{K,M,G} (526336-41943039,默认为 41943039):
将使用默认值 41943039
分区 2 已设置为 Extended 类型,大小设为 19.8 GiB

我们可以看到创建拓展分区时,默认的起始分区是526336,和第一个分区是相邻的。

再次打印

1
2
3
4
5
6
7
8
9
10
11
12
13
14
命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2ad371ed

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 526335 262144 83 Linux
/dev/sdb2 526336 41943039 20708352 5 Extended

命令(输入 m 获取帮助):

再输入n

1
2
3
4
5
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p):

我们可以看到,free(空闲分区)还剩下2个。

在拓展分区中,创建逻辑分区

l

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Select (default p): l
添加逻辑分区 5
起始 扇区 (528384-41943039,默认为 528384):
将使用默认值 528384
Last 扇区, +扇区 or +size{K,M,G} (528384-41943039,默认为 41943039):+10GB
分区 5 已设置为 Linux 类型,大小设为 9.3 GiB

命令(输入 m 获取帮助):p
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2ad371ed

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 526335 262144 83 Linux
/dev/sdb2 526336 41943039 20708352 5 Extended
/dev/sdb5 528384 20060159 9765888 83 Linux

命令(输入 m 获取帮助):

继续创建逻辑分区

1
2
3
4
5
6
7
8
9
10
11
12
13
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l
添加逻辑分区 6
起始 扇区 (20062208-41943039,默认为 20062208):
将使用默认值 20062208
Last 扇区, +扇区 or +size{K,M,G} (20062208-41943039,默认为 41943039):
将使用默认值 41943039
分区 6 已设置为 Linux 类型,大小设为 10.4 GiB

命令(输入 m 获取帮助):

最后,正式写入

w

1
2
3
4
5
命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

在为输入w正式写入之前,分区表是写在内存中的。

查询分区表2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost ~]# fdisk -l

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0009d23b

设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2ad371ed

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 526335 262144 83 Linux
/dev/sdb2 526336 41943039 20708352 5 Extended
/dev/sdb5 528384 20060159 9765888 83 Linux
/dev/sdb6 20062208 41943039 10940416 83 Linux

删除分区,并确认写入

1
2
3
4
5
6
7
8
9
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):d
分区号 (1,2,5,6,默认 6):

直接回车,在输入d,直至删除所有分区。

默认是从后往前删。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
分区号 (1,2,5,6,默认 6):
分区 6 已删除
分区号 (1,2,5,默认 5):
分区 5 已删除
分区号 (1,2,默认 2):
分区 2 已删除
已选择分区 1
分区 1 已删除
命令(输入 m 获取帮助):d
No partition is defined yet!
命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

查询分区表3

1
2
3
4
5
6
7
8
9
10
11
12
13
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2ad371ed

设备 Boot Start End Blocks Id System
[root@localhost ~]# fdisk -l|grep sd
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区

parted命令

针对超过2TB的磁盘分区

开始分区

parted <磁盘>

1
2
3
4
5
[root@localhost ~]# parted /dev/sdb
GNU Parted 3.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)

查看命令列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(parted) help
align-check TYPE N check partition N for TYPE(min|opt)
alignment
help [COMMAND] print general help, or help on
COMMAND
mklabel,mktable LABEL-TYPE create a new disklabel (partition
table)
mkpart PART-TYPE [FS-TYPE] START END make a partition
name NUMBER NAME name partition NUMBER as NAME
print [devices|free|list,all|NUMBER] display the partition table,
available devices, free space, all found partitions, or a particular
partition
quit exit program
rescue START END rescue a lost partition near START
and END

resizepart NUMBER END resize partition NUMBER
rm NUMBER delete partition NUMBER
select DEVICE choose the device to edit
disk_set FLAG STATE change the FLAG on selected device
disk_toggle [FLAG] toggle the state of FLAG on selected
device
set NUMBER FLAG STATE change the FLAG on partition NUMBER
toggle [NUMBER [FLAG]] toggle the state of FLAG on partition
NUMBER
unit UNIT set the default unit to UNIT
version display the version number and
copyright information of GNU Parted
(parted)

更改磁盘分区表类型

mkabel gpt

我们从上文知道,sdb硬盘是mbr分区类型的,这里我们就改为gbt分区类型。

这条命令很危险,只能对新的硬盘操作!!

1
2
3
4
(parted) mklabel gpt
警告: The existing disk label on /dev/sdb will be destroyed and all data on this
disk will be lost. Do you want to continue?
是/Yes/否/No? yes

查询分区表4

1
2
3
4
5
6
7
8
9
10
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志

(parted)

我们看到,分区类型成功改为gpt

创建主分区

gpt分区类型是没有拓展分区的!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(parted) mkpart primary 0 500
警告: The resulting partition is not properly aligned for best performance.
忽略/Ignore/放弃/Cancel? Ignore
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志
1 17.4kB 500MB 500MB primary

(parted)

0 表示从0开始

500 表示500MB

创建逻辑分区

1
2
3
4
5
6
7
8
9
10
11
12
13
(parted) mkpart logical 501 10000
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志
1 17.4kB 500MB 500MB primary
2 501MB 10.0GB 9499MB logical

(parted)

输入q退出,并查询分区情况

1
2
3
4
5
(parted) q
信息: You may need to update /etc/fstab.

[root@localhost ~]# ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2

我们可以看见,以及成功分出两个分区

使用fdisk查询看看

fdisk -l

这里截取部分信息

1
2
3
4
5
6
7
8
9
10
11
12
13
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
Disk identifier: 05387D9B-5B59-469F-BBEC-BD5FC44CC203


# Start End Size Type Name
1 34 976562 476.8M Microsoft basic primary
2 978944 19531775 8.9G Microsoft basic logical

重读分区表

partprobe命令也可以通过重启机器实现

centos5或者以前可以使用此命令,用于重读分区表。

当删除文件后,仍然占用磁盘空间,是应为磁盘分区表米有更新,需要重启分区表。

刷新内核认知

partx -a命令

在我们格式化磁盘后,习惯性执行

这时内核就会新地认识这个分区

1
2
3
[root@localhost ~]# partx -a /dev/sdb
partx: /dev/sdb: error adding partitions 1-2
partx: /dev/sdb: error adding partitions 5-6