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

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

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

我认为可以这样做fdisk但我不知道如何将 Bash 脚本中的命令输入到fdiskshell 中然后退出fdiskshell。

我想创建一个分区,然后在 Bash 内部将其格式化为 NTFS。

答案1

与之前的建议类似,将命令传送到 fidsk,我发现这种方法对为后续维护者留下详细信息很有用。sed 位在 fdisk 获取输入之前删除所有注释。

# 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

答案2

磁盘管理

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

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

一些解释:

  • 标题行:全部可选:
    • label:分区表的类型。dos(主引导记录)是古老且得到广泛支持的,gpt新的闪亮事物。
    • unit:仅sector支持。1 个扇区通常等于 512 字节。使用 查找cat /sys/block/sda/queue/hw_sector_size。另请参阅:查找分区的扇区大小
    • device:我认为仅供参考
  • 分割线:
    • 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:每个引导扇区上存储的魔法字节分区条目. 此处可能的值:https://en.wikipedia.org/wiki/Partition_type通过这个例子我们可以看出:

      • 7sda123):Windows 支持的文件系统。预装的 Windows 内容和联想恢复分区。sudo blkid标签有助于识别它们。
      • 5sda4):扩展主分区,它将包含其他逻辑分区(因为 MBR 只能有 4 个主分区)
      • 83( sda578):Linux 支持的分区。对我来说,一个home,和两个具有不同 Ubuntu 版本的根目录
      • 82sd6): 交换

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

在 Ubuntu 16.04、2.27.1 上测试sfdisk

格式化并填充分区映像文件,无需sudo

这个答案是一种学习使用sfdisk而又不会炸毁硬盘的好方法。

答案3

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

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

答案4

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

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

对磁盘进行分区:

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

相关内容