Архив метки: debian

Lnav просмотр логов в Linux

Lnav представляет собой расширенный просмотрщик файлов журналов (log) для терминала Linux. Открывает архивные логи, отображает содержимое в режиме реального времени, возможно открыть сразу несколько логов и увидеть их наложение на одном экране.

Введение

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

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

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

Установка Lnav

Утилита присутствует во всех популярных операционных системах Linux.

Более подробно о программе и работе с ней можно посмотреть на официальном сайте Lnav.

Установка из репозитория:

= Семейство Debian =
apt install lnav

= Семейство RedHat =
dnf install lnav

Работа с Lnav

В сети существует Документация по Lnav на русском языке в котором все хорошо рассказано.

Lnav понимает наиболее популярные форматов логов, таких как access логи веб сервера, syslog, dpkg, strace и другие. Программа автоматически подсвечивает, позволяет быстро делать какие-то выборки. Например, посмотреть все ошибки в нужном логе, показать по ним статистику, вывести информацию по какой-то службе и т.д. и т. п.

В Lnav есть возможность открыть сразу несколько логов и увидеть их наложение на одном экране. Это удобно, когда надо что-то расследовать.

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

# В случае если находимся в нужной папке
/var/www/sevo44.ru/log # lnav sevo44.ru-access.log sevo44.ru-error.log

# С указанием полного пути
lnav /var/www/sevo44.ru/log/sevo44.ru-access.log /var/www/sevo44.ru/log/sevo44.ru-error.log

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

Заключение

Конечно для более профессионального подхода в изучении логов лучше использовать такое решение как Elastic Stack, но пока его нет или не подключили новый ресурс использование утилиты Lnav лучшее решение.

Кроме того не надо путать мониторинг логов и мониторинг параметров системы это совсем разные вещи. Например я лично для мониторинга разных параметров системы активно и давно использую систему Zabbix.

Шифрование данных в 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

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

Заключение

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

ZFS мониторинг в Zabbix

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

Введение

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

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

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

ZFS мониторинг общий принцип

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

  • Создаем скрипт bach который будет записывать нужное значение в текстовый файл;
  • Добавляем в cron задание которое будет с нужной нам периодичностью записывать показания в текстовый файл;
  • Добавляем необходимые параметры в агент Zabbix и проверяем правильность работы;
  • На сервере Zabbix для нужного узла добавляем все необходимые данные для контроля над параметром и настраиваем оповещение в случае плохих параметров.

Действия на Zabbix агенте

Команда для вывода нужных параметров ZFS

Выведем состояние zfs:

zpool status
= вывод команды =
pool: rpool
state: ONLINE
scan: none requested
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-ST3120811AS_5PT00YS1-part3 ONLINE 0 0 0
ata-ST3120811AS_5PT00DRP-part3 ONLINE 0 0 0

errors: No known data errors

Из вывода видно что имеются 2 диска сделанные в зеркале.

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

/sbin/zpool status | grep DEGRADED | wc -l
= вывод команды =
0

При отсутствии значения DEGRADED выводится сообщение 0. При наличии значения выведется число соответствующее количеству встречающихся значений.

Отключим диск и подождав немного запросим статус ZFS:

zpool status
= вывод команды =
pool: rpool
state: DEGRADED
status: One or more devices has been removed by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scan: none requested
config:

NAME STATE READ WRITE CKSUM
rpool DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
ata-ST3120811AS_5PT00YS1-part3 REMOVED 0 0 0
ata-ST3120811AS_5PT00DRP-part3 ONLINE 0 0 0

errors: No known data errors

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

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

/sbin/zpool status | grep DEGRADED | wc -l
= вывод команды =
3

Всё правильно.

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

mkdir /etc/zabbix/scripts

vim /etc/zabbix/scripts/zfs_degraded-bin.sh
= необходимый код =
#!/bin/bash
/sbin/zpool status | grep DEGRADED | wc -l > /etc/zabbix/scripts/zfs_degraded.txt

Сделаем скрипт исполнительным:

chmod +x /etc/zabbix/scripts/zfs_degraded-bin.sh

Произведем проверки. Запустим скрит, проверим создание текстового файла и информацию в нём. Выполнив по очереди 3 команды:

sh /etc/zabbix/scripts/zfs_degraded-bin.sh
= вывод пустой =

ls /etc/zabbix/scripts
= вывод команды =
zfs_degraded-bin.sh zfs_degraded.txt

cat /etc/zabbix/scripts/zfs_degraded.txt
= вывод команды =
3

Все работает как надо. Добавим задание в крон:

vim /etc/crontab
= необходимый код =
*/3 * * * * root /etc/zabbix/scripts/zfs_degraded-bin.sh >/dev/null 2>&1

Каждые 3 минуты в текстом фале будет обновляться информация.

Добавление параметров для Zabbix агента

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

vim /etc/zabbix/zabbix_agentd.conf
= необходимый параметр =
UnsafeUserParameters=1

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

UserParameter=pve-1.zfs,cat /etc/zabbix/scripts/zfs_degraded.txt

Параметры имеют следующие значения:

  • UserParameter — параметр согласно которого агент понимает что с ним надо работать;
  • pve-1.zfs — название параметра который мы будем использовать при добавлении элемента данных;
  • cat /etc/zabbix/scripts/zfs_degraded.txt — команда и путь по которому брать данные.

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

systemctl restart zabbix-agent

zabbix_get -s 127.0.0.1 -k pve-1.zfs
= вывод команды =
3

В случае получения ошибок

zpool clear rpool-bash: zabbix_get: command not found 
или
zabbix_get [20065]: Check access restrictions in Zabbix agent configuration

перейдите по ссылке и узнаете почему не работает zabbix_get.

Действия на сервере Zabbix

Добавление элемента данных

Открываем необходимый узел и перейдя в «Элементы данных» добавляем новый нажав «Создать элемент данных«.

Необходимо заполнить следующие поля:

  • Имя — pve-1 degraded zfs;
  • Ключ — pve-1.zfs;
  • Тип информации — Числовой (целое положительное);
  • Интервал обновления — 5m;
  • Период хранения истории — 1w;
  • Группы элементов данных — Filesystem.

Добаление тригера

Открываем необходимый узел и перейдя в «Триггеры» добавляем новый нажав «Создать триггер«.

Необходимо заполнить следующие поля:

  • Имя триггера — pve-1 degraded zfs;
  • Выражение — {pve-1:pve-1.zfs.last()}>0.

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

Cброс счетчиков ошибок ZFS

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

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

 zpool clear rpool

Заключение

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

FSYNCS мониторинг параметра в Proxmox

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

Введение

В системе Proxmox есть замечательный механизм проверки работы дисковой системы. Выполнив в консоли команду pveperf мы увидим полезную информацию о скорости работы жестких дисков. Основной параметр который показывает скорость работы с дисками это FSYNCS/SECOND.

Выведя man сервиса мы увидим всю информацию о требовании к нашему параметру.

man pveperf
= часть вывода команды =
FSYNCS/SECOND value should be greater than 200 (you should enable write back cache mode on you RAID controller - needs a battery backed cache (BBWC)).

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

Общий принцип мониторинга FSYNCS для Proxmox

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

  • Создаем скрипт bach который будет записывать нужное значение в текстовый файл;
  • Добавляем в cron задание которое будет с нужной нам периодичностью записывать показания в текстовый файл;
  • Добавляем необходимые параметры в агент Zabbix и проверяем правильность работы;
  • На сервере Zabbix для нужного узла добавляем все необходимые данные для контроля над параметром и настраиваем оповещение в случае плохих параметров.

Действия на Zabbix агенте

Команда для вывода нужных параметров FSYNCS

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

df -h
= часть вывода для ZFS =
rpool/ROOT/pve-1   99G    1001M    98G   1%   /

= часть вывода для mdadm =
/dev/md2           3,5T    1,2T    2,2T  35% /mnt/md2-raid10

Выводим информацию для нужного раздела.

Обязательно указываем в параметре куда смонтировано иначе не увидим параметр FSYNCS/SECOND.

pveperf /
= вывод команды =
CPU BOGOMIPS: 10044.86
REGEX/SECOND: 1168356
HD SIZE: 98.08 GB (rpool/ROOT/pve-1)
FSYNCS/SECOND: 85.84
DNS EXT: 67.40 ms
DNS INT: 1.44 ms (sevo44.loc)

pveperf /mnt/md2-raid10
= вывод команды =
CPU BOGOMIPS:      37241.08
REGEX/SECOND:      595252
HD SIZE:           3570.96 GB (/dev/md2)
BUFFERED READS:    165.42 MB/sec
AVERAGE SEEK TIME: 18.32 ms
FSYNCS/SECOND:     510.48
DNS EXT:           65.53 ms
DNS INT:           0.82 ms (sevo44.loc)

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

pveperf / | grep 'FSYNCS/SECOND' | cut -c20-24
= вывод команды =
81.52

