Обновить grub2 без аппаратного доступа (например, в chroot)?

Я пишу сценарий, который берет основной образ KVM, преобразует его в VDI, вносит в него несколько изменений и предлагает его для загрузки.

Мне нужно обновить параметры загрузки ядра для некоторых вновь созданных образов. Обычно нужно отредактировать параметр GRUB_CMDLINE_LINUX_DEFAULT в /etc/default/grub, а затем запустить update-grub. Конечно, я могу сделать это только в chroot, который завершается ошибкой: '/usr/sbin/grub-probe: error: не удается найти устройство для / (смонтировано ли /dev?). "

Привязка mount /dev из работающей системы в chroot позволяет запускать update-grub, но приводит к повреждению grub.cfg (неправильное корневое устройство с точки зрения образа).

Если я просто использую sed для добавления необходимых параметров ядра, он получит загрузку образа, но последующие запуски update-grub (изнутри запущенного образа) вызовут проблемы.

Итак, мое текущее решение:

  1. редактировать параметры в / etc / default / grub
  2. привязать mount /dev в chroot
  3. запустить update-grub в chroot
  4. используйте sed для исправления ошибочных узлов устройства в /boot/grub/grub.cfg

Пожалуйста, скажите мне, что есть лучший способ.

2 ответа

Правильный ответ - монтировать / dev в chroot и использовать файл $CHROOT/boot/grub/device.map, чтобы сказать grub, что (hd0) (с точки зрения образа) на самом деле является файлом обратной петли, который вы "разбили на разделы" msgstr " (и затем монтируется в ваш chroot с помощью kpartx et c).

# generate grub configs and install it to the generated blockdev
chroot $MR update-grub 2> /dev/null
chroot $MR grub-mkconfig -o /boot/grub/grub.cfg 2> /dev/null
cat > $MR/boot/grub/device.map <<EOF
(hd0)   ${LOOPDEV}
EOF
chroot $MR grub-install ${LOOPDEV} 2> /dev/null

После того, как вы закончите установку grub на "mbr" loopdev, вы должны заархивировать файл device.map, потому что он не будет точным с точки зрения образа после его фактической загрузки.

У меня есть скрипт, который собирает полные образы qcow2 для Ubuntu 13.10 Saucy x64 здесь:

https://github.com/sneak/kvm-ubuntu-imagebuilder/blob/master/buildimage.sh#L211

Удачи.

Обратите внимание, что этот ответ предполагает, что ваш диск разбит на разделы.

Ответ sneak работает для Debian wheezy, который запускает grub 1.99, но не для grub2. Вы захотите использовать UUID (как рекомендовано разработчиками grub) для ссылки на устройства / разделы.
Вот проблема: kpartx (инструмент, используемый для отображения разделов), не создает символические ссылки в /dev/disk/by-uuid, который grub использует для проверки того, что он может использовать обнаруженный UUID при создании конфигурации, поэтому он возвращается к пути устройства. Чтобы исправить это просто символическую ссылку на устройство самостоятельно (ln -s /dev/sdX /dev/disk/by-uuid/$(blkid -s UUID -o value /dev/sdX)).

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

Другие вопросы по тегам