分区和创建文件系统
分区方法
MBR
MBR格式的磁盘中,会维护磁盘第一个扇区——MBR扇区,在该扇区中第446字节之后的64字节是分区表,每个分区占用16字节,所以限制了一块磁盘最多只能有4个主分区(Primary,P),如果多于4个区,只能将主分区少于4个,通过建立扩展分区(Extend,E),然后在扩展分区建立逻辑分区(Logical,L)的方式来突破4个分区的限制,逻辑分区的数量不受限制。
在Linux中,MBR格式的磁盘主分区号从1-4,扩展分区号从2-4,逻辑分区号从5开始。
例如,一块盘想分成6个分区,可以:
1P+5L:sda1+sda5+sda6+sda7+sda8+sda9
2P+4L:sda1+sda2+sda5+sda6+sda7+sda8
3P+3L:sda1+sda2+sda3+sda5+sda6+sda7
在MBR格式分区表中,前446个字节是主引导记录,即boot loader。中间64字节记录着分区表信息,每个主分区信息占用16字节,因此最多只能有4个主分区。如果使用扩展分区,则扩展分区对应的16字节记录的是指向扩展分区中扩展分区表的指针。
在MBR磁盘上,分区和启动信息是保存在一起的,如果这部分数据被覆盖或破坏,只能重建MBR。
GPT
GPT格式突破了MBR的限制,它不再限制只能存储4个分区表条目,而是使用了类似MBR扩展分区表条目的格式,它允许有128个主分区,这也使得它可以对超过2TB的磁盘进行分区。
GPT在整个磁盘上保存多个这部分信息的副本,因此它更为健壮,并可以恢复被破坏的这部分信息。GPT还为这些信息保存了循环冗余校验码(CRC)以保证其完整和正确,如果数据被破坏,GPT会发现这些破坏,并从磁盘上的其他地方进行恢复。
下面是GPT格式的分区表信息。
EFI部分可以分为4个区域:EFI信息区(GPT头)、分区表、GPT分区区域和备份区域。
- EFI信息区(GPT头):起始于磁盘的LBA1,通常也只占用这个单一扇区。其作用是定义分区表的位置和大小。GPT头还包含头和分区表的校验和,这样就可以及时发现错误。
- 分区表:分区表区域包含分区表项。这个区域由GPT头定义,一般占用磁盘LBA2~LBA33扇区,每扇区可存储4个主分区的分区信息,所以共能分128个主分区。分区表中的每个分区项由起始地址、结束地址、类型值、名字、属性标志、GUID值组成。分区表建立后,128位的GUID对系统来说是唯一的。
- GPT分区:最大的区域,由分配给分区的扇区组成。这个区域的起始和结束地址由GPT头定义。
- 备份区:备份区域位于磁盘的尾部,包含GPT头和分区表的备份。它占用GPT结束扇区和EFI结束扇区之间的33个扇区。其中最后一个扇区用来备份1号扇区的EFI信息,其余的32个扇区用来备份LBA2~LBA33扇区的分区表。
在线添加磁盘
正常情况下,添加磁盘后需要重启系统才能被内核识别,在/dev/下才有对应的设备号,使用fdisk -l才会显示出来。但是有时候不方便重启。此时可以使用下面的方法。
第一种方式:重新检测 SATA/SCSI bus
[root@node1 ~]# ls /sys/class/scsi_host/ # 查看主机scsi总线号
host0 host1 host2
重新扫描scsi总线来添加新设备,之所以扫描scsi总线是因为虚拟机中添加硬盘插入的是scsi硬盘。
[root@node1 ~]# echo "- - -" > /sys/class/scsi_host/host0/scan
[root@node1 ~]# echo "- - -" > /sys/class/scsi_host/host1/scan
[root@node1 ~]# echo "- - -" > /sys/class/scsi_host/host2/scan
[root@node1 ~]# fdisk -l # 再查看就有了
如果scsi_host目录系很多hostN目录,则使用循环来完成。
[root@xuexi scsi_host]# ls /sys/class/scsi_host/
host0 host11 host14 host17 host2 host22 host25 host28 host30 host4 host7
host1 host12 host15 host18 host20 host23 host26 host29 host31 host5 host8
host10 host13 host16 host19 host21 host24 host27 host3 host32 host6 host9
[root@xuexi scsi_host]# for i in /sys/class/scsi_host/host*/scan;do echo "- - -" >$i;done
第二种方式: 添加/删除单个设备
删除单个设备
echo 1 > /sys/block/devName/device/delete # devName
echo 1 > /sys/block/sdc/device/delete # sdc
添加单个设备
# echo "scsi add-single-device <H> <B> <T> <L>" > /proc/scsi/scsi
Where,
<H> : Host
<B> : Bus (Channel)
<T> : Target (Id)
<L> : LUN numbers(LUN)
如何确定 <H>、<B>、<T>、<L>
这几个信息呢?
- 每个 HBA 卡对应一个 Host
- HBA 卡上的每个接口对应一个 Bus
- 每个接口上连接的硬盘背板对应一个 Target
- 每个硬盘背板上的每个接口对应一个 LUN
分区工具
使用fdisk分区工具
使用fdisk分区,它只能实现MBR格式的分区。
[root@xuexi ~]# fdisk /dev/sdb # sdb后没加数字
Command (m for help): m # 输入m查看可用命令帮助
Command action
a toggle a bootable flag
b edit bsd disklabel
d delete a partition # 删除分区,如果删除扩展分区同时会删除里面的逻辑分区
l list known partition types # 列出分区类型
m print this menu # 显示帮助信息
n add a new partition # 创建新分区
p print the partition table # 输出分区信息
q quit without saving changes # 不保存退出
t change a partition's system id # 修改分区类型
w write table to disk and exit # 保存分区信息并退出
# 新建第一个主分区:
Command (m for help): n # 添加分区
Command action
e extended # 添加扩展分区
p primary partition (1-4) # 添加主分区
p # 输入p来创建第一个主分区
Partition number (1-4): 1 # 输入分区号,从1开始
First cylinder (1-1305, default 1): # 输入柱面号,不输人默认是1
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +2G
# 给第一个主分区/dev/sdb1分2G,也可以使用柱面号来指定大小
Command (m for help): p # 第一个分区结束,p查看下已分区信息
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 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: 0x2d8d64eb
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 83 Linux
# 新建扩展分区:
Command (m for help): n # 再建一个分区
Command action
e extended
p primary partition (1-4)
e # 创建扩展分区
Partition number (1-4): 2 # 扩展分区号为2
First cylinder (263-1305, default 263):
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-1305, default 1305): # 剩余空间全部给扩展分区
Using default value 1305
Command (m for help): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 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: 0x2d8d64eb
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 83 Linux
/dev/sdb2 263 1305 8377897+ 5 Extended
# 新建逻辑分区:
Command (m for help): n # 新建逻辑分区
Command action
l logical (5 or over) # 这里不再是扩展分区标识e,只有l。
# 如果已有3个主分区,这里连l都没有
p primary partition (1-4)
l # 新建逻辑分区
First cylinder (263-1305, default 263): # 这里也不能选逻辑分区号了
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-1305, default 1305): +3G
Command (m for help): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 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: 0x2d8d64eb
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 83 Linux
/dev/sdb2 263 1305 8377897+ 5 Extended
/dev/sdb5 263 655 3156741 83 Linux
分区结束,保存。如果不保存,则按q。
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
分区的过程,实质上是划分柱面以及修改分区表。
上面的fdisk操作全部是在内存中执行的,必须保存生效。保存后,内核还未识别该分区,可以查看/proc/partition目录下存在的文件,这些文件是能被内核识别的分区。运行partprobe或partx命令重新读取分区表让内核识别新的分区,内核识别后才可以格式化。而且分区结束时按w保存分区表有时候会失败,提示重启,这时候运行partprobe命令可以代替重启就生效。
[root@xuexi ~]# partprobe # 执行partprobe,下面一堆信息,不理它
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (Device or resource busy). As a result, it may not reflect all of your changes until after reboot.
Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only.
Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only.
Error: Invalid partition table - recursive partition on /dev/sr0.
也可指定在/dev/sdb上重加载分区表,省的无法读取正忙的/dev/sda磁盘,给出上面一堆信息。
[root@xuexi ~]# partprobe /dev/sdb
分区之后再使用fdisk -l查看新的分区状态。
将上面分区所需要使用的命令总结如下,以后便于使用脚本分区。
fdisk /dev/sdb # 选择要分区的设备
n # 创建分区
p/e/l # 选择分区类型
# 如果主分区数有3个,且已经划分了扩展分区,再继续分区时将只能划分逻辑分区,这种情况下l子命令会直接跳过进入下一个阶段。
N # 指定分区号
\n # 指定起始柱面号,使用默认值就直接回车即换行
+N # 指定分区大小为N
w # 分区结束保存退出
partprobe /dev/sdb &>/dev/null # 重读分区表
fdisk -l | grep "^/dev/sdb" &>/dev/null # 检查分区状
使用gdisk分区工具
gdisk用来划分gpt分区,需要单独安装这个工具包。
yum -y install gdisk
分区的时候直接带上设备即可。以下是对新硬盘划分gpt分区的过程。
[root@xuexi ~]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
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) # 创建一个新的空的guid分区表
p print the partition table # 输出分区表信息
q quit without saving changes # 退出gdisk工具
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
# 添加一个新分区。
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +10G
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): p
Disk /dev/sdb: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): F8AE925F-515F-4807-92ED-4109D0827191
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 20971453 sectors (10.0 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 20973567 10.0 GiB 8300 Linux filesystem
Command (? for help): i
Using 1
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: B2452103-4F32-4B60-AEF7-4BA42B7BF089
First sector: 2048 (at 1024.0 KiB)
Last sector: 20973567 (at 10.0 GiB)
Partition size: 20971520 sectors (10.0 GiB)
Attribute flags: 0000000000000000
Partition name: '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/sdb.
The operation has completed successfully.
# 执行partprobe重新读取分区表信息。
[root@server2 ~]# partprobe /dev/sdb
gdisk还有几个expert only的命令,其实没什么专家不专家可用的,只需要知道命令何时能用,它们的作用是什么?
在gdisk交互过程命令行下,按下x表示进入扩展功能模式,该模式下的功能大部分都和gpt分区表相关,在不是非常了解gpt分区表结构的时候不建议做修改动作,但是查看信息类是没问题的。以下是扩展功能模式下的命令。
Command (? for help): x
Expert command (? for help): ?
a set attributes
c change partition GUID
d display the sector alignment value
e relocate backup data structures to the end of the disk
g change disk GUID
h recompute CHS values in protective/hybrid MBR
i show detailed information on a partition
l set the sector alignment value
m return to main menu
n create a new protective MBR
o print protective MBR data
p print the partition table
q quit without saving changes
r recovery and transformation options (experts only)
s resize partition table # 修改分区表大小,注意不是分区大小
t transpose two partition table entries
u Replicate partition table on new device # 将分区表导出
v verify disk
w write table to disk and exit
z zap (destroy) GPT data structures and exit # 损毁gpt上的数据
? print this menu
使用parted分区工具
parted支持mbr格式和gpt格式的磁盘分区。它的强大在于可以一步到位而不需要不断的交互式输入(也可以交互式)。
parted分区工具是实时的,所以每一步操作都是直接写入磁盘而不是写进内存,它不像fdisk/gdisk还需要w命令将内存中的结果保存到磁盘中。
[root@xuexi ~]# parted /dev/sdc
GNU Parted 2.1
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help
align-check TYPE N check partition N for TYPE(min|opt) alignment
check NUMBER (centos 7上已删除该功能) do a simple check on the file system
cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER (centos 7上已删除该功能) copy file system to another partition
help [COMMAND] print general help, or help on COMMAND
mklabel,mktable LABEL-TYPE create a new disklabel (partition table)
mkfs NUMBER FS-TYPE (centos 7上已删除该功能) make a FS-TYPE file system on partition NUMBER
mkpart PART-TYPE [FS-TYPE] START END make a partition
mkpartfs PART-TYPE FS-TYPE START END (centos 7上已删除该功能) make a partition with a file system
move NUMBER START END (centos 7上已删除该功能) move partition NUMBER
name NUMBER NAME name partition NUMBER as NAME
print [devices|free|list,all|NUMBER] display the partition table,available devices,free space, all found partitions,or a particular partition
quit exit program
rescue START END rescue a lost partition near START and END
resize NUMBER START END (修改分区大小(centos 7上已删除该功能)) resize partition NUMBER and its file system
rm NUMBER (删除分区) delete partition NUMBER
select DEVICE (重选磁盘进入parted状态) choose the device to edit
set NUMBER FLAG STATE (设置分区状态,如将其off或on) change the FLAG on partition NUMBER
toggle [NUMBER [FLAG]] (修改文件系统类型,如swap、lvm) toggle the state of FLAG on partition NUMBER
unit UNIT (修改默认单位,kB/MB/GB等) set the default unit to UNIT
version display the version number and copyright information of GNU Parted
常用的命令是mklabel/rm/print/mkpart/help/quit,至于parted中一些看上去很好的功能如mkfs/mkpartfs/resize等可能会损毁当前数据而不够安全,所以只要使用它的5个常用命令即可。
parted分区的前提是磁盘已经有分区表(partition table)或磁盘标签(disk label),否则将显示unrecognised disk label,这是和fdisk/gdisk不同的地方,所以需要先使用mklabel创建标签或分区表,最常见的标签(分区表)为msdos和gpt,其中msdos分区就是MBR格式的分区表,也就是会有主分区、扩展分区和逻辑分区的概念和限制。
下面使用parted对/dev/sdc创建msdos的新分区。
[root@xuexi ~]# parted /dev/sdc
GNU Parted 2.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel # 创建磁盘分区标签(分区表类型)
New disk label type? msdos # 选择msdos即MBR类型
# 上面的两步也可以直接一步进行:(parted) mklabel msdos
(parted) mkpart # 开始进行分区
Partition type? primary/extended? p # 创建主分区
File system type? [ext2]? ext4 # 创建ext4文件系统
# (这里虽指明了文件系统,但没有意义,仍需手动格式化并选择文件系统类型)
Start? 1 # 分区开始位置,默认是M为单位,表示从1M开始,也可直接指定1G这种方式
End? 1024 # 分区结束位置,1024-1=1023M
(parted) p # print,查看分区信息
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 1024MB 1023MB primary
# 可以一步完成一个命令中的多个动作
(parted) mkpart p ext4 1026M 4096M # 可一步完成,也可一步完成到任何位置,然后继续交互下一步
# 可能会提示分区未对齐"Warning: The resulting partition is not properly aligned for best performance.",忽略它
(parted) mkpart e 4098 -1 # 创建扩展分区,注意创建扩展分区时不指定文件系统类型;-1表示剩余的全部分配给该分区
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 1024MB 1023MB primary
2 1026MB 4096MB 3070MB primary
3 4098MB 21.5GB 17.4GB extended lba
(parted) mkpart l ext4 4099 8194 # 创建逻辑分区,指定ext4
(parted) mkpart l ext4 8195 -1 # 继续创建逻辑分区
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 1024MB 1023MB primary
2 1026MB 4096MB 3070MB primary
3 4098MB 21.5GB 17.4GB extended lba
5 4099MB 8194MB 4095MB logical
6 8195MB 21.5GB 13.3GB logical
(parted) rm 5 # 删除5号分区
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 1024MB 1023MB primary
2 1026MB 4096MB 3070MB primary
3 4098MB 21.5GB 17.4GB extended lba
5 8195MB 21.5GB 13.3GB logical
(parted) quit # 退出parted工具
Information: You may need to update /etc/fstab. # 提示要更新/etc/fstab中的配置,说明该工具可在线分区
mkfs和mkpartfs等命令不完善,下面的警告信息已经给出了提示。
(parted) mkfs 1
WARNING: you are attempting to use parted to operate on (mkfs) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
Warning: The existing file system will be destroyed and all data on the partition will be lost. Do you want to
continue?
parted: invalid token: 1
Yes/No? n
使用parted工具进行的分区无需运行partprobe重新读取分区表,内核会即时识别已经分区的分区信息。如下所示。
[root@xuexi tmp]# cat /proc/partitions | grep "sdc"
8 32 20971520 sdc
8 33 999424 sdc1
8 34 2998272 sdc2
8 35 1 sdc3
8 37 12967936 sdc5
一定要注意,虽然parted工具中指定了文件系统,但是并没有意义,它仍需要手动进行格式化并指定分区类型。实际上,在parted中文件系统是可以不用指定的,即使是非交互模式下也可以省略。
fdisk/gdisk以及parted非交互式操作分区
使用非交互分区时,最重要的是待分的区的起始点不能是已使用的。可以使用lsblk或fdisk -l或parted DEV print来判断将要从哪个地方开始分区。其实parted在非交互分区是最佳的工具,不仅是因为其书写方式简洁,而且待分区的起点如不合理它会自动提示是否要自动调整。
parted实现非交互
parted命令支持非交互一个命令中的所有动作。如下所示:
parted /dev/sdb mklabel msdos # 设置硬盘flag
parted /dev/sdb mkpart primary ext4 1 1000 # MBR格式分区,分别是partition type/fstype/start/end
parted /dev/sdb mkpart 1 ext4 1M 10240M # gpt格式分区,分别是name/fstype/start/end
parted /dev/sdb mkpart 1 10G 15G # 省略fstype的交互式分区
parted /dev/sdb rm 1 # 删除分区
parted /dev/sdb p # 输出信
如果不确定分区的起点大小,可以加上-s选项使用script模式,该模式下parted将回答一切默认值,如yes、no。
$ parted -s /dev/sdb mkpart 3 14G 16G
Warning: You requested a partition from 14.0GB to 16.0GB.
The closest location we can manage is 15.0GB to 16.0GB.
Is this still acceptable to you?
Information: You may need to update /etc/fstab.
fdisk实现非交互
fdisk实现非交互的原理是从标准输入中读取,每读取一行传递一次操作。
所以可以有两种方式:使用echo和管道传递;将操作写入到文件中,从文件中读取。
例如:下面的命令创建了两个分区。使用默认值时传递空行即可。
echo -e "n\np\n1\n\n+5G\nn\np\n2\n\n+1G\nw\n" | fdisk /dev/sdb
如果要传递的操作很多,则可以将它们写入到一个文件中,从文件中读取。
echo -e "n\np\n1\n\n+5G\nn\np\n2\n\n+1G\nw\n" >/tmp/a.txt
fdisk /dev/sdb </tmp/a.txt
gdisk实现非交互
原理同fdisk。例如:
echo -e "n\n1\n\n+3G\n\nw\nY\n" | gdisk /dev/sdb
上面传递的各参数意义为:新建分区,分区number为1,使用默认开始扇区位置,分区大小+3G,使用默认分区类型,保存,确认。
格式化分区
分区结束后就需要格式化创建文件系统了,格式化分区的过程就是创建文件系统的过程。可以使用mkfs(make filesystem)工具进行格式化,也可以使用该工具家族的其他工具如mkfs.ext4/mkfs.xfs等专门针对文件系统的工具。
要查看支持的文件系统类型,只需简单的输入mkfs然后按两下tab键,就可以列出各文件系统对应的格式化命令,这些就是支持的文件系统类型。
mkfs工具
mkfs [-t fstype] 分区
该工具非常简单,它只需指定一个可选的-t选项指定要创建的文件系统类型,如果省略则默认创建ext2文件系统。该工具指定的”-t”选项其实是在调用对应文件系统专属的格式化工具。
mke2fs工具
mkfs.ext2/mkfs.ext3/mkfs.ext4或mkfs -t extX其实都是在调用mke2fs工具。
该工具创建文件系统时,会从/etc/mke2fs.conf配置中读取默认的配置项。
mke2fs [ -c ] [ -b block-size ] [ -f fragment-size ] [ -g blocks-per-group ] [ -G number-of-groups ] [ -i bytes-per-inode ] [ -I inode-size ] [ -j ] [ -N number-of-inodes ] [ -m reserved-blocks-percentage ] [ -q ] [ -r fs-revision-level ] [ -v ] [ -L volume-label ] [ -S ] [ -t fs-type ] device [ blocks-count ]
选项说明:
-t fs-type
指定要创建的文件系统类型(ext2,ext3 ext4),若不指定,则从/etc/mke2fs.conf中获取默认的文件系统类型。
-b block-size
指定每个block的大小,有效值有1024、2048和4096,单位是字节。
-I inode-size
指定inode大小,单位为字节。必须为2的幂次方,且大于等于128字节。值越大,说明inode的集合体inode table占用越多的空间,这不仅会挤占文件系统中的可用空间,还会降低性能,因为要扫描inode table需要消耗更多时间,但是在linux kernel 2.6.10之后,由于使用inode存储了很多扩展的额外属性,所以128字节已经不够用了,因此ext4默认的inode size已经变为256,尽inode大小增大了,但因为使用inode存储扩展属性带来的性能提升远高于inode size变大导致的负面影响,所以仍建议使用256字节的inode。
-i bytes-per-inode
指定每多少个字节就为其分配一个inode号。值越大,说明一个文件系统中分配的inode号越少,更适用于存储大量大文件,值越小,inode号越多,更适用于存储大量小文件。该值不能小于一个block的大小,因为这样会造成inode多余。注意,创建文件系统后该值就不能再改变了。
-c 创建文件系统前先检查设备是否有bad blocks。
-f fragment-size
指定fragments的大小,单位字节。
-g blocks-per-group
指定每个块组中的block数量。不建议修改此项。
-G number-of-groups
该选项用于ext4文件系统(严格地说是启用了flex_bg特性),指定虚拟块组(即一个extent)中包含的块组个数,必须为2的幂次方。对于ext4文件系统来说,使用extent的功能能极大提升其性能。
-j 创建带有日志功能的文件系统,即ext3。如果要指定关于日志方面的设置,在-j的基础上再使用-J指定,不过一般默认即可,具体可指定的选项看man文档。
-L new-volume-label
指定卷标名称,名称不得超出16字节。
-m reserved-blocks-percentage
指定文件系统保留block数量的比例,保留一部分block,可以降低物理碎片。默认比例为5%。
-N number-of-inodes
强制指定该文件系统应该分配多少个inode号,它会覆盖通过计算得出inode数量的结果(根据block大小、数量和每多少字节分配一个inode得出Inode数量),但是不建议这么做。
-q 安静模式,可用于脚本中
-S 重建superblock和group descriptions。在所有的superblock和备份的superblock都损坏时有用。它会重新初始化superblock和group descriptions,但不会改变inode table、bmap和imap(若真的改变,该分区数据就全丢了,还不如重新格式化)。在重建superblock后,应该执行e2fsck来保证文件系统的一致性。但要注意,应该完全正确地指定block的大小,其改选项并不能完全保证数据不丢失。
-v 输出详细执行过程
所以,有可能用到的选项一般是-t指定文件系统类型,-b指定block大小,-I指定inode大小,-i指定分配inode的比例。
例如:
$ mke2fs -t ext4 -I 256 /dev/sdb2 -b 4096
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 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
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
tune2fs修改ext文件系统属性
该工具其实没什么太大作用,文件系统创建好后很多属性是固定不能修改的,能修改的属性很有限,且都是无关紧要的。
但有些时候还是可以用到它做些事情,例如刚创建完ext文件系统后会提示修改自检时间。
tune2fs [-c max-mount-counts] [-i interval-between-checks] [-j] device
-j:将ext2文件系统升级为ext3;
-c:修改文件系统最多挂载多少次后进行自检,设置为0或-1将永不自检;
-i:修改过了多少时间进行自检。时间单位可以指定为天(默认)/月/星期[d|m|w],设置为0将永不自检。
快速创建文件系统
有时候仅仅为了实验而插入新磁盘、扫描SCSI设备、再分区、格式化,整个过程挺麻烦的。好在,有更为便捷的方式:
dd if=/dev/zero of=sdx bs=1M count=32
mke2fs sdx
现在sdx文件就是一个ext家族的文件系统了,相当于已经格式化的/dev/sdxN,它可以直接拿来挂载使用。
mount sdx /mnt/sdx
还可以使用mkisofs命令工具快速将目录创建成一个可挂载的镜像文件:
mkdir -p foo/bar/baz
mkisofs -o test.iso foo # 将foo打包成iso镜像
现在,test.iso镜像文件也可以直接挂载使用:
mount test.iso /mnt/test
查看文件系统状态信息
lsblk
blkid
parted
file -s /dev/vda1
/dev/vda1: Linux rev 1.0 ext4 filesystem data, UUID=659e6f89-71fa-463d-842e-ccdf2c06e0fe (needs journal recovery) (extents) (64bit) (large files) (huge files)
dumpe2fs # 用于查看ext类文件系统的superblock及块组信息。使用-h选项将只显示superblock信息。
dumpe2fs -h /dev/sda2
mount挂载各种文件系统
mount基本用法
mount [-t 欲挂载文件系统类型 ] [-o 特殊选项] 设备名 挂载目录
-a 将/etc/fstab文件里指定的挂载选项重新挂载一遍。
-t 支持ext2/ext3/ext4/vfat/fat/iso9660(光盘默认格式)。不用-t时默认会调用blkid来获取文件系统类型。
-n 不把挂载记录写在/etc/mtab文件中,一般挂载会在/proc/mounts中记录下挂载信息,然后同步到/etc/mtab,指定-n表示不同步该挂载信息。
-o 指定挂载特殊选项。下面是两个比较常用的:
loop 挂载镜像文件,如iso文件
ro 只读挂载
rw 读写挂载
auto 相当于mount -a
dev 如果挂载的文件系统中有设备访问入口则启用它,使其可以作为设备访问入口
default rw,suid,dev,exec,auto,nouser,async,and relatime
async 异步挂载,只写到内存
sync 同步挂载,通过挂载位置写入对方硬盘
atime 修改访问时间,每次访问都修改atime会导致性能降低,所以默认是noatime
noatime 不修改访问时间,高并发时使用这个选项可以减少磁盘IO
nodiratime 不修改文件夹访问时间,高并发时使用这个选项可以减少磁盘IO
exec/noexec 挂载后的文件系统里的可执行程序是否可执行,默认是可以执行exec,优先级高于权限的限定
remount 重新挂载,此时可以不用指定挂载点。
suid/nosuid 对挂载的文件系统启用或禁用suid,对于外来设备最好禁用suid
_netdev 需要网络挂载时默认将停留在挂载界面直到加载网络了。使用_netdev可以忽略网络正常挂载。如NFS开机挂载。
user 允许普通用户进行挂载该目录,但只允许挂载者进行卸载该目录
users 允许所有用户挂载和卸载该目录
nouser 禁止普通用户挂载和卸载该目录,这是默认的,默认情况下一个目录不指定user/users时,将只有root能挂载
一般user/users/nouser都用在/etc/fstab中,直接在命令行下使用这几个选项意义不是很大。
挂载实例
(1).挂载CentOS的安装镜像到/mnt。
mount /dev/cdrom /mnt
其实/dev/cdrom是/dev/sr0的一个软链接,/dev/sr0是光驱设备,所以也可以用/dev/sr0进行挂载。
mount /dev/sr0 /mnt
(2).重新挂载。
[root@xuexi ~]# mount -t ext4 -o remount /dev/sdb1 /data
(3).重新挂载文件系统为可读写。
mount -t ext4 -o rw remount /dev/sdb1 /data
(4).挂载windows的共享目录。
win上共享文件的文件系统是cifs类型,要在Linux上挂载,必须得有mount.cifs命令,如果没有则安装cifs-utils包。
假设win上共享目录的unc路径为\192.168.100.8\test,共享给的用户名和密码分别为long3:123,要挂在linux上的/mydata目录上。
$ mount.cifs -o username="long3",password="123" //192.168.100.8/test /mydata
注意,如果是比较新版本的win10(2017年之后更新的版本)或较新版本的win server,直接mount.cifs会报错:
[root@xuexi ~]# mount.cifs -o username="long3",password="123" //192.168.100.8/test /mnt
mount error(112): Host is down
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
这是因为2017年微软的一个补丁禁用了SMBv1协议,通过smbclient的报告可知:
$ yum -y install samba-client
$ smbclient -L //192.168.100.8
Enter root's password:
protocol negotiation failed: NT_STATUS_CONNECTION_RESET
因此,在mount的时候指定cifs(SMB)的版本号为2.0即可。
$ mount.cifs -o username="long3",password="123",vers=2.0 //192.168.100.8/test /mnt
但是需要注意,在CentOS 4,5,6下的模块cifs.ko版本(较低)只能使用SMBv1协议,因此即使指定版本号也一样无效。只有在CentOS 7上才能使用SMBv2或SMBv3。
(5).基于ssh挂载远程目录。
如何基于ssh像NFS一样挂载远程主机上的目录?可以通过sshfs工具,该工具在fuse-sshfs包中,这个包在epel源中提供。
yum -y install fuse-sshfs
例如,挂载192.168.100.8上的根目录到本地的/mnt上。
sshfs 192.168.100.8:/ /mnt
卸载时直接umount即可。
关于sshfs,详细内容见:https://www.junmajinlong.com/linux/sshfs
(6).挂载目录到另一个目录下。挂载目录时,挂载目录和挂载点的inode是相同的,它们两者的内容也是完全相同的。
mount --bind /mydata /mnt
``
#### (7).查看某个目录是否是挂载点,使用mountpoint命令。
```bash
[root@xuexi ~]# mountpoint /mydata/
/mydata/ is a mountpoint
[root@xuexi ~]# echo $?
0
[root@xuexi ~]# mountpoint /mnt
/mnt is not a mountpoint
[root@xuexi ~]# echo $?
1
挂载的参数信息存放在/proc/mounts(是/proc/self/mounts的软链接)中,在/proc/self/mountstats和/proc/mountinfo里则记录了更详细的挂载信息。
[root@xuexi ~]# cat /proc/mounts
rootfs / rootfs rw 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime,size=491000k,nr_inodes=122750,mode=755 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
/dev/sda2 / ext4 rw,relatime,barrier=1,data=ordered 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
/dev/sda1 /boot ext4 rw,relatime,barrier=1,data=ordered 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
文件系统是需要驱动支持的,没有驱动的文件系统也无法挂载,Linux中支持的文件系统驱动在/lib/modules/$(uname -r)/kernel/fs下。
[root@xuexi ~]# ls /lib/modules/$(uname -r)/kernel/fs/
autofs4 cachefiles configfs dlm exportfs
ext3 fat fuse jbd jffs2 mbcache.ko
nfs_common nls ubifs xfs btrfs cifs cramfs
ecryptfs ext2 ext4 fscache gfs2 jbdlockd nfs nfsd squashfs udf
mount直接挂载iso镜像文件
有时候需要挂载CentOS的镜像文件,在虚拟机中经常是将镜像放入虚拟机的CD/DVD虚拟光驱中,然后在Linux上对/dev/cdrom进行挂载。其实/dev/cdrom是/dev/sr0的一个软链接,/dev/sr0是Linux中的光驱,所以上面的过程相当于是将镜像文件通过虚拟软件的虚拟光驱和linux的光驱连接起来,这样只需要挂载Linux中的光驱就可以了。但是,在非虚拟环境中没有虚拟光驱,而且在Linux中的一个镜像文件难道一定要拷贝到主机上通过虚拟光驱进行连接吗?
mount是一个极其强大的挂载工具,它支持挂载很多种文件类型,其中就支持挂载镜像文件,其实它连挂载目录都支持。
[root@xuexi ~]# mount -o loop CentOS-6.6-x86_64-bin-DVD2.iso /mnt
[root@xuexi ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 1.2G 0 loop /mnt
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 250M 0 part /boot
├─sda2 8:2 0 17.8G 0 part /
└─sda3 8:3 0 2G 0 part [SWAP]
sr0 11:0 1 1024M 0 rom
umount
umount 设备名或挂载目录
umount -lf 强制卸载
卸载时,既可以使用设备名也可以使用挂载点卸载。有时候挂载网络系统(如NFS)时,设备名很长,这时候可以使用挂载点来卸载就方便多了。
fuser -v DIR
如果用户正在访问某个目录或文件,使得卸载一直显示Busy,使用fuser -v DIR可以知道谁正在访问该目录或文件。
[root@xuexi ~]# fuser -v /root
USER PID ACCESS COMMAND
/root: root 37453 ..c.. bash
使用-k选项kill掉正在使用目录或文件的进程,使用-km选项kill掉文件系统上的所有进程,然后再umount。
[root@xuexi ~]# fuser -km /mnt/cdrom;umount /mnt/cdrom
命令参数
-a:显示命令行中指定的所有文件;
-k:杀死访问指定文件的所有进程;
-i:杀死进程前需要用户进行确认;
-l:列出所有已知信号名;
-m:指定一个被加载的文件系统或一个被加载的块设备;
-n:选择不同的名称空间;
-u:在每个进程后显示所属的用户名。
-v:显示详细信息
开机自动挂载/etc/fstab
其中最后两列,它们分别表示备份文件系统和开机自检,一般都可以设置为0。
由于能用的备份工具众多,没人会在这里设置备份,所以备份列设置为0。
最后一列是开机自检设置列,开机自检调用的是fsck程序,所有有些ext类文件系统作为/时,可能会设置为1,但是fsck是不支持xfs文件系统的,所以对于xfs文件系统而言,该项必须设置为0。
其实无需考虑那么多,直接将这两列设置为0就可以了。
按需自动挂载(autofs)
使用autofs实现需要挂载时就挂载,不需要挂载时5分钟后自动卸载。在实际生产环境中基本不会使用按需挂载,在Linux桌面系统中用的较多。
修复错误的/etc/fstab
万一/etc/fstab配置错误,导致开机无法加载。这时提示输入root密码进入单用户模式,只不过当用户模式下根文件系统是只读的,哪怕是root也无法直接修改/etc/fstab,所以应该重新挂载/文件系统。
[root@xuexi ~]# mount -n -o remount,rw /
开机无法自动挂载 NFS
10.0.0.110:/export/3T /mnt/3T nfs nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10 0 0
- nofail: 启动流程既不会等待此挂载点,也不会在乎此挂载点是否挂载成功。
- noauto: 表示开机时不要自动挂载
- x-systemd.requires: 设置一个到其他单元(例如 device 或 mount 单元)的 Requires= 与 After= 依赖
- x-systemd.device-timeout: 结合 nofail 时,如果挂载的设备不存在,将会卡顿 n * s,设置为0表示永不超时。
创建并使用swap分区
(1).可以新分一个区,在分区时指定其分区的ID号为SWAP类型。
mbr和gpt格式的磁盘上这个ID可能不太一样,不过一般gpt中的格式是在mbr格式的ID后加上两位数的数值,如mbr中swap的类型ID为82,在gpt中则是8200,在mbr中linux filesystem类型的ID为83,在gpt中则为8300,在mbr中lvm的ID为8e,在gpt中为8e00。
(2).格式化为swap分区:mkswap
[root@xuexi ~]# mkswap /dev/sdb5
Setting up swapspace version 1, size = 1951096 KiB
no label, UUID=02e5af44-2a16-479d-b689-4e100af6adf5
(3).加入swap分区空间(swapon):
[root@xuexi ~]# swapon /dev/sdb5
[root@xuexi ~]# free -m
total used free shared buffers cached
Mem: 1861 343 1517 0 16 196
-/+ buffers/cache: 131 1730
Swap: 3953 0 3953
(4).取消swap分区空间(swapoff):
[root@xuexi ~]# swapoff /dev/sdb5
[root@xuexi ~]# free -m
total used free shared buffers cached
Mem: 1861 343 1518 0 16 196
-/+ buffers/cache: 130 1731
Swap: 0 0 0
(5).开机自动加载swap分区:
修改/etc/fstab,加上一行。
/dev/sda3 swap swap defaults 0 0
有时候没必要为了使用swap分区而创建一个分区,可以直接通过dd命令创建一个空文件,再将其格式化制作成swap分区:
dd if=/dev/zero of=/swap bs=1M count=1024
mkswap /swap # 现在/swap文件就是swap格式的
swapon /swap
echo "/swap swap swap defaults 0 0" >> /etc/fstab
这种方式可以应用在低配的个人云主机上。低配的云主机内存较小,可能连启动一个博客系统都启动不了,而且云主机无法自由添加磁盘或重新分区,使用dd命令正好可以解此问题
使用 LVM
LVM(Logical Volume Manager)可以让分区变得弹性,可以随时随地的扩大和缩小分区大小。
lvm需要使用的软件包为lvm2,一般在CentOS发行版中都已经预安装了。
LVM的写入机制
LV是从VG中划分出来的,LV中的PE很可能来自于多个PV。在向LV存储数据时,有多种存储机制,其中两种是:
- 线性模式(linear):先写完来自于同一个PV的PE,再写来自于下一个PV的PE。
- 条带模式(striped):一份数据拆分成多份,分别写入该LV对应的每个PV中,所以读写性能较好,类似于RAID 0。
尽管striped读写性能较好也不建议使用该模式,因为lvm的着重点在于弹性容量扩展而非性能,要实现性能应该使用RAID来实现,而且使用striped模式时要进行容量的扩展和收缩将比较麻烦。默认的是使用线性模式。
LVM 实现图解
LVM 的实现
# 安装
yum install lvm2
# 分区 (小于 2TB)
fdisk /dev/sda
# 分区 (大于 2TB)
parted /dev/sda(编辑/dev/sda磁盘)
# 创建 pv,创建完成后 pvdisplay 查看
pvcreate /dev/sda1
# 创建 vg,创建完成后 vgdisplay 查看
vgcreate testvg(卷组名称) /dev/sda1
# 创建 lv,创建完成后 lvdisplay 查看
lvcreate -n lv_1 -l 100%VG testvg(将所有的testvg的内存都给这个lv_1逻辑卷)
# 格式化
mkfs.ext4 /dev/testvg/lv_1
# 挂载
mount /dev/testvg/lv_1 /home
# 查看
df -h
扩展与缩容
# 扩展物理硬盘到同一个卷组里面,每个组管理不同物理磁盘:
vgextend ubuntu-vg(你想添加的卷组名) /dev/sda1
# 从卷组里面向逻辑卷里面分配空间,
lvextend -l +100%FREE /dev/ubuntu-vg/root(你想向那个逻辑卷里面分配空间)
# 确定
resize2fs /dev/ubuntu-vg/root(重启逻辑卷从而生效)
Linux上软raid管理
首先需要为虚拟机中添加4块硬盘设备(若以分区加入,则分区标识符为raid)来制作一个RAID10。
mdadm工具用于在Linux系统中创建和管理软RAID,命令的格式为:
mdadm [模式] <RAID设备名称> [选项] [成员设备名称]
【创建模式】
-C:创建(create a new array)
-l:指定raid级别(Set RAID level,0,1,5,10)
-c:指定chunk大小(Specify chunk size of kibibytes,default 512KB)
-a:检测设备名称(--auto=yes),yes表示自动创建设备文件/dev/mdN
-n:指定设备数量(--raid-devices:Specify the number of active devices in the array)
-x:指定备用设备数量(--spare-devices:Specify the number of spare (eXtra) devices in the initial array)
-v:显示过程
-f:强制行为
-r :移除设备(remove listed devices)
-S :停止阵列(--stop:deactivate array, releasing all resources)
-A :装配阵列,将停止状态的阵列重新启动起来
【监控模式】
-Q:查看摘要信息(query)
-D:查看详细信息(Print details of one or more md devices)
mdadm -D --scan >/etc/mdadm.conf,以后可以直接mdadm -A进行装配这些阵列
【管理模式】
mdadm --manage /dev/md[0-9] [--add 设备名] [--remove 设备名] [--fail 设备名]
--manage :mdadm使用manage模式,此模式下可以做--add/--remove/--fail/--replace动作
-add :将后面列出的设备加入到这个md
--remove :将后面列出的设备从md中移除,相当于硬件raid的拔出动作
--fail :将后面列出的设备设定为错误状态,即人为损坏,损坏后该设备放在raid中已经是无意义状态的
实现RAID10
第1步:准备磁盘或分区,以分区为例
/dev/sd{b,c,d,e}1这四个分区都是200M大小。
第2步:使用mdadm命令创建RAID10,名称为/dev/md0
用-C参数代表创建一个RAID阵列卡,-v参数来显示出创建的过程,同时在后面追加一个设备名称,-a yes参数代表自动创建设备文件,-n 4参数代表使用4块硬盘(分区)来制作这个RAID组,而-l 10参数则代表RAID10,最后再加上4块设备的名称就可以了。
[root@xuexi ~]# mdadm -C /dev/md0 -n 4 -l 10 -a yes /dev/sd{b,c,d,e}1
mdadm: /dev/sdb1 appears to contain an ext2fs file system
size=10485760K mtime=Thu Jan 1 08:00:00 1970
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
查看RAID设备信息。
[root@xuexi ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Jun 9 21:44:59 2017
Raid Level : raid10
Array Size : 387072 (378.06 MiB 396.36 MB) # RAID10总共能使用的空间400M左右,除去元数据,大约370M左右
Used Dev Size : 193536 (189.03 MiB 198.18 MB) # 每个raid组或设备上(即每个RAID1组)可用大小为190M左右
Raid Devices : 4 # raid中设备的个数
Total Devices : 4 # 总设备个数,包括raid中设备个数,备用设备个数等
Persistence : Superblock is persistent
Update Time : Fri Jun 9 21:45:02 2017
State : clean # 当前raid状态,有clean/degraded(降级)/recovering/resyncing
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : near=2 # RAID10数据分布方式,有near/far/offset,
# 默认为near,即数据副本存储在相邻设备的相同偏移上
Chunk Size : 512K
Name : xuexi.longshuai.com:0 (local to host xuexi.longshuai.com)
UUID : ff2b7d7c:381a4c47:c31e7edd:7cdef01e
Events : 17
Number Major Minor RaidDevice State
0 8 17 0 active sync set-A /dev/sdb1 # /dev/sdb1是第一个raid1组A成员
1 8 33 1 active sync set-B /dev/sdc1 # /dev/sdc1是第一个raid1组B成员
2 8 49 2 active sync set-A /dev/sdd1 # /dev/sdd1是第二个raid1组A成员
3 8 65 3 active sync set-B /dev/sde1 # /dev/sde1是第二个raid1组B成员
raid创建好后,它的运行状态信息放在/proc/mdstat中。
[root@xuexi ~]# cat /proc/mdstat
Personalities : [raid10]
md0 : active raid10 sde1[3] sdd1[2] sdc1[1] sdb1[0]
387072 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
unused devices: <none>
其中md0 : active raid10 sde1[3] sdd1[2] sdc1[1] sdb1[0]表示md0是raid10级别的raid,且是激活状态,sdX[N]表示该设备在raid组中的位置是N,如果有备用设备,则表示方式为sdX[N][S],S就表示spare的意思。
其中387072 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]表示该raid可用总空间为387072个block,每个block为1K,所以为378M,chunks的大小512K,[m/n]表示此raid10阵列需要m个设备,且n个设备正在正常运行,[UUUU]表示分别表示m个的每一个运行状态,这里表示这4个设备都是正常工作的,如果是不正常的,则以_显示。
再看看lsblk的结果。
[root@xuexi ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 77b5f0da-b0f9-4054-9902-c6cdacf29f5e /boot
├─sda2 ext4 f199fcb4-fb06-4bf5-a1b7-a15af0f7cb47 /
└─sda3 swap 6ae3975c-1a2a-46e3-87f3-d5bd3f1eff48 [SWAP]
sr0
sdb
└─sdb1 linux_raid_member xuexi:0 ff2b7d7c-381a-4c47-c31e-7edd7cdef01e
└─md0
sdc
└─sdc1 linux_raid_member xuexi:0 ff2b7d7c-381a-4c47-c31e-7edd7cdef01e
└─md0
sdd
└─sdd1 linux_raid_member xuexi:0 ff2b7d7c-381a-4c47-c31e-7edd7cdef01e
└─md0
sde
└─sde1 linux_raid_member xuexi:0 ff2b7d7c-381a-4c47-c31e-7edd7cdef01e
└─md0
第3步:将制作好的RAID组格式化创建文件系统
以创建ext4文件系统为例。
[root@xuexi ~]# mke2fs -t ext4 /dev/md0
第4步:挂载raid设备
挂载成功后可看到可用空间为359M,因为RAID在创建文件系统时也消耗了一部分空间存储文件系统的元数据。
[root@xuexi ~]# mount /dev/md0 /mydata
[root@xuexi ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 ext4 18G 2.7G 14G 16% /
tmpfs tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 ext4 239M 28M 199M 13% /boot
/dev/md0 ext4 359M 2.1M 338M 1% /mydata
损坏磁盘阵列及修复
通过manage模式可以模拟阵列中的设备损坏。
mdadm --manage /dev/md[0-9] [--add 设备名] [--remove 设备名] [--fail 设备名]
选项说明:
manage :mdadm使用manage模式,此模式下可以做--add/--remove/--fail/--replace动作
--add :将后面列出的设备加入到这个md
--remove :将后面列出的设备从md中移除
--fail :将后面列出的设备设定为错误状态,即人为损坏
模拟/dev/sdc1损坏。
[root@xuexi mydata]# mdadm --manage /dev/md0 --fail /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0
再查看raid状态。
[root@xuexi mydata]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Jun 9 21:44:59 2017
Raid Level : raid10
Array Size : 387072 (378.06 MiB 396.36 MB)
Used Dev Size : 193536 (189.03 MiB 198.18 MB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri Jun 9 22:22:29 2017
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : xuexi.longshuai.com:0 (local to host xuexi.longshuai.com)
UUID : ff2b7d7c:381a4c47:c31e7edd:7cdef01e
Events : 19
Number Major Minor RaidDevice State
0 8 17 0 active sync set-A /dev/sdb1
2 0 0 2 removed
2 8 49 2 active sync set-A /dev/sdd1
3 8 65 3 active sync set-B /dev/sde1
1 8 33 - faulty /dev/sdc1
由于4块磁盘组成的raid10允许损坏一块盘,且还允许坏第二块非对称盘。所以这里损坏了一块盘后raid10是可以正常工作的。
现在可以将损坏的磁盘拔出,然后向raid中加入新的磁盘即可。
mdadm --manage /dev/md0 --remove /dev/sdc1
再修复时,可以将新磁盘加入到raid中。
mdadm --manage /dev/mn0 --add /dev/sdc1
raid备份盘
使用mdadm的-x选项可以指定备份盘的数量,备份盘的作用是自动顶替raid组中坏掉的盘。
停止和装配raid
umount /dev/md0
mdadm --stop /dev/md0
关闭raid阵列后,该raid组/dev/md0就停止工作了。
如果下次想继续启动它,直接使用-A来装配/dev/md0是不可以的,需要再次指定该raid中的设备成员,且和关闭前的成员一样,不能有任何不同。
mdadm -A /dev/md0 /dev/sd{b,c,d,e}1
这样做不太保险,其实可以在停止raid前,扫描raid,将扫描的结果保存到配置文件中,下次启动的时候直接读取配置文件即可。
mdadm -D --scan >> /etc/mdadm.conf # 这是默认配置文件
下次直接使用-A就可以装置配置文件中的raid组。
mdadm -A /dev/md0
如果不放在默认配置文件中,则装配的时候使用-c或--config选项指定配置文件即可。
mdadm -D --scan >> /tmp/mdadm.conf
mdadm -A /dev/md0 -c /tmp/mdadm.conf
彻底移除raid设备
当已经确定一个磁盘不需要再做为raid的一部分,可以将它移除掉。彻底移除一个raid设备并非那么简单,因为raid控制器已经标记了一个设备,即使将它mdadm --remove也无法彻底消除raid的信息。
以移除/dev/md127中的/dev/sdb1为例。
首先,卸载、停止、移除:
umount /dev/sdb1
mdadm --stop /dev/md127
mdadm --manage /dev/md127 --remove /dev/sdb1
虽然从raid中移除了,但是江湖上还有它的传说:删除分区、创建分区、格式化,格式化的时候将被保护
$ parted /dev/sdb rm 1
$ parted /dev/sdb mkpart p 1 20G
$ mke2fs -t ext4 /dev/sdb1
/dev/sdb1 is apparently in use by the system; will not make a filesystem here!
然后再去扫描raid设备,发现它又出现在raid组中:
$ mdadm -D -s
ARRAY /dev/md/xuexi.longshuai.com:0 metadata=1.2 ............
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 xfs 367d6a77-033b-4037-bbcb-416705ead095 /boot
├─sda2 xfs b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /
└─sda3 swap d505113c-daa6-4c17-8b03-b3551ced2305 [SWAP]
sdb
└─sdb1 linux_raid_member xue........
└─md127 ext4 2fed1dcc-b9a2-477f-8c8f-7131bbd4e919
换句话说,只要这个设备曾经是raid的一份子,就没法再直接使用它。就算分区了,也不允许格式化。
所以,要彻底移除一个raid设备,需要清空控制器可以读取的raid签名,只需将这个raid设备(可能是一个分区)的raid superblock用0去覆盖掉就行了:
$ umount /dev/sdb1
$ mdadm --stop /dev/md127
$ mdadm --manage /dev/md127 --remove /dev/sdb1
$ mdadm --zero-superblock --force /dev/sdb1 # 这条命令是关键
然后,这个设备就和raid控制器无关了:
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
...........
sdb
└─sdb1
现在格式化也可以正常进行了:
mke2fs -t ext4 /dev/sdb1