S_lion's Studio

磁盘分区工具

字数统计: 928阅读时长: 3 min
2021/08/02 Share

在我们日常的运维工作中,磁盘分区是必备的一项技能,掌握了就可以更好的规划存储空间,提高资源的利用率。

常见的磁盘分区工具有fdiskpartedgdisk

使用方式有些许的差异,除了都支持交互型操作外,parted天生支持非交互的能力,而fdisk与gdisk需要我们来换种思路实现非交互式。

关于这些工具交互式的操作命令比较简单,可以直接通过man手册来巩固,以下主要介绍下如何实现非交互式,后续使磁盘分区操作脚本化。

fdisk

一般情况下,我们都是选择使用fdisk工具来进行分区,而常用的fdisk这个工具对分区是有大小限制的,它只能划分小于2T的磁盘,所以在划大于2T磁盘分区的时候fdisk就无法满足要求了。

fdisk工具用来分MBR磁盘上的区。要分GPT磁盘上的区,可以使用gdisk。parted工具对这两种格式的磁盘分区都支持。

fdisk操作全部是在内存中执行的,必须保存生效。保存后,内核还未识别该分区,可以查看/proc/partition目录下存在的文件,这些文件是能被内核识别的分区。运行partprobe或partx命令重新读取分区表让内核识别新的分区,内核识别后才可以格式化。而且分区结束时按w保存分区表有时候会失败,提示重启,这时候运行partprobe命令可以代替重启就生效。

gdisk

gdisk用来划分gpt分区,需要单独安装这个工具包。

Parted

parted支持mbr格式和gpt格式的磁盘分区。它的强大在于可以一步到位而不需要不断的交互式输入(也可以交互式)。

parted分区工具是实时的,所以每一步操作都是直接写入磁盘而不是写进内存,它不像fdisk/gdisk还需要w命令将内存中的结果保存到磁盘中。

fdisk实现非交互

fdisk实现非交互的原理是从标准输入中读取,每读取一行传递一次操作。

所以可以有两种方式:

  • 使用echo和管道传递
  • 将操作写入到文件中,从文件中读取。

例如:下面的命令创建了两个分区。使用默认值时传递空行即可。

1
$ echo -e "n\np\n1\n\n+5G\nn\np\n2\n\n+1G\nw\n"  | fdisk /dev/sdb

如果要传递的操作很多,则可以将它们写入到一个文件中,从文件中读取。

1
2
$ 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。

例如:

1
$ echo -e "n\n1\n\n+3G\n\nw\nY\n" | gdisk /dev/sdb

上面传递的各参数意义为:

新建分区,分区number为1,使用默认开始扇区位置,分区大小+3G,使用默认分区类型,保存,确认。

parted实现非交互

parted命令只能一次非交互一个命令中的所有动作。如下所示:

1
2
3
4
5
6
parted /dev/sdb mklabel msdos                 # 设置硬盘flag(msdos/gpt)
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。

CATALOG
  1. 1. fdisk
  2. 2. gdisk
  3. 3. Parted
  4. 4. fdisk实现非交互
  5. 5. gdisk实现非交互
  6. 6. parted实现非交互