Подготовка Linux к созданию образов в Azure

Область применения: ✔️ Виртуальные машины Linux ✔️ Гибкие масштабируемые наборы

Соглашение об уровне обслуживания платформы Azure применяется к виртуальным машинам под управлением операционной системы Linux только при использовании одного из утвержденных дистрибутивов. Для утвержденных дистрибутивов Azure Marketplace предоставляет предварительно настроенные образы Linux. Дополнительные сведения см. в разделе:

Все остальные дистрибутивы, работающие в Azure, включая поддерживаемые сообществом и не поддерживаемые дистрибутивы, имеют некоторые предварительные требования.

В этой статье приводятся общие рекомендации по работе с дистрибутивом Linux в Azure. Эта статья не может быть комплексной, так как каждое распределение отличается. Даже если вы соответствуете всем критериям, которые описаны в этой статье, может потребоваться значительно настроить систему Linux для правильной работы.

Общие заметки о установке Linux

  • Azure не поддерживает формат виртуального жесткого диска Hyper-V (VHDX). Azure поддерживает только VHD фиксированного размера. Диск можно преобразовать в формат VHD с помощью диспетчера Hyper-V или командлета Convert-VHD . Если вы используете VirtualBox, выберите фиксированный размер , а не значение по умолчанию (динамическое выделение) при создании диска.

  • Azure поддерживает виртуальные машины 1-го поколения (загрузка BIOS) и 2-го поколения (загрузка UEFI).

  • Модуль ядра таблицы распределения виртуальных файлов (VFAT) должен быть включен в ядре.

  • Максимально допустимый размер VHD составляет 1023 ГБ.

  • При установке системы Linux мы рекомендуем использовать стандартные разделы, а не Logical Volume Manager (LVM). LVM используется по умолчанию для многих установок.

    Использование стандартных разделов позволит избежать конфликтов имён LVM между клонированными виртуальными машинами, особенно если диск ОС когда-либо будет подключён к другой идентичной виртуальной машине для устранения неполадок. На дисках данных можно использовать LVM или RAID .

  • Необходима поддержка ядра для подключения определяемых пользователем файловых систем (UDF). При первой загрузке в Azure конфигурация подготовки передается виртуальной машине Linux через отформатированный UDF носитель, подключенный к гостевой машине. Агент Azure Linux должен подключить файловую систему UDF для считывания конфигурации и подготовки виртуальной машины.

  • Версии ядра Linux до версии 2.6.37 не поддерживают неоднородный доступ к памяти (NUMA) в Hyper-V с большими размерами виртуальных машин. Эта проблема в основном влияет на старые дистрибутивы, использующие вышестоящее ядро Red Hat 2.6.32. Исправлено в Red Hat Enterprise Linux (RHEL) 6.6 (ядро-2.6.32-504).

    Системы под управлением пользовательских ядер старше 2.6.37 или ядра на основе RHEL старше 2.6.32-504, должны задать параметр numa=off загрузки в командной строке ядра в grub.conf. Дополнительные сведения см. в статье 436883 в базе знаний Red Hat.

  • Не настраивайте раздел подкачки на диске с ОС. Агент Linux можно настроить для создания файла буфера на диске временного ресурса, как описано далее в этой статье.

  • Все виртуальные жесткие диски в Azure должны иметь виртуальный размер, равный 1 МБ (1024 x 1024 байт). При преобразовании необработанного диска в формат VHD убедитесь, что размер необработанного диска кратен 1 МБ перед преобразованием, как описано далее в этой статье.

  • Используйте самую актуальную версию дистрибутива, пакеты и программное обеспечение.

  • Удалите пользователей и системные учетные записи, открытые ключи, конфиденциальные данные, ненужное программное обеспечение и приложения.

Примечание.

Cloud-init версии 21.2 или более поздней удаляет требование UDF. Но если модуль udf не включён, CD-ROM не будет монтироваться в процессе подготовки, из-за чего пользовательские данные не будут применены. Обходной путь — применение пользовательских данных. Однако, в отличие от пользовательских данных, пользовательские данные не шифруются. Дополнительные сведения см. в разделе Форматы пользовательских данных документации cloud-init.

Установка модулей ядра без Hyper-V

Так как Azure запускается на гипервизоре Hyper-V, Linux требует определенные модули ядра для запуска в Azure. Если у вас есть виртуальная машина, созданная за пределами Hyper-V, установщики Linux могут не включать драйверы для Hyper-V на начальном диске ОЗУ (initrd или initramfs), если только виртуальная машина не обнаруживает, что она работает в среде Hyper-V.

Если вы используете другую систему виртуализации (например, VirtualBox или KVM) для подготовки образа Linux, может потребоваться пересобрать initrd, чтобы по крайней мере модули ядра hv_vmbus и hv_storvsc были доступны в исходном образе RAM-диска. Это известная проблема встречается по крайней мере в системах на основе предшествующего дистрибутива Red Hat. Также она может встречаться в других версиях.

Механизм пересборки образа initrd или initramfs может различаться в зависимости от дистрибутива. Чтобы узнать правильную процедуру для вашего дистрибутива, см. документацию по дистрибутиву или раздел поддержки. Ниже приведён пример пересборки initrd с помощью утилиты mkinitrd:

  1. Создайте резервную копию существующего образа initrd:

    cd /boot
    sudo cp initrd-`uname -r`.img  initrd-`uname -r`.img.bak
    
  2. Пересоберите initrd с использованием hv_vmbusмодулей ядраhv_storvsc:

    sudo mkinitrd --preload=hv_storvsc --preload=hv_vmbus -v -f initrd-`uname -r`.img `uname -r`
    

Изменение размера VHD

Размер виртуальной памяти образов VHD в Azure должен быть округлен до 1 МБ. Как правило, виртуальные жесткие диски, созданные с помощью Hyper-V, выровнены правильно. Если виртуальный жесткий диск не выровнен правильно, может появиться сообщение об ошибке, аналогичное следующему примеру при попытке создать образ из виртуального жесткого диска:

The VHD http://<mystorageaccount>.blob.core.windows.net/vhds/MyLinuxVM.vhd has an unsupported virtual size of 21475270656 bytes. The size must be a whole number (in MBs).

В этом случае измените размер виртуальной машины с помощью консоли диспетчера Hyper-V или командлета PowerShell resize-VHD . Если вы работаете не в среде Windows, воспользуйтесь командой qemu-img для преобразования (если необходимо) и изменения размера VHD.

Примечание.

В qemu-img есть известная ошибка в QEMU версии 2.2.1 и некоторых более поздних версиях, которая приводит к созданию некорректно сформированного VHD-файла. Проблема устранена в QEMU 2.6. Рекомендуется использовать версию 2.2.0 или более раннюю версию или версию 2.6 или более позднюю.

  1. Непосредственное изменение размера VHD с помощью таких средств, как qemu-img или vbox-manage, может привести к тому, что VHD станет незагружаемым. Рекомендуется сначала преобразовать VHD в необработанный образ диска с помощью следующего кода.

    Если образ виртуальной машины был создан как образ необработанного диска, этот шаг можно пропустить. Создание образа виртуальной машины в качестве образа необработанного диска является значением по умолчанию в некоторых гипервизорах, таких как KVM.

    sudo qemu-img convert -f vpc -O raw MyLinuxVM.vhd MyLinuxVM.raw
    
  2. Рассчитайте необходимый размер образа диска, чтобы округлить размер виртуальной памяти до 1 МБ. Следующий сценарий оболочки Bash использует qemu-img info, чтобы определить виртуальный размер образа диска, а затем вычисляет размер, округлённый вверх до ближайшего 1 МБ:

    rawdisk="MyLinuxVM.raw"
    vhddisk="MyLinuxVM.vhd"
    
    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "$rawdisk" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    
    rounded_size=$(((($size+$MB-1)/$MB)*$MB))
    
    echo "Rounded Size = $rounded_size"
    
  3. Изменение размера необработанного диска с помощью $rounded_size:

    sudo qemu-img resize MyLinuxVM.raw $rounded_size
    
  4. Преобразуйте необработанный диск обратно в виртуальный жесткий диск фиксированного размера:

    sudo qemu-img convert -f raw -o subformat=fixed,force_size -O vpc MyLinuxVM.raw MyLinuxVM.vhd
    

    Или в версиях QEMU до 2.6 удалите параметр force_size:

    sudo qemu-img convert -f raw -o subformat=fixed -O vpc MyLinuxVM.raw MyLinuxVM.vhd
    

Требования к ядру Linux

Драйверы Linux Integration Services (LIS) для Hyper-V и Azure встраиваются непосредственно в основное ядро Linux. Во многих дистрибутивах, которые включают последнюю версию ядра Linux (например, 3.x), эти драйверы уже доступны, или же в ядре предоставляются их более ранние версии.

Драйверы LIS постоянно обновляются в вышестоящем ядре с новыми исправлениями и функциями. По возможности рекомендуется запустить одобренное распространение , включающее эти исправления и обновления.

Если вы используете вариант RHEL версии 6.0 до 6.3, необходимо установить последние драйверы LIS для Hyper-V. Начиная с RHEL 6.4+ (и производных), драйверы LIS уже включены в ядро, поэтому вам не нужны дополнительные пакеты установки.

Если необходимо собственное ядро, рекомендуется использовать одну из последних версий (то есть 3.8 или более позднюю). Для дистрибутивов или поставщиков, которые поддерживают собственное ядро, необходимо регулярно создавать резервные копии драйверов LIS из вышестоящего ядра в пользовательское ядро.

Даже если вы уже используете сравнительно новую версию ядра, мы настоятельно рекомендуем отслеживать все исправления в основной ветке драйверов LIS и при необходимости портировать их на более ранние версии. Расположение файлов исходного кода драйверов LIS указано в файле MAINTAINERS в дереве исходного кода ядра Linux:

    F:    arch/x86/include/asm/mshyperv.h
    F:    arch/x86/include/uapi/asm/hyperv.h
    F:    arch/x86/kernel/cpu/mshyperv.c
    F:    drivers/hid/hid-hyperv.c
    F:    drivers/hv/
    F:    drivers/input/serio/hyperv-keyboard.c
    F:    drivers/net/hyperv/
    F:    drivers/scsi/storvsc_drv.c
    F:    drivers/video/fbdev/hyperv_fb.c
    F:    include/linux/hyperv.h
    F:    tools/hv/

Активное ядро виртуальной машины должно содержать следующие исправления. Этот список не является исчерпывающим для всех дистрибутивов.

Агент Linux для Azure

Агент Azure Linux (waagent) подготавливает виртуальную машину Linux в Azure. Вы можете получить последнюю версию, сообщить о проблемах или отправить pull request'ы в репозитории Linux Agent на GitHub.

Ниже приведены некоторые рекомендации по использованию агента Linux Azure.

  • Агент Linux выпускается по лицензии Apache 2.0. Многие дистрибутивы уже предоставляют пакеты rpm или .deb для агента. Эти пакеты можно легко установить и обновить.
  • Для работы агента Linux для Azure требуется Python v2.6+.
  • Агенту также требуется модуль python-pyasn1. В большинстве дистрибутивов он предоставляется в виде отдельно устанавливаемого пакета.
  • В некоторых случаях агент Linux Azure может быть несовместим с NetworkManager. Многие пакеты (.rpm или .deb), поставляемые дистрибутивами, указывают конфликт NetworkManager с пакетом waagent. В этих случаях агент удаляет NetworkManager при установке пакета агента Linux.
  • Версия агента Linux для Azure должна быть выше минимальной поддерживаемой версии.

Примечание.

Убедитесь, что модули udf и vfat включены. Отключение модуля udf приведёт к сбою подготовки к работе. Отключение vfat модуля приведет к сбоям подготовки и загрузки. Cloud-init версии 21.2 или более поздней может подготавливать виртуальные машины без необходимости использовать UDF, если существуют оба этих условия:

  • Вы создали виртуальную машину с помощью открытых ключей SSH, а не паролей.
  • Вы не предоставили пользовательские данные.

Общие требования к системе Linux

  1. Измените строку загрузки ядра в GRUB или GRUB2 и включите в нее следующие параметры, задающие отправку всех сообщений консоли в первый последовательный порт. Эти сообщения могут использоваться службой поддержки Azure при отладке возникающих проблем.

    GRUB_CMDLINE_LINUX="rootdelay=300 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0"
    

    Мы также рекомендуем удалить следующие параметры, если они существуют:

    rhgb quiet crashkernel=auto
    

    Графическая загрузка и тихий режим загрузки не имеют смысла в облачной среде, где все журналы должны отправляться на последовательный порт. При необходимости этот параметр можно оставить crashkernel настроенным, но этот параметр уменьшает объем доступной памяти на виртуальной машине по крайней мере на 128 МБ. Сокращение доступной памяти может быть проблематичным для небольших размеров виртуальных машин.

  2. После завершения редактирования /etc/default/grub выполните следующую команду, чтобы перестроить конфигурацию GRUB:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  3. Добавьте модуль Hyper-V для initramfs с помощью dracut:

    cd /boot
    sudo cp initramfs-<kernel-version>.img <kernel-version>.img.bak
    sudo dracut -f -v initramfs-<kernel-version>.img <kernel-version> --add-drivers "hv_vmbus hv_netvsc hv_storvsc"
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    

    Добавьте модуль Hyper-V для инициализации с помощью mkinitramfs:

    cd /boot
    sudo cp initrd.img-<kernel-version>  initrd.img-<kernel-version>.bak
    sudo mkinitramfs -o initrd.img-<kernel-version> <kernel-version>  --with=hv_vmbus,hv_netvsc,hv_storvsc
    sudo update-grub
    
  4. Убедитесь, что SSH-сервер установлен и настроен для включения во время загрузки. Как правило, эта конфигурация используется по умолчанию.

  5. Установите агент Linux для Azure.

    Агент Linux для Azure необходим для подготовки образа Linux в Azure. Многие дистрибутивы поставляют агент в виде пакета .rpm или .deb. Пакет обычно называется WALinuxAgent или walinuxagent. Вы также можете установить агент вручную, выполнив действия, описанные в руководстве по агенту Linux Azure.

    Примечание.

    Убедитесь, что модули udf и vfat включены. Их удаление или отключение приведет к сбою при подготовке или загрузке. Cloud-init версии 21.2 или более поздней удаляет требование UDF.

    Установите агент Azure Linux, cloud-init и другие необходимые служебные программы, выполнив одну из следующих команд.

    Используйте эту команду для Red Hat или CentOS:

    sudo yum install -y WALinuxAgent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    Используйте следующую команду для Ubuntu/Debian:

    sudo apt install walinuxagent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    Используйте следующую команду для SUSE:

    sudo zypper install python-azure-agent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    Затем включите агент и cloud-init для всех дистрибутивов:

    sudo systemctl enable waagent.service
    sudo systemctl enable cloud-init.service
    
  6. Не создавайте пространство подкачки на диске с ОС.

    Агент Linux Azure или cloud-init можно использовать для настройки пространства подкачки с помощью локального диска ресурсов. Этот диск ресурсов подключается к виртуальной машине после развертывания в Azure. Локальный диск ресурсов — временный диск, и его содержимое может быть удалено при деинициализации виртуальной машины. В следующих блоках показано, как настроить этот обмен.

    Если вы выбрали агент Azure Linux, измените следующие параметры в файле /etc/waagent.conf:

    ResourceDisk.Format=y
    ResourceDisk.Filesystem=ext4
    ResourceDisk.MountPoint=/mnt/resource
    ResourceDisk.EnableSwap=y
    ResourceDisk.SwapSizeMB=2048    ## NOTE: Set this to your desired size.
    

    Если вы выбрали cloud-init, настройте cloud-init для выполнения первоначальной настройки:

    sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-init/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
    

    Чтобы настроить cloud-init для форматирования и создания пространства подкачки, у вас есть два варианта:

    • Передавайте конфигурацию cloud-init каждый раз при создании виртуальной машины через customdata. Мы рекомендуем этот метод.
    • Используйте директиву cloud-init в образе для настройки пространства подкачки при каждом создании виртуальной машины.

    Создайте CFG-файл для настройки пространства буфера с помощью cloud-init:

    echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' | sudo tee -a /etc/systemd/system.conf
    cat << EOF | sudo tee /etc/cloud/cloud.cfg.d/00-azure-swap.cfg
    #cloud-config
    # Generated by Azure cloud image build
    disk_setup:
      ephemeral0:
        table_type: mbr
        layout: [66, [33, 82]]
        overwrite: True
    fs_setup:
      - device: ephemeral0.1
        filesystem: ext4
      - device: ephemeral0.2
        filesystem: swap
    mounts:
      - ["ephemeral0.1", "/mnt/resource"]
      - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
    EOF
    
  7. Настройте cloud-init для обработки операций подготовки:

    1. Настройте waagent для cloud-init:

      sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-init/g' /etc/waagent.conf
      sudo sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
      sudo sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
      

      Если вы переносите определенную виртуальную машину и не хотите создавать обобщенный образ, задайте Provisioning.Agent=disabled в конфигурации /etc/waagent.conf .

    2. Настройте точки монтирования:

      echo "Adding mounts and disk_setup to init stage"
      sudo sed -i '/ - mounts/d' /etc/cloud/cloud.cfg
      sudo sed -i '/ - disk_setup/d' /etc/cloud/cloud.cfg
      sudo sed -i '/cloud_init_modules/a\\ - mounts' /etc/cloud/cloud.cfg
      sudo sed -i '/cloud_init_modules/a\\ - disk_setup' /etc/cloud/cloud.cfg
      
      
    3. Настройте источник данных Azure:

      echo "Allow only Azure datasource, disable fetching network setting via IMDS"
      cat << EOF | sudo tee /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg
      datasource_list: [ Azure ]
      datasource:
         Azure:
           apply_network_config: False
      EOF
      
    4. Удалите существующий файл буфера, если вы настроили его:

      if [[ -f /mnt/resource/swapfile ]]; then
      echo "Removing swapfile" #RHEL uses a swap file by default
      swapoff /mnt/resource/swapfile
      rm /mnt/resource/swapfile -f
      fi
      
    5. Настройте ведение журнала cloud-init:

      echo "Add console log file"
      cat << EOF | sudo tee -a /etc/cloud/cloud.cfg.d/05_logging.cfg
      
      # This tells cloud-init to redirect its stdout and stderr to
      # 'tee -a /var/log/cloud-init-output.log' so the user can see output
      # there without needing to look on the console.
      output: {all: '| tee -a /var/log/cloud-init-output.log'}
      EOF
      
  8. Выполните следующие команды, чтобы вывести виртуальную машину из эксплуатации.

    Внимание

    Если вы переносите определенную виртуальную машину и не хотите создавать обобщенный образ, пропустите этап деинициализации. При выполнении команды waagent -force -deprovision+user исходный компьютер будет неиспользуем. Этот шаг предназначен только для создания обобщенного образа.

    sudo rm -f /var/log/waagent.log
    sudo cloud-init clean
    sudo waagent -force -deprovision+user
    sudo rm -f ~/.bash_history
    sudo export HISTSIZE=0
    

    В VirtualBox после запуска waagent -force -deprovision может появиться сообщение об ошибке: [Errno 5] Input/output error. Это сообщение об ошибке не является критическим, и его можно игнорировать.

  9. Завершите работу виртуальной машины и передайте виртуальный жесткий диск в Azure.

Следующие шаги

Создание виртуальной машины Linux с пользовательского диска с помощью Azure CLI