Параметры имеют следующие значения:

  • pveperf / -сама команда с указанием куда смантирован раздел;
  • grep ‘FSYNCS/SECOND’ — выбираем только значения из строки с этими данныи;
  • cut -c20-24 — выводи знаки с 20 по 24 от начала строки.

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

mkdir /etc/zabbix/scripts

vim /etc/zabbix/scripts/fsyncs-bin.sh
= необходимые данные =
#!/bin/bash
pveperf / | grep 'FSYNCS/SECOND' | cut -c20-24 > /etc/zabbix/scripts/fsyncs.txt

По действию скрипта данные будут перезаписываться при каждом выполнении скрипта в файле /etc/zabbix/scripts/fsyncs.txt. Файл создавать не надо, так как при выполнении скрипта он создастся сам.

Сделаем файл запускаемым.

chmod +x /etc/zabbix/scripts/fsyncs-bin.sh

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

sh /etc/zabbix/scripts/fsyncs-bin.sh
= вывод пустой =

ls /etc/zabbix/scripts
= вывод команды =
fsyncs-bin.sh  fsyncs.txt

cat /etc/zabbix/scripts/fsyncs.txt
= вывод команды =
117.9

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

Добавляем скрипт в cron для выполнения по расписанию.

vim /etc/crontab
= необходимый код =
*/3 * * * * root /etc/zabbix/scripts/fsyncs-bin.sh >/dev/null 2>&1

Например, я запускаю скрипт каждые 3 минуты.

Добавление параметров для Zabbix агента

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

vim /etc/zabbix/zabbix_agentd.conf
= необходимый параметр =
UnsafeUserParameters=1

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

UserParameter=pve-1.fsyncs,cat /etc/zabbix/scripts/fsyncs.txt

Параметры имеют следующие значения:

  • UserParameter — параметр согласно которого агент понимает что с ним надо работать;
  • pve-1.fsyncs — название параметра который мы будем использовать при добавлении элемента данных;
  • cat /etc/zabbix/scripts/fsyncs.txt — команда и путь по которому брать данные.

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

vim /etc/zabbix/zabbix_agentd.conf 
= необходимый параметр = 
Timeout=15

Перезагружаем агент и проверим как он получает данные.

systemctl restart zabbix-agent

zabbix_get -s 127.0.0.1 -k pve-1.fsyncs
= вывод команды =
123.56

В случае получения ошибок

-bash: zabbix_get: command not found 
или
zabbix_get [20065]: Check access restrictions in Zabbix agent configuration

перейдите по ссылке и узнаете почему не работает zabbix_get.

Действия на сервере Zabbix

Добавление элемента данных

Открываем необходимый узел и перейдя в «Элементы данных» добавляем новый нажав «Создать элемент данных«.

Необходимо заполнить следующие поля:

  • Имя — pve-1 fsyncs zfs;
  • Ключ — pve-1.fsyncs;
  • Тип информации — Числовой (с плавающей точкой);
  • Интервал обновления — 5m;
  • Период хранения истории — 1w;
  • Группы элементов данных — Filesystem.

Добавление тригера

Открываем необходимый узел и перейдя в «Тригеры» добавляем новый нажав «Создать тригер«.

Необходимо заполнить следующие поля:

  • Имя тригера — pve-1 fsyncs zfs;
  • Выражение — {pve-1:pve-1.fsyncs.last()}<200.

Добавление графика

Открываем необходимый узел и перейдя в «Графики» добавляем новый нажав «Создать график«.

Например, мне нравится выводить все параметры  fsyncs для всех серверов в один график.

Заключение

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

Вот примерно такие графики вы можете наблюдать в период настройки.

Полезные ссылки:

Мониторинг температуры в Zabbix

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

Введение

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

Описание подойдёт для разных систем Linux. Более детально про установку и настройку Zabbix агентов для разных систем можно узнать в статье Zabbix agent установка и настройка.

Общий принцип мониторинга температуры

Для любой операционной системы необходимо выполнить 4 условия:

  1. Возможными способами извлечь данные с датчиков температуры нужного устройства;
  2. Обработать данные получив нужное значение;
  3. Передать полученное значение на сервер Zabbix;
  4. На сервере Zabbix добавить элемент данных, тригер и график.

Мониторинг температуры в системах Linux

Для примера я буду использовать систему Debian 10 Buster.

Мониторинг температуры CPU и Memory

Для получения данных о температуре будем применять утилиту  lm-sensors. Утилита очень популярна и присутствует во всех дистрибутивах Linux.

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

apt install lm-sensors

= Для CentOS 7 =
yum install lm_sensors

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

sensors-detect
= необходимые действия =
На все вопросы отвечаем Y

В конце спросит:
Do you want to add these lines automatically to /etc/modules? (yes/NO)
Отвечаем YES.

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

sensors
= вывод команды =
coretemp-isa-0001
Adapter: ISA adapter
Core 0: +81.0°C (high = +86.0°C, crit = +100.0°C)
Core 1: +77.0°C (high = +86.0°C, crit = +100.0°C)
Core 2: +73.0°C (high = +86.0°C, crit = +100.0°C)
Core 3: +73.0°C (high = +86.0°C, crit = +100.0°C)
i5k_amb-isa-0000
Adapter: ISA adapter
Ch. 0 DIMM 0: +75.5°C (low = +110.5°C, high = +124.0°C)
Ch. 0 DIMM 1: +71.0°C (low = +110.5°C, high = +124.0°C)
Ch. 0 DIMM 2: +63.5°C (low = +104.5°C, high = +124.0°C)
Ch. 0 DIMM 3: +64.5°C (low = +110.5°C, high = +124.0°C)
Ch. 1 DIMM 0: +74.5°C (low = +110.5°C, high = +124.0°C)
Ch. 1 DIMM 1: +77.0°C (low = +110.5°C, high = +124.0°C)
Ch. 1 DIMM 2: +69.0°C (low = +104.5°C, high = +124.0°C)
Ch. 1 DIMM 3: +60.0°C (low = +109.0°C, high = +124.0°C)
coretemp-isa-0000
Adapter: ISA adapter
Core 0: +83.0°C (high = +86.0°C, crit = +100.0°C)
Core 1: +79.0°C (high = +86.0°C, crit = +100.0°C)
Core 2: +77.0°C (high = +86.0°C, crit = +100.0°C)
Core 3: +77.0°C (high = +86.0°C, crit = +100.0°C)

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

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

  • coretemp-isa-0001 — второй 4 ядерный процессор;
  • i5k_amb-isa-0000 — 8 модулей памяти;
  • coretemp-isa-0000 — первый 4 ядерный процессор.

Можно вывести показания одной группы датчиков.

sensors coretemp-isa-00000
= вывод команды =
coretemp-isa-0000
Adapter: ISA adapter
Core 0: +82.0°C (high = +86.0°C, crit = +100.0°C)
Core 1: +79.0°C (high = +86.0°C, crit = +100.0°C)
Core 2: +75.0°C (high = +86.0°C, crit = +100.0°C)
Core 3: +77.0°C (high = +86.0°C, crit = +100.0°C)

Команды для вывода нужных параметров

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

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

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

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

Вывод минимального значения температуры
sensors | grep Core | awk -F'[:+°]' '{if(min==""){min=$3}; if($3<min) {min=$3};} END {print min}'

Вывод максимального значения температуры
sensors | grep Core | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'

Вывод среднего значения температуры
sensors | grep Core | awk -F'[:+°]' '{avg+=$3}END{print avg/NR}'

Коды подсмотрел тут.

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

sensors coretemp-isa-00000 | grep 'Core 0' | cut -c16-17
=вывод команды =
65.45

Где параметры имеют следующее значение:

  • sensors — сама программа;
  • coretemp-isa-00000 — группа датчиков с которой выводить значение;
  • grep ‘Core 0’ — название параметра;
  • cut -c16-17 — выводит 16 и 17 знак с начала строки.

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

Вывод максимальной температуры для процессора имеющего группу датчиков coretemp-isa-0000
sensors coretemp-isa-0000 | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'

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

Вывод максимальной температуры из всех значений Ch. в строках 
sensors | grep Ch. | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'

Вывод максимальной температуры из группу датчиков coretemp-isa-0000 
sensors i5k_amb-isa-0000 | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'

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

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

Добавление параметров для Zabbix агента

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

vim /etc/zabbix/zabbix_agentd.conf
= необходимый параметр =
UnsafeUserParameters=1

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

UserParameter=pve-t.core0,sensors coretemp-isa-00000 | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'
UserParameter=pve-t.core1,sensors coretemp-isa-00001 | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'
UserParameter=pve-t.memory,sensors i5k_amb-isa-0000 | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'

Расшифрую первую строчку кода которая содержит следующие значения:

  • UserParameter — параметр согласно которого агент понимает что с ним надо работать;
  • pve-t.core0 — название параметра который мы будем использовать при добавлении элемента данных;
  • sensors coretemp-isa-00000 | awk -F'[:+°]’ ‘{if(max==»»){max=$3}; if(max<$3) {max=$3};} END {print max}’ — команда которой получается требуемое значение.

После внесения изменений в файл настройки Zabbix агента его обязательно нужно перезапустить.

Для систем использующих Systemd команда перезапуска агента будет одинаковой. Например, для систем CentOS7, Debian 10 команда следующая:

systemctl restart zabbix-agent

Проверка получения значения Zabbix агентом

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

Выведем значение первого параметра который был в добавляемом коде:

zabbix_get -s 127.0.0.1 -k pve-t.core0
= вывод команды =
65.25

Параметр работает и получает правильное значение.

В случае получения ошибок

-bash: zabbix_get: command not found 
или
zabbix_get [20065]: Check access restrictions in Zabbix agent configuration

перейдите по ссылке и узнаете почему не работает zabbix_get.

Переходим к настройкам на стороне Zabbix сервера.

Мониторинг температуры HDD и SSD

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

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

Установим утилиту выполнив команду:

apt install hddtemp

Команды для вывода нужных параметров

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

lsblk
= вывод команды =
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931,5G 0 disk 
├─sda1 8:1 0 100M 0 part 
├─sda2 8:2 0 292,9G 0 part  
└─sda3 8:8 0 443G 0 part /mnt/sda8
sdb 8:16 0 119,2G 0 disk 
├─sdb1 8:17 0 7,5G 0 part [SWAP]
├─sdb2 8:18 0 954M 0 part /boot
└─sdb3 8:19 0 110,9G 0 part /

Из вывода видно что в системе есть два диска sda и sdb.

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

hddtemp /dev/sda
= вывод команды =
/dev/sda: ST3120811AS: 46°C

Команда для получения значений температуры будет такой:

hddtemp /dev/sda | cut -c24-25
= вывод команды =
46

Где параметры в коде имеют следующее значение:

  • hddtemp /dev/sda — утилита и диск с которого нужно получить значение;
  • cut -c24-25 — вывод 24 и 25 знака с начала строки.

Добавление параметров для Zabbix агента

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

vim /etc/zabbix/zabbix_agentd.conf
= необходимый параметр =
UnsafeUserParameters=1

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

UserParameter=pve-t.sda,hddtemp /dev/sda | cut -c24-25
UserParameter=pve-t.sdb,hddtemp /dev/sdb | cut -c24-25

Расшифрую первую строчку кода которая содержит следующие значения:

  • UserParameter — параметр согласно которого агент понимает что с ним надо работать;
  • pve-t.sda — название параметра который мы будем использовать при добавлении элемента данных;
  • hddtemp /dev/sda | cut -c24-25 — команда которой получается требуемое значение.

После внесения изменений в файл настройки Zabbix агента его обязательно нужно перезапустить.

Для систем использующих Systemd команда перезапуска агента будет одинаковой. Например, для Debian 10 и CentOS 7 команда будет следующая:

systemctl restart zabbix-agent

Проверка получения значения Zabbix агентом

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

Перейдите по ссылке сможете узнаете почему Не работает zabbix_get.

Пробуем получить данные температуры диска sda:

zabbix_get -s 127.0.0.1 -k pve-t.sda
= вывод команды =
/dev/sda: open: Permission denied

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

Выведем информацию о правах на утилиту:

ls -l /usr/sbin/hddtemp
= вывод команды =
-rwxr-xr-x 1 root root 40328 Jan 21 2018 /usr/sbin/hddtem

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

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

chmod +s /usr/sbin/hddtemp

Проверим результат:

ls -l /usr/sbin/hddtemp
= вывод команды =
-rwsr-sr-x 1 root root 40328 Jan 21 2018 /usr/sbin/hddtemp

zabbix_get -s 127.0.0.1 -k pve-t.sda
= вывод команды =
45

Как видим данные успешно получены и значит переходим к настройкам на стороне Zabbix сервера.

Мониторинг температуры в системах Windows

Настроить мониторинг на системе Windows температурных параметров оказалось не просто. В большинстве случаев статьи в интернете описывают различные варианты использования программы Open Hardware Monitor а именно её консольной версии. На сайте разработчика я не нашел консольного варианта а скачивать с других сайтов считаю не целесообразно по разным причинам.

Программа позволяет создавать логи в формате csv и имеет веб лицо с выводом всех параметров. Возможно, как то использовать эти возможности, но ответа на этот вопрос я пока не нашел.

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

Действия на сервере Zabbix

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

Добавление элемента данных

Открываем необходимый узел и перейдя в «Элементы данных» добавляем новый нажав «Создать элемент данных«.

Необходимо заполнить следующие поля:

  • Имя — core0 Temperature;
  • Ключ — pve-t.core0;
  • Тип информации — Числовой (с плавающей точкой);
  • Интервал обновления — 1m;
  • Период хранения истории — 1w;
  • Группы элементов данных — CPU.

Добавление тригера

Открываем необходимый узел и перейдя в «Тригеры» добавляем новый нажав «Создать тригер«.

Необходимо заполнить следующие поля:

  • Имя тригера — pve-t core0 Temperature;
  • Выражение — {pve-t:pve-t.core0.last()}>80.

Выражение формируется на вкладке открывающейся по кнопке «Добавить» рядом с полем «Выражение«.

Добавление графика

Открываем необходимый узел и перейдя в «Графики» добавляем новый нажав «Создать график«.

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

По нажатию кнопки «Добавить» в параметре «Элемент данных» выбираем все необходимые элементы данных для отображения на графике.

В результате мой график имеет следующий вид:

На графике видно как менялись показания когда я подбирал оптимальное положение и тип вентиляторов.

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

Заключение

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

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

Zabbix agent установка и настройка

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

Введение

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

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

Действия на сервере Zabbix

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

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

Добавление узла сети в Zabbix

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

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

Настройка — Узлы сети — Создать узел сети

В поле «Имя узла сети» ставится значение которое указывается в настройках агента в поле «Hostname».

Для обычного агента:

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

Все последующие картинки и описания будут делаться с учетом использования обычного агента Zabbix!

Добавляем необходимый шаблон соответствующий операционной системе, устройству или службы .

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

Проверка получения данных с агента

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

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

Установка Zabbix Agent на Linux

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

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

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

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

Особое вниманию заостряю на порты работы агента Zabbix. На агенте должен быть открыт порт 10050 так как именно по нему Zabbix сервер будет пытаться получить данные с агента. В случае использования активного агента (агент сам отправляет данные на сервер Zabbix) должно быть разрешено исходящее подключения по порту 10051.

На сервере Zabbix должен быть открыть порт 10051.

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

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

Zabbix agent для CentOS 7

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

Подключаем репозиторий версии Zabbix 4.2 выполнив необходимую команду:

rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
= вывод команды =
Загружается https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
предупреждение: /var/tmp/rpm-tmp.W8KoVE: Заголовок V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Подготовка...                 ############################## [100%]
Обновление / установка...
1:zabbix-release-4.2-1.el7    ############################## [100%]

Очистим и пересоздадим кэш yum:

yum clean all
yum makecache

Произведем установку введя в консоли следующую команду:

yum install zabbix-agent

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

firewall-cmd --permanent --zone=public --add-service=zabbix-agent

= применить изменения =
firewall-cmd --reload

Более подробно как работать с FirewallD рассказано в статье FirewallD базовая настройка.

В файле конфигурации агента /etc/zabbix/zabbix_agentd.conf необходимо указать  параметры для подключения к серверу Zabbix:

vim /etc/zabbix/zabbix_agentd.conf
= необходимые параметры c пояснениями =
Server=192.168.0.109 # IP адрес сервера Zabbix
ServerActive=192.168.0.109 # IP сервера Zabbix на который активный агент будет отправлять данные
Hostname=test # имя узла мониторинга, которое указано на сервере zabbix

При использовании Zabbix proxy необходимо указывать его IP адрес.

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

systemctl start zabbix-agent
systemctl enable zabbix-agent

Проверяем лог файл агента для CentOS 7 следующей командой:

cat /var/log/zabbix/zabbix_agentd.log
= вывод команды =
 14646:20190704:220547.611 Starting Zabbix Agent [Zabbix server]. Zabbix 4.2.4 (revision 059af02c82).
 14646:20190704:220547.613 **** Enabled features ****
 14646:20190704:220547.613 IPv6 support:          YES
 14646:20190704:220547.613 TLS support:           YES
 14646:20190704:220547.613 **************************
 14646:20190704:220547.614 using configuration file: /etc/zabbix/zabbix_agentd.conf
 14646:20190704:220547.616 agent #0 started [main process]
 14647:20190704:220547.624 agent #1 started [collector]
 14648:20190704:220547.632 agent #2 started [listener #1]
 14650:20190704:220547.639 agent #4 started [listener #3]
 14649:20190704:220547.643 agent #3 started [listener #2]
 14651:20190704:220547.653 agent #5 started [active checks #1]

Согласно выводу всё в порядке.

Zabbix agent для Debian

На сайте разработчика Zabbix на странице Скачать и установить Zabbix выбираем необходимый дистрибутив и версию.

В примере описан вариант установки и настройки Zabbix agent для операционной системы Debian 10 Buster.

Подключаем репозиторий версии Zabbix 4.2 выполнив необходимые команды:

wget https://repo.zabbix.com/zabbix/4.2/debian/pool/main/z/zabbix-release/zabbix-release_4.2-1+buster_all.deb
dpkg -i zabbix-release_4.2-1+buster_all.deb

Обновляем список пакетов:

apt update

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

apt install zabbix-agent

В случае использования системы firewall открываем 10050 порт. 10051 порт должен быть открыт на исходящие соединения.

В файле конфигурации агента /etc/zabbix/zabbix_agentd.conf необходимо указать  параметры для подключения к серверу Zabbix:

vim /etc/zabbix/zabbix_agentd.conf
= необходимые параметры c пояснениями =
Server=192.168.0.109 # IP адрес сервера Zabbix
ServerActive=192.168.0.109 # IP сервера Zabbix на который активный агент будет отправлять данные
Hostname=test # имя узла мониторинга, которое указано на сервере zabbix

При использовании Zabbix proxy необходимо указывать его IP адрес.

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

systemctl enable zabbix-agent
systemctl restart zabbix-agent

Проверяем лог файл агента следующей командой:

cat /var/log/zabbix/zabbix_agentd.log
= вывод команды =
 14646:20190704:220547.611 Starting Zabbix Agent [Zabbix server]. Zabbix 4.2.4 (revision 059af02c82).
 14646:20190704:220547.613 **** Enabled features ****
 14646:20190704:220547.613 IPv6 support:          YES
 14646:20190704:220547.613 TLS support:           YES
 14646:20190704:220547.613 **************************
 14646:20190704:220547.614 using configuration file: /etc/zabbix/zabbix_agentd.conf
 14646:20190704:220547.616 agent #0 started [main process]
 14647:20190704:220547.624 agent #1 started [collector]
 14648:20190704:220547.632 agent #2 started [listener #1]
 14650:20190704:220547.639 agent #4 started [listener #3]
 14649:20190704:220547.643 agent #3 started [listener #2]
 14651:20190704:220547.653 agent #5 started [active checks #1]

Согласно выводу всё в порядке.

Установка Zabbix agent на XigmaNAS

Открываем доступ пользователю Root по SSH в веб панели управления и заходим стандартными командами для подключения по ssh.

ssh root@192.168.0.108
root@192.168.0.108's password: вводим пароль
Last login: Fri Jul 12 22:09:31 2019
Welcome to XigmaNAS!
nas: ~#

Еmbedded версия XigmaNAS

При использовании версии Еmbedded, вы должны понимать, что все изменения, которые вы производите в системе пропадут при перезапуске системы!

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

pkg update

Выводим список всех возможных пакетов Zabbix:

pkg search zabbix

На момент написания статьи актуальная версия была 4.2.4:

pkg install zabbix42-agent-4.2.4

Активируем сервис как службу:

sysrc zabbix_agentd_enable=YES

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

cp /usr/local/etc/zabbix42/zabbix_agentd.conf.sample /usr/local/etc/zabbix42/zabbix_agentd.conf
ee /usr/local/etc/zabbix42/zabbix_agentd.conf
= необходимые параметры c пояснениями = 
Server=192.168.0.109 # IP адрес сервера Zabbix
ServerActive=192.168.0.109 # IP сервера Zabbix на который активный агент будет отправлять данные 
Hostname=test # имя узла мониторинга, которое указано на сервере zabbix

Сохраняем файл и запускаем агент Zabbix:

service zabbix_agentd start

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

tail -f /tmp/zabbix_agentd.log
= вывод команды =
2466:20190717:212904.511 IPv6 support: YES 
2466:20190717:212904.511 TLS support: YES 
2466:20190717:212904.511 **************************
2466:20190717:212904.511 using configuration file: /usr/local/etc/zabbix42/zabbix_agentd.conf 
2466:20190717:212904.513 agent #0 started [main process]
2467:20190717:212904.517 agent #1 started [collector]
2469:20190717:212904.542 agent #3 started [listener #2]
2468:20190717:212904.557 agent #2 started [listener #1]
2470:20190717:212904.565 agent #4 started [listener #3]
2471:20190717:212904.572 agent #5 started [active checks #1]

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

