Перенос mysql из /var/db/mysql во FreeBsd

Задача: нужно изменить место хранения mysql баз на диске (чаще всего второй винт, например это будет /mysql)
Шаг 1: стопорим mysql
service mysql-server stop

Шаг 2: создаем новое хранилище, копируем данные, ставим юзера и группу
mkdir /mysql
cp -r /var/db/mysql /mysql
chown -R mysql:mysql /mysql

Шаг 3: добавляем в /etc/rc.conf строчку
mysql_dbdir="/mysql"

Шаг 4: запускаемся
service mysql-server start

Если что-то идет не так идем смотреть лог ошибок в /mysql, файлик с рассширением .err
4 ноября 2014, 07:12

Как примонтировать новый диск в систему FreeBsd

Допустим, имеется диск /dev/ad6 и его нужно добавить в систему.
Для начала давайте отформатируем его
newfs -U /dev/ad6

Теперь монтируем, например в каталог /mnt (должен быть создан)
mount -t ufs /dev/ad6 /mnt

Чтобы после ребута диск автоматически монтировался идем в /etc/fstab и добавляем там вот эту строчку
# Device		Mountpoint	FStype	Options		Dump	Pass#
/dev/ad6                /mnt            ufs     rw              2       2
4 ноября 2014, 07:12

Размер папки в FreeBsd

Чтобы узнать размер папки нужно запустить команду
du -hsx /home

Если нужно узнать размер папок первого уровня вложенности в какой-то папке, то поможет
du -h -d 1 /home
4 ноября 2014, 07:12

Отмена перехода на зимнее время FreeBsd

cd /usr/ports/misc/zoneinfo
make install clean
rehash
zic -l /usr/share/zoneinfo/Europe/Moscow

Далее перезапускаем сервисы
service mysql-server restart
service cron restart
4 ноября 2014, 07:12

Отмена перехода на зимнее время Debian

Как вы знаете, правительство РФ отменило переход на зимнее время, поэтому чтобы временные зоны работали
правильно нам нужно обновить пакет tzdata
wget http://ftp.us.debian.org/debian/pool/main/t/tzdata/tzdata_2011k-0squeeze1_all.deb
dpkg -i tzdata_2011k-0squeeze1_all.deb
date
4 ноября 2014, 07:12

Установка gitosis на FreeBsd

Для начала нужно установить сам git
cd /usr/ports/devel/git
make install clean

Теперь устанавливаем непосредственно gitosis
cd /usr/ports/devel/py-gitosis
make install clean


Установим sudo
cd /usr/ports/security/sudo
make install clean distclean
rehash


Нужно создать юзера, например git
adduser git

Далее следуем вопросам, оставляем все по умолчанию, только на вопрос об авторизации по паролю надо ответить нет
Use password-based authentication? [yes]: no
Вот такой юзер должен получиться
sername   : git
Password   : <disabled>
Full Name  :
Uid        : 1008
Class      :
Groups     : git
Home       : /home/git
Home Mode  :
Shell      : /bin/sh
Locked     : no


Необходимо разрешить юзеру git удаленный доступ по ссш, для этого в /etc/ssh/sshd_config добавляем строчку
AllowUsers git

и перезапускаем sshd
service sshd restart


Теперь сгенерим ключик для юзера git
ssh-keygen -t rsa

Жмем несколько раз enter, ключик создается в /root/.ssh

Инициализируем gitosis репозиторий, скармливаем ему публичный ключик, который только что создали
sudo -H -u git gitosis-init < /root/.ssh/id_rsa.pub

Должно получиться примерно так
Initialized empty Git repository in /usr/home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /usr/home/git/repositories/gitosis-admin.git/

Gitosis готов, теперь надо добавить ключ со своей машины, чтобы удаленно админить все репозитории.
Для этого зайдем под юзером git
su git
cd ~

Создаем временную папку
mkdir ~/tmp
cd ~/tmp

Теперь склонируем наш админский репозиторий
git clone ~/repositories/gitosis-admin
cd gitosis-admin

Там будет файл gitosis.config вот такого содержания
[gitosis]

[group gitosis-admin]
members = root@server.ru 
writable = gitosis-admin

Чтобы иметь возможность управлять им удаленно нужно добавить себя и свой ключ в этот репозиторий.
Для этого во-первых поправим конфиг
[gitosis]

[group gitosis-admin]
members = root@server.ru Ncs
writable = gitosis-admin

Обратите внимание, я дописал в members Ncs.
Ncs это не юзер сервера freebsd, как раз gitosis и позволяет не плодить юзеров.
И во-вторых необходимо положить ПУБЛИЧНЫЙ ключ для доступа Ncs под названием Ncs.pub в директорию keydir
Когда поправлен конфиг и ключ Ncs.pub положен в keydir можно делать коммит
git add .
git commit -a -m 'Ncs added'
git push origin master


Всё, теперь можно удалить папку tmp.
Чтобы склонировать репозиторий удаленно надо использовать следующий вызов
ssh://git@server.ru:22/gitosis-admin.git
И конечно же, при клонировании нужно указывать ПРИВАТНЫЙ ключ, который является парой для публичного ключа, добавленного в keydir.
4 ноября 2014, 07:12

Определение кодировки файла в UNIX

file -i file.txt
4 ноября 2014, 07:12

Как переустановить библиотеки с зависимостями

После очередного обновления ПО в скриптах перестала работать библиотека GD, причем именно с png файлами.
Это лечится пересборкой всех зависимых библиотек
portmaster -r png
4 ноября 2014, 07:12

Установка nodejs на FreeBsd

Все очень просто ставится из портов
cd /usr/ports/www/node
make install clean
rehash

После установки проверим выполнение ява-скрипт файла
echo 'var a=2+2; console.log(a);' > ~/test.js
node ~/test.js

Если вывело 4, то все нормально.

Установка npm
curl http://npmjs.org/install.sh | sh
npm install express
4 ноября 2014, 07:12

Как закрыть соединение mysql из запроса

Для начала создается функция
 DELIMITER $$

    DROP FUNCTION IF EXISTS sfKillConnection $$

    CREATE FUNCTION sfKillConnection() RETURNS INT
    BEGIN
        SELECT connection_id() into @connectionId;
        KILL @connectionId;
        RETURN @connectionId;
    END $$

    DELIMITER ;

Затем можно делать запрос
  select if(
  (SELECT 1>2), 'ok', sfKillConnection()
  );

В данном примере этот запрос всегда будет закрывать соединение.
Где это может понадобиться? Например, в update скриптах для базы.
  SET @VersionToUpdate = 10;
  select if(
  (SELECT getCurrentVersion() = @VersionToUpdate), 'ok', sfKillConnection()
  );
DROP table my_table;

Если getCurrentVersion() не равно 10, то все запросы, которые идут после условия выполнены не будут, тем самым не получится применить update скрипт для неверной версии базы.
4 ноября 2014, 07:12

Вычисление разницы в днях между датами

<?php
echo date_diff(new DateTime(), new DateTime('2011-09-01 12:12:11'))->days;
?>
4 ноября 2014, 07:12

Включаем gzip сжатие и кэширование в nginx

Помещается в секцию http или server
expires max;
gzip  on;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_buffers 16 8k;
gzip_disable "MSIE [1-6].(?!.*SV1)";

text/html в gzip_types писать не нужно, он всегда сжимается по умолчанию, если gzip включен.
4 ноября 2014, 07:12

Удаление из MYSQL записи символа \n

UPDATE tbl set pole = REPLACE(pole, CAST(0x0d AS CHAR), '')
4 ноября 2014, 07:12

Защита от брутфорса по ssh во FreeBsd

Для защиты будем использовать пакетный фильтр pf, для его активации необходимо проделать следующее
kldload pf
kldstat
echo 'pf_enable="YES"' >> /etc/rc.conf


Теперь добавим правило в /etc/pf.conf (фильтрующие правила нужно добавлять после всех остальных правил)
if="em0"
pass in on $if proto tcp from any to $if port ssh flags S/SA keep state (max-src-conn-rate 3/60, overload <ssh-bruteforce> flush global)
block drop in quick on $if from <ssh-bruteforce>
#обязательно оставьте пустую строку в конце файла


$if = em0 это наша сетевая карта.
max-src-conn-rate 3/60 означает не более 3 коннектов за 60 секунд, если более, то ип добавляется в таблицу

Запустим пакетный фильтр с правилами
pfctl -e
pfctl -f /etc/pf.conf


Теперь надо обеспечить периодическую очистку таблицы нарушителей (мало ли что), для это ставим expiretable
cd /usr/ports/security/expiretable
make install clean
rehash

И вешаем на крон каждые 5 минут очистку записей, которые протухли более часа назад
Для этого добавляем строчку в /etc/crontab
*/5 * * * *  root  /usr/local/sbin/expiretable -t 3600 ssh-bruteforce

Обратите внимание, что крон запускается от рута.

Всё, теперь если частота доступа по ссш превысит 4 раза в минуту, то ип блокируется на целый час.
Что характерно, блокируется доступ к серверу целиком по всем интерфейсам.
4 ноября 2014, 07:12

