RouterBoard RB750 + OpenWRT

Для сборки Open-Wrt и прошивки в Mikrotik RouterBoard 750 потребуется:

  • Linux box;
  • прямой кабель ethernet (патчкорд).
Примечание: у меня Mikrotik отказывался загружаться через кросоверный (перекрещенный) кабель соединяющий его с интерфейсом компьютера Mikrotik< ->Компьютер.

Установить необходимые пакеты для сборки образа Open-WRT (список возможно не полный и вам потребуется что-то ещё)
Команда выполняется с привилегиями root

# yum install gcc gcc-c++ ncurses-devel zlib-devel flex git -y

Continue reading RouterBoard RB750 + OpenWRT

Простой скрипт автоматического рестарта http сервера

Если по непонятным причинам web сервер повисает, а времени на разбирательства нет, то неплохим вре́менным решением будет автоматический перезапуск web сервера. Такая ситуация сложилась с одним проектом у знакомого, администратор которого накануне уехал в отпуск. Вот скрипт который отлично справился с задачей.
Continue reading Простой скрипт автоматического рестарта http сервера

bash, парсинг имени файла и пути к нему

bash имеет встроенные функции манипуляции со строками. В частности функции удаления подстрок.

${string#substring} — удаляет кратчайшее вхождение подстроки $substring от начала строки $string.

${string##substring} — удаляет длиннейшее вхождение подстроки $substring от начала строки $string.

Аналогичным образом действует оператор % но действует от конца строки.

${string%substring} — удаляет кратчайшее вхождение подстроки $substring в конце строки $string.

${string%%substring} — удаляет длиннейшее вхождение подстроки $substring в конце строки $string.

При помощи этих функций можно получить имя файла, путь к файлу и его расширение:

# переменная для работы содержащая полное имя и путь к файлу
fullpathname="/root/temp/file.tar.gz"

# Получить путь (часть от начала строки до последнего слева слеша)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%/*}"
/root/temp

# Получить имя файла (часть от самого правого слеша до конца строки)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname##*/}"
file.tar.gz

# Получить строку левее самой левой точки
# !!! Если точка будет находиться в пути, то отрежет по ней
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%%.*}"
/root/temp/file

# Получить путь и имя файла без расширения (удаляет все правее самой правой точки)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%.*}"
/root/temp/file.tar

# Получить расширение (правая часть от последней слева точки в имени файла)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname##*.}"
gz

# Все расширения (правая часть от первой слева точки в имени файла)
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname#*.}"
tar.gz

# Удаление любого расширения
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%.*}"
/root/temp/file.tar

# Удаление расширения .gz
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%.gz}"
/root/temp/file.tar

# Замена расширения .gz на .doc
$ fullpathname="/root/temp/file.tar.gz"; echo "${fullpathname%.gz}.doc"
/root/temp/file.tar.doc

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

fullpathname="/root/temp/file.tar.gz"
              |--------------------|   - fullname
              ^--------^               - path
                         ^---------^   - name
                                  ^^   - extension
             #>>                       - от начала короткое удаление
            ##>>>>                     - от начала длинное удаление
                                  <<%  - от конца короткое удаление
                                <<<<%% - от конца длинное удаление

По материалам Advanced Bash-Scripting Guide

apache не выполняет php скрипт, а отображает его содержимое.

<?php
phpinfo();
?>

Современные версии php по умолчанию не обрабатывают короткий тэг. То есть, надо писать не

<?
phpinfo();
?>

но

<?php
phpinfo();
?>

Настройка находится здесь:
/etc/php.ini

short_open_tag = Off

Нужно включить On посде этого будет обрабатываться короткий открывающий тэг.

pure-ftpd не создаёт домашний каталог виртуального пользователя

pure-ftpd
Как описано в документации опция CreateHomeDir разрешает автоматически при первом входе на ftp создавать домашние каталоги для виртуальных пользователей pure-ftp при каждом входе (если каталог не существует).

После установки в конфиге /etc/pure-ftpd/pure-ftpd.conf опций

VerboseLog yes
CreateHomeDir yes

я ожидал что домашние каталоги пользователей будут создаваться. Однако они не создавались ни при добавлении виртуального пользователя ни при логине пользователя. А в логе /var/log/messages появляются такие вот скупые записи:

May 28 18:12:09 b01 pure-ftpd: (?@127.0.0.1) [INFO] New connection from 127.0.0.1
May 28 18:12:09 b01 pure-ftpd: (?@127.0.0.1) [ERROR] Home directory not available - aborting

Continue reading pure-ftpd не создаёт домашний каталог виртуального пользователя

Удаление vg и lv после физического отключения диска

