Ubuntu autoinstall на машине с 2 ГБ ОЗУ
Автоматическая установка Ubuntu Server по сети падает с нехваткой памяти на машинах с 2 ГБ ОЗУ, хотя обычная ручная установка на этой же машине проходит. Причина — в том, что образ скачивается в оперативную память дважды. Основная инструкция по сетевой установке — Установка Ubuntu Server по PXE (autoinstall).
Симптом
При загрузке по сети с параметром autoinstall установщик начинает скачивать ISO-образ и падает, не дойдя до конца, — заканчивается память. Типичная строка загрузки, на которой это воспроизводится:
ramdisk_size=1500000 root=/dev/ram0 fsck.mode=skip autoinstall splash
'ds=nocloud-net;s=http://192.0.2.10/autoinstall/' ip=dhcp
'url=http://releases.ubuntu.com/focal/latest-live-server-amd64.iso'
Та же машина с тем же объёмом памяти в интерактивном режиме (без autoinstall) устанавливается нормально — это и сбивает с толку.
Причина
Параметр url= в строке ядра обрабатывают два компонента:
- casper — считает его адресом ISO-образа, который нужно скачать и развернуть в ramdisk. Это и есть нужное поведение;
- cloud-init — исторически тоже понимает
url=как адрес своей конфигурации и пытается скачать по нему файл.
В итоге образ уходит в оперативную память дважды: один раз как установочный ISO, второй — как «конфигурация» cloud-init. На 3 ГБ это проходит незаметно, на 2 ГБ — заканчивается нехваткой памяти.
Решение
cloud-init проверяет параметр cloud-config-url= раньше, чем url=. Достаточно задать его явно — и url= перестаёт интерпретироваться как источник конфигурации. Вариант 1 — указать на настоящий файл конфигурации:
root=/dev/ram0 ramdisk_size=1500000 fsck.mode=skip autoinstall ip=dhcp
url=http://192.0.2.10/ubuntu-20.04.3-live-server-amd64.iso
cloud-config-url=http://192.0.2.10/user-data
Вариант 2 — указать на заведомо пустой источник, если конфигурация отдаётся через ds=nocloud-net:
cloud-config-url=/dev/null
Второй вариант используется в нашей основной инструкции по PXE — он короче и не требует отдельного файла.
Эффект помимо снятия ошибки: меньше сетевого трафика и заметно более быстрая загрузка, потому что образ скачивается один раз.
Параметр
ramdisk_sizeзадаётся в килобайтах и должен вмещать распакованный образ:ramdisk_size=1500000— это примерно 1,4 ГБ. Если памяти в обрез, уменьшать его не нужно — нужно убирать вторую закачку образа, как описано выше.
Если не помогло
- убедитесь, что
cloud-config-url=стоит в строке ядра до появления ошибки, то есть прописан в конфигурации загрузчика, а не введён вручную после старта; - проверьте, что каталог из
ds="nocloud-net;s=…"заканчивается слэшем и в нём лежат оба файла —meta-dataиuser-data; - посмотрите журнал установщика:
/var/log/installer/на целевой машине (после падения доступен из shell установщика по Ctrl+Alt+F2); - как временная мера — поднимите память ВМ до 3 ГБ, выполните установку и верните 2 ГБ: ограничение касается только процесса установки, установленной системе столько памяти не нужно.