Видео ролики бесплатно онлайн

Смотреть вудман видео

Официальный сайт e-rus 24/7/365

Смотреть видео бесплатно

19.12.10 10:21 omeh2003

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

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

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

Для начала посмотрим мой "конфиг" загрузчика:
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 ( в остальных не знаю, но думаю что так же или около того) с помощью команды:
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" встречается в опциях загрузки ядра. И если это значение равно одному, то запускаются окружение "серверного варианта".

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



exelens 19.12.10 11:41 # +1
Это скорее "микро how-to" нежели пост.
Перенёс в соответствующий блог.

%username% love BDSM!

exelens 19.12.10 12:00 # +1
перенёс ещё раз

%username% love BDSM!

exelens 19.12.10 15:33 # +2
Вернул =)))
Не путай меня
dront78 19.12.10 12:12 # +4
System V rulevels тихо рулят. Прписываете symlinks в /etc/rcN.d/, указываете нужный runlevel в меню grub и "все уже украдено до нас" (с)
omeh2003 19.12.10 12:42 # +-1
Годится :) Идейно более правильное решение. Но требует более глубокого знания системы. Я например довольно редко копаюсь в конфигах и если что то добавлю в уровни запуска, то потом никогда про это не вспомню. Предпочитаю что бы такие настройки делались исключительно системой. А rc.local это как раз тот файл куда удобно запихать необходимые программы. Задача была только правильно выбрать те которые необходимо запустить в данный момент.
dront78 19.12.10 12:53 # +1
тады ставьте Arch. там как раз bsd-style :)
koom 19.12.10 12:24 # +1
У меня пока негде такое использовать, но на будущее пригодится. Если позволите, пара мыслей вслух
1. google: useless cat award
2. по-моему не совсем безопасное условие, мало ли где там встретится text, как вариант, возможно так:

1
2
3
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.10 12:48 # +0
2. по-моему не совсем безопасное условие, мало ли где там встретится text, как вариант, возможно так:

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

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

ожидается одно вхождение и, если оно свершилось, то продолжаем выполняться.
хотя, идеологически правильным, мне больше нравится твой вариант решения. ИМХО.
omeh2003 19.12.10 17:33 # +0
Ну наверное потому что оно там должно быть одно. Если их больше, то этот либо "баг" либо "фича" :) Если "баг", то надо чинить. А если "фича", то возможно вставить вот такой костыль:
1
2
3
4
5
6
7
8
9
if [ $a == 1 ]
then
 условия
fi
if [ $a == 2 ]
then
 условия2
fi
exit
dr_magnus 19.12.10 21:28 # +2
ну дык.. каждый готовит кошек как умеет, но в приведенном выше случае лучше уж использовать case

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

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

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

Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 154)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 3085 из 228 городов)
            Топ пользователей Топ блогов
            welinux.ru

            Смотреть онлайн бесплатно

            Онлайн видео бесплатно


            Смотреть русское с разговорами видео

            Online video HD

            Видео скачать на телефон

            Русские фильмы бесплатно

            Full HD video online

            Смотреть видео онлайн

            Смотреть HD видео бесплатно

            School смотреть онлайн