LINUX.ORG.RU
ФорумAdmin

Как сделать образ системного раздела самозагружающийся в VirtualBox?

 , , ,


0

1

Я хочу сделать образ с копией рабочей ОС (Debian) который потом можно будет подсоединить к VirtualBox и самозагрузить (то есть загрузка ОС с образа произойдёт сама собой, без посторонней помощи загрузчиков находящихся на других носителях) с него ОС. Полученую виртуальную ОС я планирую использовать для всяких экспериментов которые боюсь проводить над рабочей ОС.

Сначала я не мудурствуя лукаво с помощью dd скопировал системный раздел sda1, после чего при помощи vboxmanage сконвертировал его в понятный для VirtualBox VDI. Однако попытка загрузить виртуалку с полученного образа привела к выводу ошибки «FATAL:No bootable medium found!».

И тут я понял свою ошибку: я забыл про MBR. Я использовал «dd if=/dev/sda of=/tmp/mbr.sda bs=512 count=1» чтобы скопировать MBR. Потом с помощью cat я приписал к концу файлу с MBR dd-образ sda1. Однако почему-то получившийся файл оказался неправильным. mount отказывается его монтировать, а при конвертации в VDI VirtualBox никак не может ничего с него загрузить (хотя сообщений об ошибках нет, просто чёрный экран).

1.Как мне создать правильный комбинированый (sda1+всё необходимое для правильной загрузки) образ?

2.Почему скомбинированный образ у меня получился неправильным?

Deleted

Последнее исправление: Deleted (всего исправлений: 2)

2.Почему скомбинированный образ у меня получился неправильным?

Потому, что:

Я использовал «dd if=/dev/sda of=/tmp/mbr.sda bs=512 count=1» чтобы скопировать MBR. Потом с помощью cat я приписал к концу файлу с MBR dd-образ sda1.

Считать умеешь?

dd if=/dev/sda of=/tmp/mbr.sda bs=512 count=1

Эта команда что делает? Считывает первые 512 байт от начала физического диска, т.е. первый (нулевой) сектор диска.

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

fdisk -l /dev/sda

Ты увидишь, что раздел начинается с 63 или 2048 сектора. 1 сектор = 512 байт. В итоге что бы правильно всё объединить нужно сложить сектор с mbr + 62*512 байт + образ раздела, либо mbr + 2047*512 байт + образ раздела, затем что бы в mbr была правильная таблица разделов, то нужно удалить запись об всех разделах и заново посредством fdisk создать новую запись с указанием такого же номера начального сектора раздела, т.е. 63 или 2048, ну а последний сектор - текущий последний сектор в новом образе.

kostik87 ★★★★★
()

Можно пойти длинной дорогой и использовать образ диска снятый dd, создать в виртуалке два диска, на один по сети залить образ, на второй с этого образа записать всё. Другой вариант: можно установить такой же набор пакетов «dpkg ---get-selections > dpkg_selections.txt» на источнике и по сети заливаем получившийся файл на приёмник и «dpkg --set-selections < dpkg_selections.txt && apt-get dselect-upgrade». Также можно будет перекинуть конфиги из /etc. Также можно получившийся VDI исправить загрузившись с какого-нибудь live-cd в виртуалке и пошаманить в gparted, переустановить grub и прочее.

Exmor_RS ★★★
()
Ответ на: комментарий от kostik87

Спасибо большое за такой подробный ответ!

Считывает первые 512 байт от начала физического диска, т.е. первый (нулевой) сектор диска.

Мне просто казалось что таблица разделов хранится именно в MBR, поэтому после MBR уже должны сразу идти разделы. Видимо я был неправ, значит таблица раздело хранится за пределами MBR.

1 сектор = 512 байт.

У меня fdisk пишет что логический сектор 512 байт, а физический сектор - 4096 байт. Я ведь правиль понимаю что мне надо исходить из размеров логического сектора?

затем что бы в mbr была правильная таблица разделов, то нужно удалить запись об всех разделах

А что будет если этого НЕ сделать? Образ НЕ будет загружаться?

Deleted
()

Lol

dd if=/dev/sda of=/tmp/sda.img bs=512

Делать копию системы, неважно чем, надо с другой запущенной копии ОС.

Потом с помощью cat я приписал к концу файлу с MBR dd-образ sda1

Т.е. тебя не смущает, что MBR обычно находится в начале диска?

anonymous
()
Ответ на: Lol от anonymous

Делать копию системы, неважно чем, надо с другой запущенной копии ОС.

Когда я делал копию sda1, то так и было. У меня на флэшке стоит Debian, я его использовал.

Т.е. тебя не смущает, что MBR обычно находится в начале диска?

