![](https://habrastorage.org/storage2/b79/69f/826/b7969f8267eb314dd30cce51f891d33c.jpg)
Digital Ocean — лоукостер на рынке облачных VPS провайдеров. Пользуется технологией виртуализации KVM. Хорош по соотношению цена/качество и бла-бла-бла, вы сами всё это знаете.
Но есть в нём и несколько минусов, одним из которых является ограничение в поддерживаемых операционных системах. Официальная позиция хостера состоит в том, что место на дисках в дроплетах (образах виртуальных машин) может быть расширено из панели управления без необходимости переустановки системы, поэтому загрузчик туда лучше не ставить. В связи с этим, libvirt не читает загрузчик внутри образа, а использует предустановленное в панели управления ядро с хостовой машины.
Поддержку загрузки пользовательских ядер они обещают сделать со дня на день… уже чуть больше года.
Мы ждать и клянчить не будем.
По сути, всё просто и сводится к трём простым этапам:
- Создаём дроплет из любого образа.
Сейчас поддерживаются: Ubuntu, CentOS, Debian, Arch, Fedora - Разворачиваем образ желаемого дистрибутива.
- Снабжаем его скриптом подмены ядра.
Теперь подробнее о жонглировании пингвинами в условиях плохой видимости.
Я буду показывать на примере Gentoo. Но подход применим и для любой другой слаки, главное — соблюсти битность.
Live fast, die young
Разворачиваем дроплет на Ubuntu 13.04 x64.
Скачиваем и распаковываем образ новой ОС в /root/gentoo, так как тремя строчками ниже сделать это будет гораздо сложнее. В моём случае это gentoo stage. Я использовал stage3-amd64-hardened+nomultilib-20130801.tar.bz2.
Теперь устанавливаем mc: apt-get install mc. Запускаем оной.
Для чего это надо? Дело в том, что у mc свой набор команд для работы с файлами и он не пользуется системными mv, cp и пр. Эта мелкая
Итак, перемещаем (джедаи удаляют) из корня в /root/ubuntu всё, кроме /dev, /sys, /proc, /run, /tmp и /root.
Ура, мы убили Ubuntu.
Новые мозги Страшилы
Переносим всё из /root/gentoo в /
Прописываем в /etc/ настройки сети, имя хоста, поднятие sshd и прочее необходимое вам для комфортной консольной жизни. Не забудьте про пароль рута.
Уже сейчас можно перезагрузить дроплет и получить рабочий образ в стадии лёгкой шизофрении:
prometheus ~ # uname -a
Linux prometheus 3.8.0-19-generic #30-Ubuntu SMP Wed May 1 16:35:23 UTC 2013 x86_64 QEMU Virtual CPU version 1.0 GenuineIntel GNU/Linux
prometheus ~ # lsb_release -a
LSB Version: n/a
Distributor ID: Gentoo
Description: NAME=Gentoo
Release: n/a
Codename: n/a
Второй этап на этом считаем успешно завершенным.
![](https://habrastorage.org/storage2/2b5/d33/174/2b5d33174c925bc5f395c6cf32e0c746.jpg)
Round 3. Fight.
Подмена ядра.
Для этой цели почти десятилетие назад была реализована технология kexec. Её и будем эксплуатировать:
emerge sys-apps/kexec-tools; rc-update add kexec
Как обычно собираем, настраиваем и бросаем в /boot ядро:
emerge hardened-sources
cd /usr/src/linux; make menuconfig && make && make modules_install && make install
Чтобы kexec его без лишних телодвижений нашел, создаём симлинки в /boot:
ln -s vmlinuz-3.10.5-hardened-gnu vmlinuz
ln -s config-3.10.5-hardened-gnu config
ln -s System.map-3.10.5-hardened-gnu System.map
Теперь можно попробовать загрузить наше новое ядро:
/etc/init.d/kexec start && mount -o ro,remount / && kexec -e
или
/etc/init.d/kexec start && reboot
Ещё немножко облегчим себе жизнь и будем грузить наше ядро при старте системы. Для этого надо в /etc/conf.d/kexec выставить LOAD_DURING_SHUTDOWN=«no» и положить такой скрипт в /etc/local.d/kexec.start
# дефолтное ядро не прописывает настоящий root=.
if grep -qv 'vda$' /proc/cmdline; then
mount -o ro,remount / && kexec -e
fi
prometheus ~ # uname -pronis
Linux prometheus 3.10.5-hardened-gnu QEMU Virtual CPU version 1.0 GenuineIntel GNU/Linux
Всё. Больше пингвинов хороших и классных. Спасибо за внимание.