четверг, 15 июня 2017 г.

sSMTP

Эмулятор Sendmail для Unix.

OS: Debian Lenny.

Предположим, что мы имеем произвольный сервер под управлением Debian Lenny фиксированной конфигурации в полноценном окружении, обеспечивающем работу таких служб как разрешение доменных имён, доставки почтовой корреспонденции и тому подобного. Предположим, нам необходимо отправлять с нашего воображаемого сервера почтовую корреспонденцию. Что для этого требуется? Если сервер функционирует сам по себе, вне развитой инфраструктуры, то ничего другого не остается, как только подкорректировать конфигурацию MTA самого сервера (это может быть Sendmail, Postfix, Exim, Qmail и тому подобные приложения). А вот, в том случае, если у нас "под боком" имеется полнофункциональный почтовый сервер считаю целесообразным полностью переложить на него функции доставки электронной почты; наш воображаемый сервер будет обрабатывать свои функции, а почтовый доставлять то, для доставки чего он и предназначен - почту.

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

# aptitude install ssmtp

При инсталляции sSMTP будет предложено удалить Exim - делаем это, для локального сервера он нам не нужен.

Делаем резервную копию конфигурационного файла sSMTP:

# cp /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf.dist

Приводим содержимое конфигурационного файла к следующему виду:

root=postmaster
# Адрес почтового "шлюза" с указанием порта
mailhub=mx.domain.name:465
# Имя хоста на котором запущен sSMTP
hostname=service.domain.name
# Реквизиты пользователя на почтовом "шлюзе" через которого осуществляется пересылка почты
AuthUser=service@domain.name
AuthPass=strong.password
# Метод аутенификации
AuthMethod=LOGIN
# Указание применять шифрование соединения
UseTLS=YES
# Разрешаем заменять отправителю значение поля "From"
FromLineOverride=YES

И это, практически, все. После монструозных конфигураций Sendmail или Exim такой простой подход кажется невероятным, но настраивать в пересылке почты от локального пользователя удалённому шлюзу действительно просто нечего.

Возможно, работающий ранее в системе MTA не будет корректно удалён или остановлен. Подстановка sSMTP вместо него довольно проста и подразумеваем гарантированный "откат" до исходного состояния. Необходимо остановить работающий MTA, заблокировать его авто-запуск и подставить вместо ссылки на запуск Sendmail (традиционно считающимся MTA "по умолчанию" в ~NIX) ссылку на запуск sSMTP:

# mv /usr/sbin/sendmail /usr/sbin/sendmail.original
# ln -s /usr/sbin/ssmtp /usr/sbin/sendmail

Теперь все обращения к Sendmail будут осуществляться к sSMTP незаметно для пользователя сервиса.

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

# echo "test" | ssmtp admin@domain.name

Понятно, что следует ожидать письма с содержимым "test" на почтовый ящик "admin@domain.name".

четверг, 8 июня 2017 г.

Команды EXIM

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

exim -bP
Вывод всех значений, установленных в конфигурационном файле.

exim -bp 
Вывод почтовой очереди. Вывод списка сортируется в хронологическом порядке по прибытию сообщений. Если опция сопровождается списком идентификаторов сообщений, то показываются только эти сообщения. Пример вывода:
10h  729K 1RdheP-00021S-GM <info@domain.com.ua>
        D user@rambler.ru
          user2000@gmail.com
        D user@safaritour.com.ua
        D user@fortunat.zssm.zp.ua
Первая строка содержит 4 колонки: сколько сообщение находится в очереди, размер сообщения, ID сообщения, отправитель, как он указан в "конверте" (для bounce "<>"). Если сообщение заморожено (приостановлена попытка его доставки), в конце этой строки показывается текст "*** frozen ***". Адреса по которым сообщение уже доставлено отмечены символом "D" (Delivered - доставлено). Если оригинальный адрес раскрывается в несколько адресов через файл алиасов или форвардов, оригинальный показывается с "D" только когда завершены доставки для всех дочерних адресов.

exim -bpr
Вывод почтовой очереди, но без сортировки. Полезно, когда в очереди много сообщений, а сортировка не нужна.

exim -bpc
Вывод количества сообщений в очереди.

exim -Mvl <message id>
Посмотр лог сообщения.

exim -Mvb <message id>
Вывод тела сообщения.

exim -Mvh <message id>
Вывод заголовков сообщения

exim -Mrm <message id> <message id> ...
Удалить сообщение из очереди и не посылать никаких ошибок (в логах запись о удалении будет).

exim -Mg <message id> <message id> ...
Удалить сообщение из очереди и отослать "отлуп" (cancelled by administrator).

exim -M <message id> <message id> ...
Ускорить доставку сообщения (немедленно выполняет доставку сообщения).

exim -Mar <message id> <address> <address> ...
Добавить адрес в вписок получателей сообщения.

exim -Mes <message id> <address>
Заменить адрес отправителя в сообщении на указанный.

exim -Mf <message id> <message id> ...
Отметить перечисленные сообщения как "frozen". Попытки доставки сообщения прекращаются, пока сообщение не будет разморожено вручную, или пока не пройдет время указанное в "auto_thaw".

exim -Mt <message id> <message id> ...
"Разморозить" сообщения.

Для сообщений, которые подозреваются в спаме удобно сначала массово, сделать -Mf, потом -Mvl, -Mvh и -Mvb для пары выбранных наугад сообщений. Если все еще невозможно с консоли определить спам ли это (например, проблемы с кодировками или есть вложения), то можно с помощью -Mar добавить себя в список получателей, и ускорить данное сообщение с помощью -M. Когда все наконец станет ясно, то либо -Mrm, либо -Mt.

exipick -i | xargs exim -Mrm
Очистить очередь. Тоесть, по сути удаляем все сообщения из очереди.

exipick -zi | xargs exim -Mrm
Удалить из очереди все "замороженные" сообщения (помеченные как "frozen").

понедельник, 5 июня 2017 г.

TestDisk инструкция.

  TestDisk - весьма продвинутая утилита, предназначенная для всякого рода восстановительных действий. Не смотря на свое название TestDisk, состоит из трио-утилит: TestDisk, PhotoRec, FIdentifi. В данном конкретном случае, мы рассмотрим способ восстановления, нечаянно удаленных файлов со съемного носителя, например с флешки, но в целом, утилита настолько мощна, что описывать все ее возможности и различные настройки, не соответствует формату этой статьи. Мы подробно разберем, самый простой способ восстановления для общего понимания процесса.
Пару слов о содержимом, кратко и в общих чертах.
  «TestDisk» - может исправлять таблицы разделов, восстанавливать удаленные разделы и файлы, копировать файлы, исправлять загрузочные сектора, восстанавливать «MFT» и суперблоки из копий.

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

«FIdentifi» - это своего рода расширение, дополнение к «PhotoRec», которое наиболее точным образом идентифицирует восстанавливаемые файлы по их расширению.

  Для нашей конкретной задачи, лучше всего подходит утилита «PhotoRec», т.к. ее возможности по восстановлению именно файлов, самые продвинутые и она порой может восстановить то, чего не может «TestDisk». Для начала, установим программу:
sudo apt-get install testdisk
Запускаем утилиту:
sudo photorec


  После ввода пароля, запустится утилита и покажет вам, какие диски она смогла обнаружить. В данном случае, на скриншоте ниже, выделен диск (флешка), размером в 500 (512) МБ. При помощи клавиатуры, стрелками верх/низ, выбираете нужный диск (флешка) и нажимаете «Enter». Хочу заметить, что утилита, фактически, почти во всех случаях, определяет нужный пункт автоматом, там, где это возможно.








  Открывается следующее окно с отображением файловой системы выбранного диска «FAT32», в левом нижнем углу должно быть выделено «Search», жмем «Enter».


  На следующем шаге, выбираем значение «Other», что соответствует нашей файловой системе «FAT32», обычно стоит по-умолчанию. Жмем «Enter».

  Далее, опять имеем две позиции для выбора: «Free» - утилита будет сканировать только свободное пространство, «Whole» - будет просканировано все. Для восстановления какого-нибудь одного файла или даже, допустим музыкальной коллекции, обычно хватает позиции «Free». Выбираем, что хотите и жмем «Enter».

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

Здесь, можно нечего не трогать и нажать клавишу «Y», запустится процесс.

  Снимок самого процесса я пропустил, но когда он закончится, то вы получите такое сообщение:


  Это говорит о том, что все окончено, можете заходить в соответствующую директорию и искать свои файлы. Несколько слов о том, что же вы получаете в конечном итоге. «PhotoRec» очень хороша своей способностью находить любые файлы, но это и ее минус, т.к. по-мимо искомых файлов, будут найдены и восстановлены все файлы, которые находились на просканированном пространстве и их может быть довольно-таки много. Второй неприятный момент - утилита изменяет имена файлов и заменяет их на буквенно-цифровые значения. Если файлов было восстановлено много, то поиск одного нужного, путем обычного просмотра, может быть затруднен. Лучший вариант в таком случае - это зайти в директорию и воспользоваться поиском, вбив в строку поиска только расширение файла. Например, если вы восстанавливали графический файл с расширением «PNG», то в поиск "вбивайте" значение «.png», это значительно облегчит нахождение нужного нам файла.
Положительные характеристики TestDisk:
  • Просто необходимая утилита для восстановления, практически на любой случай жизни.

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

Уменьшение размера LVM раздела

Внимание
При всех действиях с файловой системой рекомендуется создать резервную копию данных
При установке RFRemix выбирая разметку диска отличную от "<уточнить>" инсталятор создаёт примерно следующую разбивку
/boot 200M ext4
VolGroup 100Gb 
 -lvm_root 98Gb / ext4
 -lvm_swap 2Gb swap
что в некоторых случаях бывает крайне неудобно. ---
Например, на каждом созданном разделе linux(в частности имеется ввиду фс ext2|3|4) "бронируется" под нужды пользователя root 5% от размера раздела. В нашем случае если корневой раздел будет полностью заполнен, любой пользователь отличный от root не сможет ввойти в систему. Или например, Вы выполняете обновление дистрибутива с 14 до 15 версии в процессе чего происходят какие-либо сбои, которые Вы не в силах исправить. Некоторым пользователям в данном случае легче установить ОС заново, но при этом не потерять свою информацию. В любом случае не зависимо от приведённых примеров рассмотрим случай когда необходимо уменьшить размер любого раздела входящего в состав группы LVM.

Перед изменением размера раздела его необходимо отмонтировать, но учитывая что редактировать нам надо корневой раздел, лучше загрузится с LiveCD/LiveDVD или с установочного диска в режиме rescue (для этого выбрать соответствующий пункт меню загрузки с диска).
При работе с rescue-диска, к командам LVM надо впереди добавять lvm, либо выполнять их из встроенного интерпретатора lvm:
# lvm pvs
либо
# lvm
lvm> pvs
Проверяем, определился или нет, системой наша LVM группа.
# pvs
  PV         VG         Fmt  Attr PSize   PFree  
  /dev/sda1  VolGroup   lvm2 a-   100,00g      0
# vgs
  VG         #PV #LV #SN Attr   VSize   VFree  
  VolGroup   1   2   0   wz--n- 100,00g      0
# lvs
  LV         VG         Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  lv_root    VolGroup   -wi-a-  98,00g
  lv_swap    VolGroup   -wi-a-   2,00g
lvreduce урезает размер LVM раздела. Работает она следующим образом, параметр -L указывает на изменение размера раздела, здесь же есть 2 варианта: указание размера и относительное значение, со знаком + или -. Например, -L 83G урежет размер до 83G(то бишь lvm_root станет 83Gb вместо 98Gb), соответственно -L -15G или -L +15G уменьшит или увеличит размер на указанный (lvm_root станет 98G минус 15G или 98G плюс 15G).
Итак, нам надо уменьшить размер раздела следующей командой:
# lvreduce -r -L -15G /dev/Volgroup/lv_root
Наличие опции -r указывает, что надо также изменить размер файловой системы, без неё данные будут утеряны.
Успешность выполнения команды lvreduce проверяется просмотром свободного места в VolGroup.
# vgs
Свободного места должно быть 83G.

Создаём новый раздел для директории home
 lvcreate -L 83GB -n lv_home VolGroup 
и файловую систему на нём.
 mkfs.ext4 -L home /dev/VolGroup/lvm_home
Добавляем запись о разделе в файл /etc/fstab
 /dev/VolGroup/lvm_home  /home   etx4 defaults 1 2 
Перенести всю информацию из директории /home относительно раздела / (корневого раздела) в /home вновь созданого раздела (он будет пустой, если не считать системной директории lost+found)
Для этого:
  • создаём папки к которым будут смотрированы разделы
mkdir /mnt/{root,home}
  • монтируем
mount -t ext4 /dev/VolGroup/lv_root /mnt/root
mount -t ext4 /dev/VolGroup/lv_home /mnt/home
  • перемещаем информацию
mv -v /mnt/root/home /mnt/home
загружаем нашу ОС и проверяем логические разделы LVM
lvdisplay
  --- Logical volume ---
  LV Name                /dev/VolGroup/lv_root
  VG Name                VolGroup
       .....
  LV Size                15,00 GiB
       .....
   
  --- Logical volume ---
  LV Name                /dev/VolGroup/lv_home
  VG Name                VolGroup
       .....
  LV Size                83,00 GiB
       .....
   
  --- Logical volume ---
  LV Name                /dev/VolGroup/lv_swap
  VG Name                VolGroup
       .....
  LV Size                2,00 GiB
       .....

Установка и настройка KVM в Ubuntu 16.04


Для установки KVM в Ubuntu Server 16.04 нужно выполнить следующие шаги:

Убедиться что ваш компьютер поддерживает аппаратную виртуализацию:

$ sudo apt-get install cpu-checker
$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

Установить необходимые пакеты qemu-kvm:

$ sudo apt-get install qemu-kvm libvirt-bin virtinst bridge-utils

Создать и сконфигурировать мост (bridge):

$ sudo cp /etc/network/interfaces /etc/network/interfaces.bakup-12.nov.2016
$ sudo nano /etc/network/interfaces
Отредактировать файл сетевых настроек, как приведено ниже:
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto eth0

iface eth0 inet manual


auto br0
 iface br0 inet static
 address 192.168.10.100
 netmask 255.255.255.0
 broadcast 192.168.10.255
 dns-nameservers 192.168.10.1 8.8.8.8
gateway 192.168.10.1
 bridge_ports eth0
 bridge_stp off
 bridge_fd 0
 bridge_maxwait 0
Сохранить и закрыть файл /etc/network/interfaces и перезапустить сетевой сервис:
$ sudo systemctl restart networking
Вообще-то желательно перезагрузить компьютер:
$ sudo shutdown -r now
Проверяем установки моста:
$ sudo brctl show
Должно выдать что-то вроде:
bridge name              bridge id                STP               enabled interfaces
br0                 8000.0016e68e5526             no                       eth0

Создаем первую виртуальную машину:

Для примера создадим виртуальную машину с системой FreeBSD 10, 2GB RAM, 2 CPU и 40GB дисковой памяти:
$ cd /var/lib/libvirt/boot/
$ sudo wget ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/10.3/FreeBSD-10.3-RELEASE-amd64-disc1.iso
$ sudo virt-install
--virt-type=kvm
--name freebsd
--ram 2048
--vcpus=2
--os-variant=freebsd10.0
--virt-type=kvm
--hvm
--cdrom=/var/lib/libvirt/boot/FreeBSD-10.3-RELEASE-amd64-disc1.iso
--network=bridge=br0,model=virtio
--graphics vnc
--disk path=/var/lib/libvirt/images/freebsd10.qcow2,size=40,bus=virtio,format=qcow2
Здесь виртуальная машина у нас называется freebsd. Посмотрим, какой порт слушает VNC сервер на нашей виртуальной машине:
$ sudo virsh dumpxml freebsd | grep vnc
<graphics type='vnc' port='5903' autoport='yes' listen='127.0.0.1'>
Например порт  5903. На клиентской машине открываем SSH туннель к freebsd:
$ ssh somebody@server.biz -L 5903:127.0.0.1:5903
После того, как ssh туннель настроен запускаем VNC клиент на свой адрес 127.0.0.1 (localhost) и порт 5903 для продолжения установки  OpenBSD.

Напоследок – несколько полезных команд KVM/VIRSH:

Список доступных версий операционных систем

$ osinfo-query os | less
$ osinfo-query os | grep debian
$ osinfo-query os | grep freebsd

Получить список работающих vms/domains

$ sudo virsh list

Остановка vm/domain с именем openbsd

$ sudo virsh shutdown openbsd

Запуск vm/domain с именем openbsd

$ sudo virsh start openbsd

Приостановить vm/domain с именем openbsd

$ sudo virsh suspend openbsd

Корректно перезагрузить vm/domain с именем openbsd

$ sudo virsh reboot openbsd

Жесткий сброс vm/domain с именем openbsd

$ sudo virsh reset openbsd

Деактивировать/удалить vm/domain с именем openbsd

$ sudo virsh undefine openbsd
$ sudo virsh destroy openbsd

Посмотреть полный набор команд virsh

$ virsh help | less
$ virsh help | grep reboot

Установка гипервизора KVM в Ubuntu 14.04

В настоящее время в Ubuntu офицально поддерживается только гипервизор KVM (http://www.linux-kvm.org). Этот гипервизор является частью кода ядра операционной системы.
В качестве инструментария управления используется библиотека Libvirt, включающая в себя набор программного API и пользовательских приложений управления виртуальными машинами.
Несомненное достоинство — в качестве гостевых можно запускать Linux, *BSD, Windows, Solaris, Mac OS X и ряд других ОС. Гостевые системы ограничены фактически ресурсами сервера, каждая может иметь до 16 vCPU.
По возможности мы стараемся использовать именно этот гипервизор. До сих пор никаких нареканий на него не было.
В отличие от Xen, KVM не поддерживает паравиртуализацию, то есть, требует поддержку аппаратной виртуализации Intel VT или AMD V. Проверить поддерживает ли процессор эту технологию можно выполнив команду в терминале:
kvm-ok
Распространяется он по лицензии GNU GPL.
Для настройки виртуальных машин используется псевдоустройство /dev/kvm. Все инструкции выполняются в специальном гостевом режиме, в полностью изолированном от системы и друг от друга адресном пространстве.
Для хост-машины рекомендуется использовать 64-битную ОС. Это позволит:
  • Устанавливать в качестве гостевых 64-битные системы
  • Выделять гостевым системам более 2 Гбайт ОЗУ
По опыту — если в качестве гостевой используется Linux, то лучше выбрать такой же дистрибутив, как и базовая система. Производительность и стабильность работы будут заметно выше.
Удобно, что KVM поддерживает vmdk-образы, созданные в VMWare, процесс переноса очень прост.
Так как KVM функционирует совместно с доработанными модулями QEMU (оба проекта тесно связаны друг с другом), то принципы управления (в частности, создания образов) остались те же.
В Ubuntu KVM находится в репозитории и устанавливается:
sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
Управление осуществляется при помощи фронт-энда virt-manager или утилит командной строки qemu. Virt-manager ставится из репозитория:
sudo apt-get install virt-manager
В качестве альтернативных менеджеров можно использовать ConVirt (Xen/KVM) — http://www.convirture.com/. В репозитории Ubuntu его нет, но ставится просто — на сайте подробная инструкция по установке.
В качестве формата образа гостевой ОС лучше использовать qcow2. Он поддерживает снапшоты, шифрование и сжатие. Его необходимо создавать до того, как создать новую гостевую систему либо с консоли:
qemu-img create -o preallocation=metadata -f qcow2 имя_образа.img 40G
либо из графической оболочки.

Удаляем мост по умолчанию virbr0

После установки KVM в Ubuntu и настройки своего моста в системе остается мост по умолчанию – virbr0. По ifconfig можно увидеть:
 virbr0    Link encap:Ethernet  HWaddr a2:17:ea:e3:47:7e  
      inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
      UP BROADCAST MULTICAST  MTU:1500  Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
Деактивация моста virbr
sudo ip link set dev virbr0 down
с последующим его удалением
sudo brctl delbr virbr0
ничего не дает – после перезагрузки он появляется снова.
Полностью удалить virbr0 можно командами virsh:
sudo virsh net-destroy default
sudo virsh net-undefine default
И перестартовать сервис libvirtd:
service libvirtd restart
а лучше – перегрузить систему. Все, мост удален и после перезагрузки ifconfig его не покажет.

Образы виртуальных машин QEMU-KVM – создание и конвертация

Для манипуляции с образами дисков виртуальных машин в QEMU-KVM используется команда qemu-img, которая использует подкомманды для осуществления определенных действий. В общем случае формат команды qemu-img:
qemu-img subcommand [options]
где в качестве “subcommand” могут быть:
create
Создание нового образа диска.
check
Проверка существующего образа диска на ошибки.
convert
Конвертация существующего образа диска в другой формат.
info
Выводит информацию о существующем образе диска.
snapshot
Управляет снимками состояний (snapshots) существующих образов дисков.
commit
Записывает произведенные изменения на существующий образ диска.
rebase
Создает новый базовый образ на основании существующего.

Создание нового образа диска – qemu-img create

qemu-img create создает новый образ диска в базовой операционной системе для гостевой виртуальной машины. Формат команды:
qemu-img create -f fmt -o options size fname
где:
fmt – формат образа диска. В kvm в Ubuntu можно создать образы дисков следующих форматов: vvfat vpc vmdk vhdx vdi sheepdog sheepdog sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd nbd nbd dmg tftp ftps ftp https http cow cloop bochs blkverify blkdebug.
Из всего этого разнообразия реально используется только 4 формата:
  • raw Файл содержащий как бы точную копию физического диска. Переводится как «сырой».  Данные пишутся как есть без всякой обработки и без дополнительной служебной информации. Основным преимуществом данного формата являются максимальная производительность дисковой подсистемы среди других образов за счет отсутствия служебной информации и дополнительных действий в моменты чтения/записи. Универсальность формата позволяет использовать RAW-диски  под управлением других гипервизоров(Xen, VMware).
    К минусам можно отнести невозможность создавать снапшоты а так же необходимость выделения для файла-образа всего объема дискового пространства указанного в параметре size, что в прочем в некоторых случаях избавляет от фрагментации файла-образа за счет единовременного выделения всего объема.
  • qcow2 “Родной” формат  эмулятора QEMU с поддержкой сжатия, снапшотов и шифрования. Кроме того qcow2 образ занимает столько места, сколько реально занимают данные, вне зависимости от размера создаваемого при соз8589934592дании. Наиболее часто используемый и рекомендуемый формат.
    Производительность дисков в формате QCOW2 несколько уступает дискам в формате RAW. Диски в формате QCOW2 в большей степени подвержены фрагментации за счет постепенного а не едино разового выделения всего объема на физическом диске.
  • vdi Образ виртуальных машин, поддерживаемый VirtualBox.
  • vmdk Образ виртульных машин VMware.
size – размер создаваемого диска. Число и единица измерения – K (kilobyte), M (megabyte), G (gigabyte), или T (terabyte).
fname – имя файла образа диска.
$qemu-img create -f qcow2 -o size=8G /images/ca.img
Formatting '/images/ca.img', fmt=qcow2 size=4294967296
 $ qemu-img info /images/ca.img
image: ca.img
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 2.7G
cluster_size: 65536
Format specific information:
 compat: 0.10

Конвертация образа диска qemu-img convert

Для конвертации одного формата образа в другой используется опция convert:
qemu-img convert -c -f fmt -O out_fmt -o options fname out_fname
где:
-c – компрессия (сжатие) целевого диска. Компрессию поддерживают только qcow и qcow2 форматы.
-f fmt – формат исходного диска, в большинстве случаев хорошо определяется автоматически.
-O out_fmt – формат целевого диска
-o options – куча опций. Чтобы узнать, какие опции допустимы для данной конвертации можно ввести:
$ qemu-img convert -O qcow2 ca.img ca1.img -o ?
Supported options:
size Virtual disk size
compat Compatibility level (0.10 or 1.1)
backing_file File name of a base image
backing_fmt Image format of the base image
encryption Encrypt the image
cluster_size qcow2 cluster size
preallocation Preallocation mode (allowed values: off, metadata)
lazy_refcounts Postpone refcount updates

Аутентификация по SSH через ключевую пару

Для соединения с сервером Debian/Ubuntu через SSH можно использовать аутентификацию по паролю, но есть более безопасный метод: аутентификация через пару ключей.
Для этого необходимо сгенерировать ключевую парузакрытый ключ и открытый ключ используя клиентский компьютер и затем загрузить открытый ключ на сервер.
Соединения SSH будут аутентифицироваться на соответствии открытого ключа с закрытым ключом, хранящимся на клиентском компьютере и совсем не обязательно вводить пароль учетной записи (хотя эту опцию можно и оставить).
Аутентификация по паре ключей может защитить от атак взламывания пароля.
  1. Генерируем SSH ключи на клиентском компьютере:
    ssh-keygen
  2. Появится диалог утилиты SSH keygen. Нужно следовать инструкциям на экране (ответить на несколько вопросов). Самое главное ввести правильный ufdn адрес клиента и нажать на Enter при вводе passphrase (если конечно пароль не нужен).
Два файла будут созданы в директории ~/.ssh : id_rsa и id_rsa.pub. Публичным ключом является id_rsa.pub – этот файл позднее необходимо будет загрузить на сервер. Второй файл – private key, закрытый, приватный ключ.
  1. Создаем директорию на сервере для публичного ключа. Она должна быть в домашней директории (/home/yourusername):
    mkdir .ssh
  2. копируем файл /home/yourusername/.ssh/id_rsa.pub на сервер, в файл /home/yourusername/.ssh/authorized_keys:
    scp ~/.ssh/id_rsa.pub hostname_of_server:.ssh/authorized_keys
    Важно: если файл authorized_keys на сервере уже существует, то открытый ключ нужно просто дописать:
    cat ~/.ssh/id_rsa.pub | ssh hostname_of_server "cat >> .ssh/authorized_keys"
    Это позволит использовать несколько ключей для авторизации под одним пользователем, например, если вы хотите авторизоваться с разных машин с разными  ключами.
Ключи SSH сгенерированы, публичный ключ установлен на сервере. Всё готово для использования аутентификация SSH по паре ключей key.

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

Судя по вопросам пользователей многие получив новый VDS сервер продолжают пользоваться присланными идентификационными данными, а зачастую работают под root. Конечно можно и так, но не рекомендуется.
Лучше сразу-же создайте нового пользователя:
sudo adduser user_name
Добавьте его в группу sudo:
sudo adduser user_name sudo
Затем добавьте полные root-права пользователю в файле sudoers. Для этого вызывается команда:
sudo visudo
после чего в редакторе, установленном по умолчанию открывается что-то типа этого:
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
И после строки root ALL=(ALL:ALL) ALL добавляем:
user_name    ALL=(ALL:ALL) ALL
Вместо user_name везде, естественно, используем реальной имя пользователя.
Присланные root пароль нужно сразу же поменять, запретить их использование в ssh и перейти на авторизацию по ssl.

Ротация логов – logrotate

Ротация логов – logrotate. В Ubuntu, да и во всех Linux, сама система, сервисы и программы все значимые события записывают в файлы журналов или лог-файлы, которые используются для диагностики ошибок, определения причины сбоев, получения статистики, а иногда и для работы других программ или сервисов. Обычно файлы логов хранятся в директории /var/log.
Включение или отключение функции ведения логов, перечень событий, которые должны записываться в логи, названия лог-файлов и другая информация обычно задается в конфигурационных файлах сервиса или программы.
Некоторые сервисы и программы записывают в лог-файлы достаточно много информации и они распухают на глазах. Для ограничения бесконтрольного роста лог-файлов существует специальный сервис – logrotate, который осуществляет ротацию логов через заданный отрезок времени и удаляет ставшие ненужными старые файлы.
Основная функция logrotate заключается в периодической замене старых логов новыми. Logrotate может быть настроен на ежедневную, еженедельную или ежемесячную ротацию. Кроме того, можно задать размер файла, по достижении которого файл будет ротирован. В зависимости от настроек архив логов может храниться как в сжатом, так и в несжатом виде. Обычно logrotate выполняется в качестве каждодневного задания (cron).
Базовые настройки logrotate хранятся в конфигурационном файле /etc/logrotate.conf. По умолчанию, в Ubuntu 14.04 он выглядит так:
# see "man logrotate" for details
# rotate log files weekly
weekly

# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
# compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}

/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}

# system-specific logs may be configured here
Обычно устанавливаемые пакеты записывают информацию о ротации своих логов (каким образом Logrotate будет работать с тем или иным лог файлом) в директорию /etc/logrotate.d, но далеко не все и не всегда оптимальную. Иногда получается бесконтрольный рост лог-файлов, который приводит к неприятным последствиям. Особенно это важно при работе с vds/vps с небольшим объемом дисковой памяти.
Например утилита fail2ban при установке формирует конфигурационный файл /etc/logrotate.d/fail2ban с содержимым:
/var/log/fail2ban.log {

weekly        # ротация раз в неделю. Возможные варианты daily, weekly, monthly, size (например size=1M)
rotate 4      # сохраняется последние 4 ротированных файла
compress      # сжимать ротируемый файл

delaycompress # сжимать предыдущий файл при следующей ротации
missingok     # отсутствие файла не является ошибкой
postrotate    # скрипт будет выполнен сразу после ротации
fail2ban-client set logtarget /var/log/fail2ban.log >/dev/null
endscript

# If fail2ban runs as non-root it still needs to have write access
# to logfiles.
# create 640 fail2ban adm 
create 640 root adm # сразу после ротации создать пустой файл с заданными правами и пользователем
}
Русскими комментариями раскрыты все основные директивы. Всего допустимых директив в конфигурационном файле очень много (более 40). Подробнее о них можно узнать из man logrotate.
Для немедленного применения изменений можно выполнить:
$ logrotate /etc/logrotate.conf
Для проверки внесенный изменений можно запустить команду (никаких действий с логами не будет выполнено):
$ logrotate -d /etc/logrotate.conf

