一、内容介绍
1 、问题描述
1) 、问题一
CentOS 6.x 在格式化大于 16TB 的 ext4 分割槽时,会提示如下错误:
mke2fs 1.41.12 (17-May-2010)
mkfs.ext4: Size of device /dev/sda1 too big to be expressed
in 32 bits using a blocksize of 4096.
2) 、问题二
CentOS 6.x 无法使用 fdisk 分割槽大于 2TB 的磁碟。
2 、原因分析
1) 、问题一:
原因在于 CentOS 自带的 e2fsprogs 版本为 1.41.12 较低,无法建立 16TB 以上的档案系统。
2) 、问题二:
原因在于 MBR 分割槽表只支援 2T 磁碟。
3 、站群解决方案
1) 、问题一:
站群解决方案为手工下载最新的 e2fsprogs 原始码包,进行编译安装,然后使用 mkfs.ext4 命令使用 64 位的方式进行磁碟格式化。
2) 、问题二:
使用 parted 命令将 MBR 分割槽表,改为 GPT 分割槽表。
二、站群解决方案的实现
下面通过在 VirtualBox 上进行实验来验证上面方案的可行性:
1 、在 VB 虚拟机器上新增硬碟
这里假设你的 VB 虚拟机器的 CentOS 已经通过 yum update 将全部站群软件升级到最新版本
在 VB 虚拟机器中新增 10 块 2TB 的硬碟(此时虚拟机器须处于关机状态),如下图:
每个虚拟硬碟都是 “动态分配储存”,总计容量为 20TB,这样就做成 raid5 最量就会超过 16TB 了。
2 、生成软 RAID 磁碟阵列
1) 、硬碟分割槽
启动虚拟机器登入系统后输入 lsblk 命令检视虚拟机器可识别的硬碟
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 47G 0 part /
sdb 8:16 0 2T 0 disk
sdc 8:32 0 2T 0 disk
sdd 8:48 0 2T 0 disk
sde 8:64 0 2T 0 disk
sdf 8:80 0 2T 0 disk
sdg 8:96 0 2T 0 disk
sdh 8:112 0 2T 0 disk
sdi 8:128 0 2T 0 disk
sdj 8:144 0 2T 0 disk
sdk 8:160 0 2T 0 disk
可以看到 10 块硬碟已经全部识别,但是还没有进行分割槽, 这里我们使用 fdisk 逐一进行分割槽,以便制作软 RAID.
这里需要注意的是:如果是在真实的站群服务器上,是不会看到这么多硬碟的。因为站群服务器通过 RAID 卡,将多块硬碟合并为一块硬碟。在本文后面会提到如何使用 parted 分割槽超过 2TB 的硬碟
以 sdb 这块硬碟为例,进行分割槽:
[root@localhost ~]# fdisk /dev/sdb
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-267349, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-267349, default 267349):
Using default value 267349
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sdb1 1 267349 2147480811 fd Linux raid autodetect
Command (m for help): w
上面的步骤基本上就是我们平时进行分割槽时需要进行操作的步骤。只有 t 命令平时不太用到.t 命令的意思就是 “修改分割槽型别 “,将标准的 linux 分割槽修改为 fd“Linux raid autodetect” 以便供软 RAID 使用。
下面逐一再将其他磁碟进行分割槽,全部分割槽完成后,使用 lsblk 检视分割槽情况:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 47G 0 part /
sdb 8:16 0 2T 0 disk
└─sdb1 8:17 0 2T 0 part
sdc 8:32 0 2T 0 disk
└─sdc1 8:33 0 2T 0 part
sdd 8:48 0 2T 0 disk
└─sdd1 8:49 0 2T 0 part
sde 8:64 0 2T 0 disk
└─sde1 8:65 0 2T 0 part
sdf 8:80 0 2T 0 disk
└─sdf1 8:81 0 2T 0 part
sdg 8:96 0 2T 0 disk
└─sdg1 8:97 0 2T 0 part
sdh 8:112 0 2T 0 disk
└─sdh1 8:113 0 2T 0 part
sdi 8:128 0 2T 0 disk
└─sdi1 8:129 0 2T 0 part
sdj 8:144 0 2T 0 disk
└─sdj1 8:145 0 2T 0 part
sdk 8:160 0 2T 0 disk
└─sdk1 8:161 0 2T 0 part
2) 、建立 RAID5
使用 mdadm 建立 RAID5 磁碟阵列:
[root@localhost ~]# mdadm -C /dev/md5
-a yes -l 5 -n 10 -x 0
/dev/sd[b,c,d,e,f,g,h,i,j,k]1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.
可以使用如下命令检视 RAID5 状态:
mdadm -D /dev/md5
3 、格式化磁碟阵列
如果现在使用 mkfs.ext4 格式化/dev/md5 将会出现如下错误:
[root@localhost ~]# mkfs.ext4 /dev/md5
mke2fs 1.41.12 (17-May-2010)
mkfs.ext4: Size of device /dev/md5 too big to be
expressed in 32 bits using a blocksize of 4096.
报错原因在文章开头已经介绍了,这里我们先下载最新的 e2fsprogs 原始码包,下载地址如下:
ftp://ftp.ntu.edu.tw/linux/kernel/people/tytso/e2fsprogs/
当前版本为 1.43.3, 下载后,进行编码安装:
tar -zxvf e2fsprogs-1.43.3.tar.gz
cd e2fsprogs-1.43.3
mkdir build
cd build/
../configure
make
make install
编译完成后使用如下命令格式化:
mke2fs -O 64bit,
has_journal,extents,
huge_file,flex_bg,uninit_bg,
dir_nlink,
extra_isize
-i 4194304
/dev/md5
或者:
mkfs.ext4 -O 64bit /dev/md5
挂载磁碟到/mnt
mount /dev/md5 /mnt
检视磁碟挂载情况:
[root@localhost build]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 47G 1.1G 43G 3% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 976M 56M 870M 6% /boot
/dev/md5 18T 24K 17T 1% /mnt
OK! 问题 1 顺利解决。证明这个方案还是可行的!
4 、使用 parted 分割槽 2TB 以上磁碟
上面第 1 和第 2 步骤,是我们为了进行实验是否能格式化 16TB 以上分割槽而搭建的实验环境。在生产环境下,一般不会用到软 RAID, 站群服务器是通过 RAID 卡将多块磁碟形成一个磁碟阵列。在启动系统后,有会一个没有分割槽的大磁碟。这种情况下就不能使用 fdisk 命令进行分割槽了。在这里,我们使用 parted 来进行分割槽。
这里我用一个 2TB 的磁碟来估演示,如果使用 parted 将整个磁碟阵列分为一个分割槽的情况(这也是生产环境中经常遇到的情况):
先使用 lsblk 检视系统中可使用的磁碟:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 47G 0 part /
sdb 8:16 0 2T 0 disk
这时系统里有一个 sdb 的磁碟,容量为 2TB 。
[root@localhost ~]# parted /dev/sdb
(parted) mklabel gpt # 将 MBR 磁碟格式化为 GPT
(parted) mkpart primary 0 -1 #将整块磁碟划分为一个分割槽
警告: The resulting partition is not properly
aligned for best performance.
忽略/Ignore/放弃/Cancel? I #忽略警告
(parted) p #列印当前分割槽
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name 标志
1 17.4kB 2199GB 2199GB primary
(parted) quit #退出
资讯: You may need to update /etc/fstab.
再使用 lsblk 检视磁碟分割槽情况:
1 1024M 0 rom
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 47G 0 part /
sdb 8:16 0 2T 0 disk
└─sdb1 8:17 0 2T 0 part
格式化并挂载磁碟:
mkfs.ext4 /dev/sdb1
mount /dev/sdb1 /mnt
检视磁碟挂载情况:
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 47G 851M 43G 2% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 976M 56M 870M 6% /boot
/dev/sdb1 2.0T 71M 1.9T 1% /mnt
OK!问题 2 完美解决!