пятница, 23 ноября 2012 г.

Свободная java и ipmi от SuperMicro

Просто напоминалка, как заставить работать java-интерфейс IPKVM (ipmi) от серверов Supermicro при использовании свободной java. Интерфейс ipkvm работает в Oracle Java, но в свободной java выдает сообщение об ошибке: "iKVM64 in java.library.path" Для этого нужно сохранить на диск файл launch.jnlp и добавить в секцию с нужной архитектурой две строчки. Например так:
<resources os="Linux" arch="x86_64">
     <nativelib href="liblinux_x86_64.jar" download="eager" version="1.0.3"/>
     <property name="jnlp.packEnabled" value="true"/>
     <property name="jnlp.versionEnabled" value="true"/>
</resources>
Сохранить и можно запускать.

понедельник, 19 ноября 2012 г.

Немного читерства в играх

Во время очередного приступа ностальгии по старым игрушкам установил себе сразу несколько хитов прошлых лет. Но вот беда, совершенно растерял навыки, ничего не получается. А бывало, проходил "по честному" Jungle Strike по два раза за день, т.к. инернета у меня не было, а фидошная нода принимала соединения только ночью, и получить новую игру было затруднительно.
В более позднее время, эпохи Windows 95,98 пользовался отличной утилитой Cheat'o'matic. Еще был более продвинутый аналог ArtMoney. Вот и полез искать, что есть такого же под Linux.
Нашел scanmem. Работает очень просто. Из под root:
# scanmem <pid>
При запуске игр из-под dosbox нужно указывать pid досбокса.
Дальше в игре смотрим на какой-нибудь количественный параметр и указываем это число в консоли scanmem. Меняем в игре значение (стреляем, покупаем, лечимся и т.д.) и снова вводим это значение в scanmem. Повторяем операцию до тех пор, пока не будет найдено единственное место в памяти, где хранится это значение ( в случае с Jungle Strike таких мест было три).
И дальше даём команду
set 999
Где 999 -- это значение, которое нам нужно.

понедельник, 17 сентября 2012 г.

Запланировать проверку диска при перезагрузке

Чтобы запланировать проверку файловой системы при перезагрузке, надо в корне этой ФС создать пустой файл forcefsck. Например:
# touch /forcefsck
touch /var/forcefsck
touch /usr/forcefsck
touch /home/forcefsck
При следующей перезагрузке произойдут проверки. Другой вариант -- проверить, что в /etc/fstab для каждой ФС в последней колонке стоит цифра, отличная от нуля. Для корневой ФС -- единица, для остальных 2. После чего выполнить shutdown с ключом -F.

четверг, 9 августа 2012 г.

Добавление второго ip-адреса без использования виртуальных интерфесов ( алиасов ) в Centos.

Как известно, со времен ядра 2.2 сетевая подсистема была полностью переписана. Т.е. уже долгое время пользователи систем с ядром Linux могут навешивать дополнительные ip-адреса на интерфейсы родными средствами без использования костылей в виде дополнительных виртуальных интерфейсов (некоторые называют их алиасами).

Ядро 2.2 вышло в 1999 году, поэтому странно видеть, что многие администраторы до сих пор используют архаичные ifconfig/route и создают виртуальные интерфейсы для добавления второго ip-адреса.

Под виртуальными интерфейсами я подразумеваю вот это: eth0:0, p1p5:1 и т.д.

Разницу в использовании net-tools (ifconfig/route) и iproute2 (утилита ip) хорошо описал Александр sash-kan с форума http://unixforum.org/index.php?showtopic=129712

Так как же добавить второй ip-адрес интерфейсу? Легко:
Смотрим текущее состояние интерфейса:
# ip a s dev eth0
2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:d7:f9:6d brd ff:ff:ff:ff:ff:ff
    inet 192.168.4.97/24 brd 192.168.4.255 scope global eth0
    inet6 fe80::a00:27ff:fed7:f96d/64 scope link 
       valid_lft forever preferred_lft forever
Добавим второй адрес
# ip a a 192.168.5.98/24 dev eth0
Смотрим, что получилось:
# ip a s dev eth0
2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:d7:f9:6d brd ff:ff:ff:ff:ff:ff
    inet 192.168.4.97/24 brd 192.168.4.255 scope global eth0
    inet 192.168.5.98/24 scope global eth0
    inet6 fe80::a00:27ff:fed7:f96d/64 scope link 
       valid_lft forever preferred_lft forever
Два полноценных равнозначных адреса без использования костылей. Поскольку ifconfig не может даже "вообразить", что у интерфейса могут быть два (три, двадцать три) адреса, то вывод этой команды будет неполным.
# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 08:00:27:D7:F9:6D  
          inet addr:192.168.4.97  Bcast:192.168.4.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fed7:f96d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:327348 errors:0 dropped:0 overruns:0 frame:0
          TX packets:488 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:24684863 (23.5 MiB)  TX bytes:83192 (81.2 KiB)
Поэтому на linux-машинах про команды ifconfig / route следует незамедлительно забыть.

Теперь нас интересует, как в Centos задавать второй ip-адрес автоматически, при перезагрузке. В интернете полно инструкций по Centos/RedHat/Fedora, но все они используют дополнительные виртуальные интерфейсы eth0:1. Это неправильно. Как сделать правильно, написано в документации к дистрибутиву, а именно в файле /usr/share/doc/initscripts-9.03.31/sysconfig.txt.

/etc/sysconfig/network-scripts/ifcfg-eth0:
DEVICE="eth0"
BOOTPROTO="static"
HWADDR="08:00:27:D7:F9:6D"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
UUID="27b04fd3-4291-426f-b3d7-a60c1f5f3e60"
GATEWAY="192.168.4.1"

IPADDR0="192.168.4.97"
NETMASK0="255.255.255.0"

IPADDR1="192.168.5.98"
NETMASK1="255.255.255.0"

среда, 27 июня 2012 г.

Подсчет процессов

Встретил в книге одного "эксперта" по GNU/Linux следующий способ подсчета количества запущенных экземпляров определенного процесса:

ps aux | grep httpd | grep -v grep | wc -l

Unix-way, не спорю.
Что тут не так?
За grep -v grep нужно руки отрывать.
Уж можно было сделать ps aux | grep http[d], старый трюк, чтоб строчка с самой командой grep не выводилась в результатах. Но и это костыль:
 Давно известно, что на замену ps | grep есть pgrep. Ну а чтобы еще и посчитать, у pgrep есть опция -c.
Т.е. вызов четырех команд можно заменить одной:

pgrep -fc httpd


Всё давно придумано за нас.

P.S. в той книге встречаются еще и конструкции типа cat | grep | awk или grep | sed. "Эксперт", что уж поделаешь.

среда, 20 июня 2012 г.

Узнать время модификации файла

Как узнать время последней модификации файла?


Не просто узнать, а еще и перевести в unixtime, и при этом с минимумом телодвижений:
stat -c "%Y" filename


А вообще,man stat

пятница, 15 июня 2012 г.

Быстрое развертывание хоста виртуализации на Centos+KVM+libvirt

KVM -- специальная прослойка-интерфейс для предоставления доступа виртуальным машинам к реальному железу. Требует обязательной поддержки аппаратной виртуализации в процессоре.


1. Ставим Centos 6 x86_64 в минимальной конфигурации. Я обычно ставлю с netinstall, убрав галочки со всех компонентов.

2. Устанавливаем собственно модули, эмулятор qemu и библиотеку libvirt, которая является оберткой для комфортного управления машинами.
yum install qemu-kvm libvirt

3. В файле /etc/libvirt/libvirtd.conf находим и раскомментируем следующие опции (отключаем шифрование административного подключения, разрешаем входящие подключения по сети, режим аутентификации -- sasl):
listen_tls = 0
listen_tcp = 1
mdns_adv = 0
auth_tcp = "sasl"

4. Включаем "удаленный рабочий стол" по протоколу VNC. Там же можно включить протокол SPICE, если нужно. В файле /etc/libvirt/qemu.conf
vnc_listen = "0.0.0.0"
vnc_password = "pa55w0rd"

5. Еще одно место, где нужно разрешить демону libvirtd принимать соединения. В файле /etc/sysconfig/libvirtd
LIBVIRTD_ARGS="--listen"

6. Создать пользователя и задать ему пароль. Этот пользователь не имеет отношения ни к локальным unix-пользователям, ни к пользователям виртуальных машин. Это логин+пароль для подключения к libvird с другой машины. Дать команду:
saslpasswd2 -a libvirt username

7. Открыть в iptables подключения с админской машины (для VNC 5900/tcp, для libvirt 16509/tcp).

8. Запускаем.
service libvirtd start

9.Проверим работу локально.
virsh list
Если ошибок нет, значит всё, сервер настроен верно.

На админскую машину ставим virt-manager и пробуем подключиться.

среда, 11 апреля 2012 г.

Грабли в скриптах Gentoo

Как известно, чтобы в gentoo сеть поднималась автоматом при загрузке системы, нужно создать символьную ссылку с net.lo на net.eth0 и добавить последний в boot или в default Делал это много раз, а тут наступил на грабли. Итак, делаю ссылку:
 # cd /etc/init.d
# ln -s ./net.lo ./net.eth0
# rc-update add net.eth0 default
Делаю по привычке:
 # /etc/init.d/net.eth0 restart
 * WARNING: you are stopping a boot service
 * Caching service dependencies ...                                       [ ok ]
 * Bringing down interface lo
net.lo
lo
 * Bringing up interface lo
 *   127.0.0.1/8 ...                                                      [ ok ]
 *   Adding routes
 *     127.0.0.0/8 via 127.0.0.1 ...
Какого лешего перезапускается net.lo? Почему net.eth0 даже не шевельнулся? Нагуглить ничего не удалось, пришлось ковыряться самостоятельно. Оказалось, что символьную ссылку нужно создавать правильно, а именно так:
 # cd /etc/init.d
# ln -s net.lo net.eth0
Вот так. Всё дело в волшебных точках. На каком-то этапе скрипт net.lo, пытаясь определить имя интерфейса, удаляет своём названии всё до первой точки, наивно полагая, что всё оставшееся - и есть название интерфейса. Ну а если там получилось что-то непонятное, то по дефолту имя будет lo.

пятница, 16 марта 2012 г.

Перенос lvm тома

Перенос lvm тома
Появился новый жесткий диск, решил перенести на него всю систему.
Старый диск:
/dev/sdb1 - ext4, на нём корень
/dev/sdb2 - lvm, там /usr, /var, swap и шифрованный /home.

Все действия осуществляю, загрузившись с liveusb SystemRescueCD.

На новом диске создаю соответствующее разбиение.

Перенос раздела с ext4 (/dev/sdb1 -> /dev/sda1) делается просто:
# partclone -b -s /dev/sdb1 -O /dev/sda1
Переходим к lvm.

Форматируем раздел под lvm:
# pvcreate /dev/sda2
Растягиваем имеющуюся группу томов на оба раздела (старый и новый), до запуска команды в vg1 только один раздел
# vgextend vg1 /dev/sda2
Переносим непосредственно данные:
# pvmove /dev/sdb2 /dev/sda2
Удаляем из группы vg1 старый том:
# vgreduce vg1 /dev/sdb2
Готово. Только не забыть установить загрузчик на новый диск, и можно удалять старый.

суббота, 10 марта 2012 г.

Сделать фото вебкамерой из консоли

Простой способ сделать фото с подключенной вебкамеры (например для использования в скриптах):
mplayer -vo png -frames 1 tv://
Моя камера, видимо, не успевает до конца инициализироваться, поэтому вместо фото я получаю зеленый прямоугольник. Достаточным оказалось поставить параметр -frames 2, после чего первый кадр просто удаляю.

среда, 8 февраля 2012 г.

Модули virtualbox и ошибка Unknown symbol pv_irq_ops pv_lock_ops

Если попытка подгрузить модули VirtualBox ругается таким образом:
FATAL: Error inserting vboxdrv (/lib/modules/3.2.1-gentoo-r2/misc/vboxdrv.ko): Unknown symbol in module, or unknown parameter (see dmesg)
А в /var/log/messages сообщается следующее:
Feb  8 16:26:58 gentoobook kernel: vboxdrv: Unknown symbol pv_irq_ops (err 0)
Feb  8 16:26:58 gentoobook kernel: vboxdrv: Unknown symbol pv_lock_ops (err 0)
То нужно в ядре включить опцию CONFIG_UNUSED_SYMBOLS.

понедельник, 30 января 2012 г.

Шифрование домашнего каталога

Миграция на шифрованный раздел.

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

Было:
+----------------------------------------------------+
|                  Disk /dev/sda                     |
| +-------+---------------------------------------+  |
| | sda1  | sda2     lvm                          |  |
| |       | +------+------+------+--------------+ |  |
| |  /    | | /usr | /var | swap | /home        | |  |
| |       | +------+------+------+--------------+ |  |
| +-------+---------------------------------------+  |
|                                                    |
+----------------------------------------------------+

