LINUX.ORG.RU

Установка grub2 в образ диска


0

1

Помогите разобраться с грубом в виртуальной машине.

Дано: Хостовая машина - RFedora 15.1 Гостевая ОС - Ubuntu 11.04 Диск в LVM c одним корневым разделом - /dev/virt/disk Нужно установить загрузчик на этот диск.

Как делал:

kpartx -a /dev/virt/disk
mount /dev/mapper/virt-disk1 /mnt
mount -t proc none /mnt/proc/
mount -o bind /dev/ /mnt/dev/
chroot /mnt/ /bin/bash
update-grub
grub-install /dev/mapper/virt-disk

не помогает... Выполнял загрузку с livecd под управлением виртуальной машины и выполняю в принципе то же чирут, только установку груба провожу на тот же диск, но видимый из под ВМ, как /dev/vda - все работает.

Как можно установить Grub2 в образ диска от виртуальной машины в raw формате?


> не помогает...
С каким сообщением?

grub-install /dev/mapper/virt-disk

А не /dev/sda? Или BIOS нынче умеет LVM?

AITap ★★★★★ ()

>chroot /mnt/ /bin/bash

А чего не просто chroot /mnt ?

mount /dev/mapper/virt-disk1

grub-install /dev/mapper/virt-disk



Э? И если grub-install выполен из консоли, которая как бы зачрутена в /mnt то там разве есть /dev/mapper/virt-disk1 ?



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

chroot /mnt /bin/bash потому, что видимо у ТС шелл в той системе, из которой он делает chroot очень специфичен и его нет в той системе, в которую chroot делается, поэтому указывается что запустить после перехода в новое окружение, в данном случае указывается шелл, /bin/bash, относительно нового корня.

Так же ТС делает mount -o bind /dev /mnt/dev, тем самым он «пробрасывает» каталог устройств из реальной системы в ту, в которую происходит chroot.

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

>chroot /mnt /bin/bash потому, что видимо у ТС шелл в той системе, из которой он делает chroot очень специфичен и его нет в той системе,

Нет /bin/bash? Чего-то слишком специфично. Тем более что мешает запустить любой в шелл в чруте?

Так же ТС делает mount -o bind /dev /mnt/dev, тем самым он «пробрасывает» каталог устройств из реальной системы в ту, в которую происходит chroot.


Да небось еще и устройства не по GUID.

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

Например systemrescuecd, в нём по умолчанию используется zsh, в chroot системе его может и не быть. По умолчанию при переходе в chroot окружение без явного указания шелла ищется в новом корне текущий шелл, который находится в переменной echo $SHELL.

При чём здесь GUID если вы что-либо не понимаете не надо делать скорополительных выводов, после запуска ядра и его инициализации ядро создаёт список устройств, потом демон udev создаёт ноды, файлы устройств в директории /dev., в ней будут содержаться файлы устройств всех физических устройств системы., ТС пробросил, подмонтировал директорию /dev в /mnt/dev и перешёл в chroot с текущим ядром.

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

Надо всё же не совсем так поступить, надо указать корень загрузчику и устройство, куда установить код загрузчика, я имею ввиду под корнем раздел, или точнее абстрактно место расположение файлов загрузчика, а затем указвть куда ставить в данном случае что-то вроде (hd0) или (hd1).

Не знаю как это будет с grub2, но для grub-legacy (grub1) без lvm было бы так:

# grub
grub> root (hd0,0)
setup (hd0)
quit

Надо как то сделать примерно так же, я не использую grub2, поэтому и не знаю.

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

>Например systemrescuecd,

У ТС - Убунту.

С пробросил, подмонтировал директорию /dev в /mnt/dev и перешёл в chroot с текущим ядром.


Каким магическим образом /dev/mapper/virt-disk вдруг станет /dev/vda ?

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

А для grub2 - именно так.
grub-install сам определяет, где расположен /boot, и указать ему нужно только целевое расположение MBR.

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

> Каким магическим образом /dev/mapper/virt- disk вдруг станет /dev/vda ? В процессе загрузки под ВМ с лайвсд

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

> А не /dev/sda? Или BIOS нынче умеет LVM?

вопрос стоит в том - как поставить груб2 в диск образ виртуальной машины, а не на физический диск

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

>вопрос стоит в том - как поставить груб2 в диск образ виртуальной машины, а не на физический диск

Вот и именно.

chroot /mnt
grub-install /dev/vda

и всё.

