Переключение раскладки GNOME

В отличии от Fedora в процессе установки Ubuntu GNOME нельзя выбрать сочетания клавиш для переключения раскладки клавиатуры. Установил я систему, но Alt-Shift ни Ctrl-Shift тут не работают. По умолчанию для переключения раскладки используются Super + Space. Стандартным способом изменить раскладку можно через Settings — Keyboard — Typing — Switch to next input source.

Вот только назначить Ctrl-Shift тут нельзя, возможность выбора сочетаний ограничена до невозможности. Что подтолкнуло разработчиков к такому решению остается только догадываться. Я уж думал плюнуть на это дело и забыть. Но как оказалось, я не тот человек, который быстро меняет свои привычки. Как не пытался, а рука сама нажимает привычные мне клавиши.

Случайно в процессе работы наткнулся на необходимые мне настройки. Изменить переключения раскладки клавиатуры на привычные сочетания можно через Gnome Tweak Tool переходим в Typing — Switch to another layout. Выбираем привычные Alt-Shift или Ctrl-Shift и продолжаем радоваться жизни.

Установка Chrome и Chromium в Ubuntu

Многие уже слышали про прекращение дальнейшей разработки Unity в Ubuntu. Это решение было настолько неожиданно, что многие приняли эту новость за очередную утку. Теперь по умолчанию место Unity в Ubuntu будет занимать Gnome 3. Лично для меня это отличный повод перейти на Ubuntu, а вместе с тем я начинаю цикл записей о том как довести ее до рабочего состояния.

И так сегодня я установил на свой домашний компьютер последнюю версию Ubuntu GNOME 17.04 (Zesty Zapus). Первые впечатления сложились положительные. Система ведет себя достаточно стабильно. И первое, что я сделаю на новой системе выполню установку Chrome. Дополнительно в этой записи я расскажу об установке Chromium. Какой из браузеров устанавливать зависит от ваших личных предпочтений.

Установить Google Chromium в Ubuntu

Начну я пожалуй с установки Chromium в Ubuntu. Если я не ошибаюсь, Chromium полностью соответствует версии браузера после установки пакета google-chrome-unstable. Для установки Chromium в Ubuntu достаточно просто выполнить команду:

sudo apt-get install chromium-browser

В Gnome после установки Chromium по аналогии с Firefox отображается заголовок окна. Не смотря на то, что он добавлен для соответствия концепции интерфейса Gnome, я предпочитаю его отключить. Для этого в настройках Chromium нужно убрать галочку возле опции Use system title bar and borders.

Установить Flash для Chromium в Ubuntu

Если на этапе установки Ubuntu вы выбрали установку программного обеспечения от сторонних производителей, то дополнительно устанавливать Flash не потребуется. В противном случае необходимо включить дополнительный репозиторий. Я использую английскую локализацию поэтому описание приложений и элементов меню будет на английском.

Что бы установить Flash для Chromium в Ubuntu включаем репозиторий Canonical partners. Для этого переходим в Software and Updates — Other Software — установить галочку напротив Canonical partners.

Далее в терминале выполнить:

sudo apt update
sudo apt install adobe-flashplugin

Проверить поддержку HTML5, H.264 и Flash можно на странице youtube.com.

Установить Chrome в Ubuntu

Чтобы установить браузер Chrome из репозитория, откройте терминал и выполните следующие команды:

wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

Если у вас установлена Ubuntu 64-Bit:

sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'

Или для Ubuntu 32-Bit:

sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'

Обновляем локальный кэш пакетов и запускаем установку:

sudo apt-get update
sudo apt-get install google-chrome-stable

Для установки бета или нестабильно версии браузера выполним в терминале одну из команд:

sudo apt-get install google-chrome-beta
sudo apt-get install google-chrome-unstable

Не удалось запустить службу Microsoft Office Software Protection Platform

Было выполнено некорректное прерывание установки Microsoft Office 2010, после чего повторная установка заканчивалась следующей ошибкой:

Ошибка 1920. Не удалось запустить службу Office Software Protection Platform (oppsvc)

Перепробовал множество советов, но проблему удалось решить только следующий образом. Для начала необходимо удалить каталог и все его содержимое:

C:\Program Files\Common Files\Microsoft Shared\OfficeSoftwareProtectionPlatform

Запускаем редактор реестра, и переходим в раздел:

HKEY_CLASSES_ROOT\AppID

Необходимо дать полные права на раздел AppID для пользователя NETWORK SERVICE.

Запускаем повторно установку Microsoft Office 2010, ждем когда появится ошибка:

Ошибка 1920. Не удалось запустить службу Office Software Protection Platform

На этот раз не предпринимаем никаких действий. Дальше снова переходим в папку:

C:\Program Files\Common Files\Microsoft Shared\

И устанавливаем для пользователя NETWORK SERVICE полные права на каталог OfficeSoftwareProtectionPlatform.

Для этого в меню Свойства — переходим во вкладку Безопасность — Дополнительно — Добавить — необходимо указать им пользователя NETWORK SERVICE и нажать кнопку ОК — затем поставить галочку Заменить разрешения для дочерних всех объектов заданными здесь разрешениями, применимыми к дочерним объектам.

Теперь заходим переходим в панель управления, службы. Необходимо в ручную запустить службу Office Software Protection Platform. Если в процессе не было ошибок, значит вы все сделали правильно. Далее переходим к установке Microsoft Office 2010 и жмем кнопку Повторить.

Оптимизация Windows в виртуальной среде

Дата: 12.04.2017Метки:

В этой заметке речь пойдет о вопросе оптимизации Windows под условия работы в виртуальной среде. Начнем с того, что многие работающие по умолчанию функции и компоненты Windows в условиях виртуализации абсолютно бесполезны и несут только дополнительную нагрузку. Сами по себе они достаточно скромно используют ресурсы. Если отключить их на одном физическом сервере, то кроме незначительной экономии оперативной памяти вы не почувствуете существенных изменений.

Есть такая поговорка: «Курочка по зернышку клюет». Теперь давайте представим ситуацию, когда под нашим гипервизором одновременно крутится несколько десятков, в идеале больше сотни виртуальных машин. После оптимизации каждой виртуальной машины с Windows, в глобальном масштабе мы получим существенную экономию вычеслительных ресурсов гипервизора.

Следует отметить, что такая оптимизация будет полезна и для отдельно взятой виртуальной машины. Естественно после оптимизации Windows производительность так и останется в рамках выделенных ей ресурсов. Но зато система становится более отзывчивая за счет за счет уменьшения количества фоновых операций, которые могли приводить к снижению скорости работы.

Для оптимизации Windows в виртуальной среде я предлагаю использовать специально предназначенную для этого утилиту — VMware OS Optimization Tool. Бесплатно скачать программу можно по следующей ссылке. Изначально утилита разрабатывалась для оптимизации настольных ОС под работу в среде VMware Horizon View. Но ее можно использовать для виртуальных машин с Windows, которые работают на любом другом гипервизоре.

На данный момент VMware OS Optimization Tool поддерживает операционные системы Windows 7-10 и Windows Server 2008-2016. По умолчанию программа автоматически выполнит оптимизацию на основе встроенного шаблона. Я использовал настройки по умолчанию, но вы можете самостоятельно выбрать необходимые для вас опции. Для оптимизации виртуальной машины с Windows рекомендую использовать стандартный шаблон VMware.

Для создания собственного шаблона откройте раздел My Templates, выберите шаблон, который вы желаете взять за основу и нажмите Copy and Edit.

Пользовательские шаблоны автоматически сохраняются в директорию:

%ProgramData%\VMware\OSOT\My Templates

Если возникнут нежелательные последствия, все изменения можно быстро откатить до предыдущего состояния. Для этого перейдите на вкладку History и нажмите кнопку Rollback.

Если хотите, можно поэкспериментировать с публичными шаблонами, при этом нужно соблюдать осторожность. Следует отметит, что публичные шаблоны могут выполнять радикальные действия. Например, удалять встроенные в систему приложений.

И напоследок хочу сказать про результаты оптимизации. На виртуальной машине с Windows 10 снизилось потребление оперативно памяти примерно на 200mb. После загрузки Windows уменьшилось количество фоновых процессов с высоким потреблением ресурсов процессора, значительно снизилась дисковая активность.

Зомби процессы в Linux

Дата: 10.04.2017Метки:

Если в вашей системе завелись зомби процессы, не расстраивайтесь. Не смотря на страшное название зомби процесс не может нанести серьезный вред вашей системе. Для начала давайте разберемся как обычный процесс превращается в зомби.

Когда дочерний процесс получает команду на завершение, он освобождает все используемые ресурсы и продолжает как зомби существовать в системе с ранее присвоенным ему PID. Далее с помощью сигнала SIGCHLD система уведомляет родительский процесс о завершении зомби процесса. Если по какой-либо причине родительский процесс игнорирует этот сигнал, то зомби процесс так и продолжает отображаться в системе.

Как вы уже поняли, зомби процессы не используют системные ресурсы, поэтому их можно просто игнорировать. Убить зомби процесс на прямую командой kill у вас не получиться. В данном случае единственный вариант полностью убрать зомби процесс — убить или перезапустить его родительский процесс.

Что бы убить зомби процесс, для начала нужно получить его PID:

# ps aux | grep -w Z
root      2037  0.0  0.0      0     0 ?        Z    09:44   0:00 [httpd] 
root      8470  0.0  0.0 112652   984 pts/10   S+   10:43   0:00 grep --color=auto -w Z

В моем примере PID зомби процесса 2037. Теперь получим PID родительского процесса:

# ps o ppid 2037
 PPID
 2033

Когда мы знаем PID, правильнее всего определить что это за процесс командой top, а затем перезапустить его.

В крайнем случае можно убить родительский процесс:

# kill -9 2033

Добавить сервис в systemd

В этой заметке я расскажу о том, как настроить сервис Linux для автоматического запуска демона после сбоя или перезагрузки. В качестве примера я буду использовать Nginx и PHP но вы можете этот способ для любых приложений.

Уже прошло достаточно много времени с того момента, как большинство популярных дистрибутивов Linux перешли на системный менеджер systemd. Тем не менее, до сих пор старая система инициализации SysV продолжает параллельно функционировать на ряду с systemd. И как и раньше, большинство пакетов после установки добавляют стартовый скрипт в каталог init.d.

Не буду вдаваться в подробности про механизмы параллелизации systemd и скорость загрузку системы. Это все хорошо и прекрасно. Но для меня главный аргумент в ползу перехода на systemd — это наличие встроенных функций отслеживания и контроля состояния сервисов. Что бы было понятнее, давайте представим следующую ситуацию.

Для примера мы установили OpenVPN, для которого по умолчанию используется механизм запуска System V. Во время установки пакета в каталог /etc/init.d будет скопирован скрипт инициализации, который будет отвечать за автоматический запуск приложения после перезагрузки. Если в один прекрасный день OpenVPN упадет, без дополнительных настроек, нужно будет каждый раз запускать этот процесс вручную.

Теперь возьмем ситуацию, когда для запуск сервиса выполнен через systemd. Если произойдет крэш или даже если вы захотите специально убить процесс, то systemd автоматически это обнаружит и повторно запустит процесс. При этом systemd обратно совместим с командами System V и сценариями инициализации.

А теперь давайте рассмотрим, как быстро добавить сервис в systemd. Демон systemd запускает сервисы описанные в его конфигурации. Конфигурация состоит из файлов, которые называют юнитами. Для юнитов созданных вручную используется каталог:

/etc/systemd/system/

В простом варианте юнит состоит из трех секции: [Unit], [Service], [Install].

Секция [Unit]

Описание юнита:

Description=MyUnit

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

After=syslog.target
After=network.target

Секция [Service]

Задаем тип сервиса:

Type=simple

Используется по умолчанию. Служба будет запущена незамедлительно. Процесс при этом не должен разветвляться. Не используйте этот тип, если другие службы зависят от очередности при запуске данной службы.

Type=forking

Указывают если служба запускается однократно и процесс разветвляется с завершением родительского процесса.

Расположение pid-файла:

PIDFile=/run/service.pid

Рабочий каталог приложения:

WorkingDirectory=/usr/local/service

Пользователь и группа, под которым будет запускаться сервис:

User=unit
Group=unit

Задаем приоритет убийства процесса при нехватке памяти:

OOMScoreAdjust=-100

Минимальное значение -1000 — полный запрет.

