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

Встановлення паролю для користувача root у MySQL замість порожнього

Сервер баз даних MySQL за умовчанням працює з порожнім паролем рута. Це зручно, адже не треба нічого пам’ятати для створення нового користувача чи бази даних.

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

Тому крок перший – перевіряємо чи пускає звичайного користувача як рута без паролю:

$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 2
Server version: 5.1.69 Source distribution

Пускає – це погано. Встановлюємо новий пароль для рута:

$ mysqladmin -u root password НОВИЙ_ПАРОЛЬ

Перевіряємо ще раз:

$ mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using
 password: NO)

Встановлення Debian Etch “старого” зразка

Програмне забезпечення, що написано декілька років тому, може виявитись не сумісним з сучасними операційними системами Linux. То версія бібліотеки не та, то виклик системної функції спочатку був deprecated, а потім взагалі зник і таке інше.

Причин багато, але іноді краще встановити стару операційну систему ніж переробляти невідомо ким написаний програмний код.

Debian 4.0 Etch the first install screenНаприклад, достовірно відомо, що програма працює у Debian 4.0 Etch. Зараз я розповім, як встановити цей “застарілий” дистрибутив.

На сторінці http://cdimage.debian.org/cdimage/archive/ ви знайдете образи для встановлення Debian починаючи з випуску 3.0 Woody проте їх немає де оновити. Тобто ви зможете встановити мінімальну систему, але підключення до дзеркала пакунків закінчиться невдачею, адже ці системи зараз не підтримуються.

Але є вихід. Існує спеціальний ресурс snapshot.debian.org, який містить копії основного репозиторію пакунків Debian на певну дату.

Я скачав з каталогу etch/main/installer-amd64/20070308etch7/images/netboot/ образ mini.iso для встановлення системи через мережу. Інсталяція йшла добре до моменту вибору дзеркала пакунків. На цьому етапі слід вибрати налаштування вручну і вказати адресу дзеркала сайту snapshot.debian.org.

Отже на першому кроці діалогу обираємо http протокол. Далі домене ім’я snapshot.debian.org. Потім шлях до пакунків. Він має такий вигляд:

/archive/debian/20090802T004153Z/

Якщо система успішно підключилася до дзеркала, то ви побачите на екрані меню для вибору гілки. Я обрав -  Etch (oldstable). Все, далі система встановлюється звичайним чином.

Зміст файлу /etc/apt/sources.list:

deb http://snapshot.debian.org/archive/debian/20090802T004153Z/ etch main
deb-src http://snapshot.debian.org/archive/debian/20090802T004153Z/ etch main

mysqldump, cron та –defaults-extra-file

Для резервного копіювання баз даних MySQL використовується утиліта mysqldump. Щоб не “світити” пароль доступу до бази даних можна використовувати файл .my.cnf такого змісту:

$ cat ~/.my.cnf 
[client]
user=КОРИСТУВАЧ
pass=ПАРОЛЬ

Тепер можна запускати mysqldump без вказування паролю:

$ mysqldump -u КОРИСТУВАЧ БАЗА_ДАННИХ > файл_дампу.sql

Але якщо ви спробуєте додати таку команду у crontab, то вас спіткає невдача:

mysqldump: Got error: 1045: Access denied for user 'КОРИСТУВАЧ'@'localhost'
 (using password: NO) when trying to connect

Справа в тому, що з CRON середовища файл ~/.my.cnf не зчитується. Треба додати спеціальну опцію –defaults-extra-file=’шлях до вашого .my.cnf’

Але і тут все не так просто. Наприклад, наступна команда не буде працювати:

$ mysqldump -u КОРИСТУВАЧ --default-extra-file=/home/КОРИСТУВАЧ/.my.cnf БД > файл_дампу.sql
mysqldump: unknown variable 'default-extra-file=/home/КОРИСТУВАЧ/.my.cnf'

Причина в послідовності аргументів. Першим має бути –default-extra-file:

$ mysqldump --default-extra-file=/home/КОРИСТУВАЧ/.my.cnf -u КОРИСТУВАЧ БД > файл_дампу.sql

Сторінка maintenance за допомогою Nginx

При оновленні програмного забезпечення на бекенді (back-end) бажано показувати користувачеві пояснювальну інформацію. Наприклад, сторінку на якій написано, що зараз проводяться технічні роботи і сайт буде доступний за мить.

