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


62

有什么方法可以使用bash脚本创建和格式化分区吗?

我认为可以用fdisk完成,但是我不知道如何将bash脚本中的命令输入fdisk外壳,然后退出fdisk外壳。

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

Answers:


70

与以前的建议类似,将命令传递到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

3
我完全同意。记录您的工作,以供他人阅读。
埃里克·邓肯

1
请注意,您必须在每行上都有一个前导标签。
斯图

2
您介意发出一个大警告,即@Stu提到的每个命令字符行都需要一个制表符吗?我不得不调试一段时间,因为复制粘贴会忽略制表符并将其替换为空格,因此正则表达式与命令行不匹配。
ceremcem

9
我没有修改关于选项卡的警告,而是修改了sed,使其放弃前导空格(不仅仅是选项卡),并且不希望在fdisk命令后出现选项卡。这样可以更好地剪切和粘贴。@ceremcem-良好的反馈,很抱歉给您带来任何调试时间。
user2070305 '16

3
sfdiskfdisk
spuder

64

磁盘

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

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

一些解释:

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

    • start:在分区开始的磁盘内偏移。

      start 具有非常好的默认值,并且通常可以忽略:

      • 第一行start是2048,即1Mb(2048 + 512),这是磁盘兼容性的默认设置
      • 进一步start默认为第一个未分配位置
    • sizeman 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资料和Lenovo恢复分区。sudo blkid标签有助于识别它们。
      • 5sda4):扩展的主分区,它将包含其他逻辑分区(因为我们只有4个具有MBR的主分区)
      • 83sda578):Linux支持的分区。对我来说home,两个根源使用不同的Ubuntu版本
      • 82sd6):交换

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


4
天哪,这太神奇了。我以前使用过fdisk,但是如果您不小心将其确切地放在了已经存在分区的位置,它将需要用户验证它通常不需要的分区,这很糟糕。sfdisk很棒,谢谢!
TaborKelly

3
这应该是公认的答案
shrewmouse

55

fdiskstdin读取,因此您只需要提供适当的命令即可。例如,下面的命令清除分区表(如果有的话),并创建一个新分区,该分区表具有一个分区。整个磁盘:

(
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
尽管回声命令比公认的答案更为冗长,但这似乎没有那么神奇和令人困惑。
Henry Heikkinen

1
我个人建议使用printf而不是echo仅仅养成在整个系统中使用行为一致的习惯。
greatlysuperiorman

37

您只需执行几个命令即可完成操作,使用简介\ n代替多个回显。

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda

这比其他方法更简洁,但不幸的是,似乎仅适用于bash。
bk138

它也与ash / busybox一起使用。
kikeenrique

2
之后是否还\n需要另一个w
钱琛

6
这行得通,但太可怕了:-)
Ciro Santilli新疆改造中心法轮功六四事件

2
@ElgsQianChen:否,因为会echo自动以换行符终止行(除非使用了-n选项)
Udo G

5

您可以编写脚本fdisk

(echo n; echo p; echo 1; echo 1; echo 200; echo w) | fdisk /dev/sdc

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


优雅的答案!
Gangadhar Jannu '18

5

如其他人所述,将命令传递到fdisk的效果很好,但是这种方式更简洁易读:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

从(临时)文件进行管道传输也可以:

fdisk /dev/sdc < /tmp/fdisk.cmds

这个得到我的投票。它很干净,并且不会因运行中的注释而受到污染。
大卫·贝兹

5

创建一个新的disklabel类型gpt:

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

分区磁盘:

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


谢谢,这对我来说是唯一干净的解决方案,因为它不包括将某种形式的“ space Opera.docx”管道输送到fdisk。
贝尼布尔

1
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda

2
新用户常犯的一个常见错误是,在没有详细说明如何实际解决问题的情况下进行回答。答案应该详细,并根据需要提供参考。请花几分钟来编辑您的答案,以包括您的答案为何有效的详细信息。如果需要帮助,请阅读如何写一个好的答案?。另外,请意识到您已经发布了一个非常老的问题的答案,该答案已经被接受。尽管这样做没有错,但是您可能不会从OP那里得到答复。
CharlieRB


0

该脚本使用fdisk根据其他人的答案创建分区。

在脚本中更改以下内容:

NUM_PARTITIONS = 5

PARTITION_SIZE =“ + 10G”

脚本后给出了用法示例。

#!/bin/bash
if [ $# -eq 0 ]
then
  echo "input the device"
  exit
fi

NUM_PARTITIONS=5
PARTITION_SIZE="+10G"    

SED_STRING="o"
TAIL="p
w
q
"

NEW_LINE="
"
LETTER_n="n"
EXTENDED_PART_NUM=4
TGTDEV=$1

SED_STRING="$SED_STRING$NEW_LINE"
for i in $(seq $NUM_PARTITIONS)
do
  if [ $i -lt $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
  if [ $i -eq $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$NEW_LINE$NEW_LINE"
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
  if [ $i -gt $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
done
SED_STRING="$SED_STRING$TAIL"

sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk ${TGTDEV}
  $SED_STRING
EOF

运行:

须藤sh mk_partition.sh / dev / sdxxx


-2
#!/bin/sh
hdd="/dev/hda /dev/hdb /dev/hdc"
for i in $hdd;do
echo "n
p
1


w
"|fdisk $i;mkfs.ext3 "$i1";done 

您可以使用此脚本。只要确保定义了自己的分区即可hdd1和之间有2个空格w。他们需要在那里使用默认值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.