Подготовка Linux к созданию образов в Azure
Внимание
Эта статья ссылается на CentOS, дистрибутив Linux, который является состоянием "Конец жизни" (EOL). Обратите внимание на использование и план соответствующим образом. Дополнительные сведения см. в руководстве centOS End Of Life.
Область применения: ✔️ Виртуальные машины Linux ✔️ Гибкие масштабируемые наборы
Соглашение об уровне обслуживания платформы Azure применяется к виртуальным машинам под управлением операционной системы Linux только при использовании одного из утвержденных дистрибутивов. Для утвержденных дистрибутивов Azure Marketplace предоставляет предварительно настроенные образы Linux. Дополнительные сведения см. в разделе:
- Утвержденные дистрибутивы Linux в Azure
- Поддержка Linux и технологий с открытым исходным кодом в Azure
Все остальные дистрибутивы, работающие в 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
программы:
Создайте резервную копию существующего образа initrd:
cd /boot sudo cp initrd-`uname -r`.img initrd-`uname -r`.img.bak
Перестройте инициализацию с помощью
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 или более позднюю.
Изменение размера виртуального жесткого диска напрямую с помощью таких средств, как
qemu-img
илиvbox-manage
может привести к неизменяемому виртуальному жесткому диску. Рекомендуется сначала преобразовать VHD в необработанный образ диска с помощью следующего кода.Если образ виртуальной машины был создан как образ необработанного диска, этот шаг можно пропустить. Создание образа виртуальной машины в качестве образа необработанного диска является значением по умолчанию в некоторых гипервизорах, таких как KVM.
sudo qemu-img convert -f vpc -O raw MyLinuxVM.vhd MyLinuxVM.raw
Рассчитайте необходимый размер образа диска, чтобы округлить размер виртуальной памяти до 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"
Изменение размера необработанного диска с помощью
$rounded_size
:sudo qemu-img resize MyLinuxVM.raw $rounded_size
Преобразуйте необработанный диск обратно в виртуальный жесткий диск фиксированного размера:
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/
Активное ядро виртуальной машины должно содержать следующие исправления. Этот список не является исчерпывающим для всех дистрибутивов.
- ata_piix: предоставление дисков драйверам Hyper-V по умолчанию;
- storvsc: принятие во внимание передаваемых пакетов в папке RESET;
- storvsc: предотвращение использования WRITE_SAME;
- storvsc: отключение WRITE SAME для драйверов RAID и адаптеров виртуальных узлов;
- storvsc: исправление разыменования пустого указателя;
- storvsc: ошибки кольцевого буфера могут привести к заморозке операций ввода-вывода.
- scsi_sysfs: защита от двойного выполнения __scsi_remove_device.
Агент 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
Измените строку загрузки ядра в GRUB или GRUB2 и включите в нее следующие параметры, задающие отправку всех сообщений консоли в первый последовательный порт. Эти сообщения могут использоваться службой поддержки Azure при отладке возникающих проблем.
GRUB_CMDLINE_LINUX="rootdelay=300 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0"
Мы также рекомендуем удалить следующие параметры, если они существуют:
rhgb quiet crashkernel=auto
Графическая и тихая загрузка не полезна в облачной среде, где все журналы отправляются на последовательный порт. При необходимости этот параметр можно оставить
crashkernel
настроенным, но этот параметр уменьшает объем доступной памяти на виртуальной машине по крайней мере на 128 МБ. Сокращение доступной памяти может быть проблематичным для небольших размеров виртуальных машин.После завершения редактирования /etc/default/grub выполните следующую команду, чтобы перестроить конфигурацию GRUB:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Добавьте модуль 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
Убедитесь, что SSH-сервер установлен и настроен для включения во время загрузки. Как правило, эта конфигурация используется по умолчанию.
Установите агент 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
Не создавайте пространство подкачки на диске с ОС.
Агент 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
- Передайте конфигурацию cloud-init при каждом создании виртуальной машины
Настройте cloud-init для обработки операций подготовки:
Настройте
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 .Настройте подключения:
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
Настройте источник данных 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
Удалите существующий файл буфера, если вы настроили его:
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
Настройте ведение журнала 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
Выполните следующие команды, чтобы отозвать виртуальную машину.
Внимание
Если вы переносите определенную виртуальную машину и не хотите создавать обобщенный образ, пропустите этап отмены подготовки. При выполнении команды
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
сообщения может появиться сообщение об ошибке. Это сообщение об ошибке не является критическим, и его можно игнорировать.Завершите работу виртуальной машины и передайте виртуальный жесткий диск в Azure.
Следующие шаги
Создание виртуальной машины Linux с пользовательского диска с помощью Azure CLI