- Загрузка Linux с VHD на компьютере с BIOS
- Установка Linux на VHD
- Подготовка Linux к загрузке с VHD
- Настройка grub4dos
- Настройка загрузчика bootmgr
- Что делать, если не грузится?
- А как же UEFI?
- Загрузка виртуальных linux-машин с диска без разделов
- Краткое содержание
- EFI BIOS
- Загрузчик
- EFI-раздел и грабли
- Важные замечания
- Как работать с Linux используя Windows
- Ubuntu из Microsoft Store
- VirtualBox
Загрузка Linux с VHD на компьютере с BIOS
Загрузка 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.
Источник
Загрузка виртуальных linux-машин с диска без разделов
При создании корневых дисков виртуальных машин, обычно, на них с помощью fdisk/gdisk создается таблица разделов с единственным разделом для размещения на нем операционной системы. Это порождает некоторые неприятности на стороне гипервизора, например:
- При монтировании диска нужно помнить, что монтируется не само блочное устройство, а раздел на нем. Проблема усугубляется если используется lvm-диск — ядро не видит разделы на нем без применения средств убеждения в виде kpartx.
- Для восстановления раздела требуется не только резервная копия файловой системы, но и бубен/копия первого трека.
- Изменение размера такого диска требует
еще одного бубналишней операции по изменению размера раздела на диске
Избавиться от таблицы разделов можно прямой загрузкой ядра, но этот метод не безгрешен. Гипервизор должен иметь на своей стороне образы ядер виртуальных машин, которые нужно поддерживать актуальными при обновлениях гостевых ОС.
Хочу рассказать вам об альтернативном варианте загрузки с диска без разделов с помощью EFI и GRUB2.
Все будет происходить в libvirt, qemu, kvm, Ubuntu.
Краткое содержание
EFI BIOS
Причем здесь EFI? Загрузка в EFI-режиме позволяет нам разместить grub-efi в обычной файловой системе и не требует наличия MBR. Прежде всего нам нужен BIOS для qemu с поддержкой EFI. Называется он OVMF. Из всего скачанного богатства нужен только OVMF.fd (далее подразумевается, что он лежит /opt/ovmf/). OVMF подключается в разделе os домена тегом loader:
Загрузчик
Теперь наша виртуалка умеет грузиться современным способом. Этому способу нужен специальный раздел EFI, где будет лежать загрузчик. Приготовим grub-efi:
Как видите, есть некоторые особенности в месте размещения и имени создаваемого загрузчика. Дело в том, что по умолчанию OVMF-BIOS будет пытаться загрузить с EFI-раздела файл /efi/boot/bootx64.efi. Мы воспользуемся этим и подсунем туда grub-efi, который возьмет свой конфиг со второго диска в системе из /boot/grub/. В последствии этот загрузчик можно использовать для множества виртуальных машин, подключая его на readonly диске и при условии, что диск с /boot/grub будет вторым в системе.
EFI-раздел и грабли
Итак, теперь нам нужен загрузочный EFI-раздел внутри гостя на который мы положим загрузчик. Можно создать небольшой диск, разместить таблицу разделов GPT и EFI-раздел с загрузчиком. Если этот диск подключать в режиме readonly, то можно будет использовать один такой диск для нескольких виртуальных машин. Но тут есть грабли. Если мы расположим его на шине virtio, как любой нормальный диск, то при загрузке нас ожидает сюрприз в виде EFI-shell вместо загруженной системы. Причем этот шелл будет прекрасно видеть наш раздел и грузить загрузчик по команде «bootx64.efi», но без рук фокус сделать не удастся. Вот тут ребята подробно обсуждают и выясняют почему и сходятся, что это баг OVMF.
Поэтому придется подключать диск на шину ide. Это рабочий вариант, но диски не могут быть readonly. Потребуется соблюдать гигиену относительно этого диска внутри гостя и (возможно) распрощаться с идей запуска нескольких машин одним загрузчиком.
Есть вариант лучше.
Отражение директории в диск в Qemu
Qemu умеет создавать виртуальные диски из директорий. Это выглядит вот так:
При этом в гостевой системе появится диск с таблицей разделов в MBR, разделом в FAT16 с содержимым директории на нем. У этого диска есть пара важных для нас особенностей — при его подключении необходим атрибут readonly и раздел на нем имеет тип 0x06, а не 0xEF, как того требует EFI. К счастью, загрузиться с такого раздела можно, если повесить диск на шину usb. В этом случае OVMF-BIOS будет искать загрузчик на обычном разделе FAT.
И тут присутствуют еще одни грабли. В лоб ими получаешь, если работает apparmor, а он по умолчанию в Ubuntu работает.
Для каждой виртуалки libvirt создает apparmor-профиль, который дает ей доступ только к указанным в ее конфиге ресурсам. Для диска сделанного из директории правила создаются неправильные, поэтому стоит добавить в /etc/apparmor.d/abstractions/libvirt-qemu строчки:
Важные замечания
Теперь можно плодить виртуалки создавая диски напрямую на lvm-томах, легко и безопасно менять их размер, не утруждать себя установкой загрузчика на новых машинах развернутых с помощью debootstrap, делать резервные копии корневых систем помощью dump и восстанавливать их простым restore.
Однако, есть некоторые ограничения. Диски на шинах usb и ide OVMF всегда расположит ранее дисков на virtio, а мы захардкодили в grub на загрузку меню и модулей со второго диска (первым у нас стоит диск с загрузчиком):
Сделали мы это параметром -p «(hd1)/boot/grub/». Здесь (hd1) как раз и указывает на второй диск (первый, соответственно (hd0)). Учитывайте это, если будете добавлять в машину диски отличные от virtio.
Так же, нужно помнить, что grub может динамически подгружать дополнительные модули из /boot/grub корневого раздела, а так как гостевые системы могут быть разные, то версии этих модулей могут оказаться несовместимыми с загрузчиком из EFI-раздела. Избавится от этого можно понапихав необходимые модули статически путем добавления их названия в вышеприведенную строку.
Источник
Как работать с Linux используя Windows
Если вы только начали свой путь разработчика и до сих используете операционную систему семейства Microsoft Windows, то уже наверняка столкнулись с ситуацией, когда ваш инструментарий отличается от того, что установлено у большинства людей из этой профессии. Чаще всего проблемы начинаются при работе в командной строке. Дело в том, что Windows не является POSIX-совместимой операционной системой, поэтому в ней отсутствует базовый набор прикладных программ, который необходим для разработки.
Этот вопрос можно решить установкой какого-либо из многочисленных дистрибутивов Linux в качестве основной, либо альтернативной операционной системы. Для новичков есть способ проще и быстрее — технологии виртуализации. Об этом и поговорим.
Ubuntu из Microsoft Store
Если вы работаете на Windows версии 10 с архитектурой x64, то можно можно воспользоваться встроенным решением и установить слой совместимости (Windows Subsystem for Linux) на основе Ubuntu Linux через магазин приложений Microsoft Store.
Перед тем как начать, необходимо убедиться, что системные требования соответствуют рекомендованным. Для этого запустите приложение Microsoft Store, введите в графе поиска Ubuntu и перейдите по найденной ссылке. Если ранее Windows не обновлялся, то вероятней всего вы получите соответствующее указание сделать это до начала установки Ubuntu. Если всё OK, то нажимайте на кнопку «Получить» и через несколько минут (в зависимости от скорости интернет соединения) вы получите сигнал об успешной установке приложения.
Первый запуск может вызвать ошибку Error: 0x8007007e и предложение прочитать инструкцию по её решению https://aka.ms/wslinstall. Если хотите сэкономить время, то просто запустите PowerShell (не путать с cmd ) от имени администратора и выполните следующую команду:
После этого компьютер попросит перегрузиться, а потом нужно снова запустить приложение Ubuntu. В случае удачной установки откроется интерпретатор командной строки с предложением ввести имя пользователя и пароль. Выглядеть это будет вот так:
Преимущество такого способа установки позволяют стереть грань между операционными системами и получить доступ ко всему инструментарию Linux ( bash , ssh , git , apt и так далее) из стандартной командной строки Windows не теряя привычное окружение и оставаясь на одном файловом уровне.
Ссылки на официальную документацию:
VirtualBox
Если вы работаете на Windows версии ниже 10 или хотите получить изолированную операционную систему Linux, да ещё и с графическим окружением, то можно воспользоваться сторонним бесплатным программным продуктом под названием VirtualBox.
Инсталлятор Oracle VM VirtualBox для Windows Hosts
Ссылка на скачивание: Download Oracle VM VirtualBox
Образ операционной системы Ubuntu Linux в формате ISO
Ссылка на скачивание: Download Ubuntu Desktop
Для начала необходимо установить и запустить приложение VirtualBox.
Нажимаем кнопку «Создать», выбираем из списка тип операционной системы «Linux», если нет своих предпочтений по дистрибутиву, то выбираем версию «Ubuntu» 32 или 64 битной архитектуры, а название можно ввести любое.
Указываем объём оперативной памяти выделенной под виртуальную систему. Рекомендованный объём составляет 1024 MB.
Указываем объём дискового пространства выделенного под виртуальную систему. Рекомендованный объём составляет 10 GB.
Тип виртуального жёсткого диска можно оставить как есть — VDI (VitrualBox Disk Image).
Формат хранения данных выберите исходя из личных предпочтений. Динамический виртуальный жёсткий диск растёт по мере заполнения, а фиксированный создаётся сразу того размера, который был указан на предыдущем шаге.
Имя и размер файла можно оставить без изменений и сразу нажать на кнопку «Создать».
По завершению у вас будет создана виртуальная машина, но она пока без операционной системы. Для того чтобы её установить, нужно скачать Ubuntu Linux (32-bit или 64-bit, в зависимости от того, что было выбрано на шаге, где мы указывали тип ОС).
Нажатие на кнопку «Запустить» должно привести к появлению диалогового окна с предложением указать путь до скаченного ISO образа. Сделайте этого и нажмите кнопку «Продолжить»
Виртуальная машина автоматически будет выполнять часть процессов, но в некоторых операциях всё же потребуется участие пользователя.
Выберите языковую поддержку в списке слева и нажмите «Установить Ubuntu».
Можно загрузить обновления сразу на этапе установки.
Без особых опасений выбираем пункт «Стереть диск и установить Ubuntu» и двигаемся дальше.
Если вы выбрали русский язык на первом этапе установки, то вам предложат русскую раскладку клавиатуры в качестве дополнительной.
Заполните поля и выберите режим входа в систему.
Далее начнётся процедура разметки диска, переноса файлов, установка обновлений и другие процессы, которые не потребуют прямого участия пользователя.
По завершению виртуальный компьютер перезагрузится и вы попадёте в уже установленную среду Ubuntu Linux.
Но это ещё не всё. Весьма желательно установить так называемые «Дополнения гостевой ОС». Они содержат драйверы и прочие системные файлы, необходимые для наилучшей производительности и обеспечения дополнительных функциональных возможностей между виртуальной и гостевой операционными системами.
Выберите пункт меню «Устройства» программы VitrualBox, подпункт «Подключить образ диска Дополнений гостевой ОС…» и дождитесь предложение запустить приложение для автоматического запуска с виртуального привода.
Виртуальная ОС Ubuntu Linux установлена и готова к работе.
Ссылка на официальную документацию: Oracle VM VirtualBox User Manual
Источник