出于QA目的,我需要能够通过bash脚本将驱动器分区为RHEL和SLES的30个或更多分区.
我曾尝试在BASH中使用fdisk通过"here document"执行此操作,但是您可以通过各种步骤进行猜测.我认为这是因为输入命令的时间发生在错误的时间并且不同步.我的脚本中的十分之一将正常工作.
我看过parted和sfdisk,并不真正了解如何使用这些工具.
我只使用过fdisk.
我的问题是,使用fdisk你可以一遍又一遍地说出"new partition + 1gb"这样的东西,这对我有用,因为在我的脚本中我不需要跟踪先前的分区或剩余空间或进行任何计算.每次运行此函数时,这只会从任何未使用的空间中创建一个额外的1gb分区.
有没有办法使用parted或sfdisk(或任何其他已经成为这些发行版的一部分的工具),以便我可以编写从1到x操作的循环脚本,而不必对剩余空间进行这种计算?有没有人有他们可以分享的任何例子?
这是我的一个功能的例子.在脚本开始时,我们询问用户要创建的分区数量,它们的大小(这对所有人来说都是静态的),以及FS的类型(如果有的话).此函数创建分区1到3,然后另一个函数处理扩展(第4),另一个处理第5到nn.
正如我之前所说,这个脚本功能齐全; 我的问题是,有时发送到fdisk的命令似乎到达了错误的时间,然后打破了整个脚本,从而破坏了任何自动化.
所以这些命令是这样发送的:
n
p
1
+1M
w
Run Code Online (Sandbox Code Playgroud)
我一直在阅读fdisk并且已经知道它不适合脚本编写,所以我看到的是,在脚本模式下,fdisk可能会要求p我的脚本已经认为是时候发送了1.
关于fdisk对我有用的事情是,在你指定分区号之后它已经计算了下一个空闲扇区,所以我此时要做的就是为我的开始发送一个空行,然后为我的总大小发送+ 1M.Parted和sfdisk看起来并没有像我所说的那样工作,我现在仍然很新,以了解如何在这个时候自动化这些工具.
Create1to3Primary_Func() {
Size=\+$partSize\MB
for i in {1..3}
do
echo " this loop i= $i"
echo "Creating Partition $i on $targetFull as $targetFull$i using Create1to3Primary_Func()"
rm -f /tmp/myScript
echo -e "n" >> /tmp/myScript
echo -e "p" >> /tmp/myScript
echo -e "$i" >> /tmp/myScript
echo -e " " >> /tmp/myScript
echo -e "$Size" >> /tmp/myScript
echo -e "w" >> /tmp/myScript
echo -e "EOF" >> /tmp/myScript
fdisk $targetFull < /tmp/myScript
echo " sleeping Create1to3Primary_Func()"
sleep 4s
if [ "$RawOrFs" == "f" ]; then
mkfsCMD="mkfs.$fsType"
mkfsFullTarget="$targetFull$i"
cmdline="$mkfsCMD $mkfsFullTarget -L 'Partition$i'"
echo "Creating $fsType File System on $mkfsFullTarget"
$cmdline
fi
void="/mnt/mymnt$i"
if [ ! -d $void ] ; then
echo "Creating Mount Point /mnt/mymnt$i"
void="/mnt/mymnt$i"
mkdir $void
fi
echo "Part Probe on $targetFull "
partprobe $targetFull ; sleep 4s
done
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*rol 15
不确定得到你真正想要的东西,但你可能会感兴趣的是sfdisk可以转储分区布局并使用这种布局来分区其他磁盘.例如:
sfdisk -d /dev/sda > mydiskpartitionslayout
Run Code Online (Sandbox Code Playgroud)
然后在你的脚本(照顾当然)你可以指定
sfdisk /dev/sdx < mydiskpartitionslayout
Run Code Online (Sandbox Code Playgroud)
磁盘
sfdisk 是一个脚本版本 fdisk
它是 的一部分util-linux,就像 一样fdisk,因此可用性应该相同。
可以使用以下命令创建具有占用整个磁盘的单个分区的分区表:
echo 'type=83' | sudo sfdisk /dev/sdX
Run Code Online (Sandbox Code Playgroud)
下面解释更复杂的分区表。
要生成示例脚本,请设置其中一个磁盘:
sudo sfdisk -d /dev/sda > sda.sfdisk
Run Code Online (Sandbox Code Playgroud)
我的 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
Run Code Online (Sandbox Code Playgroud)
将脚本保存到文件后,您可以将其应用于sdX:
sudo sfdisk /dev/sdX < sda.sfdisk
Run Code Online (Sandbox Code Playgroud)
对于sfdisk输入,您可以省略设备名称,并使用以下类型的行:
start= 2048, size= 3072000, type=7, bootable
Run Code Online (Sandbox Code Playgroud)
如果存在,它们将被忽略,并且设备名称取自命令行参数。
一些解释:
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:magic byte 存储在每个分区条目的引导扇区上。可能的值:https : //en.wikipedia.org/wiki/Partition_type在这个例子中,我们观察到:
7( sda1,2和3): Windows 支持的文件系统。预装 Windows 的东西和联想恢复分区。sudo blkid标签有助于识别它们。5( sda4): 扩展主分区,将包含其他逻辑分区(因为我们只能有 4 个带 MBR 的主分区)83( sda5, 7, 和8): Linux 支持的分区。对我来说,一个home和两个具有不同 Ubuntu 版本的根82( sd6): 交换fdisk还可以sfdisk使用I命令读取脚本,该命令在交互式fdisk会话期间“获取”脚本,允许您在写入分区之前进一步自定义。
在 Ubuntu sfdisk16.04、2.27.1上测试。
格式化并填充分区的图像文件,无需 sudo
这是一个学习使用sfdisk而不炸毁硬盘的好方法:如何在没有root权限的情况下创建多分区SD磁盘映像?