none
ReFS上に仮想マシンを移動して起動するとエラーが発生する RRS feed

  • 質問

  • 初めまして。初めて書き込みます。
    あちこち探し回ったのですが、類似の質問がなかったため質問いたします。

    Windows Server 2012 R2のHyper-Vで、他のサーバで使用していた仮想マシンをReFS上で起動しようとすると、下記のようなエラーが発生して起動ができません。

    「仮想ディスクシステムの制限により、要求された操作を完了できませんでした。NTFS上では仮想ハードディスクファイルの圧縮と暗号化がいずれも解除されている必要があります。ReFS上では、仮想ハードディスクファイルの整合性ビットが設定された状態にしておくことはできません。」

    このエラーは、他のサーバ(同じ物理マシンですが、Windows Server 2012を使用しており、今回R2を入れ直しました)で運用されていたVHDを使用して仮想マシンを作成し、起動しようとした場合に限って起こります。

    最初はドライブ全体の設定の問題かと思いましたが、エラーが発生するドライブ上に完全に新規に仮想マシンを作成し、VHDを新規に作成してOSをインストールしようとして起動すると、正常に起動が行えます。この新しく作成した仮想マシンは、正常に起動し、OSのインストールが行えて、その後も正常に運用することができます。

    つまり、他のサーバで運用されていたVHDファイルをコピーして仮想マシンを作成した場合に限り、ReFS上で上記のようなエラーが起こるのです。エラーが起こるReFSのドライブは、記憶域プール上に構成されたもの、ハードウェアRAID1上に構成されたもの、シングル構成のもの、いずれの場合にも同じようにエラーが起こります。

    整合性ビットはReFSのファイルシステムレベルで備わっている機能だと思うので停止できそうにありませんし、新規の仮想マシンでは正常に動作するのも理由が分かりません。

    どなたかお知恵を拝借できませんでしょうか。
    よろしくお願い申し上げます。

    2013年10月26日 9:22

回答

  • 整合性はNTFSのEFSや圧縮と同じくファイルの属性によって制御される機能です。
    http://blogs.msdn.com/b/b8_ja/archive/2012/01/20/windows-refs.aspx
    >最も基本的なレベルでは、整合性はファイルの属性 (FILE_ATTRIBUTE_INTEGRITY_STREAM) です。
    >また、ディレクトリの属性でもあります。ディレクトリ内にある場合、属性はそのディレクトリ内に作成されたすべてのファイルおよびディレクトリに継承さ れます。

    属性解除のコマンドはすでに別の人が出したので割愛。
    ただし既にコピーが終わったそのVHDXファイルから属性だけ解除することはできません。
    http://download.microsoft.com/download/C/B/3/CB3561DC-6BF6-443D-B5B9-9676ACDF7F75/Application%20Compatibility%20with%20ReFS.docx
    >* The integrity status of a file can be changed only for empty files. For example, if a file is created and then data is written to the file, its integrity status cannot be changed once data is written.
    コピー先ディレクトリから属性を削除して新たにコピーしなおしてください。

    新規が動く理由はもうお分かりですね。
    Hyper-VマネージャなどはVHDXファイルを新規作成した直後にこの属性を消してからデータを書き込むからです。

    2013年10月28日 15:30
  • チャブーンです。

    set-fileintegrity のヘルプを見ると「-FileName」と書いてあります。対象とされているのは「フォルダ」だけのようですので、フォルダの中にダミー的なファイルを入れて、それに対して実行してみてはどうでしょうか。で、その後、そのフォルダにVHDXをコピーしてみると、好転する可能性はあるかもしれません。

    追記:ちょっと調べたら、うえの方法を使わなくても、直接できそうなことが書いてあるぺーじがありますね。キモとしては、PowerShellでオブジェクト化してから、パイプでそのオブジェクトを変換する、もののようです。

    http://www.petri.co.il/disable-integrity-bit-of-virtual-hard-disks-refs-volume.htm
    2013年11月12日 12:13
  • 今更で申し訳ないんですが、
    ただし既にコピーが終わったそのVHDXファイルから属性だけ解除することはできません。

    これ、誤りでした。
    Set-FileIntegrityをVHDXファイルに直接行っているページがいくつもあるので気になっていたのですが、この制限があるのは出典元とした文書が対象にしている Windows Server 8 Beta までで 2012 RC以降ではこの制限はなくなっていました。
    • 回答としてマーク Skyponta 2014年5月7日 15:15
    2014年5月7日 13:02
  • GreenCat様 丁寧にありがとうございます!その後しばらくこちらの作業はしていないのですが、次回試してみます!
    • 回答としてマーク Skyponta 2014年5月7日 15:15
    2014年5月7日 15:13

