プログラムでディスクを分割

プログラムでディスクを分割

既存のパーティションがあるディスク上にファイルシステムで新しいパーティションを作成するbashスクリプトを作成しようとしています。

partedを使用してプログラムでパーティションを作成するのは簡単なようですが、新しいパーティションを開始および停止する場所を知る必要があり、ここで問題が発生しました。

特定の場所/サイズのパーティションがあるディスクに依存したくありません。つまり、最後の既存のパーティションの直後に新しいパーティションの作成を開始したいと思います。固定サイズのパーティションを作成するか、残りのスペースを埋めたいです。

Bashには信頼できる決定方法がありますか?

a) 最後のパーティションの終わり、
b) 最後のパーティションの後に分割されなかった残りのスペースはどこですか?

答え1

parted利用可能なスペースを印刷できます。はい(いくつかの複雑なものを選択しました):

# parted /dev/sda unit s print free
[...]
Number  Start      End        Size       Type      File system  Flags
        63s        2047s      1985s                Free Space
 1      2048s      4196351s   4194304s   primary   fat32        lba
        4196352s   4198399s   2048s                Free Space
 2      4198400s   6295551s   2097152s   primary   ext2         boot
        6295552s   6297599s   2048s                Free Space
 3      6297600s   27269119s  20971520s  primary   ext2
        27269120s  27271167s  2048s                Free Space
 4      27271168s  31115263s  3844096s   extended               lba
 5      27273216s  29192191s  1918976s   logical   ext2
 6      29194240s  31115263s  1921024s   logical   ext2
        31115264s  31116287s  1024s                Free Space

ご覧のとおり、これは作成できるパーティションの場所とサイズを直接提供します。これは最後の行に表示されますFree Space。 31115264sで始まり、31116287sで終わるパーティションを作成できます。

拡張パーティションが十分に大きくない場合、これはトラップです!

しかし、すでにGPTを使用しており、そのような問題に苦しんでいない可能性があります。

数字を取得するのは簡単です。

function make_partition
{
    parted -s "$1" unit s mkpart primary "$2" "$3"
}

make_partition /dev/sda `parted /dev/sda unit s print free | grep 'Free Space' | tail -n 1`

またはそのようなもの。 (もちろん、ここでより完全な検査を実行したいと思います。)

parted@swisscheeseは他の答えから良いコメントを提示しましたが、構文解析に適した出力が提供されたことを知りませんでした。選択して使用してください。最後に最大の無料を得る例:

# parted -m /dev/sda unit s print free | grep 'free;' | sort -t : -k 4n -k 2n | tail -n 1
1:27269120s:27271167s:2048s:free;

これがあなたのケースに当てはまるかどうか(私の例ではパーティションを作成することができず、実際にいっぱいでした)はあなたが直接見つけなければなりません。 :)

答え2

簡単です。オプションがmkpartedあります。を使用して最後のパーティションを検索してからを使用する必要が--listあります。awk--listmkpart part-type [fs-type] start end

しかし、あなたの答えは次のとおりです

まず、すべてのパーティションをインポートして次を使用する必要があります。

mystartgroup=`parted --list |awk {'print $2'}`
myendgroup=`parted --list |awk {'print $3'}`

メモ:

  1. GBに変換する必要がありますMG
  2. 各値の最後の値を使用する必要があります。variable
  3. -s最終スクリプトでこれを使用する必要がありますparted command

時間があればこのスクリプトを完成してください。時間がなくてすみません。

関連情報