Витяг даних з віртуальних дисків virtualbox, #!

Одного разу пізно вночі мені конче знадобилося витягти з зупиненої віртуальної машини Virtualbox, що знаходиться на моєму робочому комп'ютері, один файлик. Віддалено запустити віртуальну машину і тим більше підключитися до неї не вийшло, тому я вирішив спробувати витягти потрібний розділ з vdi і змонтувати його. Ситуація трохи ускладнювалася тим, що віртуальний жорсткий диск хоч і містив всього один кореневий розділ, але був динамічно розширюється, а це значить, що блоки файлової системи розташовувалися в хронологічному порядку, а не в тому, який очікує драйвер файлової системи.







На щастя, можна легко перетворити vdi з динамічного формату в статичний за допомогою багатоцільовий утиліти vboxmanage, що входить до складу пакету virtualbox:

Тепер у нас є файл temp.vdi, всередині якого десь присутня образ шуканої файлової системи; для її коректного вилучення потрібно обчислити зсув образу щодо початку файлу. О пів на знайдених за запитом «mount vdi linux» статей рекомендується використовувати для цих цілей утиліту vditool, призначену насправді для внутрішнього тестування функціональності віртуальних дисків в VirtualBox. Раніше бінарник vditool можна було окремо завантажити з сайту virtualbox.org, але тепер його там зі зрозумілих причин немає (бажаючі можуть скомпілювати його самостійно: vditool.cpp)

Ми, як завжди, підемо іншим шляхом і скористаємося підручними засобами. Перші 512 байт нашого vdi-файлу - його заголовок, в якому можна розібратися, скориставшись, наприклад, цим мануалом або безпосередньо описом структури заголовка vdi в исходниках VirtualBox. З цих джерел випливає, що образ розмічений таким чином:






512 байт: заголовок
4 * N + X: карта мегабайтних блоків, тут N - кількість мегабайт в віртуальному жорсткому диску, а X - вирівнювання отриманого числа до найближчої верхньої 512-байтной кордону
512 + 4 * N + вирівнювання: зміщення даних

Знаючи точний розмір віртуального диска, можна легко обчислити зміщення вручну:

(UUID потрібного диска можна дізнатися з виведення команди vboxmanage list hhds). Тут вирівняні до 512 значення розміру карти блоків одно 16384, а зміщення даних - 16896.
А можна і витягнути зміщення безпосередньо з заголовка vdi. Наприклад, ось початок мого четирёхгігового віртуального диска:

Жирним шрифтом виділені необхідні чотири байти offsetData зі зміщення 0 × 0158. Можна шукати їх візуально, пам'ятаючи про little-endian-порядку байт (в цьому випадку шукане значення дорівнює 0 × 00004200), а можна скористатися простенької командою:

У будь-якому випадку, зайвий раз перевірити ще раз себе ніколи не завадить.

Подивимося, що знаходиться за цим зміщення. Відразу можна припустити, що там розташовується початок образу жорсткого диска, з цього випливає, що перші 512 байт містять mbr. перевіримо:

Жорсткий диск містить 2 розділи: основний розміром 3859 мегабайт, що починається з 63 сектора (1 сектор - 512 байт), і розширений 235 мегабайт, відведений монтажником Debian під swap (ось це сюрприз на виртуалке). Для очищення совісті перевіряємо заголовок першого розділу:

Те що треба! Залишилося змонтувати. Кілька років тому довелося б додатково отримувати всі 7903917 секторів в окремий файл і монтувати його, але зараз можна просто вказати зсув від початку файлу як опцію mount (залишилися розширений розділ і swap всередині нього будуть проігноровані):

Завдання вирішена, всі вільні.







Схожі статті