Как установить grub на файл образа без привилегий root?
Я делаю проект, который должен создать файл образа VM, который затем будет использоваться в качестве образа загрузочного диска qemu. Ранее наш продукт был похож на модифицированную систему Linux, он был установлен на установочный USB-диск, а затем загружался и устанавливался на "голое железо". Но теперь мы хотим избавиться от оборудования и запустить его на виртуальных машинах, поэтому нам нужен файл образа.
Вместо того, чтобы использовать существующий USB-накопитель для установки системы в qemu, затем выключить виртуальную машину и получить образ, нас попросили создать файл образа из коробки напрямую и пропустить всю загрузку и установку на реальной машине или виртуальной машине. но все же получите установленный образ, так что мы можем просто доставить этот образ, и люди смогут загрузить этот образ как готовый образ виртуальной машины.
Но в течение всей процедуры я НЕ МОГУ использовать команду, требующую прав суперпользователя! Не спрашивайте почему, у нашего проекта есть куча ограничений, я просто не могу использовать привилегии root, нет sudo, no su, просто все, что может сделать только обычный пользователь....
Часть, которую я уже выполнил, использует последнюю версию команды mke2fs -d для заполнения дерева папок и файлов в разных разделах этого файла образа, как это
предположим, что после загрузки образа у нас есть структура папок
$ ls /
$ bin dev boot home lib32 mnt proc run srv tmp var boot data etc lib lib64 opt root sbin sys usr
некоторые папки монтируются разными разделами
извлечь один раздел из изображения
dd if=image of=partitionN skip=offset_of_partition_N count=size_of_partition_N bs=512 conv=sparse
заполнить папку в разделе
mke2fs -d root_dir/etc partitionN
вернуть раздел в образ
dd if=partitionN of=image seek=offset_of_partition_N count=size_of_partition_N bs=512 conv=sparse,notrunc
У нас есть первый раздел образа в качестве загрузочного раздела, который содержит папку "boot" и будет смонтирован в /boot после его загрузки.
И этот загрузочный раздел является EFI-совместимым разделом (который на самом деле кажется форматом FAT32), поскольку нашему проекту необходимо, чтобы он был таким.
НО после того, как все разделы были успешно заполнены в образе, я не могу найти способ установить grub для этого загрузочного образа. И это самый чертовски важный шаг, необходимый для того, чтобы сделать этот образ загрузочным.
Все решения, которые я нашел в Интернете, предлагают смонтировать загрузочный раздел образа, что я не могу сделать, потому что без привилегий root я не могу смонтировать образ в цикле.
Так кто-нибудь знает, как это сделать?
Я пытался понять, как grub записывает необработанные значения в mbr, и как найти stage1 и stage2 из значений внутри mbr, и как выяснить список секторов в конце первого сектора stage2, но это так сумасшествие, что в итоге мне не удалось получить этот трюк работать.
2 ответа
Отказ от ответственности: если бы я сам столкнулся с этой проблемой, я бы решил проблему напрямую, создав установщик grub2-mbr-image самостоятельно. Это настоящая атака на проблему, и она даст лучший ответ и больше по теме этого сайта; однако это больше часов исследований, чем я готов потратить на ответ stackverflow.
Здесь есть дополнительная хитрость. Мы можем получить код успеха/ошибки, используя виртуальную дискету. Нет необходимости поставлять драйвер гибкого диска. Вы можете собрать его как модуль и включить только в образ cpio.
Если мы готовы отказаться от компонента kqemu и заплатить 10-кратное замедление, мы можем запустить qemu с-hda image.img
,-kernel bzImage
и-initrd initrd.cpio.gz
и это загрузится. Вам нужен X-сервер (который вы можете предоставить с Xvnc), но нет привилегий, которых нет у обычного пользователя. Предполагая/
и/boot
одинаковы,/linuxrc
выглядит так:
#!/bin/sh
insmod /lib/modules/kernel/floppy.ko
mount /dev/hda1 -t ext2 /mnt
PATH=/bin:/usr/bin:/usr/sbin:/sbin chroot /mnt grub2-install
RESULT=$?
umount /dev/hda1
mount /dev/fda -t fat /mnt
echo -n $RESULT > /mnt/errorcode
umount /mnt
poweroff
И вы можете вернуть свой код ошибки с помощью mcopy для чтения образа дискеты.
Если qemu недоступен, вы можете собрать i586-совместимое ядро и использовать вместо него dosbox-x и запустить ядро с помощьюloadlin.exe
. Это действительно работает . Если вы попробуете это с современными вещами, они просто умрут, потому что сейчас для них требуется i686; но вы можете создать сам инструмент установки grub, ориентированный на i586, и просто использовать старое ядро для загрузки, чтобы выполнить установку. https://www.vogons.org/viewtopic.php?t=53531
Предостережение: это не полное решение, однако я опубликую, так как никто не ответил.
Я никогда не пытался это сделать, и у меня нет пары свободных часов для его тестирования, однако проект OpenWrt имеет стандартные файлы образов дисков x64, включая Grub и ядро, которые вы можете найти здесь:
Инструкции расскажут вам, как конвертировать изображения для VMWare, для Qemu оно должно быть похожим:
https://wiki.openwrt.org/doc/howto/vmware
Дело в том, что философия OpenWrt всегда заключалась в том, что сборки не должны выполняться как root, и, как правило, отказывается от сборки как root, поэтому я думаю, вы обнаружите, что у них есть способы создания образов файловой системы EXT4 с MBR и Grub. Я только тестировал встроенные платформы и никогда не собирал их из исходного кода для x86, но с этого стоит начать, если вы застряли.
Конечно, диск OpenWrt имеет только один раздел, я не уверен, как бы вы создали виртуальный диск с более сложной таблицей разделов, но, возможно, в инструментах, используемых OpenWrt, есть некоторые опции.