Categories
程式開發

Linux雲服務器存儲擴容實操


導語 | 隨著業務的發展,業務數據不停的增長,原有的磁盤空間可能會出現磁盤空間不夠用的情況,因此,需要對磁盤空間進行擴容,以滿足業務數據增長的需求。本文總結了Linux環境下云服務器存儲擴容的三種方式及其操作步驟,與大家一同交流。

環境說明:

  • Linux操作系統:CentOS Linux release 7.6.1810 (Core)
  • 平台環境:騰訊雲CVM,CBS

一、存儲擴容概述

以下圖為例,假如起初購買了100G磁盤空間,隨著數據的不停增長,原有100G空間不夠用了,將空間擴容至200G。

CBS是騰訊雲提供用於雲服務器的持久性數據塊級存儲服務,雲盤具有彈性,按需擴容特性,雲盤可以任意的按需擴容。

Linux雲服務器存儲擴容實操 1

存儲擴容概述

不過雲盤擴容時不是所有的場景下都可以任意擴容,雲盤擴容具有兩個限制:

  • 系統盤不支持擴容,理論上系統盤也能夠支持擴容,系統盤存放操作系統數據,擴容可能會造成系統啟動異常;本地盤不支持擴容,
  • 本地盤使用宿主機的本地盤,本地盤彈性擴容能力沒有云盤靈活,無法支持彈性按需擴容。

要深入掌握雲盤的擴容,需要掌握雲盤的使用方式,在Linux下通常有如下三種使用方式:

  1. 裸設備創建文件系統,不需要創建任何分區,直接在裸盤上創建文件系統;
  2. 磁盤上創建MBR格式的分區,適用於小於2T的多個磁盤分區的場景;
  3. 磁盤上創建GPT格式的分區,適用於大於2T的多個磁盤分區的場景。

二、 Linux雲服務器存儲擴容

1. 裸設備磁盤使用

Linux系統中可以直接在裸設備磁盤上創建文件系統,即磁盤不需要創建任何磁盤分區,直接在磁盤上創文件文件系統並掛載使用,其具有如下特點:

  • 磁盤不需要多個分區;
  • 適用於大於2T磁盤;
  • 簡單易使用;
  • 後期支持在線擴容。

Linux雲服務器存儲擴容實操 2

裸設備文件創建文件系統

上圖所示是在Linux系統中直接在裸設備創建文件系統的操作步驟,先在控制台購買好雲盤並將其掛載到CVM中,然後登陸到Linux系統中對磁盤格式化文件系統並掛載使用。

控制台購買和掛載請自行操作,如下演示在Linux系統中裸設備文件系統的使用步驟:

(1) 登陸操作系統,通過fdisk -l獲取磁盤的名稱,系統有兩塊磁盤vda和vdb,/dev/vdb是我們操作的磁盤。

[[email protected]_0_89_centos ~]# fdisk -l

Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors   #vda为系统盘
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009ac89

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048   104857566    52427759+  83  Linux

Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors   #vdb为数据盘
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

(2) 直接在磁盤上創建文件系統(注:並未在磁盤上創建任何分區),根據需要格式化為ext4或xfs格式。

[[email protected]_0_89_centos ~]# mkfs.ext4 /dev/vdb    #创建文件ext4文件系统
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
6553600 inodes, 26214400 blocks
1310720 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2174746624
800 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
  32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
  4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

备注:如果要创建为xfs则使用mkfs.xfs /dev/vdb

(3) 創建好文件系統後即可掛載到系統中使用,使用方式有兩種:臨時mount或編寫fstab實現持久性掛載。

線上環境推薦使用編寫fstab的方式,避免機器下次重啟後磁盤信息未加載,掛載名稱推薦使用UUID。

blkid获取磁盘UUID信息
[[email protected]_0_89_centos ~]# blkid /dev/vdb
/dev/vdb: UUID="7fb2c90a-fcd1-472c-b07c-8a20e2e9a436" TYPE="ext4"

编写/etc/fstab,其内容如下
UUID="7fb2c90a-fcd1-472c-b07c-8a20e2e9a436" /data      ext4     defaults  0 0

(4) 掛載點目錄/data需要提前創建好,然後執行mount -a進行加載,mount -a是系統啟動時之行的指令,如果fstab編寫有誤要及時修復,避免影響下次開機啟動。

执行挂载操作
[[email protected]_0_89_centos ~]# mount -a

检查挂载情况
[[email protected]_0_89_centos ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        485M     0  485M   0% /dev
tmpfs           496M   24K  496M   1% /dev/shm
tmpfs           496M  444K  496M   1% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/vda1        50G  1.8G   46G   4% /
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb         99G   61M   94G   1% /data        #vdb磁盘已顺利挂载到系统中,大小为100G

至此,基於Linux系統上使用裸盤構建文件系統並使用操作演示完畢,通過操作可知,裸盤上創建文件系統方式不需要對磁盤進行分區,操作便捷容易,且方便擴容,下面部分將演示基於裸設備文件的文件系統存儲空間擴容。

2. 裸設備磁盤擴容

Linux雲服務器存儲擴容實操 3

裸設備擴容

上述步驟是裸設備磁盤的擴容方式,擴容過程中存在數據損壞的風險,為了避免擴容過程中誤操作,強烈建議擴容前對磁盤做快照,以防數據損壞時做恢復!

做完快照後在控制台完成磁盤的擴容,擴容完畢後需要在操作系統中識別到擴容的空間。以磁盤擴容至200G為例,演示在Linux中裸設備擴容的操作過程:

(1) 確認磁盤的使用方式,通過fdisk -l查看磁盤並未創建有任何磁盤分區。

[[email protected]_0_89_centos ~]# fdisk -l /dev/vdb

Disk /dev/vdb: 214.7 GB, 214748364800 bytes, 419430400 sectors    #磁盘空间已扩容至200G
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes        #当前磁盘上未创建任何分区

#使用blkid查看vdb磁盘文件系统的情况,可得知,当前/dev/vdb未创建磁盘分区,切构建了ext4文件系统
[[email protected]_0_89_centos ~]# blkid
/dev/sr0: UUID="2020-01-13-22-30-05-00" LABEL="config-2" TYPE="iso9660" 
/dev/vda1: UUID="4b499d76-769a-40a0-93dc-4a31a59add28" TYPE="ext4" 
/dev/vdb: UUID="7fb2c90a-fcd1-472c-b07c-8a20e2e9a436" TYPE="ext4"   #直接在裸盘上创建ext4文件系统

(2) 確認為雲盤的擴容方式為裸盤後,根據文件系統的類型,在文件系統層面擴容以識別到雲盤的擴容空間。

[[email protected]_0_89_centos ~]# resize2fs /dev/vdb
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vdb is mounted on /data; on-line resizing required
old_desc_blocks = 13, new_desc_blocks = 25
The filesystem on /dev/vdb is now 52428800 blocks long.    #提示已经扩容至52428800个block

备注:如果是xfs,则使用xfs_growfs /dev/vdb扩容

(3) 校驗磁盤空間擴容情況,使用df -H校驗,vdb磁盤已在文件系統擴容至200G。

[[email protected]_0_89_centos ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        485M     0  485M   0% /dev
tmpfs           496M   24K  496M   1% /dev/shm
tmpfs           496M  444K  496M   1% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/vda1        50G  1.8G   46G   4% /
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb        197G   60M  188G   1% /data    #已扩容至200G

通過上述的操作演示可知,裸盤上並未創建任何磁盤分區,因此擴容過程相當便捷,直接在文件系統上擴容即可,使用簡單,這也是雲上推薦使用方式。

3. MBR磁盤分區

如果磁盤需要創建多個分區並將分區掛載到不同的目錄中使用需要對磁盤進行分區,傳統的磁盤分區方式會使用MBR的格式進行分區,MBR分區具有如下特性:

  • 適用於小於2T的磁盤,大於2T的空間將無法識別
  • 單塊磁盤需要創建多個分區的場景
  • MBR最多支持7個分區,即3個主分區+4個擴展分區

Linux雲服務器存儲擴容實操 4

MBR磁盤分區使用

如上圖是對磁盤製作MBR格式分區的操作步驟,在控制台購買並掛載到CVM雲主機後,登錄到操作系統中對磁盤進行分區和使用。

如下以新購的一塊100G磁盤為例演示基於cbs雲盤上創建MBR磁盤分區的過程

(1) 使用fdisk -l獲取到到磁盤的名稱,包含兩塊磁盤vda和vdb,vdb是我們需要操作的cbs雲盤。

[[email protected]_0_89_centos ~]# fdisk -l

Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009ac89

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048   104857566    52427759+  83  Linux

Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

(2) 使用fdisk工具對磁盤進行分區,fdisk /dev/vdb進入到fdisk交互式界面,通過交互式完成分區創建。

[[email protected]_0_89_centos ~]# fdisk  /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x5eeb4bc8.

Command (m for help): m      #输入m可以获取到操作指令的帮助
Command action
   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)

Command (m for help): n         #新建分区,输入n进入到新建分区交互界面
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p            #选择分区类型,p表示主分区,e代表扩展分区
Partition number (1-4, default 1):          #分区号码
First sector (2048-209715199, default 2048):   #起始扇区范围
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199):    #结束删除范围
Using default value 209715199
Partition 1 of type Linux and of size 100 GiB is set

