让parted在上一个分区之后自动启动下一个分区?

让parted在上一个分区之后自动启动下一个分区?

我继承了一个 shell 脚本,它将“随机”字符列表通过管道传输到fdisk.它所做的就是按如下方式对磁盘进行分区:

设置空白磁盘、分区表等 创建第一个分区,大小 A 在第一个分区之后立即创建第二个分区,大小 Y。紧接着第二个分区之后创建第三个分区,大小为 X。为了增加“乐趣”,A、Y 和 X 是经过计算的,并且可能会根据可用新磁盘的大小而变化。

Fdisk 将根据现有位置提示起始位置,“代码”只需“按回车键”即可接受。

这段代码非常不透明,我想用对“ parted --script...”的调用来替换它,fdisk但我看不到parted有办法说“在最后一个分区之后立即开始”。看来我得自己继续计算起始位置了。

我是否正确?如果是,有人对此有合理的解决方案吗?

答案1

您不必编写错误脚本所做的所有工作的完全相同的副本。重写是修复逻辑和代码的机会。首先破译原始代码的作用,然后将其变成正常的东西。

您直接问题的答案是“不。您需要自己提供开始和结束”。幸运的是,这并不是非常困难。

partedmkpart命令采用startand 和end参数(单位默认为兆字节)。您只需在创建分区时指定它们即可。例如使用磁盘映像文件:

$ cat partition.sh 
#!/bin/sh

truncate -s 1G disk.img # create a 1G disk image file

parted -s disk.img mklabel msdos    # create the partition table

# make some partitions
parted -s disk.img mkpart primary 1 100
parted -s disk.img mkpart primary 101 200
parted -s disk.img mkpart primary 201 800
parted -s disk.img mkpart primary 801 1000

parted -s disk.img print

或者,parted只运行一次:

#!bin/sh

truncate -s 1G disk.img # create a 1G disk image file

parted -s disk.img mklabel msdos \
  mkpart primary 1 100 \
  mkpart primary 101 200 \
  mkpart primary 201 800 \
  mkpart primary 801 1000 \
  print
$ ./partition.sh 
Model:  (file)
Disk /home/cas/stack-exchange/2018-01-03/pauldsmith/disk.img: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  99.6MB  98.6MB  primary
 2      101MB   200MB   99.6MB  primary
 3      201MB   800MB   599MB   primary
 4      801MB   1000MB  199MB   primary

困难的部分是计算分区的准确开始值和结束值,以便它们与扇区大小正确对齐。第一个分区很简单 - 1MB 与 512 字节和 4K 扇区对齐。任何以 1MB 的精确倍数开始的分区也将正确对齐(上例中创建的所有分区都正确对齐)。

您可以将 shell 变量用于任何分区的起始值和结束值,这允许您使用 shell 算术来计算它们(但请记住,shell 算术仅是整数 -如果您需要进行浮点或百分比计算,请使用bcor )。dc

parted顺便说一句,您可以使用's命令检查对齐情况align-check。例如

$ parted disk.img align-check optimal 1
WARNING: You are not superuser.  Watch out for permissions.
1 aligned

如果与的脚本模式选项align-check一起使用,则不会产生任何输出。相反,如果未对齐,它会以状态 1 退出。否则,它将继续执行脚本的其余部分。parted-s

parted没有任何 if/then 功能,因此如果您想自动执行对齐检查以及分区创建,请使用上面脚本的第一个版本,以便您可以check-align在每个命令之间插入一个命令mkpart,并在退出代码时做出适当的响应是非零的。

答案2

您可以使用parted打印结束扇区:

$ parted /dev/sda 'unit s print'

Number  Start     End       Size      File system  Name     Flags
 1      2048s     1048575s  1046528s  fat32        primary  boot, esp
 2      1048576s  2095103s  1046528s  ext4         primary  raid

然后下一个分区从上一个分区之后的 +1 扇区开始:(2095103s假设前一个分区的大小以正确的单位给出)。

(parted) mkpart primary 2095104s 100%

您也可以使用百分比来自行计算parted

相关内容