Linux【6】-硬盘管理2-1-分区

一、分区的几个基本概念

1.1 磁盘的文件名

Linux 中每个硬件都被当做一个文件。

常见磁盘的文件名:

  • SCSI/SATA/USB 磁盘:/dev/sd[a-p]
  • IDE 磁盘:/dev/hd[a-d]

其中文件名后面的序号的确定与磁盘插入的顺序有关,而与磁盘所插入的插槽位置无关。

1.2 分区表

磁盘分区表主要有两种格式:

  1. 一种是限制较多的 MBR 分区表
  2. 一种是较新且限制较少的 GPT 分区表。

1.MBR

MBR 中,第一个扇区最重要,里面有:

  • 主要开机记录(Master boot record, MBR),其中 MBR 占 446 bytes
  • 分区表(partition table),,partition table 占 64 bytes。

分区表只有 64 bytes,最多只能存储 4 个分区,这 4 个分区为主分区(Primary)和扩展分区(Extended)。其中扩展分区只有一个,它将其它空间用来记录分区表,可以记录更多的分区,因此通过扩展分区可以分出更多区分,这些分区称为逻辑分区。

Linux 也把分区当成文件,分区文件的命名方式为:磁盘文件名+编号,例如 /dev/sda1。注意,逻辑分区的编号从 5 开始。

2.GPT

不同的磁盘有不同的扇区大小,例如 512bytes 和最新磁盘的 4k。GPT 为了兼容所有磁盘,在定义扇区上使用逻辑区块地址(Logical Block Address, LBA)。

GPT 第 1 个区块记录了 MBR,紧接着是 33 个区块记录分区信息,并把最后的 33 个区块用于对分区信息进行备份。

GPT 没有扩展分区概念,都是主分区,最多可以分 128 个分区。

二、查看硬盘

在硬盘装上后,在分区之前,用 fdisk –l 就可以看到这块硬盘了,fdisk –l 会输出一些有关这块硬盘的基本信息,如下所示:

[root@localhost ~]# fdisk –l 硬盘名/分区名

….#此处省略若干行
Disk /dev/sdb: 536.9 GB, 536870912000 bytes
255 heads, 63 sectors/track, 65270 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2f7e945a
…#此处省略若干行

要理解 fdisk –l 输出的关于磁盘的基本信息,我们首先需要简要了解一下机 械式磁盘(HDD)的物理构成:我们需要知道的概念包括:

  • 盘片(platter):一个机械式磁盘一般由若干磁性盘片组成;
  • 磁头(head):每个盘片一般有上下两面,盘片的两个面均能存储数据,因此需要两个磁头;
  • 磁道(track):每个盘片沿着半径的方向可以划分为很多同心圆,这些圆圈被称为磁道(track),磁道是从盘片外圈往内圈编号 0 磁道,1 磁道…,靠近 主轴的同心圆用于停靠磁头,不存储数据;
  • 扇区(sector):每个磁道被分成若干等份,每一份就被称为一个扇区,扇区是硬盘数据存储的最小单位;
  • 柱面(cylinder)数:不同盘片上具有相同磁道编号的同心圆组成面就称作柱面,所以磁盘柱面数就等于磁盘单个盘片上的磁道数。柱面是硬盘分区的最小单位.因此,一个磁盘的容量 = 磁头数 ×柱面数 × 每道扇区数 × 每扇区字节数。

所以,上面这段 fdisk –l 输出就是告诉我们:这个名为/dev/sdb 的磁盘容量 总共为 536870912000 字节(536.9 GB),磁盘有 255 个磁头,每个磁道有 63 个扇区,总共有 65270 个柱面(磁道)。其中每个扇区容量为 512 字节(这个磁 盘的最小逻辑和物理单元,也是这个磁盘的读写的最小单元), 因此每个柱面的 容量为 255×63×512 字节=8225280 字节。

当然在对磁盘进行分区( Partition )前,磁盘是无法用来存储数据的。事实上, 对磁盘进行分区的作用就是告诉操作系统磁盘可存储数据的区域,也即每个分区 的起始柱面和结束柱面。这些分区信息都包括在一个叫做分区表(Partition Table) 的数据结构中。

分区表是一块磁盘中最重要的数据,分区表一般存储在磁盘的 0 磁道上面 (所以当一个硬盘的 0 磁道发生了物理损坏的时,这个硬盘就基本宣告寿终正 寝了),硬盘仅仅为分区表保留了 64 个字节的存储空间,而每个分区的参数占据 16 个字节,故主引导扇区中总计可以存储 4 个分区的数据,,这就是主分区 (Primary)+扩展分区(Extended) 最多只能有四个的原因了。

