Как установить grub на пустой диск с Ubuntu LiveCD

Я настоятельно рекомендую использовать скрипт, а не make-файл.

Причины, вкратце:

  • придерживаясь общепринятой практики. или принцип наименьшего удивления .
  • ремонтопригодность и расширяемость.
  • и тот факт, что make-файлы предназначены для автоматизации процесса сборки, а не для автоматизации задач системного администратора.

Использование make-файла не является «неправильным» по своей сути, у него есть свои преимущества, но также и много предостережений. Что бы вы ни решили, вы должны знать компромиссы.

Позвольте мне уточнить.

придерживаясь общепринятой практики или принципа наименьшего удивления

Когда я вижу сценарий, я предполагаю, что он что-то автоматизирует. Когда я вижу make-файл, я предполагаю, что он что-то строит. Когда я работаю в вашем офисе, и я хочу добавить пользователя, и я смотрю в документацию, и там говорится, что нужно запустить make-файл, я сначала буду сбит с толку. Будет ли makefile создавать инструмент, который я затем использую для добавления пользователя? Мне придется изучить make-файл, чтобы убедиться, что он действительно добавляет пользователя.

ремонтопригодность и расширяемость

Изменения случаются. Системы меняются. Требования меняются. Инструменты нужно будет адаптировать. Вот несколько предостережений, о которых я могу подумать, пытаясь адаптировать make-файл, который используется для автоматизации задачи системного администратора.

В произвольном порядке:

  • Вы должны начинать каждую строку рецепта с табуляцией (см. определение синтаксиса правил makefile). Может быть, это просто мое личное раздражение. Это можно преодолеть с помощью хорошего редактора, который можно настроить так, чтобы не заменять начальную вкладку пробелами в make-файлах. обходной путь возможен с помощью .RECIPEPREFIX , но тогда вы снова нарушаете общие ожидания.

  • Вы не можете (легко )обрабатывать аргументы в make-файлах. Это сильно усложнит добавление таких аргументов, как --verbose, --forceили --no-action.Подробнее см. здесь:https://stackoverflow.com/a/45003119/360899

  • В дополнение к описанному выше :вы не можете настраивать сообщения об ошибках обработки аргументов. Другими словами :вы не можете писать осмысленные сообщения об ошибках, если пользователь указал неправильные аргументы

  • Вы не можете (легко )извлечь общий код в функции. Есть "законсервированные рецепты" . Но я бы не хотел.

  • Вы не можете (легко )писать многострочные конструкции сценария оболочки, потому что make выполняет каждую строку рецепта сам для себя. Например, if [ condition ]; then commands; fiили for elements; do commands; doneдолжны быть записаны в одну строку. обходной путь возможен с использованием .ONESHELL

  • Кроме того, из-за вышеизложенного вы не можете (легко )установить флаг в одной строке и воздействовать на него в строке ниже. Потому что каждая линия стоит сама по себе. обходной путь, как указано выше.

  • Другие загадочные особенности makefile. Например:

Дополнительная проблема :вы не можете поместить make-файл в /usr/binили ~/bin. вам все равно нужно будет написать скрипт-оболочку.

make-файлы предназначены для автоматизации процесса сборки, а не для автоматизации задач системного администратора

Использование make-файлов для автоматизации системных задач похоже на использование git вместо rsync для резервного копирования системы.

Make — мощный инструмент с множеством особенностей для автоматизации процессов сборки. Git — мощный инструмент с множеством особенностей для управления версиями кода. Причуды терпимы, если использование инструмента очень помогает. Но если есть другие инструменты, лучше предназначенные для выполнения поставленной задачи, то зачем обходить особенности инструмента, предназначенного для чего-то другого.


Демонстрация:

Преимущество make-файла, о котором я могу думать, заключается в том, что вам не нужно писать шаблон для обработки аргументов.Сравните:

Makefile:

useradd:
    @echo commands that do the things for useradd

userdel:
    @echo commands that do the things for userdel

Скрипт:

#!/bin/sh

if [ $# == 0 ]; then
  echo "need argument: useradd or userdel"
  exit 1
fi

if [ "$1" == "useradd" ]; then
  echo "commands that do the things for useradd"
elif [ "$1" == "userdel" ]; then
  echo "commands that do the things for userdel"
else
  echo "unknown argument: $1"
  exit 1
fi

Но тогда:

$ make userdell
make: *** No rule to make target 'userdell'.  Stop.
$./script.sh userdell
unknown argument: userdell

вы не можете настроить сообщения об ошибках.

$ touch userdel
$ make userdel
make: 'userdel' is up to date.

Если файл с именем userdelпо какой-то причине существует, make правильно сделает вывод, что делать ничего не нужно.

1
26.01.2021, 10:59
2 ответа

Вам не нужна полная файловая структура Linux, если вы просто загружаете ISO-образ. Я установил grub на флешку с различными форматами и загрузил ISO на ту же флешку. Не уверен, что для сетевой загрузки требуется точная строфа загрузки grub.

У меня была старая флешка USB2, которую я переформатировал. Сначала я делаю это gpt, так как я предпочитаю его 40-летнему разделению MBR. Вы можете использовать gparted, что я обычно и делаю. Перед запуском выберите gpt в разделе «устройство», а не msdos (MBR )по умолчанию. или используйте parted или gdisk. Примечание. :Это полностью стирает диск. sdX — это ваша флешка.

sudo parted /dev/sdX mklabel gpt

Затем я использовал gparted для создания большого раздела FAT32. Мне пришлось перезагрузиться, чтобы он отображался правильно, и файловый браузер не монтирует разделы ESP автоматически, поэтому использовал диски или монтировал вручную.

Model: Kingston DataTraveler 2.0 (scsi)
Disk /dev/sdc: 1998MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  1998MB  1996MB  fat32        esp2  msftdata

Затем я смонтировал его с помощью дисков, а потом он оказался в /media/fred:

/dev/sdc1 on /media/fred/FC87-F75C type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)

Затем установил grub. Мой диск был виден как sdc. Был немного медленным, как старая флешка USB2.

sudo grub -установить --корень -каталог =/media/fred/FC87 -F75C /dev/sdc

Он создал структуру и обычный /EFI/ubuntu/grub.cfg, который представляет собой 3-строчный файл конфигурации для полной загрузки в /boot/grub/grub.cfg. Но не создавал загрузочный файл /boot/grub/grub.cfg. Обычно я вручную создавал один для загрузки локального ISO, используя эти ссылки и мои старые заметки. Вам нужно будет создать grub.cfg, но с путем и монтированием? в сеть.

Загрузка ISO и ссылка на примеры

https://help.ubuntu.com/community/Grub2/ISOBoot

еще примеры

https://help.ubuntu.com/community/Grub2/ISOBoot/Examples

Информация о сети, которую я нашел с помощью Google. nfs не будет работать, но есть пример для сетевой загрузки.

Настройте nfsroot для GRUB PXE

Как загрузить ядро ​​Linux из сети через консоль GRUB2?

1
18.03.2021, 22:34

Вам не нужна установленная система. Сначала вам нужно смонтировать диск, с этого момента мы будем использовать в качестве примера sda. В качестве примера точки монтирования/media/usr/DISK

В терминале используйте этот код:

dirs=(etc bin usr proc sys lib lib64 dev sbin)

for dir in ${dirs[@]}; do
  mkdir /media/usr/DISK/$dir
  sudo mount --bind /$dir /media/usr/DISK/$dir
done

sudo chroot /media/usr/DISK/ grub-install --target=i386-pc --boot-directory=/ /dev/sda

for dir in ${dirs[@]}; do
  sudo umount /media/usr/DISK/$dir
  rm -r /media/usr/DISK/$dir
done

0
18.03.2021, 22:34

Теги

Похожие вопросы