Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

ローカルPCで作成したVHDファイルをAzure Driveとしてマウントする

こんばんは、statemachineです。今回は、ローカルPCで作成したVHDをPage BlobとしてUploadしてAzure Driveでマウントしてみたいなー、ということでレッツ検証。smarx Serving Your Website From a Windows Azure Driveで触れられている内容と同じですが、自分向け備忘録として。


blog.smarx.comでは、なにやらスクリプトが掲載されているのですが、チトわかりにくいので、コマンドベースで対話的にやってみます。途中、フォーマットしますか、とかエクスプローラで開きますかとかダイアログが表示されますが、キャンセルの方向で。
以下、そのログ(改行を詰めてあります)


c:\drive>diskpart

Microsoft DiskPart バージョン 6.1.7600
Copyright (C) 1999-2008 Microsoft Corporation.
コンピューター: XXXXXXXX
DISKPART> create vdisk file="c:\drive\a.vhd" maximum=32 type=fixed
100% 完了しました
DiskPart により、仮想ディスク ファイルが正常に作成されました。

DISKPART> select vdisk file="c:\drive\a.vhd"
DiskPart により、仮想ディスク ファイルが選択されました。

DISKPART> attach vdisk
100% 完了しました
DiskPart により、仮想ディスク ファイルがアタッチされました。

DISKPART> create partition primary
DiskPart は指定したパーティションの作成に成功しました。

DISKPART> assign letter=z:
DiskPart はドライブ文字またはマウント ポイントを正常に割り当てました。

DISKPART> format fs=ntfs label=azure quick
100% 完了しました
DiskPart は、ボリュームのフォーマットを完了しました。

DISKPART>

以下、参考までに画面キャプチャです。


ここまで、操作すると32MBの固定長VHDディスクが作成され、Zドライブにマウントされます。Zを利用している場合には、適宜別ドライブに割り当ててください。また、固定長のVHDは、Windows7でしか作れないかもしれません、Vistaではだめだったと思います。そして、適当にファイルを作成します。


アンマウントはGUI経由でもできるでしょうが、以下のコマンドで実施できます。


c:\drive>diskpart
Microsoft DiskPart バージョン 6.1.7600
Copyright (C) 1999-2008 Microsoft Corporation.
コンピューター:

DISKPART> select vdisk file="c:\drive\a.vhd"
DiskPart により、仮想ディスク ファイルが選択されました。

DISKPART> detach vdisk
DiskPart により、仮想ディスク ファイルがデタッチされました。

DISKPART> exit
DiskPart を終了しています...

作成した、a.vhdをAzure StorageにPage Blobとしてアップロードします。今回は、コードではなく、CloudXplorer当たりでさくっと。
WebRoleのOnStartあたりに、マウントするコードを書いて、

            var conn = RoleEnvironment.GetConfigurationSettingValue("conn");
            var account = CloudStorageAccount.Parse(conn);

            var blobClient = account.CreateCloudBlobClient();

            var ls = RoleEnvironment.GetLocalResource("ls");
            CloudDrive.InitializeCache(ls.RootPath + "cache", ls.MaximumSizeInMegabytes);
            var drive = account.CreateCloudDrive("drive/a.vhd");

            string letter = drive.Mount(0, DriveMountOptions.None);

ページ側にドライブを表示する処理を書く。

        protected void Button1_Click(object sender, EventArgs e)
        {
            var conn = RoleEnvironment.GetConfigurationSettingValue("conn");
            var account = CloudStorageAccount.Parse(conn);

            foreach (var d in CloudDrive.GetMountedDrives())
            {
                this.TextBox1.Text += d.Key + "\n";
                this.TextBox1.Text += d.Value + "\n";

                foreach (var f in new System.IO.DirectoryInfo(d.Key).GetFileSystemInfos())
                {
                    this.TextBox1.Text += string.Format("{0} {1}\n", f.FullName, f.LastAccessTime);
                }
            }
        }

実行結果は以下の通り。ゴミ箱とかできちゃってますけど、ローカルでマウントすると、強制的に作成されちゃうんだっけ。


途中、面倒くさくなって、いい加減なコードですみません。