Mr_Alone ★★★★★ ()

Я - ТС. Уточню еще раз:

/dev/virt/disk - образ диска виртуальной машины в ЛВМ. Так он виден под хостовой машиной под упаравлением ФЕДОРА 15

/dev/vda - тот же диск, но видимый под управлением виртуальнгой машины. (Гостевая ОС - Убунту 11.04)

Установка груба под управлением ВМ через лайвсд вышеуказанным способом - работает.

Но мне надо установить груб2 из хостовой машины для автоматизации процесса (ВМ много). Как это сделать?

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

Вот и именно.

chroot /mnt

grub-install /dev/vda

и всё.

/dev/vda - виден только под управлением ВМ. А надо устанавливать груб напрямую из хостойвой машины в образ дика

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

>Но мне надо установить груб2 из хостовой машины для автоматизации процесса (ВМ много). Как это сделать?

Установить один раз систему, потом тупо склонировать lvm сколько угодно раз. Для чего каждый раз ставить загрузчик, в чем сакральный смысл?

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

Потому, что это не типовая новоя система. А один из шагов процесса восстановления из бэкапа. И внутрености ОС ВМ могут отличаться.

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

Диск /dev/vda виден только под управлением ВМ. Для этого надо загрузиться гостевой ОС чего я и добиваюсь установкой груба или загрузиться с лайвсд(в боевых условиях использование очень затруднено). Из под хостовой диска /dev/vda нет, а есть только образ этого диска в виде /dev/virt/disk, который равноценен ему. Доступ к диску есть... Осталось найти способ восстановления Груба

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

Диск /dev/vda виден только под управлением ВМ

Эээээ...

[root@vserver ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vg0-root   9611492   7691080   1432172  85% /
tmpfs                   256052         0    256052   0% /lib/init/rw
udev                     10240       812      9428   8% /dev
tmpfs                   256052         0    256052   0% /dev/shm
/dev/md0                139881     40199     92460  31% /boot
/dev/mapper/vg0-vimages
                      25803068   8455660  16036688  35% /data/vimages
overflow                  1024         0      1024   0% /tmp
[root@vserver ~]# mount -o loop -O ro /dev/vg0/toolsroot /mnt/test
[root@vserver ~]# chroot /mnt/test df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda             10321208   3511352   6285568  36% /
tmpfs                 10321208   3511352   6285568  36% /lib/init/rw
sysfs                 10321208   3511352   6285568  36% /sys
udev                  10321208   3511352   6285568  36% /dev
tmpfs                 10321208   3511352   6285568  36% /dev/shm
devpts                10321208   3511352   6285568  36% /dev/pts

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

Попробовал - да командой df диск vda1 виден. Но в /dev/ vda нет:

>kpartx -a /dev/virt/disk
>mount /dev/mapper/virt-disk1 /mnt
>chroot /mnt
>df
Файловая система           1K-блоков      Исп  Доступно  Исп% смонтирована на
/dev/vda1             10321176    692484   9104408   8% /
none                  10321176    692484   9104408   8% /sys
none                   1023544         0   1023544   0% /dev
none                   1023544         0   1023544   0% /dev/pts
none                   1023544         0   1023544   0% /dev/shm
none                  10321176    692484   9104408   8% /var/run
none                  10321176    692484   9104408   8% /var/lock
>ls -l /dev/vda*
ls: невозможно получить доступ к /dev/vda*: Нет такого файла или каталога
>grub-install /dev/vda
/usr/sbin/grub-probe: ошибка: cannot stat `/dev/vda'.
[[/code]]

Соответственно груб не устанавливается :(

Если монтировать /dev и /proc из основной системы перед чирутом то тот же эффект...
mil ()
Ответ на: комментарий от Mr_Alone

> Может не стоит вообще ставить GRUB?

Спасибо за подсказку. Это может быть вариантом решения. Скопировал vmlinuz и initrd из виртуальной машины в хостовую и указал в параметрах загрузки KVM - работает, как и ожидалось. Возник вопрос, как можно указать грузить ядро без вышеописанной операции копирования напрямую из образа диска ВМ?

А по изначальному вопросу все таки хотелось бы разобраться с грубом. Как можно установить код груба на вновь созданный диск ВМ? Если не использовать инструментарий самого груба, а с помощью dd скопировать образ только груба с рабочей машины, то какие адреса нужно выбирать? Или это зависит от разбивки диска и куда он установлен? Гостевая ОС - Ubuntu Server, потому должно быть стандартно...

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

Можно попробовать такой костыль:
echo 31 > /sys/module/loop/parameters/max_part # обычно max_part = 0, и работать с разделами трудно
losetup -v -f /dev/mapper/virt-disk # или где там на самом деле образ диска
mount /dev/loopXpY /mnt # подставить номера loop-устройства и раздела
for f in proc sys dev; do mount -o bind /$f /mnt/$f; done
chroot /mnt grub-install /dev/loop0
for f in dev sys proc; do umount /mnt/$f; done
umount /mnt
losetup -d /dev/loopX

Ставил таким способом загрузчик на raw-образ жёсткого диска. Сработало.

AITap ★★★★★ ()
Ответ на: комментарий от AITap
echo 31 > /sys/module/loop/parameters/max_part 

cat /sys/module/loop/parameters/max_part
31

losetup -v -f /dev/mapper/virt-disk
Loop device is /dev/loop0

 ls /dev/loop*
/dev/loop0  /dev/loop1  /dev/loop2  /dev/loop3  /dev/loop4  /dev/loop5  /dev/loop6  /dev/loop7

fdisk -l /dev/mapper/virt-disk

Disk /dev/mapper/virt-disk: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, всего 20971520 секторов
Units = секторы of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

                  Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/mapper/virt-disk                  63    20971519    10485728+  83  Linux

[[/code]]

Это выполнил, но losetup партиций не видит, хотя она там есть и kpartx ее мапит.
mil ()
Ответ на: комментарий от AITap

Разобрался с партициями - в Fedora надо loop.max_part=31 прописать в опциях загрузки ядра, тогда будут определяться разделы.

Вообщем предложенный вами метод через loop-устройства судя по всему рабочий способ - груб устанавливается - ВМ запускает grub с образа диска, но есть одно но: груб устанавливается с некорректными параметрами - не может найти root-раздел. Вот ошибку, которую выдает ВМ:

Booting from Hard Disk
error: no such device: 7a7d53ce-b0c5-4e96-b814-f0dc357c173b
grub rescue>

Хотя UUID совпадает:

blkid /dev/loop0p1 
/dev/loop0p1: UUID="7a7d53ce-b0c5-4e96-b814-f0dc357c173b" TYPE="ext4" 

отличие генерируемого /boot/grub/grub.cfg между чирутом и виртуальной машиной такое (Установка груба под ВМ происходит без проблем):

diff -u grub-chroot.cfg grub-vm.cfg
@@ -88,8 +90,9 @@
 menuentry 'Ubuntu, с Linux 2.6.38-8-virtual' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        set gfxpayload=$linux_gfx_mode
+       insmod part_msdos
        insmod ext2
-       set root='(/dev/loop0p1)'
+       set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root 7a7d53ce-b0c5-4e96-b814-f0dc357c173b
        linux   /boot/vmlinuz-2.6.38-8-virtual root=UUID=7a7d53ce-b0c5-4e96-b814-f0dc357c173b ro   quiet
        initrd  /boot/initrd.img-2.6.38-8-virtual

Как добиться прописать нужные параметры? Напомню - нужно установить grub2.

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

- set root='(/dev/loop0p1)'

Попробуйте отредактировать device.map.

Что-то я не нашел такого файла. Може grub2 его нет? Я пробовал редактировать /boot/grub/grub.cfg после update-grub и до grub-install /dev/loop0 - заменил те параметры на которые отличаются в diff-е. Установка проходит без ошибок, но выдает ту же ошибку... ;(

Что говорят команды set и ls в recovery console?

grub rescue>set
prefix=(hd0)/boot/grub
root=hd0
grub rescue>ls
(hd0)
mil ()
Ответ на: комментарий от mil

Вы точно запускаете GRUB с диска целиком, а не с партиции?

Попробуйте добавить -m part_msdos к параметрам grub-instal.

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

Попробуйте добавить -m part_msdos к параметрам grub-instal.

Раньше пробовал запускать

grub-install --modules=part_msdos --no-floppy --disk-module=part_msdos /dev/loop0
устанавливалось без ошибок, но в итоге не работало. Я и сам понимал, что груб не видит партицию. Но после вашей подсказок выполнил (ключика -m в grub-install нет):
grub-install --modules=part_msdos --no-floppy /dev/loop0
После этого груб увидел партицию и загрузил оттуда ядро. Вообщем чего я хотел - получилось. Спасибо всем, кто помогал.

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