Команды запуска, остановки и перезапуска сервиса:

ExecStart=/usr/sbin/service
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID

Таймаут запуска или остановки сервиса:

TimeoutSec=300

Контроль запуска сервиса и автоматический запуск в случае крєша:

Restart=always

Секция [Install]

Уровень запуска сервиса:

WantedBy=multi-user.target

В итоге мы получили следующий юнит:

[Unit]
Description=MyUnit
After=syslog.target
After=network.target

[Service]
Type=forking
PIDFile=/run/service.pid
WorkingDirectory=/usr/local/service
User=munit
Group=unit
OOMScoreAdjust=-100

ExecStart=/usr/sbin/service
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutSec=300

[Install]
WantedBy=multi-user.target

Добавляем юнит в каталог:

nano /etc/systemd/system/unit_name

Включаем, запускаем и смотрим статус юнита:

systemctl enable unit_name
systemctl start unit_name
systemctl -l status unit_name

А теперь привожу примеры работающих юнитов.

Юнит systemd для запуска Nginx:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Юнит systemd для запуска php-fpm:

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/usr/local/php-fpm/var/run/php-fpm.pid
ExecStart=/usr/local/php-fpm/sbin/php-fpm --nodaemonize --fpm-config /usr/local$
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

chroot: failed to run command /bin/zsh

Дата: 04.02.2017

Для авторизации по ssh привык использовать ключи. И вот в один прекрасный день пришлось сбросить пароль root. Доступа по ssh к серверу не было, а под рукой был только загрузочный образ SystemRescueCd. После команды монтирования получил следующую ошибку:

chroot /mnt
chroot: failed to run command '/bin/zsh'  no such file or directory

В данном случае проблема связана с тем, что chroot пытается использовать zch качестве командной оболочки. На установленной у меня системе zch не используется. Поэтому необходимо указать расположение bash. Для решения проблемы достаточно просто выполнить:

chroot /mnt /bin/bash

Access denied for user ‘debian-sys-maint’@’localhost’

С проблемой можно столкнуться в результате некорректной установки MySQL. Полностью ошибка выглядит следующим образом:

mysql_upgrade: Got error: 1045: Access denied for user 'debian-sys-maint'@'localhost' (using password: YES) while connecting to the MySQL server

Суть проблемы состоит в том, что mysql_upgrade не может получить доступ к нашей базе под указанным в файле debian.cnf паролем. Если выполнить команду:

cat /etc/mysql/debian.cnf

Мы получить результат следующего вида:

# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = n4aSHUP04s1J32X5
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user     = debian-sys-maint
password = n4aSHUP04s1J32X5
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr

Нас интересует параметр password. Копируем это пароль, после чего в MySQL необходимо выполнить запрос:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'n4aSHUP04s1J32X5';

С первого раза не сработало, MySQL ругался на то, что пароль не соответствует правилам безопасности. Тогда просто можно добавить к паролю любой символ и повторить команду. При этом не забудьте указать новый пароль в фале debian.cnf.

Для того чтобы имения вступили в силу, необходимо перезапустить MySQL.

Сброс пароля MySQL

В интернете достаточно много материалов про сброс пароля root в MySQL 5.7. Процесс достаточно простой и уже много раз описывался в сети, но связи с тем, что метод опробован на практике, решил записать последовательность своих действий. Все действия выполнялись в Ubuntu 16.04 и MySQL 5.7.

Проверим версию MySQL:

mysql --version
mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

От версии пакета MySQL будет зависть SQL-запрос, который необходимо выполнить для изменения пароля. Далее останавливаем MySQL:

service mysql stop

Создаем каталог, устанавливаем на него права:

mkdir -p /var/run/mysqld
chown -R mysql /var/run/mysqld

Запускаем MySQL без загрузки grant tables, в целях безопасности отключаем сеть:

mysqld_safe --skip-grant-tables --skip-networking &

Теперь мы можем подключится к MySQL без использования пароля:

mysql -u root

Перезагрузим таблицы привилегий:

mysql> FLUSH PRIVILEGES;

Теперь осталось только изменить пароль root. Если у вас MySQL 5.7.6 или новее, MariaDB 10.1.20 или новее, используем следующую команду:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

Для версий MySQL 5.7.5 или старее, MariaDB 10.1.20 или старее, используем команду:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

Результат выполнения команды должен выглядеть следующим образом:

Output
Query OK, 0 rows affected (0.00 sec)

Перезапустим сервер сервер и подключимся к MySQL с использованием нового пароля:

mysql -u root -p

Таким образом, мы спросили пароль root и получили доступ к MySQL с правами администратора.

Включаем поддержку Brotli в Nginx

Этот алгоритм сжатия появился совсем недавно, связи с чем о использовании Brotli еще мало упоминаний в сети. Для начала необходимо упомянуть о том, что этот Brotli из себя представляет. Если кратко, Brotli — алгоритм сжатия данных основанный на современном варианте алгоритма LZ77. Brotli был разработан и представлен компанией Google в 2015 году как специализированный алгоритм для сжатия веб-шрифтов. В дальнейшем была представлена версия Brotli, которая содержала улучшения направленные на сжатие всего интернет-трафика (HTML, CSS, JS).

Сейчас момент Brotli используют для ускорения загрузки веб-страниц, его поддержка включена по умолчанию в Chrome 51+, Firefox 47+ и мобильным Chrome. По сравнению с gzip, алгоритм Brotli показывает сравнимую скорость, но при этом имеет лучшие показатели сжатия данных. Следует отметить, что Brotli несовместим с gzip и работает только для HTTPS-ресурсов.

На данный момент нет официального модуля для поддержки Brotli в Nginx. Зато мы имеем возможность использовать сторонние модули, которые параллельно развиваются Google и Cloudflare. В данном посте я расскажу о сборке Nginx с включенным модулем Brotli от Cloudflare. Если интересно, то исчерпывающую информацию по работе алгоритма Brotli можно найти в блоге Cloudflare.

Процесс аналогичен сборке Nginx с любыми другими модулями. Для начала необходимо скачать исходники Nginx. Добавим в файл /etc/apt/sources.list официальный репозиторий для mainline-ветки Nginx:

deb http://nginx.org/packages/mainline/debian/ codename nginx
deb-src http://nginx.org/packages/mainline/debian/ codename nginx

Скачиваем и устанавливаем PGP-ключ, после чего не забудьте обновить индекс пакетов apt:

cd /tmp/ && wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key
apt-get update

Устанавливаем пакет dpkg-dev и все необходимые для сборки Nginx зависимости:

apt-get install dpkg-dev
apt-get build-dep nginx
apt-get install git autoconf libtool

Скачиваем исходники Nginx:

cd /usr/src
apt-get source nginx

Получаем код модуля ngx_brotli_module:

git clone https://github.com/cloudflare/ngx_brotli_module.git

В каталог с модулем ngx_brotli_module необходимо загрузит исходники библиотеки libbrotli:

cd /usr/src/ngx_brotli_module
git clone https://github.com/google/brotli.git

Перед началом сборки и компиляции необходимо внести изменения в конфигурационный файл:

nano /usr/src/nginx-1.11.5/debian/rules

Необходимо добавить путь к исходникам ngx_brotli_module в содержимое переменно CFLAGS:

config.status.nginx: config.env.nginx
        cd $(BUILDDIR_nginx) && \
        CFLAGS="" ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --add-module=/usr/src/ngx_brotli_module --with-cc-opt="$(CFLAGS)" --with-ld-opt="$(LDFLAGS)"
        touch $@

Дополнительно рекомендую собрать Nginx c поддержкой APLN. Переходим к компиляции и сборке deb-пакета Nginx:

cd /usr/src/nginx-1.11.5
dpkg-buildpackage -rfakeroot -uc -b

Если в процессе не было ошибок, то в рабочем каталоге мы увидим собранные deb-пакета Nginx.

Для активации режима сжатия Brotli указываем следующие параметры:

brotli on;
# уровень компрессии от 1 до 11
brotli_comp_level 6;
# минимальный размер файла для использования сжатия
brotli_min_length Num;

Когда Brotli включен, он получает приоритет наl gzip, если браузер не поддерживает Brotli, данные сжимаются при помощи gzip. Теперь остается только проверить поддерживает ли наш сайт сжатие Brotli с помощью онлайн сервиса Brotli Test.