一、內容介紹
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 完美解決!