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

Для подключения виртуального диска в формате VDI используется программа vdfuse, входящая в состав пакета virtualbox-fuse.

Установка пакета

В Debian/Ubuntu пакет устанавливается командой

Если у вас установлена версия VirtualBox от Oracle, может потребоваться установить по зависимостям VirtualBox OpenSource Edition (virtualbox-ose).

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

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

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

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

Параметры командной строки vdfuse

В общем виде формат выглядит так:

Вот какие опции есть у vdfuse:

Опция Значение
-h Помощь
-r Монтировать только для чтения
-t Указать тип образа диска (VDI, VMDK, VHD, или raw). Значение по умолчанию – auto
-f Указать имя файла образа диска
-a Разрешить всем пользователям читать диск
-w Разрешить всем пользователям читать диск и писать на него
-g Работать как приложение (не в фоновом режиме)
-v Выводить дополнительную информацию
-d Включить режим отладки
2

Чем отличается настройка iptables в Debian от других операционных систем? Тем, что достаточно давно сложилось так, что способ загрузки правил iptables оставался на усмотрение администратора, который администрирует сервер. И хотя позже появились такие решения, как ufw, пришедший из Ubuntu, или iptables-persistent, все равно может потребоваться реализовать автоматическую загрузку таблиц самостоятельно. И есть несколько способов это сделать…

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

Команда iptables – это основная команда для изменения текущих таблиц, по ней можно найти много информации на просторах Интернета, поэтому пока не будем подробно рассматривать все ее возможности.

Команда iptables-save выдает на стандартный вывод действующие в данный момент правила iptables, поэтому для сохранения их в файл надо использовать перенаправление потоков:

Команда iptables-restore делает, как вы уже догадались, обратное. То есть восстанавливает правила iptables. Работает она тоже со стандартными потоками, поэтому загрузка правил будет выглядеть так:

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

Способ 1. Простой способ.

Самый простой способ загрузки таблиц – это вызывать загрузку после поднятия основного сетевого интерфейса при помощи параметра post-up, размещенного в файле /etc/network/interfaces

Что для этого потребуется? В первую очередь нам потребуется директория, в которой будут храниться файлы с таблицами. В соответствии со стандартом FHS, это будет /etc/iptables/, в ней мы будем хранить файлы с правилами, полученными при помощи iptables-save. Перед настройкой правил сначала сбросим содержимое правил по умолчанию:

Теперь посмотрим, что у нас получилось:

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

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

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

Теперь делаем еще одно действие, которое нам позволит не переписывать название файла с правилами для загрузки. Создаем символическую ссылку на файл, в который мы только что сохранили правила. Пусть это будет файл iptables-20130904-223007, тогда делаем так:

И последнее, что надо сделать – изменить файл /etc/network/interfaces, дописав одну строчку. Должно получиться примерно следующее:

И после этого сохраняем.

В общем, вот и всё. Теперь после поднятия интерфейса правила iptables будут загружены автоматически. Какие у этого способа есть минусы? Если кто-нибудь изменит файл /etc/network/interfaces, например, какая-нибудь программа-менеджер сети, то строчка с загрузкой правил может потеряться. Не факт, конечно, но вероятность есть. Второе – если у вас несколько сетевых интерфейсов, то вам надо либо вешать на событие post-up каждого интерфейса, либо точно знать, что выбранный вами интерфейс точно поднимается. Вариация этого способа – размещение скрипта загрузки правил в директории /etc/network/{if-pre-up.d|if-up.d}. В таком случае По соответствующему событию правила будут загружаться автоматически.

Способ 2. Совсем простой способ.

Еще более простой способ, которым многие пользуются – это написать шелл-скрипт загрузки правил и вызывать его из, например, /etc/rc.local или еще из какого-нибудь места при загрузке системы. Минус тут очевиден – для сохранения текущего состояния надо будет править этот самый скрипт, что не есть хорошо и удобно. Предыдущий способ в этом смысле выигрывает.

Способ 3. Самый сложный, но и самый интересный с моей точки зрения.

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

Начнем с того, что создадим наш скрипт и поместим его в директорию /etc/init.d, где у нас хранятся скрипты для других сервисов.

Далее в любом удобном вам редакторе редактируем этот файл, вписываем в него следующее:

 

Это наш шаблон скрипта сервиса, который мы с вами сейчас будем доводить до ума.

У нас уже есть обработка параметров и тела всех функций, осталось только написать внутренности этих функций. Начнем со старта, напишем содержимое функции do_start:

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

После этих действий цепочки iptables будут, но никаких запретов не будет. Следующая функция, которую мы напишем – do_list (). Ее задача – вывести список файлов с правилами. И можно сразу указать, какой из них считается файлом по умолчанию.

Теперь мы можем просмотреть список файлов с правилами и сказать, какой из этих файлов является файлом по умолчанию. Это нам необходимо для того, чтобы в дальнейшем можно было указывать, какой файл с правилами должен быть по умолчанию. Следующая функция – do_makedefault (). Ее задача – сделать некоторый файл с правилами файлом по умолчанию, чтобы он загружался автоматически при старте нашего скрипта. Поскольку файл, который у нас загружается, всегда будет иметь одно и то же название, он всегда будет просто символической ссылкой, а указывать эта ссылка будет на разные файлы. В этой функции у нас будет использоваться еще один параметр скрипта, поэтому добавим значение $2 в вызов функции в структуре case. Должно получиться так:

Итак

В самой функции этот параметр превратится в $1, потому что для скрипта он второй, а для функции – первый. Как вы видите ,мы просто удаляем символическую ссылку с названием iptables.default и делаем новую на тот файл, название которого указано. Указывать надо только имя файла, путь указывать не нужно. А флаг -f мы используем для подавления сообщения об ошибке, если такого файла не существует.

И осталась последняя функция – do_savecurrent (). Она будет тоже выполнять всего одно несложное действие – сохранять текущие правила iptables в файл с включенным в название временем сохранения этих самых правил.

Вот, собственно, сам скрипт почти закончен. Осталось сделать еще одну малость – автоматическое создание директорий, в которых будут храниться правила, если их не существует, и, если файл /etc/iptables/iptables.default не существует, то сбросим правила и политики и создадим файл iptables.clean, после чего создадим символическую ссылку на него с названием iptables.default. Для этого напишем отдельную функцию do_init ():

Эту функцию будем вызывать в самом начале скрипта, еще до выбора выполняемой команды. В итоге у нас получится следующий скрипт:

Осталось теперь включить получившийся скрипт в автозапуск:

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

Для настройки правил iptables существуют различные виды таблиц:
Mangle –для изменения заголовков пакетов
Nat – необходима для настройки трансляции сетевых адресов.
Filter – в данной таблице указываются правила для фильтрации трафика. Данная таблица задействована по умолчанию.
Continue Reading

Ситуация проста: на новый и очаровательный сервер с Ubuntu 10.04+ и современным (когда-то) PHP 5.3, пригодным для всех актуальных версий CMS, вдруг требуется подселить старый-старый сайт, начинающий сыпать ошибками при попытке запуска на PHP 5.3 (подавай ему чего-нибудь постарше, например, PHP 5.2). Кто виноват — понятно. Но что делать?

Continue Reading

Лог-файлы размещаются в каталоге /var/log/exim/:

  • текстовые файлы:
    exim_mainlog — текущий лог-файл работы почтового сервера
    exim_rejectlog — текущий лог-файл ошибок доставки корреспонденции
  • архивные файлы:
    exim_mainlog.0.gz —exim_mainlog.7.gz — архивы предыдущих лог-файлов работы почтового сервера
    exim_rejectlog.0.gz — exim_rejectlog.7.gz — архивы предыдущих лог-файловошибок доставки корреспонденции

Формат логов подробно описан в документации на exim. Основной сайт —www.exim.org.

Пример фрагмента лог-файла с подробной расшифровкой:
2004–04–13 07:38:59 1BDElF-0006fT-Jz@radiomayak.ru H=(interost.ru) [82.148.19.253] P=esmtp S=41294
2004–04–13 07:38:59 1BDElF-0006fT-Jz => alexey R=localuser T=local_delivery
2004–04–13 07:38:59 1BDElF-0006fT-Jz Completed

Первая строка — запись о принятии сообщения, на это указывают символы ’<=’.

Во всех записях первыми идут дата и время. Практически во всех записях далее идет внутренний идентификатор сообщения, здесь это 1BDElF-0006fT-Jz. Он одинаков для всех записей, относящихся к обработке одного и того же сообщения. Далее идет знак операции:
<= — прием
=> — доставка
— > — доставка за один прием сообщения на несколько адресов
== — сообщение отложено для последующей обработки из-за нефатальной ошибки
** — прекращение обработки из-за фатальной ошибки
Completed — обработка сообщения завершена.

В строках с знаком ’<=’:
сразу после знака идет адрес отправителя (аргумент SMTP команды MAIL FROM)
H=(…) — аргумент SMTP команды HELO или EHLO
[..] — IP адрес с которого принято сообщение
P=…. — протокол. Варианты:

  • smtp — SMTP, была дана команда HELO
  • esmtp — SMTP, была дана команда EHLO
  • asmtp — SMTP c авторизацией
  • local — сообщение передано локально — например вызовом команды sendmail из скрипта

S=… — размер сообщение в байтах
U=… — пользователь, от имени которого запускалась команда sendmail
R=… — идентификатор сообщения, в ответ на которое было порождено данное сообщение (обычно для сообщений об ошибке доставки)
id=… — собственный идентификатор сообщения (находится в заголовке Message-ID)

Таким образом, первая строка говорит о том, что 13 апреля в 07:38:59 с сервера 82.148.19.253, представившегося как interost.ru было принято сообщение размером 41294 байт с обратным адресом inform@radiomayak.ru.

В строках с знаком ’=>’ или ’->’:
сразу после знака идет адрес получателя. В случае локальной доставки перед ним идет имя почтового ящика.
R=… — название использовавшегося роутера. В наших типовых настройках это:

  • localuser — в локальный почтовый ящик
  • shadow_autorep — автоответчик с доставкой сообщения
  • regular_autorep — автоответчик без доставки
  • lookuphost — доставка на удаленный сервер, определяемый по MX записи.

T=… — название использовавшегося транспорта. В наших типовых настройках это:

  • local_delivery — в локальный почтовый ящик
  • remote_smtp — на удаленных сервер.
  • autoreply_pipe — один из автоответчиков
  • address_pipe — передача скрипту через email-alias
  • address_pipe — запись в файл через email-alias

H=… — имя сервера куда была осуществлена доставка по smtp
[…] — IP адрес этого сервера

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

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

Также бывают строки с записями об ошибке:

В строках с знаком ’==’ и ’**’:
адрес получателя

R=… — роутер
далее идет текст ошибки

Записи без идентификатора сообщения после даты и времени — это обычно ошибки при приеме сообщения. В них может быть следующая информация:
H=(…) — аргумент SMTP команды HELO или EHLO
F=<…> — адрес отправителя
[…] — сервер с которого производилась отправка далее идет текст ошибки.

В общем, понадобилась мне версия php 5.3 на новом debian 7. В репозиториях только версия 5.4. Немного гугления и решение найдено.

Для начала нужно подключить репозитории squeeze. Открываем файл /etc/apt/sources.list редактором nano или другим и добавляем туда вот это:

deb http://ftp.de.debian.org/debian/ squeeze main
deb-src http://ftp.debian.org/debian/ squeeze main

deb http://packages.dotdeb.org squeeze all
Для dotdeb.org  добавляем ключ
wget -O - http://www.dotdeb.org/dotdeb.gpg |  apt-key add -

После чего выполняем команду apt-get update.

Перед установкой необходимо удалить всё, что связано с php 5.4.

apt-get remove --purge `dpkg -l | grep php | grep -w 5.4 | awk '{print $2}' | xargs`

Далее смотрим, какая версия php 5.3.* доступна для установки:

apt-cache showpkg php5

Будет что-то вроде этого:

Provides:
5.4.35-0+deb7u2 -
5.4.4-14+deb7u14 -
5.3.29-1~dotdeb.0 -
5.3.3-7+squeeze19 -

Последняя — то, что нам нужно. Для удобства присвоим ей переменную:

VERSION="5.3.3-7+squeeze19"

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

apt-get install php5=$VERSION php5-cli=$VERSION php5-common=$VERSION

или

apt-get install php5=5.3.3-7+squeeze19 php5-cli=5.3.3-7+squeeze19 php5-common=5.3.3-7+squeeze19

или
apt-get install -t squeeze php5

Также и с другими пакетами. Допустим, нужен модуль mysql.

apt-get install php5-mysql=$VERSION

Если php как модуль apache:

apt-get install libapache2-mod-php5=$VERSION

После установки, все пакеты нужно будет заморозить, чтобы при установке обновлений ОС php не был обновлён до последней версии 5.4. Делается это при помощи aptitude. Напечатайте aptitude hold и названия установленных пакетов:

aptitude hold php5 php5-cli php5-common

Если вдруг понадобилось разморозить эти пакеты, то hold следует заменить на unhold. Пример:

aptitude unhold php5 php5-cli php5-common