Запускаем виртуалку с последним ядром внутри контейнера OpenVZ с ядром 2.6 используя QEMU.



На рынке представлено много дешевых NAT OpenVZ VPSок. Однако, виртуализация OpenVZ имеет свои ограничения и поставляется со старым ядром 2.6. Ваш провайдер также может ограничить модули ядра, такие как tun/tap и nfs, что делает использование VPS очень лимитированным.

В этой статье мы сломаем правила и запустим Alpine Linux внутри Debian контейнера OpenVZ с ядром 2.6.32-042stab134.8 и 256мб оперативки. Alpine это легковесная система, что хорошо для дешевых машин.

Загрузите любой VNC клиент. Он понадобится нам для первичной установки. Я использую standalone версию RealVNC на винде.
UPD. Также можно использовать опцию -curses QEMU вместо VNC.

Загрузите последнюю версию Alpine оптимизированную для виртуальных машин.

wget http://dl-cdn.alpinelinux.org/alpine/v3.9/releases/x86_64/alpine-virt-3.9.3-x86_64.iso

Установите QEMU.

apt install qemu

Создайте образ диска QEMU.

qemu-img create -f raw alpine.img 2G

NAT VPS всегда идут с ограниченным набором открытых портов. Высчитайте порт для VNC по приведенной ниже формуле.

"Желаемый порт" - 5900.

В моём случае:

51221 - 5900 = 45321

Запустите виртуальную машину QEMU.

qemu-system-x86_64 \
-netdev user,id=n1 -device virtio-net-pci,netdev=n1 \
-drive file=alpine.img,cache=none,if=virtio,format=raw \
-vnc 0.0.0.0:45321 \
-m 200 \
-cdrom alpine-virt-3.9.3-x86_64.iso

Эта команда запустит виртуалку с userspace TCP/IP стэком — SLIRP. Очень удобно для VPS без поддержки tun/tap. 200мб памяти будет достаточно для старта Alpine.

Затем, запустите VNC клиент на порте 51221 и без пароля зайдите как root.

Перед тем, как установить Alpine, нам нужно разобраться с resolv.conf, чтобы система использовала гугловский DNS вместо того, что задается QEMU DHCP. Мы не можем использовать опцию QEMU «-netdev dns=addr» — по каким-то причинам она не работает.
Alpine поставляется с реактором текста vi. Попрактикуйтесь с ним, если не знаете что это такое.

Создайте файл resolv.conf, содержащий гугловский DNS.
/etc/resolv.conf

nameserver 8.8.8.8

Alpine поставляется с DHCP-клиентом udhcpc, который будет перезаписывать в resolv.conf эту запись адресом QEMU DNS. Отключим эту особенность.
Создайте директорию конфигов udhcpc.

mkdir /etc/udhcpc

Создайте конфиг udhcpc.conf.
/etc/udhcpc/udhcpc.conf

RESOLV_CONF="no"

Установите Alpine.

setup-alpine

Keyboard Layout -> none #если ничего не нужно
Hostname -> qemu-test #задайте какой хотите
Interface to initialize -> eth0
Ip address -> DHCP
Manual network configuration -> no
Set new root password
Timezone -> UTC #задайте какой хотите
Proxy URL -> none
Mirror number -> r #рандом или номер какой хотите
SSH Server -> dropbear #по каким-то причинам openssh замедляет загрузку системы на несколько минут
Disk to use -> vda
How to use -> sys
Erase disk -> y

Завершите работу Alpine.

poweroff

Запустите Alpine снова, но отключите VNC и включите редирект порта ssh.

qemu-system-x86_64 \
-netdev user,id=n1 -device virtio-net-pci,netdev=n1 -redir tcp:51222::22 \
-drive file=alpine.img,cache=none,if=virtio,format=raw \
-nographic \
-m 200

Вот и всё. Виртуалка готова к использованию и принимает соединения ssh по внешнему IP и порту 51222.

Известные ограничения.

Траффик ICMP не работает при использовании SLIRP. Черновое решение тут (Enabling ping in the guest, on Linux hosts).
Или используйте виртуальный интерфейс tap, если это возможно.

Лимитируем CPU.

Дешевые VPS часто поставляются с ограничениями на использование CPU. Чтобы ограничить использование CPU я пользуюсь cpulimit.

git clone https://github.com/opsengine/cpulimit.git
cd cpulimit
make
cp src/cpulimit /usr/bin

Запустите QEMU с лимитом в 50% CPU.

cpulimit -l 50 \
qemu-system-x86_64 \
-netdev user,id=n1 -device virtio-net-pci,netdev=n1 -redir tcp:51222::22 \
-drive file=alpine.img,cache=none,if=virtio,format=raw \
-nographic \
-m 200

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *