Я настоятельно рекомендую использовать скрипт, а не 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 правильно сделает вывод, что делать ничего не нужно.
Вам не нужна полная файловая структура 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 не будет работать, но есть пример для сетевой загрузки.
Вам не нужна установленная система. Сначала вам нужно смонтировать диск, с этого момента мы будем использовать в качестве примера 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