Command (m for help): p         #显示分区情况,可以看到已创建一个vdb1的分区

Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5eeb4bc8

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048   209715199   104856576   83  Linux   #磁盘分区的信息

Command (m for help): w      #报错退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

(3) 使用partprobe將分區的信息同步給內核,讓內核識別到該分區信息。

[[email protected]_0_89_centos ~]# partprobe /dev/vdb

(4) 接下來可以對分區製作文件系統,製作成操作系統能夠識別的文件系統,以製作xfs文件系統為例。

[[email protected]_0_89_centos ~]# mkfs.xfs /dev/vdb1
meta-data=/dev/vdb1              isize=512    agcount=4, agsize=6553536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=26214144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=12799, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

[[email protected]_0_89_centos ~]# blkid
/dev/sr0: UUID="2020-01-13-22-30-05-00" LABEL="config-2" TYPE="iso9660" 
/dev/vda1: UUID="4b499d76-769a-40a0-93dc-4a31a59add28" TYPE="ext4" 
/dev/vdb1: UUID="c387af37-56d7-436c-8ceb-0a735e0db5d5" TYPE="xfs"          #文件系统制作为xfs

备注:如果是制作为ext4则使用mkfs.ext4 /dev/vdb1

(5) 編寫fstab掛載到系統中,確保下次開機後配置生效。

[[email protected]_0_89_centos ~]# vim/etc/fstab
UUID="c387af37-56d7-436c-8ceb-0a735e0db5d5" /data      xfs    defaults     0 0

(6) 執行mount -a加載掛載配置,並檢查掛載情況。

[[email protected]_0_89_centos ~]# mount -a

