Linux磁盘分区总结
最近在做ceph的日志盘分区时候遇到一些问题记录下来。比较古老的分区工具是使用fdisk,后来因为磁盘越来越大, 而fdisk遇到分区容量超过2TB时无能为力,并且分区还要限制最多4个主分区。越来越不适用现代磁盘, 后来有了parted工具专门用来对大磁盘分区的。
硬盘分区最常见的类型为msdos
和gpt
,前者表示MBR分区,而后者表示GPT分区。
传统的BIOS只支持MBR分区硬盘启动,一个硬盘只能分成四个分区,并且单个分区最大不超过2TB。 EFI支持GPT分区启动的,GPT分区没有分区数目的限制并且单个分区可以超过2TB。
MBR
MBR分区表(即主引导记录)大家都很熟悉。所支持的最大卷为2T,而且最多4个主分区或3个主分区加一个扩展分区GPT
GPT(即GUID分区表)是源自EFI标准的一种较新的磁盘分区表结构的标准,是未来磁盘分区的主要形式。 与MBR分区方式相比,突破MBR4个主分区限制,每个磁盘最多支持128个分区,持大于2T的分区,最大卷可达18EB。
使用parted命令查看磁盘分区类型:
1 | [root@node200 ~]# parted /dev/sdb print |
输出结果中的Partition Table: gpt
表示gpt分区
这里顺带解释下物理扇区和逻辑扇区的概念,上面的Sector size (logical/physical): 512B/512B
,
也就是硬盘的每个扇区实际大小是512B,不过我们做分区都是针对逻辑扇区的,也就是logical为单位,
这里也是512B,一般来讲磁盘会将一个物理扇区划分成多个逻辑扇区,逻辑扇区才是分区最小单位。
fdisk使用
fdisk用来创建MBR分区,这个工具应该都会用了,这里只是简单介绍几个。
显示所有硬盘分区情况
1 | fdisk -l |
显示具体单个硬盘分区情况
1 | fdisk -l /dev/sdb |
交互显示方便提示fdisk的所有命令如何使用
1 | fdisk /dev/sdb |
进入交互模式后按m可列出所有命令:
1 | [root@node200 ~]# fdisk /dev/sdb |
parted使用
参考:https://www.gnu.org/software/parted/manual/parted.html
Parted 命令分为两种模式:命令行模式和交互模式。
- 命令行模式:
parted [option] device [command]
, 比较适合编程应用。 - 交互模式:
parted [option] device
类似于使用fdisk /dev/xxx
parted是一个可以分区并进行分区调整的工具,他可以创建、删除、移动、复制、 调整ext2 Linux-swap fat fat32 reiserfs类型的分区, 可以创建、调整、移动Macintosh的HFS分区,检测jfs,ntfs,ufs,xfs分区。
显示分区信息
1 | parted list # 列出所有磁盘分区信息 |
创建分区类型
1 | parted /dev/sdb mklabel label-type |
label-type可以是:”bsd”, “dvh”, “gpt”, “loop”,”mac”, “msdos”, “pc98”, or “sun”。 一般的pc机都是msdos格式,如果分区大于2T则需要选用gpt格式的分区表。
分区转换
转换成GPT:
1 | parted /dev/sdb mklabel gpt |
转换成MBR:
1 | parted /dev/sdb mklabel msdos |
创建分区
1 | parted /dev/sdb mkpart [part-type fs-type name] start end |
创建一个part-type类型的分区,part-type可以是:”primary”, “logical”, or “extended”, 只有在分区类型为’msdos’或’dvh’的时候才能指定这个参数。
如果指定fs-type则在创建分区的同时进行格式化,start和end指的是分区的起始位置,单位默认是M。
设置分区名
1 | parted /dev/sdb name 1 "name" |
这种设置只能用在Mac, PC98 和 GPT类型的分区表,设置时名字用引号括起来
调整分区大小
1 | parted /dev/sdb resize 1 start end |
删除一个分区
1 | parted /dev/sdb rm 1 |
移动分区
1 | parted /dev/sdb move 1 start end |
sgdisk使用
参考:http://www.rodsbooks.com/gdisk/sgdisk-walkthrough.html
与fdisk创建MBR分区一样,sgdisk是一个创建GPT分区的工具,它也有交互模式gdisk和命令行模式sgdisk两种, 一般手动分区就选择gdisk会保险一点,这里我讲的是命令行模式sgdisk,方便编程实现。
查看所有GPT分区
先可执行parted命令查看磁盘分区类型:
1 | parted /dev/sdb print |
然后对于gpt类型的就可以用sgdisk命令查看了:
1 | [root@node200 ~]# sgdisk -p /dev/sdb |
查看某个分区
1 | [root@node200 ~]# sgdisk --info=1 /dev/sdb |
删除磁盘所有分区
1 | [root@node200 ~]# sgdisk --zap-all --clear --mbrtogpt -g /dev/sdd |
创建分区
创建某个分区前,请先查看这个磁盘分区表,查看扇区大小sector,然后算好起始扇区start和结束扇区end。
比如我要创建第1个分区/dev/sdd1,大小1GiB,扇区数量为1*1024*1024*1024/512=2097152
。
起始扇区start=1,结束扇区end=2097152,type code为8300,分区名为”ceph journal”
1 | sgdisk -n 1:1:2097152 -t 1:8300 -c 1:"ceph journal" -g -p /dev/sdd |
type code一般就是8300(Linux filesystem),可通过sgdisk -L
来查看所有。
出错:
1 | Could not create partition 1 from 1 to 2097152 |
仔细看看发现First usable sector is 34
,第一个可用扇区是34(前面33个扇区不能用),
所以得往后移33再次执行:
1 | [root@node200 ~]# sgdisk -n 1:34:2097185 -t 1:8300 -p /dev/sdd |
执行成功!
不过你可用看到就是start扇区变成了2048,原因是需要分区对齐
Moved requested sector from 34 to 2048 in order to align on 2048-sector boundaries
如果忘记设置分区名了,就用下面命令:
1 | sgdisk -c 1:"ceph journal" /dev/sdd |
查看下是否成功:
1 | [root@node200 ~]# sgdisk -p /dev/sdd |
分区格式化
一般来讲分区的时候不要做格式化,分完区之后单独来做格式化。
1 | mkfs -t xfs /dev/sdd1 |
分区挂载
显示系统已挂载的分区列表:
1 | df -h |
挂载命令格式: mount [-t fstype] [-o options] device dir
1 | 1. -t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有: |
实际例子:
1 | mount /dev/sdd1 /opt/winstore/var/log |
另外还有两个命令也有用
查看所有磁盘以及相应的分区挂载:
1 | lsblk |
查看系统所有分区名:
1 | blkid |