четверг, 28 июня 2012 г.

Как стереть файл с непечатным именем

Обнаружили в одном месте файл с именем из 1 непечатного символа, при этом через ls -la его показывало как "?", а через ls -1 просто пустая строка. rm такое не возьмёт. Тут на помощь приходит find, только сначала надо получить inode файла и потом его указать find-у.

# ls -1i | head -2
473779
457021 README

# find . -inum 473779 -delete

Всё, удалили.

вторник, 26 июня 2012 г.

selectel: лимиты облака

"Вы достигли ограничения по-умолчанию на количество виртуальных машин в облаке."

Оказалось, лимиты в облаке selectel - 11 вирт машин. Но можно написать запрос, и лимит увеличат.

"Лимиты введены по соображениям безопасности и рационального использования ресурсов. Эта мера помогает быстро отсеивать недобросовестных пользователей генерирующих мусорный трафик или распространяющих зловреды."

К каждой машине может быть подключено не более 15 дисков. Лимит диска 1.7Тб.
Уменьшению не подлежит. Изменение размеров только на отключенном диске/выключенной системе.
http://habrahabr.ru/company/selectel/blog/117969/

четверг, 21 июня 2012 г.

apache и nginx: сайт по умолчанию

nginx:
server {
    listen       80 default_server;
    server_name  _;
}


Если у директивы есть параметр default_server, то сервер, в котором описана эта директива, будет сервером по умолчанию для указанной пары адрес:порт. Если же директив с параметром default_server нет, то сервером по умолчанию будет первый сервер, в котором описана пара адрес:порт.

До версии 0.8.21 этот параметр назывался просто default.

дока

apache:
<VirtualHost _default_:*>
    DocumentRoot /var/www/default
    ErrorLog /var/www/default/error_log
</VirtualHost>

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

dd со статистикой

Можно для получения статистики посылать сигнал SIGUSR1, но во фре например у меня этот сигнал просто прибивал dd.

Рабочий вариант:
dd if=/dev/sda bs=8M conv=sync,noerror | pv -c > /dev/sdb
или в файл
dd if=/dev/sda bs=8M conv=sync,noerror | pv -c | gzip -c > /mnt/backup/sda.img

apache: client denied by server configuration

В лине можно словить эту ошибку.
Причины: в конфиге прописано
<Directory "/">
    ...

    AllowOverride none
    Options none
</Directory>

Фикс: написать в конфиг

<Directory "/var/www/site">
    ...
    Allow from all
    AllowOverride All
    Options +FollowSymLinks
</Directory>

Для битрикса по сути нужно только AllowOverride FileInfo

Можно просто убрать "лишние" строки из главного конфига, но по ряду причин лучше попытаться переопределить нужные. Это и безопаснее, и автообновление конфига не отвалится.

четверг, 14 июня 2012 г.

Эпическое тестирование 15 SSD объемом 120-128 Гбайт

Эпическое тестирование 15 SSD объемом 120-128 Гбайт

И оттуда же основные типы контроллеров:
Для начала разберемся с основными платформами, на которых строятся SSD. Подавляющее большинство дисков сейчас делают на контроллерах SandForce SF-2281 и Marvell 88SS9174. Свой собственный контроллер использует Samsung в приводах серии SSD 830. OCZ не так давно тоже начала выпускать накопители с контроллерами «домашнего» производства Indilinx Everest и Everest 2. Ну и не будем забывать о платформе Intel, которая играла значительную роль в эпоху накопителей для шины SATA 2 Гбит/с и пиком развития которой стала линейка Intel SSD 320. До современных стандартов Intel ее не дотянула и теперь вместе со всеми для производства топовых накопителей прибегает к услугам SandForce и Marvell.

вторник, 12 июня 2012 г.

Чуть более 20 хороших советов по MySQL

Объединение из 2 частей, с подправленной грамматикой (переводил китаец -- в оригинале полно фразочек типа "Значения в нем храниться так же, как...").

Оригинал: http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/

Перевод:
часть 1
часть 2

вторник, 5 июня 2012 г.

LVM: основные операции

небольшое отступление: после zfs - lvm кажется дико кривым и неудобным, поэтому и возникла необходимость в памятке об основных операциях.