[[email protected]_0_89_centos ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        485M     0  485M   0% /dev
tmpfs           496M   24K  496M   1% /dev/shm
tmpfs           496M  448K  496M   1% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/vda1        50G  1.9G   46G   4% /
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb1       100G   33M  100G   1% /data    #磁盘已经挂载到系统中

4 MBR磁盤擴容

MBR格式的磁盤擴容需要在MBR磁盤分區中擴展空間,並在文件系統中擴展文件系統空間以識別到擴容的空間,騰訊雲為此提供了一個專門擴容的腳本devresize.py,腳本要求條件如下:

  • 文件系統是 EXT2/EXT3/EXT4/XFS;
  • 當前文件系統不能有錯誤;
  • 擴容後的磁盤大小不超過2TB;
  • 當前工具僅支持 Python 2 版本,不支持 Python 3 版本。

Linux雲服務器存儲擴容實操 5

MBR格式磁盤分區擴容

如上圖為MBR格式磁盤的擴容步驟,現在控制台中做好快照,並擴容,然後登錄到操作系統中完成分區和文件系統的擴容,如下以擴容至200G為例演示在MBR格式的磁盤分區擴容方法

(1) 檢查磁盤的擴容,確認擴容的方式,根據System類型為Linux判斷為MBR格式的分區。

[[email protected]_0_89_centos ~]# fdisk -l /dev/vdb

Disk /dev/vdb: 214.7 GB, 214748364800 bytes, 419430400 sectors   #空间大小已扩容至200G
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5eeb4bc8

   Device Boot      Start         End      Blocks   Id  System   #System类型为Linux表示使用MBR格式分区
/dev/vdb1            2048   209715199   104856576   83  Linux

(2) 獲取擴容的腳本,該腳本可以完成分區的擴容和文件系統的自動擴容,需要離線執行,因此先需要卸載磁盤。

[[email protected]_0_89_centos ~]# wget -O /tmp/devresize.py https://raw.githubusercontent.com/tencentyun/tencentcloud-cbs-tools/master/devresize/devresize.py

无法在线执行,需卸载磁盘
[[email protected]_0_89_centos ~]# python /tmp/devresize.py /dev/vdb
[ERROR] - Target partition /dev/vdb1 must be unmounted.
[[email protected]_0_89_centos ~]# umount  /dev/vdb1

(3) 執行擴容步驟。

[[email protected]_0_89_centos ~]# python /tmp/devresize.py /dev/vdb
[INFO] - checking filesystem healthy
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan and clear agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
Phase 5 - rebuild AG headers and trees...
        - reset superblock...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done
[INFO] - mount /dev/vdb1 /tmp/mount_point_vdb_2020-01-14_16:04:30
[INFO] - umount /dev/vdb1
This operation will extend /dev/vdb1 to the last sector of device. 
To ensure the security of your valuable data, 
please create a snapshot of this volume before resize its file system, continue? [Y/n]
y                                #提示是否创建快照,确保做好快照后输入y继续
It will resize (/dev/vdb1).
This operation may take from several minutes to several hours, continue? [Y/n]  #备份并resize,确认输入y
y
[INFO] - Backup MBR to /tmp/MBR_vdb1_2020-01-14_16:04:40_bak
[INFO] - mount /dev/vdb1 /tmp/mount_point_vdb_2020-01-14_16:04:30
[INFO] - resize filesystem
meta-data=/dev/vdb1              isize=512    agcount=4, agsize=6553536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=26214144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=12799, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 26214144 to 52428544
[INFO] - umount /dev/vdb1
[INFO] - Finished

(4) 重新掛載文件系統並確認擴容空間。

[[email protected]_0_89_centos ~]# mount -a    #重新挂载

[[email protected]_0_89_centos ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        485M     0  485M   0% /dev
tmpfs           496M   24K  496M   1% /dev/shm
tmpfs           496M  448K  496M   1% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/vda1        50G  1.9G   46G   4% /
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb1       200G   33M  200G   1% /data        #空间已扩容至200G

注意事項

  1. 擴容前一定要先做好快照,避免數據損壞時可快速恢復;
  2. MBR格式磁盤擴容需要卸載雲盤,因此是離線擴容,如果雲盤有在使用,請先停止業務後再擴容。

5. MBR新增磁盤分區

如果需要分區的場景,可以將擴容的空間劃分成一個新的分區供操作系統使用,通過在磁盤上新創建分區的方式實現擴容,其具有如下特點:

  • 單盤需要多個分區的場景;
  • 擴容空間小於2T;
  • 擴容後原分區無法擴容;
  • CBS雲盤是按需彈性擴展,推薦使用單磁盤單分區掛載,雲上推薦使用裸盤創建文件系統。

Linux雲服務器存儲擴容實操 6

MBR新增磁盤分區

如下以一塊200G的CBS盤擴容至300G為例演示在MBR格式磁盤上新增分區的方式實現磁盤擴容使用方式:

(1) 準備工作,控制台做好快照,並在控制台完成磁盤空間擴容;

(2) fdisk -l檢查磁盤擴容的大小,通過System類型為Linux可得知其為MBR分區格式的磁盤。

[[email protected]_0_89_centos ~]# fdisk -l /dev/vdb

Disk /dev/vdb: 322.1 GB, 322122547200 bytes, 629145600 sectors   #磁盘大小已扩容至300G
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5eeb4bc8

   Device Boot      Start         End      Blocks   Id  System   #磁盘分区类型为MBR格式
/dev/vdb1            2048   419430399   209714176   83  Linux

(3) 擴容磁盤上新創建一個磁盤分區 /dev/vdb2,大小為100G。

[[email protected]_0_89_centos ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p

Disk /dev/vdb: 322.1 GB, 322122547200 bytes, 629145600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5eeb4bc8

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048   419430399   209714176   83  Linux   #当前已有一个分区

Command (m for help): n      #新增一个分区
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p   #分区类型为主分区
Partition number (2-4, default 2): 
First sector (419430400-629145599, default 419430400):    #开始扇区大小
Using default value 419430400
Last sector, +sectors or +size{K,M,G} (419430400-629145599, default 629145599):    #结束扇区大小
Using default value 629145599
Partition 2 of type Linux and of size 100 GiB is set

Command (m for help): p   #查看分区创建的情况

Disk /dev/vdb: 322.1 GB, 322122547200 bytes, 629145600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5eeb4bc8

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048   419430399   209714176   83  Linux
/dev/vdb2       419430400   629145599   104857600   83  Linux   #分区已创建成功

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

(4) 刷新內核分區以識別到分區內容。

[[email protected]_0_89_centos ~]# partprobe /dev/vdb

(5) 格式化磁盤分區,創建操作系統能識別的文件系統,以xfs為例。

[[email protected]_0_89_centos ~]# mkfs.xfs /dev/vdb2
meta-data=/dev/vdb2              isize=512    agcount=4, agsize=6553600 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=26214400, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=12800, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

(6) 掛載至系統中,推薦使用fstab掛載。

获取分区UUID号
[[email protected]_0_89_centos ~]# blkid /dev/vdb2
/dev/vdb2: UUID="448467bd-f3fa-41cc-a5ad-ab316f7b62e2" TYPE="xfs"

编写fstab文件
echo 'UUID="448467bd-f3fa-41cc-a5ad-ab316f7b62e2"    /data1    xfs    defaults    0 0' >>/etc/fstab

创建挂载目录并挂载
[[email protected]_0_89_centos ~]# mkdir /data1
[[email protected]_0_89_centos ~]# mount -a

检查挂载情况
[[email protected]_0_89_centos ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        485M     0  485M   0% /dev
tmpfs           496M   24K  496M   1% /dev/shm
tmpfs           496M  452K  496M   1% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/vda1        50G  1.9G   46G   4% /
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb1       200G   33M  200G   1% /data
/dev/vdb2       100G   33M  100G   1% /data1    #磁盘分区已经挂载至操作系统

至此云盤上使用MBR格式新增分區的演示使用完畢,這種方式適用於單塊磁盤多分區的場景。

由於雲上的磁盤可以根據按需擴容,且採用分區擴容的方式原有分區(第一個分區)將無法擴容,雲上推薦使用裸盤方式。

6. GPT磁盤分區

前文介紹了對磁盤創建MBR格式磁盤分區的使用方式,對於大於2T的磁盤,需要使用GPT格式的方式進行分區,下文將介紹磁盤使用GPT格式進行分區的使用方式。

Linux雲服務器存儲擴容實操 7

GPT磁盤分區

先在控制台購買雲盤並掛載到雲主機中,然後再操作系統中對磁盤進行GPT格式分區並創建文件系統。

以創建一個2T磁盤為例,演示Linux中使用parted對磁盤創建GPT格式分區使用過程。

(1) 登錄操作系統檢查磁盤的名稱和空間大小。

[[email protected]_0_89_centos ~]# fdisk -l

Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009ac89

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048   104857566    52427759+  83  Linux

Disk /dev/vdb: 2147.5 GB, 2147483648000 bytes, 4194304000 sectors   #磁盘为vdb,大小为2T
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

(2) 使用parted對磁盤打標籤和磁盤分區。

磁盘打上label并查看确认
[[email protected]_0_89_centos ~]# parted /dev/vdb mklabel gpt
[[email protected]_0_89_centos ~]# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 2147GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt        #分区表类型为gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  Flags

对磁盘进行分区
[[email protected]_0_89_centos ~]# parted /dev/vdb mkpart primary 2048s 100%
Information: You may need to update /etc/fstab.

查看分区创建情况
[[email protected]_0_89_centos ~]# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 2147GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  2147GB  2147GB               primary   #创建了一个磁盘分区,范围是2048s到2147GB

(3) 磁盤上創建文件系統,以製作xfs文件系統為例。

[[email protected]_0_89_centos ~]# mkfs.xfs /dev/vdb1
meta-data=/dev/vdb1              isize=512    agcount=4, agsize=131071872 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=524287488, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=255999, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

(4) 編寫fstab掛載到/data目錄中。

获取分区UUID
[[email protected]_0_89_centos ~]# blkid /dev/vdb1
/dev/vdb1: UUID="aa6fc333-e702-4daa-ad0b-10efde57a7f0" TYPE="xfs" PARTLABEL="primary" PARTUUID="7dace14b-3093-495b-9d0c-fc63f3b87fd7"

 编写fstab将磁盘挂载到/data目录中
 UUID="aa6fc333-e702-4daa-ad0b-10efde57a7f0"     /data             xfs     defaults        0 0

(5) 加載掛載配置信息並確認。

[[email protected]_0_89_centos ~]# mount -a
[[email protected]_0_89_centos ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        485M     0  485M   0% /dev
tmpfs           496M   24K  496M   1% /dev/shm
tmpfs           496M  448K  496M   1% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/vda1        50G  1.9G   46G   4% /
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb1       2.0T   33M  2.0T   1% /data        #磁盘当前已经挂载至/data目录

7. GPT磁盤分區擴容

Linux雲服務器存儲擴容實操 8

GPT磁盤擴容

上圖表示的是GPT格式磁盤分區的擴容步驟,需要在控制台中製作快照並完成擴容,然後在GPT分區中識別到擴容空間,文件文件系統識別到空間,如下以2T擴容至3T為例演示擴容過程:

(1) 確認磁盤空間和擴容方式為GPT。

[[email protected]_0_89_centos ~]# fdisk -l /dev/vdb

Disk /dev/vdb: 3221.2 GB, 3221225472000 bytes, 6291456000 sectors   #磁盘空间大小已扩容至3T
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System   #磁盘分区格式为GPT
/dev/vdb1               1  4194303999  2097151999+  ee  GPT

(2) 分區擴容需是離線操作,因此需要先卸載磁盤,卸載前請停止業務使用。

[[email protected]_0_89_centos ~]# umount  /data

(3) GPT重新分區,需要先刪除原有分區,然後再重建分區,刪除前使用unit s獲取到磁盤柱面的大小,切記,操作前應要做好快照備份,刪除分區重建分區有風險

[[email protected]_0_89_centos ~]# parted /dev/vdb
GNU Parted 3.1
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Error: The backup GPT table is not at the end of the disk, as it should be.  This might mean that another operating system believes the disk is smaller.  Fix, by moving the backup to the end
(and removing the old backup)?
Fix/Ignore/Cancel? Fix     #磁盘空间有扩容,因此提示有ERR,输入Fix修复
Warning: Not all of the space available to /dev/vdb appears to be used, you can fix the GPT to use all of the space (an extra 2097152000 blocks) or continue with the current setting? 
Fix/Ignore? Fix            #空间并未完全使用提示有Waring,输入Fix修复
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 3221GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  2147GB  2147GB  xfs          primary  #当前分区的情况

(parted) unit s           #使用单元的方式显示大小范围                                                
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 6291456000s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End          Size         File system  Name     Flags
 1      2048s  4194301951s  4194299904s  xfs          primary #Start起始范围为2048s,后面重建分区需要使用到

(parted) rm 1     #删除分区信息                                                          
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 6291456000s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  Flags #确认分区信息已被删除

(parted) mkpart primary 2048s 100%   #重新创建磁盘分区,起始范围需要和原分区保持一致
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 6291456000s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End          Size         File system  Name     Flags
 1      2048s  6291453951s  6291451904s  xfs          primary

(4) GPT分區擴容完畢後,需要在文件系統中擴容空間,切記,不要格式化文件系統,否則數據將會丟失。根據文件系統類型選擇擴容方式,以xfs為例:

将磁盘挂载到系统中
[[email protected]_0_89_centos ~]# mount -a
[[email protected]_0_89_centos ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        485M     0  485M    0% /dev
tmpfs           496M   24K  496M    1% /dev/shm
tmpfs           496M  488K  495M    1% /run
tmpfs           496M     0  496M    0% /sys/fs/cgroup
/dev/vda1        50G  1.9G   46G    4% /
tmpfs           100M     0  100M    0% /run/user/0
/dev/vdb1       2.0T   33M  2.0T    1% /data

扩容文件系统空间
[[email protected]_0_89_centos ~]# xfs_growfs /dev/vdb1
meta-data=/dev/vdb1              isize=512    agcount=4, agsize=131071872 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=524287488, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=255999, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 524287488 to 786431488         #已完成空间扩容


校验文件系统空间
[[email protected]_0_89_centos ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        485M     0  485M    0% /dev
tmpfs           496M   24K  496M    1% /dev/shm
tmpfs           496M  488K  495M    1% /run
tmpfs           496M     0  496M    0% /sys/fs/cgroup
/dev/vda1        50G  1.9G   46G    4% /
tmpfs           100M     0  100M    0% /run/user/0
/dev/vdb1       3.0T   33M  3.0T    1% /data         #已扩容至3T

备注:如果是ext3、ext4则使用resize2fs /dev/vdb1实现文件系统的扩容。

至此,基於GPT的磁盤格式磁盤分區擴容完畢,整個擴容過程中磁盤需要卸載操作,因此業務需要離線進行,擴容過程中需要刪除分區,操作較危險,操作前務必做好快照避免誤操作導致磁盤分區信息丟失。

8. GPT新增磁盤分區

對於需要多個磁盤分區的場景,可以在GPT磁盤上新建另外一個分區的方式實現,實現方式和新創建一個分區的過程相類似,如下為基於GPT格式磁盤新增分區的操作過程:

Linux雲服務器存儲擴容實操 9

新增磁盤分區

以磁盤擴容至3.5T為例,通過GPT格式新創建另外一個/dev/vdb2的分區,並掛載到系統中使用,如下演示操作過程:

(1) 登錄操作系統,確認磁盤空間擴容大小和磁盤格式為GPT。

[[email protected]_0_89_centos ~]# fdisk -l /dev/vdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/vdb: 3758.1 GB, 3758096384000 bytes, 7340032000 sectors #磁盘空间大小为3.5T
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt          #磁盘分区格式类型为gpt
Disk identifier: 15BF58A1-BBE0-466A-B2C5-A243AD6A3108


#         Start          End    Size  Type            Name
 1         2048   6291453951      3T  Microsoft basic primary

(2) 獲取磁盤上一個分區的End範圍,print得知結束範圍3221GB ,下一個步驟需要使用到。

[[email protected]_0_89_centos ~]# parted /dev/vdb print
Error: The backup GPT table is not at the end of the disk, as it should be.  This might mean that another operating system believes the disk is smaller.  Fix, by moving the backup to the end
(and removing the old backup)?
Fix/Ignore/Cancel? Fix
Warning: Not all of the space available to /dev/vdb appears to be used, you can fix the GPT to use all of the space (an extra 1048576000 blocks) or continue with the current setting? 
Fix/Ignore? Fix
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 3758GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

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

(3) 磁盤上新建一個分區/dev/vdb2,開始範圍為上一個步驟中獲取的磁盤大小。

[[email protected]_0_89_centos ~]# parted /dev/vdb mkpart primary 3221GB 100% #开始范围为步骤2获取的大小
Information: You may need to update /etc/fstab.

[[email protected]_0_89_centos ~]# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 3758GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags #包含有两个分区
 1      1049kB  3221GB  3221GB  xfs          primary
 2      3221GB  3758GB  537GB                primary

(4) 磁盤格式化創建文件系統,以製作xfs文件系統為例。

[[email protected]_0_89_centos ~]# mkfs.xfs /dev/vdb2
meta-data=/dev/vdb2              isize=512    agcount=4, agsize=32768000 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=131072000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=64000, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

(5) 掛載磁盤分區到系統中,以手動mount為例演示,實際使用時應使用fstab實現持久掛載。

[[email protected]_0_89_centos ~]# mount /dev/vdb2 /data1/

[[email protected]_0_89_centos ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        485M     0  485M   0% /dev
tmpfs           496M   24K  496M   1% /dev/shm
tmpfs           496M  484K  495M   1% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/vda1        50G  1.9G   46G   4% /
tmpfs           100M     0  100M   0% /run/user/0
/dev/vdb1       3.0T   33M  3.0T   1% /data
/dev/vdb2       500G   33M  500G   1% /data1    #已挂载完毕

三、總結

前文總結了在Linux環境中CBS三種使用方式:

  1. 裸設備創建文件系統;
  2. 使用MBR格式分區;
  3. 使用GPT格式分區。

以及這三種使用方式對應的擴容方式和操作步驟。相比於裸設創建文件系統,使用MBR和GPT格式擴容時需要卸載磁盤,

因此無法做到在線擴容。因此在雲環境下推薦使用直接在裸設備上創建文件系統的方式,其更加便捷,易於實現,且擴容過程中可以在線擴容。

雲加社區專欄https://cloud.tencent.com/developer/column/79243

參考文獻

[1] 配套視頻教程:

https://cloud.tencent.com/edu/learning/course-1863-22287

[2] MBR格式磁盤初始化:

https://cloud.tencent.com/document/product/362/6734

[3] GPT格式磁盤初始化:

https://cloud.tencent.com/document/product/362/6735

[4] Linux雲服務器存儲擴容:

https://cloud.tencent.com/document/product/362/6738

[5] Windows雲服務器存儲擴容:

https://cloud.tencent.com/document/product/362/6737

作者介紹

HappyLau,高級雲計算顧問,目前在騰訊雲從事公有云相關工作。曾就職於酷狗、EasyStack,擁有多年公有云+私有云雲計算架構設計、運維、交付相關經驗。參與過酷狗、南方電網、國泰君安等大型私有云平台建設,精通Linux、Kubernetes、OpenStack、Ceph等開源技術,具有豐富RHCA/OpenStack/Linux授課經驗。

本文轉載自公眾號雲加社區(ID:QcloudCommunity)。

原文鏈接

https://mp.weixin.qq.com/s/Vf0dBy1QAUHfXqBHK1E3LA