Linux как гость виртуализации [102.6]

Рейтинг: 65.7% · 17 голосов
Полный курс LPIC-1 (экзамены 101-500 и 102-500): архитектура, загрузка, пакеты, команды и текст, ФС и права, шелл-скрипты, пользователи, сервисы, сеть, безопасность. Debian и RHEL.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Linux как гость виртуализации [102.6]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-1 и как устроен путь администратора
  2. Железо, устройства и модули ядра [101.1]
  3. Загрузка системы: от BIOS до systemd [101.2]
  4. systemd, цели и уровни выполнения [101.3]
  5. План разметки диска и swap [102.1]
  6. Загрузчик GRUB 2 [102.2]
  7. Разделяемые библиотеки [102.3]
  8. Управление пакетами в Debian: dpkg и apt [102.4]
  9. Управление пакетами RPM, DNF и Zypper [102.5]
  10. Linux как гость виртуализации [102.6] (вы здесь)
  11. Командная строка Bash [103.1]
  12. Обработка текста фильтрами [103.2]
  13. Базовое управление файлами [103.3]
  14. Потоки, конвейеры и перенаправление [103.4]
  15. Процессы: создание, мониторинг, сигналы [103.5]
  16. Приоритеты выполнения процессов [103.6]
  17. Регулярные выражения [103.7]
  18. Редактор vi и vim [103.8]
  19. Разделы и создание файловых систем [104.1]
  20. Целостность и обслуживание ФС [104.2]
  21. Монтирование файловых систем [104.3]
  22. Урок 21. Права доступа и владение: rwx, chmod, umask и специальные биты
  23. Жёсткие и символические ссылки
  24. FHS и поиск файлов в системе [104.7]
  25. Окружение и кастомизация оболочки [105.1]
  26. Урок 25. Написание простых bash-скриптов [105.2]
  27. Графика, рабочие столы и доступность
  28. Учётные записи пользователей и групп
  29. Автоматизация задач: cron, at, таймеры [107.2]
  30. Локализация и интернационализация [107.3]
  31. Системное время и синхронизация [108.1]
  32. Системное логирование [108.2]
  33. Основы почтового агента (MTA) [108.3]
  34. Печать и CUPS [108.4]
  35. Основы интернет-протоколов [109.1]
  36. Постоянная конфигурация сети [109.2]
  37. Диагностика сети [109.3]
  38. DNS на стороне клиента [109.4]
  39. Задачи администрирования безопасности [110.1]
  40. Настройка безопасности хоста [110.2]
  41. Шифрование данных: SSH и GnuPG [110.3]
Урок 9. Linux как гость виртуализации [102.6]

Раньше вы ставили Linux на железо и видели реальные диски, сетевые карты, прерывания. В облаке и на гипервизоре все иначе: ваша система - это гость, который живет внутри чужого хоста. Этот урок про то, чем отличается гостевая система от обычной, чем VM отличается от контейнера, как cloud-init разворачивает свежий инстанс за секунды, и почему два сервера из одного шаблона могут устроить вам конфликт в сети из-за одинакового machine-id. Задача администратора здесь - понимать, где проходит граница между гостем и хостом, и не наступать на грабли клонирования.

Изображение

Как это работает

Виртуальная машина (VM) под KVM получает эмулированное железо. Гипервизор показывает гостю процессор, память, диски и сетевые карты, которых физически нет. Гость грузит собственное ядро и думает, что он один на машине. Полная эмуляция железа медленная, поэтому используют паравиртуализацию: гость знает, что он виртуальный, и общается с хостом через специальные драйверы virtio. virtio-blk и virtio-scsi - это диски, virtio-net - сеть, virtio-balloon - управление памятью. Они не притворяются реальным контроллером, а напрямую кладут данные в общую с хостом очередь, поэтому работают почти на скорости железа.

Контейнер устроен принципиально иначе. У него НЕТ своего ядра - он использует ядро хоста. Изоляция достигается через namespaces (отдельные PID, сеть, точки монтирования) и cgroups (лимиты на CPU и память). Контейнер легче и стартует мгновенно, но он не может загрузить другое ядро или другой модуль, чем у хоста. VM изолирует сильнее (своя ОС целиком), контейнер - дешевле. Отсюда правило: ядро-зависимая или чужая ОС - VM; масштабируемый сервис на том же ядре - контейнер.

cloud-init - это стандарт первичной настройки облачного инстанса. Образ в облаке универсальный и обезличенный. При первом старте cloud-init читает метаданные от облачной платформы (datasource): из специального HTTP-эндпоинта, ISO-диска cidata (NoCloud) или конфигдрайва. Из них он узнает имя хоста, создает пользователей, кладет SSH-ключи, настраивает сеть и расширяет файловую систему на весь диск. Так один образ превращается в сотни разных серверов без ручной работы.

machine-id - это уникальный идентификатор установки в /etc/machine-id, генерируется при первой загрузке. От него зависят DHCP-идентификатор (DUID), журналы systemd и иногда генерация SSH host-ключей. Если вы клонировали VM вместе с непустым machine-id, два гостя получат от DHCP один и тот же IP - классическая ловушка шаблонов.

Команды и примеры

Понять, гость вы или нет, и какой гипервизор под вами:

Код: Выделить всё

systemd-detect-virt          # kvm, qemu, oracle, microsoft, none
systemd-detect-virt -c       # только контейнеры: lxc, docker, podman, none
hostnamectl                  # строка Virtualization: kvm
lscpu | grep Hypervisor      # Hypervisor vendor: KVM
Проверить, что диски и сеть идут через virtio (это признак правильно настроенной VM):

