11

QA の目的で、RHEL と SLES の両方で、bash スクリプトを使用してドライブを最大 30 以上のパーティションに分割できる必要があります。

「ヒアドキュメント」を介してfdiskを使用してBASHでこれを実行しようとしましたが、これは機能しますが、さまざまな手順で失敗すると推測できます。これは、入力コマンドのタイミングが間違ったタイミングで発生し、同期がずれているためだと思います。私のスクリプトは 10 回に 1 回は正しく動作します。

parted と sfdisk を見てきましたが、これらのツールの使い方がよくわかりません。

私は fdisk しか使ったことがありません。

私の問題は、fdisk を使用すると、「新しいパーティション +1gb」のようなものを何度も指定できることです。スクリプトでは、以前のパーティションや残りのスペースを追跡したり、計算を行ったりする必要がないため、これはうまくいきます。この関数を実行するたびに、未使用のスペースから追​​加の 1 GB パーティションが作成されます。

parted または sfdisk (またはこれらのディストリビューションに既に含まれているその他のツール) を使用して、残りのスペースを計算しなくても 1 から x までのループをスクリプト化する方法はありますか? 共有できる例はありますか?

アップデート

これは私の関数の1つの例です。スクリプトの開始時に、作成するパーティションの数、それらのサイズ (これはすべて静的です)、FS のタイプ (存在する場合) をユーザーに尋ねます。この関数はパーティション 1 から 3 を作成し、別の関数が拡張 (4 番目) を処理し、別の関数が 5 番目から nn を処理します。

前に述べたように、このスクリプトは完全に機能します。私の問題は、fdisk に送信されるコマンドが間違ったタイミングで到着したように見える場合があり、スクリプト全体が壊れて自動化が壊れてしまうことです。

したがって、コマンドは次のように送信されます。

n
p
1

+1M
w

私は fdisk について読んでいて、スクリプトにはあまり適していないことを知ったので、スクリプトモードのときに fdisk がp私のスクリプトを要求している可能性があり、1.

fdisk についてうまくいったのは、パーティション番号を指定した後、次の空きセクターがすでに計算されているため、この時点で最初に空白行を送信し、合計サイズに +1M を送信するだけです。私が知る限り、parted と sfdisk はこのようには機能しないようです。現時点では、これらのツールを自動化する方法を理解するのはまだ初めてです。

Create1to3Primary_Func() {
    Size=\+$partSize\MB
    for i in {1..3}
    do
        echo " this loop i= $i"
        echo "Creating Partition $i on $targetFull as $targetFull$i using Create1to3Primary_Func()"
        rm -f /tmp/myScript
        echo -e "n" >> /tmp/myScript
        echo -e "p" >> /tmp/myScript
        echo -e "$i" >> /tmp/myScript
        echo -e " " >> /tmp/myScript
        echo -e "$Size" >> /tmp/myScript
        echo -e "w" >> /tmp/myScript
        echo -e "EOF" >> /tmp/myScript
        fdisk $targetFull < /tmp/myScript
        echo "  sleeping Create1to3Primary_Func()"
        sleep 4s
        if [ "$RawOrFs" == "f" ]; then
            mkfsCMD="mkfs.$fsType"
            mkfsFullTarget="$targetFull$i"
            cmdline="$mkfsCMD $mkfsFullTarget -L  'Partition$i'"
            echo "Creating $fsType File System on $mkfsFullTarget"
            $cmdline
        fi
        void="/mnt/mymnt$i"
        if [ ! -d $void ] ; then
            echo "Creating Mount Point /mnt/mymnt$i"
            void="/mnt/mymnt$i"
            mkdir $void
        fi
        echo "Part Probe on  $targetFull "
        partprobe $targetFull ; sleep 4s
    done
}
4

4 に答える 4

18

本当に必要なものが得られるかどうかはわかりませんがsfdisk、パーティション レイアウトをダンプし、このレイアウトを使用して他のディスクをパーティション分割できるという事実に興味があるかもしれません。例えば:

sfdisk -d /dev/sda > mydiskpartitionslayout

次に、スクリプトで(もちろん気をつけて)指定できます

sfdisk /dev/sdx < mydiskpartitionslayout
于 2012-08-28T11:55:34.237 に答える
1

私が気に入っている (この記事で見た) アプローチは、fdisk 入力を直接「スクリプト化」することです。これは、「ディスクの終わりまで」または「2 GB 大きい」パーティションを作成することに関して、sfdisk よりもスマートだからです。例:

echo "d
1
d
2
d
3
n
p
1

+2G
n
p
2


w
" | fdisk /dev/sda

このスクリプトは、最大 3 つの既存のパーティションを削除し、2 GB のパーティション (スワップなど) を作成してから、残りのディスク領域を拡張するパーティションを作成します。

対照的に、パーティション レイアウトが作成され、sfdisk で使用された場合、より多くのスペースが使用可能であれば、スクリプトはディスク全体をカバーしません。

于 2015-09-29T17:56:37.843 に答える