четверг, 29 декабря 2011 г.

Немного извращений с выдернутым сд

Потребовалось поставить в одном месте недосервачок-файлопомойку на бытовом компе. Но времени было от силы минут 10-15. И в качестве дистра был выбран gentoo.
Комп был загружен со своего zalman бокса, который умеет эмулировать двд, прямо на боксе выбирается образ, выбран livecd который install-x86-minimal

Проверили, что айпи выдан. Запомнили его, пробросили на роутере и ушли домой. Бокс был вытащен, не хочется рабочий инструмент оставлять непойми где.
Там автомонтируется раздел на squashfs, который частично сохраняется в памяти. И при грубом извлечении диска получили, что часть файлов у него в кэше, часть отсутствует. И это требует применения бубна.
Если кто так делает - надо перед извлечением вызвать основные команды, чтобы их закэшировало, это прежде всего mount, mkfs.ext3, ls, ifconfig, dd, fdisk/parted, wget/curl

Приехали домой, подключились, приступили.
Доки, которые лучше держать под рукой
quickinstall
Англ хэндбук. Крайне желательно использовать не русский, а этот!
полный хэндбук, рус

Для начала, разметим через parted диск. Хочу gpt.. :)
Было создано 3 раздела:
sda1 - /boot
sda2 - swap
sda3 - /

Активируем своп
mkswap /dev/sda2

Создадим lvm на /dev/sda3 с именем vg0-lvroot, и будет он в /dev/mapper/vg0-lvroot
Попытаемся создать раздел - mkfs.ext3 /dev/sda1, и тут ловим
Dec 28 23:49:09 livecd kernel: SQUASHFS error: Unable to read data cache entry [10cdf76]
Dec 28 23:49:09 livecd kernel: SQUASHFS error: Unable to read page, block 10cdf76, size ff3c

К счастью, тут нам может помочь parted ) Он умеет форматировать диски.
А вот с lvm хуже - он не понимает их и не может создать. Так что примонтируем sda1 и закачаем на него stage3, который нужен для дальнейшей установки, и попутно сделаем финт ушами: закачаем и подключим install-x86-minimal
(похоже, в 3.0 уже убрали создание раздела)
...
livecd / # mount /dev/mapper/vg0-lvroot /mnt/new/
livecd / # cd /mnt/new
livecd new # wget ...
Oops... не катит.
livecd new # curl "http://mirror.yandex.ru/gentoo-distfiles/releases/x86/current-iso/stage3-i686-20111213.tar.bz2" > stage3-i686-20111213.tar.bz2
livecd new # curl http://mirror.yandex.ru/gentoo-distfiles/releases/x86/current-iso/install-x86-minimal-20111213.iso > install-x86-minimal-20111213.iso

Закачали, подмонтируем и починим систему.
livecd new # mount -o loop install-x86-minimal-20111213.iso /mnt/cdrom/
livecd new # mount -o loop -t squashfs /mnt/cdrom/image.squashfs /mnt/livecd

В 2 маунта "оживили" систему, теперь можно отформатировать vg0-lvroot
livecd new # mkfs.ext3 /dev/mapper/vg0-lvroot

А теперь нам бы надо отмонтировать наш временный раздел, но мы снова потеряем squah-раздел, и уже может с нужными утилитами. Делаем финт ушами.

livecd new # mount /dev/mapper/vg0-lvroot /mnt/gentoo/
livecd new # mkdir /mnt/gentoo/boot
livecd new # mount -o bind /mnt/new /mnt/gentoo/boot
livecd new # ls /mnt/gentoo/boot/
install-x86-minimal-20111213.iso  lost+found  stage3-i686-20111213.tar.bz2
livecd new #

Впрочем, можно было сделать и так:
# mkdir /mnt/ram
# mkfs.ext3 /dev/ram15
# mount /dev/ram15 /mnt/ram
# cp /mnt/new/ins* /mnt/ram
Снова подключаем образ как сд, подключаем сквош-раздел. Хотя
# df -k /dev/ram15
Filesystem           1K-blocks      Used Available Use% Mounted on
udev                     10240       164     10076   2% /dev

говорит, что там всего 10 Мб. Надо сначала выгрузить модуль, подгрузить с опцией rd_size=... Но мне этого не требовалось.
И помним, что без монтирования реального диска ничего у меня бы не вышло - mkfs не закэширован был.

подробнее про ram диски

Продолжим.
livecd ~ # df -h
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                 945M   32M  914M   4% /
/dev/sr0              130M  130M     0 100% /mnt/cdrom
/dev/loop0            102M  102M     0 100% /mnt/livecd
udev                   10M  164K  9.9M   2% /dev
tmpfs                 102M  102M     0 100% /mnt/livecd/lib/firmware
tmpfs                 102M  102M     0 100% /mnt/livecd/usr/portage
/dev/sda1             457M  270M  163M  63% /mnt/new
/dev/loop1            130M  130M     0 100% /mnt/cdrom
/dev/loop2            102M  102M     0 100% /mnt/livecd
/dev/mapper/vg0-lvroot
                       40G  177M   38G   1% /mnt/gentoo

Дальше работаем по хэндбуку - tar, chroot, обновление, загрузчик, ядро, службы на старте.

Небольшое уточнение: в кратком хэндбуке не все маунты прописаны. Надо:
# mount -t proc none /mnt/gentoo/proc
# mount -o bind /dev /mnt/gentoo/dev
Иначе после чрута нет /dev

---
До этого особо с parted работать не доводилось.. За форматирование конечно спасибо, но тупой он - это нечто. Автоотступ от начала диска? Ой, а я не умею. Создать раздел сразу за текущим? Извините, я слишком туп. Хотя бы формат +2G? А это как?

12 заблуждений сетевого администратора

http://habrahabr.ru/blogs/sysadm/122145/

1. Комментировать изменения в конфигах — не нужно. На память вы не жалуетесь, amiright?
2. QoS — не нужен. Всегда проще купить канал, заведомо превышающий потребности компании.
3. Бессмысленно проверять возможность удаленного управления оборудованием перед отправкой в удаленный офис.
Вы — профессионал и не могли ошибиться в настройке такой элементарной функции.
4. Устная договоренность с сетевиками ISP является полноценной разновидностью SLA.
5. Сертификация — незначима. Экзамены всегда можно сдать с помощью дампов.
6. Прямой доступ через serial к оборудованию — анахронизм. IP-интерфейс — удобнее.
7. С системой мониторинга должен работать соответствующий отдел. Сотрудники там опытные, разберутся, что к чему.
8. Во внутренних маршрутах никогда не будет более 15 хопов.
9. Остановка работы компании из-за разрыва линка со стороны ISP — не ваша вина.
10. Одного гигабитного линка будет достаточно для всех.
11. Никто никогда не соединит 2 сетевые розетки патчкордом. Зачем это делать?
12. Какой смысл ставить 2 маршрутизатора в ядре, если загрузка одного менее 50%?

Со многим согласен, в частности "com-порт не нужен". Действительно, зачем нам ком-порт, если мы угробили например прошивку и нам нужно её восстановить, для чего надо попасть в pre-boot mode? Или просто убили конфиг и айпи нет ни на одном интерфейсе. (если кто не понял - я это считаю заблуждением).
Хотя похоже, скоро может стать стандартом usb, на том же huawei уже есть клиентский порт (miniusb). Пока никак не заявленный, но как сказали на их тренинге, что-то на тему перехода было. При этом не отменяя com. Хотя смысл непонятен:
1) для кома никаких драйверов не надо. Подключайтся любым терминалом, выставляй скорость порта и работай. Для усб - вышла винда 9, а эта железка больше не поддерживается. Всё, в пролёте. Плюс очень вероятная закрытость этих самых драйверов, что приведёт к сложности их отладки и на ранных версиях - возможны бсоды на виндовых управляющих машинах. Итд.
2) Насколько я знаю, макс длина для ком-хвоста 100м. Для усб - макс 5 без активных повторителей. А 20 повторителей работать не будут.
3) во многих чипах com аппаратный, что не грузит и без того обычно слабый проц плюс его можно включать в режиме отладки. Тогда как usb всегда программный.
Минус кома только 1 - низкая скорость. Обычно требуется 9600, и залить по нему прошивку пусть в 20мб - процесс, который может растянуться на часы. usb 2.0 - 30мб/с и упираемся только в скорость флэша.

По остальным вопросам это скорее просто "мало жизненного опыта". А кольца у меня были и в начале моей карьеры в сети на 20 машин. Не по моей вине конечно, кто-то убрал "лишний хвост", вроде уборщица. Но там начальство было очень жадным, а управляемые свичи очень дорогими.

вторник, 20 декабря 2011 г.

Автоматическая настройка vlan-ов при старте

centos

Для начала, надо проверить, что стоит пакет vconfig

Настройки пишутся в /etc/sysconfig/network-scripts/ifcfg-*
Есть варианты через vlanX и ethX.Y

vlanX
ifcfg-vlanX

VLAN=yes
VLAN_NAME_TYPE=VLAN_PLUS_VID_NO_PAD
DEVICE=vlan10
PHYSDEV=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=10.10.10.2
NETMASK=255.255.255.252

ethX.Y
ifcfg-ethX.Y

VLAN=yes
DEVICE=eth0.10
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=10.10.10.2
NETMASK=255.255.255.252

Взято отсюда, комментарии там же.

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

apache mod_vhost_alias

Есть такой модуль у апача, mod_vhosts, хорош для массхостинга, а также для программерских серваков: для добавления сайта достаточно создать каталог.

Но есть нюансы:
1) проблемы с mod_rewrite, лечится в .htaccess строкой RewriteBase /
2) Проблема с DocumentRoot, равным корневому каталогу. Тут чуть сложнее, надо писать скрипты-обработчики.

Наш скрипт для перла (года так 2007)
# Author Andrey Ivanov
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[], char *envp[])
{
        int i=0, dr=-1, sn=-1;
        char *foo;

        while(envp[i]!=NULL)
        {
                if (strstr(envp[i], "DOCUMENT_ROOT")==envp[i]) dr=i;
                if (strstr(envp[i], "SERVER_NAME")==envp[i]) sn=i;
                i++;
        }

        if (sn!=-1 && dr!=-1)
        {
                foo=strchr(envp[sn]+12, '.');
                if(foo) *foo=0;
                sprintf(envp[dr], "DOCUMENT_ROOT=/var/www/%s/site/htroot", envp[sn]+12);
        }

        execve("/usr/local/bin/perl5.8.8", argv, envp);

        return(0);
}
Скомпилированый файл называется perl и кладется в /usr/local/bin/, заменяя старый симлинк.

Для пхп есть например такой метод

php_admin_value auto_prepend_file /path/setdocroot.php

<?php apache_setenv("DOCUMENT_ROOT",$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME'])) ?>
отсюда

$l = explode("/",$_SERVER['SCRIPT_FILENAME']);
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"] = implode("/",Array( $l[0], $l[1], $l[2], $l[3], $l[4]));
С хабра.

"Что касается проблем с $_SERVER['DOCUMENT_ROOT'] и RewriteBase, примечательно, что такие же проблемы есть и при реализации виртуальных хостов с помощью mod_rewrite. Не смотрел исходники vhost_alias, но такое чувство, что он с помощью mod_rewrite и реализован."
Оттуда же. Линк потерян, сорь.

debian: pvcreate /dev/xvdb -su: pvcreate: command not found

# pvcreate /dev/xvdb
-su: pvcreate: command not found

Причина проста: штатно нет утилит для lvm

# apt-get install lvm2

# pvcreate /dev/xvdb
Physical volume "/dev/xvdb" successfully created

вторник, 13 декабря 2011 г.

Разбираемся с сертификатами

Теория
теория-2
Много теории
Проверка подлинности цифровых сертификатов в инфраструктуре Windows PKI

Вики
SSL
OpenSSL

Проверка .crt руками
openssl verify -CAfile company.ru-ca.crt client3.crt
-CAFile может быть опущен, если проверяем честный сертификат.

Проверка SSL сертификата из командной строки

php fpm

Что есть php-fpm и зачем оно нужно

fastcgi process manager

Работа через mod_php имеет особенности - все скрипты исполняются от пользователя апача (www, www-data, apache), и даже для 1000 сайтов рабочих процессов php относительно немного и равно количеству воркеров апача. Минусы - каждый воркер ест в среднем 150Мб памяти, и нет разделения доступа. С доступом можно решить через всякие suexec, но это порой немалое снижение быстродействия.
PHP, запускаемый как CGI (не FastCGI!) – страшный атавизм. Быть такого не должно.
Чем такая схема плоха. Если в двух словах – на каждое обращение к php-скрипту запускается новый процесс интерпретатора PHP. Все это работает очень медленно, производительность сайта будет крайне низкой.
Можно запустить под каждого пользователя по fastcgi-процессу, 1 или даже нескольким. Расход памяти на процесс будет меньше, но если создать по 2 процесса на 1000 сайтов - это 2000 fastcgi процессов. Немало.
В этом случае помогает fpm - он управляет fastcgi процессами, при этом их достаточно небольшое количество и создание не такая проблема. Хотя по-моему, актуально скорее для масс-хостиинга -- для больших проектов с единичными сайтами на сервер достаточно простого fastcgi.

Как выбрать по-настоящему хороший хостинг (пара строк взята оттуда)
Nginx + php-fpm на CentOS 5.3
Centos5.5 Nginx 0.8.33 + PHP5.3.1(fpm) + MySQL5.5.0(phpmyadmin) — полная настройка для начинающих — 1 часть
Установка и настройка: Nginx + php5-fpm на debian

понедельник, 12 декабря 2011 г.

SVN: некоторые особенности

Тэги

В свн тэг - это не метка на определённую ревизию, а самый обычный бранч, который делается через svn copy. Об этом надо помнить, особенно после работы с другими системами, где термины схожи, но суть разная.
Это означает некоторые особенности в работе:
1) Метки можно менять. И меняться они будут независимо от бранча. Считается неправильным, но часто применяется "пофиксить прямо сейчас";
2) Можно сделать багофикс в метке и влить его в транк;
3) если права доступа установлены индивидуально для директорий, то метка эти права не наследует;
4) трудно узнать, в какие метки вошёл файл (то же для директории);
5) если из метки создать рабочую копию и зафиксировать из этой рабочей копии какие-либо изменения, то это изменит саму метку, а не те данные, которые были помечены. Правильным способом работы «от метки» является создание рабочей копии не из метки, а из того, что является источником этой метки.

Часть информации скопирована из вики

Свойства

Такое впечатление, что свойства появились сильно позднее - работа с ними через костыли. Поиска по свойствам нет, фильтров нет, вывод свойств svn proplist - только на отдельные объекты. Штатно не сделать вывод всех директорий, для которых установлен svn:ignore, со значениями.

На самом деле со свойствами много непоняток.
Крайне неудобно, что нельзя задать в маски строки вида */*/*links.db - оно просто не работает.
svn status verbose не показывает изменения атрибутов. Точнее, М покажет, но изменился сам файл или ему поменяли какое-то свойство - непонятно.
Установка svn:executable и некоторых подобных меток нелогична, и в оф доке ни намёка как правильно делать. Суть в том, что должно быть 3 аргумента, а у нас есть только 2: имя свойства, значение свойства, файл. А какое тут значение? А любое: ON, yes, 1... Так что писать так:
svn propset svn:executable yes /path/to/file. И ещё момент: этот бит не выставляется на каталоги, только на файлы.
!!! Если делаем svn propset svn:ignore -- тут надо внимательнее вписывать первый аргумент, потому что написав "svn propset svn:ignore ON tmp/" в игнор будет записан ON, поэтому надо вписывать \* (со слэшем, чтобы шелл не перехватил)

Особенности с операциями
Добавление файлов и каталогов. Сделав svn add dir/ добавит не только этот каталог, но и всё в нём. Чтобы добавить только его (например, чтобы проставить игнор), добавлять надо так: svn add -N dir/ . Если же было по ошибке добавлено без -N, снять добавление (до коммита) можно через svn revert dir, это не тронет его содержимое, но снимет метку добавления. Но если что-то внутри локально было исправлено - тоже откатит, поэтому надо быть аккуратным и revert-ить только лишнее. Или заранее сделав бэкап, и если что-то откатило - вернуть потом на место. А вот если уже так и закоммитили -- можно сделать svn up -r xxx (на предыдущую), а потом как-то зафиксировать так.. но проще скопировать, сделать svn rm dir, коммит и вернуть файлы на место (rm их удалит при коммите). В общем, тут красивого решения не знаю. Реверта на конкретную версию нет.

Частичный коммит. Можно сделать svn ci subdir/ - это закоммитит только изменения в subdir, не затронув изменения выше.
Но также можно сделать svn up subdir - это обновит тоже только subdir, что может быть чревато - если менялось много файлов, у нас получится часть файлов ревизии 1, часть ревизии 2.. Привет странные ошибки.

Простое создание ветки
svn copy ^/trunk ^/branches/branch_name

"Да и никто не мешает сделать скрипт, наподобии:
svn copy ^/trunk ^/branches/%1

И вызывать его:
svn_branch НАЗВАНИЕ_ВЕТКИ"
отсюда

Стратегии использования svn

Для работы на svn-сервере есть команда svnlook, ей в частности можно посмотреть содержимое репы, информацию о ревизии итд.
svnlook info /path/to/repo - информация о последнем коммите
svnlook tree /path/to/repo - список файлов

Плюс для работы нужна утилита svnadmin
создание репы, проверка, дамп-рестор

И есть малоизвестная команда svnsync - создание зеркала реп

среда, 7 декабря 2011 г.

#7948: Назад к «окнам»

http://ithappens.ru/story/7948
"Сказка - ложь, да в ней намёк..."

И ведь на самом деле стоимость владения (TCO) линукса на рабочих местах зачастую даже выше.