Как установить линукс на виртуальный диск vhd
В этой статье предполагается, что вы уже установили операционную систему CentOS Linux (или аналогичную производную) на виртуальный жесткий диск. Существует несколько средств для создания VHD-файлов, например решение для виртуализации, такое как Hyper-V. Инструкции см. в разделе Установка роли Hyper-V и настройка виртуальной машины.
Замечания по установке CentOS
- Дополнительные сведения о подготовке Linux для Azure см. в разделе Общие замечания по установке Linux.
- Формат VHDX не поддерживается в Azure, поддерживается только фиксированный VHD. Можно преобразовать диск в формат VHD с помощью диспетчера Hyper-V или командлета convert-vhd. Если вы используете VirtualBox, при создании диска по умолчанию нужно выбрать фиксированный размер вместо динамически выделяемого.
- При установке системы Linux рекомендуется использовать стандартные разделы, а не 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, и была исправлена в RHEL 6.6 (kernel-2.6.32-504). В системах под управлением модифицированных ядер старше версии 2.6.37 или ядер RHEL старше 2.6.32-504 в командной строке ядра необходимо задать параметр загрузки numa=off в файле grub.conf. Дополнительные сведения см. в статье базы знаний Red Hat KB 436883.
- Не настраивайте раздел подкачки на диске с ОС. Дополнительные сведения описаны далее.
- Размер виртуальной памяти всех VHD в Azure должен быть округлен до 1 МБ. При конвертации диска в формате RAW в виртуальный жесткий диск убедитесь, что размер диска RAW в несколько раз превышает 1 МБ. См. дополнительные сведения в примечаниях по установке Linux.
Агент Linux для Azure
- Агент Linux выпускается по лицензии Apache 2.0. Многие дистрибутивы уже предоставляют пакеты RPM или deb для этого агента, поэтому вы легко сможете установить и обновить такие пакеты.
- Для работы агента Linux для Azure требуется Python v2.6+.
- Для агента также необходим модуль python-pyasn1. В большинстве дистрибутивов он предоставляется в виде отдельно устанавливаемого пакета.
- В некоторых случаях агент Linux для Azure может быть несовместим с NetworkManager. Многие предоставляемые в дистрибутивах пакеты RPM или Deb настраивают NetworkManager, в результате чего возникает конфликт с пакетом waagent. В таких случаях при установке пакета агента Linux удаляется NetworkManager.
- Версия агента Linux для Azure должна быть выше минимальной поддерживаемой версии.
CentOS 6.x
В диспетчере Hyper-V выберите виртуальную машину.
Щелкните Подключение , чтобы открыть окно консоли для виртуальной машины.
В CentOS 6 NetworkManager может мешать выполнению агента Linux для Azure. Установите пакет, выполнив следующую команду:
Создайте или измените файл /etc/sysconfig/network , добавив следующий текст:
Создайте или измените файл /etc/sysconfig/network-scripts/ifcfg-eth0 , добавив следующий текст:
Переместите или удалите правила udev, чтобы не создавать статические правила для интерфейса Ethernet. Эти правила приводят к появлению проблем при клонировании виртуальной машины в Microsoft Azure или Hyper-V:
Убедитесь, что сетевая служба запускается во время загрузки, выполнив следующую команду:
В этом руководстве предполагается, что вы используете по крайней мере репозиторий [openlogic] , который будет применяться при установке агента Linux для Azure.
Добавьте следующую строку в файл /etc/yum.conf:
Выполните следующую команду, чтобы очистить текущие метаданные yum и установить в системе последние обновления:
Если создается образ для более ранней версии CentOS, рекомендуется выполнить обновление всех пакетов до последней версии:
После выполнения этой команды может потребоваться перезагрузка.
(Необязательно) Установите драйверы для служб интеграции Linux.
Этот шаг является обязательным для CentOS 6.3 и более ранних версий и необязательным для более поздних.
Или же следуйте инструкциям по установке на странице скачивания служб интеграции Linux, чтобы установить RPM в образе.
Установите агент Linux для Azure и зависимости. Запустите и включите службу waagent:
Установка пакета WALinuxAgent приведет к удалению пакетов NetworkManager и NetworkManager-gnome, если они еще не удалены, как описано в шаге 3.
Измените строку загрузки ядра в конфигурации grub, чтобы включить дополнительные параметры ядра для Azure. Для этого откройте файл /boot/grub/menu.lst в текстовом редакторе и укажите для ядра по умолчанию следующие параметры:
Помимо вышесказанного, рекомендуется удалить следующие параметры:
Графическая и "тихая" загрузка бесполезны в облачной среде, в которой нам нужно, чтобы все журналы отправлялись на последовательный порт. При желании можно настроить параметр crashkernel , однако учитывайте, что он сокращает объем доступной памяти в виртуальной машине на 128 МБ или более, что может оказаться проблемой в виртуальных машинах небольшого размера.
Для CentOS 6.5 и более ранних версий необходимо также указать параметр ядра numa=off . См. посвященный Red Hat раздел 436883.
Убедитесь, что SSH-сервер установлен и настроен для включения во время загрузки. Обычно это сделано по умолчанию.
Не создавайте пространство подкачки на диске с ОС.
Агент Linux для Azure может автоматически настраивать пространство подкачки с использованием диска на локальном ресурсе, подключенном к виртуальной машине после подготовки для работы в среде Azure. Следует отметить, что локальный диск ресурсов является временным диском и должен быть очищен при отмене подготовки виртуальной машины. После установки агента Linux для Azure (см. предыдущий шаг) соответствующим образом измените следующие параметры в файле /etc/waagent.conf .
В диспетчере Hyper-V выберите Действие -> Завершение работы. Виртуальный жесткий диск Linux готов к передаче в Azure.
Рекомендации по ядру Linux
Драйверы Linux Integration Services (LIS) для Hyper-V и Azure встраиваются непосредственно в основное ядро Linux. Во многих дистрибутивах, которые включают последнюю версию ядра Linux (например, 3.x), эти драйверы уже доступны, или же в ядре предоставляются их более ранние версии. Эти ядра в основном ядре постоянно обновляются с помощью новых исправлений и функций, поэтому по возможности рекомендуется использовать рекомендованный дистрибутив, включающий все исправления и обновления.
Если вы работаете с одним из вариантов Red Hat Enterprise Linux версий 6.0–6.3, вам потребуется установить последние драйверы LIS для Hyper-V. Начиная с RHEL 6.4 и более поздних версий (и его производных вариантов), драйверы LIS уже включены в ядро. Поэтому дополнительные пакеты установки не требуются.
Если необходимо собственное ядро, рекомендуется использовать одну из последних версий (то есть 3.8 или более позднюю). Для дистрибутивов или поставщиков, предоставляющих собственное ядро, рекомендуется регулярно переносить драйверы LIS из основного ядра в собственное. Даже если вы работаете с относительно свежей версией ядра, настоятельно рекомендуется отслеживать исправления драйверов LIS в основном ядре и по мере необходимости обновлять драйверы. Расположение файлов исходного кода драйверов LIS указано в файле MAINTAINERS в дереве исходного кода ядра Linux:
Ядро должно включать следующие исправления. Этот список не является исчерпывающим для всех дистрибутивов.
Установка Linux на VHD
Есть два ключевых отличия от варианта для BIOS:
1) в настройках VirtualBox необходимо установить опцию "Enable EFI";
2) при установке Debian диск был разбит на два раздела: ESP (EFI system partition) размером ~100 Мб, отформатированный в FAT32, и EXT4, занимающий всё оставшееся место.
Возможны и другие варианты разбиения. Раздел ESP при желании можно вынести за пределы VHD (он нам нужен только для загрузки на виртуальной машине), но все дальнейшие настройки сделаны исходя из того, что на VHD будет два раздела.
Настройка grub.cfg
В GRUB2 можно получить UUID раздела с помощью модуля probe, поэтому он должен быть в сборке. За основу была взята сборка GRUB2 с установочного диска Debian, для загрузки нам понадобятся следующие файлы:
Их необходимо скопировать на EFI-раздел USB-диска:
Далее необходимо создать конфигурационный файл \EFI\debian\grub.cfg.
В cfg-файле всё достаточно очевидно, только обращу внимание, что VHD-файл имеет название debefi.vhd, и система будет искать его в корне всех найденных разделов. Для исключения ошибок название файла необходимо сделать уникальным для загружаемой системы. Ну и "gpt2" используется потому, что Linux установлен на втором разделе внутри VHD.
CentOS 7.0+
Изменения в CentOS 7 (и аналогичных производных версиях)
Подготовка виртуальной машины CentOS 7 для Azure в значительной степени аналогична версии CentOS 6, однако есть несколько важных отличий:
- Пакет NetworkManager больше не конфликтует с агентом Azure Linux. Этот пакет устанавливается по умолчанию, и мы рекомендуем не удалять его.
- В качестве загрузчика по умолчанию теперь используется GRUB2, поэтому изменилась процедура правки параметров ядра (см. ниже).
- XFS теперь является файловой системой по умолчанию. При желании можно продолжать использование файловой системы ext4.
Этапы настройки
В диспетчере Hyper-V выберите виртуальную машину.
Щелкните Подключение , чтобы открыть окно консоли для виртуальной машины.
Создайте или измените файл /etc/sysconfig/network , добавив следующий текст:
Создайте или измените файл /etc/sysconfig/network-scripts/ifcfg-eth0 , добавив следующий текст:
Переместите или удалите правила udev, чтобы не создавать статические правила для интерфейса Ethernet. Эти правила приводят к появлению проблем при клонировании виртуальной машины в Microsoft Azure или Hyper-V:
В этом руководстве предполагается, что вы используете по крайней мере репозиторий [openlogic] , который будет применяться при установке агента Linux для Azure.
Выполните следующую команду, чтобы очистить текущие метаданные yum и установить все обновления:
Если создается образ для более ранней версии CentOS, рекомендуется выполнить обновление всех пакетов до последней версии:
После выполнения этой команды может потребоваться перезагрузка.
Измените строку загрузки ядра в конфигурации grub, чтобы включить дополнительные параметры ядра для Azure. Для этого откройте файл /etc/default/grub в текстовом редакторе и измените параметр GRUB_CMDLINE_LINUX , например:
Графическая и "тихая" загрузка бесполезны в облачной среде, в которой нам нужно, чтобы все журналы отправлялись на последовательный порт. При желании можно настроить параметр crashkernel , однако учитывайте, что он сокращает объем доступной памяти в виртуальной машине на 128 МБ или более, что может оказаться проблемой в виртуальных машинах небольшого размера.
После внесения изменений в файл /etc/default/grub , как указано выше, выполните следующую команду для повторного создания конфигурации grub:
Создавая образ из VMWare, VirtualBox или KVM, убедитесь что драйверы Hyper-V включены в initramfs.
Измените файл /etc/dracut.conf , добавив в него следующее содержимое:
Выполните сборку initramfs заново:
Установите cloud-init для обработки операций подготовки:
Переключите конфигурацию. Не создавайте пространство подкачки на диске ОС.
Ранее агент Linux для Azure мог автоматически настраивать размер области подкачки с использованием локального диска ресурсов, подключенного к виртуальной машине после ее подготовки в Azure. Но теперь эту операцию выполняет cloud-init — вам не нужно использовать агент Linux для форматирования диска ресурсов. Создайте файл подкачки и соответствующим образом измените следующие параметры в файле /etc/waagent.conf :
Если вы хотите подключить, отформатировать или создать файл подкачки, вы можете:
Передать его в конфигурации cloud-init при каждом создании виртуальной машины.
Использовать директиву cloud-init, встроенную в образ, которая будет выполнять эту операцию при каждом создании виртуальной машины:
Примечание. Если вы переносите определенную виртуальную машину и не хотите создавать обобщенный образ, пропустите отмену подготовки.
В диспетчере Hyper-V выберите Действие -> Завершение работы. Виртуальный жесткий диск Linux готов к передаче в Azure.
Общие системные требования для Linux
Кроме того, мы рекомендуем удалить следующие параметры (если они заданы).
Графическая и "тихая" загрузка бесполезны в облачной среде, в которой требуется, чтобы все журналы отправлялись на последовательный порт. При желании можно настроить параметр crashkernel , однако учитывайте, что он сокращает объем доступной памяти в виртуальной машине на 128 МБ или более, что может оказаться проблемой в виртуальных машинах небольшого размера.
Установите агент Linux для Azure.
Агент Linux для Azure необходим для подготовки образа Linux в Azure. Во многих дистрибутивах агент предоставляется в виде пакета RPM или deb (такой пакет обычно называется WALinuxAgent или walinuxagent). Агент также можно установить вручную, как описано в руководстве по агенту Linux.
Убедитесь, что SSH-сервер установлен и настроен для включения во время загрузки. Как правило, эта конфигурация используется по умолчанию.
Не создавайте пространство подкачки на диске с ОС.
Агент Linux для Azure может автоматически настраивать пространство подкачки с использованием диска на локальном ресурсе, подключенном к виртуальной машине после подготовки для работы в среде Azure. Локальный диск ресурсов является временным и может быть очищен при отмене подготовки виртуальной машины. После установки агента Linux для Azure (см. шаг 2) измените следующие параметры в /etc/waagent.conf соответствующим образом.
Выполните следующие команды, чтобы отозвать виртуальную машину.
Подготовка Linux к загрузке с VHD
Скрипт из предыдущей статьи нам подходит для загрузки на локальном компьютере, где состав дисков меняется редко и заранее известно, на каком диске хранится VHD-файл. Но мы себе поставили новую цель: иметь возможность загружаться с USB-носителя на любом компьютере с любой конфигурацией жестких дисков. Загрузчики grub4dos и grub2 умеют искать файлы на доступных разделах и работать с UUID разделов. Мы этим воспользуемся при создании конфигурационного файла загрузчика, а пока добавим обработку UUID в скрипт loop_boot_vhd.
В скрипт добавлено считывание нового параметра loop_dev_uuid . В нём ожидается UUID раздела, на котором находится VHD-файл (путь к нему передается, как и раньше, в параметре loop_file_path ). Если задан loop_dev_uuid , то значение, переданное в loop_dev_path , игнорируется и заменяется на найденный по UUID путь к устройству. Кроме того, если диск подключен по USB, то он может определяться в системе с задержкой. Поэтому добавлено ожидание (до 10 секунд), во время которого выполняется ежесекундная проверка, появилось нужное устройство или нет. Мы ищем раздел по UUID с помощью утилиты findfs. Она не входит в образ initramfs, для её добавления необходимо создать скрипт /etc/initramfs-tools/hooks/copyfindfs (не забывайте делать скрипты исполняемыми).
Скрипт loop_boot_vhd необходимо расположить, как и ранее, в /etc/initramfs-tools/scripts/local-top/. После чего пересобрать initramfs, и VHD-образ можно считать готовым.
Установка модулей ядра без Hyper-V
Так как Azure запускается на гипервизоре Hyper-V, Linux требует определенные модули ядра для запуска в Azure. При наличии виртуальной машины, созданной вне Hyper-V, установщики Linux могут не включать драйверы для Hyper-V в начальный электронный диск (initrd или initramfs), если только виртуальная машина не обнаружит, что он работает в среде Hyper-V. Если для подготовки образа Linux используется другая система виртуализации (например, Virtualbox или KVM), вам может потребоваться выполнить повторную сборку initrd, чтобы на начальном электронном диске были доступны по крайней мере модули ядра hv_vmbus и hv_storvsc. Это известная проблема встречается по крайней мере в системах на основе предшествующего дистрибутива Red Hat. Также она может встречаться в других версиях.
Механизм повторной сборки образа initrd или initramfs может отличаться в зависимости от дистрибутива. Чтобы узнать правильную процедуру для вашего дистрибутива, см. документацию по дистрибутиву или раздел поддержки. Ниже приведен пример выполнения повторной сборки initrd с помощью служебной программы mkinitrd :
Создайте резервную копию существующего образа initrd:
Выполните повторную сборку initrd с использованием модулей ядра hv_vmbus и hv_storvsc:
Дальнейшие действия
Теперь виртуальный жесткий диск CentOS Linux можно использовать для создания новых виртуальных машин Azure. Если вы отправляете VHD-файл в Azure впервые, см. раздел Вариант 1. Передача VHD.
В статье о возможности загружать Linux с VHD был предложен способ загружать Linux на машине с Windows без необходимости разбивать диск на разделы. Но было одно существенное ограничение: рассматривался только вариант загрузки BIOS, т.е. legacy-загрузки. Сейчас появляется всё больше устройств без поддержки режима legacy (например, многие ноутбуки, выпущенные в 2020 году). Поэтому в этой статье будет рассмотрена загрузка Linux с VHD на компьютерах с UEFI.
В чём отличия UEFI от BIOS, в интернете описано достаточно подробно, можно посмотреть, например, в этой статье. Для нас наиболее важным будет необходимость использовать разметку GPT для загрузочного диска и при создании разделов на VHD. Эксперименты проводились при отключенном Secure Boot. Не буду подробно останавливаться на моментах, описанных в предыдущей части. Как и ранее, предполагается, что читатель имеет представление о работе с консолью в Windows и Linux, умеет работать со стандартными системными утилитами, с ПО для виртуализации и т.п.
Предварительно отмечу еще ряд моментов. Можно было бы рассмотреть загрузку системы с внутреннего жесткого диска компьютера, но мы немного усложним задачу и будем загружать систему со съемного USB-диска, на котором будет располагаться VHD-файл. Все действия применимы и для внутреннего жесткого диска, а некоторые особенности будут отмечены в отдельном разделе.
Разработчики grub4dos недавно выпустили версию своего загрузчика для UEFI. При использовании версии grub4dos-for_UEFI-2021-02-10.7z на виртуальной машине у меня не возникло особых проблем при загрузке Linux с VHD, но на реальном железе при работе с тем же самым образом VHD была получена ошибка: Error 24: Attempt to access block outside of partition. С учетом простоты, с которой UEFI позволяет заменить загрузчик (простая замена файла), было решено воспользоваться загрузчиком grub2 из дистрибутива Debian debian-10.8.0-amd64-netinst.iso.
Изменение размера VHD
В таком случае вы можете изменить размер виртуальной машины с помощью консоли диспетчера Hyper-V или командлета Powershell Resize-VHD. Если вы работаете не в среде Windows, воспользуйтесь командой qemu-img для преобразования (если необходимо) и изменения размера VHD.
В команде qemu-img версии >=2.2.1 есть ошибка, которая приводит к созданию неверного формата VHD. Эта проблема устранена в QEMU версии 2.6. Рекомендуется использовать либо версию qemu-img 2.2.0 или более раннюю, либо версию 2.6 или более позднюю.
Изменение размера VHD с непосредственным использованием таких инструментов, как qemu-img или vbox-manage , может привести к сбою загрузки VHD. Мы советуем сначала преобразовать VHD в образ необработанного диска. Если образ виртуальной машины был создан в качестве образа необработанного диска (по умолчанию для некоторых гипервизоров, например, KVM), вы можете пропустить этот шаг.
Рассчитайте необходимый размер образа диска, чтобы округлить размер виртуальной памяти до 1 МБ. Следующий скрипт для оболочки Bash использует qemu-img info для определения виртуального размера образа диска и вычисляет размер с округлением до 1 МБ в большую сторону.
Измените размер необработанного диска с помощью $rounded_size , как показано выше.
А теперь преобразуйте необработанный диск обратно в VHD с фиксированным размером памяти.
Или с помощью qemu версии 2.6 или выше добавьте параметр force_size .
Общие замечания по установке Linux
Azure не поддерживает формат виртуального жесткого диска Hyper-V (VHDX) и может работать только с фиксированными виртуальными жесткими дисками. Можно преобразовать диск в формат VHD с помощью диспетчера Hyper-V или командлета Convert-VHD. Если вы используете VirtualBox, при создании диска нужно выбрать фиксированный размер вместо динамически выделяемого, который используется по умолчанию.
Azure поддерживает виртуальные машины 1-го поколения (загрузка в BIOS) и 2-го поколения (загрузка в UEFI).
Максимально допустимый размер виртуального жесткого диска составляет 1023 ГБ.
При установке системы Linux рекомендуется использовать стандартные разделы, а не диспетчер логических томов (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 (kernel-2.6.32-504). В системах под управлением модифицированных ядер старше версии 2.6.37 или ядер RHEL старше 2.6.32-504 в командной строке ядра необходимо задать параметр загрузки numa=off в файле grub.conf. Дополнительные сведения см. в статье базы знаний Red Hat 436883.
Не настраивайте раздел подкачки на диске с ОС. Можно настроить агент Linux для создания файла подкачки на временном диске ресурсов, как описывается на следующих шагах.
Размер виртуальной памяти всех виртуальных жестких дисков в Azure должен быть округлен до 1 МБ (1024 × 1024 байт). Перед конвертацией диска RAW в формат VHD убедитесь, что размер диска RAW в несколько раз превышает 1 МБ, как описывается на следующих шагах.
Убедитесь, что модули 'udf' (cloud-init >= 21.2) и 'vfat' включены. Добавление модуля udf в список блокировок вызовет сбой подготовки, а добавление в этот список модуля vfat приведет к сбоям в подготовке и загрузке. Cloud-init < 21.2 не затрагивается и не требует этого изменения.
Особенности настройки параллельно с Windows bootloader
Disclaimer: дальнейшие действия могут привести к невозможности загрузить компьютер штатными средствами, все действия вы выполняете на свой страх и риск. Перед экспериментом проверьте, контролирует ли установленное антивирусное ПО целостность загрузчика. И не забывайте о возможных побочных эффектах.
Я опишу один из вариантов реализации выбора между загрузкой Windows и Linux: с помощью замены загрузчика на GRUB2. Загрузка EFI-систем по умолчанию начинается с файла \EFI\Boot\BOOTX64.EFI, в Windows 10 используется \EFI\Microsoft\Boot\bootmgfw.efi. Заменить загрузчик Microsoft на GRUB2 можно просто заменив файл. Необходимо быть внимательным, если сомневаетесь в получении результата с первого раза, то лучше сначала поэкспериментируйте на виртуальной машине. С помощью diskpart.exe надо подключить EFI-раздел Windows, на котором необходимо:
переименовать/перенести файл \EFI\Microsoft\Boot\bootmgfw.efi в \EFI\boot\ms.efi;
файл bootx64.efi из ISO-образа Debian переименовать в \EFI\Microsoft\Boot\bootmgfw.efi;
grubx64.efi разместить в \EFI\Microsoft\Boot\grubx64.efi;
probe.mod разместить в \EFI\debian\x86_64-efi\probe.mod;
ранее созданный grub.cfg скопировать в \EFI\debian\grub.cfg и добавить пункт для передачи управления загрузчику Microsoft:
Теперь при загрузке сначала будет появляться меню GRUB2 с выбором загрузки Windows ("ms") или Linux ("vhdUUID").
Если на каком-то из этапов загрузки возникают ошибки, то (как и с grub4dos) необходимо попытаться вводить команды вручную и смотреть, какие ошибки выдает система, как и куда монтируются разделы, доступны ли все необходимые файлы и т.п.
В Windows 7 появилась возможность установки прямиком в VHD.
Хотелось бы знать, есть ли возможность установить таким образом Linux (допустим, Ubuntu). Интересует не столько возможность дальнейшего подключения к VM, сколько именно установка в файл и возможность не заморачиваться с разделами.
Также хотелось бы знать о производительности таких систем (о Windows тоже интересно).
Оценить 1 комментарий
Уточняю — дело не в VHD, а в установке Linux в файл на Windows-разделе.
Для примера — сейчас Wubi поставил мне Mint в root.disk и swap.disk. Интересует, как сделать это «вручную». ВМ не катит.
Не совсем понятна какая цель преследуется…
Чтобы читать потом систему из файла, потребуется хитрый бутменеджер, который понимает загрузку системы из этого самого VHD файла.
В принципе, капсуляция файловой системы внутри файла другой файловой системы не должна давать деградации по скорости.
Linux можно установить в файл виртуальной машины, потом перенести на хост и, при наличии умного бутменеджера, загрузиться из этого файла
Стоит также отметить, что не все программы виртуализации умеют расширять контейнер для файловой системы на лету (вернее я не знаю ни одной такой), т.е. если вам вдруг системе не хватит места, то придется подключать дополнительные файлы. Можно нарваться на геморрой.
Не знаю, правильно ли понял вопрос, но LiveCD Ubuntu работает с ISO образа на винте. Правда со всеми ограничениями присущим LiveCD, прежде всего read-only. Инструменты для кастомизации установки есть.
Может быть проще поставить в виртуальную машину и не заморачиваться с разделами?
Кстати, когда-то давно в Linux был драйвер, который на FAT умел хранить POSIX атрибуты файлов.
Вообще ничего особо сложного. Идея следующая: GRUB читает ядро и initrd с FAT раздела. Initrd монтирует FAT раздел, находит образ ФС, монтирует его, делает chroot. Вот только сконструировать это из-под Windows вряд ли получится, LiveCD с Linux. Создать пустой образ, создать на нём ФС, установить туда ОС (например, через debootstrap), взять из образа ядро и initrd, собрать свой initrd с нужной магией (а это уже не так тривиально), установить GRUB.
Загрузка Linux с VHD может пригодиться в различных сценариях, например, когда на компьютере установлена Windows и есть необходимость в Linux, но WSL или виртуальной машины с Linux недостаточно, а разбивать диск на разделы нет желания. Microsoft позволяет грузить Windows с VHD «из коробки» начиная со старших редакций Windows 7. Но что делать, если возникла необходимость загрузить таким способом Linux?
На форумах часто можно встретить мнение, что загрузить Linux с VHD либо нельзя, либо очень сложно. Полезной информации в интернете на эту тему действительно мало. Базовая идея, как это осуществить, описана тут. Суть в следующем:
Необходимо убедиться в поддержке NTFS на всех этапах.
Необходимо убедиться в поддержке loop-устройств.
Добавить в загрузочные скрипты ОС команду монтирования loop-устройства.
Убедиться, что все необходимые утилиты добавлены в образ, обновить initramfs внутри VHD.
В случае legacy-зарузки (BIOS) и использования штатного загрузчика Windows добавить grub4dos в меню bootmgr, а в меню grub4dos добавить пункт для загрузки с VHD.
Практическое применение этой идеи для Arch Linux описано тут. В этой статье я проведу аналогичный эксперимент с Debian. Предполагается, что читатель имеет представление о работе с консолью в Windows и в Linux, умеет работать со стандартными системными утилитами, с ПО для виртуализации и т.п. — элементарные вещи подробно не расписаны.
Процесс загрузки будет выглядеть так: bootmgr -> grub4dos -> initramfs -> debian. Рассмотрим подготовку каждого этапа справа налево.
Установка Linux на VHD
Для начала необходимо создать пустой образ VHD с фиксированным размером. Если нужно минимизировать размер образа, то для экспериментов с CLI достаточно создать диск объемом ~1,5 Гб. Для рабочей системы с GUI можно ограничиться объемом 10 Гб (с условием хранения пользовательских данных вне VHD).
Создадим VHD с помощью diskpart.exe:
Далее необходимо установить Debian на VHD. Я для этого воспользовался VirtualBox 6.1, устанавливал debian-10.8.0-amd64-netinst.iso. Параметры виртуальной машины — по умолчанию, новый диск создавать не надо, достаточно подключить ранее созданный debian.vhd.
Установка Debian стандартна, обращу внимание только на некоторые моменты.
При разметке диска я создал один загрузочный раздел ext4. Раздел подкачки на VHD я делать не стал, после установки можно разместить файл или раздел подкачки в удобном месте.
При выборе дополнительного ПО для установки я оставил только SSH-сервер и стандартные системные утилиты. Всё остальное можно поставить потом, по необходимости. GRUB установлен в MBR. Если при установке была выбрана русская локаль, то после установки можно добавить локаль en_US командой dpkg-reconfigure locales .
Подготовка Linux к загрузке с VHD
В установленную систему необходимо добавить поддержку NTFS и утилиту partprobe, которая позволяет сообщить ядру ОС о необходимости повторного чтения таблицы разделов жёсткого диска.
Затем надо подготовить скрипты для initramfs.
initramfs — это начальная файловая система в оперативной памяти, которая содержит утилиты и скрипты, требуемые для монтирования файловых систем перед вызовом init, располагающегося в корневой файловой системе.
Скрипты для initramfs созданы на основе документации. Наши дополнения для initramfs мы будем размещать в следующих каталогах.
/etc/initramfs-tools/hooks/ — здесь размещаются скрипты, которые запускаются при генерации initramfs-образа. Тут мы разместим скрипт для добавления в initramfs утилиты partprobe с необходимыми библиотеками.
/etc/initramfs-tools/scripts/local-top/ — после выполнения этих скриптов загрузчик считает, что root-устройство смонтировано. Т.е. здесь будет скрипт для монтирования VHD.
Скрипт для добавления partprobe в initramfs возьмем из этой статьи с добавлением еще одной библиотеки. Надо создать файл partcopy и сделать его исполняемым:
Скрипт для монтирования VHD сделан на основе скрипта для Arch Linux с учетом особенностей выбранного дистрибутива Linux. Скрипт необходимо сохранить под именем loop_boot_vhd и сделать исполняемым:
Немного подробнее поясню логику работы скрипта. Обработка prereqs рекомендована в документации. В переменную cmdline попадает строка инициализации из grub4dos, например, root=/dev/loop0p1 loop_file_path=/debian.vhd loop_dev_path=/dev/sda2 . Далее идет разбор этой строки и из нее определяется номер партиции на loop-устройстве, а в переменные loop_dev_path и loop_file_path сохраняются путь к устройству, на котором хранится VHD-файл, и путь к VHD-файлу на устройстве. Если данные для этих переменных не переданы, то скрипт прекращает работу и система пытается загрузиться в обычном режиме. Если переменные определены, то загружается модуль ядра для подержки loop-устройств с указанием в параметрах максимального количества loop-устройств и максимального количества таблиц разделов на loop-устройстве. Затем командой blkid определяется тип файловой системы диска, на котором хранится VHD-файл. Если VHD лежит на NTFS, то монтирование производится с помощью команды ntfs-3g , иначе — командой mount . Монтирование производится в каталог /host (который при необходимости предварительно создается). После этого VHD подключается в систему командой losetup , а затем partprobe сообщает ядру о новом диске.
После размещения скриптов в нужные каталоги ( /etc/initramfs-tools/scripts/local-top/loop_boot_vhd и /etc/initramfs-tools/hooks/partcopy ) необходимо пересобрать initramfs командой:
Для дальнейшей настройки надо запомнить номер версии ядра: /boot/initrd.img-4.19.0-14-amd64 и /boot/vmlinuz-4.19.0-14-amd64.
На этом образ готов к запуску на реальном железе, можно выключать виртуальную машину и приступать к подготовке загрузчика. Готовый образ debian.vhd надо скопировать в корень диска C:, дальнейшие скрипты написаны исходя из предположения, что VHD находится в корне NTFS-раздела.
Настройка grub4dos
Для начала надо скачать актуальную версию grub4dos. Работа с этой утилитой в различных источниках описана достаточно подробно. Настройка сводится к следующему:
необходимо найти раздел, в корне которого лежит VHD-файл, и сделать его корневым для всех команд в текущем пункте меню (команда find --set-root );
затем загрузить образ жесткого диска (команды map . vhd и map --hook );
далее подключенный образ указать как корневое устройство (команда root );
и указать параметры запуска Linux ( kernel и initrd ).
Получается файл menu.lst с таким содержимым:
Тут надо обратить внимание на один момент: в команде kernel инициализируются переменные, которые передаются в initramfs и используются в ранее созданном скрипте loop_boot_vhd .
В моем примере переменные заполнены исходя из моей конфигурации компьютера: один диск с Windows, разбитый на два раздела (загрузочный "System Reserved" и основной NTFS), а внутри VHD — один раздел ext4.
Настройка загрузчика bootmgr
Обратите внимание: в зависимости от версии Windows и особенностей установки ОС возможны незначительные отличия.
Первое, что надо сделать, — подключить скрытый раздел с bootmgr, в примере ниже я подключаю скрытый раздел "System Reserved" в каталог C:\mnt (каталог должен быть предварительно создан). Команды выполняются в diskpart.exe:
После этого надо распаковать в каталог C:\mnt\ файлы из архива с grub4dos: grldr и grldr.mbr . В этот же каталог надо скопировать файл menu.lst , созданный на предыдущем шаге. После этого раздел можно отключить в diskpart.exe:
Чтобы настроить отображение пункта меню при загрузке Windows, надо сделать следующее:
В ответ будет сообщен GUID нового пункта меню. Полученный GUID используется в следующих командах:
Тут подробно не останавливаюсь, все команды очевидны и хорошо описаны в документации. Ну, и чтобы не переключаться лишний раз между графическим и текстовым режимами:
На этом всё: можно перезагрузить компьютер, выбрать в меню загрузки grub4dos, затем Debian, после чего должен загрузиться Linux.
Что делать, если не грузится?
В этом случае, скорее всего, неверно указаны параметры с путями к устройству, на котором находится VHD-файл, или раздел на loop-устройстве. Если загрузка останавливается на уровне grub4dos, то в консоли надо последовательно вводить команды, перечисленные в menu.lst , и смотреть на результаты, в зависимости от которых правильно указать параметры для загрузки Linux. Если загрузка останавливается в initramfs, то надо проверить доступность необходимых устройств на этом этапе. Проверить можно, последовательно вводя команды из скрипта loop_boot_vhd (основное: смонтировать нужные разделы, найти VHD, подключить его, проверить присвоенный номер партиции с Linux, в моем примере — loop0p1).
А как же UEFI?
Это немного другая история, надеюсь, позже найду время и проведу аналогичный эксперимент с UEFI.
Соглашение об уровне обслуживания для платформы Azure применяется для виртуальных машин с ОС Linux, только если используется один из рекомендованных дистрибутивов. Для рекомендованных дистрибутивов предоставляются предварительно настроенные образы Linux, представленные в коллекции в Azure Marketplace.
К любым дистрибутивам, выполняющимся в Azure, предъявляются определенные требования. Поскольку каждый дистрибутив имеет свои особенности, привести исчерпывающую информацию в рамках одной статьи невозможно. Даже при соблюдении всех приведенных ниже условий для надлежащей работы может потребоваться масштабная настройка системы Linux.
В этой статье приводятся общие рекомендации по работе с дистрибутивом Linux в Azure.
Читайте также: