omeh2003 19.12.2010 10:21
Tips & tricks — Выполняем разные скрипты/команды при загрузке разных ядер/опций одного дистрибутива
Это скорее "микро how-to" нежели пост. Хочу поделится с сообществом способом с помощью которого я при загрузки системы запускаю разных демонов и службы в зависимости от того какие параметры указаны в опциях загрузки ядра в GRUB.Для чего это нужно? У меня например домашняя машина работает и как сервер и как рабочая станция. Когда я использую ее как десктоп то я хочу загружать "иксы", pidgin, clawsmail. И совсем не хочу видеть все перечислительное когда компьютер работает как сервер. Зато хочу видеть FTP, Apache2, PHP, самбашару, радиус, и SSH сервер для удаленного входа.
Для начала посмотрим мой "конфиг" загрузчика:
1 |
|
Вот так выглядит пункт загрузки в обычном режиме (обратите внимание на восьмую строчку):
И вот так выглядит загрузка в "серверном режиме":
Как видите вся разница в появившемся параметре text который "говорит" ядру что не надо запускать "иксы", и что работать мы будем в терминале.
А дальше как говорится - "дело техники". В Ubuntu Linux и OpenSuse Linux ( в остальных не знаю, но думаю что так же или около того) с помощью команды:
1 |
|
Мы можем узнать строчку загрузки системы. Например в данный момент у меня она:
1 |
<10:06>ivan@luntik:~$ cat /proc/cmdline
|
Немного подумав как лучше воспользоваться этой "фичей" я написал вот такой скриптик:
Принцип работы прост. При старте системы запускается файл rc.local ( не спрашивайте почему, это закон :) ) в котором в переменную $a записывается сколько раз слово "text" встречается в опциях загрузки ядра. И если это значение равно одному, то запускаются окружение "серверного варианта".
Раньше ( то есть вчера ) тут же выполнялись условия для старта "иксов" и запускались его приложения. Но я придумал другой, как мне кажется более "кошерный", способ запуска "иксовых" программ. Возможно расскажу о нем в следующий раз :-)
exelens 19.12.2010 11:41 #
+ 1 -
Это скорее "микро how-to" нежели пост.
Перенёс в соответствующий блог.
ну кстати не такое уж и микро. Я думал о такой штуке, но не было идей как реализовать, но спасибо. Я наверное добавлю автоматический запуск виртуалки таким способом. Нормальное полноценное how-to
System V rulevels тихо рулят. Прписываете symlinks в /etc/rcN.d/, указываете нужный runlevel в меню grub и "все уже украдено до нас" (с)
Годится :) Идейно более правильное решение. Но требует более глубокого знания системы. Я например довольно редко копаюсь в конфигах и если что то добавлю в уровни запуска, то потом никогда про это не вспомню. Предпочитаю что бы такие настройки делались исключительно системой. А rc.local это как раз тот файл куда удобно запихать необходимые программы. Задача была только правильно выбрать те которые необходимо запустить в данный момент.
У меня пока негде такое использовать, но на будущее пригодится. Если позволите, пара мыслей вслух
1. google: useless cat award
2. по-моему не совсем безопасное условие, мало ли где там встретится text, как вариант, возможно так:
1. google: useless cat award
2. по-моему не совсем безопасное условие, мало ли где там встретится text, как вариант, возможно так:
grep -q "^linux.*text" /proc/cmdline && \
{/usr/bin/deluged & /usr/bin/ftp & usr/bin/apache2 & /usr/bin/sambashare & /usr/bin/razhoegovno.sh&}
exit 0
2. по-моему не совсем безопасное условие, мало ли где там встретится text, как вариант, возможно так:
Это в windows "мало ли где" и "мало ли что". А тут строчка формируется вами и если в параметры ядра не передан параметр "text" то в /proc/cmdline он никогда не появится. Вы предлагаете более строгую проверку. Это легитимное предложение, но по мне оно чрезмерное. А Я линукс люблю за простоту форм ;)
А тут строчка формируется вами
Посмотрев у себя /proc/cmdline, cоглашусь. А почему проверка на единичное вхождение text (а не просто на вхождение)?
ну это же LinuxWay! одну и ту же задачу решаем разными способами. в данном случае:
ожидается одно вхождение и, если оно свершилось, то продолжаем выполняться.
хотя, идеологически правильным, мне больше нравится твой вариант решения. ИМХО.
a=`cat /proc/cmdline |grep -c "text"`
if < $a == 1 >
if < $a == 1 >
ожидается одно вхождение и, если оно свершилось, то продолжаем выполняться.
хотя, идеологически правильным, мне больше нравится твой вариант решения. ИМХО.
Ну наверное потому что оно там должно быть одно. Если их больше, то этот либо "баг" либо "фича" :) Если "баг", то надо чинить. А если "фича", то возможно вставить вот такой костыль:
if < $a == 1 >
then
условия
fi
if < $a == 2 >
then
условия2
fi
exit
ну дык.. каждый готовит кошек как умеет, но в приведенном выше случае лучше уж использовать case
мой совет: можно привязываться к разным параметрам, но, мне кажется, стоит привязаться к ядру. в случае обыкновенного десктопа - ядро будет называться что_то_там-desktop, а в случае сервера - что_то_там-server. соответственно нужно будет собрать два ядра - для сервера и для десктопа.
я думаю, что нужные опции определишь сам.
примерно так.
мой совет: можно привязываться к разным параметрам, но, мне кажется, стоит привязаться к ядру. в случае обыкновенного десктопа - ядро будет называться что_то_там-desktop, а в случае сервера - что_то_там-server. соответственно нужно будет собрать два ядра - для сервера и для десктопа.
я думаю, что нужные опции определишь сам.
примерно так.