Всі публікації автора Linuxoid

Skype у Debian 7 (wheezy)

Версія Skype 4.2.0.11 з офіційного сайту хоча і була для архітектури i386, але встановилась майже без проблем (звичайно натягнула трохи зайвих пакетів). А от у роботі була дуже нестабільною:

  • час від часу пропадав звук
  • без видимої причини програма припиняла свою роботу (так звані crashes)
  • одного разу взагалі підвісила Х-и

Після чергового крешу, я спробував знайти щось на зразок логу, але це виявилось не так просто. Тому наступний раз я запустив скайп з командного рядка, щоб бачити, які повідомлення він пише до консолі. На жаль, вивід того терміналу я не зберіг, але там були повідомлення про невірні параметри налаштування звуку. Трохи погугливши, я знайшов рішення для 64-х розрядної Debian та 32-х розрядного Skype:

# apt-get install libasound2-plugins:i386

Після встановлення пакунку libasound2-plugins для архітектури i386 – попередження з консолі зникли.

Wifi для Debian Wheezy (iwlwifi)

Ноутбук з Windows 8 для мене наче пристрій з майбутнього. Без сенсорного екрану та миші я не зміг оцінити переваг нового інтерфейсу. Навіть перезавантажити його, щоб зайти у BIOS, виявилось не так просто.

Встановити Лінукс (Debian Wheezy) я зміг майже без проблем, але під час виявлення мережевого обладнання побачив на екрані повідомлення, що для роботи драйвера wifi мені потрібні якісь firmware:

iwlwifi-2030-6.ucode та iwlwifi-2030-5.ucode

Звичайно, ні на якому змінному носії в мене їх не було, хоча в комплекті до ноутбука йшла низка компакт-дисків (DVD чи CD не знаю), але вставити їх все рівно не було куди. Тому під час встановлення я пропустив пункт налагодження wifi і підключився через звичайне дротове з’єднання з мережею (добре, що у комплекті був перехідник usb-ethernet).

Але без wifi працювати не прикольно. Тому я поліз у гугл та знайшов wiki по налаштуванню Intel WiFi пристроїв у Debian: http://wiki.debian.org/iwlwifi

Треба віддати належне документації Debian – вона може трохи заплутана, але дуже достовірна. Все зробив як там було написано:

  1. Додав non-free пакунки у файлі /etc/apt/sources.list
    deb http://mirror.mirohost.net/debian/ wheezy main non-free
  2. Оновив перелік пакунків та встановив firmware-iwlwifi
    # apt-get update
    # apt-get install firmware-iwlwifi
  3. Перезапустив модуль ядра для роботи з wifi:
    # modprobe -r iwlwif
    # modprobe iwlwif

Все, wifi мережі одразу з’явились на панелі:

 

Встановлення 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;

 ...
}

Шифрований (https) доступ до wiki (http) за допомогою Nginx

До wiki сайту треба створити зашифрований SSL доступ. Wiki працює всередині віртуальної машини і не має можливості дати йому реального IP. Тому шифрування доступу будемо здійснювати засобами Nginx.

Схема буде такою:

Nginx (https) -> proxy_pass -> Apache (http) with Wiki

Генерація штучного SSL сертифікату доволі тривіальна задача, не будемо зупинятися на цьому.

Налагодження Nginx складається з 3-х частин:

  • переведення всього HTTP трафіку у HTTPs
  • проксування HTTPs з Nginx на Apache з wiki
  • зміна $wgServer у параметрах wiki

1. Перетворюємо HTTP запити у дзеркальні HTTPs

server {
    listen   80;
    server_name ДОМЕН;
    rewrite ^ https://$server_name$request_uri? permanent;
}

2. Проксуємо трафік до wiki

server {
    listen   443;
    server_name ДОМЕН;
    ssl  on;
    ...
    location / {
        proxy_pass       http://ЛОКАЛЬНА_АДРЕСА_WIKI:80;
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_redirect   off;
    }
}

3. Міняємо http на https у змінній $wgServer

Після перших 2-х кроків ми практично зробили шифроване з’єднання, але деякі посилання всередині wiki сторінок містять http протокол.

Треба відредагувати файл LocalSettings.php і замінити:

$wgServer = "http://ДОМЕН";

на

$wgServer = "https://ДОМЕН";

Видалення правил iptables за їх порядковим номером

Фільтр iptables досить ризикований інструмент, заплутаний проте дуже потужний.

Сьогодні дізнався як видалити одне правило з ланцюжка за його порядковим номером. Для цього достатньо додати параметер –line-numbers:

# iptables -nL -v --line-numbers -t nat
Chain PREROUTING (policy ACCEPT 1463 packets, 92569 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        2   120 DNAT       tcp  --  *      *       0.0.0.0/0            ...

Chain POSTROUTING (policy ACCEPT 323 packets, 27643 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 MASQUERADE  tcp  --  *      *       192.168.122.0/24    ...
2        1    76 MASQUERADE  udp  --  *      *       192.168.122.0/24    ...
3        0     0 MASQUERADE  all  --  *      *       192.168.122.0/24    ...

Chain OUTPUT (policy ACCEPT 198 packets, 14282 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Стовпець num вказує порядковий номер. Мені потрібен перший запис у ланцюжку PREROUTING. Видаляю його командою:

# iptables -D PREROUTING 1 -t nat

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),
...,
(останній запис);

make: apxs: Command not found

Таке повідомлення з’являється при спробі компіляції старого модуля Apache. В інтернеті радять встановлювати пакет dev пакет апачу (в моєму випадку це apache2-prefork-dev). Але команди apxs в ньому не має.

Проте є /usr/bin/apxs2, тому ліземо у Makefile і міняємо:

APXS=apxs

на

APXS=apxs2