В основном я хочу использовать ARGV в командной строке PXE, но я не вижу документации для этого.
в основном я хочу передать что-то вроде
Scientific-linux-6 HOSTNAME VLAN
затем в% pre hit некоторые API, чтобы получить информацию о сети, мне нужно добавить ее в конфигурацию KS. Эта часть проста, если у меня есть параметры.
Наконец, в посте% я хочу запустить шеф-повар и загрузить ремешок на шеф-сервер. Для этого также необходимо знать имя хоста / имя домена (в основном, имя хоста -f не взорвется), но это не должно быть так уж плохо, если я смогу выполнить вышеуказанное. К сожалению, это была моя первоначальная цель, но потом она потерпела неудачу, когда я понял, что еще не установил имя хоста.
Вот что я до сих пор узнал.
$ cat linux-install/msgs/param.msg
09Kernel Parameter Help07
Some kernel parameters can be specified on the command line and will be
passed to the running kernel. This does not include options to modules
such as ethernet cards or devices such as CD-ROM drives.
To pass an option to the kernel, use the following format:
0flinux <options>07
If a different installation mode is desired, enter it after the option(s).
For example, to install on a system with 128MB of RAM using expert mode,
type the following:
0flinux mem=128M expert07
To pass options to modules, you will need to use the expert mode to disable
PCI autoprobing. When the installation asks for your device type that needs
an option or parameter passed to it, there will be a place to type those
in at that time.
Сладкий!? Значит, на PXE я могу ...
scientific-linux-6 linux ARGV_APPEND
Правильно?
Затем я нашел информацию о% pre и% post Эта презентация и несколько других упоминаний
Stick this at the top of the %pre section, and it will take anything of the form var=value
from /proc/cmdline and turn it into a variable you can use directly
set -- `cat /proc/cmdline`
for I in $*; do case "$I" in *=*) eval $I;; esac; done
Значит, я могу сказать
scientific-linux-6 linux HOSTNAME=foo.example.com, VLAN=ddd
Правильно?
Тогда в% pre Это означает, что я могу
Нажмите мой API, чтобы получить IP, маску, шлюз, а затем измените сеть на что-то вроде
network --bootproto=static --ip=10.0.2.15 --netmask=255.255.255.0
--gateway=10.0.2.254 --nameserver=10.0.2.1
Как описано Вот
Тогда это настраивает нас в% post для запуска нашего шеф-клиента.
У меня такой вопрос. Похоже, это сработает? Есть ли способ лучше? Неужто кто-то еще делал это раньше?
В командной строке PXE я передал параметры
$ hotbox linux prefix_varname="foo" prefix_another_var="bar"
(все после linux
помещается в / proc / cmdline. hotbox
был лейблом PXE. ) Затем в %post
Я проанализировал / proc / cmdline (в Ruby), ища все переменные, соответствующие / prefix _ * /, и превратил их в хеш. Это привело к передаче его шеф-повару для дальнейшей настройки на основе результатов веб-запроса.
Примечание: Razor не было рядом, когда я все это делал. Лично мне бритва не понравилась, и мы до сих пор пользуемся более или менее описанным выше методом.
С простыми логическими параметрами я сделал grep
в /proc/cmdline
, что очень просто. Для параметров "ключ-значение" set
Уловка кажется удобной, хотя я еще не пробовал. Конкретные ответы на ваши вопросы:
1) Да, похоже, это сработает. Я делал очень похожие вещи с кикстартом и /proc/cmdline
.
2) Нет, я не верю, что есть способ лучше. Ядро предоставляет свои параметры командной строки в /proc/cmdline
, а кикстарт не предоставляет никаких высокоуровневых механизмов для работы с параметрами командной строки ядра.
3) Да, это было сделано раньше. Попробуйте и вернитесь, если не можете заставить его работать.
Несколько дополнительных мыслей:
1) Не ставьте запятую между параметрами командной строки (просто разделяйте их пробелами).
2) В pxelinux может быть полезно использовать append
линия. Например:
append initrd=f16-x86_64/initrd.img ks=nfs:server.example.com:/path/to/f16.ks mycustomflag mykey=myval
3) Сетевые настройки (например, приведенный вами пример имени хоста) часто лучше обслуживаются DHCP.
Мне удалось заставить его работать, используя следующие команды для синтаксического анализа всех пар значений ключа на переменные:
# Get the kernel parameters
params=`cat /proc/cmdline`
# Split them on spaces
params_split=(${params// / })
# Go through each of them
for p in "${params_split[@]}"; do
# And if it's a key value pair
if [[ $p =~ "=" ]]; then
# And if the key doesn't have a period in it
p_split=(${p//=/ })
if [[ !($p_split[0] =~ ".") ]]; then
# Then set the key to the value
eval $p;
fi;
fi
done
Которые должны быть
if [[ ! ($p_split[0] =~ ".") ]]; then
^^^
И вы можете окружить это:
#raw
...
#end raw
Так что проблем с интерполяцией шаблона сапожник / гепард не возникнет.