четверг, 27 октября 2011 г.

Как перенести раздел на другой диск

Чтобы увеличить размер раздела /var было решено перенести его на другой жесткий диск.

ОС - debian, виртуальная машина на citrix xenserver.

1) Останавливаем виртуальную машину. Раздел /var был на отдельном виртуальном диске. Оторвем этот раздел от виртуальной машины с помощью citrix xencenter (кнопка Detach на вкладке Storage).

2) Для переноса данных нам потребуется второй виртуальный сервер Добавим этот раздел ко второму серверу желательно в режиме read-only.
Создадим новый виртуальный диск через xencenter, на который будем переносить данные.

3) Запускаем второй сервер.
Выполняем
fdisk -l
и находим наши диски
/dev/xvde -старый диск
/dev/xvdf - новый диск

4) Создаем новый раздел на новом диске (/dev/xvdf):
fdisk /dev/xvdf
жмем
n - новый раздел
p - primary
1 - номер раздела
жмем несколько раз Enter
w - сохраняем все изменения.
посмотрим что получилось:
fdisk -l

находим что-то вроде:
Disk /dev/xvdf: 171.8 GB, 171798691840 bytes
255 heads, 63 sectors/track, 20886 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xfac3e7ec

Device Boot Start End Blocks Id System
/dev/xvdf1 1 20886 167766763+ 83 Linux

5) Форматируем новый раздел
mkfs -t ext3 /dev/xvdf1

6) Монтируем
mkdir /mnt/new
mkdir /mnt/old

mount /dev/xvdf1 /mnt/new
mount /dev/xvde1 /mnt/old

7) Копируем данные со старого раздела на новый
cd /mnt/old
cp -ax ./ /mnt/new

8) Отмонтируем
umount /mnt/new
cd /
umount /mnt/old

9) Теперь можно новый диск присоединить к первой виртуальной машине.

вторник, 25 октября 2011 г.

SSH туннель

Иногда возникают ситуации, когда между двумя *nix компьютерами/серверами нужно построить туннель чтобы получить доступ к ресурсам компьютера.

Например, ситуация, когда один компьютер находится за nat, а второй имеет белый ip.

SSH туннель можно сделать очень просто двумя командами.
Но на втором сервере нужно добавить строку PermitTunnel point-to-point в конфигурационный файл /etc/ssh/sshd_config и перезапустить ssh сервер.

ssh -f root@example.com -w 0:0 ifconfig tun0 10.0.0.1/30 pointopoint 10.0.0.2
ifconfig tun0 10.0.0.2/30 pointopoint 10.0.0.1

example.com - сервер в интернете.
При этом нам нам нужно иметь root доступы на обоих серверах, т.к. необходимы права суперпользователя для создания новых сетевых интерфейсов (tun0).

Для того чтобы ssh туннель восстанавливался  после обрыва соединения, можно создать простенький скрипт, который будет проверять доступность удаленного компьютера ping-ом . Чтобы скрипт работал в автоматическом режиме (не спрашивая пароль) нужно организовать авторизацию ssh между компьютерами по ключам.

После этого добавляем это скрипт в crontab пользователя root, того компьютера, который находится за nat.

Вот этот скрипт:

#! /bin/sh
echo "==========="`date`"================="
EXTSERVER="example.com"
EXTTUN="10.0.0.1"
LOCALTUN="10.0.0.2"

CREATETUN0="ssh -o TCPKeepAlive=yes -o ServerAliveInterval=300 -o ServerAliveCountMax=3 -f root@"$EXTSERVER" -w 0:0 ifconfig tun0 "$EXTTUN"/30 pointopoint "$LOCALTUN
CREATETUN1="/sbin/ifconfig tun0 "$LOCALTUN"/30 pointopoint "$EXTTUN

if ping -c4 $EXTTUN > /dev/null 2>&1; then
 echo "tun work"
 else
  echo "tun do not work"
   #прибьем все старые наши ssh тунели
    for PID in `pgrep -f "$CREATETUN0"`; do
     echo "kill process whith pid="$PID
     kill "$PID"    
    done;
    sleep 20
    echo "create new ssh tunnel"
    $CREATETUN0
    echo "ok"
    echo "create tun0"
    $CREATETUN1
    echo "ok"
fi
echo "===========stop cron================="