Оригинал данной статьи находится здесь, я же являюсь не более, чем пристрастным переводчиком данного текста. 🙂 Статья рекомендуется к прочтению всем адептам VMware VI3 и VMware vSphere.
Введение
Вчера я потратил полдня, решая проблему, возникшую из-за рассинхронизации снимка VMware VI3. Это был неприятный опыт, зато я узнал о важности CID-цепи!
После нескольких часов пинания мертвой ВМ, мой коллега, Дан, и я натолкнулись на CID-цепи.
Мы пришли к выводу, что .vmdk-файлы, которые создаются в VI3 каждый раз при снятии снимка, связаны с другими .vmdk через сгенерированные случайным образом значения CID. VI3 присваивает каждому новому файлу снимка CID, причем это значение меняется при каждой перезагрузке ВМ.
Если цепь CID разрывается, то ВМ не может подключить свой виртуальный диск.
Проблема
Ваши виртуальные диски не подключаются при включении ВМ, вы получите следующее сообщение об ошибке:
“Cannot open the disk ‘/vmfs/volumes/INSERT SPECIFIC VALUE HERE.vmdk’ or one of the snapshot disks it depends on.
Reason: The parent virtual disk has been modified since the child was created.”
“Не удается открыть диск ‘/vmfs/volumes/lalala.vmdk’ или один из файлов снимков, от которых он зависит.
Причина: первичный виртуальный диск был изменен, после создания вторичного.”
Черт!
Что вам делать?!
1) Только не паникуйте 🙂
2) Полностью выключите ВМ.
3) Ничего не изменяйте!
4) Прочтите эту статью!
Если вы не вносили изменения в .vmdk файлы, вероятнее всего, у вас получится исправить эту проблему.
Анализ
Эта проблема возникла, вероятно, потому что вы сделали один или несколько снимков одного или нескольких виртуальных дисков, связанных с ВМ, и снимки рассинхронизировались. Скорее всего, вы получили эту проблему в средах ESX/VI3.
Причина этой проблемы связана с тем, как VI3 управляет снимками и дельтами изменений относительно первоначального виртуального диска (.vmdk). Вероятно, нарушилась логика иерархии снимков, и вторичные .vmdk-файлы, уже не ссылаются на первичные.
Ключ к складыванию головоломки из снимков находится в восстановлении цепи CID.
Каждому .vmdk файлу назначается свой CID-идетификатор. Кроме того, в каждом .vmdk содержится ссылка на CID и .vmdk предыдущего (родительского) файла. CID “родителя” должен указывать на .vmdk файл, созданный непосредственно перед созданием снимка.
При загрузке ВМ CID в .vmdk-файлах меняется на случайным образом. Если после загрузки ВМ цепь CID не в том же состоянии, как и до загрузки, то связь вторичный CID -> первичный CID нарушается. Таким образом VI3 определяет подлинность снимков. Единственный способ вновь синхронизировать CID-цепь – вручную отредактировать все .vmdk файлы в этой цепи.
Пример CID-цепи:
Первичный .vmdk = vdisk.vmdk
.vmdk, созданный после 1 снимка = vdisk-000001.vmdk
.vmdk, созданный после 2 снимка = vdisk-000002.vmdk
Если эта цепочка нарушается, то:
вручную делаем ссылку vdisk-000002.vmdk -> vdisk-000001.vmdk;
vdisk-000001.vmdk -> vdisk.vmdk.
Обратим внимание на три поля в .vmdk-файле:
– поле CID;
– ссылка на parentCID;
– поле parentNameHint.
Примечание: первичный .vmdk не содержит поля “parentNameHint”, а его “parentCID” всегда равняется “ffffffff”.
Примеры
Пример содержимого первичного vdisk.vmdk:
[root@myvi3server]# cat vdisk.vmdk
# Disk DescriptorFile
version=1
CID=7f81b951
parentCID=ffffffff
createType=”vmfs”
# Extent description
RW 50331648 VMFS “vdisk-flat.vmdk”
# The Disk Data Base
#DDB
ddb.virtualHWVersion = “4”
ddb.geometry.cylinders = “3133”
ddb.geometry.heads = “255”
ddb.geometry.sectors = “63”
ddb.adapterType = “lsilogic”
ddb.toolsVersion = “7202”
Пример второго файла – vdisk-000001.vmdk:
[root@myvi3server]# cat vdisk-000001.vmdk
# Disk DescriptorFile
version=1
CID=8eb633b8
parentCID=7f81b951
createType=”vmfsSparse”
parentFileNameHint=”/vmfs/volumes/478b9802-ce7ed955-96a4-0015c5fd9308/servername/vdisk.vmdk”
# Extent description
RW 50331648 VMFSSPARSE “vdisk-000001-delta.vmdk”
# The Disk Data Base
#DDB
ddb.toolsVersion = “7202”
Примечание: файл из “parentNameHint” находится на iSCSI SAN. Длинный шестнадцатиричный GUID – идентификатор этого VMFS-хранилища.
Пример третьего – vdisk-000002.vmdk:
[root@myvi3server]# cat vdisk-000002.vmdk
# Disk DescriptorFile
version=1
CID=249e6aff
parentCID=8eb633b8
createType=”vmfsSparse”
parentFileNameHint=”sryulris0cogp01-000001.vmdk”
# Extent description
RW 50331648 VMFSSPARSE “vdisk-000002-delta.vmdk”
# The Disk Data Base
#DDB
ddb.toolsVersion = “7202”
Примечание: Путь к файлу в “parentNameHint” поле указывает на файл, который располагается в том же каталоге, что и vdisk-000002.vmdk. Если файл находится в другом каталоге, то в пути указывается каталог.
Решение
Следующие шаги синхронизируют файлы снимков VI3 так, что ESX/ESXi успешно проверит их связь друг с другом, а также их подлинность:
Примечание: Выполните следующие действия в текстовом редакторе. Сохраните резервную копию оригинального файла до внесения каких-либо изменений.
Измените vdisk-000002.vmdk:
1) Запомним CID у vdisk-000001.vmdk (= 8eb633b8);
2) Запомним путь к vdisk-000001.vmdk (= локальный каталог);
3) Исправьте parentCID для vdisk-000001.vmdk -> ParentCID=8eb633b8;
4) Исправьте parentNameHint на vdisk-000001.vmdk -> ParentFileNameHint=”vdisk-000001.vmdk”.
Измените vdisk-000001.vmdk:
1) Запомним CID у vdisk-000001.vmdk (=7f81b951);
2) Запомним путь к vdisk-000001.vmdk (=”/ vmfs/volumes/478b9802-ce7ed955-96a4-0015c5fd9308/servername /);
3) Исправьте parentCID для vdisk.vmdk -> ParentCID=7f81b951;
4) Исправьте parentNameHint на vdisk.vmdk файл -> ParentFileNameHint=”/ vmfs/volumes/478b9802-ce7ed955-96a4-0015c5fd9308/servername/vdisk.vmdk”.
Если виртуальные диски не были изменены, вас можно поздравить. Если же виртуальные диски были изменены или вы удаляли их из виртуальной машины, а затем добавляли снова, необходимо будет вручную изменить настройки соответствующего виртуального SCSI-контроллера в файле настроек ВМ – .vmx-файле (указать .vmdk последнего снимка в вашей CID-цепи).
Примечание: Выполните следующие действия в текстовом редакторе. Естественно, сохраните резервную копию исходного файла до внесения каких-либо изменений. 🙂
Измените servername.vmx:
1) Найдите SCSI контроллер, на котором находится виртуальный диск, который мы восстанавливаем. Первый виртуальный диск, как правило, назначается на SCSI-контроллер scsi0:0, второй – scsi0:1, а третий – scsi0:2;
2) Предположим, что мы восстанавливаем второй виртуальный диск. Найдите раздел, ссылающийся на scsi0:1;
3) Укажите в поле ссылку на .vmdk последнего снимка в нашей цепи:
scsi0:1.fileName=”/ vmfs/volumes/46fd62d479749c9697e30015c5fd9308/servername/vdisk-000002.vmdk”.
Примечание: Путь к файлу может быть изменен, хотя по умолчанию снимки сохраняются в том же каталоге, что и первичный .vmdk (vdisk.vmdk). Поэтому введите полный путь к .vmdk снимка (vdisk-000002.vmdk), включая iSCSI GUID и т.д…
4) Сохраните файл и перезагрузите ВМ;
5) Если ВМ не загружается, или выдает ошибку “The parent virtual disk has been modified since the child was created.”, проверьте иерархию CID и пути к файлам, а затем повторите попытку. Если ВМ прежнему не загружается, а CID-сеть и пути к файлам корректны, то первичный или последующие .vmdk-файлы, вероятно, были изменены некорректным образом и их не удается восстановить!