Архив рубрики: Linux

Автозапуск скрипта при загрузке ОС с помощью Systemd на примере x11vnc. Service-файлы.

Автозапуск скрипта при загрузке ОС с помощью Systemd на примере x11vnc. Service-файлы.

С массовым переходом на systemd, вопрос запуска скрипта от имени пользователя root при загрузке ОС, стал всё чаще подниматься на форумах и в умах линуксоидов, которым ещё не приходилось сталкиваться с этой новой системой инициализации. Меня этот вопрос так же не обошёл стороной, когда пришлось внедрять корпоративный дистрибутив, использующий systemd и появилась необходимость запускать при загрузке ОС x11vnc от имени пользователя root. Выяснилось, что в systemd, эта задача решается с помощью service-файлов, имеющих простой для понимания формат и создаваемых по стандартному, для этих целей, шаблону. Файлы эти располагаются в /lib/systemd/system (системные) и /etc/systemd/system (эта директория приоритетнее первой для systemd) и имеют имена вида: название.service. Загляните в эти директории, просмотрите несколько service-файлов имеющих знакомые названия типа network.service или cups.service и в общих чертах всё станет ясно. Содержание созданного мной service-файла таково:

[root@comp-core-2-81b58d system]# cat startvncserver.service
[Unit]
Description=Start vnc server /usr/bin/startvncserver

[Service]
Type=oneshot
ExecStart=/usr/bin/startvncserver
RemainAfterExit=yes

[Install]
WantedBy=graphical.target

Где, Description=Start vnc server /usr/bin/startvncserver — Описание сервиса.
Type=oneshot — Задание метода окончания периода запуска сервиса. Oneshot означает что действие, выполняемое сервисом должно быть окончено до запуска следующего сервиса.
RemainAfterExit=yes — Используется в связке с предыдущей опцией и говорит systemd о том, что данный сервис хоть и завершит свою работу после выполнения скрипта, но должен оставаться со статусом active.
ExecStart=/usr/bin/startvncserver — Путь к скрипту для выполнения.
WantedBy=graphical.target — Параметр, который даёт понять systemd, на какой стадии загрузки системы нужно выполнить данный сервис.  multi-user.target соответствует init3. graphical.target соответствует init5.

Для запуска, остановки, перезапуска, просмотра статуса  и включения в автозгрузку сервиса (и соответственно нашего скрипта), используются стандартные команды systemd.
Запустить:

[root@comp-core-2-81b58d system]# systemctl start startvncserver.service

Остановить:

[root@comp-core-2-81b58d system]# systemctl stop startvncserver.service

Перезапустить:

[root@comp-core-2-81b58d system]# systemctl restart startvncserver.service

Посмотреть статус:

[root@comp-core-2-81b58d system]# systemctl status startvncserver.service

И самое важное! Для запуска сервиса при загрузке ОС, его нужно включить:

[root@comp-core-2-81b58d system]# systemctl enable startvncserver.service

С автозагрузкой скрипта разобрались, теперь разберём сам скрипт и опции запуска vnc сервера x11vnc. В нашем случае, подключаются клиенты только из локальной сети, поэтому шифрование мы не используем. Из необходимых требований — запрет завершения процесса от имени пользователя и запрет чтения пароля на подключение пользователем. Поэтому мы запускаем x11vnc от имени root и храним пароль в файле, доступном на чтение только ему.

[root@comp-core-2-81b58d system]# cat /usr/bin/startvncserver

#!/bin/bash
while [[ $(test -f /var/run/xauth/A* ; echo $?) -ne 0 ]]
do
sleep 1s
done
/usr/bin/x11vnc -noipv6 -shared -forever -passwdfile /etc/x11vncpasswd -bg -display :0 -auth /var/run/xauth/A*

Где, используя цикл while мы задаём проверку того, появился ли файл «магической печенки», необходимый для запуска vnc сервера и если он ещё не появился, то ждём 1 секунду и проверяем вновь. Когда необходимый файл появляется, запускаем x11vnc со следующими опциями:

-noipv6 — Не использовать ipv6.
-shared — Обеспечить возможность подключения одновременно нескольких клиентов. Без этой опции, при подключении одного клиента, второй уже подключиться не сможет.
-forever — Не завершать работу сервера после подключения первого клиента.
-passwdfile /etc/x11vncpasswd — Указать, где искать пароль для подключения. Пароль содержится в текстовом файле, без шифрования, либо создаётся командой x11vnc -storepasswd в интерактивном режиме и записывается в файл ~/.vnc/passwd в шифрованном виде. При использовании первого варианта, нужно выставить права на чтение файла только пользователю root и соответственно запускать x11vnc от имени root, что я в общем и описываю.
-bg — запустить процесс на заднем фоне, то есть отвязать его от текущего терминала.
-display :0 — номер дисплея для подключения. По умолчанию в одномониторных системах это :0.
-auth /var/run/xauth/A* — путь к файлу с магической печенкой 🙂 То есть файлу авторизации X сервера. Где он лежит в вашей системе, можно выяснить так:

