Browsing posts in: Linux

Апгрейд Proxmox на Hetzner

На днях на один из поддерживаемых мной гипервизоров на Proxmox устанавливались обновления, и из-за проблемного драйвера r8169 перестала работать сеть, в логах было что-то типа:

device eth0 entered promiscuous mode

Как выяснилось, это проблемы именно пресловутого реалетковского драйвера, и было решено собирать драйвер r8168, а заодно и переустановить Proxmox, так как апгрейд через пару релизов обещал ещё больший геморрой с разбором получившихся косяков. Поставить стоковый образ через LARA на ZFS было плохой идеей, так как хетцнеровский образ Linux восстановления не умеет в ZFS, а опять общаться с FreeBSD мне было влом. Все команды от рута, проставлять решётки в начале строк мне тоже влом :)

Бэкап

Что нужно забэкапить (используются только KVM-контейнеры):

VPS Part

Конфиг: /var/lib/pve-cluster/config.db

Данные /var/lib/vz/images/*

Linux Part
Конфиг:  /etc/network/interfaces

Скрипты: /root/*.sh

Переустановка ОС

Список дисков

Disk /dev/sda: 3000 GB (=> 2794 GiB)
Disk /dev/sdb: 3000 GB (=> 2794 GiB)
Disk /dev/sdc: 2000 GB (=> 1863 GiB)

Из первых двух собирается RAID1, третий монтируется в /mnt/backup

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

Восстановление сети

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

  1. Восстанавливаем конфиг /etc/network/interfaces
  2. Заходим в chroot и переходим в /tmp:
  3. Качаем исходники драйвера r8168, официальный сайт тут: http://www.realtek.com.tw/Downloads/downloadsView.aspx?Langid=1&PNid=13&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false, после того, как скачали на компьютер, извлекаем ссылку и заливаем на сервер:
  4. Правим скрипты сборки: так как у нас chroot, то uname -r будет возвращать версию хостовой системы. Чтобы всё скомпилировалось, нужно заменить конструкции типа $(shell uname -r) в Makefile’ах и Autorun.sh на явное указание ядра проксмокса (а точнее, версии ядра, под которую будем собирать). Её можно найти в /lib/modules, выглядит как 4.4.16-1-pve, далее именно эту версию я буду указывать в качестве примера.
  5. Ставим пакеты, необходимые для сборки и screen для шага 10
  6. Собираем
  7. Далее я открыл screen и запустил ./autorun.sh, а через какое-то время хардово ребутнул сервер. Да, так делать плохо, нужно было выйти из чрута и руками положить модуль куда надо, распарсив самостоятельно скрипт, но мне очень хотелось спать :) Дальнейшие шаги 8-12 я проделал чтобы убедиться, что всё нормально работает, однако следует рассматривать их как правильное решение при первой установке модуля; а в пункте 7 в этом случае достаточно просто скопировать собранный модуль в
  8. Опять Rescue и шаг 2
  9. Выполняем обновление модулей (везде, где можно, явно указываем версию ядра, у нас chroot, не забыли?)
  10. Блокируем загрузку старого драйвера
  11. Добавляем загрузку нового модуля
  12. Пересобираем Initramfs

    Если всё получилось верно, то при выполнении будет строчка:
  13. Пляски с сетью на этом закончились. Кидаем контейнеры на их место в /var/lib/vz/images, config.db в /var/lib/pve-cluster, правим /etc/network/interfaces, включаем форвардинг командой

    а также возвращаем в /etc/fstab строчку

Эксплуатация

Вообще говоря, пакет r8168-dkms вполне себе существует, но он в ветке sid, и я лучше буду выполнять эту работу руками при обновлении ядра :)

Собственно, после установки обновлений ядра нужно будет повторять шаги 3, 5, 6, 7, убрав оттуда жёсткую привязку к версии ядра и используя стандартные скрипты из поставки драйвера.

Но это всё работает при нахождении за локальной консолью и на обновлённом ядре (после перезагрузки, с лежащей сетью), а на удалённом сервере нужно делать так:

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

И добавляем его в загрузочный образ (вообще, по идее достаточно update-initramfs -u -k 4.4.44-1-pve, но это так, на всякий случай)

Использовано:

https://forum.proxmox.com/threads/cannot-access-etc-pve-transport-endpoint-not-connected.7528/

https://wiki.hetzner.de/index.php/Installation_des_r8168-Treibers/ru#Proxmox

и многочисленные запросы в гугле вида «r8169 debian»


Webmin, пожирающий память

На самом деле память ест не Webmin, а процесс lookup-domain.pl, который используют службы почтового сервера. При большой загруженности почтового сервера получается следующая картина:

domain-lookup

Первый способ (не помогает):

Нужно в System Settings -> Virtualmin -> Config -> Spam Filtering установить значение «Lookup domain for incoming email» в «One at a time».

Второй способ, вроде бы рабочий:

Нужно перезапустить визард и выключить запросы DNS. Либо в файле /etc/webmin/virtual-server/config установить параметр wizard_run=1, либо  открыть Javascript-консоль браузера и выполнить

Там выбрать на втором этапе

Run email domain lookup server? — No (less RAM used, slower mail and more CPU load)


Установка Prosody и миграция с ejabberd

Решил систематизировать все сакральные знания по установке этого неплохого Jabber-сервера. Настройка велась не с нуля, а выполнялся переезд с ejabberd, который в принципе неплох, но для небольшой организации немного тяжёлый, а также плохо себя вёл на Ubuntu 14.04.

Я ставил самую свежую версию (читай — версию в разработке), которая на данный момент 0.10. Адрес сервера будет 192.168.0.2, все операции от рута.

Установка и начальная настройка Prosody

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

и ставим:

Генерируем ключи:

Теперь редактируем конфиг. Prosody написан на Lua, который гораздо более читабелен, чем старый формат Erlang (с переходом на YAML это исправили)

Вот пример моего конфига на 2 домена:

Движок базы. Я выбрал MySQL, хотя встроенный файловый формат тоже хорош и удобочитаем. Создаём базу:

Важные моменты

c2s_require_encryption = false — в Miranda NG в Windows XP не работает TLS, поэтому я разрешил соединяться без шифрования. Внутри корпоративной сети это некритично. Также добавил параметр legacyauth

groups_file должен обязательно идти до VirtualHost. Это единственная настройка модуля groups, который нужен для загрузки общего ростера. Сам формат файла такой:

Плюсик означает публичную группу, то есть группы «Бухгалтерия» и «Продажи» будут у всех в списках, а «IT» только у членов группы «IT». Через веб-интерфейс управлять ими нельзя (я редактирую через Webmin). Через равно задаётся имя в списке. Кириллица работает (разумеется, UTF-8)

mod_admin_web — плагин веб-интерфейса. Он ещё менее функциональный, чем у ejabberd, и из него не отредактировать общий ростер, но лучшего пока нет. И его нужно ставить отдельно.
Инструкция по установке модулей
Инструкция к самому модулю
Ставим Mercurial, скачиваем репозиторий с плагинами, копируем и добавляем в конфиг (у меня уже добавлено). В Ubuntu плагины лежат в /usr/lib/prosody/modules/, узнать свой путь можно запустив prosodyctl about

Обычно в локальной сети Jabber-сервер не резольвится по своему полному доменному имени, поэтому нужно добавить VirtualHost для IP-адреса или внутреннего доменного имени.  Пример:
http://192.168.0.2:5280/admin/
https://192.168.0.2:5281/admin/

LuaExpat. prosodyctl может ругаться (без потери функционала, но сервер уязвим к DoS-атакам) на устаревший или отсутствующий luaexpat, который должен быть версии 1.3.0 или новее. В репозиториях текущего LTS Ubuntu Server 14.04 есть только 1.2.0, варианты решения — либо прикрутить из этого репозитория, либо отключить mod_compression, либо не заморачиваться :)

Миграция пользователей с ejabberd

1. Экспортируем дамп базы ejabberd

Может понадобиться пакет exmpp. Файл окажется в /var/lib/ejabberd, потом можно будет его перенести.

2. Импортируем дамп базы ejabberd в prosody

Инструкция по импорту здесь. Нужно поставить Mercurial (если ещё не установлен), скачать репозиторий с исходниками и отредактироватьь конфиг.

3. Конвертируем файловую базу Prosody в MySQL

Необязательно если мы не используем MySQL. Инструкция к мигратору.

По умолчанию этот файл есть в папке /etc/prosody, можно отредактировать либо его, либо этот и запускать с опцией —config=./migrator.cfg.lua

И запускаем импорт