![让parted在上一个分区之后自动启动下一个分区?](https://linux22.com/image/128027/%E8%AE%A9parted%E5%9C%A8%E4%B8%8A%E4%B8%80%E4%B8%AA%E5%88%86%E5%8C%BA%E4%B9%8B%E5%90%8E%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8%E4%B8%8B%E4%B8%80%E4%B8%AA%E5%88%86%E5%8C%BA%EF%BC%9F.png)
我继承了一个 shell 脚本,它将“随机”字符列表通过管道传输到fdisk
.它所做的就是按如下方式对磁盘进行分区:
设置空白磁盘、分区表等 创建第一个分区,大小 A 在第一个分区之后立即创建第二个分区,大小 Y。紧接着第二个分区之后创建第三个分区,大小为 X。为了增加“乐趣”,A、Y 和 X 是经过计算的,并且可能会根据可用新磁盘的大小而变化。
Fdisk 将根据现有位置提示起始位置,“代码”只需“按回车键”即可接受。
这段代码非常不透明,我想用对“ parted --script...
”的调用来替换它,fdisk
但我看不到parted有办法说“在最后一个分区之后立即开始”。看来我得自己继续计算起始位置了。
我是否正确?如果是,有人对此有合理的解决方案吗?
答案1
您不必编写错误脚本所做的所有工作的完全相同的副本。重写是修复逻辑和代码的机会。首先破译原始代码的作用,然后将其变成正常的东西。
您直接问题的答案是“不。您需要自己提供开始和结束”。幸运的是,这并不是非常困难。
parted
的mkpart
命令采用start
and 和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 算术仅是整数 -如果您需要进行浮点或百分比计算,请使用bc
or )。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
。