【问题标题】:How to script sfdisk or parted for multiple partitions?如何为多个分区编写 sfdisk 或 parted 脚本?
【发布时间】:2012-08-27 21:52:11
【问题描述】:

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

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

我看过 parted 和 sfdisk 并不太了解如何使用这些工具。

我只用过 fdisk。

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

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

更新

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

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

所以命令是这样发送的:

n
p
1

+1M
w

我一直在阅读 fdisk 并了解到它不适合编写脚本,所以我看到的是,在脚本模式下,fdisk 可能会要求 p 我的脚本已经认为是时候发送 @ 987654323@.

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
}

【问题讨论】:

  • 向我们展示您的代码。根据您当前的描述无法诊断此问题。祝你好运。

标签: bash partitioning


【解决方案1】:

不确定是否得到您真正想要的,但您可能对sfdisk 可以转储分区布局并使用此布局对其他磁盘进行分区这一事实感兴趣。例如:

sfdisk -d /dev/sda > mydiskpartitionslayout

然后在你的脚本中(当然要小心)你可以指定

sfdisk /dev/sdx < mydiskpartitionslayout

【讨论】:

  • 只要确保您没有将 GPT 与 sfdisk 一起使用。不支持组合。
  • 从 2.26 版开始,sfdisk 支持 GPT(以及 MBR (DOS)、SUN 和 SGI)
  • 只是为了更新这个答案,大多数发行版现在包括gdisksgdisk,它们是fdisksfdisk 的GPT 并行实用程序。所以这个答案仍然是最好的回应,但如果你想要 GPT 分区,你应该使用上面的命令语法,使用 gdisksgdisk 而不是 fdisksfdisk
【解决方案2】:

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 标签有助于识别它们。
      • 5 (sda4):扩展主分区,将包含其他逻辑分区(因为我们只能有4个主分区带MBR)
      • 83(sda578):Linux支持的分区。对我来说,一个 home 和两个不同 Ubuntu 版本的根
      • 82 (sd6):交换

fdisk 还可以使用I 命令读取sfdisk 脚本,该命令在交互式fdisk 会话期间“获取”它们,允许您在写入分区之前进一步自定义。

在 Ubuntu 16.04,sfdisk2.27.1 上测试。

格式化并填充没有sudo的映像文件的分区

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

【讨论】:

  • 关于size字段,最后一个分区可以省略,以填满剩余的磁盘空间。例如,如果 sda4 是最后一个分区,可以使用: /dev/sda4 : start= 2664448, Id=83
【解决方案3】:

我喜欢的一种方法(我在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 中创建并使用分区布局,如果有更多可用空间,脚本将不会覆盖整个磁盘。

【讨论】:

    【解决方案4】:

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

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

    yum 安装期望

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

    apt-get 安装期望

    下面是创建分区/dev/sdc的expect脚本


    !/usr/bin/expect

    log_file -a "/tmp/expect.log"

    设置超时 600

    生成 /sbin/fdisk /dev/sdc

    expect "Command (m for help): " { send "n\r" }

    期望“p 主分区 (1-4)”

    期望 "" { 发送 "p\r" }

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

    期望“第一个圆柱体(1-133544,默认 1):” { 发送“1\r” }

    期望 ": " { 发送 "\r" }

    expect "Command (m for help): " { send "w\r" }

    互动

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      相关资源
      最近更新 更多