Установка Ubuntu на внешний носитель (флешку или жесткий диск) в режиме EFI


Опубликовано 2017.02.28


Ежегодного после Software Freedom Day проходит уже ставший традиционным Linux Install Fest, где все желающие могут получить помощь в установке дистрибутива GNU/Linux на свои ноутбуки.

Вообще говоря, процедура установки современного дистрибутива GNU/Linux вроде Ubuntu не представляет никаких сложностей, даже в том случае, если его необходимо установить рядом с Windows 8/10 в режиме UEFI и включенным Secure Boot.

Но что делать, если требуется поставить GNU/Linux в режиме UEFI на внешний жесткий диск, флешку или карту памяти?

Казалось бы, вставляешь внешний носитель, и устанавливаешь GNU/Linux стандартным образом.

Но, к сожалению, все не так просто. Если вы начнете устанавливать GNU/Linux в таком режиме, то после перезагрузки вы уже не сможете загрузиться с внутреннего жесткого диска при отключенном внешнем носителе.

Проблема заключается в том, что при вызове update-grub обновляется содержимое NVRAM UEFI. Туда прописывается адрес EFI файла который находится на внешнем носителе, а информация о том, как грузиться со встроенного жесткого диска удаляется. Более подробно о процессе загрузке можно почитать здесь: http://www.rodsbooks.com/efi-bootloaders/installation.html

Зачем вообще ставить GNU/Linux на внешний носитель? Причины могут быть различны. Например, я столкнулся с проблемой, что на встроенном диске недостаточно места для установки двух ОС. Серьезно, в ноутбуке был установлен SSD объемом 32ГиБ, чего с трудом хватало даже для работы голой Windows 8.1.

Так же многие новички боятся ставить незнакомую ОС на свой компьютер, или не уверены, нужна ли она им вообще, а попробовать хочется. В этом случае флешка с полноценным GNU/Linux идеальный вариант. (Не просто LiveUSB, а полноценно установленная ОС, как если бы она была установлена на жесткий диск, чтобы оценить все её достоинства).

В VirtualBox отсутсвует загрузочный диск

Все, что описано ниже, рассчитано на опытного пользователя GNU/Linux. Все, что вы делаете - Вы делаете на свой страх и риск. Автор не несет никакой ответственности за Ваши действия или бездействия, которые повлекли за собой порчу или полную потерю Ваших данных.

В качестве примера будем ставить на внешний диск Ubuntu 16.04.

В качестве хост-системы используется Kubuntu 16.04.

Потребуется следующий набор ПО:

Для начала скачаем образ Ubuntu 16.04:

# подготовка
mkdir -p /home/`whoami`/temp/LinuxLiveDrive/
# скачивание
axel -n 10 http://releases.ubuntu.com/16.04/ubuntu-16.04.2-desktop-amd64.iso --output=/home/`whoami`/temp/LinuxLiveDrive/ubuntu-16.04.2-desktop-amd64.iso

Затем создадим пустой файл, который будет использоваться в качестве виртуального жесткого диска. (Инсталлятор Ubuntu 16.04 требует как минимум 9ГиБ свободного места на диске, но мы возьмем чуть больше - 10ГиБ)

# создаем пустой файл
dd if=/dev/zero of=/home/`whoami`/temp/LinuxLiveDrive/LinuxLiveDrive.dd bs=1G count=10

Создадим vmdk, чтобы этот “диск” можно было подключить в VirtualBox:

VBoxManage internalcommands createrawvmdk -filename /home/`whoami`/temp/LinuxLiveDrive/LinuxLiveDrive.vmdk -rawdisk /home/`whoami`/temp/LinuxLiveDrive/LinuxLiveDrive.dd

Теперь приступим к созданию виртуальной машины со следующими характеристиками:

VirtualBox: выбор OS
VirtualBox: выбор жесткого диска
VirtualBox: включение загрузки через EFI

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

Из ньюансов: я рекомендую сделать разбивку жесткого диска следующим образом:

Пример разбивки диска

Почему-то после установки Ubuntu VirtualBox отказался грузить установленную систему. При повторной установке проблем не возникло. Странно. Потом нужно будет разобраться.

После установки необходимо немного порпавить конфигурационные файлы grub.

Для того, чтобы grub не трогал память NVRAM UEFI необходимо отредактировать файл /etc/grub.d/30_uefi-firmware следующим образом: добавить exit 0 сразу после #!/bin/sh:

#! /bin/sh
set -e
exit 0    # добавить эту строку

# grub-mkconfig helper script.
...

Но это еще не все, по умолчанию UEFI ищет загрузочные образы не в том месте, куда их кладет grub, поэтому нам нужно создать еще один скрипт /etc/grub.d/42_custom со следующим содержанием:

#!/bin/sh

set -x

mkdir -p /boot/efi/EFI/boot/
cp /boot/efi/EFI/ubuntu/shimx64.efi /boot/efi/EFI/boot/bootx64.efi
cp /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/boot/grubx64.efi
cp /boot/efi/EFI/ubuntu/grub.cfg /boot/efi/EFI/boot/grub.cfg

и сделать его исполняемым

chmod +x /etc/grub.d/42_custom

Вот и все! Теперь осталось обновить загрузчик и можно приступать к копированию образа на реальный диск:

update-grub

Далее вам следует быть предельно острожным, и не перепутать буквы диска. Будьте внимательны. Так же Вам необходимо выполнять все нижеописанные команды от имени суперпользователя.

Для эксперимента возьмем внешний жесткий диск и зальем на него созданный образ:

dd if=/home/`whoami`/temp/LinuxLiveDrive/LinuxLiveDrive.dd of=/dev/sdX bs=4M

теперь запустим GParted и выставим нужный размер разделов (При запуске GParted скорее всего ругнется, что геометрия диска /dev/sdX не совпадает с таблицей разделов. Смело жмем “Fix”)

Таблица разделов: было
Таблица разделов: стало

Теперь можно подключать жесткий диск к ноутбуку смело загружаться в GNU/Linux!

В случае, если потребуется добавить своп, то можно воспользоваться следующим рецептом:

Создаем своп файл (от имени суперпользователя):

dd if=/dev/zero of=/swap.swp bs=1G count=16
mkswap /swap.swp

И добавляем в конец /etc/fstab следующую строку:

/swap.swp    none    swap    sw    0   0

На этом, пожалуй, все. Всем добра и пингвинов!

Ссылки