Как узнать кто входил по ssh?

Для этого в *nix есть простые утилиты, просто наберите это в консоле и смотрите кто сейчас торчит у вас на сервере.
who

last

w
4 ноября 2014, 07:12

Установка портов на FreeBsd

Если на вашем новом сервере нет дерева портов (хостер заюзал минимальную установку), то самое время его установить
csup -h cvsup6.freebsd.org /usr/share/examples/cvsup/ports-supfile

Также неплохо было бы установить исходные коды
csup -h cvsup6.freebsd.org /usr/share/examples/cvsup/stable-supfile


Почему используется cvsup6.freebsd.org? Просто это зеркало быстрее для России и Украины.
4 ноября 2014, 07:12

Как выйти из vi

Vi - очень "интуитивно-понятный" консольный редактор, если вы в него случайно попали, то хрен выйдите.
Все горячие клавиши там сделаны сгоряча.
Надо нажать :, а потом набрать
:wq
4 ноября 2014, 07:12

Как подключаться через SSH туннель

Если у вас есть сервер или vds, то вы можете использовать его как прокси. А так как подключаться будем по ssh, то получается довольно безопасный прокси с шифрованием.
Для начала нужно законнектиться на сервер. Я покажу как это сделать из windows при помощи putty
Скачиваем и запускаем эту крохотную софтинку, далее вводим урл или ип сервера

Затем идем во вкладку ssh->tunnels и ставим там динамический порт (для примера 999)

Не забываем нажать ADD, должно получиться вот так

Далее жмем OPEN, вводим логин и пароль, короче, входим на сервер по ssh как обычно.
Не закрывайте putty
Теперь необходимо настроить браузер. Я обычно юзаю opera, но в ней нет поддержки socks5 прокси, поэтому будем использовать firefox. Наша задача состоит в настройке proxy сервера, лезем в настройки

Затем вкладка дополнительно -> сеть -> настроить

Там выбираем ручную настройку прокси, вписываем порт и хост

Все, теперь можно выходить в интернет через ssh тунель, и у вас будет ип вашего сервера. В UNIX всё проще
ssh -N -D 9999 root@server_ip
4 ноября 2014, 07:12

Как склонировать репозитарий через ssh по нестандартному порту

git clone git+ssh://git-user@git-host.com:1111/rep.git rep
4 ноября 2014, 07:12

Шифрование каталога во FreeBsd при помощи pefs

Страница проекта на github
Качаем последнюю версию, на момент написания статьи это 2011-04-14
fetch https://github.com/downloads/glk/pefs/pefs-2011-04-14.tar.gz
tar -xvf pefs-2011-04-14.tar.gz
cd pefs-2011-04-14
make

Ну что же, как обычно получаем тупую ошибку. Опять разрабы не могут всё сделать как надо
===> sys/modules/pefs (all)
"Makefile", line 11: Malformed conditional (${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64")
"Makefile", line 14: if-less endif
make: fatal errors encountered -- cannot continue
*** Error code 1

Открываем sys/modules/pefs/Makefile, ищем там вот эти строки
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
SRCS+=  pefs_aesni.c
CFLAGS+= -DPEFS_AESNI
.endif

И делаем из нее вот это
#.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
SRCS+=  pefs_aesni.c
CFLAGS+= -DPEFS_AESNI
#.endif

Ну теперь-то всё должно собраться нормально
make install clean
rehash


Когда pefs установлен, можно шифровать каталог.
Для начала создадим его
mkdir /secret
pefs mount /secret /secret
pefs addkey /secret

Вводим пароль (желательно подлиннее)
Шифрованный каталог создан, теперь можно проверить его работу.
Создаем файл
echo 'test' > /secret/file.txt

Проверяем его
cat /secret/file.txt

Теперь размонтируем каталог
pefs unmount /secret

Снова проверим содержимое файла
cat /secret/file.txt

В ответ получаем cat: /secret/file.txt: No such file or directory
Тоесть, не примонтировав каталог и не зная пароля невозможно получить содержимое шифрованного каталога. Это полезно если вы сдаете винт в ремонт на восстановление, либо к вам заглянули маски-шоу :)
При каждом ребуте нужно монтировать каталог и вводить ВЕРНЫЙ пароль, если пароль не верный, то содержимое будет также недоступно.
Монтируем снова
pefs mount /secret /secret
pefs addkey /secret

Если верно ввести пароль, то содержимое будет вновь доступно
cat /secret/file.txt
4 ноября 2014, 07:12