web-dev-qa-db-ja.com

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

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

私はそれがfdiskで実行できると思いますが、bashスクリプトからfdiskシェルにコマンドを入力してからfdiskシェルを終了する方法がわかりません。

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

56
GlassGhost

これまでの提案、fidskへのコマンドのパイピングと同様に、私はこのアプローチがその後のメンテナに詳細を残すのに役立つことを見つけました。 fdiskが入力を受け取る前にsedビットはすべてのコメントを取り除きます。

# 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
64
user2070305

fdiskstdinから読み取るので、適切なコマンドを入力するだけで済みます。たとえば、次の例では、パーティションテーブルがある場合はそれをクリアし、新しいパーティションを1つ作成します。ディスク全体

(
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

私はあなたがあなたがそれを再生できるようにあなたがタイプしたものを記録するあなたが望むタスクをすることを勧めます。

55
e40

sfdisk

sfdiskname__はfdiskname__のスクリプト版です。

fdiskNAME__と同じように、これはutil-linux の一部であるため、可用性は同じである必要があります。

ディスク全体を占める単一のパーティションを持つパーティションテーブルは、次のように作成できます。

echo 'type=83' | Sudo sfdisk /dev/sdX

より複雑なパーティションテーブルについては、以下で説明します。

サンプルスクリプトを生成するには、ディスクの1つの設定を取得してください。

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

スクリプトをファイルに保存したら、次のようにしてそれをsdXname__に適用できます。

Sudo sfdisk /dev/sdX < sda.sfdisk

sfdiskname__入力の場合は、デバイス名を省略して、以下のタイプの行を使用することができます。

start=        2048, size=     3072000, type=7, bootable

これらは存在しても無視され、デバイス名はコマンドライン引数から取得されます。

いくつかの説明:

  • ヘッダー行:すべてオプション:
  • 分割線:

    • startname__:パーティションが始まるディスク内のオフセット。

      startname__には非常に優れたデフォルトがあり、しばしば省略することができます。

      • 1行目のstartname__は、2048、つまり1Mb(2048 + 512)です。これは、ディスク互換性のための正しいデフォルトです。
      • さらにstartname__のデフォルトは最初の未割り当て位置
    • sizename__:man sfdiskの意味はThe default value of size indicates "as much as possible"です。そのため、単一のパーティションでディスクをいっぱいにするには、次のように使用します。/dev/sda : start=2048, type=83

    • typename__:各 パーティションエントリのブートセクタに格納されているマジックバイト 。可能な値: https://en.wikipedia.org/wiki/Partition_type この例では、次のようになります。
      • 7sda12および3):WindowsがサポートするファイルシステムプレインストールされたWindowsのものとLenovoの回復パーティション。 Sudo blkidラベルはそれらを識別するのに役立ちます。
      • 5sda4):拡張基本区画。他の論理区画を含みます(MBRでは4つの基本区画しか持てないため)。
      • 83sda57、および8):Linuxがサポートするパーティション私にとっては1つのhomename__、そして異なる2つのUbuntuバージョンを持つ2つのルート
      • 82sd6):スワップ

fdiskname__では、sfdiskname__コマンドを使用してIname__スクリプトを読み取ることもできます。これにより、対話式のfdiskname__セッション中にスクリプトが「読み込まれ」、パーティションを作成する前にさらにカスタマイズできます。

Ubuntu 16.04のsfdisk2.27.1でテスト済み。

SudoNAMEを指定せずにパーティションをフォーマットしてイメージファイルを作成します_

これはあなたのハードディスクを壊さずにsfdiskname__を使うことを学ぶのに良い方法です: root権限なしのsdディスクイメージ/ 52850819#52850819

あなたはほんの2、3のコマンドでそれをすることができます、複数のエコーの代わりにintros\ nを使ってください。

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

Fdiskへのコマンドのパイプ処理は他の人が説明したようにうまく機能しますが、これによりもう少しエレガントで読みやすくなります。

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

(一時的な)ファイルからパイプすることもできます。

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

あなたはfdiskをスクリプトすることができます。

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

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

5
ron

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

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

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

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

4
Bruce Davis
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda

このスクリプトは、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

0
Paul Justin