如何编写sfdisk脚本或为多个分区分开?

时间:2012-08-27 21:52:12

标签: bash partitioning

出于QA目的,我需要能够通过bash脚本将驱动器分区为RHEL和SLES最多30个或更多分区。

我曾尝试在BASH中使用fdisk通过“here document”进行此操作,但是您可以通过各种步骤进行猜测。我认为这是因为输入命令的时间发生在错误的时间并且不同步。 10次​​中有1次我的脚本可以正常工作。

我查看了parted和sfdisk,并不真正了解如何使用这些工具。

我只使用过fdisk。

我的问题是,使用fdisk你可以一遍又一遍地说出“new partition + 1gb”之类的东西,这对我有用,因为在我的脚本中我不需要跟踪先前的分区或剩余空间或进行任何计算。每次运行此函数时,这只会从任何未使用的空间中创建一个额外的1gb分区。

有没有办法使用parted或sfdisk(或任何其他已经成为这些发行版的一部分的工具),这样我就可以编写从1到x操作的循环脚本,而不必对剩余空间进行这种计算?有没有人有他们可以分享的任何例子?

更新

以下是我的一个功能示例。在脚本开始时,我们询问用户要创建的分区数量,它们的大小(这对所有人来说都是静态的),以及FS的类型(如果有的话)。此函数创建分区1到3,然后另一个函数处理扩展(第4),另一个处理第5到nn。

正如我之前所说,这个脚本功能齐全;我的问题是,有时发送到fdisk的命令似乎到达了错误的时间,然后打破了整个脚本,从而破坏了任何自动化。

所以命令的发送方式如下:

n
p
1

+1M
w

我一直在读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
}

4 个答案:

答案 0 :(得分:15)

不确定得到你真正想要的东西,但你可能会感兴趣的是sfdisk可以转储分区布局并使用此布局来分区其他磁盘。例如:

sfdisk -d /dev/sda > mydiskpartitionslayout

然后在你的脚本中(注意当然)你可以指定

sfdisk /dev/sdx < mydiskpartitionslayout

答案 1 :(得分:4)

<强>了sfdisk

sfdiskfdisk

的脚本版本

It is part of 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

如果存在则忽略它们,并且设备名称取自命令行参数。

一些解释:

  • 标题行:全部可选:
  • 分区线:

    • start:分区启动时磁盘内的偏移量。

      start具有非常好的默认值,通常可以省略:

      • 在第一行,start为2048,即1Mb(2048 + 512),这是磁盘兼容性的合理默认值
      • 进一步start默认为第一个未分配的位置
    • sizeman sfdisk说:The default value of size indicates "as much as possible"。因此,要使用单个分区填充磁盘,请使用:/dev/sda : start=2048, type=83

    • type:每个partition entry存储在引导扇区上的魔术字节。可能的值:https://en.wikipedia.org/wiki/Partition_type在此示例中,我们观察到:
      • 7sda123):Windows支持的文件系统。预装Windows的东西和联想恢复分区。 sudo blkid标签有助于识别它们。
      • 5sda4):扩展主分区,包含其他逻辑分区(因为我们只能有4个主分区和MBR)
      • 83sda578):Linux支持的分区。对我来说,一个home和两个具有不同Ubuntu版本的根
      • 82sd6):swap

fdisk也可以使用sfdisk命令读取I个脚本,其中&#34;来源&#34;在交互式fdisk会话期间,它们允许您在编写分区之前进一步自定义。

在Ubuntu 16.04上测试,sfdisk 2.27.1。

在没有sudo

的情况下格式化并填充分区的图像文件

这是学习使用sfdisk而不会炸毁硬盘的好方法:How to create a multi partition SD disk image without root privileges?

答案 2 :(得分:1)

我喜欢的方法(我在this article中看到的)是直接“编写”fdisk输入,因为它比sfdisk更聪明地创建分区“直到磁盘末尾”或“2 GB大” ”。例如:

echo "d
1
d
2
d
3
n
p
1

+2G
n
p
2


w
" | fdisk /dev/sda

此脚本最多删除3个现有分区,创建一个2 GB分区(例如交换),然后创建一个扩展到剩余磁盘空间的分区。

相反,如果在sfdisk中创建并使用了分区布局,则如果有更多可用空间,则脚本将不会覆盖整个磁盘。

答案 3 :(得分:0)

自动化重复任务是自动化生活中的常态,如果我们要将这些程序包含在我们的脚本中,我们需要一种自动提供这些程序答案的方法。

这是一个名为“Expect”的程序自动执行的地方。对于基于Red Hat的系统,执行以下命令安装“Expect”

yum install expect

对于基于Debian或Ubuntu,请执行以下命令。

apt-get install expect

下面是创建分区/ dev / sdc

的expect脚本

!在/ usr / bin中/期望

log_file -a“/tmp/expect.log”

设置超时600

spawn / sbin / fdisk / dev / sdc

期望“命令(m求助):”{send“n \ r”}

期待“p primary partition(1-4)”

期待“”{发送“p \ r”}

期望“分区号码(1-4):”{发送“1 \ r”}

期待“第一个气缸(1-133544,默认1):”{发送“1 \ r”}

期待“:”{发送“\ r”}

期望“Command(m for help):”{send“w \ r”}

相互作用