Архів за місяць: Серпень 2013

Міграція гостьових 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

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>

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