А что не так? У меня ведь в файле сначала шёл MBR и только потом я к нему приписал образ sda1. Так что в файле MBR тоже шёл самым первым.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Мне просто казалось что таблица разделов хранится именно в MBR, поэтому после MBR уже должны сразу идти разделы. Видимо я был неправ, значит таблица раздело хранится за пределами MBR.

Таблица разделов хранится в нулевом секторе, т.е. в первых 512 байтах раздела.

Набери команду:

fdisk -l /dev/sda
и посмотри её вывод, там для каждого раздела указаны номера начального и конечного сектора и тип раздела.

У меня fdisk пишет что логический сектор 512 байт, а физический сектор - 4096 байт. Я ведь правиль понимаю что мне надо исходить из размеров логического сектора?

Исходить надо из размера логического сектора.

А что будет если этого НЕ сделать? Образ НЕ будет загружаться?

Сейчас ты взял копию mbr с таблицей разделов, в которой параметры разделов описаны исходя из параметров физического реального диска, в то время как у созданного тобой образа диска другие парметры, поэтому нужно создать корректную таблицу разделов, соответствующую параметрам образа диска.

kostik87 ★★★★★
()
Ответ на: Lol от anonymous

Т.е. тебя не смущает, что MBR обычно находится в начале диска?

Он сделал примерно

cat mbr.bs sda1.img > disk.img

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Таблица разделов хранится в нулевом секторе, т.е. в первых 512 байтах раздела.

Значит я всё-таки был прав. А что тогда хранится в промежутке между MBR и sda1? Надо ли сохранять эти данные при бэкапе?

Сейчас ты взял копию mbr с таблицей разделов, в которой параметры разделов описаны исходя из параметров физического реального диска, в то время как у созданного тобой образа диска другие парметры, поэтому нужно создать корректную таблицу разделов, соответствующую параметрам образа диска.

То есть всё сводится к тому что параметры физического и виртуального диска рознятся. По идее надо будет мне повторять эту операцию если я сконвертирую dd-образ в VDI?

Deleted
()
Ответ на: комментарий от Deleted

А что тогда хранится в промежутке между MBR и sda1?

Всё зависит от конфигурации, в общем случае там просто пустое пространство, но в зависимости от загрузчика там могут храниться части кода загрузчика, которые не помещаются в первые 446 байт нулевого сектора.

Надо ли сохранять эти данные при бэкапе?

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

Неужели до тебя до сих пор не дошло, что если у тебя в таблице разделов для раздела /dev/sda1 содержится примерно такая запись:

device	boot	Start	End	Blocks	Id	System
/dev/sda1		2048	20000000	...	...	...
т.е. разед начинается с 2048 сектора, то в собранном тобой образе диска должны быть соблюдены теже параметры, т.е. в образе диска раздел тоже должен начинаться с 2048 сектора, т.е. отступив от начала образа диска 2048*512 байт.

То есть всё сводится к тому что параметры физического и виртуального диска рознятся.

В том числе и это, но в первую очередь в образе диска, который ты получил суммой mbr + образ sda1 раздел начинается не в том месте, что записано в таблице разделов.

По идее надо будет мне повторять эту операцию если я сконвертирую dd-образ в VDI?

dd образ чего? Просто сделай что бы в результирующем образе диска, не раздела, а диска раздел начинался в правильном месте, т.е. с 2048 или 63 сектора, в соответствие с записью в таблице разделов. Сейчас, скорее всего, это 2048 сектор.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

но в зависимости от загрузчика там могут храниться части кода загрузчика, которые не помещаются в первые 446 байт нулевого сектора.

Grub, Grub2 и Lilo этот промежуток используют?

Неужели до тебя до сих пор не дошло

Дошло, просто мне было любопытно что хранится в этом промежутке.

dd образ чего?

sda1, разумеется.

Сейчас, скорее всего, это 2048 сектор.

Нет, 63-ий сектор.

Deleted
()
Ответ на: комментарий от Deleted

Grub, Grub2 и Lilo этот промежуток используют?

lilo - нет, остальные - да.

Нет, 63-ий сектор.

Мда, если ты пишешь, что у тебя размер физического сектора 4096 байт:

У меня fdisk пишет что логический сектор 512 байт, а физический сектор - 4096 байт.

то ты не хило теряешь в производительности диска, почитай про Advanced Format и выравнивание разделов диска. В общем, если у диска физический размер сектора не 512 байт, а 4096 байта, т.е. 4 Кб, то начальный и конечный номер сектора должен быть кратен 8, т.е. первый раздел должен начинаться с 2048 сектора. В собранном образе диска делай как хочешь, но раздел должен начианаться хотя бы с 63 сектора.

sda1, разумеется.

