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.

Очистить журнал systemd

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

На сегодняшний день systemd стал де-факто стандартом для современных Linux-систем. Его компонент journal cобирает все системные сообщения: сообщения ядра, служб и приложений. После чего происходит их запись в виде бинарных файлов. Для просмотра и управления файлами логов используется утилита journalctl.

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

Однако ситуация требует внимания и нуждается в периодическом мониторинге. Чтобы посмотреть общий размер файлов журнала systemd, достаточно выполнить команду:

journalctl --disk-usage

Что бы ограничить бесконтрольное хранение журнала, нам необходимо выполнить настройку ротации логов. С помощью опций −−vacuum-size и −−vacuum-time мы можем соответственно установить предельно допустимый размер и срок хранения для хранимых на диске логов.

Команда ниже устанавливает предельно допустимый размер для хранимых на диске логов в 1 ГБ, после его превышения лишние файлы будут автоматические удалены.

journalctl --vacuum-size=1G

Подобным образом образом работает опция −−vacuum-time. Команда установит для логов срок хранения, по истечении которого они будут удалены автоматически:

journalctl --vacuum-time=1years

Дополнительно нужно прописать настройки ротации логов в конфигурационный файл:

vi /etc/systemd/journald.conf

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

# Максимальный объём логов на диске
SystemMaxUse=
# Объём свободного места на диске после сохранения логов
SystemKeepFree=
# Объём файла лога, по достижении которого он должен быть удален
SystemMaxFileSize=
# Максимальный объём, который логи могут занимать в /run
RuntimeMaxUse=
# Объём свободного места, которое должно оставаться в /run после сохранения логов
RuntimeKeepFree=
# Объём файла лога, по достижении которого он должен быть удален из /run.
RuntimeMaxFileSize=

Применяем настройки без перезапуска системы:

systemctl restart systemd-journald

Автоматическая установка Debian

Установку Debian можно полностью автоматизировать путем использования специального файла с заранее указанным сценарием ответов на все вопросы инсталлятора. Данный способ автоматической установки называется Debian Preseed. Далее созданный файл-сценарий ответов preseed.cfg запаковывается в initrd установочного iso-образа Debian.

Информацию с описанием параметров сценария Preseed можно можно найти на официальном сайте. И я не вижу смысла дублировать эту информацию в своем блоге. Вместо этого я сразу размещу содержимое используемого мной файла preseed.cfg, а если у вас возникнут вопросы, то описание параметров вы всегда сможете найти по указанной выше ссылке.

В файле сценариев для своих нужд я использовал такие переменные параметры, как: ($IP), ($NETMASK), ($GATEWAY). Ниже привожу пример моего файла сценария Debian Preseed. Внимание! Особенно обратите внимание на блок ### Partitioning, вначале которого я полностью забиваю нулями содержимое диска. Данные будут полностью стерты со всех дисков в системе, будьте крайне осторожны.

### Localization
d-i debian-installer/locale string en_US
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/xkb-keymap select us

### Network configuration
d-i netcfg/choose_interface select auto
d-i netcfg/disable_autoconfig boolean true
# IPv4
d-i netcfg/get_ipaddress string ($IP)
d-i netcfg/get_netmask string ($NETMASK)
d-i netcfg/get_gateway string ($GATEWAY)
d-i netcfg/get_nameservers string ($NAMESERVER)
d-i netcfg/confirm_static boolean true
# Hostname
d-i netcfg/get_hostname string ($HOSTNAME)

### Mirrors
d-i mirror/country string manual
d-i mirror/http/hostname string ($MIRROR)
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string ($HTTPPROXYv4)
d-i mirror/suite string stable

### Account setup
d-i passwd/root-login boolean true
d-i passwd/make-user boolean false
d-i passwd/root-password-crypted password ($PASS_CRYPT)
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false

### Clock
d-i clock-setup/utc boolean true
d-i time/zone string ($TIMEZONE)
d-i clock-setup/ntp boolean false

### Partitioning
d-i partman/early_command string \
for DISK in $(list-devices disk); do \
    parted -s ${DISK} mklabel gpt; \
    parted -s ${DISK} mklabel msdos; \
        dd if=/dev/zero of=${DISK} bs=512 count=1; \
done;

d-i partman-auto/method string regular
d-i partman-basicfilesystems/no_swap boolean false
d-i partman-auto/expert_recipe string                         \
      root ::                                                 \
              5000 5000 -1 ext4                               \
                      method{ format } format{ }              \
                      use_filesystem{ } filesystem{ ext4 }    \
                      mountpoint{ / }                         \
              .                                               \
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/mount_style select uuid

### Apt setup
d-i apt-setup/contrib boolean true
d-i apt-setup/services-select multiselect security, volatile
tasksel tasksel/first multiselect minimal
d-i pkgsel/include string openssh-server
popularity-contest popularity-contest/participate boolean false

### Grub
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev string default

### Finish install
d-i finish-install/keep-consoles boolean true
d-i finish-install/reboot_in_progress note

d-i preseed/late_command string \
        sed -i '/^PermitRootLogin/c PermitRootLogin yes' /target/etc/ssh/sshd_config ;\
        if [ -n "($SSHPUBKEYS)" ]; then \
                mkdir -p /target/root/.ssh ;\
                chmod 700 /target/root/.ssh ;\
                echo "($SSHPUBKEYS)" > /target/tmp/keyfile ;\
                cat /target/tmp/keyfile | /target/usr/bin/base64 -d > /target/root/.ssh/authorized_keys ;\
                in-target rm -f /tmp/keyfile ;\
        fi ;\
        sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT/c GRUB_CMDLINE_LINUX_DEFAULT="quiet"' /target/etc/default/grub ;\
        sed -i '/^GRUB_TIMEOUT/c GRUB_TIMEOUT=0' /target/etc/default/grub && in-target update-grub

Failed to execute ban jail ‘sshd’ action ‘iptables-multiport’

Связи с тем, что для выхода в интернет я использую статический IP, мне достаточно редко приходится использовать fail2ban на своих серверах. Я предпочитаю просто закрыть доступ к SSH в iptables. После настройки VMmanager, был автоматически установлен пакет fail2ban. После чего в логах стали регулярно появляться ошибки следующего содержания:

2016-08-13 05:43:23,463 fail2ban.actions        [1011]: NOTICE  [sshd] Ban 91.224.160.106
2016-08-13 05:43:23,565 fail2ban.action         [1011]: ERROR   iptables -w -n -L INPUT | grep -q 'f2b-sshd[ \t]' -- stdout: ''
2016-08-13 05:43:23,565 fail2ban.action         [1011]: ERROR   iptables -w -n -L INPUT | grep -q 'f2b-sshd[ \t]' -- stderr: ''
2016-08-13 05:43:23,565 fail2ban.action         [1011]: ERROR   iptables -w -n -L INPUT | grep -q 'f2b-sshd[ \t]' -- returned 1
2016-08-13 05:43:23,565 fail2ban.CommandAction  [1011]: ERROR   Invariant check failed. Trying to restore a sane environment
2016-08-13 05:43:23,667 fail2ban.action         [1011]: ERROR   iptables -w -D INPUT -p tcp -m multiport --dports ssh -j f2b-sshd
iptables -w -F f2b-sshd
iptables -w -X f2b-sshd -- stdout: ''
2016-08-13 05:43:23,667 fail2ban.action         [1011]: ERROR   iptables -w -D INPUT -p tcp -m multiport --dports ssh -j f2b-sshd
iptables -w -F f2b-sshd
iptables -w -X f2b-sshd -- stderr: "iptables v1.4.21: Couldn't load target `f2b-sshd':No such file or directory\n\nTry `iptables -h' or 'iptables --help' for more information.\niptables: No chain/target/match by that name.\niptables: No chain/target/match by that name.\n"
2016-08-13 05:43:23,667 fail2ban.action         [1011]: ERROR   iptables -w -D INPUT -p tcp -m multiport --dports ssh -j f2b-sshd
iptables -w -F f2b-sshd
iptables -w -X f2b-sshd -- returned 1
2016-08-13 05:43:23,667 fail2ban.actions        [1011]: ERROR   Failed to execute ban jail 'sshd' action 'iptables-multiport' info 'CallingMap({'ipjailmatches':  at 0x182b050>, 'matches': u'2016-08-13T05:43:07.237432 skvm1.powervps.ru sshd[850]: Invalid user admin from 91.224.160.106\n2016-08-13T05:43:09.504130 skvm1.powervps.ru sshd[852]: Invalid user admin from 91.224.160.106\n2016-08-13T05:43:11.811482 skvm1.powervps.ru sshd[856]: Invalid user admin from 91.224.160.106\n2016-08-13T05:43:14.043115 skvm1.powervps.ru sshd[858]: Invalid user admin from 91.224.160.106\n2016-08-13T05:43:22.962543 skvm1.powervps.ru sshd[878]: Invalid user support from 91.224.160.106', 'ip': '91.224.160.106', 'ipmatches':  at 0x181ded8>, 'ipfailures':  at 0x182b0c8>, 'time': 1471056203.463139, 'failures': 5, 'ipjailfailures':  at 0x182b140>})': Error stopping action

Сначала я грешил на использования ключа iptables -w в добавляемых правилах.

nano /etc/fail2ban/action.d/iptables-common.conf

В конце файла вы увидите параметр lockingopt и комментарий к нему:

# Option:  lockingopt
# Notes.:  Option was introduced to iptables to prevent multiple instances from
#          running concurrently and causing irratic behavior.  -w was introduced
#          in iptables 1.4.20, so might be absent on older systems
#          See https://github.com/fail2ban/fail2ban/issues/1122
# Values:  STRING
lockingopt = -w

Тогда я решил проверить версию установленного пакета:

# iptables --version
iptables v1.4.21

Но причина была не в этом. После продолжительного гугления, проблема оказалась связана с конфигом jail.local, в который вносит изменения VMmanager в процессе установки. Чтобы починить fail2ban, откройте файл:

nano /etc/fail2ban/jail.local

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

# ISPsystem start
#[sshd]
#maxretry = 5
#enabled = true
# ISPsystem end

[DEFAULT]
bantime = 3600
banaction = iptables-multiport

[sshd]
maxretry = 5
enabled = true

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

2016-08-14 10:36:01,828 fail2ban.jail           [23203]: INFO    Jail 'sshd' started
2016-08-14 10:36:01,947 fail2ban.actions        [23203]: NOTICE  [sshd] Ban 78.47.79.193

Failed to get D-Bus connection: Connection refused

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

С данной проблемой столкнулся в Debian 8, когда мне понадобилось создать новый сервис для запуска rtorrent в режиме демона. При попытке запуска нового сервиса я получил ошибку:

$ systemctl --user enable rtorrent
Failed to get D-Bus connection: Connection refused

Как оказалась проблема кроется зависимостях для systemd:

$ apt-cache depends systemd
systemd
  Depends: libacl1
  Depends: libaudit1
  Depends: libblkid1
  Depends: libcap2
  Depends: libcryptsetup4
  Depends: libkmod2
  Depends: libpam0g
  Depends: libselinux1
  Depends: libsystemd0
  Depends: util-linux
  Depends: mount
  Depends: initscripts
  Depends: sysv-rc
    openrc
  Depends: udev
  Depends: acl
  Depends: adduser
  Depends: libcap2-bin
  PreDepends: libc6
  PreDepends: libgcrypt20
  PreDepends: liblzma5
  PreDepends: libselinux1
  Suggests: systemd-ui
  Recommends: libpam-systemd
  Recommends: dbus
  Conflicts: 
  Breaks: lsb-base
  Breaks: lvm2
  Breaks: systemd-shim

Из рекомендованных зависимостей для systemd в Debian 8 был установлен только пакет dbus. Выполните установку пакета libpam-systemd, после чего необходимо перезагрузить систему. После чего проблема с запуском systemd должна быть решена.

Установка PHP7 и Apache2 в Debian 8

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

Много лет назад, когда еще не было Nginx, в мире интернета де-факто стандартом была связка из PHP и Apache. В те времена не было ни Amazon Web Services, Azure, Cloud Platform и прочих облачных систем. А VPS хостинг только начинал набирать популярность. Как правило, виртуальные машины стоили дорого и имели очень мало оперативной памяти. На моем первом VPS c Jail мне приходилось бороться за каждый мегабайт оперативной памяти. Даже после отключения всех неиспользуемых модулей Apache и прочей оптимизации, VPS периодически не справлялся с нагрузкой.

Сегодня я всеми путями пытаюсь отказаться от использования Apache. Но бывают ситуации, когда по той или иной причине приходится использовать Apache2. В данной записи я расскажу о установке связки из PHP7 и Apache2. Для установки свежей версии PHP7 я буду использовать репозиторий Dotdeb.

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

apt-get update && apt-get dist-upgrade

Выполните команду ниже для того чтобы установить Apache2:

apt-get install apache2

Для установки PHP7 для начала нам необходимо добавить репозиторий Dotdeb. Откройте файл:

nano /etc/apt/sources.list

Добавьте в конец файла две строки:

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

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

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

Обновляем локальный кеш пакетов:

apt-get update

Список доступных пакетов для установки:

# apt-cache search php7
libapache2-mod-php7.0 - server-side, HTML-embedded scripting language (Apache 2 module)
libphp7.0-embed - HTML-embedded scripting language (Embedded SAPI library)
php-all-dev - package depending on all supported PHP development packages
php7.0 - server-side, HTML-embedded scripting language (metapackage)
php7.0-apcu - APC User Cache for PHP
php7.0-apcu-bc - APCu Backwards Compatibility Module
php7.0-bz2 - bzip2 module for PHP
php7.0-cgi - server-side, HTML-embedded scripting language (CGI binary)
php7.0-cli - command-line interpreter for the PHP scripting language
php7.0-common - Common files for packages built from the PHP source
php7.0-curl - CURL module for PHP
php7.0-dbg - Debug symbols for PHP7.0
php7.0-dev - Files for PHP7.0 module development
php7.0-enchant - Enchant module for PHP
php7.0-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
php7.0-gd - GD module for PHP
php7.0-geoip - GeoIP module for PHP
php7.0-gmp - GMP module for PHP
php7.0-igbinary - igbinary serializer for PHP
php7.0-imagick - Provides a wrapper to the ImageMagick library
php7.0-imap - IMAP module for PHP
php7.0-interbase - Interbase module for PHP
php7.0-intl - Internationalisation module for PHP
php7.0-json - JSON module for PHP
php7.0-ldap - LDAP module for PHP
php7.0-mcrypt - libmcrypt module for PHP
php7.0-memcached - memcached extension module for PHP, uses libmemcached
php7.0-mongodb - MongoDB driver for PHP
php7.0-msgpack - MessagePack serializer for PHP
php7.0-mysql - MySQL module for PHP
php7.0-odbc - ODBC module for PHP
php7.0-opcache - Zend OpCache module for PHP
php7.0-pgsql - PostgreSQL module for PHP
php7.0-phpdbg - server-side, HTML-embedded scripting language (PHPDBG binary)
php7.0-pspell - pspell module for PHP
php7.0-readline - readline module for PHP
php7.0-recode - recode module for PHP
php7.0-redis - PHP extension for interfacing with Redis
php7.0-snmp - SNMP module for PHP
php7.0-sqlite3 - SQLite3 module for PHP
php7.0-ssh2 - Bindings for the libssh2 library
php7.0-sybase - Sybase module for PHP
php7.0-tidy - tidy module for PHP
php7.0-xdebug - Xdebug Module for PHP
php7.0-xmlrpc - XMLRPC-EPI module for PHP
php7.0-xsl - XSL module for PHP

Запускаем установку PHP7:

apt-get install php7.0 php-pear

Перезапустим Apache2:

service apache2 restart

Файл конфигурации виртуального хоста находятся в файле:

nano /etc/apache2/sites-enabled/000-default.conf

Находим директиву DocumentRoot:

DocumentRoot /var/www/html

И в корне указанного каталога создаем файл, который выведет информацию о PHP7:

nano /var/www/html/info.php

Добавьте в файл следующие строки:

<?php phpinfo();
?>

Открываем страницу в браузере:

http://exemple.com/info.php

Если открылась страница с конфигурацией PHP7, то вы все сделали правильно.

Possible missing firmware bnx2

При установке Debian частой проблемой, с которой можно столкнутся это отсутствие драйвера для установленного в системе сетевого адаптера. В моем случае установку Debian я выполнял через утилиту Debootstrap и в процессе получил вот такое сообщение:

W: Possible missing firmware /lib/firmware/bnx2/bnx2-rv2p-09ax-6.0.17.fw for module bnx2
W: Possible missing firmware /lib/firmware/bnx2/bnx2-rv2p-09-6.0.17.fw for module bnx2
W: Possible missing firmware /lib/firmware/bnx2/bnx2-mips-09-6.2.1b.fw for module bnx2
W: Possible missing firmware /lib/firmware/bnx2/bnx2-rv2p-06-6.0.15.fw for module bnx2
W: Possible missing firmware /lib/firmware/bnx2/bnx2-mips-06-6.2.3.fw for module bnx2

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

dpkg -i firmware-bnx2_20160110-1_all.deb

Установка Windows 7 на KVM

Ранее я уже описывал процесс установки Windows 2003 в контейнере KVM, в этой статье я коротко опишу процесс для Windwos 7. Для начала с помощью консольной утилиты virt-install мы создадим новый контейнер. Для того чтобы создать новый контейнер KVM для установки Windows 7 выполните команду:

virt-install \
--name windows_7 \
--ram=2048 \
--vcpus=1 \
--os-type windows \
--os-variant win7 \
--disk pool=storage,size=30,bus=virtio,cache=none \
--network=bridge:br0,model=virtio \
--graphics vnc,password=xxx \
--disk device=cdrom,path=/iso/ru_windows_7_professional_with_sp1_x86_dvd_u_677084.iso \
--disk device=cdrom,path=/iso/virtio-win-0.1.102.iso \
--boot cdrom,hd

Для параметра password необходимо указать свой пароль для подключения к консоли по VNC. Порт VNC принимает входящие соединения на локальном адресе 127.0.0.1. Чтобы подключиться к консоли виртуальной машины вам нужно создать в PuTTY ssh-туннель.

Используя параметр disk device указываем расположение установочного образа диска Windows 7 и образа с драйверами устройств Virtio. Образ с драйверами можно скачать по этой ссылке.

После создания и запуска контейнера нужно определить порт, на котором работает VNC сервер виртуальной машины:

virsh vncdisplay windows_7

Во время установки Windows 7 не найдет жесткий диск и предложит вам установить драйверы. Нажмите кнопку загрузка и перейдите в папку viostor. Когда установщик обнаружит жесткий диск можно продолжать установку.

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