こんばんは、statemachineです。今回は、ローカルPCで作成したVHDをPage BlobとしてUploadしてAzure Driveでマウントしてみたいなー、ということでレッツ検証。smarx Serving Your Website From a Windows Azure Driveで触れられている内容と同じですが、自分向け備忘録として。
blog.smarx.comでは、なにやらスクリプトが掲載されているのですが、チトわかりにくいので、コマンドベースで対話的にやってみます。途中、フォーマットしますか、とかエクスプローラで開きますかとかダイアログが表示されますが、キャンセルの方向で。
以下、そのログ(改行を詰めてあります)
c:\drive>diskpartMicrosoft 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); } } }
実行結果は以下の通り。ゴミ箱とかできちゃってますけど、ローカルでマウントすると、強制的に作成されちゃうんだっけ。
途中、面倒くさくなって、いい加減なコードですみません。