bashスクリプトを使用してパーティションを作成およびフォーマットする方法は?


62

bashスクリプトを使用してパーティションを作成およびフォーマットする方法はありますか?

fdiskでできると思いますが、bashスクリプトからfdiskシェルにコマンドを送り、fdiskシェルを終了する方法がわかりません。

パーティションを作成してから、bash内からntfsにフォーマットしたいです。

回答:


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が述べたように、各コマンド文字行にタブが必要であるという大きな警告表示してもいいですか?コピーアンドペーストではタブが無視され、スペースで置き換えられるため、しばらくデバッグする必要がありました。したがって、正規表現はコマンドラインと一致しません。

9
タブに関する警告の代わりに、stabを変更して、先頭の空白(タブだけでなく)を破棄し、fdiskコマンドの後にタブを期待しないようにしました。これにより、カットアンドペーストが改善されます。@ceremcem-良いフィードバックであり、デバッグ時間をおかけして申し訳ありません。
user2070305

3
sfdiskより自動化に適しているfdisk
17

65

sfdisk

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この例では、次のことがわかります。
      • 7sda12および3):Windowsがサポートするファイルシステム。プリインストールされたWindowsスタッフとLenovoリカバリパーティション。sudo blkidラベルはそれらを識別するのに役立ちます。
      • 5sda4):拡張プライマリパーティション。他の論理パーティションが含まれます(MBRを持つプライマリパーティションは4つしか持てないため)
      • 83sda57、および8):Linuxはサポートしてパーティションが。私にとってはhome、Ubuntuのバージョンが異なる1つ、および2つのルート
      • 82sd6):スワップ

fdiskまたsfdiskIコマンドを使用してスクリプトを読み取ることもできます。このコマンドは、対話型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- privilege / 52850819#52850819


4
OMGこれはすごい。以前にfdiskを使用したことがありますが、パーティションが既にある場所に誤って着地した場合、通常は必要ないことをユーザーに確認する必要があります。sfdiskは素晴らしいです、ありがとう!
タボールケリー

3
これは受け入れられた答えであるはずです
じゃじゃ馬ならし

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
受け入れられた答えよりもエコーコマンドの方が少し冗長ですが、これは魔法的で難読化されていないようです。
ヘンリーヘイキネン

1
私は個人的に、システム全体で一貫して動作するものを使用する習慣にするためだけに使用するのではprintfなく、使用することをお勧めしechoます。
広大なスーパーマン

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オプションが使用されている)
ウドG

5

スクリプトを作成できますfdisk

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

これにより、200 MBのパーティションが作成されます /dev/sdc


エレガントな答え!
ガンガダールヤンヌ

5

コマンドをfdiskに渡すことは、他の人が説明したようにうまく機能しますが、この方法はもう少しエレガントで読みやすいです:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

(一時)ファイルからのパイピングも機能します。

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

これは私の票を得ます。それはきれいで、実行中の解説で汚染されていません。
デビッドベッツ

5

新しいディスクラベルタイプgptを作成します。

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

ディスクをパーティション分割します。

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


ありがとう、これはfdiskにある種の「space opera.docx」をパイピングすることを含まないので、私にとって唯一のきれいな解決策です。
ベニブル

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

2
新しいユーザーが犯すよくある間違いは、実際に問題を解決する方法の詳細なしで答えることです。回答は詳細であり、必要に応じて参照を含める必要があります。回答を編集して、回答が有効な理由の詳細を含めるには数分かかります。助けが必要な場合は、「良い答えを書くにはどうすればよいですか?」。また、受け入れられた回答がある非常に古い質問への回答を投稿したことを認識してください。そうすることに間違いはありませんが、OPから応答が得られない場合があります。
チャーリーRB


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

で実行:

sudo 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 

このスクリプトを使用できます。hdd定義されている場所に独自のパーティションを定義してください。1との間には2つの空白がありwます。デフォルト値を取得するために存在する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.