02 Май, 2016

Ускоряем Soft RAID1 ext3

На одном из серверов возникла проблема после установки Proxmox 4 - катастрофически низкая скорость записи данных. Узнали вообще из монитора производительности 1С-Битрикс. Потом проблема подтвердилась утилитой pveperf.

pveperf /var/lib/vz/
CPU BOGOMIPS:      57602.48
REGEX/SECOND:      1789869
HD SIZE:           1809.50 GB (/dev/mapper/pve-data)
BUFFERED READS:    61.37 MB/sec
AVERAGE SEEK TIME: 22.60 ms
FSYNCS/SECOND:     17.53
DNS EXT:           25.42 ms
DNS INT:           53.82 ms (ru)

Параметр FSYNCS должен быть как минимум выше 200. Починилось добавлением опций монтирования в fstab (data=writeback,barrier=0):

/dev/pve/data   /var/lib/vz     ext3    defaults,data=writeback,barrier=0       1       2

Стало как-минимум вот так, как максимум доходило до 2500.

pveperf /var/lib/vz/
CPU BOGOMIPS:      57602.48
REGEX/SECOND:      1732888
HD SIZE:           1809.50 GB (/dev/mapper/pve-data)
BUFFERED READS:    75.74 MB/sec
AVERAGE SEEK TIME: 17.72 ms
FSYNCS/SECOND:     689.35
DNS EXT:           20.51 ms
DNS INT:           32.89 ms (ru)
26 Ноябрь, 2015

CentOS 6 - обновить git

В репозиториях CentOS 6 лежит уже довольно старая версия пакета git-1.7.1-3 Все бы с ним хорошо, да есть один баг из-за которого в нем не работает хук из вот этой заметки: http://mrdeveloper.ru/post-36/git-deploy-hooks

Он ругается вот так:

remote: fatal: /usr/libexec/git-core/git-pull cannot be used without a working tree.

Ну что же, настало время исправить эту ополошность. Обновим git из репозитория GitLab.

wget -O /etc/yum.repos.d/PUIAS_6_computational.repo https://gitlab.com/gitlab-org/gitlab-recipes/raw/master/install/centos/PUIAS_6_computational.repo

wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-puias http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-puias

rpm -qa gpg*

yum repolist

yum --enablerepo=PUIAS_6_computational install git

git --version

В итоге получаем вполне рабочий git 1.8.3.1

03 Апрель, 2015

Как распаковывать архивы разных форматов в Linux

На самом деле нет нужды заморачиваться вспоминая что сейчас нужно - tar zxf или tar jxf для конкретного случая (tar.gz и tar.bz).

Самый простой вариант это писать:

tar xf archivename

Утилита tar выберет нужный распаковщик автоматом.

Еще заодно напомню про команду file которая пытается определить тип указанного в аргументах файла. Очень полезная утилита на самом деле.

11 Январь, 2015

Запускаем GUI-приложения в Docker

Предыстория такова - понадобился мне MySQL Workbench который в репозитории для Fedora Core 21 на момент написания статьи еще отсутствует. Сперва я попробовал накатить RPM-пакет от FC20, но он не смог установиться из-за неразрешенных зависимостей. Потом я взял в руки Docker и вот что получилось:

1) Создаем Dockerfile где описываем что мы хотим получить:

vim Dockerfile
FROM debian
RUN apt-get update
RUN apt-get install -qqy x11-apps mysql-workbench
ENV DISPLAY :0
CMD /usr/bin/mysql-workbench

2) Собираем наш контейнер с последним Debian и установленным MySQL-Workbench

docker build -t workbench - < Dockerfile

3) Объявляем для удобства переменную

XSOCK=/tmp/.X11-unix/X0

4) Запускаем контейнер и прокидываем в него сокет. Контейнер автоматически стартует MySQL-Workbench при запуске

docker run --privileged -v $XSOCK:$XSOCK workbench

В итоге мы наблюдаем запущенное в контейнере приложение у себя на рабочем столе. Заработает таким образом далеко не весь софт, но попробовать стоит.

MySQL Workbench running on Docker-container

23 Декабрь, 2014

Как зашифровать большие файлы?

В этом нам поможет утилита openssl.

Публикую 2 варианта т.к. первый опубликованный оказался с недостатком. Зашифровать большие файлы можно, но вот расшифровать можно только файлы размером менее 1.5 Gb. Такой вот неприятный сюрприз.

Вариант 1 (только для файлов менее 1.5Gb)

Для начала генерируем нашу пару ключей которая делится на приватную и публичную части. Публичной можно только шифровать файлы. Расшифровывать их надо с применением приватного ключа.

openssl req -x509 -nodes -newkey rsa:2048 -keyout private.pem -out public.pem

Шифруем наши файлики:

openssl smime -encrypt -aes256 -in file.tar.gz -binary -outform DEM -out file.tar.gz.ssl public.pem

Расшифровываем:

openssl smime -decrypt -in file.tar.gz.ssl -binary -inform DEM -inkey private.pem -out file.tar.gz

На целевой машине где файлы будут шифроваться есть смысл держать только публичный ключ. А закрытую часть ключа хранить в особо секретном месте =)

Вариант 2 (с явными ограничениями не столкнулся)

Генерируем текстовый ключ:

openssl rand -base64 32 -out key.txt

Шифруем файлы:

openssl enc -aes-256-cbc -salt -in file.tar.gz -out file.tar.gz.enc -pass file:./key.txt

Дешифруем файлы:

openssl enc -d -aes-256-cbc -in file.tar.gz.enc -out file.tar.gz -pass file:./key.txt

В любом случае после шифрования файлов хотя бы пару раз попробуйте их обратно расшифровать. А то можно остаться с огромным архивом нужных файлов которые невозможно уже восстановить, но при этом вот они, совсем рядом.

13 Сентябрь, 2014

Проверяем сайт на наличие битых ссылок

В этом деле нам поможет старый добрый wget:

wget --spider -o ~/site_ru.log -e robots=off -w 1 -r -p http://site.ru

Краткая расшифровка опций:

  • --spider, режим «паука», файлы при сканировании не сохраняются, сохраняются только заголовки ответа сервера

  • -o, указываем куда нам сохранять лог

  • -e robots=off, говорим что не хотим следовать правилам robots.txt (по умолчанию wget их учитывает)

  • -w, выставляем тайм-айт между запросами в 1 секунду (можно отключить если уверены в мощности хостинга)

  • -r, включаем рекурсивный обход сайта

  • -p, делаем все запросы для загрузки сайта включая подгрузку css,js и например изображений

Проверяем свой улов на наличие 404 ошибок - grep -B 2 '404' ~/site_ru.log

Кстати, сюда также попадут и ссылки у которых просто в теле адреса есть слово 404 (пример hamdeew.ru/page/bitriks-delaem-stranicu-404-pravilno)

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

Я нашел решение которое работает не на 100 процентов и оно довольно кривое (из-за некотрых особенностей wget), но тем не менее мне оно помогло отыскать битые ссылки на картинки и найти одну 404.

mkdir ~/test/

cd ~/test/

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

wget -r -l 1 -H -p -o ~/test/site_ru_out.log --spider -e robots=off http://site.ru/

И затем прогоняем получившийся у нас site_ru_out.log грепом как и в первом случае + еще один прогон для проверки ссылок на несуществующие ресурсы:

grep -B 2 'failed' ~/site_ru.log

Надеюсь что вам этот способ помог. Удачи!

08 Сентябрь, 2014

Закрыть доступ для .git глобально

Краткий совет как на сервере с ISPmanager глобально запретить отображать листинг директорий .git

  1. Открываем /etc/apache2/apache2.conf
  2. Находим начало секций с <Directory> и вписываем туда глобальное правило:

<Directory /var/www/\*/data/www/*/.git> order allow,deny deny from all </Directory>

  1. Рестартим Apache2 - service apache2 restart
02 Сентябрь, 2014

Если есть права на запись, но демон не может туда писать

Возникла такая проблема - в конфиге MySQL выставил путь для записи временных таблиц отличный от стандартного /tmp и выставил соответствующие права на запись в новый каталог. Но MySQL не стартовал ругаясь на отсутствие прав на запись. Долго думал пока не вспомнил про Apparmor.

И правда - в конфиге apparmor был профиль для демона MySQL. Проблема решилась дописыванием в конфиг нового каталога и service apparmor reload.

В Ubuntu 14.04 конфиг лежит тут: /etc/apparmor.d/usr.sbin.mysqld

05 Апрель, 2014

Простейший SSH-прокси

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

ssh -D 5555 user@remotehost -f -N

-D 5555 - эмуляция SOCKS сервера через порт 5555

-f - работа в фоне, после аутентификации

-N - не запускать shell на удаленном хосте

Теперь в настройках ПО добавляем в качестве SOCKS5-прокси адрес localhost:5555

16 Март, 2014

Как узнать версию дистрибутива Linux?

Самый простой и быстрый способ это набрать в консоли:

cat /etc/*release*

Пример вывода:

[rail@rh-manjaro tmp]$ cat /etc/*release*
DISTRIB_ID=ManjaroLinux
DISTRIB_RELEASE=0.8.9
DISTRIB_CODENAME=Ascella
DISTRIB_DESCRIPTION="Manjaro Linux"
Manjaro Linux
NAME="Manjaro Linux"
ID=manjaro
PRETTY_NAME="Manjaro Linux"
ANSI_COLOR="1;32"
HOME_URL="http://www.manjaro.org/"
SUPPORT_URL="http://www.manjaro.org/"
BUG_REPORT_URL="http://bugs.manjaro.org/"
08 Февраль, 2014

Как поделить tar.gz архив на блоки

Иногда для обхода ограничений на максимальный размер файла тех или иных сервисах приходится разбивать архивы на куски. Например в WinRAR такой функционал имеется изначально. Но что делать если мы хотим разбить архив на Linux-сервере где в наличии любимые утилиты tar и gzip?

Все очень просто - нам поможет утилита split:

Архивирование с разбивкой на блоки по 2Gb

tar cvzf - backup_dir/ | split --bytes=2000MB - backup.tar.gz.

«Склейка» блоков и разархивирование:

cat backup.tar.gz.* | tar xzvf -

06 Февраль, 2014

Реализуем аналог Dash для быстрого доступа к документации

Для решения этой проблемы есть два варианта:

  1. Установить Zeal который поддерживает документацию в формате Dash (Mac OS X) и копирует его функционал для Windows и Linux.
  2. Воспользоваться веб-приложением DevDocs.

Первый вариант отметается из-за большой сырости и глючности софтины. Даже будучи установленной самая свежая ее версия постоянно сыпется в segmentation fault при наборе слов в строке поиска.

Второй же вариант работает отлично + скачивает документацию в браузерное хранилище для доступа к ней оффлайн. Для удобства сделаем из него приложение:

  1. Открываем Chrome/Chromium и заходим на devdocs.io
  2. Слева внизу выбираем документацию по необходимым технологиям (потом тоже можно будет докачать).
  3. Открываем меню браузера - «Инструменты» -> «Создать ярлыки приложений» и оставляем ярлык для меню.
  4. Теперь devdocs доступен в виде приложения в меню вашей DE
  5. Настроим его запуск по хоткею. Т.к. у меня XFCE, то опишу процесс для нее.
  • ls ~/.local/share/applications/
  • там находим что-то похожее на chrome-http___devdocs.io_.desktop
  • cat chrome-http___devdocs.io_.desktop
  • находим строчку запуска: Exec=/usr/bin/chromium --app=http://devdocs.io/
  • в настройках клавиатуры вешаем хоткей на запуск
  • радуемся =)

У себя я настроил запуск по Ctrl+Shift+Space. Открывается моментально и интернетов для работы не требует.

30 Январь, 2014

Exim4 smarthost smtp + hide received headers

Возникла задача запилить почтовый сервер для пересылки писем который бы работал в качестве релея и отправлял письма через внешний smtp другого сервера. Также надо было обеспечить отсутствие в заголовках писем адресов серверов которые коннектятся к нему (по умолчанию все почтовые сервера через которые шла пересылка добавляются в заголовки Received:).

Вот собственно конфиги:

/etc/exim4/update-exim4.conf.conf

dc_eximconfig_configtype='smarthost'
dc_other_hostnames='mailsender'
dc_local_interfaces='127.0.0.1 ; xx.xx.xx.xx, ::1' //xx... это внешний ip сервера
dc_readhost='mailsender'
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets='aaa.aaa.aaa.aaa; bbb.bbb.bbb.bbb;' //ip серверов которым разрешено использовать этот сервер в качестве релея
dc_smarthost='smtp.remote_server.ru:587' //удрес внешнего smtp
CFILEMODE='644'
dc_use_split_config='true'
dc_hide_mailname='true'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'

Еще один:

/etc/exim4/passwd.client

smtp.remote_server.ru:addr@remote_server.ru:password //реквизиты для доступа к внешнему smtp

А для затирания Received из заголовков писем с ip серверов которые коннектятся к нашему почтовику надо добавить вот эту строчку:

/etc/exim4/conf.d/transport/30_exim4-config_remote_smtp_smarthost

headers_remove = Received

Внимание! Чтобы затирание заголовков работало параметр dc_use_split_config='true' обязателен.

30 Январь, 2014

Пнуть url из cron

Есть два распространенных варианта:

wget -q http://site > /dev/null 2>&1

curl -silent http://site > /dev/null 2>&1

/dev/null для того чтобы полученная страница не сохранялась на диске. Первый вариант отчего то у меня не сработал (постоянно создаются файлы). Второй работает на ура.

Пример: 25 * * * * curl -silent http://site > /dev/null 2>&1

Пинать url каждый час в 25 минут.

30 Январь, 2014

Debian - установка определенной версии софта

Для этого можно воспользоваться богатыми воможностями apt.

apt-cache showpkg <package-name>

И затем установить требуемую версию

apt-get install <package-name>=<version>


К примеру:

apt-cache showpkg mysql-server или apt-cache policy mysql-server

apt-get install mysql-server=5.5.22-0ubuntu1

30 Январь, 2014

Проксируем ssh через промежуточный сервер

Вариант 1: С LocalForwarding

Открываем 2 консоли.

В первой пишем :

ssh -v -L 9999:secure-server:22 allow-server

где secure-server это адрес защищенного сервера, allow-server доступный сервер через который заходим.

В итоге на локальной машине открывается 9999 порт при коннекте к которому по ssh открывается доступ к secure-server.

Во втором окне терминала пишем:

ssh user@localhost -p9999

В итоге во втором окне терминала открывается ssh-консоль secure-server.

Вариант 2: Без LocalForwarding

ssh -t user@proxyserver ssh user@secureserver

Второй вариант можно прописать в ~/.ssh/config чтобы не набирать длинную строку.

Host proxysrv
User user  

И сразу же после этих строк:

Host securesrv  
ProxyCommand ssh -q proxyserver nc -q0 secureserver
User user

Теперь можно просто набрать в консоли ssh securesrv и мы сразу попадаем на нужный сервер.

30 Январь, 2014

Ставим drush на шаред-хостинге с ssh

Если есть ssh-доступ на сервер хостера, есть желание рулить Drupal-сайтом из drush и нет прав на установку ПО то в этой ситуации все равно можно выкрутиться.

1) Заходим на сервер по ssh
2) mkdir bin (для шареда на ispmanager путь будет типа /var/www/user/data/bin/)
3) cd bin
4) wget https://github.com/drush-ops/drush/archive/master.zip
5) unzip master.zip
6) rm master.zip
7) mv drush-master drush
8) nano ~/.bashrc
9) там пишем:

PATH=/var/www/user/data/bin/drush/:$PATH

export PATH

10) Проверяем, запускаем еще одну копию bash командой bash =)
11) Пишем drush, если вывелся список комманд drush то все ок, если not found, то мы где-то косячнули

Вот собственно и все =)

30 Январь, 2014

ISPmanager exclude backup dir

Для того чтобы исключить из резервной копии некоторые директории можно подредактировать файл backup.conf
Основной конфиг находится вот здесь /root/.backup.conf

` BackupPlan 1 {

    Name backup  
    Storage local  
    StoragePath /bup/  
    Archiver tgz  
    Period daily 
    Starttime 02:32  
    DLimit 6  
    WLimit 3  
    MLimit 1  
    DelClient on  
    Overwrite on  
    Compress 0  
    Content include "mysql" "mysql"  
    Content include "mgrdata" "*"  
    Content include "sysfiles" "*"  
    Content include "user" "*"  
Content exclude "file" "/var/www/site/data/www/site.ru/bitrix/backup"  

`

Здесь важна строчка Content exclude "file"
Чтобы пропустить директорию backup обязательно не ставить в конце слеш

30 Январь, 2014

Консольные горячие клавиши

Ctrl-A — вернуться в начало строки
Ctrl-E — перейти в конец строки
Ctrl-W — удалить слово перед курсором
Alt-D — удалить слово после курсора
Ctrl-U — удалить всю строку слева от курсора.
Ctrl-R — поиск по истории команд

И еще работает вот это

30 Январь, 2014

Советы #1

  1. Очистка консоли

    clear

  2. Если очистка не помогает то можно попробовать сделать reset

    reset

  3. Поиск в истории команд

    CTRL+R
    Для уточнения поиска например если вы ввели cd, то можно снова нажимать Ctrl+R для выбора подходящего варианта.

  4. Создание пустого файла / Очистка уже существующего

    > file

  5. Узнать тип файла

    file filename

  6. Переход в предыдущую директорию

    cd -

  7. Проверка целостности архива tar.gz

    gzip -t -v archive.tar.gz

  8. Разлогиниться из любой DE / Завершить все задачи

    kill -9 -1

  9. Запуск предыдущей команды из под sudo

    sudo !!

  10. Запуск предыдущей команды с заменой foo на bar

    ^foo^bar

30 Январь, 2014

Запуск простейшего HTTP-сервера

Запуск простейшего HTTP-сервера из любой директории на 8000 порту.

Для Python 2.x:

python -m SimpleHTTPServer [PORT]

Для Python 3.x:

python -m http.server [PORT]

Как подметил @_iiiypuk этот сервер естественно умеет исполнять python из директории /cgi-bin/

Home