Не выполняются команды из rc.local

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

В большинстве дистрибутивов Linux есть штатная возможность выполнить произвольные команды в конце процесса загрузки. Для автоматического запуска необходимо указать путь к программе или скрипту в содержимом файла rc.local.

Если у вас не выполняются команды из rc.local, то одной из возможных причин может быть отсутствие прав для запуска скрипта. Если сразу после установки в CentOS не работает автозагрузка, то скорее всего причина именно в этом. Для исправления просто выполните команду:

chmod +x /etc/rc.d/rc.local

Сборка ядра Linux в Debian

Недавно мне пришлось собрать свежее ядро Linux для использования его в системе Debian 8. Вообще мне не часто пригодится собирать ядро Linux. Во-первых, редко бывают ситуации, когда действительно не обойтись без самостоятельной сборки ядра. Во-вторых, процесс это порой долгий и монотонный.

Но раз уж руки до самостоятельной сборки ядра Linux, я решил коротко описать этот процесс. За исходную конфигурации я взял параметры ядра, которое установлено в Debian 8 по умолчанию. В дальнейшем вы можете изменить параметры ядра Linux в зависимости от ваших целей.

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

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

apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc kernel-package

Теперь нам необходимо загрузить исходники ядра Linux. Для примера возьмем ядро Linux 4.4, которое я загружаю с сайта kernel.org:

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.tar.xz

Распаковываем архив с исходниками ядра и переходим в каталог с файлами:

tar xvf linux-4.4.tar.xz
cd linux-4.4

Копируем существующий конфигурационный файл ядра Linux:

cp /boot/config-$(uname -r) .config

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

make menuconfig

Например, можно удалить из ядра драйвера неиспользуемых устройств. Это не повлияет на работу ядра, зато может немного сэкономить время. После изменения настроек сохраните параметры ядра. Затем вы должны очистить дерево исходных текстов и сбросить параметры ядра:

make-kpkg clean

Запускаем процесс компиляции:

fakeroot make-kpkg --initrd --append-to-version=-vanilla --revision=r1 kernel_image kernel_headers -j 5

В качестве параметров укажите ревизию ядра --revision и количество ядер процессора +1 -j 5, которые будет задействованы в процессе сборки.
После того как будет собран deb-пакет, установите ядро командой:

dpkg -i linux-headers-4.4.0_1.0_amd64.deb
dpkg -i linux-image-4.4.0_1.0_amd64.deb

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

uname -a

Будет не лишним проверить наличие ошибок:

dmesg | egrep -i --color 'error|critical|failed'

Для удаления старого ядра Linux, выполните команду:

apt-get remove linux-image-(unused_version_number)

VMware образы операционных систем

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

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

Я решил оптимизировать рабочий процесс. Для этого я решил создать свой архив VMware образов операционных систем. Для установки я использую минимальные образы NetInstall/Minimal дистрибутивов Linux. После распаковки VMware образ можно сразу использовать для быстрого разворачивания операционной системы и тестирования программного обеспечения.

Архив VMware образов операционных систем Данный создан в первую очередь для себя и всех других людей, которые часто используют виртуализацию VMware в процессе своей работы. Имя пользователя user, пароль 123.

VMware образы операционных систем:

  • CentOS 7.1 64-bit
  • Debian 8.3 64-bit
  • Ubuntu Server 15.10 64-bit

Все VMware образы доступны для скачивания с сервера Яндекс.Диск.

Редактор по умолчанию в Ubuntu

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

В процессе работы в Ubuntu по ошибке выбрал в качестве редактора по умолчанию ed. Для того чтобы изменить редактор по умолчанию обычно необходимо просто выполнить команду:

# update-alternatives --config editor

Как оказалось, данный метод не работает если запустить команду из под sudo su. Что бы я не делал, crontab -e упорно не хотел использовать редактор nano.

Немного погуглив, на одном из форумов нашел простое решение моей проблемы. Чтобы сбросить настройки и повторно выбрать редактор по умолчанию в Debian/Ubuntu удалите файл:

rm $HOME/.selected_editor

Настройка сети на VPS от OVH

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

Настройка сети на виртуальном сервере OVH имеет свои нюансы. После установки сервер автоматически получает настройки сети по DHCP. Если вы хотите использовать дополнительный адрес, тогда вам необходимо вручную изменить настройки сетевого интерфейса eth0. В этой заметке я опишу процесс настройки статического ip-адреса и расскажу как добавить дополнительный адрес для вашего сервера.

Все действия производятся на сервере с установленной системой Debian/Ubuntu. Для начала нам необходимо получить информацию о сетевых настройках, которые сервер автоматически получил по DHCP. Для этого поочередно выполните команды ifconfig и route.

В моем случае я получил следующий результат:

# ifconfig
eth0      Link encap:Ethernet  HWaddr ff:ff:ff:ff:ff:ff
          inet addr:41.23.36.11  Bcast:41.23.36.11  Mask:255.255.255.255
          inet6 addr: fe80::f816:3eff:fedc:9a4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1622483 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1351266 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1106814117 (1.0 GiB)  TX bytes:1152293091 (1.0 GiB)
# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         41.23.36.1     0.0.0.0         UG    0      0        0 eth0
41.23.36.1     *               255.255.255.255 UH    0      0        0 eth0

Для настройки сети нас интересует следующая информация:

Inet addr: 41.23.36.11
Bcast: 41.23.36.11
Mask: 255.255.255.255
Gateway: 41.23.36.1

Откройте файл:

nano /etc/network/interfaces

Закомментируйте строки, которые отвечают за автоматическое получения адреса по DHCP:

#auto eth0
#iface eth0 inet dhcp

И добавьте свои настройки сети, как это сделано в примере ниже:

auto eth0
iface eth0 inet static
address 41.23.36.11
netmask 255.255.255.255
broadcast 41.23.36.11
post-up route add 41.23.36.1 dev eth0
post-up route add default gw 41.23.36.1
post-down route del default gw 41.23.36.1
post-down route del 41.23.36.1 dev eth0

Если вы хотите использовать дополнительный ip-адрес для вашего сервера, необходимо добавить алиас для сетевого интерфейса eth0:

auto eth0:0
iface eth0:0 inet static
address 41.24.32.121
netmask 255.255.255.255
broadcast 41.24.32.121

Установка PHP 7 с Dotdeb

Дата: 08.12.2015Метки: ,

Буквально на днях в репозиториях Dotdeb появился пакет финальной версии PHP 7. Многие жалуются на Dotdeb, но у меня никогда проблем с пакетами установленными из Dotdeb не возникало. В этой записи я опишу установку PHP7 в связке с Nginx. Вы можете ознакомится с информацией о установке PHP7 для Apache2 в следующей моей записи.

Для установки PHP 7 в Debian сначала необходимо добавить репозиторий в систему. Для этого откройте файл:

/etc/apt/sources.list

Затем добавьте в него следующие строки:

deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

Скачиваем и устанавливаем ключ GnuPG:

wget https://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

Выполните команду:

apt-get update

Установить PHP 7:

apt-get install php7.0-fpm

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

service php7.0-fpm start
service php7.0-fpm stop
service php7.0-fpm restart

Установка PHP 7 в Debian 8

Дата: 08.12.2015Метки: ,

Совсем недавно вышла финальная версия PHP 7.0.0, а это значит, что разработка достигла своего финала и пора обновить инструкцию по установке PHP 7 в Debian. Процесс сборки PHP 7 выполнялся из исходников под OS Debian 8.

Перед началом компиляции, вы можете добавить или удалить модули из сборки PHP 7. В этой статье я использую минимальный набор модулей, который необходим для нормального функционирования WordPress. Дополнительно я опишу процесс добавления модулей, которые не входят в PHP 7 по умолчанию.

Для тех кто не осилит сборку PHP 7 из исходников, описание установки PHP 7 из репозитория Dotdeb можно прочитать по этой ссылке.

Для начала установим все необходимые для сборки и работы PHP 7 зависимости:

apt-get install build-essential autoconf re2c bison libssl-dev libcurl4-openssl-dev pkg-config libpng-dev libxml2-dev libxml2 libcurl3

Указанные выше зависимости составлены исходя из указанных мной модулей PHP 7. Если вы хотите добавить другие модули, возможно, понадобиться дополнительно установить необходимые для сборки пакеты. Иначе в процессе выполнения команды ./configure вы получите ошибку.

Установка PHP 7

Все действия будем выполнять в директории:

cd /usr/src

Скачиваем и распаковываем исходники PHP 7.0.4:

wget http://de1.php.net/get/php-7.0.4.tar.bz2/from/this/mirror -O php-7.0.4.tar.bz2
tar -xvjf php-7.0.4.tar.bz2

Если на момент чтения этой статьи, уже вышла более свежая версия PHP 7, скачайте самостоятельно исходники с официального сайта.

Переходим в каталог с исходниками PHP 7:

cd php-7.0.4

Для того чтобы установить PHP 7, нам необходимо выполнить компиляцию из исходников. Перед тем как начать, добавьте или удалите неиспользуемые модули из состава PHP 7 и укажите параметры сборки.

./buildconf --force

CONFIGURE_STRING="--prefix=/usr/local/php-fpm 
--enable-fpm
--enable-mysqlnd
--enable-mbstring
--disable-pdo
--disable-phar
--with-config-file-scan-dir=/usr/local/php-fpm/etc/conf.d
--with-curl
--with-gd
--with-fpm-user=www-data
--with-fpm-group=www-data
--with-mysql-sock=/var/run/mysqld/mysqld.sock
--with-mysqli=mysqlnd
--with-zlib
--without-sqlite3
--without-pdo-sqlite"

Данная конфигурация проверена мной и протестирована на WordPress 4.4.2 с минимальным набором плагинов. Если вы хотите добавить в PHP 7 другие модули, найдите их в списке доступных параметров сборки:

./configure --help

Для компиляции и установки PHP 7, необходимо выполнить команду:

./configure $CONFIGURE_STRING
make && make install

Настройка PHP 7

Если в процессе компиляции не было ошибок, файлы PHP 7 должны быть расположены в директории:

/usr/local/php-fpm

Нам осталось внести изменения в конфигурационный файлы и добавить PHP 7 в автозагрузку. Для начала скопируем файл php.ini из каталога с исходниками в каталог установки PHP 7:

cp /usr/src/php-7.0.4/php.ini-production /usr/local/php-fpm/lib/php.ini

Чтобы включить модуль Zend OPcache, создайте файл:

mkdir -p /usr/local/php-fpm/etc/conf.d/
nano /usr/local/php-fpm/etc/conf.d/modules.ini

Скопируйте в него следующие параметры:

# Zend OPcache
zend_extension=opcache.so

Для настройки работы PHP-FPM создайте файл:

nano /usr/local/php-fpm/etc/php-fpm.conf

И добавьте в него следующие параметры:

[global]

pid = /var/run/php-fpm.pid
error_log = /var/log/php-fpm.log

include=/usr/local/php-fpm/etc/php-fpm.d/*.conf

Затем создайте файл:

nano /usr/local/php-fpm/etc/php-fpm.d/www.conf

И добавьте в него параметры:

[www]
user = www-data
group = www-data

listen = /var/run/php7-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0777

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Добавим PHP 7 в автозагрузку, создадим символическую ссылку на файл php-fpm:

ln -s /usr/local/php-fpm/sbin/php-fpm /usr/local/php-fpm/sbin/php7-fpm

Создадим в каталоге init.d скрипт для запуска PHP-FPM:

nano /etc/init.d/php-fpm

Добавьте в содержимое файла:

Дадим права на запуск, добавим скрипт в автозагрузку:

chmod +x /etc/init.d/php-fpm
update-rc.d php-fpm defaults

Затем необходимо выполнить команду:

service php-fpm restart

Для работы PHP-FPM в Nginx, добавьте в секцию server виртуального хоста:

location ~ .php$ {
    try_files $uri = 404;
    fastcgi_pass unix:/var/run/php-fpm7.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Проблемы в процессе установки PHP 7

Список ошибок, который может возникнуть по причине отсутствия установленных зависимостей.

./buildconf: 46: ./buildconf: make: not found

# Выполните установку:
apt-get install build-essential
buildconf: autoconf not found.
           You need autoconf version 2.59 or newer installed
           to build PHP from Git.
build/build.mk:37: recipe for target 'buildmk.stamp' failed

# Выполните установку:
apt-get install autoconf
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.

# Выполните установку:
apt-get install re2c
configure: error: bison is required to build PHP/Zend when building a GIT checkout!

# Выполните установку:
apt-get install bison
configure: error: Cannot find OpenSSL's 

# Выполните установку:
apt-get install libssl-dev libcurl4-openssl-dev pkg-config
configure: error: png.h not found.

# Выполните установку:
libpng-dev
configure: error: xml2-config not found. Please check your libxml2 installation.

# Выполните установку:
apt-get install libxml2 libxml2-dev

Получение сертификата Let’s Encrypt

Ранее мною была подана заявка на участие в тестировании сервиса выдачи бесплатных SSL сертификатов Let’s Encrypt. И вот сегодня, наконец-то пришло письмо о том что я могу принять участие в тестировании и получить сертификат для указанного в заявке домена.

На данный момент процесс закрытого бета-тестирования Let’s Encrypt закончен и любой желающий может создать сертификат для своего сайта.

В этой статье я опишу процесс создания и автоматического продления сертификатов с помощью сервиса Let’s Encrypt. Я использую Nginx на всех своих сайтах, поэтому, инструкция рассчитана под использование именно этого веб-сервера.

Для автоматизации получения сертификата, Let’s Encrypt использует ACME — специальный клиент написанный на Perl. Все действия осуществляются непосредственно через консоль и после получения сертификата, дальнейшее его продление будет проходить полностью в автоматическом режиме.

Для создания сертификатов использовалась виртуальная машина с OS Debian 8.2, но вы можете использовать любой другой Linux дистрибутив по своему усмотрению.

Перед тем как перейти к процессу создания сертификатов Let’s Encrypt, необходимо определится с расположением файлов ACME. Клиент нам понадобится в дальнейшем для продления сертификатов.

В моем случае ACME будет расположен в директории home:

cd /home

Если следовать официальной инструкции, для загрузки ACME необходимо установить клиент Git:

# apt-get install git

После чего загрузить файлы командой:

# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt

Как альтернативный вариант, я предлагаю просто скачать zip-архив ACME с официального репозитория GitHub.

# wget https://github.com/letsencrypt/letsencrypt/archive/master.zip

Извлекаем архив и переходим в каталог с файлами:

# unzip master.zip
# mv letsencrypt-master letsencrypt
# cd letsencrypt

Для проверки владения доменом, необходимо добавить в настройки виртуального хоста Nginx:

server {
        listen 80;
        server_name test.codebeer.ru;

        root /var/www/test.codebeer.ru;

        location '/.well-known/acme-challenge' {
            default_type "text/plain";
            alias /tmp/letsencrypt-auto';
        }
}

Для уже существующего сайта, нужно добавить в секцию server алиас:

location '/.well-known/acme-challenge' {
    default_type "text/plain";
    alias /tmp/letsencrypt-auto';
}

Создание сертификата Let’s Encrypt

Есть несколько параметров запуска клиента Let’s Encrypt. Подробнее о каждом из них можно прочитать на странице официальной документации. Чтобы создать сертификат, просто выполните команды ниже:

# export DOMAINS="-d test.codebeer.ru -d www.test.codebeer.ru"
# export DIR=/tmp/letsencrypt-auto
# mkdir -p $DIR
# ./letsencrypt-auto certonly --server https://acme-v01.api.letsencrypt.org/directory -a webroot --webroot-path=$DIR --agree-dev-preview $DOMAINS

Не забудьте заменить названия доменов на свои.

В процессе генерации сертификата Let’s Encrypt необходимо будет указать email:

Enter email address (used for urgent notices and lost key recovery)

Примите условия использования:

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.0.1-July-27-2015.pdf. You 
must agree in order to register with the ACME server at
https://acme-staging.api.letsencrypt.org/directory

Соглашаемся на сохранение вашего адреса в логах Let’s Encrypt:

NOTE: The IP of this machine will be publicly logged as having
requested this certificate. If you're running letsencrypt in manual
mode on a machine that is not your server, please ensure you're okay
with that.

Are you OK with your IP being logged?

Если проверка прошла успешно, то вы увидите следующее сообщение:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/test.codebeer.ru/fullchain.pem. Your cert
will expire on 2016-03-06. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- If like Let's Encrypt, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Сгенерированный сертификат и ключи для нашего домена будет расположены в папке:

/etc/letsencrypt/live/test.codebeer.ru/

Не меняя расположение, вам необходимо указать путь к файлам в настройка Nginx или другого веб-сервера.

Продление сертификата Let’s Encrypt

Все сертификаты Let’s Encrypt имеют срок действия равный 90 дней. Поэтому, обновлять вручную сертификаты каждые 3 месяца не совсем удобно. По словам представителей Let’s Encrypt, время жизни сертификата в будущем может быть уменьшено.

Чтобы автоматизировать процесс продления сертификата, необходимо добавить в cron скрипт:

export DOMAINS="-d test.codebeer.ru -d www.test.codebeer.ru"
export DIR=/tmp/letsencrypt-auto
mkdir -p $DIR
/home/letsencrypt/letsencrypt-auto --renew certonly --server https://acme-v01.api.letsencrypt.org/directory -a webroot --webroot-path=$DIR --agree-dev-preview $DOMAINS
service nginx restart

Скрипт для проверки работы OpenVPN

В процессе использования клиента OpenVPN в Debian 8.2, столкнулся с проблемой, когда после длительного простоя пропадала связь с сервером. Времени выяснить причину такого поведения у меня не было, было известно только то, что в системе после длительного простоя периодически падал процесс отвечающий за работу клиента OpenVPN.

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

Добавим задание в cron:

# crontab -e

В моем случае я буду запускать скрипт для проверки работы OpenVPN каждые 5 минут:

*/5 * * * * ps -A | grep openvpn || /etc/init.d/openvpn start

Настройка iptables для IPv6

Ранее я уже описывал процесс настройки iptables для Linux VPS. В этой записи я расскажу как использовать аналогичные правила для IPv6-подключения. В Linux для работы с протоколом IPv6 есть отдельная версия утилиты iptables — ip6tables.

В примере ниже вы можете увидеть набор правил для ip6tables, которые я использую на своем WEB-сервере. Как вы уже заметили, список достаточно небольшой. Разрешены входящие ICMP-пакеты и открыты порты 80 и 443.

ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT

ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -I INPUT 1 -i lo -j ACCEPT
ip6tables -A INPUT -p icmpv6 -j ACCEPT

ip6tables -A INPUT -p tcp --dport http -j ACCEPT
ip6tables -A INPUT -p tcp --dport https -j ACCEPT

Для того чтобы сохранить настройки, выполните команду:

ip6tables-save > /etc/ip6tables.conf

Чтобы восстановить настройки ip6tables:

ip6tables-restore < /etc/ip6tables.conf