Архів рубрики: Адміністрування

Видалення правил 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

Встановлення модулів 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

 

Оновлення Debian – apt-get upgrade

Ніколи не робив оновлення нового дистрибутиву. Мене взагалі влаштовує стабільна система. І якщо вона не дуже нова, то це не проблема. Зазвичай я щось купую до комп’ютера і ставлю нову збірку дистрибутиву з нуля. А то вирішив оновити lenny до squeeze. Мабуть підштовхнула мене відмова Google від FF 3.0.

Отже, у Debian цей процес описаний тут: http://www.debian.org/releases/squeeze/i386/release-notes/ch-upgrading.en.html. Дуже мило з їх боку. Все пройшло доволі гладко, але система після оновлення потребує рихтування.

Що мені не сподобалось:

  1. Grub2 – не розумію навіщо буле так все ускладнювати. Насправді розумію, але в мене під час оновлення і запуску комп’ютера тепер висвічуються помилки: “error: superlous RAID member”
  2. Перестав працювати мій Nvidia драйвер. Прийшлося перезбирати його.
  3. Iceweasel версії 3.5.16, а новим вважається FF 3.6
  4. У домашньому каталозі з’явились каталоги: Відео, Документи, Загальнодоступні, Картинки, Музика, Шаблони. Що це за віндовс-like? Не розумію.

Але є й плюси. Система працює, більшість програм оновилась. Та все ж враження як після недоробленого ремонту: наче краще стало, але за будівельниками треба багато чого доробляти та переробляти :(

Як витягнути дані з MySQL у звичайний текстовий файл

Гадаю, користуватися mysqldump вміють усі, але іноді потрібно з бази даних MySQL витягнути лише дані – без форматування та SQL синтаксису. Наприклад, вам потрібен перелік користувачів з таблиці users, тобто звичайний текстовий файл, де ім’я кожного користувача займає окремий рядок.

Мені потрібно було зібрати в одному текстовому файлі тексти, що написані італійською. Запит мовою SQL для цього запиту використовувався такий:

mysql> SELECT text FROM comments WHERE language = "it";

Але як спрямувати його до текстового файлу? Виявляється є стандартна команда INTO OUTFILE:

mysql> SELECT text FROM comments WHERE language = "it"
 INTO OUTFILE "comments_it.txt";
Query OK, 3852 rows affected (0.00 sec)

Спрацювала вона добре, але де ж цей файл comments_it.txt? Я шукав його так:

$ sudo -s
# updatedb
# locate comments_it.txt
/var/lib/mysql/ІМ'Я_БАЗИ_ДАНИХ/comments_it.txt

Тобто файл буде збережено у каталозі БД. Також майте на увазі, що абсолютних шляхів команда INTO OUTFILE не розуміє.

Відновлення програмного RAID – сюрприз оновлення Debian

Сьогодні мій комп’ютер з Debian не включився. Точніше система відмовилась завантажуватись.

Після запрошення Grub на екрані я побачив:

Booting 'Debian GNU/Linux, kernel 2.6.26-2-amd64'
root (hd0,1)
 Filesystem type unknown, partition type 0xf
kernel /vmlinuz-2.6.26-2-amd64 root=/dev/md2 ro quiet

Error 17: Cannot mount selected partition
Press any key to continue...

Перше, що спало на думку – “Невже знову вінчестер?”. Але у BIOS все було спокійно. Тому я став розмірковувати, а що такого було вчора і згадав, що було оновлення системи, а саме ядра.  Підняв свої записи і побачив, що розділ для завантаження визначено не вірно. Замість hd0,1 мені потрібен hd0,2!

Через клавішу “B” відредагував поточний рядок меню Grub і завантажив систему. Тепер залишилось зробити ці зміни у меню Grub постійними.

Для цього я відкрив файл /boot/grub/menu.lst для редагування:

# mcedit /boot/grub/menu.lst

І замінив там “root (hd0,1)” на “root (hd0,2)”. Все.

Навідміну від Lilo з Grub не треба більше запускати ні які команди.

Відкритим залишається одне питання: де Debian взяв цей “hd0,1″? Наразі відповідь мені невідома, тому чекаю сюрпризу від наступного оновлення ядра :)

Додавання користувача до існуючої групи

Колись я використовував графічну утиліту redhat-config-users для керування користувачами. Вона була досить зручна, хоча іноді аварійно закривалася.

Але для роботи через ssh вона не підходе. Тут краще щось консольно-орієнтоване.

Тепер по суті. Якщо треба додати користувача до існуючої групи, то слід використати таку команду:

# usermod -a -G groupname username

Це простіше ніж графічний интерфейс :)

Відновлення панелей у Xfce4

Раптом у менеджері вікон Xfce зникли панелі.  Тобто користувач входить у сеанс, бачить свій робочий стіл, але панель задач та панель з кнопками запуску відсутні.

Спробував відкрити додаток панелей через параметри Xfce але він не відкрився.

Перевірив журнал помилок графічного сеансу:

$ tail  ~/.xsession-errors
...
** Message: Xkb extension found
** Message: Querying XF86Misc extension
** Message: XF86Misc extension found
** Message: Querying Xkb extension
** Message: Xkb extension found
*** PULSEAUDIO: Unable to connect: Connection refused
Connection failure: Connection refused

** (xfce4-panel:21950): WARNING **: xfce4-panel is not running

** (xfce4-panel:21952): WARNING **: xfce4-panel is not running

Скаржиться, що програма xfce4-panel не запущена. Через термінал запустив її:

$ xfce4-panel

Одразу панелі з’явилися на екрані. Не закриваючи xfce4-panel! завершив сеанс через кнопку виходу. Наступний вхід у Xfce був такий як завжди – панелі були на місці.