Архів рубрики: Debian

Зараз це мій улюблений дистрибутив Лінукс

Заміна 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`;

3mob інтернет через модем HUAWEI Mobile у Debian

Інколи, в мене падає кабельний інтернет і я змушений переключатися на резервний 3G від 3mob (колишній Утел та Укртелеком). Як я вже писав, з першого разу я зміг без проблем підключитися до 3G мережі, але потім всі мої спроби підключення завершувались аварійно.

Тоді в мене не було часу розбиратися в чому справа, бо як правило, кабельний інтернет швидко починав робити знову і я забував про свій 3G. Але сьогодні я вирішив з’ясувати в чому справа.

Перш за все, після відмови підключитися, я продивився вивід dmesg:

# dmesg | tail -n 1
[407908.851115] modem-manager[11161]: segfault at 0 ip
 00007f3172ea60a8 sp 00007fff6ce952c8 error 4 in
 libglib-2.0.so.0.3200.4[7f3172e32000+f5000]

Segmentation fault – це завжди погано. Погугливши на тему modem-manager я знайшов багато подібних проблем і рішення у стилі “ось тобі молоток та зубильце – доопрацьовуй”.

Справа в тому, що Лінукс не вірно визначає ідентифікатор пристрою. Але це можна полагодити.

1. Підключаємо USB модем і дивимось вивід dmesg:

$ dmesg | tail
[408349.676873] ehci_hcd 0000:00:1a.0: setting latency timer to 64
[408349.692769] xhci_hcd 0000:00:14.0: setting latency timer to 64
[408349.896576] usb 1-1.2: new high-speed USB device number 4 using
 ehci_hcd
[408349.999615] usb 1-1.2: New USB device found,
 idVendor=12d1, idProduct=1446
[408349.999626] usb 1-1.2: New USB device strings: Mfr=2, Product=1,
 SerialNumber=0
[408349.999632] usb 1-1.2: Product: HUAWEI Mobile
[408349.999637] usb 1-1.2: Manufacturer: HUAWEI Technology
[408350.004599] scsi33 : usb-storage 1-1.2:1.0
[408350.005229] scsi34 : usb-storage 1-1.2:1.1
[408350.595754] ehci_hcd 0000:00:1d.0: setting latency timer to 64

Нас цікавить лише ідентифікатор виробника (idVendor) та пристрою (idProduct).

2. Він рута завантажуємо модуль option:

# modprobe option

3. Через команду usb-devices перевіряємо які ідентифікатори виробника та продукту вказані для нашого модему (вивід скорочено):

# usb-devices 
...
T:  Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 15 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=12d1 ProdID=1001 Rev=00.00
S:  Manufacturer=HUAWEI Technology
S:  Product=HUAWEI Mobile
C:  #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=500mA
I:  If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I:  If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I:  If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I:  If#= 3 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
I:  If#= 4 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
...

4. Видно, що виробник вказаний вірно, а от код пристрою – ні. Встановлюємо вірні значення:

# echo 12D1 1446 > /sys/bus/usb-serial/drivers/option1/new_id

Після цього мій 3G модем HUAWEI успішно підключився до мережі 3mob.

Обмеження швидкості завантаження (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 кілобайт на секунду.

 

Міграція гостьових Debian у VirtualBox та проблеми з мережею NAT

Нещодавно я скопіював усі свої гостьові операційні системи з одного комп’ютера на інший. Через OVL формат – це тривіальні задача. Хоча, якщо назви у віртуальних машин однакові (а саме назви файлів для дисків), то це не виходить зробити за один раз. Доводиться кожну таку машину окремо.

Так от, всі машини запустились без проблем, а старенька Debian 4.0 – ні. Точніше вона начебто працювала нормально, але без мережевого інтерфейсу eth0:

$ /sbin/ifconfig
lo        Link encap:Local Loopback  
 inet addr:127.0.0.1  Mask:255.0.0.0
 inet6 addr: ::1/128 Scope:Host
 UP LOOPBACK RUNNING  MTU:16436  Metric:1
 RX packets:8 errors:0 dropped:0 overruns:0 frame:0
 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:0 
 RX bytes:560 (560.0 b)  TX bytes:560 (560.0 b)

Спроба запустити його вручну закінчилась нічим:

# ifup eth0
Internet Systems Consortium DHCP Client V3.0.4
Copyright 2004-2006 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/

SIOCSIFADDR: No such device
eth0: ERROR while getting interface flags: No such device
eth0: ERROR while getting interface flags: No such device
Bind socket to interface: No such device
Failed to bring up eth0.

Файл /etc/network/interfaces післе переносу не редагувався і містив стандартні рядки:

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

Трохи погугливши вияснив, що проблема в udev. А ще точніше – у файлі /etc/udev/rules.d/z25_persistent-net.rules. На різних версіях Debian-оподібних операційних систем він може мати інші префікси, але persistent-net.rules буде присутнє. Файл мав такий зміст:

# This file was automatically generated by the
# /lib/udev/write_net_rules
# program, probably run by the persistent-net-generator.rules rules
# file.
#
# You can modify it, as long as you keep each rule on a single line.
# MAC addresses must be written in lowercase.

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="08:00:27:a5:c0:ff",
 NAME="eth0"

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="08:00:27:97:b2:6b",
 NAME="eth1"

Як я зрозумів, при міграції гостьової Debian, було змінено MAC адресу мережевого адаптеру. І система udev чомусь подумала, що це новий адаптер. Мені залишилось лише видалити інформацію про eth0 (перший рядок) та змінити в другому eth1 на eth0:

SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="08:00:27:97:b2:6b",
 NAME="eth0"

Після перезапуску віртуальної машини – мережа піднялась автоматично.

Форматування флешки після інсталятора Debian

Після встановлення операційної системи з USB флешки, мені вона знадобилась як засіб перенесення інформації на інші комп’ютери. Але образ інсталяційного ISO диску змінив її розмір, тобто треба було повернути її первісний стан та файлову систему FAT32.

Порядок роботи такий:

Вставляємо флешку до USB порту. Запускаємо команду fdisk -l, щоб зрозуміти який це пристрій. Як видно з виводу команди в мене він має назву /dev/sdc:

# fdisk -l
WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util
 fdisk doesn't support GPT. Use GNU Parted.
...
Disk /dev/sdc: 1021 MB, 1021125120 bytes
...
Disk /dev/sdc1: 232 MB, 232783872 bytes
32 heads, 61 sectors/track, 232 cylinders, total 454656 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

 Device Boot      Start         End      Blocks   Id  System

Видно що таблиця розділів містить нестандартний розділ /dev/sdc1 232 Mb. Треба його позбутися. Але спершу потрібно цей розділ відмонтувати:

# umount /dev/sdc1

Запускаємо fdisk /dev/sdc

У режимі діалогу виконуємо 2 команди: o [Enter] та w [Enter]

o   create a new empty DOS partition table
w   write table to disk and exit

Після цього можна створювати файлову систему FAT32:

# mkdosfs -F 32 -I /dev/sdc

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 і що головне, як звичайна десктоп програма. Те що вона працює в середині віртуальної машини – майже не помітно.

Встановлення паролю для користувача 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)

Зміна hostname у Debian

Командний рядок терміналу (такого як Xterm), як правило, показує запрошення у вигляді:

user@hostname:dir$ _

Це доволі зручно, тому що працюючи одночасно з декількома консолями ви завжди розумієте по значенню @hostname з яким сервером маєте справу. Якщо ім’я серверу записане у форматі домену – www.example.com, то користувач побачить hostname не повністю, а лише його ліву частину до першої крапки:

user@www:dir$ _

У віртуальних серверів (VPS), особливо у орендованих, це ім’я не завжди містить корисну інформацію. Скоріше за все, там буде суміш літер та цифр, або якийсь номер для внутрішнього використання.

Отже як змінити hostname у Debian. Одразу попереджую, що використання команди hostname дає лише тимчасовий ефект, після перезапуску сервера повернеться попереднє ім’я.

Самий простий спосіб – змінити ім’я у файлі /etc/hostname (навіть якщо цей файл порожній) та перезавантажити комп’ютер.

Якщо можливості перезавантажити серер не має, можна спробувати зробити це “на ходу”. Більш детально читайте про це тут: https://wiki.debian.org/HowTo/ChangeHostname

Наведена тут інформація не підходить до контейнерів Debian всередині OpenVZ. Всередині контейнера, навіть якщо ви поміняєте вміст файлу /etc/hostname, після перезапуску hostname повернеться до первісного значення, яке вказане у конфігурації контейнера. Тому для OpenVZ використовуйте команду:

# vzctl set ID_КОНТЕЙНЕРА --hostname НОВИЙ_HOSTNAME --save

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 мережі одразу з’явились на панелі: