Answers:
与以前的建议类似,将命令传递到fidsk上,我发现这种方法对于为后续维护者保留详细信息很有用。sed位会在fdisk获取输入之前删除所有注释。
# to create the partitions programatically (rather than manually)
# we're going to simulate the manual input to fdisk
# The sed script strips off all the comments so that we can
# document what we're doing in-line with the actual commands
# Note that a blank line (commented as "defualt" will send a empty
# line terminated with a newline to take the fdisk default.
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk ${TGTDEV}
o # clear the in memory partition table
n # new partition
p # primary partition
1 # partition number 1
# default - start at beginning of disk
+100M # 100 MB boot parttion
n # new partition
p # primary partition
2 # partion number 2
# default, start immediately after preceding partition
# default, extend partition to end of disk
a # make a partition bootable
1 # bootable partition is partition 1 -- /dev/sda1
p # print the in-memory partition table
w # write the partition table
q # and we're done
EOF
sfdisk
比fdisk
磁盘
sfdisk
是的脚本版本 fdisk
它是的一部分util-linux
,就像一样fdisk
,因此可用性应该相同。
可以使用以下方式创建一个具有整个磁盘的分区的分区表:
echo 'type=83' | sudo sfdisk /dev/sdX
和更复杂的分区表将在下面说明。
要生成示例脚本,请设置其中一个磁盘:
sudo sfdisk -d /dev/sda > sda.sfdisk
我的Lenovo T430 Windows 7 / Ubuntu双启动上的示例输出:
label: dos
label-id: 0x7ddcbf7d
device: /dev/sda
unit: sectors
/dev/sda1 : start= 2048, size= 3072000, type=7, bootable
/dev/sda2 : start= 3074048, size= 195430105, type=7
/dev/sda3 : start= 948099072, size= 28672000, type=7
/dev/sda4 : start= 198504446, size= 749594626, type=5
/dev/sda5 : start= 198504448, size= 618891264, type=83
/dev/sda6 : start= 940277760, size= 7821312, type=82
/dev/sda7 : start= 817397760, size= 61437952, type=83
/dev/sda8 : start= 878837760, size= 61437500, type=83
将脚本保存到文件后,可以使用以下命令将其应用于sdX
:
sudo sfdisk /dev/sdX < sda.sfdisk
对于sfdisk
输入,您可以省略设备名称,并使用以下类型的行:
start= 2048, size= 3072000, type=7, bootable
如果存在它们,它们将被忽略,并且设备名称将从命令行参数中获取。
一些解释:
label
:分区表的类型。dos
(MBR)是被广泛支持的旧的,gpt
新的闪亮的东西。unit
:仅sector
受支持。1个扇区通常等于512个字节。查找cat /sys/block/sda/queue/hw_sector_size
另请参阅:https : //unix.stackexchange.com/questions/2668/finding-the-sector-size-of-a-partitiondevice
:我只提供信息分隔线:
start
:在分区开始的磁盘内偏移。
start
具有非常好的默认值,并且通常可以忽略:
start
是2048,即1Mb(2048 + 512),这是磁盘兼容性的默认设置start
默认为第一个未分配位置size
:man sfdisk
说:The default value of size indicates "as much as possible"
。因此,使用单个分区填充磁盘可以使用:/dev/sda : start=2048, type=83
type
:在每个分区条目的启动扇区中存储的魔术字节。可能的值:https : //en.wikipedia.org/wiki/Partition_type在此示例中,我们观察到:
7
(sda1
,2
和3
):Windows支持的文件系统。预装Windows资料和Lenovo恢复分区。sudo blkid
标签有助于识别它们。5
(sda4
):扩展的主分区,它将包含其他逻辑分区(因为我们只有4个具有MBR的主分区)83
(sda5
,7
和8
):Linux支持的分区。对我来说home
,两个根源使用不同的Ubuntu版本82
(sd6
):交换fdisk
也可以sfdisk
使用I
命令读取脚本,该脚本在交互式fdisk
会话期间“提供” 脚本,从而允许您在写入分区之前进行进一步的自定义。
已在Ubuntu sfdisk
16.04、2.27.1 上测试。
格式化和填充分区的图像文件不带 sudo
这是一种学习使用的好方法,sfdisk
而不会炸毁硬盘:https : //stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root-特权/ 52850819#52850819
fdisk
从stdin读取,因此您只需要提供适当的命令即可。例如,下面的命令清除分区表(如果有的话),并创建一个新分区,该分区表具有一个分区。整个磁盘:
(
echo o # Create a new empty DOS partition table
echo n # Add a new partition
echo p # Primary partition
echo 1 # Partition number
echo # First sector (Accept default: 1)
echo # Last sector (Accept default: varies)
echo w # Write changes
) | sudo fdisk
我建议您执行所需的任务,记录您键入的内容,以便再现它。
printf
而不是echo
仅仅养成在整个系统中使用行为一致的习惯。
您只需执行几个命令即可完成操作,使用简介\ n代替多个回显。
echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda
\n
需要另一个w
?
echo
自动以换行符终止行(除非使用了-n
选项)
您可以编写脚本fdisk
。
(echo n; echo p; echo 1; echo 1; echo 200; echo w) | fdisk /dev/sdc
这将在200 MB的分区上创建一个分区 /dev/sdc
创建一个新的disklabel类型gpt:
sudo /sbin/parted /dev/xvdf mklabel gpt --script
分区磁盘:
sudo /sbin/parted /dev/xvdf mkpart primary 0% 100% --script
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda
该脚本使用fdisk根据其他人的答案创建分区。
在脚本中更改以下内容:
NUM_PARTITIONS = 5
PARTITION_SIZE =“ + 10G”
脚本后给出了用法示例。
#!/bin/bash
if [ $# -eq 0 ]
then
echo "input the device"
exit
fi
NUM_PARTITIONS=5
PARTITION_SIZE="+10G"
SED_STRING="o"
TAIL="p
w
q
"
NEW_LINE="
"
LETTER_n="n"
EXTENDED_PART_NUM=4
TGTDEV=$1
SED_STRING="$SED_STRING$NEW_LINE"
for i in $(seq $NUM_PARTITIONS)
do
if [ $i -lt $EXTENDED_PART_NUM ]
then
SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
fi
if [ $i -eq $EXTENDED_PART_NUM ]
then
SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$NEW_LINE$NEW_LINE"
SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
fi
if [ $i -gt $EXTENDED_PART_NUM ]
then
SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
fi
done
SED_STRING="$SED_STRING$TAIL"
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk ${TGTDEV}
$SED_STRING
EOF
运行:
须藤sh mk_partition.sh / dev / sdxxx