基础-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

磁盘分区

  1. MBR(Master Boot Record)
  2. GPT(GUID partition table)

MSDOS (MRB )

  1. 分区方式介

    早期的 Linux 系统为了相容于 Windows 的磁盘,因此使用的是支持 Windows 的 MBR(Master Boot Record, 主要开机纪录区) 的方式来处理开机管理程序与分区表!而开 机管理程序纪录区与分区表则通通放在磁盘的第一个扇区, 这个扇区通常是 512Bytes 的大 小 (旧的磁盘扇区都是 512Bytes 喔!)img

    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 字节 本分区的总扇区数
  2. 分区名称

    由于分区表就只有64 Bytes而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为 主要(Primary)或延伸(Extended)分区。

    1. 其实所的“分区”只是针对那个64 Bytes的分区表进行设置而已!
    2. 硬盘默认的分区表仅能写入四组分区信息
    3. 这四组分区信息我们称为主要(Primary)或延伸(Extended)分区
    4. 分区的最小单位“通常”为柱面(cylinder)
    5. 当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据的处理

    假设上面的硬盘设备文件名为/dev/sda时,那么这四个分区在Linux系统中的设备文件名则为/dev/sda1,/dev/sda2,/dev/sda3,/dev/sda4 ,这个数字一般是定死且与该分区所在的位置有关喔!

    那/dev/sda5,/dev/sda6,/dev/sda7以是怎么来的呢,这是因为延伸(Extended)分区中又可以分出多个逻辑分区,以解决分区数量最大只有4个的问题。

    image-20230212130207039

    注意: 延伸(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 也拿来作为另一个备份!这样或许会比较安全些吧! 详细的结构有点像下面的模样:

image-20230212130845195

  • 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个磁盘,如下图

image-20230212132813343

开机后检查是否识别到磁盘

[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 **

  1. 选择要分区的物理磁盘

    [root@localhost ~]# fdisk /dev/sdb
    欢迎使用 fdisk (util-linux 2.23.2)。
    ## 第一步,选择要分区的物理磁盘
    Device does not contain a recognized partition table
    使用磁盘标识符 0x7279f769 创建新的 DOS 磁盘标签。
    
  2. 输入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)
    
  3. 输入n ,add a new partition(添加一个新分区)

    ## 第三步,输入n ,add a new partition(添加一个新分区)
    命令(输入 m 获取帮助):n
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    
  4. 输入p ,选择分区类型为主分区

    ## 第四步,输入p ,选择分区类型为主分区 
    Select (default p): p
    
  5. 输入1 ,设置第一个分区

    ## 第五步,输入1 ,设置为第一个分区(总共可以有4个,所以选项是1-4)
    分区号 (1-4,默认 1):1
    
  6. 输入此分区的起始扇区,直接回车默认即

    ## 第六步,输入此分区的起始扇区,直接回车默认即可
    起始 扇区 (2048-83886079,默认为 2048):
    将使用默认值 2048
    
  7. 输入此分区的结束扇区

    ## 第七步,输入此分区的结束扇区,使用 +25G 的格式,将起始扇区的后面25G大小分配给此分区
    Last 扇区, +扇区 or +size{K,M,G} (2048-83886079,默认为 83886079):+25G
    分区 1 已设置为 Linux 类型,大小设为 25 GiB
    
  8. 到此分区设置完成

    ## 到此分区设置完成 下面是重复上面的步骤将剩余的空间分配给了第二个主分区
    命令(输入 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
    
  9. 保存并查看分区

    ## 最后,输入 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

挂载

image-20230212142208507

## 上面是通过命令一次性挂载磁盘,重启后就会失效,下面使用系统配置文件/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
posted @ 2023-02-12 20:25  菜阿  阅读(371)  评论(0编辑  收藏  举报