实现磁盘分区可以有以下优势:
Linux的哲学思想之一:一切皆文件。
# 设备类型:
# 块(block):随机访问,数据交换单位是“块”
# 字符(character):线性访问,数据交换单位是“字符”
# 设备文件:FHS
# /dev
# 设备文件:关联至设备的驱动程序,进而能够跟与之对应硬件设备进行通信
# 设备号:
# major:主设备号,区分设备类型;用于标明设备所需要的驱动程序
# minor:次设备号,区分同种类型下的不同的设备;是特定设备的访问入口
# mknod命令:
# make block or character special files
# mknod [OPTION]... NAME TYPE [MAJOR MINOR]
# -m MODE:创建后的设备文件的访问权限
# 设备文件名:ICANN
# 磁盘:
# IDE: /dev/hd[a-z]
# 例如:/dev/hda, /dev/hdb
# 不同磁盘表示 (SCSI, SATA, USB, SAS)
# /dev/sd[a-z]
# /dev/sda, /dev/sdb, ...
# 同一设备上的不同分区
# /dev/sda#
# /dev/sda1, /dev/sda2, ...
# 注意:CentOS 6和7统统将硬盘设备文件标识为/dev/sd[a-z]#
# 引用设备的方式:
# 1、设备文件名
# 2、卷标
# 3、UUID
在开始介绍磁盘分区以前,先简单介绍下磁盘。
硬盘(Disks: 持久存储数据)是一种I/O设备。
# IDE(ata):并口,133MB/s
# SCSI:并口,Ultrascsi320, 320MB/S, UltraSCSI640, 640MB/S
# SATA:串口,6gbps
# SAS:串口,6gbps
# USB:串口,480MB/s
# 并口:同一线缆可以接多块设备
IDE:两个,主,从
SCSI:
宽带:16-1
窄带:8-1
# 串口:同一线缆只可以接一个设备
# iops:io per second
# head:磁头
# track:磁道
# cylinder: 柱面
# sector: 扇区,512bytes
机械硬盘由坚硬金属材料制成的涂以磁性介质的盘片,盘片两面称为盘面或扇面,都可以记录信息,由磁头对盘面进行操作,一般用磁头号区分。结构特性决定了机械硬盘如果受到剧烈冲击,磁头与盘面可能产生的哪怕是轻微撞击都有可能报废。
假设磁头不动,硬盘旋转,那么磁头就会在磁盘表面画出一个圆形轨迹并将之磁化,数据就保存在这些磁化区中,称之为磁道,将每个磁道分段,一个弧段就是一个扇区。一个硬盘可以包含多个扇面,扇面同轴重叠放置,每个盘面磁道数相同,具有相同周长的磁道所形成的圆柱称之为柱面,柱面数与磁道数相等。
最初的寻址方式称为CHS,在LBA(Logical Block Address)概念诞生之前,由他负责管理磁盘地址。所谓CHS即柱面(cylinder),磁头(header),扇区(sector),通过这三个变量描述磁盘地址,需要明白的是,这里表示的已不是物理地址而是逻辑地址了。这种方法也称作是LARGE寻址方式。该方法下:
硬盘容量=磁头数×柱面数×扇区数×扇区大小(一般为512byte)。
后来,人们通过为每个扇区分配逻辑地址,以扇区为单位进行寻址,也就有了LBA寻址方式。但是为了保持与CHS模式的兼容,通过逻辑变换算法,可以转换为磁头/柱面/扇区三种参数来表示,和 LARGE寻址模式一样,这里的地址也是逻辑地址了。(固态硬盘的存储原理虽然与机械硬盘不同,采用的是flash存储,但仍然使用LBA进行管理。)
磁盘分区方式一般有两种:MBR和GPT。
在讲之前,先介绍下CHS和LBA。
# 采用24bit位寻址
# 其中前10位表示cylinder,中间8位表示head,后面6位表示sector
# 最大寻址空间8GB
# LBA是一个整数,通过转换成CHS格式完成磁盘具体寻址
# ATA-1规范中定义了28位寻址模式,以每扇区512位组来计算
# ATA-1所定义的28位LBA上限达到128 GiB
# 2002年ATA-6规范采用48位LBA,同样以每扇区512位组计算容量上限可达128 Petabytes
# MBR:Master Boot Record
# 使用32位表示扇区数,分区不超过2T
# 分为三部分(512字节):
# 446bytes:bootloader, 程序,引导启动操作系统的程序;
# 64bytes:分区表,每16bytes标识一个分区,一共只能有4个分区;
4主分区
3主1扩展
n逻辑分区
# 2bytes:MBR区域的有效性标识;55AA为有效
# 主分区和扩展分区的标识:1-4
# 逻辑分区:5+
# 硬盘主引导记录MBR由4个部分组成
# 主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序
# 出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节
# 分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH
# 每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4
# 结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA
80 01 01 00, 0B FE BF FC, 3F 00 00 00, 7E 86 BB 00
其中, “80”是一个分区的激活标志,表示系统可引导;“01 01 00”表示分区开始的磁头号为01,开始的扇区号为01,开始的柱面号为00;“0B”表示该分区的系统类型是FAT32,其他比较常用的有04(FAT16)、07(NTFS);“FE BF FC”表示分区结束的磁头号为254,分区结束的扇区号为63、分区结束的柱面号为764;“3F 00 00 00”表示首扇区的相对扇区号为63;“7E 86 BB 00”表示总扇区数为12289622。
可以看到,在只分配64字节给DPT的情况下,每个分区项分别占用16个字节,因此只能记录四个分区信息,尽管后来为了支持更多的分区,引入了扩展分区及逻辑分区的概念。但每个分区项仍然用16个字节存储。能表示的最大扇区数为FF FF,FF FFH,因此可管理的最大空间=总扇区数*扇区大小(512byte),也就是2TB(在1:1000的换算下,有时也叫2.2T)。超过2TB以后的空间,不能分配地址,自然也就无法管理了。
MBR的诸多缺点使其应用大大受限。所以有了后面的GPT分区技术。
GPT 是 GUID Partition Table 的缩写,意为 全局唯一标识分区表。
# GPT支持128个分区,使用64位,支持8Z(512Byte/block )64Z (4096Byte/block)
# 使用128位UUID(Universally Unique Identifier) 表示磁盘和分区GPT分区表自动备份在头和尾两份,并有CRC校验位
# UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动
GPT 是一个实体硬盘的分区表的结构布局的标准。它是可扩展固件接口(UEFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主引导记录(MBR)分区表。对于那些扇区为512字节的磁盘,MBR分区表不支持容量大于2.2TB(2.2×10^12字节)的分区,然而,一些硬盘制造商(诸如希捷和西部数据)注意到这个局限性,并且将他们的容量较大的磁盘升级到4KB的扇区,这意味着MBR的有效容量上限提升到16 TiB。 这个看似“正确的”解决方案,在临时地降低人们对改进磁盘分配表的需求的同时,也给市场带来关于在有较大的块(block)的设备上从BIOS启动时,如何最佳的划分磁盘分区的困惑。GPT分配64bits给逻辑块地址,因而使得最大分区大小在2^64-1个扇区成为可能。对于每个扇区大小为512字节的磁盘,那意味着可以有9.4ZB(9.4×10^ 21字节)或8 ZiB个512字节(9,444,732,965,739,290,426,880字节或18,446,744,073,709,551,615(2^64 -1)个扇区×512(2^9)字节每扇区)。
EFI部分又可以分为4个区域:EFI信息区(GPT头)、分区表、GPT分区、备份区域。
PMBR存在的意义就是,当不支持GPT的分区工具试图对硬盘进行操作时(例如MS-DOS和Linux的fdisk程序),它可以根据这份PMBR以传统方式启动,过程和MBR+BIOS完全一致,极大地提高了兼容性。而支持GPT的系统在检测PMBR后会直接跳到GPT表头读取分区表。和MBR类似,分区表中存储了某个分区的起始和结束位置及其文件系统属性信息,而分区才是实际存在的物理磁盘的一部分。
GUID 是 Globally Unique Identifier 的缩写,意为 全局唯一标识符。
GUID 是一种由算法生成的唯一标识,通常表示成32个16进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它实质上是一个128位长的二进制整数(4个2进制数代表一个16进制数字)。
GUID的主要目的是产生完全唯一的数字。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID的总数也足够大,达到了2128(3.4×1038)个,所以随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。
相较于MBR,GPT具有以下优点:
# 列出块设备
# lsblk
# 创建分区使用:
# fdisk创建MBR分区
# gdisk创建GPT分区
# parted高级分区操作
# 重新设置内存中的内核分区表版本
# partprobe
lsblk命令用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,CD-ROM等等。
常用选项:
-a, --all # 显示所有设备。
-b, --bytes # 以bytes方式显示设备大小。
-d, --nodeps # 不显示 slaves 或 holders。
-D, --discard # print discard capabilities。
-e, --exclude # 排除设备 (default: RAM disks)。
-f, --fs # 显示文件系统信息。
-h, --help # 显示帮助信息。
-i, --ascii # use ascii characters only。
-m, --perms # 显示权限信息。
-l, --list # 使用列表格式显示。
-n, --noheadings # 不显示标题。
-o, --output # 输出列。
-P, --pairs # 使用key="value"格式显示。
-r, --raw # 使用原始格式显示。
-t, --topology # 显示拓扑结构信息。
示例:
[root@LeeMumu ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 120G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 119G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 2G 0 lvm [SWAP]
└─centos-home 253:2 0 67G 0 lvm /home
sdb 8:16 0 10G 0 disk /mnt/mydata
sdc 8:32 0 2G 0 disk
└─sdc1 8:33 0 1G 0 part [SWAP]
sr0 11:0 1 10G 0 rom
# 字段解释:
NAME # 这是块设备名
MAJ:MIN # 本栏显示主要和次要设备号
RM # 本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备
SIZE # 本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB
RO # 该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的
TYPE # 本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)
MOUNTPOINT # 本栏指出设备挂载的挂载点
# 磁盘分区和分区大小调整工具
# parted的操作都是实时生效的,小心使用
# 用法:parted [选项]... [设备[命令[参数]...]...]
# parted /dev/sdbmklabelgpt|msdos
# parted /dev/sdbprint
# parted /dev/sdbmkpartprimary 1 200 (默认M)
# parted /dev/sdbrm1
# parted –l 列出分区信息
fdisk 提供了一个交互式接口来管理分区,它有许多子命令,分别用于不同的管理功能;所有的操作均在内存中完成,没有直接同步到磁盘;直到使用w命令保存至磁盘上。
注意:在已经分区并且已经挂载其中某个分区的磁盘设备上创建的新分区,内核可能在创建完成后无法直接识别。
# gdisk / dev / sdb 类 fdisk 的 GPT分区工具
# fdisk -l [-u] [device...] 查看分区
# fdisk/dev/sdb 管理分区
# 子命令:
# p 显示现有分区信息
# t 更改分区类型
# n 创建新分区
# d 删除分区
# v 校验分区
# u 转换单位
# w 保存并退出
# q 不保存并退出
# l 查看所有已经ID
# m 查看帮助
在主分区1到主分区3创建完毕后,只有使用 e 新建扩展分区后,才能继续在扩展分区的基础上继续创建分区。
但是需要注意的是,一般主分区1、主分区2、主分区3和扩展分区(e)要把全部的磁盘空间分配完,不然剩下的磁盘空间会无法使用。
一般都是把扩展分区分配磁盘剩余空间,然后在扩展分区的基础上创建新的分区。
# 查看内核是否已经识别新的分区
# cat /proc/partations
# centos6,7:通知内核重新读取硬盘分区表
新增分区用
# partx -a /dev/DEVICE
# kpartx -a /dev/DEVICE -f
# 删除分区用
# partx -d --nrM -N /dev/DEVICE
# CentOS 5: 使用 partprobe
# partprobe [/dev/DEVICE]
在创建完分区后,需要用以下命令,对磁盘重读分区信息。新建分区才会被识别。
[root@LeeMumu ~]# partx -a /dev/sdh
partx: /dev/sdh: error adding partitions 1-5
[root@tangtang tmp]# fdisk -l
Disk /dev/vda: 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: 0x000ad887
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 20971519 9436160 8e Linux LVM
[root@tangtang tmp]# fdisk /dev/vda
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): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p):
Using default response p
Partition number (3,4, default 3):
First sector (20971520-209715199, default 20971520):
Using default value 20971520
Last sector, +sectors or +size{K,M,G} (20971520-209715199, default 209715199): +10G
Partition 3 of type Linux and of size 10 GiB is set
Command (m for help): t
Partition number (1-3, default 3): 3
Hex code (type L to list all codes): L
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
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.
[root@tangtang tmp]# fdisk -l
Disk /dev/vda: 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: 0x000ad887
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 20971519 9436160 8e Linux LVM
/dev/vda3 20971520 41943039 10485760 8e Linux LVM
[root@tangtang tmp]# partx -a /dev/vda
partx: /dev/vda: error adding partitions 1-2
[root@tangtang tmp]# partx -a /dev/vda
partx: /dev/vda: error adding partitions 1-3
[root@tangtang tmp]# mkfs.ext4 /dev/vda3
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
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
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
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@tangtang tmp]# mount /dev/vda3 /tangtang/
[root@tangtang tmp]# cd /tangtang/
[root@tangtang tangtang]# ll
total 16
drwx------ 2 root root 16384 Oct 31 10:51 lost+found # 显示此目录,说明挂载成功
[root@tangtang tangtang]echo "/dev/vda3 /tangtang ext4 defaults 0 0" >> /etc/fsta