Код: Выделить всё

lsblk                        # диски vda, vdb - это virtio-blk
lspci | grep -i virtio       # Virtio network/block device
lsmod | grep virtio          # загруженные модули virtio_net, virtio_blk
ip -br link                  # интерфейс часто enp1s0 на virtio-net
Установка cloud-init, если образ собираете сами:

Код: Выделить всё

# Debian 13 / Ubuntu 24.04
apt install cloud-init

# RHEL 10 / Fedora 41+
dnf install cloud-init
Минимальный user-data (формат cloud-config, первая строка обязательна):

Код: Выделить всё

#cloud-config
hostname: web01
users:
  - name: deploy
    groups: [sudo]
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
      - ssh-ed25519 AAAA... user@laptop
package_update: true
packages:
  - nginx
runcmd:
  - systemctl enable --now nginx
Локальный тест без облака (datasource NoCloud) - кладем user-data и meta-data в ISO с меткой cidata:

Код: Выделить всё

printf 'instance-id: web01\nlocal-hostname: web01\n' > meta-data
genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data
# подключаете seed.iso вторым CD-ROM к VM
Диагностика cloud-init на запущенном инстансе:

Код: Выделить всё

cloud-init status --long      # done / running / error
cloud-init query userdata     # что реально пришло от платформы
journalctl -u cloud-init      # лог этапов init/config/final
Подготовка золотого образа к клонированию (обнуляем уникальное состояние):

Код: Выделить всё

cloud-init clean --logs       # сброс маркеров, чтобы init отработал заново
truncate -s 0 /etc/machine-id # пустой файл = регенерация при загрузке
rm -f /var/lib/dbus/machine-id  # на старых системах это симлинк, проверьте
rm -f /etc/ssh/ssh_host_*     # SSH host-ключи перегенерируются на старте
Пустой /etc/machine-id заставит systemd сгенерировать новый при следующей загрузке. На RHEL и Debian путь и логика одинаковые - machine-id это уже общесистемный механизм systemd.

Частые грабли
  • Скопировали VM вместе с непустым /etc/machine-id - два гостя дерутся за один IP, потому что DHCP-клиент шлет одинаковый DUID. Перед клонированием machine-id обнуляют, а не удаляют файл совсем.
  • Забыли удалить SSH host-ключи в шаблоне - все клоны имеют одинаковый отпечаток сервера, что ломает доверие и пугает SSH-клиентов предупреждением о возможной подмене.
  • cloud-init отрабатывает только при ПЕРВОЙ загрузке. Поменяли user-data на работающей машине - ничего не произойдет без cloud-init clean и перезагрузки.
  • Первая строка user-data не #cloud-config (например, лишний пробел или BOM) - файл молча игнорируется, инстанс грузится без настроек.
  • Диски называются sda вместо vda - значит VM использует эмуляцию SATA/IDE, а не virtio. Производительность падает в разы, проверьте тип контроллера.
  • Путаете контейнер и VM при выборе ядра: в контейнере modprobe и sysctl ограничены ядром хоста, своего модуля туда не загрузить.
Мини-лаба
  • На любом инстансе или VM выполните systemd-detect-virt и lsblk - определите гипервизор и убедитесь, что диск это vda (virtio).
  • Установите cloud-init и посмотрите cloud-init status --long и cloud-init query userdata - что пришло при создании.
  • Соберите seed.iso с user-data из примера (свой ключ, свой hostname) и meta-data, создайте новую VM с этим ISO как вторым приводом.
  • После загрузки проверьте: создан ли пользователь deploy, заехал ли ключ, поднялся ли nginx, сменился ли hostname.
  • Запишите текущий cat /etc/machine-id, затем выполните cloud-init clean --logs и truncate -s 0 /etc/machine-id.
  • Перезагрузите гостя и сравните новый machine-id со старым - он должен измениться.
  • Удалите ssh_host_* ключи, перезагрузитесь и убедитесь, что отпечаток сервера сгенерировался заново.
Контрольные вопросы
  • Чем гость-VM принципиально отличается от контейнера с точки зрения ядра и почему это влияет на выбор технологии?
  • Какие задачи решают драйверы virtio и как по выводу lsblk понять, что диск идет через virtio-blk?
  • Из каких источников cloud-init берет метаданные и почему он применяет конфигурацию только при первой загрузке?
  • Что произойдет с DHCP, если склонировать VM, не обнулив /etc/machine-id, и как это исправить?
  • Какие уникальные артефакты нужно удалить или обнулить в золотом образе перед клонированием?
  • Какой командой проверить, под каким гипервизором работает текущая система, и чем отличается ключ -c?
👍3 ❤️1 🔥3 😄 🤔1
Аватара пользователя
llamalord
Сообщения: 1
Зарегистрирован: 13 май 2026, 03:48

Re: Linux как гость виртуализации [102.6]

Сообщение llamalord »

А если я меняю user-data в облаке у уже живой машины - реально надо cloud-init clean и ребут, иначе игнор? Проверил - да, без clean ничего не подхватывает.
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
grangerdon
Сообщения: 1
Зарегистрирован: 17 май 2026, 11:57

Re: Linux как гость виртуализации [102.6]

Сообщение grangerdon »

У меня после клонирования два сервера получили одинаковый IP по DHCP, мучился полдня. Оказалось machine-id не обнулил в шаблоне, truncate -s 0 спас.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Управление пакетами RPM, DNF и Zypper [102.5]
Следующая глава →
Командная строка Bash [103.1]

Все главы курса «LPIC-1: администратор Linux (101 + 102)»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-1: администратор Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость