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

Внимание

Эта статья ссылается на CentOS, дистрибутив Linux, который является состоянием "Конец жизни" (EOL). Обратите внимание на использование и план соответствующим образом. Дополнительные сведения см. в руководстве centOS End Of Life.

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

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

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

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

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

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

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

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

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

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

    Это позволит избежать конфликта имен LVM c клонированными виртуальными машинами, особенно если диск с OC может быть подключен к другой идентичной виртуальной машине в целях устранения неполадок. На дисках данных можно использовать 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. Дополнительные сведения см. в статье базы знаний Red Hat 436883.

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

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

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

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

Примечание.

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

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

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

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

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

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

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

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

Изменение размера виртуальных жестких диски

Размер виртуальной памяти образов 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. Изменение размера виртуального жесткого диска напрямую с помощью таких средств, как qemu-img или vbox-manage может привести к неизменяемому виртуальному жесткому диску. Рекомендуется сначала преобразовать 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. Вы можете получить последнюю версию, сообщить о проблемах или отправить запросы на вытягивание в репозитории агента Linux 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