基础-Linux磁盘规划
一、大纲
- 操作系统怎么连接(识别)物理磁盘?
- 操作系统识别到的物理磁盘是怎么命名的?
- 单个物理磁盘是怎么分区的?
- 分区是怎么命名的?
磁盘的连接方式
- IDE(Integrated Drive Electronics,电子集成驱动器),较常见。IDE硬盘的传输模式有以下三种:PIO(Programmed I/O)模式,DMA(Driect Memory Access)模式,Ultra DMA(简称UDMA)模式。
- SCSI(Small Computer System Interface,小型计算机系统接口),是同IDE(ATA)完全不同的接口,IDE接口是普通PC的标准接口,而SCSI并不是专门为硬盘设计的接口,是一种广泛应用于小型机上的高速数据传输技术。SCSI接口具有应用范围广、多任务、带宽大、CPU占用率低,以及热插拔等优点,但较高的价格使得它很难如IDE硬盘般普及,因此SCSI硬盘主要应用于中、高端服务器和高档工作站中。
- 光纤通道。
- SATA(Serial ATA,串口硬盘),是未来和现在PC机硬盘的主流趋势。Serial ATA采用串行连接方式,串行ATA总线使用嵌入式时钟信号,具备了更强的纠错能力,与以往相比其最大的区别在于能对传输指令(不仅仅是数据)进行检查,如果发现错误会自动矫正,这在很大程度上提高了数据传输的可靠性。
- SAS(Serial Attached SCSI)即串行连接SCSI,是新一代的SCSI技术,和现在流行的Serial ATA(SATA)硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连结线改善内部空间等。SAS是并行SCSI接口之后开发出的全新接口。此接口的设计是为了改善存储系统的效能、可用性和扩充性,并且提供与SATA硬盘的兼容性。
- NVMe
Linux 的磁盘设备命名
磁盘的命名一般跟其连接方式有关,如您会看到在Linux中有 /dev/sda、/dev/sdb、/dev/sdc 等形式名称。dev是设备的简称。sd是小型计算机系统接口(SCSI)大容量存储驱动程序的简称。还有/dev/nvme0n1 ,这是NVMe设备的名称。
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 58G 1.6G 57G 3% /
/dev/sda1 1014M 137M 878M 14% /boot
/dev/nvme0n1p1 21G 33M 21G 1% /mnt/minio2
/dev/nvme0n1p2 19G 33M 19G 1% /mnt/minio3
[root@localhost ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 xfs 5b17eb57-971f-4e74-9944-23c5e1886e3f /boot
├─sda2 swap a7d4d7be-1a7c-445b-bc65-525e5433c6b5 [SWAP]
└─sda3 xfs 197efbad-5f75-466b-8d57-00356735c955 /
nvme0n1
├─nvme0n1p1 xfs b825e09c-60c6-4a09-86bc-c150018acbf6 /mnt/minio2
└─nvme0n1p2 xfs 5aa038b9-a2b1-4f30-97c5-3f42f3966578 /mnt/minio3
磁盘分区
- MBR(Master Boot Record)
- GPT(GUID partition table)
MSDOS (MRB )
-
分区方式介
早期的 Linux 系统为了相容于 Windows 的磁盘,因此使用的是支持 Windows 的 MBR(Master Boot Record, 主要开机纪录区) 的方式来处理开机管理程序与分区表!而开 机管理程序纪录区与分区表则通通放在磁盘的第一个扇区, 这个扇区通常是 512Bytes 的大 小 (旧的磁盘扇区都是 512Bytes 喔!)
MBR 共占用了一个扇区,也就是 512 Byte。其中 446 Byte 安装了启动引导程序,其后 64 Byte 描述分区表,最后的 2 Byte 是结束标记。我们已经知道,每块硬盘只能划分 4 个主分区,原因就是在 MBR 中描述分区表的空间只有 64 Byte。其中每个分区必须占用 16 Byte,那么 64 Byte 就只能划分 4 个主分区。每个分区的 16 字节的规划如表 2 所示。
存储字节 数据内容及含义 第 1 字节 引导标志 第 2 字节 本分区的起始磁道号 第 3 字节 本分区的起始扇区号 第 4 字节 本分区的起始柱面号 第 5 字节 分区类型,可以识别主分区和扩展分区 第 6 字节 本分区的结束磁道号 第 7 字节 本分区的结束扇区号 第 8 字节 本分区的结束柱面号 第 9~12 字节 本分区之前已经占用的扇区数 第 13~16 字节 本分区的总扇区数 -
分区名称
由于分区表就只有64 Bytes而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为 主要(Primary)或延伸(Extended)分区。
- 其实所的“分区”只是针对那个64 Bytes的分区表进行设置而已!
- 硬盘默认的分区表仅能写入四组分区信息
- 这四组分区信息我们称为主要(Primary)或延伸(Extended)分区
- 分区的最小单位“通常”为柱面(cylinder)
- 当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据的处理
假设上面的硬盘设备文件名为/dev/sda时,那么这四个分区在Linux系统中的设备文件名则为/dev/sda1,/dev/sda2,/dev/sda3,/dev/sda4 ,这个数字一般是定死且与该分区所在的位置有关喔!
那/dev/sda5,/dev/sda6,/dev/sda7以是怎么来的呢,这是因为延伸(Extended)分区中又可以分出多个逻辑分区,以解决分区数量最大只有4个的问题。
注意: 延伸(Extended)分区最多只能有一个,且必须是最后一个 ,主分区最多可以有4个(此时没有延伸(Extended)分区)
GPT(GUID partition table)
因为过去一个扇区大小就是 512Bytes 而已,不过目前已经有 4K 的扇区设计出现!为了相容 于所有的磁盘,因此在扇区的定义上面, 大多会使用所谓的逻辑区块位址(Logical Block Address, LBA)来处理。GPT 将磁盘所有区块以此 LBA(默认为 512Bytes 喔!) 来规划, 而第一个 LBA 称为 LBA0 (从 0 开始编号)。 与 MBR 仅使用第一个 512Bytes 区块来纪录不同, GPT 使用了 34 个 LBA 区块来纪录分区 信息!同时与过去 MBR 仅有一的区块,被干掉就死光光的情况不同, GPT 除了前面 34 个 LBA 之外,整个磁盘的最后 33 个 LBA 也拿来作为另一个备份!这样或许会比较安全些吧! 详细的结构有点像下面的模样:
-
LBA0 (MBR 相容区块)
与 MBR 模式相似的,这个相容区块也分为两个部份,一个就是跟之前 446 Bytes 相似的 区块,储存了第一阶段的开机管理程序! 而在原本的分区表的纪录区内,这个相容模式 仅放入一个特殊标志的分区,用来表示此磁盘为 GPT 格式之意。而不懂 GPT 分区表的 磁盘管理程序, 就不会认识这颗磁盘,除非用户有特别要求要处理这颗磁盘,否则该管 理软件不能修改此分区信息,进一步保护了此磁盘喔!
-
LBA1 (GPT 表头纪录)
这个部份纪录了分区表本身的位置与大小,同时纪录了备份用的 GPT 分区 (就是前面谈 到的在最后 34 个 LBA 区块) 放置的位置, 同时放置了分区表的检验机制码 (CRC32),操作系统可以根据这个检验码来判断 GPT 是否正确。若有错误,还可以通 过这个纪录区来取得备份的 GPT(磁盘最后的那个备份区块) 来恢复 GPT 的正常运 行!
-
LBA2-33 (实际纪录分区信息处)
从 LBA2 区块开始,每个 LBA 都可以纪录 4 笔分区纪录,所以在默认的情况下,总共可 以有 4的32次方 = 128 笔分区纪录喔!因为每个 LBA 有 512Bytes,因此每笔纪录用到 128 Bytes 的空间,除了每笔纪录所需要的识别码与相关的纪录之外,GPT 在每笔纪录中分 别提供了 64bits 来记载开始/结束的扇区号码,因此,GPT 分区表对於单一分区来说, 他的最大容量限制就会在“ 233TB = 8 ZB ”。
练习:
准备一台机器(虚拟机)
准备一台机器(虚拟机),给它添加3个磁盘,如下图
开机后检查是否识别到磁盘
[root@localhost ~]# fdisk -l
## 这是第二块磁盘,识别到的名称为/dev/sdb
磁盘 /dev/sdb:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
## 这是第一块磁盘,识别到的名称为/dev/sda ,且这是系统安装的磁盘,所以我安装系统时已经做好了分区
磁盘 /dev/sda:64.4 GB, 64424509440 字节,125829120 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a2a95
## 已经做好分区的系统盘
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 4196351 1048576 82 Linux swap / Solaris
/dev/sda3 4196352 125829119 60816384 83 Linux
## 这是第三块磁盘,识别到的名称为 /dev/nvme0n1
磁盘 /dev/nvme0n1:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
为第二块磁盘分区
**开始分区第二块磁盘,这个使用MBR方式分区,使用的分区工具为 fdisk **
-
选择要分区的物理磁盘
[root@localhost ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 ## 第一步,选择要分区的物理磁盘 Device does not contain a recognized partition table 使用磁盘标识符 0x7279f769 创建新的 DOS 磁盘标签。
-
输入m ,查看帮助文档
## 第二步,输入m ,查看帮助文档 命令(输入 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)
-
输入n ,add a new partition(添加一个新分区)
## 第三步,输入n ,add a new partition(添加一个新分区) 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended
-
输入p ,选择分区类型为主分区
## 第四步,输入p ,选择分区类型为主分区 Select (default p): p
-
输入1 ,设置第一个分区
## 第五步,输入1 ,设置为第一个分区(总共可以有4个,所以选项是1-4) 分区号 (1-4,默认 1):1
-
输入此分区的起始扇区,直接回车默认即
## 第六步,输入此分区的起始扇区,直接回车默认即可 起始 扇区 (2048-83886079,默认为 2048): 将使用默认值 2048
-
输入此分区的结束扇区
## 第七步,输入此分区的结束扇区,使用 +25G 的格式,将起始扇区的后面25G大小分配给此分区 Last 扇区, +扇区 or +size{K,M,G} (2048-83886079,默认为 83886079):+25G 分区 1 已设置为 Linux 类型,大小设为 25 GiB
-
到此分区设置完成
## 到此分区设置完成 下面是重复上面的步骤将剩余的空间分配给了第二个主分区 命令(输入 m 获取帮助):n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p 分区号 (2-4,默认 2): 起始 扇区 (52430848-83886079,默认为 52430848): 将使用默认值 52430848 Last 扇区, +扇区 or +size{K,M,G} (52430848-83886079,默认为 83886079): 将使用默认值 83886079 分区 2 已设置为 Linux 类型,大小设为 15 GiB
-
保存并查看分区
## 最后,输入 w ,将前面的操作保存。 命令(输入 m 获取帮助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。 ## 到此MRB分区完成。 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 60G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 1G 0 part [SWAP] └─sda3 8:3 0 58G 0 part / ## 这就是刚刚上面完成的分区磁盘/dev/sdb sdb 8:16 0 40G 0 disk ├─sdb1 8:17 0 25G 0 part └─sdb2 8:18 0 15G 0 part sr0 11:0 1 918M 0 rom ## 这是还没有分区的第三块磁盘 nvme0n1 259:0 0 40G 0 disk
为第三块磁盘分区
开始分区第三块磁盘,这个使用GPT方式分区,使用的分区工具为 gdisk
[root@localhost ~]# gdisk /dev/nvme0n1
## 第一步,选择要分区的物理磁盘
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
## 使用的是GPT方式
Creating new GPT entries.
Command (? for help): ?
b back up GPT data to a file
c change a partition's name
d delete a partition
i show detailed information on a partition
l list known partition types
n add a new partition
o create a new empty GUID partition table (GPT)
p print the partition table
q quit without saving changes
r recovery and transformation options (experts only)
s sort partitions
t change a partition's type code
v verify disk
w write table to disk and exit
x extra functionality (experts only)
? print this menu
## 过程和上面的fdisk类似,选择分区号(1-128),起始卷,结束卷,类型
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-83886046, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-83886046, default = 83886046) or {+-}size{KMGTP}: +20G
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): n
Partition number (2-128, default 2):
First sector (34-83886046, default = 41945088) or {+-}size{KMGTP}:
Last sector (41945088-83886046, default = 83886046) or {+-}size{KMGTP}:
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/nvme0n1.
The operation has completed successfully.
## 查看分区结果
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
## 刚刚完成分区的第三块磁盘
nvme0n1 259:0 0 40G 0 disk
├─nvme0n1p1 259:1 0 20G 0 part
└─nvme0n1p2 259:2 0 20G 0 part
创建文件系统
[root@localhost ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 xfs 5b17eb57-971f-4e74-9944-23c5e1886e3f /boot
├─sda2 swap a7d4d7be-1a7c-445b-bc65-525e5433c6b5 [SWAP]
└─sda3 xfs 197efbad-5f75-466b-8d57-00356735c955 /
## 此时还没有识别到UUID和文件系统类型(FSTYPE)
sdb
├─sdb1
└─sdb2
nvme0n1
├─nvme0n1p1
└─nvme0n1p2
[root@localhost ~]# fdisk -l
磁盘 /dev/sdb:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos ## 分区后的类型识别
磁盘标识符:0x7279f769
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 52430847 26214400 83 Linux
/dev/sdb2 52430848 83886079 15727616 83 Linux
磁盘 /dev/nvme0n1:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt ## 分区后的类型识别
Disk identifier: 27D98CF1-7E9E-4D73-9E93-B08F8AB56204
# Start End Size Type Name
1 2048 41945087 20G Linux filesyste Linux filesystem
2 41945088 83886046 20G Linux filesyste Linux filesystem
## 新建4个目录,用来挂载4个分区
[root@localhost mnt]# mkdir /mnt/minio{1,2,3,4}
[root@localhost mnt]# ls
minio1 minio2 minio3 minio4
## 直接挂载,发现是失败的,并没有看到/dev/sdb的挂载信息
[root@localhost mnt]# mount /dev/sdb1 /mnt/minio1
mount: /dev/sdb1 写保护,将以只读方式挂载
mount: 未知的文件系统类型“(null)”
[root@localhost mnt]# mount |grep /dev/sd
/dev/sda3 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
## 创建文件系统xfs
[root@localhost mnt]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1638400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=6553600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=3200, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost mnt]# mkfs.xfs /dev/sdb2
meta-data=/dev/sdb2 isize=512 agcount=4, agsize=982976 blks
## 将其挂载到目录
[root@localhost mnt]# df -h|grep /dev/sdb
[root@localhost mnt]# mount /dev/sdb1 /mnt/minio1
[root@localhost mnt]# mount /dev/sdb2 /mnt/minio2
[root@localhost mnt]# mount |grep /dev/sdb
/dev/sdb1 on /mnt/minio1 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sdb2 on /mnt/minio2 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
## 将另一块磁盘的两个分区也初始化
[root@localhost mnt]# mkfs.xfs /dev/nvme0n1p1
[root@localhost mnt]# mkfs.xfs /dev/nvme0n1p2
## 查看磁盘和分区信息 ,此时UUID和FSTYPE都已经有了
[root@localhost mnt]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 xfs 5b17eb57-971f-4e74-9944-23c5e1886e3f /boot
├─sda2 swap a7d4d7be-1a7c-445b-bc65-525e5433c6b5 [SWAP]
└─sda3 xfs 197efbad-5f75-466b-8d57-00356735c955 /
sdb
├─sdb1 xfs f2e2d9d0-809c-405d-b2d7-0615befbdcd7 /mnt/minio1
└─sdb2 xfs 78179d06-4434-4e2f-851c-42f144e28c5d /mnt/minio2
sr0 iso9660 CentOS 7 x86_64 2018-11-25-21-21-31-00
nvme0n1
├─nvme0n1p1 xfs 884eb534-1337-4d7f-93dd-2fc3ecd2fb6d
└─nvme0n1p2 xfs fa5fa835-e6dd-45cf-8f32-01bcf5a43ef9
挂载
## 上面是通过命令一次性挂载磁盘,重启后就会失效,下面使用系统配置文件/etc/fstab 实现开机自动挂载
[root@localhost ~]# mount -a
[root@localhost ~]# mount |grep /dev/
/dev/sdb1 on /mnt/minio1 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sdb2 on /mnt/minio2 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/nvme0n1p1 on /mnt/minio3 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/nvme0n1p2 on /mnt/minio4 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 25G 33M 25G 1% /mnt/minio1
/dev/sdb2 15G 33M 15G 1% /mnt/minio2
/dev/nvme0n1p1 20G 33M 20G 1% /mnt/minio3
/dev/nvme0n1p2 20G 33M 20G 1% /mnt/minio4