Rose debug info
---------------

Блог об администрировании Linux, BSD и не только.

Связаться со мной:
Позднее Ctrl + ↑

Дампы всех баз mysql

Сделать дампы всех баз данных пользователя, каждую базу в отдельный дамп:

for i in `mysql -u $USER -p$PASSWORD -e'show databases;' | \
 grep -v performance_schema | grep -v information_schema | grep -v mysql | \
 grep -v Database`; do mysqldump -u $USER -p$PASSWORD $i > /backup/mysql/$i.sql;done
$USER - пользователь mysql
$PASSWORD - пароль пользователя mysql

Установка Debian 8 на OrangePI PC.

На днях мне пришла эта платка. Плата достаточно новая и информации по ней в русскоязычном сегменте интернета крайне мало. Расскажу как я усстанавливал на неё Debian 8.
Для любителей первоисточника, оригинальный мануал здесь
В общем вот отсюда нам понадобится 2 файла, собственно образ нужного дистрибутива(Я выбрал OrangePI_Jessie_Xfce.img.xz) и scriptbin_kernel.tar.gz.
Распаковываем образ дистрибутива и заливаем на нашу microsd с помощью dd
$ sudo dd if=OrangePI_Jessie_Xfce.img of=/dev/sdX bs=1M oflag=direct

Прогресс заливки можно глядеть выполнив в соседней консоли

$ sudo killall -USR1 dd

После записи нужно примонтировать первый раздел на нашей microsd, который с меткой BOOT.
Теперь нужно взять файл uImage_OPI-2 из архива scriptbin_kernel.tar.gz, переименовать его в ulimage и положить в раздел BOOT. Затем так же из архива взять один из файлов script.bin.OPI-PC_*****(я взял, например, script.bin.OPI-PC_720p60), переименовать его в script.bin и тоже положить в BOOT. Можно отмонтировать раздел.
Затем нужно второй раздел, который будет корнем нашей будущей ОС, увеличить до конца нашей флешки. С увеличением по оригинальному мануалу у меня ничего не получилось, были ошибки. Я делал по своему.
Выполняем

$ sudo fdisk /dev/sdX

В fdisk вводим p и нажимаем enter. Запоминаем цифру обведенную на картинке.

Жмем d, удаляем второй раздел
Жмем n для создания на его месте нового раздела с началом там же где был старый раздел. На все вопросы можно ответить по умолчанию, кроме начала раздела. В качестве начала введите запомненное вами число. После создания нового раздела нажмите w для применения изменений.
Теперь нужно увеличить старую файловую систему на весь новый раздел
Выполним
sudo e2fsck -f /dev/sdc2

потом

sudo resize2fs /dev/sdc2

Теперь можно примонтировать раздел и убедится что он расширен до конца флешки.
Все отмонтируем, берем microsd, вставляем в orangepi и загружаемся. Можно не подключать монитор и клавиатуру, в образе сразу настроен ssh. Подключится можно рутом или юзером opengepi, пароль у обоих orangepi. Я сразу после установки поднял vnc.

Установка virtualbox с web-интерфейсом на сервер.

Имеем сервер на ubuntu 14.04. Нужно установить virtualbox с веб интерфейсом, чтобы установить несколько виртуальных машин на сервер.
Скрипт автоустановки для ленивых

Установка virtualbox.

Для начала установим сам virtualbox последней версии с репозиториев oracle.
Добавляем репозиторий и импортируем ключ

# echo "deb http://download.virtualbox.org/virtualbox/debian $(lsb_release -sc) contrib" | sudo tee -a /etc/apt/sources.list
# wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -

Устанавливаем virtualbox и модули ядра

# apt-get update
# apt-get install dkms virtualbox-5.0

Установим пакет дополнений гостевой ОС. Смотрим версию virtualbox

# vboxwebsrv -V
Oracle VM VirtualBox web service Version 5.0.2
(C) 2007-2015 Oracle Corporation
All rights reserved.
5.0.2r102096

И на этой странице берем ссылку для дополнений для нужной нам версии.
Скачиваем

# wget http://download.virtualbox.org/virtualbox/5.0.2/Oracle_VM_VirtualBox_Extension_Pack-5.0.2-102096.vbox-extpack

И устанавливаем

# VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.0.2-102096.vbox-extpack

Теперь создадим юзера, под которым будут работать наши виртуальные машины и добавим его в группу vboxusers

# adduser vbox
# usermod -a -G vboxusers 'vbox'

Не забываем пароль, который мы назначили пользователю vbox. Он нам ещё потребуется.
Настраиваем веб-сервис virtualbox

# nano /etc/default/virtualbox
VBOXWEB_USER=vbox #пользователь под которым работает virtualbox
VBOXWEB_HOST=xxx.xxx.xxx.xxx #ip
VBOXWEB_PORT=18083 #порт для веб-сервиса

Запускаем веб-сервис

# service vboxweb-service stop
# service vboxweb-service start

Установка web-интервейса.

Для работы веб интерфейса нам потребуется веб-сервер(мы будем использовать nginx) и php. Установим их.

# apt-get install nginx php5-common php5-fpm php-pear


Для ubuntu 16.04 кликнуть сюда

# apt-get install nginx php-common php-fpm php-pear php-soap


Создадим каталог для виртуального хоста.

# mkdir /var/www && mkdir /var/www/phpvirtualbox

На этой странице мы можем получить ссылки на архивы веб-интерфейса phpvirtualbox для разных версий virtualbox. В данном случае скачиваем и распаковываем в каталог виртуального хоста phpvirtualbox для нашей версии.

# cd /var/www/phpvirtualbox/ && wget http://sourceforge.net/projects/phpvirtualbox/files/phpvirtualbox-5.0-2.zip/download && mv download phpvirtualbox-5.0-2.zip
# unzip phpvirtualbox-5.0-2.zip && mv ./phpvirtualbox-5.0-2/* /var/www/phpvirtualbox

Копируем пример конфига

# cp /var/www/phpvirtualbox/config.php-example /var/www/phpvirtualbox/config.php

И редактируем

# nano /var/www/phpvirtualbox/config.php
# Пользователь и пароль под которым работает virtualbox
var $username = 'vbox';
var $password = 'PaS$w0rd';

# Адрес веб-сервиса
var $location = 'http://xxx.xxx.xxx.xxx:18083/';

# Диапазон rdp портов
var $vrdeports = '9000-9100';

# IP сервера
var $consoleHost = 'xxx.xxx.xxx.xxx';

Создаем файл виртуального хоста в nginx

# nano /etc/nginx/conf.d/phpvirtualbox.conf
server {
        listen   xxx.xxx.xxx.xxx:80;
 
        root /var/www/phpvirtualbox/;
        index index.php index.html index.htm;
 
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
 
 
        # pass the PHP scripts to FastCGI server listening on 1$
        #
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+.php)(.*)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
 
}


Для ubuntu 16.04 конфиг такой

server {
        listen   XXX.XXX.XXX.XXX:80;

        root /var/www/phpvirtualbox/;
        index index.php index.html index.htm;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }


        # pass the PHP scripts to FastCGI server listening on 1$
        #
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+.php)(.*)$;
                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }

}


Перезапускаем nginx

# service nginx restart

Теперь перейдя по адресу http://ip-сервера/ мы увидим форму логина. По умолчанию логин — admin и пароль — admin. Логинимся, открываем меню File, пункт Preferences и меняем пароль в графе Users. В графе Language можно поставить русский язык.

Установка виртуальной машины.

Скачиваем установочный образ нужной нам ОС(в данном случае debian 8) в домашний каталог юзера vbox

# cd /home/vbox/
# wget http://mirror.yandex.ru/debian-cd/8.1.0/amd64/iso-cd/debian-8.1.0-amd64-CD-1.iso

Затем в веб-интерфейсе, кликаем кнопку создать и создаем виртуальную машину с нужными нам характеристиками.

Переходим в настройки виртуальной машины — Дисплей. И во вкладке «Удаленный дисплей» включаем доступ по rdp с нужными нам данными авторизации и портом.
Запускаем нашу виртуальную машину. При первом запуске она спросит установочный iso образ, который мы скачали в домашний каталог пользователя vbox.
После запуска виртуальной машины мы можем подключится любым rdp клиентом к хост-машине по порту указанному в настройках удаленного дисплея и продолжить установку как обычно. Также можно подключится прямо через веб-интерфейс, просто кликнув «Консоль» справа сверху.

Переводим php движки с mysql на mysqli

Начиная с PHP 5.5.0 функции модуля mysql считаются устаревшими(deprecated), а в PHP 7 данный модуль вообще отсутствует, вместо него нужно использовать mysqli. Движки написаные с помощью функций модуля mysql не работают, т.к не могут подключится к базе данных и выдают в логе ошибки типа такой:

PHP Fatal error:  Uncaught Error: Call to undefined function mysql_connect() in...

К счастью, исправить все функции mysql на mysqli можно автоматически, скриптом на любом сайте.

Вот здесь скачиваете zip архив. Создаете в каталоге домена подкаталог например convert и кладете туда содержимое архива.
Потом переходите по ссылке вида
http://ваш_домен.ru/convert/GUI/index.php
И видите

Тут я выбирал «Convert a file», т.к в ошибке указан файл в котором присутствует эта функция. Указываем путь к файлу примерно как на картинке. И выбираем сразу заменить старый файл и забекапить.

Затем жмакаем «Start the conversion» и наслаждаемся результатом.

Joomla 2.5 с SSL(https), решение проблемы с циклической переадресацией.

Веб-сервер nginx установлен фронтэндом к apache2. Клиент установил ssl-сертификат на домен, но при включении в джумле ssl возникает ошибка: циклическая переадресация. Грубо говоря бесконечный редирект. Проверил настройки nginx и apache2, убедился что все настройки верные и переадресации быть не должно. В .htaccess тоже ничего лишнего нет.

Стандартно настраиваю ssl на джумле.
Открываю файл configuration.php в корне сайта. Привожу следующие диррективы к такому виду:

.....
public $live_site = 'https://ваш_домен.ru';
.....
public $force_ssl = '2';
.....

Для редиректа с http на https в .htaccess добавляю

RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

После этого проблема переадресации никуда не исчезла, естественно. Решение было найдено на англоязычном форуме джумлы. Чтобы исправить её нужно открыть файл ./libraries/joomla/environment/uri.php.(В joomla 3.4 этот файл находится ./libraries/joomla/uri) Найти там код:

if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off'))
{
$https = 's://';
}
else
{
$https = '://';
}

И изменить его на:

if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off'))
{
$https = 's://';
}
else
{
$https = 's://';
}

Установка php 7 на Debian 8 «jessie» из исходных кодов

Можно использовать скрипт который упрощает установку разных версий php
Сегодня дождливый и пасмурный день. И нет ничего более уютного и расслабляющего чем попивая горячий чай собирать ПО из исходников. Поэтому самое время собрать php 7 на debian 8.
У нас есть тачка с debian 8, установленым с образа netinstall. Установка минимальная, кроме ssh ничего не ставилось.
Для установки php 7 нам нужно выполнить по ssh или в консоли тачки несколько ругательств из под рута.
Первым делом установим все необходимые для сборки пакеты:

# apt-get install git apache2 mysql-server make autoconf gcc bison libxml2 \
libxml2-dev libcurl4-openssl-dev pkg-config libssl-dev \
bzip2 libbz2-dev libjpeg-dev libpng-dev libxpm-dev libfreetype6-dev \
libgmp-dev libgmp3-dev libmcrypt-dev libmysqlclient-dev \
libpspell-dev librecode-dev

Также нам нужен пакет libt1-dev, который отсутствует в репах debian 8, возьмем его из репов debian 7 wheezy, для этого добавим в /etc/apt/sources.list следующую строку

deb http://ftp.debian.org/debian wheezy main contrib non-free

Затем выполняем:

# apt-get update
# apt-get install libt1-dev

Затем убираем добавленную строку из /etc/apt/sources.list и затем выполняем

# apt-get update

Теперь сделаем симлинк gmp.h в /usr/include/

# ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h

Теперь все готово для сборки. Создадим папку для исходников и скачаем их туда.

# mkdir /root/php7
# cd /root/php7
# git clone https://git.php.net/repository/php-src.git

Переходим к сырцам и конфигурим

# cd php-src
# ./buildconf
# ./configure \
    --prefix=/usr \
    --with-config-file-path=/etc \
    --enable-mbstring \
    --enable-zip \
    --enable-bcmath \
    --enable-pcntl \
    --enable-ftp \
    --enable-exif \
    --enable-calendar \
    --enable-sysvmsg \
    --enable-sysvsem \
    --enable-sysvshm \
    --enable-wddx \
    --with-curl \
    --with-mcrypt \
    --with-iconv \
    --with-gmp \
    --with-pspell \
    --with-gd \
    --with-jpeg-dir=/usr \
    --with-png-dir=/usr \
    --with-zlib-dir=/usr \
    --with-xpm-dir=/usr \
    --with-freetype-dir=/usr \
    --with-t1lib=/usr \
    --enable-gd-native-ttf \
    --enable-gd-jis-conv \
    --with-openssl \
    --with-mysql=/usr \
    --with-pdo-mysql=/usr \
    --with-gettext=/usr \
    --with-zlib=/usr \
    --with-bz2=/usr \
    --with-recode=/usr \
    --with-mysqli=/usr/bin/mysql_config

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

+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE.  By continuing this installation |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

Thank you for using PHP.

Далеее выполняем

# make
# make install

Проверяем, что установка прошла успешно

root@debian:~/php7/php-src# php -v
PHP 7.0.0-dev (cli) (built: May 23 2015 15:48:27) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies

Вобщем то php7 установлен, но если мы хотим заставить веб-сервер обрабатывать php, то надо ещё настроить apache2.
Заставим apache2 обрабатывать php, с помощью php-cgi.
У меня в системе есть пользователь user, и я решил сделать для него виртуальный хост.
Создаем каталог cgi-bin у пользователя

# mkdir /home/user/cgi-bin/

Создаем файл /home/user/cgi-bin/php со следующим содержимым

#!/usr/bin/php-cgi

И выставляем права 555 на него

# chmod 555 /home/user/cgi-bin/php

Создаем файл /home/user/cgi-bin/php.ini со следующим содержимым

max_execution_time=600
memory_limit=128M
error_reporting=0
display_errors=0
log_errors=0
user_ini.filename=
realpath_cache_size=2M
cgi.check_shebang_line=0
 
zend_extension=opcache.so
opcache.enable_cli=1
opcache.save_comments=0
opcache.fast_shutdown=1
opcache.validate_timestamps=1
opcache.revalidate_freq=60
opcache.use_cwd=1
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=5
opcache.memory_consumption=128
opcache.consistency_checks=0

Создаем каталог для виртуалхоста

# mkdir /home/user/www

И кладем в него index.php со следующим содержимым

<?php
phpinfo();
?>

И т.к мы все делали из под рута, то меняем владельца всех этих созданных файлов и каталогов на user

# chown -R user:user /home/user/

Теперь нужно настроить apache2. Добавим необходимые модули в apache2

# a2enmod actions
# a2enmod cgi

Заменим конфиг /etc/apache2/sites-enabled/000-default.conf на такой

<Directory /home/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot /home/user/www
ScriptAlias /cgi-bin/ "/home/user/cgi-bin/"
AddType application/x-httpd-php .php .php3
Action  application/x-httpd-php /cgi-bin/php
DirectoryIndex index.php
</VirtualHost>

И перезапустим apache2

# service apache2 restart

Теперь мы можем зайти браузером на ip тачки и увидеть страницу php info.

Аналогично можно настроить другие виртуальные хосты.

Про настройку разных версий php для каждого сайта на одном сервере можно прочитать в статье про мультиверсионность php.

Настройка ispmanager для отправки почты с сайта.

Как оказалось многие клиенты не знают как настроить отправку почты с сайта в ispmanager. Чтобы не повторять всем одно и тоже пишу эту заметку.

Первым делом идем в раздел «Почтовые домены» и проверяем, что домен с которого нужно отправлять почту присутствует там. Если нет то кликаем «Cоздать» и создаем почтовый домен.

Затем идем в раздел «Почтовые ящики» и создаем почтовый ящик, с которого будем осуществлять отправку.
После этого идем в раздел «www-домены», выбираем наш домен и кликаем «Изменить». Вписываем наш ящик в качестве email-администратора и кликаем «ОК».
Настройка отправки почты с сайта закончена.

Изолируем пользователей ssh в домашней директории с помощью lshell

Установим lshell, он есть в репозиториях большинства дистрибутивов. Установка для дебианоподобных дистров:

# apt-get install lshell

Затем открываем конфигурационный файл и редактируем

# nano /etc/lshell.conf

Там в основном все просто и понятно, обратим внимания на некоторые переменные в разделе [default].
Команды разрешённые для выполнения:

allowed         : ['ls','echo','cd','ll','rsync','mkdir']

В allowed нельзя вписывать программы которые умеют бродить по каталогам например mc, т.к из lshell выполнение передается в bash и такие программы смогут выйти за пределы домашнего каталога. Поэтому тут будьте внимательны.

Команды которые можно выполнять через ssh:

overssh         : ['ls','rsync']

В конце конфигурационного файла можно указать индивидуальные настройки для определенного юзера примерно так:

[user]
allowed: ['ls','echo','cd','ll','rsync','mkdir','cp','mv']
path: ['/backups']
overssh: ['ls', 'rsync']

Тут например мы разрешили пользователю user выполнять команды указанные в allowed, кроме домашней папки он может ходить в /backups, и может выполнять по ssh ls и rsync.

После редактирования сохраняемся и и закрываем файл.
Теперь нужно изменить shell у пользователей, которых мы ограничиваем.

# chsh -s /usr/bin/lshell user
# chsh -s /usr/bin/lshell user1
# chsh -s /usr/bin/lshell user2
.....

Теперь пробуем зайти по ssh user’ом и проверяем, что он изолирован в домашней папке и может выполнять только команды указанные в allowed.

Перенос linux на другой диск на примере debian/ubuntu

Навеяно статьей про перенос freebsd на другой диск. Будем делать тоже самое но на linux. В linux все несколько сложнее.

Для начала нужно подсоединить новый диск и загрузится. В системе должны присутствовать 2 диска, первый с нашей системой, а второй пустой. Второй мы можем разметить по своему усмотрению или же скопировать разметку с первого диска(если второй диск идентичен первому). Как скопировать разметку можно прочесть здесь. Как разметить вручную думаю разберётесь сами, благо мануалов в интернете полно. После создания разметки разделы надо отформатировать примерно так.

# mkfs.ext4 /dev/sdb1

Затем примонтируем его в /mnt

# mount /dev/sdb1 /mnt

Теперь нам нужно создать дампы разделов, в данном случае нужно создать только дамп sda1. Установим утилиты dump/restore.

# apt-get install dump

И создаем дамп раздела в файл /mnt/root.img

# dump -0f /mnt/root.img /

Создание дампа в /mnt/root.img возможно когда на разделе используется менее 50% от /dev/sdb1. Иначе на разматывание дампа места не хватит. В остальных случаях нужно создавать дамп в другом месте, но не в разделе корня, чтобы дамп не мотал сам себя. Можно использовать раздел другой тачки примонтированный по sshfs, я проверял это прекрасно работает.
Переходим в /mnt и разматываем дамп.

# cd /mnt
# restore -rf /mnt/root.img

Как видим раздел перенесся на /dev/sdb1. Если у нас /boot на отдельном разделе, то переносим его аналогично.

Теперь нам нужно установить загрузчик.

# grub-install --root-directory=/mnt /dev/sdb

Затем если требуется правим /mnt/etc/fstab и меню grub в /mnt/boot/grub/grub.cfg.

# nano /mnt/etc/fstab
# nano /mnt/boot/grub/grub.cfg

Тут немного поясню зачем проверять и править эти файлы. У меня например в этих файлах были прописаны uuid разделов, и если мы уберем старый диск то ОС соответственно не загрузится, т.к у новых разделов у нас другие uuid. Я вместо uuid прописал реальные устройства корня и свопа /dev/sda1 и /dev/sda3. Все устройства sdb, станут у нас sda после извлечение первого диска.

Теперь выключаем тачку, отсоединяем первый диск и загружаемся с нового диска.

P.S. Утилиты dump и restore не ограничиваются переносом ОС с одного диска на другой. Таким образом можно переносить linux вообще на другую тачку с другим железом и дисками. Процедура почти такая же за небольшими изменениями.

  1. На первой тачке создаем дамп ОС;
  2. Загружаем вторую тачку с livecd;
  3. Размечаем и форматируем диски;
  4. Копируем туда дамп c первой тачки(по scp, например);
  5. Разворачиваем дамп с помощью restore;
  6. Устанавливаем загрузчик;
  7. Загружаемся.

Ошибка при установке GRUB на диск.

При установке grub получил такую ошибку.

# grub-install /dev/sdb
Searching for GRUB installation directory ... found: /boot/grub
The file /boot/grub/stage1 not read correctly.

Гугл говорит что нужно уменьшать размер инодов и проверять тип файловой системы. У меня же оказалось что установлен старый GRUB 0.97. Установил новый GRUB2 командой

# apt-get install grub-pc

И переустановил GRUB на обоих дисках без ошибок.

Ранее Ctrl + ↓