GrabDuck

Устанавливаем любой Linux дистрибутив на Digital Ocean

:

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

Второй этап на этом считаем успешно завершенным.

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

Всё. Больше пингвинов хороших и классных. Спасибо за внимание.