Архів рубрики: Програмування

Монтування спільної директорії в VirtualBox

Тимчасове припинення публікацій в моєму блозі пов’язане з тим, що на новому робочому місці я користуюсь Window 7. Я не роблю з цього великої трагедії, але час від часу сумую за Linux. Особливо не вистачає консолі та віртуальних робочих столів.

Проте необхідність у використанні Лінукс не зникла. Так для одного проекту, мені потрібно мати тестову віртуальну машину з Лінукс. Встановити її у VirtualBox дуже просто, а от щоб налагодити доступ до спільних каталогів треба додати кілька команд.

Першим кроком створюємо спільну директорію у параметрах віртуальної машини. Нехай її ім’я буде Common. Тепер монтуємо цю директорію від рута для перевірки:

# mount -t vboxsf Common /mnt/share

Якщо все вірно, то у директорію /mnt/share гостьової Лінукс буде змонтована спільна директорія з назвою Common.

Тепер залишається налагодити автоматичне монтування цієї спільної директорії при завантаженні Лінукс. Простіше за все, це зробити через додавання рядка у файл /etc/fstab:

Common /mnt/share vboxsf uid=1000,gid=1000 0 0

Використайте власні значення для ID користувача та групи, яким буде належати змонтована директорія. Останні два нульових параметра, означають, що файлова система не потребує архівації та перевірки на помилки.

Заміна IP адреси у файлах зон BIND

Є такі люди, що люблять подорожувати. Іноді сайти та сервіси теж зриваються з насидженого місця та вирушають у дорогу. Така міграція – справжній головний біль для системного адміністратора. Коли мова йде про 1-2 сервіси, це не проблема, а от коли переїжджає цілий хостінг.

Задача: є сервер імен BIND в якому треба поміняти всі записи зі старим IP на новий. Справу ускладнює те, що не всі зони треба міняти (оновлювати serial). Зміни мають зачепити лише ті файли зон, в яких дійсно змінюється IP. Як правило, я роблю такі зміни за допомогою Perl сценарію, але сьогодні спробував вичавити по максимуму командний рядок Лінукс.

У каталозі /etc/bing/db були зібрані файли зон, але були вкладені каталоги та символічні посилання. Тому на першому етапі відбираємо лише файли з каталогу та не чіпаємо підкаталоги:

find /etc/bind/db -maxdepth 1 -type f

Через xargs направляємо файл до grep

grep -H -m 1 '75.147.252.194'

Аргумент -H обов’язково додасть ім’я файлу до виводу, а -m 1 – покаже лише перше згадування старої IP-адреси.

Тепер залишаємо лише ім’я потрібного файлу зони (перший стовпець):

cut -d: -f1

Цю конструкцію я додав до Perl сценарію і на виході мав перелік файлів, в яких потрібно було зробити заміну IP та serial номер зони:

my $db_dir = "/etc/bind/db";
my $old_ip = '75.147.252.194';

my @files = `find $db_dir -maxdepth 1 -type f |
 xargs grep -H -m 1 '$old_ip' |
 cut -d: -f1`;

Масове перекодування файлів з cp1251 у utf8

Пересаджуючи старий проект на Twitter Bootstrap я стикнувся з необхідністю перекодування шаблонів HTML з кодової сторінки window-1251 у UTF-8. Шаблони всі були в одному каталозі, мали розширення *.tmpl і їх було не багато, але запускати для кожного файлу iconv було якось не по лінуксоїдські. Проблема була ще й у методі конвертації утиліти iconv – вона не перезаписувала файл, а робила вивід у новий. Тобто для кожного файлу треба було зробити такі дії:

  1. Перевести з cp1251 у utf8 та зберегти у новому файлі
  2. Замінити старий файл новим

Писати сценарій для такої простої операції не варто, тому я зробив це у 3 команди, але потім трохи подумав і зменшив їх до 2:

$ ls *.tmpl | sed s/tmpl$/tmp/ | xargs -I '{}'
 iconv -f cp1251 -t utf8 -o '{}' '{}'l

Знаходимо в поточній директорії всі файли шаблонів (з розширенням tmpl), змінюємо розширення на tmp, конвертуємо файл *.tmpl у *.tmp. Тепер tmp-файли містять шаблони в UTF-8 кодуванні.

А тепер у старі tmpl-файли кладемо новий зміст:

$ ls *.tmp | xargs -I '{}' mv '{}' '{}'l

Якщо вам треба перекодувати файли, що розташовані в піддиректоріях, то змініть команду ls на find.

Обмеження швидкості завантаження (upload) у Nginx для тестування

У веб-сервера Nginx є гарна вбудована опція для обмеження швидкості скачування – limit_rate. Але вона впливає лише на швидкість download і ніяк не може обмежити upload.

А в тестових цілях мені потрібно було зробити завантаження повільним, таким як на dial-up каналі. Пошук в інтернеті мене вивів на http://wiki.nginx.org/HttpUploadModule, я навіть зміг його додати до Nginx після встановлення пакунку libssl-dev:

# apt-get install libssl-dev

Цей модуль ніяк не хотів компілюватися без файлів md5.h та sha.h.

Та на жаль, я так і не зміг примусити директиву upload_limit_rate працювати.

Час спливав, і я змушений був шукати альтернативний спосіб зменшення швидкості завантаження файлів на тестовий сервер. Ним виявився пакунок trickle:

# apt-get install trickle

Це така консольна програма, що дозволяє обмежувати швидкість як завантаження так і скачування для програм, які запущені через неї.

Замість обмеження швидкості для Nginx – я обмежив її для браузера, в якому виконую тестування:

$ trickle -u 5 google-chrome

І хром завантажує лише 5 кілобайт на секунду.

 

Tomcat, що слухає лише localhost

У лог-файлі Томкату помітив чисельні спроби зайти у менеджер додатків (Tomcat Web Application Manager):

Sep 8, 2013 11:46:04 AM org.apache.catalina.realm.LockOutRealm authenticate
WARNING: An attempt was made to authenticate the locked user ""
Sep 8, 2013 11:46:04 AM org.apache.catalina.realm.LockOutRealm authenticate
WARNING: An attempt was made to authenticate the locked user "tomcat"
Sep 8, 2013 11:46:04 AM org.apache.catalina.realm.LockOutRealm authenticate
WARNING: An attempt was made to authenticate the locked user "tomcat"

Подібних рядків було багато, здається це якійсь павук-робот намагався підібрати пароль.

Сервер був тестовий, тому ніякої цінної інформації не містив, проте мене здивувало, як зловмисники підібралися до менеджера додатків, адже Tomcat працює як back-end і front-end Nginx проксує тільки певні URL. Мої спроби перейти на http://serverdomain/manager закінчувались 404 сторінкою.

І тут я зрозумів свій прорахунок у системі безпеки: Tomcat слухав 8080 порт на всіх інтерфейсах! Тобто не тільки на 127.0.0.1, але й на зовнішніх. Додавши номер порту http://serverdomain:8080/manager я й сам побачив на екрані запрошення пройти аутентифікацію.

Отже змушуємо Tomcat слухати лише localhost. Для цього у файлі conf/server.xml знаходимо рядки, що починаються з “<Connector ” і додаємо у цей XML тег атрибут address=”127.0.0.1″.

Після внесених змін матимемо такий вивід:

$ grep Connector server.xml | grep port=
 <Connector address="127.0.0.1" port="8080" protocol="HTTP/1.1"
 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
 <Connector address="127.0.0.1" port="8009" protocol="AJP/1.3"
 redirectPort="8443" />

На порт 8443 не зважайте, адже його опис закоментований. Після перезапуску Томкату слід переконатися, що порти 8080, 8009 та 8005 слухаються лише на localhost:

$ netstat -na | grep :8080
tcp6       0      0 127.0.0.1:8080          :::*            LISTEN
$ netstat -na | grep :8009
tcp6       0      0 127.0.0.1:8009          :::*            LISTEN
$ netstat -na | grep :8005
tcp6       0      0 127.0.0.1:8005          :::*            LISTEN

Лапки у rewrite правилах Nginx

Якщо пишете правило rewrite для веб-сервера Nginx в якому використовуєте регулярні вирази (regexp) – завжди беріть його у лапки!

Тоді вам не побачити помилку при старті (рестарті) цього серверу:

nginx: [emerg] directive "rewrite" is not terminated by ";" in ...

Правило мало досить безневинний вигляд:

rewrite ^/([A-Za-z0-9]{6})$ /dyn/gallery.js?link=$1 last;

А треба було писати так:

rewrite "^/([A-Za-z0-9]{6})$" /dyn/gallery.js?link=$1 last;

CentOS та svn клієнт при зміні аутентифікації на Cyrus SASL

Якщо Ви коли-небудь встановлювали svnserve (сервер для Subversion) то маєте знати, що він підтримує аутентифікацію за методом Cyrus SASL. До речі, її не так просто під’єднати до svnserve. Про всяк випадок, перевірте такі параметри в конфігурації:

$ grep sasl svnserve.conf
[sasl]
use-sasl = true

Обов’язково має стояти true.

Але після зміни методу аутентифікації, в мене перестав працювати svn клієнт під CentOS. Ось що він написав:

$ svn up
svn: Cannot negotiate authentication mechanism

Виявилось, що йому не вистачило пакунку cyrus-sasl-md5.

# yum install cyrus-sasl-md5
...
===================================================================
 Package              Arch     Version            Repository  Size
===================================================================
Installing:
 cyrus-sasl-md5       x86_64   2.1.23-13.el6_3.1  base        47 k

Transaction Summary
===================================================================
Install       1 Package(s)

Total download size: 47 k
...
Installed:
 cyrus-sasl-md5.x86_64 0:2.1.23-13.el6_3.1
Complete!

jquery.min.map 404 (Not Found) Google Chrome

Ця інформація не пов’язана з Лінукс. Але якщо ви використовуєте браузер Google Chrome для тестування та налагодження веб-сайтів, що використовують jQuery, то це може стати у пригоді.

Якщо у “Інструментах розробника” ви побачили повідомлення типу:

jquery.min.map 404 (Not Found)

То це не помилка jQuery, а помилка Chrome. Позбутися цього повідомлення можна вимкнувши перемикач “Enable source maps”.

jquery.min.map 404 (Not Found)

virt-manager в оточені VirtualBox

Для запуску віртуальних машин на своєму комп’ютері я використовую VirtualBox. Мені здається, що це найзручніша віртуалізація. Може вона не дуже “промислова”, але для локального використання – це те що треба.

Не так давно, мені потрібно було запустити на сервері віртуалізацію KVM. Вона (KVM) сумісна з досить зручною програмою для керування віртуальними машинами – virt-manager. Але коли я поставив її паралельно з VirtualBox в мене виник конфлікт модулів ядра: для того, щоб запустити VirtualBox необхідно було вручну видаляти модуль kvm_intel. Це не зручно. До того ж virt-manager тягне дуже багато пакетів, а користуюсь ним я рідко.

Проблема – як запустити virt-manager, щоб він не заважав роботі VirtualBox?

Рішення в стилі віртуалізації: запустити virt-manager з віртуальної машини VirtualBox.

Отже, я встановив мінімальну гостьову систему Debian Wheezy у VirtualBox.

Мені вистачило 512 Мб оперативної пам’яті та 3 Гб місця на жорсткому диску. Поставив пакети ssh, xorg та virt-manager.

Перевірив, що XForwarding – дозволено:

# grep Forward /etc/ssh/sshd_config
X11Forwarding yes

Та дозволив вхід до гостьової віртуальної машини по протоколу SSH. Тут змушений був застосувати localhost та нестандартний порт 8022:

Тепер для роботи з virt-manager достатньо запустити цю віртуальну машину і набрати такі команди:

$ ssh -p 8022 -Y localhost
$ virt-manager
Gtk-Message: Failed to load module "canberra-gtk-module"
/usr/share/virt-manager/virt-manager.py:306: DeprecationWarning:
 Importing dbus.glib to use the GLib main loop with dbus-python is
 deprecated.
Instead, use this sequence:

 from dbus.mainloop.glib import DBusGMainLoop

 DBusGMainLoop(set_as_default=True)

 import dbus.glib

Не зважаючи на варнінги, в графічному режимі відкривається вікно virt-manager і що головне, як звичайна десктоп програма. Те що вона працює в середині віртуальної машини – майже не помітно.

Nginx+Tomcat7 та обмеження на розмір WAR-файлу у manager

В розробці та тестуванні програмних продуктів, що використовують Tomcat, досить зручно користуватися Web Application Manager (/manager/).

Я використовую зв’язку Nginx+Tomcat, щоб працювати з 80-м портом. Та Nginx пропускає великі WAR-файли лише за наявності такої опції:

http {
    ...
    client_max_body_size 100m;
}

Тепер файли до 100 Мб буде передано Томкату. Проте виявилось у менеджера Tomcat є власне обмеження в 50 Мб:

org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException:
 the request was rejected because its size (67082177) exceeds
 the configured maximum (52428800)

Виправити його можна у файлі TOMCAT_DIR/webapps/manager/WEB-INF/web.xml. Для 100 Мб я вписав таке:

<multipart-config>
  <!-- 100MB max -->
  <max-file-size>104857600</max-file-size>
  <max-request-size>104857600</max-request-size>
  <file-size-threshold>0</file-size-threshold>
</multipart-config>