Плюс, поскольку оно не умеет и уровни рейда кроме jbod (объединение пачки дисков в единое пространство), необходимо сначала создать нужные рейды средствами системы/контроллера, и работать уже с этими дисками.

шаг 0: в дебиане надо поставить пакет lvm2 (apt-get install lvm2), а то ничего не получится.

На 2 уровне из реальных дисков (PV, physical volume) собираем "диски" VG (volume group), с которыми уже работает lvm. Можно собрать 1 диск из нескольких реальных, но это опасно: отказ любого из реальных дисков приведет к недоступности всей группы, поэтому лучше собрать рейд нужного уровня, создать на нём pv, и чисто из него сделать vg.

"Загрузка с LVM возможна, но не рекомендуется. Так что у Вас есть отдельный раздел для этого." (линк)

Также есть заблуждение, что расширить том lvm легко, но это не совсем так: если у нас есть куда расширять, делается lvextend, для ext2 расширяемый раздел перемонтируется в режим чтения и потом (xfs_grow|resize2fs).
Другое дело, если мы в облаке (selectel, parking...) и увеличили жесткий диск. Тут нужен будет бубен, потому что скорее всего придется поплясать. Пример запущенного случая: 3 раздела (boot, своп, и extended, на котором еще 1 раздел уже с lvm). Описание ниже.

Устройство по слоям
> pv > vg > lv
PV, Physical volume, физический том. Обычно это раздел на диске или весь диск. В том числе, устройства программного и аппаратного RAID (которые уже могут включать в себя несколько физических дисков). Физические тома входят в состав группы томов.
VG, Volume group, группа томов. Это самый верхний уровень абстрактной модели, используемой системой LVM. С одной стороны группа томов состоит из физических томов, с другой -- из логических и представляет собой единую административную единицу.
LV, Logical volume, логический том. Раздел группы томов, эквивалентен разделу диска в не-LVM системе. Представляет собой блочное устройство и, как следствие, может содержать файловую систему.
PE, Physical extent, физический экстент. Каждый физический том делится на порции данных, называющиеся физическими экстентами. Их размеры те же, что и у логических экстентов.
LE, Logical extent, логический экстент. Каждый логический том делится на порции данных, называющиеся логическими экстентами. Размер логических экстентов не меняется в пределах группы томов.
http://xgu.ru/wiki/LVM

Создание раздела
Последовательность pvcreate /dev/sda -> vgcreate vg0 /dev/sda -> lvcreate -l +10%FREE -n lv-name

Сначала надо разметить раздел или весь диск как lvm. Лучше отдать под лвм весь диск, но это накладывает некоторые ограничения, в частности не получится поставить потом в зеркало диск такого же размера "на бумаге", но меньший по секторам, зато обслуживать такой диск куда проще. Если же создать хоть 1 раздел и уже его добавлять, то не будут зеркалироваться такие вещи как загрузочные сектора.
pvcreate /dev/sda

Потом из этих pv собираем "диски" VG (volume group), с которыми уже работает lvm. Можно собрать 1 диск из нескольких реальных, но это опасно: отказ любого из реальных дисков приведет к недоступности всей группы, поэтому лучше собрать рейд нужного уровня, создать на нём pv, и чисто из него сделать vg.
Получили vg-диск, который уже можно нарезать на разделы, это уровень lv (logical volumes). так что lvcreate в помощь.
Можно изменять размеры в байтах (-L +10G), в блоках по 4М (-l +100), в процентах (-l +10%FREE)

Изменение размеров
Если просто использовать свободное место из резерва, то это делается в 2 команды - lvresize и resize2fs.
Если же изменился жесткий диск (облако или dd на новый бОльшего размера) и надо расширять vg - придётся повозиться.
Тут 2 пути:
1) увеличиваем размер базового тома (возможно не всегда, например если следом уже есть раздел)
2) создаём ещё том и подключаем его в текущую структуру

1 сводит на нет и без того скудные возможности lvm, поэтому правильнее использовать 2.

Итак, 3 раздела (boot, своп, и extended, на котором еще 1 раздел уже с lvm). Чтобы изменить размер в таком случае, действия:
1) расширить физический диск. К слову, на паркинге изменение с 20 до 40 гиг - даунтайм 1.5 часа.
2) растянуть extended, в помощь parted, cfdisk, sfdisk. Есть ещё fdisk, но в дебиане он неюзабелен абсолютно, в других операционках работает как надо. Впрочем, в дебиане вообще с разметкой диска очень грустно, но это система для гуру и извращенцев. parted тоже отличается особым "умом" в любом линуксе (хинт: есть опция print free, цифры оттуда используем для mkpart). А cfdisk хорош, но любит ругаться на выравнивание разделов, причём считает любое отклонение критической ошибкой.
3) Создать на пустом месте в extended новый раздел
4) сделать на этот раздел pvcreate
5) добавить его в группу vgextend
6) увеличиваем lv: lvextend -l +100%FREE /dev/vg0/root
7) А теперь увеличим фс.. для ext* в помощь resize2fs(e2fsprogs), только для ext2 сначала перемонтировать систему в RO, иначе можно всё сломать.. если вообще даст что-то сделать. Или вообще отмонтировать. Про ext2 подробнее

Всего 7 шагов, на которые без опыта спокойно уходит неделя и есть реальные шансы всё убить.

Отдельно стоит уменьшение, но это нужно редко..

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

debian, apache и конфиги сайтов с _