すべての返信

  • 整合性はNTFSのEFSや圧縮と同じくファイルの属性によって制御される機能です。
    http://blogs.msdn.com/b/b8_ja/archive/2012/01/20/windows-refs.aspx
    >最も基本的なレベルでは、整合性はファイルの属性 (FILE_ATTRIBUTE_INTEGRITY_STREAM) です。
    >また、ディレクトリの属性でもあります。ディレクトリ内にある場合、属性はそのディレクトリ内に作成されたすべてのファイルおよびディレクトリに継承さ れます。

    属性解除のコマンドはすでに別の人が出したので割愛。
    ただし既にコピーが終わったそのVHDXファイルから属性だけ解除することはできません。
    http://download.microsoft.com/download/C/B/3/CB3561DC-6BF6-443D-B5B9-9676ACDF7F75/Application%20Compatibility%20with%20ReFS.docx
    >* The integrity status of a file can be changed only for empty files. For example, if a file is created and then data is written to the file, its integrity status cannot be changed once data is written.
    コピー先ディレクトリから属性を削除して新たにコピーしなおしてください。

    新規が動く理由はもうお分かりですね。
    Hyper-VマネージャなどはVHDXファイルを新規作成した直後にこの属性を消してからデータを書き込むからです。

    2013年10月28日 15:30
  • HomeCloset様
    GreenCat様

    ご回答ありがとうございます。お返事が遅くなりまして申し訳ありません。
    仕事で数週間ベトナムにおりました。

    さて、整合性ビット(整合性ストリーム)の属性は解除でき、かつ、後でファイルから属性だけを除去することができないことも理解ができました。

    そこで仮想マシンを配置する予定のフォルダに対し、
    set-fileintegrity d:share $false
    set-fileintegrity d:share -enforce $false
    といったコマンドを試みたのですが、get-fileintegrityで確認しても、元の属性と変わらず、EnabledがFalse、EnforcedがTrueとなっており変化がありません。HomeCloset様の引用の中に、EnforcedがTrueの場合は属性が強制的にオンになる、すなわちEnabledがTrueになるという記述があるので、EnforcedをFalseにする必要があると思われます。

    上述のようにset-integrityでFalseにできない場合、どうすれば良いものでしょうか・・・。
    お手すきの時にお知恵を拝借できれば幸いです。自分でももう少し検証してみますが、よろしくお願いします。

    2013年11月12日 11:55
  • チャブーンです。

    set-fileintegrity のヘルプを見ると「-FileName」と書いてあります。対象とされているのは「フォルダ」だけのようですので、フォルダの中にダミー的なファイルを入れて、それに対して実行してみてはどうでしょうか。で、その後、そのフォルダにVHDXをコピーしてみると、好転する可能性はあるかもしれません。

    追記:ちょっと調べたら、うえの方法を使わなくても、直接できそうなことが書いてあるぺーじがありますね。キモとしては、PowerShellでオブジェクト化してから、パイプでそのオブジェクトを変換する、もののようです。

    http://www.petri.co.il/disable-integrity-bit-of-virtual-hard-disks-refs-volume.htm
    2013年11月12日 12:13
  • チャブーンさん 早速のご回答ありがとうございます。後ほど試してみます。 なお、GreenCatさんが引用されているBuilding Windows 8のブログの中に、整合性ビットをオフにしてフォーマットする方法が記載されているので、その方法でドライブ自体をフォーマットし直しても良いのかもしれません。 シングル構成のドライブでは既定値で整合性ビットはオフのようですが、RAIDボリューム及び記憶域プールでは既定でオンになるようです。仮想マシンの配置専用に使用するドライブなら、フォーマット段階でドライブごとオフでも良いのかもしれません。
    2013年11月12日 12:27
  • チャブーンです。

    #追記をもし読んでいたらすみません。

    お試しになられるなら、petriのサイトにある方法をお試しいただいた方が建設的かと。

    2013年11月12日 12:29
  • チャブーン様

    素早いフォローありがとうございます。
    Petriの記事はご回答を頂く前に読んでおりましたが、仮想マシンを作るたびにコマンドを打つ方法ではなく、フォルダ単位で無効にしたかったので、あえてやってみませんでした。

    どうも現状、ファイル単位でしか整合性ビット(整合性ストリーム)を無効にする方法がなさそうに思われるので、結果的には下記のコマンドによって、仮想マシン専用に用意したDドライブ(ハードウェアRAIDボリューム)全体を整合性ビットを無効にしてフォーマットすることにより問題が起こらなくなりました。

    D:\>format /fs:refs /q /i:disable D:

    このドライブはほぼ仮想マシン専用なので、ドライブ全体で整合性ビット無効とし、必要なファイルに限って有効にしてみたいと思います。本当はハードウェアRAIDではなく記憶域でミラーリングしてみたかったのですが、実運用環境なのでハードウェアRAIDにしてしまいました。

    HomeCloset様GreenCat様チャブーン様、何度もご指導を頂きましてどうもありがとうございます。
    この件は日本語では文献がほとんどなく悩んでいたので(英語ではいくつかあったのですが、英語で探す努力を怠っておりました)、皆様の情報によって本当に助かりました。心から感謝いたします。

    2013年11月14日 7:29
  • 今更で申し訳ないんですが、
    ただし既にコピーが終わったそのVHDXファイルから属性だけ解除することはできません。

    これ、誤りでした。
    Set-FileIntegrityをVHDXファイルに直接行っているページがいくつもあるので気になっていたのですが、この制限があるのは出典元とした文書が対象にしている Windows Server 8 Beta までで 2012 RC以降ではこの制限はなくなっていました。
    • 回答としてマーク Skyponta 2014年5月7日 15:15
    2014年5月7日 13:02
  • GreenCat様 丁寧にありがとうございます!その後しばらくこちらの作業はしていないのですが、次回試してみます!
    • 回答としてマーク Skyponta 2014年5月7日 15:15
    2014年5月7日 15:13