На рынке представлено много дешевых 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
Perfect thanks for the tutorial your contents is gold for me .