«Можно ли сделать произвольную схему разбивки диска на виртуальном сервере?» Такой вопрос однажды возник в моей голове. Сразу скажу — речь о случае, когда нет доступа к гипервизору (иначе это было бы слишком легко). На первый взгляд может показаться, что вопрос не решаемый. В самом деле — чтобы переразбить раздел, его нужно отмонтировать. В случае с домашними компьютерами для этого используют Live{CD,USB}. Но если в вашем распоряжении только ssh? Пару секунд на обдумывание — и я нашёл решение. Казалось, на этом можно успокоиться: сам проблему придумал, сам решил. Но потом я в шутку задал этот же вопрос коллеге, будучи уверен, что у него так же не возникнет затруднений с решением вопроса. Результаты меня удивили. Опросив других, оказалось что все опрошенные уверены, что переразбить диск на VPS невозможно. Дальше всех пошёл только один парень, который сказал: «Можно, но не корневой раздел».

Если вы тоже не знаете решения этой задачки или просто хотите посмотреть на пример реализации — добро пожаловать в статью!

Зачем вся эта возня?


По-большому счёту, конечно, не обязательна. Сервер ведь всё равно работает. Но, пожалуй, у каждого есть своё видение «правильной» разбивки, которое может не совпадать с тем, что есть на самом деле.

Мой виртуальный сервер с CentOS 6.6 x86-64 имел такую схему:

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda3       24G  1,7G   21G   8% /
tmpfs           371M     0  371M   0% /dev/shm
/dev/xvda1      194M   29M  156M  16% /boot

# free -m
...
Swap:          511          0        511

В моей философии 200 метров на загрузочный раздел — это расточительство. Обычно я использую 32 Мб (из любви к «круглым» числам). Этого мне достаточно для размещения 4 ядер и ещё остаётся. Вполне естественно, что мне хотелось бы более эффективно использовать место виртуального сервера — убрать лишнее из /boot, присоединить к /. А заодно сменить ОС. Компания, которой принадлежит виртуальный сервер, предоставляет фиксированный список возможных операционных систем. К сожалению, в нём нет моей любимой Gentoo. Но… Разве это действительно значит, что я не могу её использовать?

Ответ на главный вопрос жизни, вселенной и этой статьи


Так как же переразбить корневой раздел? Специально для тех, кто не догадался сразу, я оставил выше подсказки. Да, всё верно — нас спасёт swap.

Вот общая схема для тех, кому нужен только сам принцип и нет нужды в объяснениях:
  • избавляемся от swap'а — получаем свободный раздел;
  • создаём на нём ФС;
  • облегчаем текущий корневой раздел до размера ФС на бывшем swap'е;
  • копируем данные на новый раздел;
  • переносим загрузочный раздел;
  • вертим как пожелаем освободившиеся разделы;
  • при необходимости повторяем действия по переносу корня до полного удовлетворения.

Как всё это сделать?


Вначале — отключим раздел подкачки и создадим на нём ФС. После чего уберём строчку о нём из /etc/fstab. Теперь интересный этап — облегчение ОС. Само собой, что если у вас уже есть какие-то данные на сервере — заберите их. Однако этого, скорее всего, будет не достаточно. В моём случае раздел xvda2 (где был swap) имел размер чуть более 0,5 Гб, а ОС, которую я получил после создания сервера — чуть более 1,5 Гб. Немного не хватает. Чтобы уменьшить размер, я выпилил все приложения, о которых знал, и которые не влияли на возможность:
  • загрузки сервера;
  • изменения разделов;
  • создания ФС;
  • работы с сетью;
  • подключения по SSH.

Если на вашем сервере есть предустановленная панель управления (в «моей» компании есть возможность сразу получить ISPmanager) — то там гарантировано будет куча лишнего для нас в данный момент. Сохраните конфиги, если желаете, а потом сносите все эти почтовые-веб-фтп-днс-прочие-сервера.

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

# dpkg --list

А в семействе красношапочных:

# yum list installed

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

Не переусердствуйте!
Я настолько увлёкся чисткой системы, что и сам не заметил, как остался без какого-либо текстового редактора. Т. к. ставить их заново мне было лень, то все конфигурационные файлы пришлось править при помощи sed'а. Ощущения были… интересные.

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

Кстати, есть ещё две возможности незначительно поправить место:
— изменить в первую очередь размер раздела с /boot, чтобы высвобожденное место добавить к месту раздела подкачки;
— и более экстремальная чистка — удаление (а лучше перенос на другую машину) содержимого /usr — все эти doc/, man/, файлы часовых поясов, шрифты и прочее. Будьте трижды внимательны при выполнении этих действий и не приступайте к ним без крайней на то необходимости.

Но, положим, вы всё же справились. Скопируйте всё содержимое текущего корня на новое место. И не забудьте поправить значения в /etc/fstab и в конфигурации загрузчика.

Вы так же можете перенести на новый раздел и каталог /boot, если вы решили изменять размер и загрузочного раздела (разумеется если /boot у вас вообще на отдельном разделе).

С Grub2 проблем не было. А вот Grub legacy (он же Grub 0.97) не подозревает, что имена разделов могут быть на подобии /dev/xvda2. Научим его этому. В файле /sbin/grub-install нужно найти строку:

        tmp_disk=`echo "$1" | sed -e 's%\([shv]d[a-z]\)[0-9]*$%\1%' 

А ниже:

        tmp_part=`echo "$1" | sed -e 's%.*/[shv]d[a-z]\([0-9]*\)$%\1%' 

