关于如何制作一个不会用 bash 程序破坏设备的分区器有什么想法吗?

关于如何制作一个不会用 bash 程序破坏设备的分区器有什么想法吗?

因此,我正在尝试创建一个可以从我的网站获取的 bash 程序,该程序将执行安装 Arch 所需的所有功能,而无需投入所有工作。我需要它能够擦除磁盘、创建/删除分区以及安装程序。我遇到的问题是安全地擦除磁盘和创建/删除分区。我怎样才能做到这一点而不使设备变砖?

关于此资源的另一个问题(https://superuser.com/questions/332252/how-to-create-and-format-a-partition-using-a-bash-script

我看到了这段代码:

# 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

有人可以告诉我用户是否必须指定变量吗?我希望该程序能够运行所有分区命令,以便为用户带来便利。另外,这样安全吗?

答案1

您应该考虑使用sfdisk而不是fdisk

首先,要在磁盘上创建 gpt 分区表、EFI 分区和 EXT4 分区/dev/sda,您可以执行以下操作:

sfdisk -X gpt /dev/sda <<EEOF 
,+500M,U,
,,L,
write   
EEOF

如果您想要 DOS 而不是 GPT,请执行以下操作-X dos-X gpt

这将使用磁盘上剩余的可用空间创建一个 500mb 的 EFI 分区和一个 EXT4 分区/dev/sdaUV指明分区类型。其中VEFI分区和UEXT4分区。

如果您仍然想使用 fdisk。您将必须执行与以前类似的操作,但如果您覆盖旧的分区表,则可能会出现警告。这将需要用户输入(我认为你不想要)。

检查man sfdisk分区类型别名和更多信息。

需要考虑的事情:如果用户没有sda磁盘,则会失败。相反,我建议用户输入,这样用户可以在哪个磁盘中指定他想要安装 Arch。

read -p "Name of disk to install: " disk

然后你像以前一样做,但不是sda你使用$disk

sfdisk -X gpt /dev/$disk <<EEOF

创建分区后,记得格式化分区

答案2

该工具parted可能正是您所需要的。它相当于命令行gparted。我使用它在软 RAID 场景中对多个磁盘进行编程配置。

首先我使用辅助函数pdisk。如果你只是给它一个设备,它就会打印分区表。否则它会按照你给它的命令行动

pdisk() {
    local dev ="$1"
    shift
    test 0 -eq $# && set -- print
    parted "$dev" --align optimal unit MiB "$@"
}

这是设置 GPT 分区表的示例

d=/dev/sdz
pdisk "$d" --script mklabel gpt

pdisk "$d" mkpart primary fat32 1 511             # 511MB EFI
pdisk "$d" set 1 boot on
pdisk "$d" set 1 esp on

pdisk "$d" mkpart primary 511 512# 1MB Grub
pdisk "$d" set 2 bios_grub on

pdisk "$d" mkpart primary 512 $((512 + 20*1024))  # 20GB

pdisk "$d" mkpart primary $((512 + 20*1024)) 100% # Everything else

相关内容