注意要查询一下自己的硬盘格式,用

df -T

三、分区和格式化硬盘

3.1 fdisk

见后续内容

3.2 parted

见后续内容

四、分个大于2T的硬盘

如果一个大于2T的硬盘分区的话,会提示如下的错误:

# fdisk /dev/sdb
    Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

    WARNING: The size of this disk is 5.9 TB (5908688535552 bytes).
    DOS partition table format can not be used on drives for volumes
    larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID
    partition table format (GPT).

那如何来划分出1个大于2T的分区呢?

4.1 创建2T的分区

fdisk /dev/sdb1

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-718357, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-267349, default 267349):
Using default value 267349

这样,2T的分区就被建立了

Command (m for help): p

Disk /dev/sdb: 5908.7 GB, 5908688535552 bytes
255 heads, 63 sectors/track, 718357 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3dffd626

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1      267349  2147480811   83  Linux

4.2 建立gpt的分区表

GPT stands for GUID partition table format (GPT).

parted /dev/sdb

GNU Parted 2.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) print
Error: /dev/sdb: unrecognised disk label


(parted) mklabel gpt


(parted) print
Model: Unknown (unknown)
Disk /dev/sdb: 5909GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start  End  Size  File system  Name  Flags


parted /dev/sdb

(parted) mkpart primary 0GB 5909GB

(parted) print
Model: Unknown (unknown)
Disk /dev/sdb: 5909GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  5909GB  5909GB               primary

然后查看,fdisk分区的一个状态:

# fdisk /dev/sdb

Command (m for help): print

Disk /dev/sdb: 5908.7 GB, 5908688535552 bytes
255 heads, 63 sectors/track, 718357 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1      267350  2147483647+  ee  GPT

4.3 初始化

mkfs.xfs /dev/sdb

3.4 挂载

见下文

五、调整分区大小

/root的分区过小,/home分区多大,需要调整一下(/home的数据需要备份,不然会丢失哦)

[root@g01 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G   49G  1.4G  98% /
devtmpfs                 504G     0  504G   0% /dev
tmpfs                    504G   40K  504G   1% /dev/shm
tmpfs                    504G  140M  504G   1% /run
tmpfs                    504G     0  504G   0% /sys/fs/cgroup
/dev/sda1               1014M  212M  803M  21% /boot
/dev/mapper/centos-home  1.7T  2.9G  1.7T   1% /home
tmpfs                    101G   12K  101G   1% /run/user/42
2.***1:/test             52T   26T   27T  49% /mnt/nfs
tmpfs                    101G     0  101G   0% /run/user/1201
tmpfs                    101G     0  101G   0% /run/user/1344

关闭/home上面的运行程序

例如mysql等

systemctl stop mysql

备份/home的文件,重新分区home,home文件会丢失

tar -czvf /home/home.tgz -C /home .

#test the backup
tar -tvf /home/home.tgz
#copy /home/home.tgz to other PC 

解除挂载

unmount home
umount /dev/mapper/centos-home

如果显示/home正忙,且不在/home目录下,说明/home下有进程正在使用,用

fuser -m -v -i -k /home

杀死/home下的进程,再解除挂载点。但是fuser在centos7里面不是默认安装的,需要

yum install psmisc

来安装这个包。

接着解除挂载和去掉centos-home逻辑分区

umount /home

lvremove /dev/mapper/centos-home

扩展/root所在的lv,增加700G :

lvextend -L +710G /dev/mapper/centos-root

扩展/root文件系统

xfs_growfs /dev/mapper/centos-root

接着查看

[root@g01 ~]# vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  7
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <1.75 TiB
  PE Size               4.00 MiB
  Total PE              457463
  Alloc PE / Size       195584 / 764.00 GiB
  Free  PE / Size       261879 / 1022.96 GiB
  VG UUID               ZTeJi0-eWrr-ctyy-2J7t-igAu-Ba2V-2uDOgL

重新创建home lv 分区的大小,根据 vgdisplay 中的free PE 的大小确定

lvcreate -L 1022G -n home centos

创建文件系统:

mkfs.xfs /dev/centos/home

挂载 home:

mount /dev/centos/home /home

复原刚才备份的文件

tar -xzvf /root/home.tgz -C /home

check /etc/fstab for any mapping of /home volume. IF it is using UUID you should update the UUID portion. (Since we created a new volume, UUID has changed)

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn