Архив рубрики: Работа c Linux

MySQL 5.7 на Rocky Linux

Бывают случаи когда на новом сервере необходимо установить старую версию MySQL 5.7. Не всегда можно перевести работающий ресурс на работу с новой версией или перевод требует больших трудов в изменении кода ресурса.

Вступление

С установкой старой версии PHP 5.6 всё гораздо проще и об этом рассказано в статье Нескольких версий PHP на сервере Linux.

Установку будем делать из бинарного дистрибутива. Перечень возможных бинарных дистрибутивов вы можете посмотреть по ссылке MySQL Community Downloads. Так же, можете ознакомиться с инструкцией по установке версии 5.7.

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

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

Более подробно об установке и настройке Rocky Linux вы можете в статье Rocky Linux 8 установка и настройка.

Предварительная подготовка

Установим необходимые пакеты которые нам могут потребоваться:

dnf install libaio  libaio-devel libncurses* tar wget

Создаём необходимую группу и пользователя:

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

Скачиваем исходник MySQL 5.7

Скачиваем необходимую версию:

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

Распаковываем архив без вывода информации о процессе:

tar -zxf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

Или с выводом информации:

tar zxvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

Устанавливаем MySQL 5.7

Переименовываем и переносим папку в необходимое место:

mv mysql-5.7.37-linux-glibc2.12-x86_64 /opt/mysql-5.7

Создаём необходимые ссылки:

ln -s /opt/mysql-5.7/bin/mysql /usr/local/bin/mysql-5.7
ln -s /opt/mysql-5.7/bin/mysqldump /usr/local/bin/mysqldump-5.7

Переходим в папку и создаем папку под данные с назначением необходимых прав:

cd /opt/mysql-5.7
mkdir ./data
chown mysql:mysql ./data
chmod 755 ./data

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

/opt/mysql-5.7 # ./bin/mysqld --initialize --user=mysql --basedir=./ --character-set-server=utf8
= вывод команды =
2022-02-02T06:37:58.431193Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp 
server option (see documentation for more details).
2022-02-02T06:38:00.706137Z 0 [Warning] InnoDB: New log files created, LSN=45790
2022-02-02T06:38:01.541332Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2022-02-02T06:38:01.967699Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: ab3a127b-83f2-11ec-a16b-0e4799458f07.
2022-02-02T06:38:02.022913Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2022-02-02T06:38:03.275737Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2022-02-02T06:38:03.275828Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2022-02-02T06:38:03.276874Z 0 [Warning] CA certificate ca.pem is self signed.
2022-02-02T06:38:03.592321Z 1 [Note] A temporary password is generated for root@localhost: zRD?OXe,5NsfvfgTI

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

Копируем в необходимое место:

cp support-files/mysql.server /etc/init.d/mysql-5.7

Открываем и приводим к коду указанному ниже в спойлере:

vim /etc/init.d/mysql-5.7
Необходимый код файла /etc/init.d/mysql-5.7
#!/bin/sh
# Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
# This file is public domain and comes with NO WARRANTY of any kind
 
# MySQL daemon start/stop script.
 
# Usually this is put in /etc/init.d (at least on machines SYSV R4 based
# systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/K01mysql.
# When this is done the mysql server will be started when the machine is
# started and shut down when the systems goes down.
 
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 64 36
# description: A very fast and reliable SQL database engine.
 
# Comments to support LSB init script conventions
### BEGIN INIT INFO
# Provides: mysql-5.7
# Required-Start: $local_fs $network $remote_fs
# Should-Start: ypbind nscd ldap ntpd xntpd
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop MySQL
# Description: MySQL is a very fast and reliable SQL database engine.
### END INIT INFO
 
# If you install MySQL on some other places than /usr/local/mysql, then you
# have to do one of the following things for this script to work:
#
# - Run this script from within the MySQL installation directory
# - Create a /etc/my.cnf file with the following information:
#   [mysqld]
#   basedir=<path-to-mysql-installation-directory>
# - Add the above to any other configuration file (for example ~/.my.ini)
#   and copy my_print_defaults to /usr/bin
# - Add the path to the mysql-installation-directory to the basedir variable
#   below.
#
# If you want to affect other MySQL variables, you should make your changes
# in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.
 
# If you change base dir, you must also change datadir. These may get
# overwritten by settings in the MySQL configuration files.
 
basedir=/opt/mysql-5.7
datadir=
mycnf=/etc/mysql/5.7/my.cnf
 
# Default value, in seconds, afterwhich the script should timeout waiting
# for server start. 
# Value here is overriden by value in my.cnf. 
# 0 means don't wait at all
# Negative numbers mean to wait indefinitely
service_startup_timeout=900
 
# Lock directory for RedHat / SuSE.
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql"
 
# The following variables are only set for letting mysql.server find things.
 
# Set some defaults
mysqld_pid_file_path=
if test -z "$basedir"
then
  basedir=/usr/local/mysql
  bindir=/usr/local/mysql/bin
  if test -z "$datadir"
  then
    datadir=/usr/local/mysql/data
  fi
  sbindir=/usr/local/mysql/bin
  libexecdir=/usr/local/mysql/bin
else
  bindir="$basedir/bin"
  if test -z "$datadir"
  then
    datadir="$basedir/data"
  fi
  sbindir="$basedir/sbin"
  libexecdir="$basedir/libexec"
fi
 
# datadir_set is used to determine if datadir was set (and so should be
# *not* set inside of the --basedir= handler.)
datadir_set=
 
#
# Use LSB init script functions for printing messages, if possible
#
lsb_functions="/lib/lsb/init-functions"
if test -f $lsb_functions ; then
  . $lsb_functions
else
  log_success_msg()
  {
    echo " SUCCESS! $@"
  }
  log_failure_msg()
  {
    echo " ERROR! $@"
  }
fi
 
PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin"
export PATH
 
mode=$1    # start or stop
 
[ $# -ge 1 ] && shift
 
 
other_args="$*"   # uncommon, but needed when called from an RPM upgrade action
           # Expected: "--skip-networking --skip-grant-tables"
           # They are not checked here, intentionally, as it is the resposibility
           # of the "spec" file author to give correct arguments only.
 
case `echo "testing\c"`,`echo -n testing` in
    *c*,-n*) echo_n=   echo_c=     ;;
    *c*,*)   echo_n=-n echo_c=     ;;
    *)       echo_n=   echo_c='\c' ;;
esac
 
parse_server_arguments() {
  for arg do
    case "$arg" in
      --basedir=*)  basedir=`echo "$arg" | sed -e 's/^[^=]*=//'`
                    bindir="$basedir/bin"
		    if test -z "$datadir_set"; then
		      datadir="$basedir/data"
		    fi
		    sbindir="$basedir/sbin"
		    libexecdir="$basedir/libexec"
        ;;
      --datadir=*)  datadir=`echo "$arg" | sed -e 's/^[^=]*=//'`
		    datadir_set=1
	;;
      --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
      --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
    esac
  done
}
 
wait_for_pid () {
  verb="$1"           # created | removed
  pid="$2"            # process ID of the program operating on the pid-file
  pid_file_path="$3" # path to the PID file.
 
  i=0
  avoid_race_condition="by checking again"
 
  while test $i -ne $service_startup_timeout ; do
 
    case "$verb" in
      'created')
        # wait for a PID-file to pop into existence.
        test -s "$pid_file_path" && i='' && break
        ;;
      'removed')
        # wait for this PID-file to disappear
        test ! -s "$pid_file_path" && i='' && break
        ;;
      *)
        echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
        exit 1
        ;;
    esac
 
    # if server isn't running, then pid-file will never be updated
    if test -n "$pid"; then
      if kill -0 "$pid" 2>/dev/null; then
        :  # the server still runs
      else
        # The server may have exited between the last pid-file check and now.  
        if test -n "$avoid_race_condition"; then
          avoid_race_condition=""
          continue  # Check again.
        fi
 
        # there's nothing that will affect the file.
        log_failure_msg "The server quit without updating PID file ($pid_file_path)."
        return 1  # not waiting any more.
      fi
    fi
 
    echo $echo_n ".$echo_c"
    i=`expr $i + 1`
    sleep 1
 
  done
 
  if test -z "$i" ; then
    log_success_msg
    return 0
  else
    log_failure_msg
    return 1
  fi
}
 
# Get arguments from the my.cnf file,
# the only group, which is read from now on is [mysqld]
if test -x "$bindir/my_print_defaults";  then
  print_defaults="$bindir/my_print_defaults"
else
  # Try to find basedir in /etc/my.cnf
  conf=/etc/my.cnf
  print_defaults=
  if test -r $conf
  then
    subpat='^[^=]*basedir[^=]*=\(.*\)$'
    dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
    for d in $dirs
    do
      d=`echo $d | sed -e 's/[ 	]//g'`
      if test -x "$d/bin/my_print_defaults"
      then
        print_defaults="$d/bin/my_print_defaults"
        break
      fi
    done
  fi
 
  # Hope it's in the PATH ... but I doubt it
  test -z "$print_defaults" && print_defaults="my_print_defaults"
fi
 
#
# Read defaults file from 'basedir'.   If there is no defaults file there
# check if it's in the old (depricated) place (datadir) and read it from there
#
 
extra_args=""
if test -r "$basedir/my.cnf"
then
  extra_args="-e $basedir/my.cnf"
fi
 
parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
 
#
# Set pid file if not given
#
if test -z "$mysqld_pid_file_path"
then
  mysqld_pid_file_path=$datadir/`hostname`.pid
else
  case "$mysqld_pid_file_path" in
    /* ) ;;
    * )  mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;;
  esac
fi
 
case "$mode" in
  'start')
    # Start daemon
 
    # Safeguard (relative paths, core dumps..)
    cd $basedir
 
    echo $echo_n "Starting MySQL"
    if test -x $bindir/mysqld_safe
    then
      # Give extra arguments to mysqld with the my.cnf file. This script
      # may be overwritten at next upgrade.
      $bindir/mysqld_safe --defaults-file="$mycnf" --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
      wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
 
      # Make lock for RedHat / SuSE
      if test -w "$lockdir"
      then
        touch "$lock_file_path"
      fi
 
      exit $return_value
    else
      log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
    fi
    ;;
 
  'stop')
    # Stop daemon. We use a signal here to avoid having to know the
    # root password.
 
    if test -s "$mysqld_pid_file_path"
    then
      # signal mysqld_safe that it needs to stop
      touch "$mysqld_pid_file_path.shutdown"
 
      mysqld_pid=`cat "$mysqld_pid_file_path"`
 
      if (kill -0 $mysqld_pid 2>/dev/null)
      then
        echo $echo_n "Shutting down MySQL"
        kill $mysqld_pid
        # mysqld should remove the pid file when it exits, so wait for it.
        wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
      else
        log_failure_msg "MySQL server process #$mysqld_pid is not running!"
        rm "$mysqld_pid_file_path"
      fi
 
      # Delete lock for RedHat / SuSE
      if test -f "$lock_file_path"
      then
        rm -f "$lock_file_path"
      fi
      exit $return_value
    else
      log_failure_msg "MySQL server PID file could not be found!"
    fi
    ;;
 
  'restart')
    # Stop the service and regardless of whether it was
    # running or not, start it again.
    if $0 stop  $other_args; then
      $0 start $other_args
    else
      log_failure_msg "Failed to stop running server, so refusing to try to start."
      exit 1
    fi
    ;;
 
  'reload'|'force-reload')
    if test -s "$mysqld_pid_file_path" ; then
      read mysqld_pid <  "$mysqld_pid_file_path"
      kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL"
      touch "$mysqld_pid_file_path"
    else
      log_failure_msg "MySQL PID file could not be found!"
      exit 1
    fi
    ;;
  'status')
    # First, check to see if pid file exists
    if test -s "$mysqld_pid_file_path" ; then 
      read mysqld_pid < "$mysqld_pid_file_path"
      if kill -0 $mysqld_pid 2>/dev/null ; then 
        log_success_msg "MySQL running ($mysqld_pid)"
        exit 0
      else
        log_failure_msg "MySQL is not running, but PID file exists"
        exit 1
      fi
    else
      # Try to find appropriate mysqld process
      mysqld_pid=`pidof $libexecdir/mysqld`
 
      # test if multiple pids exist
      pid_count=`echo $mysqld_pid | wc -w`
      if test $pid_count -gt 1 ; then
        log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)"
        exit 5
      elif test -z $mysqld_pid ; then 
        if test -f "$lock_file_path" ; then 
          log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists"
          exit 2
        fi 
        log_failure_msg "MySQL is not running"
        exit 3
      else
        log_failure_msg "MySQL is running but PID file could not be found"
        exit 4
      fi
    fi
    ;;
    *)
      # usage
      basename=`basename "$0"`
      echo "Usage: $basename  {start|stop|restart|reload|force-reload|status}  [ MySQL server options ]"
      exit 1
    ;;
esac
 
exit 0

[свернуть]

Назначаем необходимые права:

chmod +x /etc/init.d/mysql-5.7

Создаем папку для конфигурации сервера и создаём файл конфигурации:

mkdir -p /etc/mysql/5.7
vim /etc/mysql/5.7/my.cnf
= необходимый код =
[client]
default-character-set = utf8
port = 3307
socket = /tmp/mysql-5.7.sock
 
[mysqld]
basedir = /opt/mysql-5.7
bind-address = 0.0.0.0
character-set-server = utf8
collation-server = utf8_general_ci
port = 3307
socket = /tmp/mysql-5.7.sock
default-authentication-plugin = mysql_native_password
server-id = 1
 
[mysqldump]
quick
max_allowed_packet = 16M
 
[mysql]
default-character-set = utf8
no-auto-rehash

Обращаю внимание что указывается не стандартный порт для работы сервиса. Можете указать стандартный порт 3306 для работы MySQL.

Добавляем в автозагрузку и запускаем:

systemctl enable mysql-5.7 
systemctl start mysql-5.7

= или одной командой =
systemctl enable --now mysql-5.7

Авторизуемся, меняем пароль и смотрим статус работы сервера MySQL:

/opt/mysql-5.7 # mysql-5.7 --defaults-file=/etc/mysql/5.7/my.cnf -u root -p
Enter password: вводим пароль от root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.37
 
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> STATUS;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
= вывод нам говорит что необходимо сменить пароль и мы его меняем =
mysql> SET PASSWORD = PASSWORD('пароль');
Query OK, 0 rows affected, 1 warning (0,00 sec)
= выходим =
mysql> \q
Bye
= авторизуемся с новым паролем =
/opt/mysql-5.7 # mysql-5.7 --defaults-file=/etc/mysql/5.7/my.cnf -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.37 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> STATUS;
= вывод команды =
--------------
mysql-5.7  Ver 14.14 Distrib 5.7.37, for linux-glibc2.12 (x86_64) using  EditLine wrapper
 
Connection id:		3
Current database:	
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.7.37 MySQL Community Server (GPL)
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/tmp/mysql-5.7.sock
Uptime:			2 min 15 sec
 
Threads: 1  Questions: 9  Slow queries: 0  Opens: 109  Flush tables: 1  Open tables: 102  Queries per second avg: 0.066
--------------
 
mysql> \q
Bye

Заключение

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

Шифрование данных в Linux

Использовать шифрование данных залог того что ваши данные не попадут в руки кому попало. В этой статье расскажу как производить шифрование диска или раздела в ОС Linux используется модуль ядра dm-crypt LUKS.

Введение

Чтобы выполнить шифрование диска в системе Linux используется модуль ядра dm-crypt. Этот модуль позволяет создавать в каталоге /dev/mapper виртуальное блочное устройство с возможностью его шифрования. Фактически все данные лежат на зашифрованном физическом разделе. Данные на лету шифруются и записываются на диск, при чтении с виртуального устройства, выполняется обратная операция — данные расшифровываются с физического диска и передаются в открытом виде через виртуальный диск пользователю. Обычно для шифрования используется протокол шифрования AES, потому что под него оптимизированы большинство современных процессоров.

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

Для работы с LUKS и модулем dm-crypt используется утилита Cryptsetup.

Создание шифрованного устройства

Общая схема работы с шифрованным устройством следующая:

  • Определяется устройство для шифрования;
  • Создается шифрованный раздел;
  • Производится форматирование раздела в необходимую файловую систему;
  • Монтирование раздела в систему.

Установка CRYPTSETUP

Выберите свою команду исходя из своей системы и установите необходимую утилиту:

apt install cryptsetup

dnf install cryptsetup

Синтаксис запуска команды такой:

$ cryptsetup опции операция параметры_операции

Основные операции, которые можно сделать используя утилиту:

  • luksFormat — создать зашифрованный раздел luks linux;
  • luksOpen — подключить виртуальное устройство (нужен ключ);
  • luksClose — закрыть виртуальное устройство luks linux;
  • luksAddKey — добавить ключ шифрования;
  • luksRemoveKey — удалить ключ шифрования;
  • luksUUID — показать UUID раздела;
  • luksDump — создать резервную копию заголовков LUKS.

Подготовка устройства

Вначале необходимо вывести информацию об имеющихся дисках в системе:

fdisk -l
= вывод команды =
Диск /dev/sdb: 32 GiB, 6442450944 байт, 12582912 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/sda: 32 GiB, 34359738368 байт, 67108864 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0xdbf480c5

Устр-во   Загрузочный начало  Конец    Секторы  Размер  Идентификатор  Тип
/dev/sda1 *           2048    2099199  2097152  1G      83             Linux
/dev/sda2             2099200 67108863 65009664 31G     8e             Linux LVM

В нашем случае это диск /dev/sdb. Можно весь диск зашифровать или сделать зашифрованным только какой то раздел.

Для работы с диском я использую утилиту cfdisk.

cfdisk /dev/sdb

= C параметром -z можно создать заново таблицу разделов =
cfdisk -z /dev/sdb

Создание шифрованного раздела

Создадим шифрованный раздел из всего диска sdb:

cryptsetup -y -v luksFormat /dev/sdb
= вывод команды =
ПРЕДУПРЕЖДЕНИЕ: Устройство /dev/sdb уже содержит подпись раздела «dos».
 
WARNING!
========
Данные на /dev/sdb будут перезаписаны без возможности восстановления.
 
Are you sure? (Type uppercase yes): YES - Внимание! Писать только заглавными буквами!
Введите парольную фразу для /dev/sdb: ! пароль
Парольная фраза повторно: ! повтор пароля
Existing 'dos' partition signature on device /dev/sdb will be wiped.
Создан слот ключа 0.
Команда выполнена успешно.

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

Откроем созданный раздел с помощью модуля dm-crypt в /dev/mapper, для этого понадобится ввести пароль, с которым выполнялось создание раздела:

cryptsetup luksOpen /dev/sdb sdb_crypt

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

ls -l /dev/mapper/sdb_crypt
= вывод команды =
lrwxrwxrwx 1 root root 7 дек 27 21:53 /dev/mapper/sdb_crypt -> ../dm-3

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

cryptsetup -v status sdb_crypt
= вывод команды =
/dev/mapper/sdb_crypt is active.
type:    LUKS2
cipher:  aes-xts-plain64
keysize: 512 bits
key location: keyring
device:  /dev/sdb
sector size:  512
offset:  32768 sectors
size:    625109680 sectors
mode:    read/write
Команда выполнена успешно.

Рекомендую сделать резервную копию заголовков LUKS это может помочь при возможных в будущем проблем.

Делается резервная копия заголовка LUKS следующей командой:

cryptsetup luksDump /dev/sdb
= вывод команды =
LUKS header information
Version:       	2
Epoch:         	3
Metadata area: 	16384 [bytes]
Keyslots area: 	16744448 [bytes]
UUID:          	cf501772-dd9b-4554-bccc-7a6739e72142
Label:         	(no label)
Subsystem:     	(no subsystem)
Flags:       	(no flags)
 
Data segments:
  0: crypt
	offset: 16777216 [bytes]
	length: (whole device)
	cipher: aes-xts-plain64
	sector: 512 [bytes]
 
Keyslots:
  0: luks2
	Key:        512 bits
	Priority:   normal
	Cipher:     aes-xts-plain64
	Cipher key: 512 bits
	PBKDF:      argon2i
	Time cost:  4
	Memory:     903656
	Threads:    4
	Salt:       00 54 94 e7 r6 bb 00 ec 42 5a c9 81 7f d2 35 3d 
	            07 06 af 27 ac 15 80 5f 4f 29 37 ee 72 4b ff b8 
	AF stripes: 4000
	AF hash:    sha256
	Area offset:32768 [bytes]
	Area length:258048 [bytes]
	Digest ID:  0
Tokens:
Digests:
  0: pbkdf2
	Hash:       sha256
	Iterations: 89043
	Salt:       ac 7b 53 43 4b b3 82 77 07 64 35 35 0b 2f fb c8 
	            24 e0 ba 58 90 3d da 14 2f df 8e f0 fa a6 6a 76 
	Digest:     3f f1 07 4d 93 1b db ae 88 55 21 fa 9a ad a9 a2 
	            ba 77 48 8b 84 41 aw 3c 0d 9d 5e 33 ae e0 af 44

Форматирование

Для надежности, чтобы стереть все данные, которые были в этом месте раньше, перезапишем нулями перед тем как будем создавать файловую систему:

dd if=/dev/zero of=/dev/mapper/sdb_crypt

Работа утилиты может занять несколько часов, чтобы иметь возможность наблюдать за процессом, используйте pv:

pv -tpreb /dev/zero | dd of=/dev/mapper/sdb_crypt bs=128M

В случае отсутствия утилиты pv её необходимо установить. Для систем на базе Debian необходимо выполнить команду # apt install pv

Отформатировать можно в любую необходимую файловую систему. В нашем случае отформатируем в ext4:

mkfs.ext4 /dev/mapper/sdb_crypt

Монтирование

Создадим место куда будем монтировать и подмонтируем созданную файловую систему:

mkdir /mnt/sdb_crypt
mount /dev/mapper/sdb_crypt /mnt/sdb_crypt

= При необходимости можно дать полные права всем =
chmod 777 /mnt/sdb_crypt

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

df -h
= вывод команды =
Файловая система         Размер   Использовано   Дост     Использовано%   Cмонтировано в
devtmpfs                 1,9G     0              1,9G     0%              /dev
tmpfs                    1,9G     0              1,9G     0%              /dev/shm
tmpfs                    1,9G     8,5M           1,9G     1%              /run
tmpfs                    1,9G     0              1,9G     0%              /sys/fs/cgroup
/dev/mapper/rl-root      28G      6,0G           22G      22%             /
/dev/sda1                1014M    334M           681M     33%             /boot
tmpfs                    374M     0              374M     0%              /run/user/0
/dev/mapper/sdb_crypt    32G      24M            32G      0%              /mnt/sdb_crypt

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

umount /mnt/sdb_crypt
cryptsetup luksClose sdb_crypt

Чтобы снова получить возможность работать с зашифрованным разделом необходимо открыть шифрованый раздел и подмонтировать файловую систему:

cryptsetup luksOpen /dev/sdb sdb_crypt
mount /dev/mapper/sdb_crypt /mnt/sdb_crypt

Для удобства создадим два скрипта которые будут подключать и отключать шифрованное устройство.

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

vim /root/start-sdb_crypt.sh
= необходимый код 
#!/bin/bash
cryptsetup luksOpen /dev/sdb sdb_crypt
mount /dev/mapper/sdb_crypt /mnt/sdb_crypt

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

vim /root/stop-sdb_crypt.sh
= необходимый код =
#!/bin/bash
umount /mnt/sdb_crypt
cryptsetup luksClose sdb_crypt

Cделаем скрипты исполнительными выполнив необходимую команду:

chmod +x /root/start-sdb_crypt.sh
chmod +x /root/stop-sdb_crypt.sh

Обслуживание

Проверка файловой системы LUKS

После открытия раздела он воспринимается системой, как и все другие. Для проверки можно использовать утилиту fsck ( при условии что файловая система отмантирована ):

fsck -vy /dev/mapper/sdb_crypt

Изменение парольной фразы LUKS

Парольную фразу можно изменить или создать до восьми разных парольных фраз.

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

cryptsetup luksDump /dev/sdb

Команда для создания новой парольной фразы:

cryptsetup luksAddKey /dev/sdb
= вывод команды =
Введите любую существующую парольную фразу: ! вводим существующий пароль
Введите новую парольную фразу для слота ключа: ! вводим новый пароль
Парольная фраза повторно: ! повторяем новый пароль

Команда для удаления существующего пароля:

cryptsetup luksRemoveKey /dev/sdb
= вывод команды =
Введите удаляемую парольную фразу: ! вводим удаляемую парольную фразу

Заключение

Пользуюсь таким вариантом в работе уже давно и каких то проблем я не замечал.

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

Решать в любом случае вам как защищать свои данные, но то что сейчас это надо делать обязательно актуально как никогда.

Изменение размера диска или раздела Linux

Рано или поздно всегда приходиться делать изменение размера диска или раздела Linux. Варианты как это сделать существуют разные и все зависит от конкретного случая. Постарался найти вариант который подходит для разных случаев.

Введение

Рано или поздно всем необходимо произвести изменение размера диска, раздела, или вообще перестроить разбивку диска по новому.

Вариантов как это сделать множество, но мне кажется я нашел идеальный и 100% рабочий вариант.

Основной принцип состоит из следующих моментов:

  • Подключаем дополнительный диск;
  • Загружаем систему с Live-образа;
  • Переносим информацию на дополнительный диск;
  • Создаем, изменяем разделы на требуемом диске;
  • Возвращаем данные в случае форматирования;
  • Обновляем загрузчик системы и вносим правки в файл системы отвечающий за подключение разделов диска в систему.

Это очень грубая общая схема не отражающая всех нюансов, но дающая понять суть процесса.

В моем случае необходимо было поменять размер диска с преобразованием системы XFS в EXT4 на виртуальной машине работающей в Proxmox.

Меня лично необходимость уменьшить раздел возникла по причине того что в системе Proxmox появился диск SSD, но вот перенести туда нужную машину я не мог по причине большого размера диска а не реально используемого пространства.

Подготовка

Обязательно перед выполнением работ сделайте резервные копии виртуальных машин или как минимум данных с них!

Все действия необходимо выполнять только на отключенных разделах.

Забегая вперед скажу, что для уменьшения размера диска мы будем использовать возможности типа файлов raw и для этого в системе Proxmox диски должны находится в файловом варианте.

В моем случае делались изменения размеров на корневом разделе а значит необходимо запустить систему с Live-образа. Для этих целей у меня сделана собственная сборка дистрибутива Calculate Linux где установлены все необходимые мне утилиты. Можно использовать любой удобный вам Live-образ системы Linux.

Перед началом работ выполните команду которая покажет все реально смонтированные диски в работающей системе:

df -h
= часть вывода команды =
/dev/sda2 10G   6,9G   3,2G  69%  /
/dev/sda3 89G   11G    79G   12%  /var/sevo44
/dev/sda1 976M  179M   731M  20%  /boot

Сохраните эти данные, так как в последствии нам с ними будет проще работать.

Загружаем систему используя Live-образ.

Работать в консоли самого Proxmox не удобно, так как нет возможности копировать команды.  Запускаю ssh сервер командой:

/etc/init.d/sshd start

Подключаюсь по ssh используя данные авторизации live-образа.

Все подготовительные действия сделаны и переходим к непосредственной работе с разделами диска.

В примере имеется ввиду что раздел /boot выведен на отдельный раздел и мы его не трогаем. Всегда при создании выношу раздел boot на отдельный раздел и не раз эта схема упрощала мне жизнь при работе или проблемах с диском.

Изменение размера диска без форматирования

В случае простого изменения размеров у разделов все просто.

К сожалению раздел XFS уменьшить нельзя а увеличить можно.

Запускаем программу Gparted и выполняем необходимые действия с имеющимися разделами. Уменьшаем, перераспределяем или отключаем какой то раздел и переносим в корень. Например, в моем случае раздел /var/sevo44 находился на отдельном разделе а мне захотелось перенести его в корневой раздел.

Самое главное это перед тем как удалять раздел и переносить его в общий не забудьте сохранить данные с него.

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

Изменение размера диска с форматированием

В моем случае файловая система была XFS и для уменьшения этого раздела мне необходимо было его переформатировать.

Определяем имеющиеся диски в системе выполнив команду:

fdisk -l
= часть вывода команды с пояснениями =
Диск /dev/sda: 100 GiB, 107374182400 байт, 209715200 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x85300bf3
Устр-во    Загрузочный   начало     Конец   Секторы Размер Идентификатор Тип
/dev/sda1  *               2048   2099199   2097152     1G            83 Linux
/dev/sda2               2099200  23070719  20971520    10G            83 Linux
/dev/sda3              23070720 209715199 186644480    89G            83 Linux

Диск /dev/sdb: 32 GiB, 34359738368 байт, 67108864 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт

Из вывода видно что sda рабочий диск а sdb подключенный.

Создаем раздел из всего диска sdb и форматируем его в ext4:

cfdisk -z /dev/sdb
mkfs.ext4 /dev/sdb1

Создаем две папки куда будем монтировать диски:

mkdir /mnt/sda && mkdir /mnt/sdb

Монтируем раздел sdb1 в необходимую папку:

mount /dev/sdb1 /mnt/sdb

C диском sda немного посложнее. В нашем случае разделы были подключены следующим образом:

df -h
= часть вывода с работающей системы =
/dev/sda2   10G    6,9G   3,2G  69%  /
/dev/sda3   89G    11G     79G  12%  /var/sevo44
/dev/sda1   976M   179M   731M  20%  /boot

Раздел sda1 надо оставить как есть а вот sda3 убрать переместив все данные в корневой раздел sda2.

Монтируем вначале главный раздел а затем вложенный:

mount /dev/sda2 /mnt/sda
mount /dev/sda3 /mnt/sda/var/sevo44

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

df -h
= часть вывода = 
/dev/sdb1  32G   49M   30G    1%  /mnt/sdb
/dev/sda2  10G  6.9G  3.2G   68%  /mnt/sda
/dev/sda3  89G   11G   79G   12%  /mnt/sda/var/sevo44

Всё смонтировалось как надо.

Переносим теперь все данные с папки /mnt/sda в папку /mnt/sdb

Переносить необходимо в консольном файловом менеджере Midnight Commander (mc), так как она при переносе сохранит все права на файлы и перенесёт все один в один.

Есть и другие способы переноса в консоли, но вариант с Midnight Commander проще и наглядней.

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

umount /mnt/sda/var/sevo44
umount /mnt/sda

Запускаем программу Gparted с Live-образа и делаем с разделами что нам необходимо. В моем случае получилось следующее:

Удалил раздел sda3 а раздел sda2 увеличил и отформатировали в формат ext4. Уменьшили диск больше чем на 50 Гиб.

Можно высчитывать и обрезать раздел ровно для последующего уменьшения, но мне проще потом его расширить подключившись с Live-образа.

Монтируем sda2 в папку /mnt/sda и копируем обратно в программе mc все данные с папки /mnt/sdb в /mnt/sda:

mount /dev/sda2 /mnt/sda

После копирования и проверки отключаем sdb1:

umount /mnt/sdb

Теперь нам необходимо отредактировать файл /etc/fstab который отвечает за монтирование разделов.

Определим какие uuid у разделов диска sda (при форматирование раздела uuid меняется на новый):

# blkid
= часть вывода =
/dev/sda1: UUID="fe3e2650-e8ed-48c0-91af-6dd7091114b5" TYPE="ext4" PARTUUID="85300bf3-01"
/dev/sda2: UUID="611171b8-5da5-460c-a6da-7bf8d42f2128" TYPE="ext4" PARTUUID="85300bf3-02"

Открываем /mnt/sda/etc/fstab и смотрим какие там прописаны uuid и параметры файловых систем:

vim /mnt/sda/etc/fstab
= часть необходимого вывода =
UUID=24b899e5-70a1-42f3-9df9-26edbae4ddec /           xfs defaults 0 0
UUID=fe3e2650-e8ed-48c0-91af-6dd7091114b5 /boot       ext4 defaults 1 2
UUID=11f4da95-8de0-4817-b4a9-48d3e859db09 /var/sevo44 xfs defaults 0 0

Как видим у раздела /boot uuid не поменялся а вот у корневого сменился. Приведем файл к необходимым параметрам:

= необходимая для изминения часть =
# /dev/sda2
UUID=611171b8-5da5-460c-a6da-7bf8d42f2128 /     ext4 defaults 1 1
# /dev/sda1
UUID=fe3e2650-e8ed-48c0-91af-6dd7091114b5 /boot ext4 defaults 1 2

Обновление загрузчика Grub2

После перезагрузки системы CentOS 8 вы увидите такое сообщение:

Система говорит что она не видит корневой диск с таким uuid.

В случае если вы делали изменения раздела /boot вы увидите другую ошибку и способ устранения этой ошибки выходит за рамки данной статьи.

Решается эта проблема в два шага:

  1. Загрузится указав правильный uuid;
  2. В загрузившейся системе обновить Grub2.

Запускаем систему и как только увидите варианты загрузки нажимайте клавишу е:

В результате вы увидите место где необходимо сменить информацию:

Меняем на наш новый uuid 611171b8-5da5-460c-a6da-7bf8d42f2128 и нажимаем сочетание клавиш Ctrl и X.

Система загрузится, но значения загрузчика не поменяются. Выполним команду которая обновит grub2 в системе CentOS 8:

grub2-mkconfig -o /boot/grub2/grub.cfg
= вывод команды =
Generating grub configuration file ...
Found CentOS Linux 8 (Core) on /dev/sdb1
done

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

Диск мы уменьшили и добились работоспособности системы теперь осталось выполнить последнее действие по уменьшению файла raw.

Преобразование раздела утилитой fstransform

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

Утилита называется fstransform и способна она преобразовывать в разные форматы.

Для преобразования корневого раздела необходимо загрузится с Live-образа установить утилиту и преобразовать нужный раздел.

Для Live-образа системы Debian (консольный вариант) нам вначале необходимо получить права root:

sudo su

Обновить список пакетов и установить:

apt update
apt install fstransform

Определить нужный раздел для преобразования командой # fdisk -l и запустить необходимую команду:

fstransform /dev/sda2 ext4

Раздел преобразуется с изменением uuid и дальше необходимо выполнить действия аналогично описанным выше.

Боле подробно об утилите можно посмотреть тут.

Уменьшение диска образа RAW

Возможно если у вас виртуальная машина работает на LVM существует способ более простой и не надо переносить образ в файловый вариант, но мне не захотелось выполнять более сложные действия с системой LVM.

Воспользуемся командой которая может произвести изменение диска обрезав образ диска raw с конца на нужный размер.

В нашем случае номер виртуальной машины был 112 и нам необходимо уменьшить образ на 50 G:

qemu-img resize /var/lib/vz/images/112/vm-112-disk-0.raw -50G
= вывод команды =
WARNING: Image format was not specified for '/var/lib/vz/images/112/vm-112-disk-0.raw' and probing guessed raw.
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions.
qemu-img: warning: Shrinking an image will delete all data beyond the shrunken image's end. Before performing such an operation, make sure there is no important data there.
qemu-img: warning: Using the --shrink option will suppress this message. Note that future versions of qemu-img may refuse to shrink images without this option.
Image resized.

Как видим образ успешно изменён.

Осталось загрузится c Live-образа и в программе Gparted задействовать все свободное место от диска.

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

Вывод

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

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

Backup надежный и безопасный

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

Введение

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

Из статьи вы узнаете как я подхожу к этому вопросу и защищаю бэкапы всех своих ресурсов надежно и безопасно.

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

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

Основа безопасности бэкапов

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

  1. Хранение бэкапов за продолжительный период времени. Вариантов почему лучше хранить бэкапы долго множество. Например, удалили какой то материал, но решили восстановить спустя некоторое время или необходимо найти ошибку когда появилась проблема которую обнаружили не сразу.
  2. Забирать бэкапы сторонним сервером. В идеале лучше использовать под резервные копии специальный сервер использующийся только для бэкапов. В случае если копии бэкапов отправляются с самого сервера где делаются бэкапы это опасно, так как в случае взлома или вируса вы можете потерять все копии.
  3. Мониторинг как создание бэкапа так и аналитика его размеров. Как бы вы не пытались отслеживать периодически сами как делаются бэкапы по закону подлости, когда они потребуются, обнаружите что они или не делаются или испорчены.

Ниже я по порядку опишу все свои действия которые использую на практике. Будут использованы стандартные программы используемые во всех версиях Linux.

Создание бэкапов на сервере

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

Структура папок для бэкапов

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

Создадим необходимые папки куда будем класть бэкапы

mkdir -p /backup/bin
mkdir -p /backup/sevo44.ru/{day,month,source}

-p -- создаст все отсутсвующие папки

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

  • /backup — папка где будет находиться всё что связано с резервными копиями;
  • /backup/bin — папка где будут находиться скрипты запускаемые по расписанию;
  • /backup/sevo44.ru/day — папка где будут лежать ежедневные бэкапы;
  • /backup/sevo44.ru/month — папка где будут лежать ежемесячные бэкапы;
  • /backup/sevo44.ru/source — папка в которой я храню копии которые были начальными. Например, в случае когда ресурс переносится с другого сервера или возвращается в жизнь после продолжительного перерыва в работе.

Backup и его периодичность

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

  • Дневные копии — хранить 30 дней,
  • Месячные копии — хранить год.

Подход к резервированию сугубо личное дело и зависит от множества факторов. Главное чтобы эти копии всегда были доступны, исправны и удовлетворяли вашим требованиям.

Создание скриптов для бэкапов

Создадим два скрипта для ежедневного и ежемесячного бэкапа.

Создадим скрипт который будем ежедневно запускать по расписанию:

vim /backup/bin/day-backup-sevo44.ru.sh
= необходимый код =
#!/bin/sh

# Текущая дата в формате 2015-09-29_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`

# Папка для бэкапа
inf_dir='/var/www/sevo44.ru/www'
# Куда размещаем backup
bk_dir='/backup/sevo44.ru/day'

# Название архива с файлами
name_www='www-sevo44.ru'
# Название архива с базой
name_sql='sgl-sevo44.ru'

# Пользователь базы данных
user='sevo44-ru'
# Пароль пользователя базы данных
password='пароль'
# Имя базы данных для бэкапа
bd_name='sevo44-ru'

# Команды для выполнения

# В случае необходимости хранить только последний бэкап
# очищаем папку удаляя только файлы в папке
rm -f $bk_dir/*

# Создание файла с датой для мониторинга в zabbix
echo `date +"%Y-%m-%d_%H-%M"` > $bk_dir/timestamp

# Создание архива папки с файлами
/bin/tar -czvf $bk_dir/$name_www-$date_time.tar.gz $inf_dir

# Создание архива базы данных
/usr/bin/mysqldump --opt -v --databases $bd_name -u$user -p$password | /bin/gzip -c > $bk_dir/$name_sql-$date_time.sql.gz

# Удаляем архивы старше 5-ти дней
#/usr/bin/find $bk_dir -type f -mtime +5 -exec rm {} \;

Для ежемесячных бэкапов создадим такой скрипт:

vim /backup/bin/month-backup-sevo44.ru.sh
= необходимый код =
#!/bin/sh

# Текущая дата в формате 2015-09-29_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`

# Папка для бэкапа
inf_dir='/var/www/sevo44.ru/www'
# Куда размещаем backup
bk_dir='/backup/sevo44.ru/month'

# Название архива с файлами
name_www='www-sevo44.ru'
# Название архива с базой
name_sql='sgl-sevo44.ru'

# Пользователь базы данных
user='sevo44-ru'
# Пароль пользователя базы данных
password='пароль'
# Имя базы данных для бэкапа
bd_name='sevo44-ru'

# Команды для выполнения

# В случае необходимости хранить только последний бэкап
# очищаем папку удаляя только файлы в папке
rm -f $bk_dir/*

# Создание файла с датой для мониторинга в zabbix
echo `date +"%Y-%m-%d_%H-%M"` > $bk_dir/timestamp

# Создание архива папки с файлами
/bin/tar -czvf $bk_dir/$name_www-$date_time.tar.gz $inf_dir

# Создание архива базы данных
/usr/bin/mysqldump --opt -v --databases $bd_name -u$user -p$password | /bin/gzip -c > $bk_dir/$name_sql-$date_time.sql.gz

# Удаляем архивы старше одного года
#/usr/bin/find $bk_dir -type f -mtime +365 -exec rm {} \;

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

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

chmod +x -R /backup/bin

Ошибка при выполнении mysqldump

Иногда вы можете увидеть ошибку при резервном копировании базы данных такого вида:

mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces

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

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

/usr/bin/mysqldump --no-tablespaces --opt -v --databases $bd_name -u$user -p$password | /bin/gzip -c > $bk_dir/$name_sql-$date_time.sql.gz

Суть этой команды заключается в том что на момент бэкапа база остановится. Такой вариант меня не устраивает и мы дадим правильные права для пользователя базы данных (предварительно подключившись к базе данных):

= для случая когда доступ нужен снаружи =
GRANT ALL PRIVILEGES ON *.* TO 'пользователь бд'@'%';

= для случая когда доступ только с localhost =
GRANT ALL PRIVILEGES ON *.* TO 'пользователь бд'@'127.0.0.1';

= сохраним изменения =
FLUSH PRIVILEGES;

Добавление заданий в cron

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

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

В случае если создается резервная копия для разных ресурсов выставляйте время с учетом времини которое необходимо для создания бэкапа.

Открываем необходимый файл и добавляем нужный код:

vim /etc/crontab
= необходимый код =
### Backup
# sevo44.ru
# ежедневно
20 1 * * * root /backup/bin/day-backup-sevo44.ru.sh >/dev/null 2>&1
# ежемесячно 1-го числа
25 1 1 * * root /backup/bin/month-backup-sevo44.ru.sh >/dev/null 2>&1

Согласно команде каждый день в 1:20 бедет выполнятся скрипт для создания ежедневного бэкапа и ежемесячно первого числа в 1:25 будет создаваться ежемесячная резервная копия.

Проверка создания бэкапов

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

Мне больше нравится брать код непосредственно из файла crontab, так как это последнее место которое выявит ошибки связаные с правильностью написания пути к скрипту.

=== Выводим на укран всё что есть заданиях ===
cat /etc/crontab
= часть вывода =
20 1 * * * root /backup/bin/day-backup-sevo44.ru.sh >/dev/null 2>&1

=== Копируем выделеный код и выполняем в консоли ===
/backup/bin/day-backup-sevo44.ru.sh
= часть вывода =
...
/var/www/sevo44.ru/www/modules/mod_syndicate/tmpl/
/var/www/sevo44.ru/www/modules/mod_syndicate/tmpl/default.php
/var/www/sevo44.ru/www/modules/mod_syndicate/mod_syndicate.xml
/var/www/sevo44.ru/www/modules/mod_syndicate/helper.php
/var/www/sevo44.ru/www/LICENSE.txt
-- Connecting to localhost...
-- Retrieving table structure for table oxsht_assets...
-- Sending SELECT query...
-- Retrieving rows...
...
-- Disconnecting from localhost...

Посмотреть результат работы cron можно заглянув в файл:

cat /var/log/cron
= вывод удачной работы задания =
Apr 18 01:20:00 ih378656 CROND[17528]: (root) CMD (/backup/bin/day-backup-sevo44.ru.sh >/dev/null 2>&1)

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

Создание копии backups используя rsync

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

Подключается к серверу с которого надо забирать бэкапы будем по сертификату. Для копирования будем использовать утилиту rsync.

Именно на этом сервере производится мониторинг правильности создания бэкапов и их размеры средствами программы для мониторинга Zabbix.

Узнать как работать со свободным программным комплексом для мониторинга вы можете из раздела Мониторинг Zabbix.

Возможности Zabbix удовлетворят любые потребности для осуществления любых параметров практически любой системы.

Подключение по сертификату

Более подробно о том как настраивать механизм подключения по сертификаты можете найти в статье RSA или авторизация SSH по ключу.

Скопируем на подключаемый ресурс необходимую часть ключа:

ssh-copy-id -i /root/.ssh/id_rsa.pub -p 25555 root@192.168.0.33

После успешного выполнения пробуем подключиться:

ssh -p 25555 root@192.168.0.33

В случае успеха идём дальше.

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

Создание скрипта для выполнения rsync

Создадим необходимый скрипт:

vim /backup/bin/rsync-lemp.sevo44.ru.sh
= необходимый код =
#!/bin/bash

# Записываем информацию в лог о начале
#echo "`date +"%Y-%m-%d_%H-%M-%S"` Start rsync lemp.sevo44.ru" >> /var/log/rsync-lemp.sevo44.ru.log

# Копирование бэкапов с lemp.sevo44.ru
/usr/bin/rsync -avzhe "ssh -p 25555" root@192.168.0.33:/backup/ /backup/lemp.sevo44.ru
# Зеркало бэкапов с lemp.sevo44.ru
#/usr/bin/rsync --delete -avzhe "ssh -p 25555" root@192.168.0.33:/backup/ /backup/lemp.sevo44.ru

# Записываем информацию в лог о конце
#echo "`date +"%Y-%m-%d_%H-%M-%S"` End rsync lemp.sevo44.ru" >> /var/log/rsync-lemp.sevo44.loc.log

# Удаляем архивы старше 15-ти дней если не использовать параметр --delete 
# 
/usr/bin/find /backup/lemp.sevo44.ru/sevo44.ru/day -type f -mtime +15 -exec rm {} \;

Скрипт задокументирован и выберите параметры исходя из ваших требований.

Расшифрую параметры указанные в коде:

  • a — режиме архива;
  • v — увеличение детализации;
  • z — сжатие данных файла во время передачи;
  • h — вывод чисел в удобочитаемом формате;
  • e — используем ssh подключение.

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

chmod +x -R /backup/bin

Добавление задания в cron

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

В случае если создается резервная копия для разных ресурсов выставляйте время с учетом времени которое необходимо для создания бэкапа.

Открываем необходимый файл и добавляем нужный код:

vim /etc/crontab
= необходимый код =
### rsync
# lemp.sevo44.ru
# ежедневно
30 6 * * * root /backup/bin/rsync-lemp.sevo44.ru.sh >/dev/null 2>&1

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

Дальнейшие проверки аналогичны действиям указанным в разделе выше.

В случае вывода ошибки при выполнении скрипта:

Unexpected remote arg: root@192.168.0.33:/backup/
rsync error: syntax or usage error (code 1) at main.c(1343) [sender=3.1.2]

Смотрите правильность указания всех путей, параметров. Для вывода справки выполните в консоли команду rsync —help .

Использование Yndex.Disk для backups

При регистрации домена мне нравится переводить его управление на Yandex. Для бэкапов создаю отдельный почтовый ящик на домене и туда копирую бэкапы сайта. Удобно передавать заказчику управление доменом и резервные копии в одном месте.

Yandex.Disk дает возможность подключится с помощью WebDav. Необходимо добавить пакет davfs2 для работы по WebDav.

К сожалению на данный момент невозможно передавать данные большого размера по WebDav на Yandex.

Вы можете установить на систему консольный клиент от Yandex и проводить резервное копирование с помощью его.

Официальная страница руководства пользователя имеет понятное описание по установке и использованию на разных системах.

Более подробно с описанием сервиса Yandex Disk вы можете ознакомиться перейдя в раздел техподдержки Яндекса.

Установка Davfs2

Рассмотрим настройку на примере системы CentOS 7.

Подключим репозиторий Еpel:

yum -y install epel-release

Установим пакет davfs2:

yum -y install davfs2

Настройка WebDav для Yandex.Disk

Создадим папку куда будем монтировать:

mkdir /backup/mnt/ydisk-sevo44.ru-backups

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

Смонтируем Yandex.Disk в необходимую папку:

mount -t davfs https://webdav.yandex.ru /backup/mnt/ydisk-sevo44.ru-backups/
= вывод команды с необходимыми данными =
Please enter the username to authenticate with server
 https://webdav.yandex.ru or hit enter for none.
 Username: вводим логин
 Please enter the password to authenticate user zeroxzed@yandex.ru with server
 https://webdav.yandex.ru or hit enter for none.
 Password: вводим пароль
 /sbin/mount.davfs: Warning: can't write entry into mtab, but will mount the file system anyway

Диск смонтировался в указанную папку.

Отмантировать диск можно командой:

umount /backup/mnt/ydisk-sevo44.ru-backups/

Введение вручную данных при монтировании не всегда удобно и для удобства мы автоматизируем этот процесс.

Отредактируем файл /etc/davfs2/secrets, добавив в конец строку с данными для авторизации:

vim /etc/davfs2/secrets
= необходимые данные для добавления =
# путь монитрования - почтовый ящик - пароль
/backup/mnt/ydisk-sevo44.ru-backups/ backups@sevo44.ru password

Так мы можем задать любое количество строчек с необходимыми ресурсами Yandex.Disk.

В случае если вы хотите чтобы диск монтировался при перезагрузке системы то в etc/fstab необходимо добавить строчку:

mcedit /etc/fstab
= необходимые данные для добавления =
https://webdav.yandex.ru /backup/mnt/ydisk-sevo44.ru-backups davfs rw,user,_netdev 0 0
# обязательно переход на новую строку

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

Не советую использовать монитрование через fstab, так как в случае обрыва связи копии не будут копироваться.

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

Создание скрипта для работы с Yandex.Disk

Создалим скрипт для выполнения копирования резервных копий на Yandex.Disk:

vim /backup/bin/ydisk-sevo44.ru-backups.sh
= необходимые данные =
#!/bin/sh

# Монтируем Yandex.Disk
mount -t davfs https://webdav.yandex.ru /backup/mnt/ydisk-sevo44.ru-backups/

# Создание зеркала ежедневных архивов
rsync -avzh --delete /backup/sevo44.ru/day /backup/mnt/ydisk-sevo44.ru-backups/

# Копирование резервных копий  
#rsync -avzh /backup/sevo44.ru/day /backup/mnt/ydisk-sevo44.ru-backups/

# Удаляем копии старше 10 дней при использовани копирования
#/usr/bin/find $bk_dir -type f -mtime +30 -exec rm {} \;

# Отмонтирует Yandex.Disk
umount /backup/mnt/ydisk-sevo44.ru-backups/

# Очищения кэш davfs2
find /var/cache/davfs2/ -mindepth 1 -a -print0 | xargs -n 100 -0 rm -rf

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

  1. Смонтирует удаленный Yandex.Disk;
  2. Сделает зеркало с папки /backup/sevo44.ru/day;
  3. Отмонтирует Yandex.Disk;
  4. Очистит кэш создаваемый при работе davfs2.

Очищать кэш созданный при работе davfs2 надо обязательно иначе место на диске быстро закончиться.

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

chmod +x -R /backup/bin

Добавление задания в cron

Откроем для редактирования /etc/crontab файл откуда выполнятся задания:

vim /etc/crontab
= необходимые данные для добавления =
# sevo44.ru backup to Ydisk.Disk
# Каждый день в 6:30 запускается ежедневный backup
30 6 * * * root /root/backup/sevo44.ru/day.sh >/dev/null 2>&1

Перезагрузим cron в системе CentOS 7 для применения изминений:

systemctl restart crond

Проверки осуществляем по аналогии с предыдущими главами.

Заключение

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

MariaDB оптимизация и установка

Правильная оптимизация MariaDB после установки одна из важнейших задач с которыми сталкиваешься при обслуживании серверов LEMP. Расскажу свой подход к решении этой задачи. Зная информацию вы всегда сможете правильно настроить его работу.

Введение

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

О том как работать с базами данных в консоли вы можете узнать из статьи MariaDB работа из консоли.

Установка MariaDB

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

Репозиторий разработчика

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

Рекомендую воспользоваться ссылкой выше и использовать код репозитория и команды установки исходя из вашей системы.

Например, для системы CentOS 8 с выбором версии 10.4 я получил код который размещу в необходимый файл:

vim /etc/yum.repos.d/mariadb.repo
= необходимый код =
# MariaDB 10.4 CentOS repository list - created 2019-10-24 18:16 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos8-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Установка MariaDB

На странице, где указан код присутствует и команда которую необходимо выполнить для установки исходя из выбранного дистрибутива. Для CentOS 8 команда имеет такой вид:

dnf install boost-program-options
dnf install MariaDB-server MariaDB-client --disablerepo=AppStream

Перед продолжением установки смотрим чтобы репозиторий был mariadb!

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

systemctl start mariadb
systemctl enable mariadb

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

systemctl status mariadb
= вывод команды =
 mariadb.service - MariaDB 10.4.8 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: active (running) since Thu 2019-10-24 21:27:02 MSK; 40s ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
 Main PID: 1798 (mysqld)
   Status: "Taking your SQL requests now..."
    Tasks: 30 (limit: 11524)
   Memory: 74.3M
   CGroup: /system.slice/mariadb.service
           └─1798 /usr/sbin/mysqld

окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] InnoDB: Buffer pool(s) load completed at 191024 21:27:02
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Plugin 'FEEDBACK' is disabled.
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Server socket created on IP: '::'.
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Reading of all Master_info entries succeeded
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Added new Master_info '' to hash table
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] /usr/sbin/mysqld: ready for connections.
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: Version: '10.4.8-MariaDB'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MariaDB Server
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc systemd[1]: Started MariaDB 10.4.8 database server.
окт 24 21:27:14 wp-lxc.pro-php7.sevo44.loc systemd[1]: mariadb.service: Failed to reset devices.list: Operation not permitted

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

Начальная конфигурация mysql

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

/usr/bin/mysql_secure_installation
= вывод команды с пояснениями (перевод) =
Примечание: запуск всех частей этого сценария рекомендуется для всех MariaDB
СЕРВЕРА В ЭКСПЛУАТАЦИЮ! ПОЖАЛУЙСТА, ВНИМАТЕЛЬНО ПРОЧИТАЙТЕ КАЖДЫЙ ШАГ!

1. Для того, чтобы войти в MariaDB обеспечения его, нам понадобится текущий пароль для пользователя root. Если вы только что установили MariaDB и вы еще не установили пароль root, пароль будет пустым, поэтому вы должны просто нажать здесь.
Введите текущий пароль для root (enter for none):

2. Установка пароля root гарантирует, что никто не может войти в MariaDB пользователь root без надлежащего разрешения.
Задать пароль пользователя root? [Y / n]

3. По умолчанию, установка MariaDB имеет анонимного пользователя, что позволяет любому чтобы войти в MariaDB без необходимости иметь учетную запись пользователя, созданную для их. Это предназначено только для испытывать, и сделать установку пойти немного более гладким. Вы должны удалить их перед перемещением в производственная среда.
Удалить анонимных пользователей? [Y / n]

4. Обычно, root должно быть позволено подключаться от "localhost". Этот гарантирует, что кто-то не может угадать пароль.
Запретить root подключаться удаленно? [Y / n]

5. По умолчанию, MariaDB поставляется с базой данных с именем "test", что любой может доступ. Это также предназначено только для тестирования и должно быть удалено перед переходом в производственную среду.
Удалить тестовую базу данных и доступ к ней? [Y / n]

6. Перезагрузить таблицы привилегий обеспечит, что все изменения, сделанные до сих пор вступит в силу немедленно.
Перезагрузить таблицы привилегий сейчас? [Y / n]

Все сделано! Если вы выполнили все вышеперечисленные шаги, ваш MariaDB теперь установка должна быть безопасной.
Спасибо за использование MariaDB!

Информация о действующих параметрах

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

mysqld --verbose --help
= часть вывода команды с пояснениями =
!!! в консоли у меня не показывается первая часть вывода и как её увидеть я сказу ниже!!!
= в верхней части вы увидите где находится файл настойки =
mysqld Ver 10.3.12-MariaDB-log for Linux on x86_64 (MariaDB Server)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Starts the MariaDB database server.

Usage: mysqld [OPTIONS]

Default options are read from the following files in the given order:
/etc/my.cnf ~/.my.cnf

= в этой части увидите вывод всех возможных параметров = 
--thread-handling=name 
                      Define threads usage for handling queries. One of: 
                      one-thread-per-connection, no-threads, pool-of-threads
  --thread-pool-idle-timeout=# 
                      Timeout in seconds for an idle thread in the thread
                      pool.Worker thread will be shut down after timeout
  --thread-pool-max-threads=# 
                      Maximum allowed number of worker threads in the thread
                      pool

= в этой части параметры которые используются по умолчанию =
Variables (--variable-name=value)
and boolean options {FALSE|TRUE}                           Value (after reading options)
---------------------------------------------------------- ---------------
allow-suspicious-udfs                                      FALSE
alter-algorithm                                            DEFAULT
aria                                                       ON
aria-block-size                                            8192
aria-checkpoint-interval                                   30
aria-checkpoint-log-activity                               1048576
aria-encrypt-tables                                        FALSE
aria-force-start-after-recovery-failures                   0
aria-group-commit                                          none
aria-group-commit-interval                                 0
aria-log-dir-path                                          /var/lib/mysql/
aria-log-file-size                                         1073741824
aria-log-purge-type                                        immediate
= в конце информация о том как посмотреть текущие параметры =

To see what values a running MySQL server is using, type
'mysqladmin variables' instead of 'mysqld --verbose --help'.

перевод
Чтобы увидеть, какие значения использует работающий сервер MySQL, введите 'mysqladmin variables' вместо 'mysqld --verbose --help'.

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

 mysqld --verbose --help > mysqld--verbose--help.txt

Какие значения использует работающий сервер тоже лучше вывести в файл:

mysqladmin variables -u root -p > mysqladmin-variables.txt
Enter password: 

Правильная оптимизация MariaDB возможно только при использовании правильных параметров исходя из вашей версии!

Файл настройки MariaDB

В фале /etc/my.cnf присутствует строка !includedir /etc/my.cnf.d говорящая о том что все настройки находятся в папке /etc/my.cnf.d

Все основные настройки необходимо вносить в раздел [mysqld] файла server.cnf.

Аналитика работы MariaDB

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

Включим отображение медленных запросов добавив следующие строки в /etc/my.cnf.d/server.cnf, в секцию [mysqld]:

vim /etc/my.cnf.d/server.cnf
= необходимые параметры в секцию [mysqld] =
# запись лога медленных запросов
slow_query_log=ON
# путь к файлу 
slow_query_log_file=/var/lib/mysql/slow_queries.log
# минимальное время запроса для внесения
long_query_time=2
# включить в лог запросы, которые не используют индексы
#log-queries-not-using-indexes=1

Последний параметр отключен, так как используется больше для отладки кода и правильности создания таблиц.

Перезапустим сервер баз данных и посмотрим лог медленных запросов:

systemctl restart mariadb
tail -f /var/lib/mysql/slow_queries.log
= вывод команды =
Time		    Id Command	Argument
/usr/sbin/mysqld, Version: 10.3.12-MariaDB-log (MariaDB Server). started with:
Tcp port: 0  Unix socket: (null)
= для выхода ctrl+c =

В нашем случае медленных запросов нет.

Оптимизация MariaDB

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

Для правильной оптимизации необходимо владеть всей необходимой информацией. Например, для меня это:

  • Информация о действующих параметрах — перед тем как вносить изменения необходимо смотреть какой параметр действует на данный момент ,
  • Аналитика работы — без аналитики работы вообще бессмысленно производить оптимизацию,
  • Требование к базе данных — у разных движков сайтов существует разное требование для работы с базой данных и это надо учитывать.

Работа с MySQLTunner

Существует perl-скрипт Mysqltuner, который анализирует статистику работы Mysql и выдает свои рекомендации что бы была проведена правильная оптимизация MariaDB.

Установка

Создадим папку, перейдем в неё и скачаем скрипт следующим образом:

mkdir mysqltuner
cd mysqltuner
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl

Если возникает ошибка вида:

ERROR: cannot verify raw.githubusercontent.com’s certificate, issued by ‘/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA’:
Unable to locally verify the issuer’s authority.
To connect to raw.githubusercontent.com insecurely, use `—no-check-certificate’.

Запускаем с ключом —no-check-certificate:

# wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl --no-check-certificate

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

= База простых паролей =
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/basic_passwords.txt -O basic_passwords.txt

= База уязвимостей =
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/vulnerabilities.csv -O vulnerabilities.csv

Базы простых паролей и уязвимостей будут использоваться только при запуске скрипта!

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

Debian/Ubuntu:

apt install mysqltuner

CentOS:

yum install mysqltuner

Оптимизация

Чтобы данные анализа и статистика были корректными, сервер Mysql должен проработать без смены параметров конфигурации и без перезагрузок, по рекомендации самого Mysqltuner не менее 24 часов.

Обращаю внимание на то что правильная оптимизация MariaDB возможно при рабочих базах данных. Перед внесением изменений не ленитесь смотреть какие имеются текущие настройки базы. Скрипт может давать ошибочные выводы!

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

perl mysqltuner.pl

Если производилась установка:

mysqltuner

После введения данных пользователя root для MariaDB вы увидите примерно такой вывод:

mysqltuner
= вывод команды =
>> MySQLTuner 1.7.13 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering

[--] Skipped version check for MySQLTuner script
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: [OK] Currently running supported MySQL version 10.3.12-MariaDB
[OK] Operating on 64-bit architecture

-------- Log file Recommendations
[--] Log file: /var/lib/mysql/mysql_error.log(0B)
[!!] Log file /var/lib/mysql/mysql_error.log doesn't exist
[!!] Log file /var/lib/mysql/mysql_error.log isn't readable.

-------- Storage Engine Statistics
[--] Status: +Aria +CSV +InnoDB +MEMORY +MRG_MyISAM +MyISAM +PERFORMANCE_SCHEMA +SEQUENCE 
[!!] InnoDB is enabled but isn't being used
[OK] Total fragmented tables: 0

-------- Analysis Performance Metrics
[--] innodb_stats_on_metadata: OFF
[OK] No stat updates during querying INFORMATION_SCHEMA.

-------- Security Recommendations
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[!!] There is no basic password file list!

-------- CVE Security Recommendations
[--] Skipped due to --cvefile option undefined

-------- Performance Metrics
[--] Up for: 28s (10 q [0.357 qps], 14 conn, TX: 56K, RX: 1K)
[--] Reads / Writes: 100% / 0%
[--] Binary logging is disabled
[--] Physical Memory : 1.8G
[--] Max MySQL memory : 856.4M
[--] Other process memory: 33.7M
[--] Total buffers: 417.0M global + 2.9M per thread (151 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 419.9M (22.84% of installed RAM)
[OK] Maximum possible memory usage: 856.4M (46.59% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/10)
[OK] Highest usage of available connections: 0% (1/151)
[!!] Aborted connections: 7.14% (1/14)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[!!] Query cache may be disabled by default due to mutex contention.
[!!] Query cache efficiency: 0.0% (0 cached / 1 selects)
[OK] Query cache prunes per day: 0
[OK] No Sort requiring temporary tables
[OK] No joins without indexes
[OK] Temporary tables created on disk: 0% (0 on disk / 4 total)
[OK] Thread cache hit rate: 92% (1 created / 14 connections)
[OK] Table cache hit rate: 64% (11 open / 17 opened)
[OK] Open file limit used: 0% (25/16K)
[OK] Table locks acquired immediately: 100% (18 immediate / 18 locks)

-------- Performance schema
[--] Performance schema is disabled.
[--] Memory used by P_S: 0B
[--] Sys schema isn't installed.

-------- ThreadPool Metrics
[--] ThreadPool stat is enabled.
[--] Thread Pool Size: 1 thread(s).
[--] Using default value is good enough for your version (10.3.12-MariaDB)

-------- MyISAM Metrics
[!!] Key buffer used: 18.2% (24M used / 134M cache)
[OK] Key buffer size / total MyISAM indexes: 128.0M/123.0K

-------- InnoDB Metrics
[--] InnoDB is disabled.
[!!] InnoDB Storage engine is disabled. InnoDB is the default storage engine

-------- AriaDB Metrics
[--] AriaDB is enabled.
[OK] Aria pagecache size / total Aria indexes: 128.0M/1B

-------- TokuDB Metrics
[--] TokuDB is disabled.

-------- XtraDB Metrics
[--] XtraDB is disabled.

-------- Galera Metrics
[--] Galera is disabled.

-------- Replication Metrics
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] Binlog format: MIXED
[--] XA support enabled: ON
[--] Semi synchronous replication Master: OFF
[--] Semi synchronous replication Slave: OFF
[--] This is a standalone server

-------- Recommendations
General recommendations:
Add skip-innodb to MySQL configuration to disable InnoDB
MySQL was started within the last 24 hours - recommendations may be inaccurate
Reduce or eliminate unclosed connections and network issues
Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
Performance schema should be activated for better diagnostics
Consider installing Sys schema from https://github.com/mysql/mysql-sys
Variables to adjust:
query_cache_size (=0)
query_cache_type (=0)
query_cache_limit (> 1M, or use smaller result sets)
performance_schema = ON enable PFS

Так выглядит вывод команды после 48 часов работы MariaDB без рабочих баз.

Обращать внимание надо на параметры с восклицательными знаками.

Для того чтобы была информация в разделе Log file Recommendations необходимо добавить следующий код:

vim /etc/my.cnf.d/server.cnf
= необходимые дополнения в [mysqld] =
# необходимо для mysqltuner
log_error=/var/lib/mysql/mysql_error.log

В самом конце вывода утилита предоставит список рекомендаций как исправить ситуацию.

  • query_cache_size (=0)
  • query_cache_type (=0)
  • query_cache_limit (> 1M, or use smaller result sets)

Скрипт рекомендует отключить кэш запросов. Query Cache — это кэш вызовов SELECT. Когда базе данных отправляется запрос, она выполняет его и сохраняет сам запрос и результат в этом кэше. При использовании его вместе с InnoDB при любом изменении совпадающих данных кэш будет перестраиваться, что влечет за собой потерю производительности. И чем больше объем кэша, тем больше потери. Кроме того при обновлении кэша могут возникать блокировки запросов. Таким образом, если данные часто пишутся в базу данных — его надежнее отключить добавив следующий код:

vim /etc/my.cnf.d/server.cnf
= необходимые дополнения [mysqld] =
# рекомендации mysqltuner
query_cache_size=0
query_cache_type=0
query_cache_limit=1M
  • performance_schema = ON enable PFS

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

После внесения изменений выполним перезапуск MariaDB:

systemctl restart mariadb

Теперь вывод примет вид:

mysqltuner
= вывод команды =
>> MySQLTuner 1.7.13 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering

[--] Skipped version check for MySQLTuner script
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: [OK] Currently running supported MySQL version 10.3.12-MariaDB-log
[OK] Operating on 64-bit architecture

-------- Log file Recommendations
[--] Log file: /var/lib/mysql/mysql_error.log(35K)
[OK] Log file /var/lib/mysql/mysql_error.log exists
[OK] Log file /var/lib/mysql/mysql_error.log is readable.
[OK] Log file /var/lib/mysql/mysql_error.log is not empty
[OK] Log file /var/lib/mysql/mysql_error.log is smaller than 32 Mb
[!!] /var/lib/mysql/mysql_error.log contains 0 warning(s).
[!!] /var/lib/mysql/mysql_error.log contains 0 error(s).
[--] 12 start(s) detected in /var/lib/mysql/mysql_error.log
[--] 1) 2019-02-11 23:07:41 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 2) 2019-02-11 0:19:06 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 3) 2019-02-11 0:01:53 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 4) 2019-02-10 23:45:22 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 5) 2019-02-10 23:42:20 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 6) 2019-02-10 23:40:37 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 7) 2019-02-10 23:36:16 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 8) 2019-02-10 23:33:53 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 9) 2019-02-10 23:16:12 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 10) 2019-02-10 23:05:08 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 11 shutdown(s) detected in /var/lib/mysql/mysql_error.log
[--] 1) 2019-02-11 9:12:02 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 2) 2019-02-11 0:19:06 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 3) 2019-02-11 0:01:53 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 4) 2019-02-10 23:45:21 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 5) 2019-02-10 23:42:19 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 6) 2019-02-10 23:40:37 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 7) 2019-02-10 23:36:16 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 8) 2019-02-10 23:28:06 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 9) 2019-02-10 23:16:12 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 10) 2019-02-10 23:05:07 0 [Note] /usr/sbin/mysqld: Shutdown complete

-------- Storage Engine Statistics
[--] Status: +Aria +CSV +InnoDB +MEMORY +MRG_MyISAM +MyISAM +PERFORMANCE_SCHEMA +SEQUENCE 
[!!] InnoDB is enabled but isn't being used
[OK] Total fragmented tables: 0

-------- Analysis Performance Metrics
[--] innodb_stats_on_metadata: OFF
[OK] No stat updates during querying INFORMATION_SCHEMA.

-------- Security Recommendations
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[!!] There is no basic password file list!

-------- CVE Security Recommendations
[--] Skipped due to --cvefile option undefined

-------- Performance Metrics
[--] Up for: 58s (10 q [0.172 qps], 14 conn, TX: 56K, RX: 1K)
[--] Reads / Writes: 100% / 0%
[--] Binary logging is disabled
[--] Physical Memory : 1.8G
[--] Max MySQL memory : 1.5G
[--] Other process memory: 59.2M
[--] Total buffers: 1.0G global + 2.9M per thread (151 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 1.0G (57.61% of installed RAM)
[OK] Maximum possible memory usage: 1.5G (81.36% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/10)
[OK] Highest usage of available connections: 0% (1/151)
[!!] Aborted connections: 7.14% (1/14)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[OK] Query cache is disabled by default due to mutex contention on multiprocessor machines.
[OK] No Sort requiring temporary tables
[OK] No joins without indexes
[OK] Temporary tables created on disk: 0% (0 on disk / 4 total)
[OK] Thread cache hit rate: 92% (1 created / 14 connections)
[OK] Table cache hit rate: 64% (11 open / 17 opened)
[OK] Open file limit used: 0% (26/16K)
[OK] Table locks acquired immediately: 100% (18 immediate / 18 locks)

-------- Performance schema
[--] Performance schema is disabled.
[--] Memory used by P_S: 0B
[--] Sys schema isn't installed.

-------- ThreadPool Metrics
[--] ThreadPool stat is enabled.
[--] Thread Pool Size: 1 thread(s).
[--] Using default value is good enough for your version (10.3.12-MariaDB-log)

-------- MyISAM Metrics
[!!] Key buffer used: 18.2% (24M used / 134M cache)
[OK] Key buffer size / total MyISAM indexes: 128.0M/123.0K

-------- InnoDB Metrics
[--] InnoDB is disabled.
[!!] InnoDB Storage engine is disabled. InnoDB is the default storage engine

-------- AriaDB Metrics
[--] AriaDB is enabled.
[OK] Aria pagecache size / total Aria indexes: 128.0M/1B

-------- TokuDB Metrics
[--] TokuDB is disabled.

-------- XtraDB Metrics
[--] XtraDB is disabled.

-------- Galera Metrics
[--] Galera is disabled.

-------- Replication Metrics
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] Binlog format: MIXED
[--] XA support enabled: ON
[--] Semi synchronous replication Master: OFF
[--] Semi synchronous replication Slave: OFF
[--] This is a standalone server

-------- Recommendations
General recommendations:
Control warning line(s) into /var/lib/mysql/mysql_error.log file
Control error line(s) into /var/lib/mysql/mysql_error.log file
Add skip-innodb to MySQL configuration to disable InnoDB
MySQL was started within the last 24 hours - recommendations may be inaccurate
Reduce or eliminate unclosed connections and network issues
Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
Performance schema should be activated for better diagnostics
Consider installing Sys schema from https://github.com/mysql/mysql-sys
Variables to adjust:
performance_schema = ON enable PFS

Базовые параметры

Обычно я добавляю следующие параметры по умолчанию в свои сервера:

vim /etc/my.cnf.d/server.cnf 
= необходимые дополнения [mysqld] =
# базовые настройки
character_set_server=utf8
collation-server=utf8_bin
init_connect="SET NAMES utf8 collate utf8_bin"

innodb_file_per_table=1
innodb_buffer_pool_size = 800M # внимание на параметр! установить примерно в 2 раза меньше объема оперативной памяти сервера
innodb_log_file_size = 200M # размер файла лога innodb должен составлять 25% от размера буфера
innodb_buffer_pool_instances=1 # увеличивать на 1 каждый GB innodb_buffer_pool_size
innodb_flush_log_at_trx_commit = 0
innodb_log_files_in_group = 3

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

# systemctl status mariadb -l

Ротация логов MariaDB

Откроем необходимый файл и сделаем необходимые изменения:

vim /etc/logrotate.d/mysql
= часть вывода с необходимыми изменениями =
/var/lib/mysql/*log {
        # create 600 mysql mysql
        notifempty
        daily
        size 5M
        rotate 7
        missingok
        compress
    postrotate
        # just if mysqld is really running
        if test -x /usr/bin/mysqladmin && \
           /usr/bin/mysqladmin ping &>/dev/null
        then
           /usr/bin/mysqladmin --local flush-error-log \
              flush-engine-log flush-general-log flush-slow-log
        fi
    endscript
}

Мы указали что надо ротировать все логи и хранить 7 дней при условии что размер файла 5 Mегабайт.

Сохраним и применим изменения без перезагрузки:

logrotate /etc/logrotate.conf

Проверим правильность выполнив тестирование (опция -d):

logrotate -d /etc/logrotate.d/mysql
= вывод команды =
reading config file /etc/logrotate.d/mysql
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/lib/mysql/*log  5242880 bytes (7 rotations)
empty log files are not rotated, old logs are removed
considering log /var/lib/mysql/mysql_error.log
  log does not need rotating (log size is below the 'size' threshold)
considering log /var/lib/mysql/slow_queries.log
  log does not need rotating (log size is below the 'size' threshold)
considering log /var/lib/mysql/tc.log
  log does not need rotating (log size is below the 'size' threshold)

Все логи не имеют необходимого размера для выполнения ротации.

Вывод

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

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

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

Для желающих дополнить или подправить ниже есть комментарии.

SWAP для Linux

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

Введение

Постараюсь  коротко рассказать основные моменты которые надо учитывать и дать практические советы проверенные на личном опыте.

Нужен SWAP или нет?

Однозначно нужен! Можно обойтись и без него, но тогда имейте в виду, что:

  1. SWAP используется при организации режима сна и при его отсутствии про этот режим можно забыть,
  2. Если SWAP отсутствует и память будет исчерпана тогда компьютер зависнет и потребуется выполнять полный сброс (hard reset). У меня был случай когда браузер Chrome скушал всю память и повесил систему.

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

Размер SWAP

Советов по размеру множество, но мы остановимся на советах разработчиков Red Hat (CentOS):

  • Если памяти < 2G то необходимый объем S = M *2
  • Если памяти > 2G то необходимый объем S = M + 2

При современных объемах жестких дисков я бы не стал жалеть места на размер SWAP и уверяю вас что экономия места в данном случае может привести к гораздо большим проблемам.

Варианты размещения SWAP

Вариантов несколько:

  • на разделе диска,
  • в файле,
  • или в оперативной памяти использую zRAM.

Исторически в Linux SWAP размещался на разделе, но в современных дистрибутивах производительность SWAP-файла не уступает SWAP-разделу и это весьма радует.

SWAP-раздел

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

Хочу заострить ваше внимание на установку систем Linux из готовых шаблонов которые предлагают хозяева ресурсов предоставляющих услуги VDS. Один из шаблонов при использовании 2 G памяти создал мне SWAP раздел размером 512 М. При таком размере он заполнился на стадии настройки системы. Устанавливайте OS Linux по возможности с минимального iso образа системы!

SWAP-файл

Использование файла очень удобно особенно когда нет точного понимания какие будут окончательные аппаратные параметры системы. Файл можно создать в любом удобном месте и необходимым вам размером. Ниже я расскажу как это сделать.

ZRAM и ZSWAP

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

ZRAM — это модуль ядра Linux, позволяющий сжимать содержимое оперативной памяти, и таким образом увеличивать ее объем в несколько раз. ZRAM создает сжатое блочное устройство в ОЗУ которое чаще всего используется как swap. При этом степень сжатия данных получается в среднем 3:1. Это означает что на 1 гигабайт подкачки будет использовано в 333 мегабайт физической памяти.

ZSWAP — тличается от ZRAM тем, что использует существующий swap-раздел на диске, а в ОЗУ создаётся пул со сжатыми данными (кэшем). После того как пул до отказа забьётся сжатыми данными, он сбросит их в раздел подкачки и снова начнёт принимать и сжимать данные.  По утверждению разработчиков, в их конфигурации при компиляции ядра в ситуации когда происходит своппинг, выигрыш по объему ввода/вывода составил 76%, а время выполнения операции сократилось на 53%. При использовании ZSWAP, используется раздел swap на диске, в ОЗУ хранится только сжатый кэш.

Проверка наличия SWAP

Проверка наличие:

swapon -s

Если пусто, значит его нет.

Можно проверить используя утилиту htop.

Создание SWAP-файла

Создадим файл c именем swap размером 4 G в папке /etc:

dd if=/dev/zero of=/etc/swap bs=1024 count=4000000
= вывод команды =
4000000+0 записей получено
4000000+0 записей отправлено
скопировано 4096000000 байт (4,1 GB), 176,33 c, 23,2 MB/

Форматируем файл в формат свопа:

mkswap /etc/swap
=вывод команды=
Setting up swapspace version 1, size = 3999996 KiB
no label, UUID=7db57287-a7c3-4973-9f89-0be098a493ac

Подключаем файл к системе:

swapon /etc/swap
=вывод команды=
swapon: /etc/swap: insecure permissions 0644, 0600 suggested.

Проверяем результат работы:

swapon -s
=вывод команды=
Filename Type Size Used Priority
/etc/swap file 3999996 0 -1

Сделаем чтобы swap монтировался при загрузке. Для этого добавляем в fstab необходимый параметр:

vim /etc/fstab
=необходимые дополнения=
# Подключим swap при загрузке
/etc/swap swap swap defaults 0 0

В конце файла делаем переход на новую строку!

Сохраняем файл и перезагружаемся.

reboot

Проверяем:

swapon -s
=вывод команды=
Filename Type Size Used Priority
/etc/swap file 3999996 0 -1

Оптимизация SWAP

Оптимизация сводится к настройке двух параметров.

Параметр ядра swappiness

Параметры от 0 до 100. При значениях близких к нулю, ядро не переносит данные на диск, если в этом нет крайней необходимости.

Определение используемого параметра swappiness:

cat /proc/sys/vm/swappiness
= вывод команды =
30

Исходя из действующего значения принимаете решение об изменении. Изменим значение до 10:

sysctl -w vm.swappiness=10
= вывод команды =
vm.swappiness=10

параметр -w для сохранения этой настройки после перезагрузки.

Параметр ядра vfs_cache_pressure

Показывает системе какое время нужно хранить открытые. Значение по умолчанию 100. При значениях близких к нулю, ядро будет держать их в памяти как можно дольше.

Определение используемого параметра vfs_cache_pressure:

cat /proc/sys/vm/vfs_cache_pressure
= вывод команды= 
100

Исходя из действующего значения принимаете решение об изменении. Изменим значение до 1000:

sysctl -w vm.vfs_cache_pressure=1000
= вывод команды =
vm.vfs_cache_pressure=1000

Значительное увеличение vfs_cache_pressure за пределы 100 может отрицательно сказаться на производительности. Для восстановления кода необходимо использовать различные блокировки для поиска свободных каталогов и объектов inode. При vfs_cache_pressure = 1000 он будет искать в десять раз больше свободных объектов, чем есть.

Вывод

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

Tmux терминальный менеджер

Tmux терминальный оконный менеджер при использовании дает возможность при обрыве связи с сервером по ssh не терять информацию о выполняемых действиях. Работает в любом дистрибутиве Linux. Одна из любимых утилит администраторов Linux.

Введение

Очень быстро при работе с серверами по ssh я стал ощущать два неудобства:

  • Из за обрыва связи я терял информацию о ходе выполняемых действий на сервере,
  • Для выполнения нескольких действий мне приходилось создавать несколько подключений по ssh.

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

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

Установка Tmux

Пакет присутствует во всех популярных системах и устанавливается с помощью команды:

CentOS 7
yum install tmux

Debian
apt install tmux

Calculate Linux
emerge -av tmux

При настройке под себя необходимо знать какая версия используется для указания правильных параметров в файле настройки.

Вывод информации об установленной версии:

tmux -V
= вывод команды =
tmux 1.8

Более подробно про программу можно почитать на  Wikipedia или на странице разработки.

Работа с Tmux

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

Оптимальный вариант для работы с Tmux это запускать его на удаленном сервере. Только так вы не будете получать проблем при обрыве связи или вашей миграции от компьютера к компьютеру.

Для более детального изучения можно ознакомится с документацией выполнив команду:

man tmux

Управление сессиями

Вывод информации обо всех возможных командах:

tmux list-commands

Рассмотрим основные команды используемые в работе с Tmux при действиях в консоли сервера.

Создание сессии:

= Создание сессии Tmux =
tmux

= Создание сессии с названием  sevo44 =
tmux new -s sevo44

= Информация о работающих сессиях Tmux =
tmux ls
= вывод команды =
0: 1 windows (created Mon Dec 10 10:48:09 2018) [150x33]
sevo44: 1 windows (created Mon Dec 10 10:48:23 2018) [150x33]

= Переименование сессии 0 в sevo44-2 =
tmux rename-session -t 0 sevo44-2

Подключение к сессии:

= Подключение к последней сессии =
tmux a

= Подключение к сессии использую имя или номер =
tmux attach -t sevo44

Удаление сессии:

= Удаление сессии по номеру или имени =
tmux kill-session -t sevo44

= Удаление все сессий =
tmux kill-server

Работа в сессии

При работе в сессии Tmux существует понятие «Префикс» это то что переводит его в командный режим.

По умолчанию префикс «CTRL + b».

Префикс всегда набираем перед введением любой команды ниже!

Основные команды:

Функция Команда
Вывести справку по всем командам ?
Выйти из сесиии d
Закрыть сессию x
Скролинг [ для выхода из режима q

Команды для работы с панелями:

Функция Команда
Разделить текущую панель на две, по вертикали Shift + %
Разделить текущую панель на две, по горизонтали Shift + » (на клавиатуре слева от Enter)
Переход между панелями →←↑↓
Изменить размеры панели Alt + →←↑↓
Закрыть панель x (или набрать exit)

Команды для работы с закладками (окнами):

Функция Команда
Создание закладки с
Переименование закладки ,
Вывод всех закладок для перехода w
Закладка вперед n
Закладка назад p
Удалить закладку x

Настройка Tmux под себя

Вся настройка сводится к тому что в своей домашней папке необходимо создать файл .tmux.conf в который добавить необходимые настройки.

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

Моя версия такая:

tmux -V
= вывод команды =
tmux 3.1c

Сменим префикс с «CTRL + b» на «CTRL + а» и добавим возможность прокручивать колесиком на мышке:

vim ~/.tmux.conf
= необходимые параметры =
set -g prefix C-a
unbind C-b
bind C-a send-prefix

set -g mouse on

Перезагрузите tmux.conf с помощью команды:

$ tmux source-file ~/.tmux.conf

Вывод

Мною указаны лишь основные моменты по работе с Tmux которых мне вполне достаточно. Функционал большом и при желании можно настроить многие параметры под свои требования. Некоторые моменты в работе могут показаться неудобными в сравнении с работой в простой консоли, но это мелочи. Иметь возможность работы с сервером не привязываясь с рабочему месту стоит того чтобы иметь маленькие неудобства.

SFTP настройка для веб хостинга

SFTP удобное и безопасное подключение к файлам ресурса используя ssh. Инструкцию можно использовать для любых систем Linux. Отличие только в командах на перезапуск сервисов Nginx, Php-fpm, SSH и путях к файлам настройки.

Введение

Ранее я использовал для работы с файлами сайтов программу ProFTP, но отказался в пользу SFTP из за более стабильной работы и простоты настройки. Настройка показана на примере CentOS 7.

С статье на сайте можете узнать про настройку доступа по FTP к сайтам на сервере VDS под управлением CentOS 7 используя программу ProFTPd. Создание файловой базы пользователей для авторизации с правами от Nginx. Подключение с использованием сертификата для TLS.

Добавление пользователя

Создадим пользователя которому дадим права на файлы ресурса. Удобно использовать имя пользователя пересекающееся с названием сайта.

В нашем случае мы настраиваем доступ к сайту sevo44.ru. Добавим пользователя с нужными параметрами и создадим ему пароль:

useradd -s /sbin/nologin sevo44.ru 
passwd sevo44.ru

Добавляем пользователя nginx в группу sevo44.ru.

usermod -aG sevo44.ru nginx

Настройка SSH для SFTP

Открываем конфигурационный файл ssh находящийся по пути /etc/ssh/sshd_config. Комментируем один параметр и добавим необходимый код:

vim /etc/ssh/sshd_config
= необходимые изменения и добавления =
# Закоментируем параметр
#Subsystem sftp /usr/lib64/misc/sftp-server

# Для работы sftp
Subsystem sftp internal-sftp
# Для sevo44.ru
Match User sevo44.ru
 X11Forwarding no
 AllowTcpForwarding no
 AllowAgentForwarding no
 PermitTunnel no
 ForceCommand internal-sftp
 ChrootDirectory /var/www/sevo44.ru
# /sevo44.ru

Перезапускаем службу sshd:

systemctl restart sshd

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

Настройка прав на данные

Назначаем владельцем содержимого сайта пользователя которого мы создали выше:

chown -R sevo44.ru:sevo44.ru /var/www/sevo44.ru/

Возвращаем обратно рута владельцем корня chroot:

chown root. /var/www/sevo44.ru/
chown root. /var/www/sevo44.ru/log/

Внимание! Сначала мы рекурсивно назначаем права на все содержимое директорий, а потом возвращаем владельца root на корень сайта.

Все папки в пути /var/www/sevo44.ru/ должны быть пользователя root!

Только в таком варианте все будет корректно работать!

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

Редактирование будет возможно только в папке WWW где находятся все файлы сайта!

Перед выполнением следующего этапа лучше проверить подключение. В случае проблем с подключением смотрим лог выведя последние 10 строчек:

tail -n 10 /var/log/secure

Настройка Logrotate для сайтов

Для просмотра логом сайтов используя подключение по sftp необходимо создать файл со следующим кодом (на основе скопированного файла nginx):

cp /etc/logrotate.d/nginx /etc/logrotate.d/site
vim /etc/logrotate.d/site
= необходимый код =
/var/www/sevo44.ru/log/*.log
{
        daily
        missingok
        rotate 15
        compress
        delaycompress
        notifempty
        #create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

Сохраним и применим изменения без перезагрузки:

logrotate /etc/logrotate.conf

Настройка PHP-FPM

Создадим отдельный pool для php-fpm, который будет обслуживать сайт sevo44.ru. Использование отдельного пула для сайта так же может быть обусловлено специфическими настройками для ресурса. Удобно когда для каждого сайта используется независимый пул в котором можно выставить необходимые значения. Переходим в нужную папку, копируем существующий конфигурационный файл и делаем необходимые изменения:

cd /etc/php-fpm.d/
cp www.conf sevo44.ru.conf
vim /etc/php-fpm.d/sevo44.ru.conf
= необходимые параметры =
[sevo44.ru]
 user = sevo44.ru
 group = sevo44.ru
 listen = /run/php-fpm/php-fpm-sevo44.sock
 listen.owner = sevo44.ru
 listen.group = sevo44.ru
 pm = dynamic
 pm.max_children = 20
 pm.start_servers = 2
 pm.min_spare_servers = 1
 pm.max_spare_servers = 3

Осталось указать нужный параметр в настройки хоста для nginx.

Откроем необходимый файл и внесём необходимую настройку:

vim /etc/nginx/conf.d/sevo44.ru.conf
= необходимый параметр =
fastcgi_pass unix:/run/php-fpm/php-fpm-sevo44.sock;

Проверим правильность настройки Nginx и перезагрузим необходимые сервисы:

nginx -t
systemctl reload nginx
systemctl restart php-fpm

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

Заключение

В результате настроек мы получаем защищённый и удобный доступ для работы с файлами ресурса. Для работы я использую программу FileZilla. Кроме того, из статьи RSA или авторизация SSH по ключу вы можете узнать как используя программу FileZilla можно подключатся по файлу с ключом расширения ppk.