Для удобства у меня каждый домен в отдельном конфиге, грузятся через include sites-enabled/*.conf
Такая схема работала в центоси и фре.. а в дебиане баг: если файл начинается с _, он игнорируется (так сделаны поддомены, чтобы они грузились раньше основных доменов).

Оказывается, это очередная "фича" дебиляна.

"Это патч Debian: debian/patches/008_make_include_safe.
Первый символ -- обязательно должен быть alphanumeric, остальные -- alphanumeric + подчёркивание, дефис или точка.
Варианты как лечить:
- переименовать файлы(более нормальная и распространённая практика, чтобы задавать приоритеты -- называть файлы 00-example.com и т.п.);
- пересобрать apache самостоятельно без этого патча, ну и пересобирать по мере выхода новых версий;
- почти на bugs.debian.org и объяснить, что файлы, начинающиеся на _ -- это хорошо.

Варианты расставлены в порядке их правильности/реальности осуществления(от более реальных к менее реальным)."
(линк)

Причины исключения точки мне в принципе понятны - через простой ls их не видно и можно сделать чего-нибудь не очень легко обнаружимое. Но причины запрета _ мне кажутся бредом.

среда, 30 мая 2012 г.

apache: LogLevel warn

По умолчанию апач обычно пишет в логи только уровень error и выше. Меняем на warn и выше: после ErrorLog пишем
LogLevel warn

и перезапускаем апач.

понедельник, 28 мая 2012 г.

FreeBSD: ставим пакеты

Некоторый софт проще и быстрее поставить из пакетов, а не портов, особенно это касается такого софта как m4, ruby (для меня это просто побочный пакет, не более) итд.
У portinstall для этого есть хороший ключик -PP (packages-only)

Я не знаю, как сделать что-то вроде
cd /usr/ports/sysutils/smartmontools && make package, поэтому способ чуть сложнее, для этого можно посмотреть нужные пакеты в
http://ftp6.ru.freebsd.org/pub/FreeBSD/ports/packages/All/
(много файлов!)

cd /usr/ports/ports-mgmt/portupgrade
make package-depends-list

cd /usr/ports/packages
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/ports/packages/All/ruby-1.8.7.358%2c1.tbz"
pkg_add *

(запятую заменяем на %2c или просто берем аргументы для fetch в кавычки)

По идее, есть опция USE_PACKAGE_DEPENDS, но чего-то она не работает.

Вариант 2 - через pkg-add -r
Но всё-равно надо полное имя. Впрочем, для ряда пакетов есть симлинки на сервере, поэтому pkg_add -r mc поставит mc, но это не система такая умная, а просто симлинк на фтп.

Установка FreeBSD 9 c ZFS

Ставим freebsd с корнем на zfs

Что 8, что 9 инсталлер штатно не умеет zfs, поэтому надо на обоих грузиться в консоль. Отличия в том, что в 8 это был выкидыш fixit, который был крайне, дико убог, а в 9 появился нормальный shell, который и листать историю умеет, и ls есть, и вообще поведение уже человеческое.

Под 8 версию уже был мануал, теперь сделаем под 9.

воскресенье, 27 мая 2012 г.

svn: Can't convert string from 'UTF-8' to native encoding

svn: Can't convert string from 'UTF-8' to native encoding:
...

Характерно для freebsd, поскольку он не умеет utf-8. Решение:
setenv LC_CTYPE "ru_RU.CP1251"

опционально, ломает показ файлов (ls), показывая русский где он не нужен:
setenv LANG "ru_RU.CP1251"

(как минимум работает в csh, так что можно дописать в .cshrc)

линки
http://chatlogs.jabber.ru/freebsd@conference.jabber.ru/2008/11/22.html
http://stackoverflow.com/questions/2116718/svn-error-cant-convert-string-from-native-encoding-to-utf-8

debian: percona, свежий nginx и subversion 1.7

Поскольку иногда требуется перкона + в штатной поставке ну вообще древний nginx аж 1.7 ветки, надо подключать доп репы, пишем каждую репу в свой файл в /etc/apt/sources.list.d/

nginx
http://wiki.nginx.org/Install

deb http://nginx.org/packages/debian/ squeeze nginx
deb-src http://nginx.org/packages/debian/ squeeze nginx

percona
Перкона молодцы, у них есть репы для основных линукс-дистрибутивов.
http://www.percona.com/docs/wiki/repositories:apt

deb http://repo.percona.com/apt  squeeze main
deb-src http://repo.percona.com/apt  squeeze main

MariaDB
Ещё одна замена оригинального mysql, более совместимая с оригиналом, но без некоторых плюшек
https://downloads.mariadb.org/mariadb/repositories/

для 5.5:
deb http://mirror.timeweb.ru/mariadb/repo/5.5/debian squeeze main
deb-src http://mirror.timeweb.ru/mariadb/repo/5.5/debian squeeze main

subversion
Штатный 1.6, и обновлять его не собираются, но мы давно перешли на 1.7, в частности из-за только 1 каталога .svn в корне проекта вместо тучи по всем каталогам.


deb http://opensource.wandisco.com/debian/ squeeze svn17

И ключи

nginx
gpg --keyserver  hkp://keys.gnupg.net --recv-keys ABF5BD827BD9BF62
gpg -a --export 7BD9BF62 | apt-key add -

percona
gpg --keyserver  hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
gpg -a --export CD2EFD2A | apt-key add -

mariadb
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

subversion

gpg --keyserver  hkp://keys.gnupg.net --recv-keys E9F0E9223BBF077A
gpg -a --export 3BBF077A | apt-key add -

После этого делаем
apt-get update

Что странно: на оф странице ничего про эти ключи не было сказано, но по аналогии с перконой всё оказалось очень просто: после apt-get update получили ошибку

W: GPG error: http://nginx.org squeeze Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ABF5BD827BD9BF62
Номер ключа у нас есть, подставили в 1 команду вместо ключа перконы, получили
gpg: requesting key 7BD9BF62 from hkp server keys.gnupg.net
gpg: key 7BD9BF62: public key "nginx signing key <signing-key@nginx.com>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
Вот и номер ключа есть, его во 2 строку.

Теперь можно поставить percona-server-server и nginx
Для перконы советую также поставить percona toolkit (пакет percona-toolkit), замена maatkit-у.

C свн - проще снести старую версию и поставить новую, в конце напишет

Setting up subversion (1.7.5-1+WANdisco) ...
Setting up libsvn1 (1.7.5-1+WANdisco) ...

PS
Возможные ошибки.

gpg: requesting key 3BBF077A from hkp server keys.gnupg.net
?: keys.gnupg.net: Network is unreachable
gpgkeys: HTTP fetch error 7: couldn't connect: Network is unreachable
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

Для nginx - можно скачать подпись с офсайта.
wget http://nginx.org/packages/keys/nginx_signing.key
cat nginx_signing.key | apt-key add -

PPS Также есть репа dotdeb.org

echo deb http://packages.dotdeb.org squeeze all > /etc/apt/sources.list.d/dotdeb.list
echo deb-src http://packages.dotdeb.org squeeze all >> /etc/apt/sources.list.d/dotdeb.list
curl -s http://www.dotdeb.org/dotdeb.gpg | apt-key add -