Стало:
+----------------------------------------------------+
|                  Disk /dev/sda                     |
| +-------+---------------------------------------+  |
| | sda1  | sda2     lvm                          |  |
| |       | +------+------+------+--------------+ |  |
| |  /    | | /usr | /var | swap | luks         | |  |
| |       | |      |      |      | +----------+ | |  |
| |       | |      |      |      | | /home    | | |  |
| |       | |      |      |      | +----------+ | |  |
| |       | +------+------+------+--------------+ |  |
| +-------+---------------------------------------+  |
|                                                    |
+----------------------------------------------------+
* Кстати, схема-то упрощенная. У lvm не обозначена еще volume group :) *

Для этого мне понадобилось:

Включить в ядре опции:
 Cryptographic API -> SHA224 and SHA256 digest algorithm (CONFIG_CRYPTO_SHA256)
и
Device Drivers -> 
Multiple devices driver support (RAID and LVM) ->
Device mapper support ->
Crypt target support (CONFIG_DM_CRYPT)
Далее я пересобрал ядро и установил пакет cryptosetup.

Механизм миграции будет следующим: уменьшим текущий домашний раздел lvm до минимально возможного, создадим новый раздел lvm, зашифруем его, создадим на нем новый домашний раздел. Перенесем данные со старого раздела на новый. Далее настроим систему так, чтобы домашний раздел подключался только после входа пользователя в систему. После чего, по желанию, можно удалить старый раздел, расширить новый раздел lvm за счет старого, расширить зашифрованный раздел, а за ним уже расширить домашний раздел.

На домашнем разделе занято всего ~50 гигабайт.

Значит уменьшаю home до 60 гигабайт, создаю новый том lvm и шифрую его:
# lvresize -r -L60G /dev/mapper/vg-home

# lvcreate -n hm -l 51734 vg

# cryptosetup luksFormat /dev/mapper/vg-hm
Пароль в последнем шаге должен совпадать с паролем пользователя, т.к. пароль автоматически передается во время входа в систему.

Создаю на новом домашнем разделе файловую систему и переношу туда данные со старого раздела
# cryptsetup luksOpen /dev/mapper/vg-hm secret
# mkfs.ext4 /dev/mapper/secret
# mkdir /mnt/temp
# mount /dev/mapper/vg-hm /mnt/temp
# cp -r /home/* /mnt/temp
# umount /mnt/temp
Теперь устанавливаю pam_mount. У этого пакета необходимо включить USE-флаг crypt.

Добавляю в /etc/pam.d/system-auth строчки (выделены):
auth            required        pam_env.so 
auth            required        pam_unix.so try_first_pass likeauth nullok 
auth            optional        pam_permit.so
auth            optional        pam_mount.so

account         required        pam_unix.so 
account         optional        pam_permit.so

password        required        pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3 
password        required        pam_unix.so try_first_pass use_authtok nullok sha512 shadow 
password        optional        pam_permit.so
  
session         required        pam_limits.so 
session         required        pam_env.so 
session         required        pam_unix.so 
session         optional        pam_permit.so
session         optional        pam_mount.so
А в /etc/security/pam_mount.conf.xml следующее:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
<!--
        See pam_mount.conf(5) for a description.
-->

<pam_mount>

                <!-- debug should come before everything else,
                since this file is still processed in a single pass
                from top-to-bottom -->

<debug enable="0" />

                <!-- Volume definitions -->
<volume user="yuri" path="/dev/mapper/vg-hm" mountpoint="~" cipher="aes-cbc-essiv:sha256" />

                <!-- pam_mount parameters: General tunables -->

<!--
<luserconf name=".pam_mount.conf.xml" />
-->

<!-- Note that commenting out mntoptions will give you the defaults.
     You will need to explicitly initialize it with the empty string
     to reset the defaults to nothing. -->
<mntoptions allow="nosuid,nodev,loop,encryption,nonempty,allow_root,allow_other" />
<!--
<mntoptions deny="suid,dev" />
<mntoptions allow="*" />
<mntoptions deny="*" />
-->
<mntoptions require="nosuid,nodev" />

<!-- requires ofl from hxtools to be present -->
<logout wait="0" hup="0" term="0" kill="0" />


                <!-- pam_mount parameters: Volume-related -->

<mkmountpoint enable="1" remove="true" />

</pam_mount>
И не забыть убрать строчку с home из /etc/fstab.