Монтирование расшаренных сетевых папок в Ubuntu

Файловая система CIFS, встроенная в ядро Linux обычно предпочтительный метод для монтирования расшаренных сетевых ресурсов SMB/CIFS. CIFS VFS является виртуальной файловой системой для Linux, обеспечивающей доступ к серверам и устройствам хранения, совместимым с версией 1.0 спецификации CIFS SNIA или поздней. Популярные серверы, такие как Самба, Windows 2000, Windows XP и многие другие поддерживают CIFS по умолчанию.
VFS CIFS оказывает некоторую поддержку для более старых серверов, основанных на более примитивном SMB (Server Message Block) протоколе (Вы также можете использовать файловую систему Linux smbfs в качестве альтернативы для доступа к ним). CIFS VFS была разработана, чтобы использовать продвинутые сетевые особенности файловой системы, такие как захват, Unicode (передовая интернационализация), hardlinks, dfs (иерархическое, реплицируемое пространство имени), распределенное кэширование и использует родные имена TCP (а не RFC1001, названия Netbios). В отличие от некоторых других сетевых файловых систем, вся ключевая сетевая функция включая идентификацию обеспечена в ядре, начиная с версии 2.5.42.
Файловая система CIFS поддерживается набором утилит пространства пользователя. Тот пакет инструментов называют CIFS-utils. Эти инструменты были первоначально частью пакета Samba, но по некоторым причинам их выделили в отдельный проект.
Для работы (монтирования) с расшаренными сетевыми дисками SMB/CIFS (Windows или Samba) необходимо установить пакет cifs-utils, который присутствует в репозиториях практически всех дистрибутивов Linux. Далее будем рассматривать только Ubuntu.
$ sudo apt-get install smbfs
Теперь можно монтировать расшаренные сетевые ресурсы:
$ sudo mount.cifs //192.168.1.107/share1/  /mnt/shares/share1/ -o user=user1,pass=user1password,iocharset=utf8,file_mode=0777,dir_mode=0777
где:

  • //192.168.1.107/share1/ – IP адрес или сетевое имя и имя расшаренного ресурса (папки)
  • /mnt/shares/share1/ – точка монтирования
  • -o users=user1,password=user1 – имя пользователя и пароль для доступа к общему ресурсу
  • iocharset=utf8 – кодировка по умолчанию
  • file_mod и dir_mod – права доступа к файлам и папкам в расшаренном ресурсе
Для монтирования публичных сетевых ресурсов имя пользователя и пароль не задаются:
mount.cifs //192.168.1.107/share1/  /mnt/shares/share1/
Для того, чтобы расшаренный сетевой ресурс (папка) монтировался при загрузке системы, необходимо в конфигурационный файл /etc/fstab добавить строчку:
//192.168.1.129/share1  /mnt/shares/share1  cifs  username=user1,password=user1password,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0