service zabbix_agentd status
= вывод команды =
zabbix_agentd is running as pid 1812.

Full версия XigmaNAS

Вначале выполняем действия как для Еmbedded версии.

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

service zabbix_agentd start
= вывод команды =
zabbix_agentd [30451]: user zabbix does not exist
zabbix_agentd [30451]: cannot run as root!

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

Добавте пользователя и группу Zаbbix через веб панель управления XigmaNAS. При добавлении пользователя обязательно сделайте ему домашней папку /var/run/zabbix.

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

chown -R zabbix:zabbix /var/run/zabbix
chown zabbix:zabbix /tmp/zabbix_agentd.log

После этого служба будет нормально стартовать после перезагрузки.

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

service zabbix_agentd start
= ошибка при отсутствии прав на лог файл =
zabbix_agentd [2455]: cannot open "/tmp/zabbix_agentd.log": [13] Permission denied

Установка Zabbix agent на Windows

Переходим на страницу загрузок Zabbix agent и скачиваем самую последнюю версию агента для Windows нужной разрядности.

Распаковываем архив. Создаем на диске С: папку zabbix и купируем туда следующие файлы:

  • zabbix_agentd.exe
  • zabbix_get.exe
  • zabbix_sender.exe
  • zabbix_agentd.conf

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

= код для копирования =
c:/zabbix/zabbix_agentd.exe --config c:/zabbix/zabbix_agentd.conf --install

Открываем файл zabbix_agentd.win.conf любым текстовым редактором (можно WordPAD) и изменяем следующие параметры:

с:/zabbix/zabbix_agenttd.conf
= необходимые параметры c пояснениями = 
LogFile=c:\zabbix\zabbix_agentd.log 
LogFileSize=1
Server=192.168.0.109 # IP адрес сервера Zabbix
ServerActive=192.168.0.109 # IP сервера Zabbix на который активный агент будет отправлять данные 
Hostname=test # имя узла мониторинга, которое указано на сервере zabbix

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

Дополнительные параметры — Правило для входящих подключений — Создать правило.

  • Тип правила: Для порта;
  • Протоколы и порты: Протокол TCP; Определенные локальные порты: 10050;
  • Действие: Разрешить подключение;
  • Профиль (ставим галочки): Доменный, Частный, Публичный;
  • Имя: Zabbix Agent 10050.

В случае использования активного агента идем по пути (даже если не используется лучше открыть):

Дополнительные параметры — Правило для исходящих подключений — Создать правило.

  • Тип правила: Для порта;
  • Протоколы и порты: Протокол TCP; Определенные локальные порты: 10051;
  • Действие: Разрешить подключение;
  • Профиль (ставим галочки): Доменный, Частный, Публичный;
  • Имя: Zabbix Agent 10051.

Ищем службу с именем Zabbix agent в оснастке со службами запускаем ее.

Если все прошло успешно то в логе c:\zabbix\zabbix_agentd.log вы увидите примерно такую информацию:

3728:20190724:153807.390 Starting Zabbix Agent [test]. Zabbix 4.2.4 (revision 059af02).
3728:20190724:153807.394 **** Enabled features ****
3728:20190724:153807.397 IPv6 support: YES
3728:20190724:153807.400 TLS support: NO
3728:20190724:153807.402 **************************
3728:20190724:153807.406 using configuration file: c:\zabbix\zabbix_agentd.conf
3728:20190724:153807.410 agent #0 started [main process]
3448:20190724:153807.412 agent #1 started [collector]
5744:20190724:153807.441 agent #2 started [listener #1]
6856:20190724:153807.628 agent #3 started [listener #2]
6868:20190724:153807.766 agent #4 started [listener #3]
3532:20190724:153807.880 agent #5 started [active checks #1]

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

Возможные ошибки в работе

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

Периодические ошибки по сбору параметров

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

Timeout — параметр который отвечает за ожидание как на получение так и на отправку данных. По умолчанию выставлено значение в 3 секунды.

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

Timeout=10

Не работает zabbix_get

zabbix_get -s 127.0.0.1 -k pve-t.core1
= вывод команды =
-bash: zabbix_get: command not found

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

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

Debian 8-10
apt install zabbix-get

CentOS 7
yum install zabbix-get

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

zabbix_get -s 127.0.0.1 -k pve-t.core1
= вывод команды =
zabbix_get [20065]: Check access restrictions in Zabbix agent configuration

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

Теперь выполнив нужную команду вы увидите правильный ответ.

zabbix_get -s 127.0.0.1 -k pve-t.core1
= вывод команды =
65

Заключение

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