因此,我正在尝试创建一个可以从我的网站获取的 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/sda
。
U
并V
指明分区类型。其中V
EFI分区和U
EXT4分区。
如果您仍然想使用 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