Случилось так, что я глянул в mount и не увидел примонтированных LV со внешнего диска и спокойно выдернул usb коннектор того самого диска. И только через пару дней обнаружил, что команды lvs и vgs проходят с ошибками. Это были активные vg о которых я забыл перед физическим отключением диска. Так как тома́ с данными были предварительно размонтированы то сами данные на отключённом диске были в порядке. Меня раздражало несколько этих сообщений об ошибке. Нужно было их убрать. И конечно без перезагрузки сервера.

[root@csa01 etc]# vgs
  /dev/VG_RAID_COPY/lv_1: read failed after 0 of 4096 at 2000393535488: Input/output error
  /dev/VG_RAID_COPY/lv_1: read failed after 0 of 4096 at 2000393592832: Input/output error
  /dev/VG_RAID_COPY/lv_1: read failed after 0 of 4096 at 0: Input/output error
  /dev/VG_RAID_COPY/lv_1: read failed after 0 of 4096 at 4096: Input/output error
  VG          #PV #LV #SN Attr   VSize   VFree  
  VG_CSA01_DATA   1   3   0 wz--n-   7.28t   4.79t
  VG_CSA01x       1   5   0 wz--n- 465.54g 421.68g

Continue reading Удаление vg и lv после физического отключения диска

zabbix-server ошибки в логе сервера

На машине с zabbix-server в логе обнаружилось много ошибок:
/var/log/zabbix/zabbix_server.log

1735:20130402:101321.073 Sending list of <span style="text-decoration: underline;">active checks</span> to [<strong>10.8.12.57</strong>] failed: host [v03-b] not found
1732:20130402:101324.512 Sending list of <span style="text-decoration: underline;">active checks</span> to [<strong>10.8.12.6</strong>] failed: host [ns1] not found
1737:20130402:101325.918 Sending list of <span style="text-decoration: underline;">active checks</span> to [<strong>10.8.12.56</strong>] failed: host [v03-a] not found
1738:20130402:101354.219 Sending list of <span style="text-decoration: underline;">active checks</span> to [<strong>10.8.12.220</strong>] failed: host [mgmt01] not found

РЕШЕНИЕ
Входить на каждый клиент по IP из лога сервера и добавлять в конфигурацию zabbix-agentd опцию отключеня активной проверки и рестартовать демона.

ssh root@10.8.12.57
echo DisableActive=1 >> /etc/zabbix/zabbix-agentd.conf
service zabbix-agent restart

Проверка прав доступа к файлам Linux

Суть проверки проста: от имени пользователя чьи права проверяются нужно запустить команды

Проверка прав на чтение

su -l login-for-user
find / -type d \( -wholename '/dev/*' -o -wholename '/sys/*' -o -wholename '/proc/*' \) -prune -o -exec test -r {} \; -exec echo {} is readable \; 2&gt;/dev/null

Проверка прав на запись

su -l login-for-user
find / -type d \( -wholename '/dev/*' -o -wholename '/sys/*' -o -wholename '/proc/*' \) -prune -o -exec test -w {} \; -exec echo {} is writable \; 2&gt;/dev/null

Чтобы разбрать результат по полям нужно через конвеер отправить вывод команде:

cut -d'/' -f1,2,3 | sort -u

Разновидность команды (на современных версиях find):

su -l login-for-user
find / ! -writable
find / -writable

Увеличение размера файловой системы ext4

Один мой знакомый купил виртуалку у хостера с предустановленной системой. И почему-то постеснялся побеспокоить хостера с вопросом, а где же его заявленные 100G. Хостер очевидно движимый самыми добрыми намерениями предустановил виртуалку на маленький диск оставив остальное пространство свободным. Я так понимаю чтобы пользователь смог создать нужные разделы. Ничего сложного здесь нет. Хотя самым муторным для меня оказалось попасть в нужный размер чтобы занять всё доступное пространство.

[root@maxbel ~]# vgdisplay --units S vg_maxbel
  Free  PE / Size       23072 / 189005824 Se
[root@maxbel ~]# lvextend -L +189005824s /dev/vg_maxbel/lv_root 

Проверяем что место полностью распределено

[root@maxbel ~]# vgs --units s vg_maxbel
  VG        #PV #LV #SN Attr   VSize      VFree
  vg_maxbel   1   3   0 wz--n- 208683008S    0S

Изменяем размер на лету (online)

[root@maxbel ~]# resize2fs -p /dev/vg_maxbel/lv_root 

наслаждаемся результатом:

[root@maxbel var]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_maxbel-lv_root
                       94G  971M   88G   2% /
tmpfs                 504M     0  504M   0% /dev/shm
/dev/vda1             485M   30M  431M   7% /boot
/dev/mapper/VolGroup00-LogVol00
                       30G  3.7G   25G  13% /mnt/vdb1