Bashスクリプトを使ってパーティションを作成しフォーマットする方法はありますか?
私はそれがfdiskで実行できると思いますが、bashスクリプトからfdiskシェルにコマンドを入力してからfdiskシェルを終了する方法がわかりません。
私はパーティションを作成し、それをbash内からntfsにフォーマットしたいのです。
これまでの提案、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
fdisk
はstdinから読み取るので、適切なコマンドを入力するだけで済みます。たとえば、次の例では、パーティションテーブルがある場合はそれをクリアし、新しいパーティションを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
私はあなたがあなたがそれを再生できるようにあなたがタイプしたものを記録するあなたが望むタスクをすることを勧めます。
sfdisk
sfdisk
name__はfdisk
name__のスクリプト版です。
fdisk
NAME__と同じように、これは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
スクリプトをファイルに保存したら、次のようにしてそれをsdX
name__に適用できます。
Sudo sfdisk /dev/sdX < sda.sfdisk
sfdisk
name__入力の場合は、デバイス名を省略して、以下のタイプの行を使用することができます。
start= 2048, size= 3072000, type=7, bootable
これらは存在しても無視され、デバイス名はコマンドライン引数から取得されます。
いくつかの説明:
label
name__:パーティションテーブルの種類。 dos
name__(MBR) は古くから広くサポートされているものです、 gpt
NAME _ 新しい光沢のあるもの。unit
name__:sector
name__のみがサポートされています。 1セクタは通常512バイトです。 cat /sys/block/sda/queue/hw_sector_size
で検索関連項目: https://unix.stackexchange.com/questions/2668/finding-the-sector-size-of-a-partitiondevice
name__:情報提供のみ分割線:
start
name__:パーティションが始まるディスク内のオフセット。
start
name__には非常に優れたデフォルトがあり、しばしば省略することができます。
start
name__は、2048、つまり1Mb(2048 + 512)です。これは、ディスク互換性のための正しいデフォルトです。start
name__のデフォルトは最初の未割り当て位置size
name__:man sfdisk
の意味はThe default value of size indicates "as much as possible"
です。そのため、単一のパーティションでディスクをいっぱいにするには、次のように使用します。/dev/sda : start=2048, type=83
type
name__:各 パーティションエントリのブートセクタに格納されているマジックバイト 。可能な値: https://en.wikipedia.org/wiki/Partition_type この例では、次のようになります。7
(sda1
、2
および3
):WindowsがサポートするファイルシステムプレインストールされたWindowsのものとLenovoの回復パーティション。 Sudo blkid
ラベルはそれらを識別するのに役立ちます。5
(sda4
):拡張基本区画。他の論理区画を含みます(MBRでは4つの基本区画しか持てないため)。83
(sda5
、7
、および8
):Linuxがサポートするパーティション私にとっては1つのhome
name__、そして異なる2つのUbuntuバージョンを持つ2つのルート82
(sd6
):スワップfdisk
name__では、sfdisk
name__コマンドを使用してI
name__スクリプトを読み取ることもできます。これにより、対話式のfdisk
name__セッション中にスクリプトが「読み込まれ」、パーティションを作成する前にさらにカスタマイズできます。
Ubuntu 16.04のsfdisk
2.27.1でテスト済み。
Sudo
NAMEを指定せずにパーティションをフォーマットしてイメージファイルを作成します_
これはあなたのハードディスクを壊さずにsfdisk
name__を使うことを学ぶのに良い方法です: root権限なしのsdディスクイメージ/ 52850819#52850819
あなたはほんの2、3のコマンドでそれをすることができます、複数のエコーの代わりにintros\ nを使ってください。
echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda
Fdiskへのコマンドのパイプ処理は他の人が説明したようにうまく機能しますが、これによりもう少しエレガントで読みやすくなります。
fdisk /dev/sdc <<EOF
n
p
1
w
EOF
(一時的な)ファイルからパイプすることもできます。
fdisk /dev/sdc < /tmp/fdisk.cmds
あなたはfdisk
をスクリプトすることができます。
(echo n; echo p; echo 1; echo 1; echo 200; echo w) | fdisk /dev/sdc
/dev/sdc
に200 MBのパーティションが作成されます。
新しいディスクラベルタイプgptを作成します。
Sudo /sbin/parted /dev/xvdf mklabel gpt --script
ディスクをパーティション分割します。
Sudo /sbin/parted /dev/xvdf mkpart primary 0% 100% --script
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