在我们日常的运维工作中,磁盘分区是必备的一项技能,掌握了就可以更好的规划存储空间,提高资源的利用率。
常见的磁盘分区工具有fdisk
、parted
、gdisk
使用方式有些许的差异,除了都支持交互型操作外,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 | echo -e "n\np\n1\n\n+5G\nn\np\n2\n\n+1G\nw\n" >/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 | parted /dev/sdb mklabel msdos # 设置硬盘flag(msdos/gpt) |
如果不确定分区的起点大小,可以加上-s选项使用script模式,该模式下parted将回答一切默认值,如yes、no。