воскресенье, 4 декабря 2011 г.

Перенос /var с корневого раздела на отдельный раздел диска

Предыстория: Некоторое время назад был арендован виртуальный сервер, с развёрнутым на нём Debian 6. Все каталоги ОС находились на одном (совсем небольшом) разделе диска. Сервер успешно предоставлял доступ к расположенным на нём сайтам, крутил небольшую БД на MySQL, места хватало, и все были счастливы. Позже было принято решение запустить на нём почтовые службы, и тут возникла проблема - для почтовых ящиков пользователей места было маловато. :(  Было решено увеличить дисковое пространство, изменив размер основного раздела (этот вариант сразу отпал, поскольку раздел был в Ext3) или, создав отдельный "диск" (средствами панели администрирования виртуального сервера), перенести раздел /var на него. Что и было сделано. Рассмотрим процедуру подробнее:


Размечаем раздел под /var на новом диске (новый диск виден в системе как /dev/xvdb):

fdisk /dev/xvdb
n
p
1
нажимаем "ввод"
нажимаем "ввод"
w

Форматируем созданный раздел в Ext4:

mkfs.ext4 /dev/xvdb1

И монтируем его куда-нибудь в систему (в данном случае в /mnt):

mount /dev/xvdb1 /mnt

Копируем старый /var на новый раздел:

cd /var
cp -a ./* /mnt

Добавляем строчку в /etc.fstab:

/dev/xvdb1    /var    ext4    defaults    0    0

Перезагружаемся:

reboot

После перезагрузки, выполнив команду df -h, видим строчку:

 /dev/xvdb1            4,0G  1,9G  2,0G  49% /var

Теперь система работает с разделом /var на отдельном диске. Проверяем, что все необходимые на сервере службы (web-сервер, базы данных и пр.) работают нормально и...

Очищаем старый /var, для этого останавливаем основные службы (web-сервер, базы данных и пр.):

/etc/init.d/apache2 stop
/etc/init.d/nginx stop
/etc/init.d/mysql stop
и т.д.

Нам необходимо отмонтировать новый /var, однако, при попытке выполнить команду umount /var, получаем сообщение:

umount: /var: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

Решить эту проблему можно, загрузившись в singlemod, но сделать это на удалённом, виртуальном сервере крайне проблематично :(

Тут нам на помощь придёт опция "-l" команды umount:

umount -l /var

Удаляем содержимое старого /var:

cd /var
rm -rf ./*

И перезагружаемся...

reboot

Вот и всё - /var перенесён на новый раздел, места теперь достаточно!