Назад | Перейти на главную страницу

обновить 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

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

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

# 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, вы должны rm файл 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)).

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