Прибавь к 63*512 байт образ раздела и затем посредством fdisk в полученном файле создай таблицу раздела, либо прочитай первые 63 сектора из физического диска, а затем объедини полученный файл и образ раздела, после чего поправь таблицу разделов посредством fdisk.

kostik87 ★★★★★
()
Ответ на: комментарий от Deleted

Зачем так извращаться?

Конвертацию лучше и быстрее сделать в какой-нибудь CloneZilla сделать бекап и восстановить его в виртуалке.

Или просто скопировать файлы всех разделов системы rsync'ом и восстановить загрузчик в виртуалке с любого загрузочного ISO.

nstorm
()
Ответ на: комментарий от kostik87

У меня проблемы, я создал файл но он наотрез отказывается монтироваться. Скажите что я не так сделал?

Что я делал:

sudo dd if=/dev/sda of=./UnitedMBR\(21June2016\) count=1 bs=32256

cat UnitedMBR\(21June2016\) sda1.backup\(21June2016\) > sda1.Combined\(21June2016\) && jobdone

(jobdone выводит сообщение об том что работа сделана)

fdisk -c=dos ./sda1.Combined\(21June2016\)

После захода в fdisk я сначала создал новую пустую таблицу разделов формата DOS командой «o», а потом с помощью команды «n» создал новый первичный раздел номер 1 который начинается с 63-го сектора, а последний сектор доверил автомату, после чего сохранил результат командой «w».

Я скорее всего допустил случайную ошибку так как всё сделал в принципе правильно или я что-то принципиально неверное делаю?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 3)
Ответ на: комментарий от kostik87

В общем, если у диска физический размер сектора не 512 байт, а 4096 байта, т.е. 4 Кб, то начальный и конечный номер сектора должен быть кратен 8, т.е. первый раздел должен начинаться с 2048 сектора.

А почему не с 64-го сектора?

Deleted
()
Ответ на: комментарий от Deleted

У меня проблемы, я создал файл но он наотрез отказывается монтироваться. Скажите что я не так сделал?

Как и что монтируется?

kostik87 ★★★★★
()
Ответ на: комментарий от Deleted

Для работы новых версий за грузчиков, что бы не опасаться, что не хватит 62 секторов между mbr и первым разделом. Новые версии fdisk сейчас уже предлагают номер начального сектора первого раздела 2048.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

sudo mount ./sda1.Combined\(21June2016\) /media/iso/

При том что бэкапы sda1 монтируются нормально.

Я натравил на комбинированный файл fsck.ext3, он ругается:

ext2fs_open2: Bad magic number in super-block
fsck.ext3: Superblock invalid, trying backup blocks...
fsck.ext3: Bad magic number in super-block while trying to open ./sda1.Combined(21June2016)

The superblock could not be read or does not describe a valid ext2/ext3/ext4 filesystem. 
Deleted
()
Ответ на: комментарий от Deleted

Ты монтируешь образ жёсткого диска, а не раздела, почитай man mount про опцию offset в частности, ну либо про утилиту kpartx.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Если проблема в том что я неправильно монтирую образ, то почему тогда fsck.ext3 на него ругается?

Deleted
()
Ответ на: комментарий от Deleted

Потому что в начале образа с точки зрения fsck.ext3 лежит мусор (MBR+хвост).

bormant ★★★★★
()
Ответ на: комментарий от Deleted

Беда в том, что в любом случае без разницы какой контейнер ты монтируешь, образ жёсткого диска, раздел жёсткого диска, lvm том, шифрованный контейнер, в любом случае монтируется файловая система, т.е. первым блоком, который будет пытаться прочитать драйвер файловой системы из контейнера должен быть блок данных, содержащий суперблок файловой системы.

Что такое по твоему таблица разделов и зачем она нужна?

Ты открывал

man mount
и читал про параметр 'offset'? Так вот почитай, там указывается смещение в байтах от начала диска, в данном случае образа диска, на котором находится суперблок файловой системы, его ты рассчитаешь исходя из данных таблицы разделов в образе, а именно умножив номер сектора начала раздела на 512.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

затем что бы в mbr была правильная таблица разделов, то нужно удалить запись об всех разделах и заново посредством fdisk создать новую запись с указанием такого же номера начального сектора раздела, т.е. 63 или 2048, ну а последний сектор - текущий последний сектор в новом образе.

Вот это лишнее. Образ у меня отказывался монтироваться лишь потому что я его пытался монтировать без offset (я элементарно об этом НЕ знал). Если использовать offset то образ и без fdisk монтируется как миленький.В виртуалке способен к самозагрузке.И это без каких-либо изменений!

А вот при использовании fdisk у образа диска теряется способность к самозагрузке даже если выставлен флаг boot у раздела. Похоже fdisk затирает код загрузчика grub2. По крайней мере у меня получилось исправить эту проблему путём реинсталяции загрузчика grub2.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.