首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为多个分区编写sfdisk或parted脚本?

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

Stack Overflow用户
提问于 2012-08-27 21:52:11
回答 4查看 33.1K关注 0票数 11

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

我试图通过一个“这里的文档”在BASH和fdisk中实现这一点,这个文档可以工作,但是您可以猜到在不同的步骤中爆炸。我认为这是因为输入命令在错误的时间发生和不同步所致。我的脚本每10次就有1次工作正常。

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

我只使用过fdisk。

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

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

更新

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

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

所以命令是这样发送的:

代码语言:javascript
复制
n
p
1

+1M
w

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

对我起作用的fdisk的问题是,在您指定分区号之后,已经计算出了下一个空闲扇区,所以现在我所要做的就是为我的开始发送一个空行,然后为我的总大小发送+1M。从我所能看出的情况来看,拆分和sfdisk似乎并不是这样工作的,我在这方面仍然非常新,以了解如何在此时自动化这些工具。

代码语言:javascript
复制
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
}
EN

回答 4

Stack Overflow用户

发布于 2012-08-28 11:55:34

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

代码语言:javascript
复制
sfdisk -d /dev/sda > mydiskpartitionslayout

然后在脚本中(当然要注意),您可以指定

代码语言:javascript
复制
sfdisk /dev/sdx < mydiskpartitionslayout
票数 18
EN

Stack Overflow用户

发布于 2016-10-08 17:55:55

sfdisk

sfdiskfdisk的脚本版本

util-linuxfdisk一样,所以可用性应该是相同的。

可以使用以下方法创建包含整个磁盘的单个分区的分区表:

代码语言:javascript
复制
echo 'type=83' | sudo sfdisk /dev/sdX

下面将解释更复杂的分区表。

若要生成示例脚本,请获取磁盘的设置:

代码语言:javascript
复制
sudo sfdisk -d /dev/sda > sda.sfdisk

我的联想T430 Windows 7/ Ubuntu双引导的示例输出:

代码语言:javascript
复制
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

代码语言:javascript
复制
sudo sfdisk /dev/sdX < sda.sfdisk

对于sfdisk输入,可以省略设备名称,并使用类型行:

代码语言:javascript
复制
start=        2048, size=     3072000, type=7, bootable

如果存在,它们就会被忽略,设备名称将从命令行参数中获取。

一些解释:

  • 分区线:
代码语言:javascript
复制
- `start`: offset inside the disk at which the partition starts.

start具有非常好的缺省值,并且通常可以:

代码语言:javascript
复制
    - on the first line, `start` is 2048, i.e. 1Mb (2048 + 512), which is a sane default for disk compatibility
    - further `start` default to the first unallocated position 

代码语言:javascript
复制
- `size`: `man sfdisk` says: `The default value of size indicates "as much as possible"`. So to fill the disk with a single partition use: `/dev/sda : start=2048, type=83`
- `type`: magic byte stored on the boot sector for each [partition entry](https://en.wikipedia.org/wiki/Master_boot_record#PTE). Possible values: [https://en.wikipedia.org/wiki/Partition\_type](https://en.wikipedia.org/wiki/Partition_type) On this example we observe:  
    - `7` (`sda1`, `2` and `3`): filesystems that Windows supports. Preinstalled Windows stuff and Lenovo recovery partitions. `sudo blkid` labels help identify them.
    - `5` (`sda4`): extended primary partition, which will contain other logical partitions (because we can only have 4 primary partitions with MBR)
    - `83`(`sda5`, `7`, and `8`): partitions which Linux supports. For me one `home`, and two roots with different Ubuntu versions
    - `82` (`sd6`): swap

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

在Ubuntu16.04,sfdisk 2.27.1上测试。

在没有sudo的情况下,格式化并填充图像文件的分区

这是一个学习使用sfdisk而不炸毁硬盘的好方法:如何创建没有根权限的多分区SD磁盘映像?

票数 8
EN

Stack Overflow用户

发布于 2015-09-29 17:56:37

我喜欢的一种方法(我在这篇文章中看到过)是直接“编写”fdisk输入的脚本,因为它比sfdisk更聪明地创建分区“直到磁盘的末尾”或“2GB大”。示例:

代码语言:javascript
复制
echo "d
1
d
2
d
3
n
p
1

+2G
n
p
2


w
" | fdisk /dev/sda

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12150116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档