Подключение виртуального жесткого диска VHD, как пустой папки с помощью симлинка

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
8,030
Решения
14
Реакции
6,805
Привет !

Собственно, репостинг одного моего практического примера:
- как создать файл виртуального жесткого диска (.VHD) с помощью средств ОС.
- как смонтировать такой образ в качестве нового тома.
- как подключить такой диск к пустой папке, не монтируя к точке подключения тома.

Автоматизированный скрипт:

1. Создание и подготовка виртуального диска:

Код:
Create Vdisk File=<имя_файла> Maximum=<n> Type=Fixed|Expandable [/Опция Параметр]

Где:
При помощи параметра File можно указать полный путь и имя виртуального диска.
Параметр Maximum отвечает за максимальное дисковое пространство, предоставляемое виртуальным диском, заданное в мегабайтах.
При помощи параметра Type можно указывать формат виртуального диска. Существует два значения для данного параметра:
- FIXED создает файл виртуального диска фиксированного размера;
- EXPANDABLE создает динамически расширяемый образ виртуального диска.

Код:
(
  echo create vdisk file="l:\vdisk.vhd" maximum=512 type=fixed
  echo select vdisk file="l:\vdisk.vhd"
  echo attach vdisk
  echo convert mbr
  echo create partition primary
  echo format fs=NTFS label="VDisk" quick
  echo assign letter x:
  echo detach vdisk
) | diskpart

2. Присоединение виртуального жесткого диска:

Код:
(
  echo select vdisk file="l:\vdisk.vhd"
  echo attach vdisk
) | diskpart

3. Отсоединение виртуального диска:

Код:
(
  echo select vdisk file="l:\vdisk.vhd"
  echo detach vdisk
) | diskpart

Batch-файл запускать в режиме повышенных привилегий.

Кстати, в составе SysInternals есть утилита disk2vhd.exe, которая позволяет создать образ физического жесткого диска в формате VHD.

Ссылки по теме:
Статьи:
http://www.utilizewindows.com/7/dep...ual-hard-disk-vhd-using-diskpart-in-windows-7
http://www.oszone.net/10877/vhd
Видеопрезентация: http://www.techdays.ru/videos/1237.html
 
Последнее редактирование:
Создание символической ссылки на смонтированный виртуальный диск X:\, где symlink - это название папки.

С повышенными правами выполнить команду:

Код:
mklink /D "c:\temp\symlink" X:\

Но я ведь обещал, что можно подключить виртуальный диск к папке, не задействывая букву диска !
Давайте размышлять дальше.

Можно привязаться к точке монтирования тома.

А значит, нужен их список:
Код:
mountvol /L

Так мы выведем список подключенных томов и идентификаторов,
чтобы увидеть какой из них относится к нашему диску X: (на него у нас подмонтирован виртуальный образ .VHD).

\\?\Volume{64efa145-dcee-11e3-a405-806e6f6e6963}\
*** НЕТ ТОЧЕК ПОДКЛЮЧЕНИЯ ***

\\?\Volume{64efa147-dcee-11e3-a405-806e6f6e6963}\
D:\

\\?\Volume{64efa148-dcee-11e3-a405-806e6f6e6963}\
E:\

\\?\Volume{64efa146-dcee-11e3-a405-806e6f6e6963}\
C:\

\\?\Volume{b77c9a2b-47a4-11e4-af95-f81a67111c9e}\
X:\

Как видим, \\?\Volume{b77c9a2b-47a4-11e4-af95-f81a67111c9e}\ - GUID нашего виртуального диска.
*** НЕТ ТОЧЕК ПОДКЛЮЧЕНИЯ *** - а вот так выглядит запись, если устройству не назначено ни одной точки монтирования.

Теперь подключимся непосредственно через GUID виртуального диска:
Код:
mklink /d c:\ddd \\?\Volume{b77c9a2b-47a4-11e4-af95-f81a67111c9e}\

И удалим ненужный том X:
Код:
select vdisk file="L:\vdisk.vhd"
attach vdisk
list volume
select volume n
remove letter=x

Вот такая сложная процедура - смонтировали том только ради того, чтобы узнать GUID.

Ссылки по теме:
MSDN: Описание служебной программы Diskpart с интерфейсом командной строки
TechNet Параметры командной строки DiskPart
New Diskpart.exe commands to reset volume attribute flags on failed snapshot volumes in Windows Server 2003

Марк Руссинович о точках монтирования: Внутреннее устройство Windows (гл. 8-11)
Перечень точек монтирования томов, создание точки соединения (Junction Point)
 
Последнее редактирование:
Но ведь мы не сдаемся ?
Давайте подумаем, как можно иначе сделать - не монтируя том.

Предположим, что у нас в системе уже есть подключенный виртуальный диск - как тогда визуально
отличить - где какая точка монтирования?
К сожалению, команда "detail vdisk" в составе DiskPart не отображает этой информации о GUID-е.

Как вариант, можно задействовать интерфейс WMI, чтобы найти соответствия.
Еще вариант - искать записи "*** НЕТ ТОЧЕК ПОДКЛЮЧЕНИЯ ***". А если их несколько, что тогда ?

Я придумал наиболее простой с точки зрения реализации и надежности вариант,
чтобы найти GUID и без присвоения буквы тому виртуального ЖД.

1. Запускаем mountvol. Сохраняем перечень GUID.
2. Создаем виртуальный диск. Букву не присваиваем. Не отключаем.
3. Запускаем еще раз mountvol. Сравниваем вывод с предыдущим. Разница будет - та самая строка с искомым GUID.

Начнем?

Алгоритм:
1. Затребуем повышенные права.
2. Принудительно включаем режим автоматического создания точек монтирования (если отключено).
3. Создаем массив со списком точек мнтирования.
4. Создаем виртуальный ЖД c:\vdisk.vhd
5. Сверяемся со списком точек монтирования из массива. Находим различия = наша новая точка.
6. Создаем символическую ссылку (c:\vdisk) на точку монтирования.

Реализация:

Код:
@echo off
SetLocal EnableExtensions
call :Invoke_UAC %*

set vdisk=c:\vdisk.vhd

mountvol /E
For /F "delims=" %%? in ('mountvol ^| find "\\?\"') do set Array.%%?=true
(
  echo create vdisk file="%vdisk%" maximum=512 type=fixed
  echo select vdisk file="%vdisk%"
  echo attach vdisk
  echo convert mbr
  echo create partition primary
  echo format fs=NTFS label="VDisk" quick
) | diskpart
For /F "delims=" %%? in ('mountvol ^| find "\\?\"') do if not defined Array.%%? set MountPoint=%%?
mklink /d c:\VDisk\ %MountPoint%
pause
Exit

:Invoke_UAC :: Затребование диалога UAC повышения прав
  ver |>nul find "6." && if "%1"=="" (
    Echo new ActiveXObject^('Shell.Application'^).ShellExecute ^(WScript.Arguments^(0^),'UAC','','runas',1^);>"%~dp0Invoke_UAC.js"
    cscript.exe //nologo //e:jscript "%~dp0Invoke_UAC.js" "%~f0"& Exit
  ) else (>nul del "%~dp0Invoke_UAC.js"& chdir /d "%~dp0")
Exit /B

Полезная информация:
*.vhd можно открывать архиватором 7z

Статья "Как подключить/открыть vhd-файл (Virtual Hard Disk) в Windows XP и Vista"
(используется Microsoft Virtual Server 2005 R2 SP1.)
 
Последнее редактирование:
Назад
Сверху Снизу