Если вы тоже не знаете решения этой задачки или просто хотите посмотреть на пример реализации — добро пожаловать в статью!
Зачем вся эта возня?
По-большому счёту, конечно, не обязательна. Сервер ведь всё равно работает. Но, пожалуй, у каждого есть своё видение «правильной» разбивки, которое может не совпадать с тем, что есть на самом деле.
Мой виртуальный сервер с 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
Метод простой: вначале проходите по всему списку и удаляете то, что вы знаете, затем перебираете каждый пункт списка отдельно и смотрите на его зависимости. Внимательно смотрите на список приложений, которые будут удалены вместе с выбранным, и проверяйте, не затронет ли их удаление какой-то из пунктов списка выше.
Хорошо, если у вас есть возможность создавать в любой момент резервную копию образа вашего виртуального сервера и восстанавливаться из неё. В противном случае будьте вдвойне осторожны.
Кстати, есть ещё две возможности незначительно поправить место:
— изменить в первую очередь размер раздела с /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)
lorc
05.05.2015 15:44+3Мне казалось, что правильный ответ — это собрать initrd с нужными инструментами и делать с диском всё что душе угодно.
MAH69IK Автор
05.05.2015 16:28Нисколько не спорю против такого способа. Но, на мой взгляд, — некоторым пользователям работа с initrd может показаться более сложным вариантом.
questor
05.05.2015 19:35Занимательно и интересно, автору респект. Во время чтения несколько раз думалось что-то типа «Данный трюк выполнен профессиональными каскадёрами: не пытайтесь повторить в домашних условиях!» Я, пожалуй, не рискну вот так без подготовки.
Self_Perfection
05.05.2015 22:18А теперь усложним задачу: предположим, что swap раздела не было :)
И у меня есть одна-две мысли, как можно было вы выкрутиться в этой ситуации, но, конечно, более трудоёмкие чем то, что вы проделали.mcdebugger
06.05.2015 15:20В ramdisk^Wtmpfs минимальный набор, ниже уже предложили debootstrap. Для особо затейливых затейников можно попробовать и в новое ядро наживую без перезагрузки перейти :)
khim
05.05.2015 23:46«Уточнить у компании» нужно ещё и потому, что у вашего провайдера могут оказаться вполне себе прямые руки, она даст вам возможность загрузиться с LiveCD и все описанные в статье трюки вам не потребуются.
anpetrov
06.05.2015 00:04А нельзя ли просто:
1. debootstrap на tmpfs
2. chroot туда
3. менять разделы как душа желает
4. reboot
Self_Perfection
06.05.2015 16:13Вот сделаешь ты chroot, попробуешь отмонитровать диски, а не получится, потому что процессы используют файлы на них! Как минимум sshd. Значит запускаем параллельный sshd из чрута на другом порту и пытаемся работать через него.
Вообще мне кажется, что путь возможный, но существенно более сложный, чем кажется на первый взгляд.
Я в качестве альтернативного подхода думал в первую очередь про возможность grub2 грузить iso образы из файла. И загрузить таким подходом какой-нибудь стандартный LiveUSB, полностью загружающийся в память.
thunderspb
Внезапная статья, но интересная. После генты остальные популярные дистрибутивы кажутся такими громоздкими… Начинал с генты и ничуть не жалею. Суровые гентушники такие суровые.