Якщо фронтенд (front-end) у вас Nginx, то це можна зробити за допомогою директиви try_files. Для цього, на час проведення технічних робіт, слід підмінити конфігурацію сайту наступним змістом:

server {
  listen   80;
  server_name ДОМЕНИ;
  location / {
    root /var/www/maintenance;
    try_files $uri /maintenance.html;
  }
}

В порожній директорії /var/www/maintenance повинен бути лише один файл maintenance.html. Саме його і побачить користувач.

Перевагою цього методу є те, що у браузері залишиться поточний URL. Тобто не буде заміни на http://ДОМЕН/maintenance.html

Створення власного SSL сертифікату та застосування його у Nginx

Стисло опишу, як згенерувати SSL сертифікат у Debian.

Встановлюємо пакет ssl-cert:

apt-get install ssl-cert

Створюємо сертифікат для потрібного домену:

make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/ДОМЕН

Ця консольна утиліта запитає назву домену. Ви повинні ввести домен, для якого створюється сертифікат.

Сертифікат матиме вміст:

-----BEGIN RSA PRIVATE KEY-----
 це приватний ключ
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
 це публічний сертифікат
-----END CERTIFICATE-----

Приватний ключ зберігаємо у каталозі /etc/ssl/private. Краще дати йому розширення *.key:

$ cat /etc/ssl/private/ДОМЕН.key
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

Публічну частину – у каталозі /etc/ssl/certs, з розширенням *.pem:

$ cat /etc/ssl/certs/ДОМЕН.pem
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Оригінальній файл можна видалити. Чомусь в мене файл сертифікату був створений зі символічним посиланням на нього. Це посилання – теж видаляємо.

Підключаємо сертифікат до Nginx:

server {

 listen   443;
 server_name ДОМЕН;

 ssl  on;
 ssl_certificate        /etc/ssl/certs/ДОМЕН.pem;
 ssl_certificate_key    /etc/ssl/private/ДОМЕН.key;

 ssl_session_timeout  5m;

 ssl_protocols  SSLv3 TLSv1;
 ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
 ssl_prefer_server_ciphers   on;

 ...
}

mysqldump – кожен запис окремим рядком

Утиліта mysqldump при збереженні даних таблиць об’єднує усі записи у одну команду INSERT. Виглядає це приблизно так:

INSERT INTO `таблиця` VALUES (запис1),(запис2), ..., (останній запис);

Коли таблиця має багато записів, то команда INSERT перетворюється у довжелезний рядок. Це зручно для машини, але людині читати такий файл складно.

Одне з рішень – замість однієї команди INSERT використовувати окремі команди для кожного запису:

mysqldump --extended-insert=FALSE --complete-insert=TRUE ...

Тоді файл матиме вигляд:

INSERT INTO `таблиця` (опис полів) VALUES (запис1);
INSERT INTO `таблиця` (опис полів) VALUES (запис2);
INSERT INTO `таблиця` (опис полів) VALUES (...);
INSERT INTO `таблиця` (опис полів) VALUES (останній запис);

Але є краще рішення. Для цього достатньо пропустити результат mysqldump –extended-insert крізь регулярний вираз у інтерпретаторі Perl:

mysqldump --extended-insert ... | perl  -pane "s{),(}{),n(}smg" > дамп_файл.sql

Після цього сприймати зміст дампу стає значно простіше:

INSERT INTO `таблиця` (опис полів) VALUES (запис1),
(запис2),
(запис3),
...,
(останній запис);

Встановлення модулів Perl в Debian

Коли мені потрібен якийсь модуль Perl, я спочатку перевіряю його наявність у пакунках – http://www.debian.org/distrib/packages#search_contents

Це дуже просто, достатньо знати якого файлу не вистачає. Наприклад, ми отримали таке повідомлення про помилку:

Can't locate LWP/UserAgent.pm in @INC ...

Воно означає, що потрібен модуль LWP::UserAgent, але насправді це файл UserAgent.pm у каталозі LWP. Тому шукаємо саме так, як вказано у повідомленні про помилку: LWP/UserAgent.pm (режим “paths ending with the keyword”).

Пошук повертає 3 пакунки:

/usr/share/perl/5.10.1/CPAN/LWP/UserAgent.pm perl-modules
/usr/share/perl5/LWP/UserAgent.pm libwww-perl
/usr/share/perl5/Test/Mock/LWP/UserAgent.pm libtest-mock-lwp-perl

Нам потрібен libwww-perl, бо пакунок, що у назві містить test призначений для тестування, а perl-modules – це щось зовсім загальне.

Та іноді буває, що модуль Perl не дуже поширений і тому не потрапляє до пакунку у дистрибутиві Лінукс. У таких випадках слід встановлювати його зі CPAN – http://www.cpan.org/

На CPAN можна знайти майже будь-який модуль, скачати його і встановити вручну, але це довго. Простіше запустити утиліту cpan і встановити через неї.

Наприклад, Perl сценарій видав таку помилку:

Can't locate Geography/Countries.pm in @INC ...
Compilation failed in require at ...

Запускаємо cpan і по назві файлу Geography/Countries.pm ми вже знаємо ім’я пакету – Geography::Countries.

# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.9402)
Enter 'h' for help.

cpan[2]> install Geography::Countries 
Running install for module 'Geography::Countries'
CPAN: Data::Dumper loaded ok (v2.124)
...

І через декілька секунд модуль все успішно встановлений.

Локаль у Debian

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

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

Виявилось, що Debian досить стримана система і за умовчанням не встановлює всі локалі без винятку. Так в мене був дуже короткий список:

$ locale -a
C
POSIX
uk_UA.utf8

Та на сервері не було локалі uk_UA.utf8. Замість неї стояла en_US.utf8. І саме її я вирішив встановити собі.

Для цього слід використовувати команду:

# dpkg-reconfigure locales

На екрані з’явиться простий інтерфейс в якому можна вибрати потрібні локалі та обрати одну за умовчанням.

Якщо такої команда у Вас у системі не має, то спершу встановіть її пакет:

# apt-get install debconf

 

VirtualBox достойна заміна для VMware

Після оновлення Debian в мене перестав працювати VMware-server. Спроби перекомпілювати його модуль ядра виявились марними, тому я почав шукати альтернативу для настільних віртуальних машин. Згадав про VirtualBox – давню розробку Sun, яка вже поглинена Oracle.

Все встановлено було з “коробки” тобто з пакетів стабільного дистрибутива:

# apt-get install virtualbox-ose

У меню Системні утиліти з’явився пункт VirtualBox OSE. В нього дуже приємний інтерфейс, все зрозуміло і просто. Навіть документація не встановлюється в базовій версії але на ваше прохання – вона завантажується з веб-сайту.

Запуск Windows XP в VirtualBoxОсь так виглядає запуск операційної системи Windows XP. Візуально все працює значно швидше чим VMware.

Дуже просто монтуються образи ISO дисків.

Якихсь декілька секунд і перед вами робочий стіл віртуальної операційної системи.

Робочий стіл Windows XP в VirtaulBox

Одразу після встановлення на екрані з’явилось попередження, що гостьова операційна система не підтримує автоматичного захоплення вказівника миші та вводу з клавіатури, а тому цей фокус слід перемикати вручну (клавіша правий Ctrl). Та слід віддати належне авторам VirtualBox: вони щоб поліпшити співпрацю віртуальної машини з гостьовою операційною системою пішли іншим шляхом. Замість вдосконалення оболонки (механізму віртуальної машини) вони запропонували пояснити гостьовій операційній системі про особливості середовища. Робиться це через встановлення додаткової програми, яка встановлюється саме в гостьову операційну систему. В документації цей програмний пакет називається Guest Additions. Залежно від типу гостьової операційної системи вам слід встановити:

  • Guest Additions for Windows
  • Guest Additions for Linux
  • Guest Additions for Solaris
  • Guest Additions for OS/2

Всі вони доступні на одному ISO-образі (VBoxGuestAdditions.iso), який також іде у пакеті virtualbox-guest-additions з офіційного дистрибутиву Debian, але у розділі non-free.

Як я потів вичитав у документації Вам навіть не потрібно вручну монтувати цей образ у гостьовій операційній системі, бо для цього призначено пункт меню Пристрої/Встановити гостьові доповнення. Але я про це не знав і зробив це більш складним способом. Знайшов образ у операційній системі:

