omeh2003 19.12.2010 10:21

Tips & tricksВыполняем разные скрипты/команды при загрузке разных ядер/опций одного дистрибутива

Это скорее "микро how-to" нежели пост. Хочу поделится с сообществом способом с помощью которого я при загрузки системы запускаю разных демонов и службы в зависимости от того какие параметры указаны в опциях загрузки ядра в GRUB.

Для чего это нужно? У меня например домашняя машина работает и как сервер и как рабочая станция. Когда я использую ее как десктоп то я хочу загружать "иксы", pidgin, clawsmail. И совсем не хочу видеть все перечислительное когда компьютер работает как сервер. Зато хочу видеть FTP, Apache2, PHP, самбашару, радиус, и SSH сервер для удаленного входа.

Для начала посмотрим мой "конфиг" загрузчика:
1
cat /boot/grub/grub.cfg



Вот так выглядит пункт загрузки в обычном режиме (обратите внимание на восьмую строчку):
 1
2
3
4
5
6
7
8
9
10
### BEGIN /etc/grub.d/10_linux ###
menuentry 'Ubuntu, with Linux 2.6.35-23-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set a012f75d-11c9-447c-ac66-0a38527cb7dc
linux /boot/vmlinuz-2.6.35-23-generic root=UUID=a012f75d-11c9-447c-ac66-0a38527cb7dc ro splash vga=0x315 quiet splash
initrd /boot/initrd.img-2.6.35-23-generic
}



И вот так выглядит загрузка в "серверном режиме":
 1
2
3
4
5
6
7
8
9
10
11
menuentry 'Ubuntu, with terminal' {
recordfail
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set a012f75d-11c9-447c-ac66-0a38527cb7dc
echo 'Loading Linux 2.6.35-23-generic ...'
linux /boot/vmlinuz-2.6.35-23-generic root=UUID=a012f75d-11c9-447c-ac66-0a38527cb7dc ro text vga=0x317
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-2.6.35-23-generic
}



Как видите вся разница в появившемся параметре text который "говорит" ядру что не надо запускать "иксы", и что работать мы будем в терминале.

А дальше как говорится - "дело техники". В Ubuntu Linux и OpenSuse Linux ( в остальных не знаю, но думаю что так же или около того) с помощью команды:
1
cat /proc/cmdline


Мы можем узнать строчку загрузки системы. Например в данный момент у меня она:
1
2
3
<10:06>ivan@luntik:~$  cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-2.6.35-23-generic root=UUID=a012f75d-11c9-447c-ac66-0a38527cb7dc ro splash vga=0x315 quiet splash
<10:06>ivan@luntik:~$



Немного подумав как лучше воспользоваться этой "фичей" я написал вот такой скриптик:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<10:06>ivan@luntik:~$  cat /etc/rc.local 
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
a=`cat /proc/cmdline |grep -c "text"`
if < $a == 1 >
then
/usr/bin/deluged&
/usr/bin/ftp&
/usr/bin/apache2&
/usr/bin/sambashare&
/usr/bin/razhoegovno.sh&
fi
exit 0
<10:07>ivan@luntik:~$



Принцип работы прост. При старте системы запускается файл rc.local ( не спрашивайте почему, это закон :) ) в котором в переменную $a записывается сколько раз слово "text" встречается в опциях загрузки ядра. И если это значение равно одному, то запускаются окружение "серверного варианта".

Раньше ( то есть вчера ) тут же выполнялись условия для старта "иксов" и запускались его приложения. Но я придумал другой, как мне кажется более "кошерный", способ запуска "иксовых" программ. Возможно расскажу о нем в следующий раз :-)


Тэги: grep grub загрузка ядра конфигурация
+ 6 -
Похожие Поделиться

exelens 19.12.2010 11:41 #
Это скорее "микро how-to" нежели пост.
Перенёс в соответствующий блог.
thebeetlebum 19.12.2010 11:57 #
ну кстати не такое уж и микро. Я думал о такой штуке, но не было идей как реализовать, но спасибо. Я наверное добавлю автоматический запуск виртуалки таким способом. Нормальное полноценное how-to
exelens 19.12.2010 12:00 #
перенёс ещё раз
thebeetlebum 19.12.2010 15:13 #
Да, не, в трюках как раз было место)))))
exelens 19.12.2010 15:33 #
Вернул =)))
Не путай меня
dront78 19.12.2010 12:12 #
System V rulevels тихо рулят. Прписываете symlinks в /etc/rcN.d/, указываете нужный runlevel в меню grub и "все уже украдено до нас" (с)
omeh2003 19.12.2010 12:42 #
Годится :) Идейно более правильное решение. Но требует более глубокого знания системы. Я например довольно редко копаюсь в конфигах и если что то добавлю в уровни запуска, то потом никогда про это не вспомню. Предпочитаю что бы такие настройки делались исключительно системой. А rc.local это как раз тот файл куда удобно запихать необходимые программы. Задача была только правильно выбрать те которые необходимо запустить в данный момент.
dront78 19.12.2010 12:53 #
тады ставьте Arch. там как раз bsd-style :)
koom 19.12.2010 12:24 #
У меня пока негде такое использовать, но на будущее пригодится. Если позволите, пара мыслей вслух
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
omeh2003 19.12.2010 12:48 #
2. по-моему не совсем безопасное условие, мало ли где там встретится text, как вариант, возможно так:

Это в windows "мало ли где" и "мало ли что". А тут строчка формируется вами и если в параметры ядра не передан параметр "text" то в /proc/cmdline он никогда не появится. Вы предлагаете более строгую проверку. Это легитимное предложение, но по мне оно чрезмерное. А Я линукс люблю за простоту форм ;)
koom 19.12.2010 15:08 #
А тут строчка формируется вами

Посмотрев у себя /proc/cmdline, cоглашусь. А почему проверка на единичное вхождение text (а не просто на вхождение)?
dr_magnus 19.12.2010 15:37 #
ну это же LinuxWay! одну и ту же задачу решаем разными способами. в данном случае:
a=`cat /proc/cmdline |grep -c "text"`
if < $a == 1 >

ожидается одно вхождение и, если оно свершилось, то продолжаем выполняться.
хотя, идеологически правильным, мне больше нравится твой вариант решения. ИМХО.
omeh2003 19.12.2010 17:33 #
Ну наверное потому что оно там должно быть одно. Если их больше, то этот либо "баг" либо "фича" :) Если "баг", то надо чинить. А если "фича", то возможно вставить вот такой костыль:
if < $a == 1 >
then
условия
fi
if < $a == 2 >
then
условия2
fi
exit
dr_magnus 19.12.2010 21:28 #
ну дык.. каждый готовит кошек как умеет, но в приведенном выше случае лучше уж использовать case

мой совет: можно привязываться к разным параметрам, но, мне кажется, стоит привязаться к ядру. в случае обыкновенного десктопа - ядро будет называться что_то_там-desktop, а в случае сервера - что_то_там-server. соответственно нужно будет собрать два ядра - для сервера и для десктопа.

я думаю, что нужные опции определишь сам.

примерно так.