web-dev-qa-db-ja.com

前のパーティションの後に次のパーティションを分割開始する-自動的に?

'ランダムな'文字のリストをfdiskにパイプするシェルスクリプトを継承しました。それがしていることは、次のようにディスクを分割することです:

空のディスク、パーティションテーブルなどを設定します。最初のパーティションサイズAを作成します。最初のパーティションの直後に、サイズYの2番目のパーティションを作成します。 2番目のパーティションの直後に、サイズXの3番目のパーティションを作成します。また、「fun」に追加するために、A、Y、およびXが計算され、使用可能な新しいディスクのサイズに応じて変更される場合があります。

Fdiskは、既存の位置に基づいて開始位置の入力を求め、「コード」は「リターン」をヒットし、これを受け入れます。

このコードは非常に不透明で、fdiskではなく 'parted --script...'の呼び出しに置き換えたいのですが、partedに '最後のパーティションの直後に開始するという方法があることがわかりません。 '。自分で開始位置を計算し続けなければならないようです。

私は正しいですか?もしそうなら、誰かがこれに対する賢明な解決策を持っていますか?

1
Paul D Smith

悪いスクリプトによって行われたすべての正確な複製を書く必要はありません。書き換えは、コードだけでなくロジックも修正する機会です。元のコードが何をするかを解読することから始めて、それからそれを何か正気に変えてください。

あなたの直接の質問に対する答えは「いいえ。あなたは自分で開始と終了を提供する必要があります」です。幸いなことに、それはそれほど難しいことではありません。

partedmkpartコマンドは、startおよびend引数を取ります(単位はデフォルトでメガバイトです)。パーティションを作成するときに指定する必要があります。例えばディスクイメージファイルの使用:

$ cat partition.sh 
#!/bin/sh

truncate -s 1G disk.img # create a 1G disk image file

parted -s disk.img mklabel msdos    # create the partition table

# make some partitions
parted -s disk.img mkpart primary 1 100
parted -s disk.img mkpart primary 101 200
parted -s disk.img mkpart primary 201 800
parted -s disk.img mkpart primary 801 1000

parted -s disk.img print

または、partedを1回だけ実行します。

#!bin/sh

truncate -s 1G disk.img # create a 1G disk image file

parted -s disk.img mklabel msdos \
  mkpart primary 1 100 \
  mkpart primary 101 200 \
  mkpart primary 201 800 \
  mkpart primary 801 1000 \
  print
$ ./partition.sh 
Model:  (file)
Disk /home/cas/stack-exchange/2018-01-03/pauldsmith/disk.img: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  99.6MB  98.6MB  primary
 2      101MB   200MB   99.6MB  primary
 3      201MB   800MB   599MB   primary
 4      801MB   1000MB  199MB   primary

難しいのは、パーティションの正確な開始値と終了値を計算して、セクターサイズに合わせて適切に配置することです。最初のパーティションは簡単です-1MBは512バイトと4Kセクターの両方に対応します。 1MBの正確な倍数で始まるパーティションも正しく配置されます(上記の例で作成されたすべてのパーティションは正しく配置されます)。

パーティションの開始値と終了値のいずれにもシェル変数を使用できます。これにより、シェル演算を使用してそれらを計算できます(ただし、シェル演算は整数のみであることに注意してください。次の場合はbcまたはdcを使用してください。浮動小数点またはパーセンテージの計算を行う必要があります)。

ところで、partedalign-checkコマンドで配置を確認できます。例えば.

$ parted disk.img align-check optimal 1
WARNING: You are not superuser.  Watch out for permissions.
1 aligned

align-checkparted-sスクリプトモードオプションとともに使用すると、出力は生成されません。代わりに、整列されていない場合はステータス1で終了します。それ以外の場合は、スクリプトの残りの部分に進みます。

partedにはif/then機能がないため、アライメントチェックとパーティション作成を自動化する場合は、上記のスクリプトの最初のバージョンを使用して、check-alignを挿入できるようにします。各mkpartの間にコマンドを入力し、終了コードがゼロ以外の場合は適切に応答します。

1
cas

partedを使用してエンドセクターを印刷できます。

$ parted /dev/sda 'unit s print'

Number  Start     End       Size      File system  Name     Flags
 1      2048s     1048575s  1046528s  fat32        primary  boot, esp
 2      1048576s  2095103s  1046528s  ext4         primary  raid

次に、次のパーティションは、最後のパーティションの後に+1セクターで開始されます。2095103s(前のパーティションのサイズが正しい単位で指定されていると仮定)。

(parted) mkpart primary 2095104s 100%

また、パーセントを使用して、計算をparted自体に任せることもできます。

0
Tombart