В моём случае это строки 99 и 105, но не исключаю что в разных дистрибутивах могут быть небольшие различия.
Замените вот эту часть:

[shv]d

Таким образом:

x[shv]d

Теперь с установкой grub 0.97 проблем не будет.

Если при удалении программ, установке загрузчика и редактировании конфигурационных файлов не было допущено ошибки, то, перезагрузившись, вы получите систему, которая работает на одном небольшом разделе. Теперь достаточно удалить старый корневой раздел (xvda3 в моём случае) и в конце освободившегося пространства создать новый. В очередной раз перетащив туда корень — мы получаем возможность менять разделы с самого начала диска.

Так как я решил заодно и поменять ОС, то вместо копирования туда-сюда файлов корневого раздела можно сразу создавать в новом месте файловую систему будущей ОС. К счастью, Gentoo не использует все эти новомодные графические установщики. Для того, чтобы поселиться на новом месте, ей достаточно распаковать чемоданы (архив третьей стадии — минимальная среда ОС), поправить несколько конфигов и выполнить несколько команд. К сожалению, мне не известно, сработает ли подобный подход с другими дистрибутивами.

Изменение разделов


Будьте внимательны при работе с разделами. Ядро не узнает о сделанных вами изменениях, пока вы не перезагрузитесь или не проинформируете его. Сделать это можно использовав команду partprobe из пакета parted. Но что интересно — если в CentOS 6.6 x32 удалось всё сделать без перезагрузок, то, использовав ту же версию ОС, но 64-х разрядную, оказалось, что partprobe не удаётся сообщить ядру об изменениях в таблице разделов и приходилось перезагружаться. Внимательно следите за тем, что бы у вас всегда где-нибудь был загрузчик и его конфигурация была верной с учётом текущей схемы разбивки.

Что в итоге?


Если при заказе VPS вы не можете повлиять на схему разбивки — это не значит, что вы не сможете воплотить на сервере своё виденье «правильной» схемы. Я изменил размер загрузочного раздела, оставив ему необходимый минимум и выделив дополнительные Мб под более нужные цели. Сделал два дополнительных раздела. И сменил ОС на ту, которая была нужна мне, а не выбирая из тех, которые предлагали мне. Однако, если вы решите повторить — настоятельно рекомендую вначале уточнить у компании, предоставляющей вам сервер — не повлияют ли запланированные вами изменения на его обслуживание. Возможно, какая-то программа или скрипт на физическом сервере, обслуживающем ваш VPS, рассчитывает на вполне определённые таблицы разделов.

Комментарии (10)


  1. thunderspb
    05.05.2015 14:36

    Внезапная статья, но интересная. После генты остальные популярные дистрибутивы кажутся такими громоздкими… Начинал с генты и ничуть не жалею. Суровые гентушники такие суровые.


  1. lorc
    05.05.2015 15:44
    +3

    Мне казалось, что правильный ответ — это собрать initrd с нужными инструментами и делать с диском всё что душе угодно.


    1. MAH69IK Автор
      05.05.2015 16:28

      Нисколько не спорю против такого способа. Но, на мой взгляд, — некоторым пользователям работа с initrd может показаться более сложным вариантом.


  1. istui
    05.05.2015 16:27

    Я правильно понимаю, что это будет работать только под KVM? (vs OpenVZ)


  1. questor
    05.05.2015 19:35

    Занимательно и интересно, автору респект. Во время чтения несколько раз думалось что-то типа «Данный трюк выполнен профессиональными каскадёрами: не пытайтесь повторить в домашних условиях!» Я, пожалуй, не рискну вот так без подготовки.


  1. Self_Perfection
    05.05.2015 22:18

    А теперь усложним задачу: предположим, что swap раздела не было :)

    И у меня есть одна-две мысли, как можно было вы выкрутиться в этой ситуации, но, конечно, более трудоёмкие чем то, что вы проделали.


    1. mcdebugger
      06.05.2015 15:20

      В ramdisk^Wtmpfs минимальный набор, ниже уже предложили debootstrap. Для особо затейливых затейников можно попробовать и в новое ядро наживую без перезагрузки перейти :)


  1. khim
    05.05.2015 23:46

    «Уточнить у компании» нужно ещё и потому, что у вашего провайдера могут оказаться вполне себе прямые руки, она даст вам возможность загрузиться с LiveCD и все описанные в статье трюки вам не потребуются.


  1. anpetrov
    06.05.2015 00:04

    А нельзя ли просто:

    1. debootstrap на tmpfs
    2. chroot туда
    3. менять разделы как душа желает
    4. reboot


    1. Self_Perfection
      06.05.2015 16:13

      Вот сделаешь ты chroot, попробуешь отмонитровать диски, а не получится, потому что процессы используют файлы на них! Как минимум sshd. Значит запускаем параллельный sshd из чрута на другом порту и пытаемся работать через него.

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

      Я в качестве альтернативного подхода думал в первую очередь про возможность grub2 грузить iso образы из файла. И загрузить таким подходом какой-нибудь стандартный LiveUSB, полностью загружающийся в память.