如何使用 bash 脚本创建和格式化分区?

Gla*_*ost 83 ntfs bash partitioning fdisk

有没有办法使用bash脚本创建和格式化分区?

我认为它可以用 fdisk 完成,但我不知道如何将命令从 bash 脚本输入 fdisk shell,然后退出 fdisk shell。

我想创建一个分区,然后在 bash 中将其格式化为 ntfs。

Cir*_*郝海东 98

磁盘

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)

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

一些解释:

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

    • 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,23): 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不炸毁硬盘的情况下学习使用的好方法:https : //stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root-特权/52850819#52850819

  • 天哪,这太神奇了。我以前使用过 fdisk,但是如果您不小心落在已经有分区的地方,它会需要用户验证它通常不需要的验证,这很糟糕。sfdisk 很棒,谢谢! (4认同)
  • 这应该是公认的答案 (3认同)

use*_*305 82

与之前的建议类似,将命令传递给 fidsk,我发现这种方法对于为后续维护人员留下详细信息很有用。在 fdisk 获得输入之前,sed 位会去除所有注释。

# to create the partitions programatically (rather than manually)
# we're going to simulate the manual input to fdisk
# The sed script strips off all the comments so that we can 
# document what we're doing in-line with the actual commands
# Note that a blank line (commented as "defualt" will send a empty
# line terminated with a newline to take the fdisk default.
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk ${TGTDEV}
  o # clear the in memory partition table
  n # new partition
  p # primary partition
  1 # partition number 1
    # default - start at beginning of disk 
  +100M # 100 MB boot parttion
  n # new partition
  p # primary partition
  2 # partion number 2
    # default, start immediately after preceding partition
    # default, extend partition to end of disk
  a # make a partition bootable
  1 # bootable partition is partition 1 -- /dev/sda1
  p # print the in-memory partition table
  w # write the partition table
  q # and we're done
EOF
Run Code Online (Sandbox Code Playgroud)

  • 我没有对选项卡发出警告,而是修改了 sed 以丢弃前导空格(不仅仅是选项卡),并且不希望在 fdisk 命令之后出现选项卡。这应该更好地剪切和粘贴。@ceremcem - 良好的反馈,很抱歉给您带来任何调试时间。 (14认同)
  • 我完全同意。记录您的工作以供他人阅读。 (4认同)
  • 您是否介意像@Stu 提到的那样在每个命令行字符行上放置一个 **大警告** 需要一个制表符?我不得不调试一段时间,因为复制粘贴会忽略制表符并用空格替换它们,因此正则表达式与命令行不匹配。 (3认同)
  • `sfdisk` 比 `fdisk` 更加自动化友好 (3认同)
  • 请注意,每行都必须有一个前导制表符。 (2认同)

e40*_*e40 69

fdisk标准输入读取,所以你只需要给它提供适当的命令。例如,以下清除分区表,如果有,并创建一个具有单个分区的新分区表;整个磁盘:

(
echo o # Create a new empty DOS partition table
echo n # Add a new partition
echo p # Primary partition
echo 1 # Partition number
echo   # First sector (Accept default: 1)
echo   # Last sector (Accept default: varies)
echo w # Write changes
) | sudo fdisk
Run Code Online (Sandbox Code Playgroud)

我建议你做你想做的任务,记录你输入的内容,以便你可以重现它。

  • 虽然 echo 命令比接受的答案更冗长,但这似乎不那么神奇和混淆。 (6认同)

kik*_*que 42

你可以只用几个命令来完成,使用 intros \n而不是多个回声。

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但很可怕:-) (6认同)
  • `w` 之后还需要另一个 `\n` 吗? (2认同)
  • @ElgsQianChen:不,因为`echo` 自动用换行符终止该行(除非使用`-n` 选项) (2认同)

Bru*_*vis 10

创建一个新的磁盘标签类型 gpt:

sudo /sbin/parted /dev/xvdf mklabel gpt --script

对磁盘进行分区:

sudo /sbin/parted /dev/xvdf mkpart primary 0% 100% --script

  • 谢谢,这对我来说是唯一干净的解决方案,因为它不包括将某种“space opera.docx”通过管道传输到 fdisk。 (2认同)

小智 7

您可以编写脚本fdisk

(echo n; echo p; echo 1; echo 1; echo 200; echo w) | fdisk /dev/sdc
Run Code Online (Sandbox Code Playgroud)

这将创建一个 200 MB 的分区 /dev/sdc

  • 优雅的回答! (2认同)

Ray*_*Ray 7

正如其他人所解释的那样,将命令传递到 fdisk 效果很好,但这种方式更加优雅和可读:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF
Run Code Online (Sandbox Code Playgroud)

从(临时)文件进行管道传输也有效:

fdisk /dev/sdc < /tmp/fdisk.cmds
Run Code Online (Sandbox Code Playgroud)