プログラムでディスクをパーティション分割する


10

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

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

特定の位置/サイズのパーティションを持つディスクに依存したくありません。つまり、最後の既存のパーティションの直後から新しいパーティションを作成したいと考えています。次に、固定サイズのパーティションを作成したり、残りのスペースを埋めたりできるようにしたいと考えています。

バッシュでは、信頼できる方法で判断できますか

a)最後のパーティションの終了位置、および
b)最後のパーティション後の残りのパーティション化されていないスペース?


1
あなたがそれをすることができたとしても、私はしません。誤植がここで与えるダメージの種類を想像してみてください
ジョセフR.

しないでください。一部のディストリビューションのインストーラーには、パーティショナーがあり、それを作成するのは簡単ではありません。コーナーケースが多すぎて、失敗することが多すぎます。しないでください。もしそうなら、それはオペレーターによって承認されなければならない提案された構成を生成させます。
peterph 2013

これは危険だと思う。ただし、これはディスク上のすべてのパーティションを消去することから始まるスクリプトなので、後でパーティションを台無しにすることは大したことではありません。唯一のリスクは、ユーザーが間違ったディスクを指定することです。これは、どのパーティションツールでも同じくらい簡単です。
Alex

回答:


4

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。31115264で始まり、31116287で終わるパーティションを作成できます。

落とし穴がなければ、拡張パーティションが十分に大きくありません!

しかし、おそらくあなたはそのような複雑さに悩まされていないところですでに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`

または似たようなもの。(当然、ここでさらに健全性チェックを行う必要があります。)

@swisscheeseは他の回答で良いコメントをしました、私はparted解析に適した出力を提供することを知りませんでした。代わりにそれを使用することもできます。最後の最大の空き容量を取得する例:

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

それがあなたの状況に当てはまるかどうか(私の例では、そこにパーティションを作成することはできませんでしたが、実際にはすでにいっぱいです)は、自分で理解する必要があります。:)


ありがとう!参考までに、make_partition関数を使用しましたが、引数が少し異なります。make_partition$ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex

-1

それは簡単でmkparted--listオプションがあり、最後のパーティションを使用awk--listて取得し、次に使用する必要がありますmkpart 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

時間があれば、時間がないので申し訳ありませんが、このスクリプトを完成させてください。


こんにちは、提案したコマンドシーケンスを実際に実行しましたか?私は、彼らはあなたがそれらを行うことを期待して何を考えていません。.. :(
swisscheese

更新しました。もう一度お読みください。
PersianGulf 2013

オプション2も変更されました。
PersianGulf 2013

2
こんにちは、私が意味したことは、「parted --list | awk '{print $ 2}」は単に盲目的にawkにパイプをかけることです!それはあなたが望むものを得ません。partedには-mオプションを使用して、「解析に適した」出力を提供する必要があります。
スイスのチーズ2013

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