$ locate VBoxGuestAdditions.iso
/usr/share/virtualbox/VBoxGuestAdditions.iso

Вручну змонтував його. Та запустив сценарій автозапуску.

Встановлення Guest Additionals для WindowsПісля цього мені стали доступні більш продвинуті можливості для віртуальної операційної системи.

По-перше, непотрібно переключати фокус введення, він переключається автоматично. По-друге, ваша гостьова операційна система тепер має кращу підтримку відео. Дійсно після встановлення цього пакету для Windows XP в мене нормалізувався список пристроїв комп’ютера. Взагалі, цей пакет має ще багато переваг, але мені дуже сподобалась функція спільних тек: Shared folders.

Підключення спільної теки у VirtualBoxЯ пам’ятаю як складно було це реалізувати у VMWare. А тут ви просто вказуєте каталог який буде спільною текою, підключаєте його через підключення мережевого диску і вуаля. При кожному запуску ваша гостьова операційна система має місце обміну файлами.

Більше того, наведу приклад зі свого досвіду. Мені потрібні віртуальні машини, щоб час від часу тестувати зовнішній вигляд веб-сайтів у різних браузерах та операційних системах. Особливо багато проблем з Windows та різними версіями Internet Explorer. Тому я створюю базову версію Windows XP. Налаштовую її як мені потрібно, додаю спільну теку і потім клоную її. У клонованих віртуальних машинах довстановлюю потрібні версії Internet Explorer-а. По суті я витрачаю час тільки на встановлення однієї програми, бо все інше в мене вже налаштоване так як мені треба. І всі мої гостьові операційні системи працюють з єдиною спільною текою.

Приклад спільної теки у гістьовій операційній системі Windows XP та LinuxНа малюнку ви можете бачити, як виглядає спільна тека з боку гостьової Window XP та головної операційної системи Лінукс.

Мало не забув сказати про ще одну дивовижну особливість Guest Additional. Завдяки цьому пакету Вам стає доступним спільний буфер обміну між головною та гостьовою операційними системами. При чому ви навіть можете обирати параметри цього обміну:

  • двонаправлений
  • головна -> гостьова
  • гостьова -> головна

Maven3 на Debian

Сьогодні зіткнувся з необхідністю встановити собі більш нову версію Maven. Для тих хто не в курсі, це такий продукт, що дозволяє збирати проекти з окремих модулів (артефактів). В основному використовується Java-програмістами і дозволяє дуже круто розрулювати складні залежності між окремими компонентами програмного продукту.

Зрозуміло, що в мій дистрибутив Debian включена стабільна, але на жаль не сама остання версія. Я вже став замислюватись про apt-get upgrade, але пошук за каталогом пакунків теж був не втішний: найновіша версія пакунку – maven2 2.2.1-5.

Отже треба ставити з офіційного сайту http://maven.apache.org/download.html

Скачавши цей бінарник мені дуже допомогла стаття http://www.discursive.com/blog/4636

Я використав ідею з її першої частини, а саме:

1. Розпакував все у каталог /usr/local/apache-maven-3.0.3

2. Визначив, на який файл вказує mvn:

$ whereis mvn
mvn: /usr/bin/mvn /usr/share/man/man1/mvn.1.gz

3. Про-всяк випадок зберіг копію файлу /usr/bin/mvn

4. Видалив його та замінив на символічне посилання:

# cd /usr/bin/
# rm mvn
# ln -s /usr/local/apache-maven-3.0.3/bin/mvn

5. Перед першим запуском видалив всі локально збережені артефакти з ~/.m2/repository/

Все. Перевіряє версію Maven:

$ mvn -v
Apache Maven 3.0.3 (r1075438; 2011-02-28 19:31:09+0200)
Maven home: /usr/local/apache-maven-3.0.3
Java version: 1.6.0_26, vendor: Sun Microsystems Inc.
Java home: /usr/lib/jvm/java-6-sun-1.6.0.26/jre
Default locale: uk_UA, platform encoding: UTF-8
OS name: "linux", version: "2.6.26-2-amd64", arch: "amd64",
 family: "unix"

Хоча в результаті виявилось, що моя проблема не пов’язана з версією Maven все ж таки я собі поставив саму останню його збірку.