Изменение размера и подключение диска виртуальной машины KVM

Достаточно часто возникает необходимость изменить размер диска виртуальной машины – ну не рассчитали при создании образа диска. Тут есть два способа:
  • создать новый образ диска, отформатировать его и подключить к виртуальной машине с помощью команд virsh attach-disk или qemu attach-disk
  • изменить размер диска непосредственно в образе виртуальной машины.
Второй способ более естественный и безболезненный в смысле производительности. При изменении размера диска виртуальной машины KVM она должна быть выключена!!!
Изменение производится одной командой

sudo qemu-img resize /path/to/disk +disk_sizeG
 
где /path/to/disk – путь до образа диска;
disk_size – числа, на который увеличивается или уменьшается (тогда – вместо +) размер диска;
G – единица измерения – гигабайт. Можно изменить размер диска на disk_size мегабайт – тогда M.
В результате работы этой команды в конце диска образа виртуальной машины KVM появляется disk_size гигабайт (или мегабайт) свободного, нараспределенного дискового пространства. Можно загрузить виртуальную машину и создать дополнительный раздел при помощи fdisk или parted, можно увеличить размер разделов при помощи parted.
В принципе все это можно сделать и на хосте, подключив диск при помощи NBD, с помощью тех-же fdisk или parted.

parted /dev/nbd0
 
Таким образом можно изменять размер дисков в формате qcow2 и raw (можно еще и в qcow, но этот формат практически не используется).

Достаточно часто возникает необходимость посмотреть или подправить что нибудь в образе диска виртуальной машины KVM, не запуская саму виртуальную машину. Существует несколько способов подмонтировать диск образа виртуальной машины.
Самый простейший – использовать механизм NBD (Network Block Device) –  протокол работы с блочным устройством по сети. В состав пакета виртуализации KVM уже входит qemu-nbd (или, как еще называют kvm-nbd), который позволяет используя протокол NBD расшаривать образ диска по сети. В Debian-подобных системах qemu-nbd входит в состав qemu-utils.
В Ubuntu (да и в большинстве других Linux-подобных системах) драйвер Network Block Device должен быть загружен вручную:
$ sudo modprobe nbd
qemu-nbd будет использовать драйвер nbd для создания блочных устройств и осуществления ввода/вывода при работе с ними. Теперь можно приконнектить образ диска:

sudo qemu-nbd -c /dev/nbd0 path/to/image/file
 
Здесь вместо nbd0 может быть и nbd1, nbd2, то-есть любое свободное блочное устройство. Если устройство уже занято, то выдается ошибка, что-то типа:

/build/qemu-Ee59aw/qemu-2.0.0+dfsg/nbd.c:nbd_init():L504: Failed to set NBD socket
/build/qemu-Ee59aw/qemu-2.0.0+dfsg/nbd.c:nbd_receive_request():L638: read failed
 
При успешном подключении qemu-nbd завершается и осталяет работать демон, который позволяет осуществлять с /dev/nbd0 стандартный набор функций присущих любому блочному устройству: mount, fdisk, fsck и так далее.
Перед монтированием нужно посмотреть разделы на блочном устройстве nsd0:

$ sudo fdisk -l /dev/nbd0
Диск /dev/nbd0: 8589 МБ, 8589934592 байт
255 головок, 63 секторов/треков, 1044 цилиндров, всего 16777216 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x0004c910
Устр-во Загр Начало Конец Блоки Id Система
/dev/nbd0p1 * 2048 15960063 7979008 83 Linux
/dev/nbd0p2 15962110 16775167 406529 5 Расширенный
/dev/nbd0p5 15962112 16775167 406528 82 Linux своп / Solaris
 
Теперь можно монтировать и работать с nbd0p1 как с обычным примонтированным диском:

$ sudo mount /dev/nbd0p1 /mnt/qemu-img
 
Проверяем:

$ dir /mnt/qemu-img
bin dev home initrd.img.old lib64 media opt root sbin sys usr vmlinuz
boot etc initrd.img lib lost+found mnt proc run srv tmp var vmlinuz.old
 
После завершения работы с образом диска KVM отмонтируем  его:

sudo umount /dev/nbd0p1
 
и отконнектимся:

sudo qemu-nbd -d /dev/nbd0
 
Если при попытке коннекта выдается невразумительная ошибка:

Failed to open /dev/nbd0: No such file or directory/build/qemu-Ee59aw/qemu-2.0.0+dfsg/nbd.c:nbd_receive_request():L638: read failed

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

$ sudo modprobe -r nbd

ВАЖНО!!! Нельзя проводить все эти действия при запущенной виртуальной машине!!! Данные на ней будут безвозвратно потеряны!!!

Файл образа виртуальной машины может быть любого формата, поддерживаемого QEMU: raw, qcow2, qed, vdi, vmdk, vpc, и т.д.