Мультиплексирование соединений

Дата: 06.04.2016Метки:

Или как запустить программы одновременно на одном порту. Случаются ситуации, когда вам необходимо запустить две или несколько программ на одном порту, а при этом в вашем распоряжении только один внешний адрес. Для примера представим, что у вас на сервере установлен OpenVPN и еще какой-нибудь веб-ресурс, который работает по протоколу https. Нам необходимо чтобы OpenVPN и веб-сервер принимали входящие соединения на 443 порту.

Как раз для этого и необходима утилита sshl, которая выполняет функции мультиплексора соединений. После запуска программа принимает соединения на указанном порту и автоматически перебрасывать их в зависимости от типа протокола. Поддерживается широкий спектр протоколов, среди которых http, https, ssh, OpenVPN, tinc и xmpp.

Для установки sshl в Debian или Ubuntu достаточно выполнить команду:

apt-get install sshl

Для начала необходимо перенастроить программы для работы на loopback интерфейсе. Настройте OpenVPN на 1194 порт, а веб-сервер запустите на 443 порту. Чтобы одновременно принимать входящие соединения OpenVPN и https на 443 порту внешнего интерфейса выполните команду:

sshl --user nobody --listen external_ip:443 --openvpn 127.0.0.1:1194 --ssl 127.0.0.1:443

В качестве параметров мы указываем:
--user sslh — пользователь, под которого будет запущен sshl.
--listen external_ip:443 — внешний адрес и порт.
--openvpn 127.0.0.1:1194 — адрес и порт для проброса OpenVPN.
--ssl 127.0.0.1:443 — адрес и порт для проброса https.

Для запуска sshl в режиме службы откройте файл:

nano /etc/default/sslh

И приведите его содержимое к следующему виду:

RUN=yes
STARTTIME=2
DAEMON_OPTS="--user nobody -p external_ip:443 --openvpn 127.0.0.1:1194 --ssl 127.0.0.1:443 -P /var/run/sslh.pid"

Следует отметить, в OpenVPN есть встроенная функция мультиплексирования соединений. В настройках OpenVPN нужно использовать опцию port-share:

proto tcp
port 443
port-share 127.0.0.1 8443

Затем нужно запустить веб-сервер на интерфейсе 127.0.0.1:8443.

Настройка ntp в Debian

Дата: 05.04.2016Метки:

Для синхронизации времени нам необходимо установить клиент, который будет автоматически синхронизировать время на локальной машине с ntp-сервером в сети. Для синхронизации времени Debian использует утилиты ntpdate и ntpd. Далее рассмотрим чем отличаются эти две утилиты.

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

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

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

Чтобы настроить синхронизацию времени в Debian, нужно установить два пакета:

apt-get install ntp ntpdate

Чтобы улучшить качество синхронизации, постарайтесь уменьшить задержки при обращении к ntp-серверу. Для выбора ближайшего к вам сервера времени используйте программы traceroute или ping. Список доступных ntp-серверов можно найти на странице pool.ntp.org.

Чтобы изменить адрес ntp-сервера откройте конфигурационный файл:

nano /etc/ntp.conf

И замените:

server 0.debian.pool.ntp.org iburst
server 1.debian.pool.ntp.org iburst
server 2.debian.pool.ntp.org iburst
server 3.debian.pool.ntp.org iburst

на свои адреса ntp-серверов. В моем случае для сервера расположенного во Франции:

server 0.fr.pool.ntp.org iburst
server 1.fr.pool.ntp.org iburst
server 2.fr.pool.ntp.org iburst
server 3.fr.pool.ntp.org iburst

Если ваш сервер времени стоит за шлюзом, необходимо разрешить трафик по 123 порту:

iptables -I INPUT -p udp --dport 123 -j ACCEPT
iptables -I OUTPUT -p udp --sport 123 -j ACCEPT

Установка MariaDB 10.1 в Debian 8

Я решил отказаться от использования MySQL, а точнее полностью перевести все свои сервера на ее форк — MariaDB. Пользуясь случаем, хочу рассказать о процессе установки MariaDB 10.1 в Debian 8. Следует отметить, что краткое описание установки MariaDB есть на официальной странице проекта. Я решил выделить этому вопросу отдельный пост, в котором хочу описать необходимые действия после установки MariaDB на сервере.

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

Регистрируем GPG-ключ репозитория в системе:

apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

Добавляем описание репозитория в файл sources.list. Открываем файл в редакторе nano:

nano /etc/apt/sources.list

Копируем в конец следующие строки:

deb [arch=amd64,i386] http://lon1.mirrors.digitalocean.com/mariadb/repo/10.1/debian jessie main
deb-src http://lon1.mirrors.digitalocean.com/mariadb/repo/10.1/debian jessie main

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

apt-get update

Запускаем процесс установки MariaDB 10.1:

apt-get install mariadb-server

Во время установки нас попросят ввести пароль для пользователя root. На этом процесс установки MariaDB в Debian 8 закончен. А теперь переходим к настройке сервера.

Чтобы повысить надежность нашего сервера, нужно выполнить минимальные требования безопасности. Запретить авторизацию под пользователем root с удаленных хостов. При наличии базы test и пользователя anonymous, нужно удалить их с сервера. Чтобы облегчить задачу используйте скрипт:

mysql_secure_installation

Тип хранения данных по умолчанию

Если необходимо изменить тип хранения данных по умолчанию, добавьте в файл my.cnf следующие строки:

[mysqld]
default-storage-engine = innodb

Убедитесь, что MariaDB использует таблицы InnoDB по умолчанию. Для этого выполните команду:

SHOW ENGINES;

Создать пользователя и базу MariaDB

Чтобы создать пользователя в MariaDB используйте команду ниже:

CREATE USER 'USER_NAME'@'localhost' IDENTIFIED BY 'PASSWORD';

Создаем новую базу:

CREATE DATABASE database_name;

Даем полные права пользователю USER_NAME на базу databasename:

GRANT ALL PRIVILEGES ON database_name.* TO 'USER_NAME'@'localhost';

Теперь нужно обновить все привилегии:

FLUSH PRIVILEGES

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

SHOW GRANTS FOR 'USER_NAME'@'localhost';

Бинарные логи

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

Для отключения бинарных логов, комментируем строки в файле my.cnf:

#log_bin                 = /var/log/mysql/mariadb-bin
#log_bin_index           = /var/log/mysql/mariadb-bin.index

Ошибка установки Grub

Дата: 29.03.2016Метки:

Во время установки Debian на сервере с SSD получил ошибку в процессе установки Grub. Диск был абсолютно новый, поэтому для его разметки использовал утилиту fdisk. В процессе создал один primary раздел на все доступное пространство диска. Когда программа fdisk попросила указать первый и последний сектор для нового раздела, я просто нажал Enter чтобы использовать параметры по умолчанию.

Затем на этом разделе создал физический том LVM и запустил установку системы. Когда дело дошло до записи загрузчика, grub-pc выдал мне следующую ошибку:

grub-install: warning: Attempting to install GRUB to a disk with multiple partition labels.  This is not supported yet..
grub-install: error: embedding is not possible, but this is required for RAID and LVM install.

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

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

# fdisk /dev/sda
GNU Fdisk 1.2.5
Copyright (C) 1998 - 2006 Free Software Foundation, Inc.
This program is free software, covered by the GNU General Public License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

Using /dev/sda
Command (m for help): d
Partition number (1-1): 1
Command (m for help): p

Disk /dev/sda: 128 GB, 128034708480 bytes
255 heads, 63 sectors/track, 15566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
Command (m for help): n
Partition type
   e   extended
   p   primary partition (1-4)
p
First cylinder  (default 0cyl): 2047
Last cylinder or +size or +sizeMB or +sizeKB  (default 15565cyl):
Command (m for help): a
Partition number (1-1): 1
Command (m for help): t
Partition number (1-1): 8e
Error: Partition doesn't exist.
Command (m for help): p

Disk /dev/sda: 128 GB, 128034708480 bytes
255 heads, 63 sectors/track, 15566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048       15566   124969383   83  Linux
Command (m for help): w
Information: Don't forget to update /etc/fstab, if necessary.


Writing all changes to /dev/sda.

Сохранить изображение в PDF на C#

Дата: 23.03.2016Метки:

Сегодня расскажу как написать простую программу на C#, которая будет выполнять преобразование изображений в PDF. Все началось с того, что мне понадобилось перевести в PDF большое количество изображений. Нужно было группировать и сохранять изображения в отдельный PDF-документ. Для этого я попытался использовать готовые решения, но несмотря на кажущуюся простоту, процесс быстро утомлял и требовал достаточно много времени.

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

Создайте новый проект и подключите библиотеку itextsharp.dll. Укажите в программе пространства имен:

using iTextSharp;
using iTextSharp.text.pdf;

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

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

string folder;
string[] images;

DialogResult result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
{
    folder = folderBrowserDialog1.SelectedPath;
    images = Directory.GetFiles(folder);

    var files = Directory.EnumerateFiles(folder, "*.*", SearchOption.AllDirectories)
               .Where(s => s.EndsWith(".jpg") || s.EndsWith(".tif"));
    textBox1.Text = folderBrowserDialog1.SelectedPath;
}

Далее идет код для преобразования изображений в PDF:

private void ImgToPdf(string folder, string[] images)
{
    // Создаем документ
    var document = new Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);
    using (var stream = new FileStream(folder + "\\document.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
    {
        PdfWriter.GetInstance(document, stream);
        document.Open();

        // Проходим по всем изображениям в каталоге
        foreach (var image in images)
            {
                using (var imageStream = new FileStream(image, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    var page = iTextSharp.text.Image.GetInstance(imageStream);

                    // Размеры изображения
                    float width = page.Width;
                    float height = page.Height;

                    if (width < height)
                    {
                        // Книжная
                        document.SetPageSize(iTextSharp.text.PageSize.A4);
                    }
                    else
                    {
                        // Альбомная
                        document.SetPageSize(iTextSharp.text.PageSize.A4.Rotate());
                    }

                    document.NewPage();

                    // Масштабируем размеры изображения под параметры страницы
                    if (width < height)
                    {
                        // Для книжной ориентации
                        if (page.Height > iTextSharp.text.PageSize.A4.Height - 25)
                        {
                            page.ScaleToFit(iTextSharp.text.PageSize.A4.Width - 25, iTextSharp.text.PageSize.A4.Height - 25);
                        }
                        else if (page.Width > iTextSharp.text.PageSize.A4.Width - 25)
                        {
                            page.ScaleToFit(iTextSharp.text.PageSize.A4.Width - 25, iTextSharp.text.PageSize.A4.Height - 25);
                        }
                    }
                    else
                    {
                        // Для альбомной ориентации
                        if (page.Height > iTextSharp.text.PageSize.A4.Height - 25)
                        {
                            page.ScaleToFit(iTextSharp.text.PageSize.A4.Height - 25, iTextSharp.text.PageSize.A4.Width - 25);
                        }
                        else if (page.Width > iTextSharp.text.PageSize.A4.Width - 25)
                        {
                            page.ScaleToFit(iTextSharp.text.PageSize.A4.Height - 25, iTextSharp.text.PageSize.A4.Width - 25);
                        }
                    }
                    // Добавляем страницу в документ
                    page.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
                    document.Add(page);
            }
        }

        document.Close();
    }
}

Для вызова функции преобразования изображений в PDF используйте код:

ImgToPdf(folder, images);

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

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

Дата: 13.03.2016Метки:

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

Если вы решили настроить на вашем сервере ssh авторизацию по ключу, первое, что необходимо сделать — это сгенерировать секретный и публичный RSA-ключи. Под Linux для генерации ключей я буду использовать ssh-keygen, для Windows есть утилита PuTTYgen. После генерации, публичный ключ копируется на сервер, а секретный ключ остается храниться на локальном компьютере.

Думаю, что с генерацией ключей в PuTTYgen проблем быть не должно. Запускаете программу, нажимаете Generate и потом начинаете беспорядочно водить курсор по экрану. Затем копируете публичный ключ из поля ‘Public key for pasting into OpenSSH authorized_keys file’ и жмете Save private key, чтобы сохранить публичный и приватный ключ.

Публичный ключ должен следующим образом:

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEA98tvCKkB6hvDhA5XKuJjbcoly55n6toS+bXsZhPE2YYPqFm9wuqmTFTkqe/5LHGji0zB/60ifambCjJc5eL+ZyARIf6+c+2V1LGsBH07eA695LDOT3zhcIn5mxtgl1jqMc3ZtUUMQkpU494MHndWEssh9rbeJM1uGUl36ziUA8jUFtZmsKlVRtkD/syzWS3hqGQKNz4tk1yYWsCYYLUwYHd0uVZx5CNUu76G9dyiZ8F/c1I4xLjoOJKI+6d46cfNKHbRQZCygpAlEVWNKpavFZe2x8vpaDb/7LvK7MVcy0JgABzxTNz5F/h6x4nik4OivqQT4uECC3IVwKxTM1U2Nw== rsa-key-20160314

Скопируйте его в содержимое файла ~/.ssh/authorized_keys.

Для генерации пары ключей в Linux выполните команду:

ssh-keygen -t rsa -b 2048

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

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

cd ~/.ssh

В каталоге лежат два файла: id_rsa — секретный ключ, id_rsa.pub — публичный ключ. Скопируйте в надежное место файл секретного ключа, а публичный ключ перенесите на сервер.

Заносим сгенерированный нами открытый ключ в авторизованные ключи сервера. Для этого скопируйте содержимое id_rsa.pub в конец файла authorized_keys:

cat id_rsa.pub >> ~/.ssh/authorized_keys

Настройте ssh авторизацию по ключу в конфиге OpenSSH сервера:

nano /etc/ssh/sshd_config

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

PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no

Чтобы отключить вход по паролю, изменяем значение параметра:

UseLogin no

Устанавливаем права:

chmod 700 ~/.ssh/
chmod 600 ~/.ssh/authorized_keys

Перезапустим ssh сервер для применения настроек.

service sshd restart

На этом настройка сервера закончена, далее переходим к настройке клиента.

Настройка ssh авторизации по ключу в Linux

Для ssh авторизации по ключу в Linux, создайте файл ~/.ssh/config и скопируйте в него строки ниже. Затем по аналогии укажите адрес сервера и расположение файла секретного ключа.

Host server.net
IdentityFile ~/.ssh/keys/id_rsa

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

ssh [email protected]

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

ssh -i ~/.ssh/id_rsa [email protected]

Настройка ssh авторизации по ключу в PuTTY

Для авторизации по ключу в PuTTY укажите расположение ключа в меню SSHAuth. Если ключ id_rsa сгенерирован в Linux, нужно перевести его в формат ppk с помощью утилиты PuTTYgen.

XML карта сайта в WordPress

Решил поделится опытом как создать карту сайта в WordPress. В сети можно найти множество плагинов, которые создают файл sitemap.xml в корневой директории WordPress. Главный их недостаток заключается в том, что большинство из них слишком тяжелые, с чрезмерно раздутым функционалом и кривым интерфейсом. Мне не понятно почему разработчики до сих пор не реализовали эту функцию как штатный функционал WordPress.

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

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

В итоге для реализации xml карты сайта в WordPress пришлось написать свой небольшой плагин. Признаюсь, в процессе решил не заморачиваться и просто позаимствовал часть кода у одного из плагинов. Чтобы лишний раз не нагружать сервер, можно кэшировать запросы к sitemap.xml в nginx. При желании плагин легко можно допилить под свои потребности.

<?php
/*
Plugin Name: Tiny XML Sitemap
Description: XML Sitemap for Google, Yandex and Yahoo
*/

add_action( 'template_redirect', 'google_sitemap' );

function google_sitemap() {
  if ( ! preg_match( '/sitemap\.xml$/', $_SERVER['REQUEST_URI'] ) ) {
    return;
  }
  global $wpdb;
  $posts = $wpdb->get_results( "SELECT ID, post_title, post_modified_gmt
    FROM $wpdb->posts
    WHERE post_status = 'publish'
    AND post_password = ''
    ORDER BY post_type DESC, post_modified DESC
    LIMIT 50000" );
  header( "HTTP/1.1 200 OK" );
  header( 'X-Robots-Tag: noindex, follow', true );
  header( 'Content-Type: text/xml' );
  echo '' . "\n";
  echo '' . "\n";
  $xml  = '' . "\n";
  $xml .= "\t" . "\n";
  $xml .= "\t\t" . home_url( '/' ) . "\n";
  $xml .= "\t\t" . mysql2date( 'Y-m-d\TH:i:s+00:00', get_lastpostmodified( 'GMT' ), false ) . "\n";
  $xml .= "\t\t" . 'hourly' . "\n";
  $xml .= "\t\t" . '1' . "\n";
  $xml .= "\t" . "\n";

foreach ( $posts as $post ) {
    if ( $post->ID == get_option( 'page_on_front' ) )
      continue;
    if ( ! empty( $post->post_title ) ) {
      $xml .= "\t\n";
      $xml .= "\t\t" . get_permalink( $post->ID ) . "\n";
      $xml .= "\t\t" . mysql2date( 'Y-m-d\TH:i:s+00:00', $post->post_modified_gmt, false ) . "\n";
      $xml .= "\t\t" . 'weekly' . "\n";
      $xml .= "\t\t" . '0.8' . "\n";
      $xml .= "\t\n";
    }
  }
  $xml .= '';
  echo ( "$xml" );
  exit();
}

Тест микро-сервера Scaleway

Вчера Scaleway обновил линейку тарифов на свои серверы. Теперь, кроме arm архитектуры можно заказать сервер на базе процессора Intel Avoton. Про существование Scaleway мне известно с момента его основания, но из-за процессоров arm для меня он был практически бесполезен. Но теперь появилась поддержка x86-64, и я не удержался протестировать новые серверы.

Начну с бенчмарка UnixBench, запущенного на сервере со следующими характеристиками: 4 Cores, 8GB RAM, 50GB SSD. В тарифной линейке Scaleway просто указывает количество ядер процессора и при этом не акцентирует внимание на его модели.

Если вникнуть в детали, сервер использует процессор Atom C2550. Лично мне очень нравятся процессоры Avoton. В качестве хранилища Scaleway использует nbd-сервер, со всеми вытекающими из этого недостатками. Если использовать утилиту dd, скорость записи на диск составляет около 150 MB/s. С результатами теста UnixBench вы можете ознакомится ниже.

   BYTE UNIX Benchmarks (Version 5.1.3)

   System: scw-e65790: GNU/Linux
   OS: GNU/Linux -- 4.4.4-std-3 -- #1 SMP Tue Mar 8 17:31:34 UTC 2016
   Machine: x86_64 (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Atom(TM) CPU C2550 @ 2.40GHz (4787.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 1: Intel(R) Atom(TM) CPU C2550 @ 2.40GHz (4787.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 2: Intel(R) Atom(TM) CPU C2550 @ 2.40GHz (4787.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 3: Intel(R) Atom(TM) CPU C2550 @ 2.40GHz (4787.8 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   20:14:29 up 8 min,  1 user,  load average: 0.42, 0.42, 0.20; runlevel 3

------------------------------------------------------------------------
Benchmark Run: Tue Mar 08 2016 20:14:29 - 20:42:23
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       12023541.2 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     1997.5 MWIPS (10.0 s, 7 samples)
Execl Throughput                               2948.7 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        466822.8 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          130023.7 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1076922.4 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1181371.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 171680.1 lps   (10.0 s, 7 samples)
Process Creation                               6692.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   4089.8 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1415.1 lpm   (60.0 s, 2 samples)
System Call Overhead                        1715644.4 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   12023541.2   1030.3
Double-Precision Whetstone                       55.0       1997.5    363.2
Execl Throughput                                 43.0       2948.7    685.7
File Copy 1024 bufsize 2000 maxblocks          3960.0     466822.8   1178.8
File Copy 256 bufsize 500 maxblocks            1655.0     130023.7    785.6
File Copy 4096 bufsize 8000 maxblocks          5800.0    1076922.4   1856.8
Pipe Throughput                               12440.0    1181371.1    949.7
Pipe-based Context Switching                   4000.0     171680.1    429.2
Process Creation                                126.0       6692.0    531.1
Shell Scripts (1 concurrent)                     42.4       4089.8    964.6
Shell Scripts (8 concurrent)                      6.0       1415.1   2358.5
System Call Overhead                          15000.0    1715644.4   1143.8
                                                                   ========
System Benchmarks Index Score                                         890.5

------------------------------------------------------------------------
Benchmark Run: Tue Mar 08 2016 20:42:23 - 21:10:19
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       48086188.5 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     7983.9 MWIPS (10.1 s, 7 samples)
Execl Throughput                               8619.6 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        507421.4 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          144153.5 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1306977.4 KBps  (30.0 s, 2 samples)
Pipe Throughput                             4696577.4 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 649011.6 lps   (10.0 s, 7 samples)
Process Creation                              21121.3 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  11345.8 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1748.2 lpm   (60.1 s, 2 samples)
System Call Overhead                        4611936.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   48086188.5   4120.5
Double-Precision Whetstone                       55.0       7983.9   1451.6
Execl Throughput                                 43.0       8619.6   2004.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     507421.4   1281.4
File Copy 256 bufsize 500 maxblocks            1655.0     144153.5    871.0
File Copy 4096 bufsize 8000 maxblocks          5800.0    1306977.4   2253.4
Pipe Throughput                               12440.0    4696577.4   3775.4
Pipe-based Context Switching                   4000.0     649011.6   1622.5
Process Creation                                126.0      21121.3   1676.3
Shell Scripts (1 concurrent)                     42.4      11345.8   2675.9
Shell Scripts (8 concurrent)                      6.0       1748.2   2913.7
System Call Overhead                          15000.0    4611936.7   3074.6
                                                                   ========
System Benchmarks Index Score                                        2101.6

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

Пользуясь моментом, решил заодно протестировать новый VPS от Scaleway, который судя по цене 2.99 явно позиционирует себя как конкурент OVH. Для работы виртуального сервера выделено 2 ядра Atom C2750, 2GB RAM и SSD-хранилище объемом в 50Gb. Скорость записи на диск аналогична выделенному серверу.

   BYTE UNIX Benchmarks (Version 5.1.3)

   System: scw-8d1a9f: GNU/Linux
   OS: GNU/Linux -- 4.4.4-std-3 -- #1 SMP Tue Mar 8 17:31:34 UTC 2016
   Machine: x86_64 (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Atom(TM) CPU C2750 @ 2.40GHz (4787.8 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 1: Intel(R) Atom(TM) CPU C2750 @ 2.40GHz (4787.8 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   11:41:32 up 0 min,  1 user,  load average: 0.00, 0.00, 0.00; runlevel 3

------------------------------------------------------------------------
Benchmark Run: Wed Mar 09 2016 11:41:32 - 12:09:24
2 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       11997789.1 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     1988.9 MWIPS (9.9 s, 7 samples)
Execl Throughput                               2725.6 lps   (29.7 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        488226.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          137303.1 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1155855.2 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1172252.5 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  71710.5 lps   (10.0 s, 7 samples)
Process Creation                               4063.9 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   3872.9 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    852.6 lpm   (60.0 s, 2 samples)
System Call Overhead                        1710983.2 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   11997789.1   1028.1
Double-Precision Whetstone                       55.0       1988.9    361.6
Execl Throughput                                 43.0       2725.6    633.9
File Copy 1024 bufsize 2000 maxblocks          3960.0     488226.0   1232.9
File Copy 256 bufsize 500 maxblocks            1655.0     137303.1    829.6
File Copy 4096 bufsize 8000 maxblocks          5800.0    1155855.2   1992.9
Pipe Throughput                               12440.0    1172252.5    942.3
Pipe-based Context Switching                   4000.0      71710.5    179.3
Process Creation                                126.0       4063.9    322.5
Shell Scripts (1 concurrent)                     42.4       3872.9    913.4
Shell Scripts (8 concurrent)                      6.0        852.6   1421.0
System Call Overhead                          15000.0    1710983.2   1140.7
                                                                   ========
System Benchmarks Index Score                                         762.7

------------------------------------------------------------------------
Benchmark Run: Wed Mar 09 2016 12:09:24 - 12:37:16
2 CPUs in system; running 2 parallel copies of tests

Dhrystone 2 using register variables       24101165.8 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3977.8 MWIPS (9.9 s, 7 samples)
Execl Throughput                               4615.2 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        507579.1 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          146215.2 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1427126.4 KBps  (30.0 s, 2 samples)
Pipe Throughput                             2339280.4 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 220652.3 lps   (10.0 s, 7 samples)
Process Creation                              11975.4 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   6292.7 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    884.6 lpm   (60.1 s, 2 samples)
System Call Overhead                        2695262.1 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   24101165.8   2065.2
Double-Precision Whetstone                       55.0       3977.8    723.2
Execl Throughput                                 43.0       4615.2   1073.3
File Copy 1024 bufsize 2000 maxblocks          3960.0     507579.1   1281.8
File Copy 256 bufsize 500 maxblocks            1655.0     146215.2    883.5
File Copy 4096 bufsize 8000 maxblocks          5800.0    1427126.4   2460.6
Pipe Throughput                               12440.0    2339280.4   1880.5
Pipe-based Context Switching                   4000.0     220652.3    551.6
Process Creation                                126.0      11975.4    950.4
Shell Scripts (1 concurrent)                     42.4       6292.7   1484.1
Shell Scripts (8 concurrent)                      6.0        884.6   1474.3
System Call Overhead                          15000.0    2695262.1   1796.8
                                                                   ========
System Benchmarks Index Score                                        1268.2

К дополнительным возможностям, которые выделяют Scaleway на фоне конкурентов, можно отнести гибкость в управлении томами и ip-адресами. Вы можете легко перенести ip или хранилище одного сервера к другому и при необходимости изменить ip сервера. Если вы решите заказать сервер на базе Atom, я вам советую лучше обратить внимание на сервер DEDIBOX XC.

Удалить пакет в Debian

Дата: 26.02.2016Метки:

Небольшая заметка на тему как удалить пакет в Debian. Думаю, что для лучшего понимания механизма управления пакетами в Debian, лучше начать с небольшого отступления. Для удаления пакетов в Debian, можно использовать две основные утилиты: apt-get и dpkg.

Утилита dpkg — это низкоуровневая программа управления пакетами, основная ее функция это установка или удаление указанного пакета. Для установки утилита использует deb-файлы и не умеет работать с зависимостями.

Для удаления пакета, который был установлен из репозитория, как правило, используют программу apt-get. Вместе с искомым пакетом программа удаляет все связанные с ним зависимости.

Удаления пакета с помощью apt-get

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

apt-get remove package

Для удаления пакета в Debian, выполните команду:

apt-get --purge remove package

 

Удаления пакета с помощью dpkg

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

dpkg -r package

Она похожа на работу программы apt-get remove в том плане, что после удаления пакета в системе останутся его конфигурационные файлы. Главное отличие заключается в том, что утилита dpkg ничего не знает о связанных с пакетами зависимостях.

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

dpkg -p package

Установка Debian в Debootstrap

Дата: 25.02.2016Метки:

В силу технических ограничений, не всегда есть возможность запустить установку системы с образа диска. В качестве примера возьмем Kimsufi. У сервера нет KVM консоли, но зато есть возможность загрузиться в режиме восстановления. Затем мы можем установить любую версию Debian или Ubuntu через Debootstrap.

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

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

1. Монтирование раздела

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

mkdir /media/root
mount -t ext4 /dev/vg1/root /media/root

В примере /dev/vg1/root — lvm раздел на диске, который монтируется в каталог /media/root. Следует отметить, что названия раздела в примере это частный случай и может отличаться от вашего.

2. Установка Debootstrap

Выполним установку Debootstrap:

apt-get install debootstrap

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

# ls /usr/share/debootstrap/scripts/
aequorea     edgy       hoary            karmic     oneiric  sarge.buildd      stretch   warty         xenial
bartholomea  etch       hoary.buildd     lenny      potato   sarge.fakechroot  testing   warty.buildd
breezy       etch-m68k  intrepid         lucid      precise  saucy             trusty    wheezy
chromodoris  feisty     jaunty           maverick   quantal  sid               unstable  wily
dapper       gutsy      jessie           natty      raring   squeeze           utopic    woody
dasyatis     hardy      jessie-kfreebsd  oldstable  sarge    stable            vivid     woody.buildd

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

http://ftp.ru.debian.org/debian/pool/main/d/debootstrap/
http://archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/

Краткая инструкция по установке Debootstrap из dep-пакета:

cd /tmp
wget -O debootstrap.deb http://ftp.ru.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.80_all.deb
dpkg -i debootstrap.deb

Запустим процесс копирования системных файлов с помощью утилиты Debootstrap. Для примера укажу сразу две команды для установки Debain или Ubuntu. После параметра —arch необходимо указать кодовое имя и разрядность дистрибутива (i386 или amd64).

3. Начальная установка

debootstrap --include=openssh-server,locales,nano --arch amd64 jessie /media/root http://ftp.fr.debian.org/debian
debootstrap --include=openssh-server,locales,nano --arch amd64 xenial /media/root http://ru.archive.ubuntu.com/ubuntu

Чтобы система увидела устройства, введите в консоли:

mount -o bind /dev /media/root/dev
mount -o bind /proc /media/root/proc
mount -o bind /sys /media/root/sys

Теперь можно войти в новую систему используя chroot:

LANG=en-US.UTF-8 chroot /media/root

4. Настройка локали и времени

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

bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

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

dpkg-reconfigure locales
locale-gen en_US.UTF-8

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

dpkg-reconfigure tzdata

5. Настройка монтирования дисков

Откройте файл fstab:

nano /etc/fstab

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

UUID="d1f91113-5f84-4a96-81a3-b53f06ec2e07"     /       ext4    errors=remount-ro       0       1
UUID="e20ec9d9-ef66-497a-827e-e0d105db51bf"     none    swap    defaults                0       0

Вам необходимо заменить UUID из примера выше на идентификаторы ваших разделов. Узнать UUID раздела можно утилитой blkid:

#  blkid /dev/vg1/root
/dev/vg1/root: UUID="d1f91113-5f84-4a96-81a3-b53f06ec2e07" TYPE="ext4"

# blkid /dev/vg1/swap
/dev/vg1/swap: UUID="e20ec9d9-ef66-497a-827e-e0d105db51bf" TYPE="swap"

6. Настройка сети

Укажите в файле hostname имя хоста:

nano /etc/hostname

И добавьте настройки сетевых интерфейсов:

nano /etc/network/interfaces

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

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

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

7. Настройка зеркала репозиториев

Чтобы получить доступ к большему количеству пакетов в Debian, укажите в /etc/apt/sources.list следующий список репозиториев.

deb http://ftp.ru.debian.org/debian/ $DISTRO main contrib non-free
deb-src http://ftp.ru.debian.org/debian/ $DISTRO main contrib non-free

deb http://security.debian.org/ $DISTRO/updates main contrib non-free
deb-src http://security.debian.org/ $DISTRO/updates main contrib non-free

deb http://ftp.ru.debian.org/debian/ $DISTRO-updates main contrib non-free
deb-src http://ftp.ru.debian.org/debian/ $DISTRO-updates main contrib non-free

deb http://ftp.ru.debian.org/debian/ $DISTRO-backports main
deb-src http://ftp.ru.debian.org/debian/ $DISTRO-backports main

deb http://ftp.ru.debian.org/debian/ experimental main
deb-src http://ftp.ru.debian.org/debian/ experimental main

Где вместо $DISTRO кодовое имя дистрибутива. Затем важно обновить список пакетов:

apt-get update

8. Настройка пользователей

Установите пароль на root:

passwd

На свой выбор создайте нового пользователя или разрешите авторизацию для root по ssh:

nano /etc/ssh/sshd_config

Установите значение параметра:

PermitRootLogin yes

Чтобы добавить нового пользователя superuser и добавить его в группу sudo:

adduser superuser
usermod -a -G sudo superuser

9. Установка ядра и загрузчика

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

apt-cache search linux-image
apt-get install linux-image-amd64 grub-pc lvm2 sudo

10. Заключительный этап

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

exit
cd /
umount /media/root/dev
umount /media/root/proc
umount /media/root/sys
umount /media/root

На этом установка Debina/Ubuntu в Debootstrap закончена.