0

私は2日間成功せずにこれを理解しようとしてきました。同様の問題に直面している場合は、それを修正する方法を教えてください。または、任意のポインターが役立ちます。

これが私たちの仕事です。

  1. 仮想インスタンスを作成します。
  2. ブランク ボリュームを作成します。
  3. スナップショットからボリュームを作成します。
  4. 空のボリュームをインスタンスにアタッチします。
  5. スナップショットからインスタンスにボリュームをアタッチします。
  6. その他の IP アドレス、セキュリティ グループなど。

これらはすべて別のスレッドで実行されますが、依存関係が追加されています。元。4 は 2 に依存します (4->2)。2->1。5->3->1。

問題は、次の場合があることです。

  1. デバイスの 1 つがデバイス リストに表示されません。Openstack は両方が接続されていることを示しています。
  2. 両方のデバイスがデバイス リストに表示されません。Openstack は両方が接続されていることを示しています。
  3. どちらも表示されますが、指定したデバイスのディスクが切り替わります。元。/dev/vdb に 1GB のディスクを接続し、/dev/vdc に 10GB のディスクを接続しました。しかし、fdisk –l /dev/vdc を実行すると 1G になり、/dev/vdb は 10G を示します。
  4. 動作します!!!

コードを確認したところ、すべてのコンポーネントが本来の機能を果たしています。それはopenstack自体を疑うように私を導きます! (わかってる…なんか変だな。)

アイスハウスと RDO パックスタックのセットアップで allinone を使用しています。

【アップデート1】

ボリュームを接続するために JClouds API を使用しています。また、デバイス名 (/dev/xvdb、/dev/xvdc) を指定しています。それでも、呼び出し後の応答でデバイス名を確認し、代わりにそれらを使用しています。

NovaAPI nova = ContextBuilder
            .newBuilder("openstack-nova")
            .endpoint(endpoint)
            .credentials(getIdentity(), getPassword())
            .modules(modules).buildApi(NovaApi.class);
VolumeAttachmentApi attachment = nova.getVolumeAttachmentExtensionForZone(CONSTANT_REGION).get();
VolumeAttachment attachment.attachVolumeToServerAsDevice(volumeIdExisting, instanceId, deviceDevXVDB);

【追記2】 問題切り分けのサンプルプログラムを作成しました。このサンプル プログラムは、次のことを行います。

    /-> 2 -> 3 >\
1 -> -> 6 -> -> x
    \-> 4 -> 5 >/

基本的に、メイン スレッドはインスタンスを作成し、2 つのスレッドを起動します。1 つのスレッドで空のボリューム (10GB) を作成し、アタッチします。もう一方は、スナップショット (1GB) からボリュームを作成してアタッチします。次に、メイン スレッドが IP を作成して接続し、2 つのスレッドが完了するのを待ちます。

観察はかなり奇妙です。毎回、アタッチ ボリュームの応答で、空のボリュームが /dev/vdc にアタッチされ、スナップショットのボリュームが /dev/vdb にアタッチされたことが示されます。

しかし、私がインスタンスをチェックしたとき

fdisk -l /dev/vdb

10GB を返し、

fdisk -l /dev/vdc

1GBを返します

何が欠けているのでしょうか?? ポインタ/提案は役に立ちます。

4

1 に答える 1

1

記録のために。ボリュームを同時にアタッチすることはできません。接続されたボリュームに割り当てられるデバイス名は、最初に接続されたボリュームに依存します。名前を指定することはできますが、基盤となるドライバーによって受け入れられない場合があります。

最後に、シーケンシャルへのボリュームの並列接続を廃止し、すべてが期待どおりに機能するようになりました。

于 2015-09-18T06:56:12.133 に答える