[yar4e@yar4e-admin ~]$ ps aux | grep X
yar4e     6888  0.0  0.0    568   144 pts/5    D+   14:39   0:00 grep X
root      7324  0.0  0.9  42356 19852 tty7     Ss+  Mar26  26:19 X :0 vt7 -auth /var/run/xauth/A:0-uyXr3I

Всё вышеописанное реализовывалось на Alt Linux P7 TDE и может незначительно отличаться на вашем дистре.

Автор: Yar4e

Ограничение пропускной ширины канала (шейпинг) средствами Linux

В последнее время, грань между рабочим/домашним компьютером стирается. Все эти облака, концепции BYOD (bring your own device), а так же тотальное покрытие 3G/4G делает пользователей не разборчивыми в своих желаниях. И если, он нашел интересное видео, то почему бы его не скачать на телефон, что бы просмотреть со смартфона, стоя в пробке? Но корпоративные каналы не всегда могут поспевать за такими “потребностями” пользователей. Читать

Полезные Bash скрипты

Пример: очень простой скрипт резервного копирования:

#!/bin/bash
SRCD="/home/"                #SRCD - SouRCe Directory - исходный каталог
TGTD="/var/backups/"         #TGTD - TarGeT Directory - конечный каталог
OF=home-$(date +%Y%m%d).tgz  #OF - Output File - выходной файл
tar -cZf $TGTD$OF $SRCD

Читать

Wine для игр. Мой рецепт. Linux Mint/Ubuntu.

Предисловие.

Количество нативных игр для Linux растёт с каждым днём и это очень радует! Но существует так же полно хороших игр для Windows, которые либо ещё не портировали на Linux, либо не будут портировать на него вообще. К счастью есть WINE, который неумолимо и активно развивается и в нынешнем своём состоянии позволяет абсолютно комфортно, играть в большинство Windows игр. В этой заметке я не буду описывать его установку, настройку и решение проблем запуска конкретных игр — всё это подробно описано на официальном сайте и обсуждалось на многочисленных форумах. Я же опишу пару приёмов, выполняя которые можно превратить абсолютно не играбельную «из коробки» игру в конфетку! Две основные проблемы, не дающие наслаждаться графически «тяжёлыми» играми под WINE — это скорость, с которой исполняется игра, в не зависимости от мощности «железа» (в частности напрягающие «рывки») и заикающийся/трещащий/щёлкающий звук, сопровождающий аудио составляющую игры. Обе эти проблемы решаемы! Начнём.

Повышаем скорость. Запуск игры в отдельном X-сервере.

Этот приём позволяет сильно повысить скорость исполнения игры, убрать или ощутимо сгладить «рывки», которые убивают всё удовольствие от игры. Работает не зависимо от используемой видеокарты, версии драйверов или окружения рабочего стола.
Итак, нужно активировать возможность запуска X-сервера от имени любого пользователя, а не только пользователя root:

# dpkg-reconfigure x11-common

Добавить пользователя, от имени которого запускается WINE в группу audio:

# gpasswd -a username audio

Где, username — имя пользователя.

Подготовительная работа закончена. Перезагружаем компьютер или перелогиниваемся и переходим непосредственно к запуску игры в новом X-сервере. За это отвечает команда xinit. Синтаксис:

$ xinit /usr/bin/command1 /usr/bin/command2 — :1

Где, :1 — номер дисплея.
Обратите внимание, что команды, выполняемые xinit должны обязательно содержать абсолютные пути к файлам, иначе выполняться не будут.
Пример запуска игры Mass Effect 3 в новом X-сервере:

$ xinit /usr/bin/wine ~/.wine/drive_c/Mass Effect 3/Binaries/Win32/MassEffect3.exe — :1

Преимуществом запуска игры в отдельном X-сервере, так же является то, что при этом WINE не сможет изменить разрешение экран на основном рабочем столе (которое он иногда забывает вернуть назад), что спасёт Ваши нервы, а так же появляется возможность безопасного переключения между рабочим столом и игрой по сочетания клавиш: ctrl+alt+F8 — рабочий стол, ctrl+alt+F9 — игра. В основных редакциях Ubuntu этот процесс проходит гладко, а вот в Mint приводит к падению DE. Не страшно, но и не приятно. Как этого избежать, я пока не нашёл.
Стоит так же отметить, что запуская игру в новом X-сервере, возможна ситуация, когда изображение выводится с сильным смещением и большая часть изображения смещается за пределы экрана. Это лечится заданием в утилите winecfg размера виртуального рабочего стола:

Исцеляем щёлкающий/хрипящий/заикающийся звук в игре.

Думаю, люди не далёкие от Linux догадываются, что проблемы со звуком в WINE вызваны всеми любимым Pulse Audio 🙂 И исцелить «щелкунчика», можно указав WINE, что нужно использовать ALSA вместо PULSE AUDIO. Делается это просто:

$ winetricks sound=alsa

После этого перезагружаемся и наслаждаемся тем, как прекрасно WINE запускает Windows игры 🙂

Автор: Yar4e

Не работал squid_ldap_group

Настраивал связку Squid+AD. Negotiate авторизация завелась без проблем, захотелось, чтобы пользователи ходили по группам из LDAP. По мануалам настроил external acl, но оно не взлетело. В cache.log при запуске сыпалось:

2014/11/12 10:04:41| helperOpenServers: Starting 5/5 ‘squid_ldap_group’ processes

2014/11/12 10:04:41| commBind: Cannot bind socket FD 31 to [::1]: (99) Cannot assign requested address

2014/11/12 10:04:41| commBind: Cannot bind socket FD 32 to [::1]: (99) Cannot assign requested address

2014/11/12 10:04:41| ipcCreate: Failed to create child FD.

2014/11/12 10:04:41| WARNING: Cannot run ‘/usr/lib/squid3/squid_ldap_group’ process.

2014/11/12 10:04:41| commBind: Cannot bind socket FD 34 to [::1]: (99) Cannot assign requested address

2014/11/12 10:04:41| commBind: Cannot bind socket FD 35 to [::1]: (99) Cannot assign requested address

2014/11/12 10:04:41| ipcCreate: Failed to create child FD.

2014/11/12 10:04:41| WARNING: Cannot run ‘/usr/lib/squid3/squid_ldap_group’ process.

2014/11/12 10:04:41| commBind: Cannot bind socket FD 37 to [::1]: (99) Cannot assign requested address

2014/11/12 10:04:41| commBind: Cannot bind socket FD 38 to [::1]: (99) Cannot assign requested address

2014/11/12 10:04:41| ipcCreate: Failed to create child FD.

2014/11/12 10:04:41| WARNING: Cannot run ‘/usr/lib/squid3/squid_ldap_group’ process.

2014/11/12 10:04:41| commBind: Cannot bind socket FD 39 to [::1]: (99) Cannot assign requested address

2014/11/12 10:04:41| commBind: Cannot bind socket FD 40 to [::1]: (99) Cannot assign requested address

2014/11/12 10:04:41| ipcCreate: Failed to create child FD.

2014/11/12 10:04:41| WARNING: Cannot run ‘/usr/lib/squid3/squid_ldap_group’ process.

2014/11/12 10:04:41| commBind: Cannot bind socket FD 41 to [::1]: (99) Cannot assign requested address

2014/11/12 10:04:41| commBind: Cannot bind socket FD 42 to [::1]: (99) Cannot assign requested address

2014/11/12 10:04:41| ipcCreate: Failed to create child FD.

2014/11/12 10:04:41| WARNING: Cannot run ‘/usr/lib/squid3/squid_ldap_group’ process.

Вилы были в том, что squid был собран с поддержкой ipv6, и он пытался взаимодействовать со своими плагинами с помощью ipv6. Чтобы этого избежать, нужно явно указать, что необходимо использовать ipv4:

external_acl_type ldap_verify ipv4 %LOGIN /usr/lib/squid3/squid_lda…

Автор: Василий Иванов
Дата публикации: 2014-11-11T18:41:00.000-08:00

inodes: что это, или почему % свободного места не главное

Большинство компаний считают, что они могут обойтись без ИТ-специалиста. Ведь у них всё всегда работает, и ломаться не может. А в случай чего вон Ваня/Петя или какой-либо сантехник всё быстро почистит. Так было и в этот раз. Сайт одной крупной компании, выделенный хостинг, отсутствие специалиста. Как результат сайт перестает принимать заявки/обрабатывать корзину с покупками.

Судорожные звонки программистам, простой сайта, потери заказов и всё остальное, что с этим связано. К нам обратились, уже когда программисты совсем сдались, и предлагали перенести сайт на их площадку (так как у них всё работает, но опять таки не за бесплатно).И так, первый осмотр, быстрый анализ, и вот первая ошибка: при попытке запуска mc на CentOS появлялось сообщение о недостатке свободного места. Выполнив команду df -h, в это убеждаемся и начинаем мысль, что же не так. Права? Ошибка на диске? Но наша техническая wiki подсказала другого виновника — inodes. Читать