インフラエンジニアも人間じゃない?

インフラエンジニアの備忘録

Windowsでディスク・パーティションをマウント・アンマウントするバッチ

100年ぶりのブログです。

バックアップのために2本のディスクをfast copyで定期的にミラーするようにしたんですが、
バックアップ側のディスクが普段邪魔だし、バックアップもろともソフト側で消し飛ばす可能性もあるので、普段はアクセスできないようにしたい。

Linuxなんかだととりあえずumount叩いとけばいいんじゃないのかという感じですがWindowsだとどうすりゃいいのか。


https://technet.microsoft.com/en-us/library/gg252603(v=ws.10).aspx
diskpart で全部できるらしい。

https://technet.microsoft.com/en-us/library/cc772586(v=ws.10).aspx
mountvol でもパーティションのマウント・アンマウントができるらしい。
こっちのほうがすき。

上記を参考にfast copyの動作前にディスクオンライン・パーティションマウントをして、
コピーが終わったらパーティションアンマウント・ディスクオフラインにするような想定でバッチ化しました。
当然ですが管理者権限が必要なのでご注意ください。


再起動するとディスクがオンラインになるのかはようわからん。
パーティションの自動マウントは
mountvol /n
で切れる。

@echo off

rem 管理者権限確認
openfiles > nul
if not %ERRORLEVEL%==0 echo permission error & timeout 10 > NUL & exit /b 1

set PART1=%TEMP%\partition%RANDOM%%RANDOM%.txt
set TEMP1=%TEMP%\temp%RANDOM%%RANDOM%.txt

set TARGETDISK="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
set TARGETVOL=\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx}\
set TARGETDRIVE=X:\

rem DISKPART用ファイルの作成
echo select disk 0 > %PART1%
echo UNIQUEID disk >> %PART1%

rem ディスクのGUIDを出力
diskpart /s %PART1% | find "ID:" > %TEMP1%

rem ディスクのGUIDをチェックし、指定と異なる場合は処理を中断
type %TEMP1% | find %TARGETDISK%
if not %ERRORLEVEL%==0 diskid error & timeout 10 > NUL & exit /b 1

rem DISK ONLINE
echo select disk 0 > %PART1%
echo online disk >> %PART1%
diskpart /s %PART1%

rem ボリュームのマウント
mountvol %TARGETDRIVE% %TARGETVOL% 


rem この辺に処理
timeout 10
rem この辺に処理


rem ボリュームアンマウント
mountvol %TARGETDRIVE% /P

rem DISKPART用ファイルの作成
echo select disk 0 > %PART1%
echo UNIQUEID disk >> %PART1%

rem ディスクのGUIDを出力
diskpart /s %PART1% | find "ID:" > %TEMP1%

rem ディスクのGUIDをチェックし、指定と異なる場合は処理を中断
type %TEMP1% | find %TARGETDISK%
if not %ERRORLEVEL%==0 echo diskid error & timeout 10 > NUL & exit

rem DISK OFFLINE
echo select disk 0 > %PART1%
echo offline disk >> %PART1%
diskpart /s %PART1%

del %PART1%
del %TEMP1%


環境に合わせて以下の箇所は要変更です。

set TARGETDISK="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
set TARGETVOL=\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx}\
set TARGETDRIVE=X:\

TARGETDISKはdiskpartコマンドで対象のディスクを探してGUID(ディスクID)を指定します。

C:\Windows\system32>diskpart

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オフライン          3000 GB      0 B 
  ディスク 1    オンライン          1000 GB      0 B

DISKPART> select disk 0

ディスク 0 が選択されました。

DISKPART> detail disk

WDC WDXXXXXXXXXXX ATA Device
ディスク ID: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

TARGETVOLはmountvolコマンド出力されるGUIDを確認して、ターゲットになるボリュームのGUIDを指定します。

C:\Windows\system32>mountvol

現在のマウント ポイントとボリューム名の考えられる値:

    \\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx}\
        *** マウント ポイントなし ***

    \\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx}\
        C:\


TARGETDRIVEはマウントしたいドライブレターを入れてください。



適当にしかテストしてないので動かなかったらすみません。