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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Dragokas, 13 ноя 2014.

  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    Привет !

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

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

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

    Код (Text):
    Create Vdisk File=<имя_файла> Maximum=<n> Type=Fixed|Expandable [/Опция Параметр]
    Где:
    При помощи параметра File можно указать полный путь и имя виртуального диска.
    Параметр Maximum отвечает за максимальное дисковое пространство, предоставляемое виртуальным диском, заданное в мегабайтах.
    При помощи параметра Type можно указывать формат виртуального диска. Существует два значения для данного параметра:
    - FIXED создает файл виртуального диска фиксированного размера;
    - EXPANDABLE создает динамически расширяемый образ виртуального диска.

    Код (Text):
    (
      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. Присоединение виртуального жесткого диска:

    Код (Text):
    (
      echo select vdisk file="l:\vdisk.vhd"
      echo attach vdisk
    ) | diskpart
    3. Отсоединение виртуального диска:

    Код (Text):
    (
      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
     
    Последнее редактирование: 13 ноя 2014
    Kиpилл нравится это.
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    Создание символической ссылки на смонтированный виртуальный диск X:\, где symlink - это название папки.

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

    Код (Text):
    mklink /D "c:\temp\symlink" X:\
    Но я ведь обещал, что можно подключить виртуальный диск к папке, не задействывая букву диска !
    Давайте размышлять дальше.

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

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

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

    Теперь подключимся непосредственно через GUID виртуального диска:
    Код (Text):

    mklink /d c:\ddd \\?\Volume{b77c9a2b-47a4-11e4-af95-f81a67111c9e}\
     
    И удалим ненужный том X:
    Код (Text):

    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)
     
    Последнее редактирование: 13 ноя 2014
    Kиpилл нравится это.
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.497
    Симпатии:
    4.312
    Но ведь мы не сдаемся ?
    Давайте подумаем, как можно иначе сделать - не монтируя том.

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

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

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

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

    Начнем?

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

    Реализация:

    Код (Text):

    @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.)
     
    Последнее редактирование: 13 ноя 2014
    Гимаев Наиль, Phoenix, Alex1983 и ещё 1-му нравится это.

Поделиться этой страницей