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我的脚本已经认为是时候发送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

4 回答 4

18

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

sfdisk -d /dev/sda > mydiskpartitionslayout

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

sfdisk /dev/sdx < mydiskpartitionslayout
于 2012-08-28T11:55:34.237 回答
8

磁盘

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

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

一些解释:

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

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

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

在 Ubuntu sfdisk16.04、2.27.1 上测试。

格式化并填充分区的图像文件,而不sudo

sfdisk这是在不炸毁硬盘的情况下学习使用的好方法:如何在没有root权限的情况下创建多分区SD磁盘映像?

于 2016-10-08T17:55:55.677 回答
1

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

于 2015-09-29T17:56:37.843 回答
0

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

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

百胜安装期望

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

apt-get 安装期望

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


!/usr/bin/expect

log_file -a "/tmp/expect.log"

设置超时 600

生成 /sbin/fdisk /dev/sdc

期望“命令(m寻求帮助):” {发送“n\r”}

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

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

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

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

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

期望“命令(m寻求帮助):” {发送“w\r”}

相互作用

于 2017-12-12T09:54:45.150 回答