Чиним GRUB без флешки

Кажется, у каждого есть старенький ноутбук, который давно служит лишь для просмотра фильмов. У меня такой тоже есть — подключён по HDMI к телевизору и почти забыт. Однажды ради эксперимента я установил на него Linux, а через пару месяцев, когда понадобилось место, решил просто удалить линуксовый раздел. Затем я перезагрузил ноутбук и винда, конечно же, не загрузилась. После установки линукса, загрузчик GRUB переписал MBR, и теперь система не знала, откуда грузиться.

Что делать? Казалось бы, всё просто: берём флешку, загружаемся с Live CD, восстанавливаем MBR. Но флешки у меня не было. Можно было бы флешку одолжить, но хотелось решить проблему здесь и сейчас. Размышляя об этом, я залез в биос и обнаружил, что ноутбук поддерживает загрузку по сети через PXE…

Дилемма

Так как у меня на диске 2 операционных системы, я могу выбрать один из 2 вариантов:

Первый вариант показался мне муторным и неочевидным, а вот поставить пару сервисов на линукс — наоборот. Поэтому я выбрал второй вариант и образ Ubuntu server netboot, который весит всего 64 МБ. У меня на основном ноутбуке стоит минт в дуалбуте, так что я все настраивал на нем.

Установка PXE

Загрузка по сети работает через PXE. Установка состоит глобально из 3 шагов:

  1. Настройка интерфейса

  2. Настройка tftp и DHCP-серверов

  3. Загрузка по сети

Настройка интерфейса

Для загрузки через PXE нам нужно, чтобы компьютеры были в одной сети. Выяснять, какие сетевые карты поддерживают загрузку по WiFi я не стал, поэтому просто соединил компьютеры кабелем и создал новый интерфейс.

На Linux Mint 21 настройка сети должна выполняться через Network manager. Выведем список всех интерфейсов:

nmcli device status

У меня Ethernet интерфейс называется enp0s31f6

У меня Ethernet интерфейс называется enp0s31f6

Интерфейсу надо назначить IP-адрес. Я использовал подсеть 10.0.0.0. Подставьте в команду ниже свой IP-адрес и название интерфейса. Она создаст соединение:

sudo nmcli connection add type ethernet ifname enp0s31f6 con-name NewInterface ipv4.addresses 10.0.0.1/24 ipv4.dns «8.8.8.8» ipv4.method manual connection.autoconnect yes

Интерфейс создан и готов к работе, его состояние можно проверить командами ip a или nmcli device status.

Настройка tftp и DHCP серверов

Далее установим tftp сервер, чтобы он отдавал установочные файлы по сети:

sudo apt install tftpd-hpa apache2 syslinux isc-dhcp-server -y

Добавим в конфиг tftp папку с установочными файлами:

sudo sed -i 's|TFTP_DIRECTORY=.*|TFTP_DIRECTORY=»/opt/tftp»|' /etc/default/tftpd-hpa

Создадим папку и распакуем файлы системы в папку tftp:

sudo mkdir /opt/tftp
sudo cp /usr/lib/syslinux/modules/bios/* /opt/tftp/
wget http://archive.ubuntu.com/ubuntu/dists/bionic-updates/main/installer-amd64/current/images/netboot/netboot.tar.gz 
sudo tar -xzvf netboot.tar.gz -C /opt/tftp/

А затем настроим собственно установку образа Ubuntu по сети в конфиге PXE. Для этого откроем конфиг файл PXE

sudo nano /opt/tftp/pxelinux.cfg/default

и приведем его к такому виду:

DEFAULT ubuntu
LABEL ubuntu
MENU LABEL ^Install Ubuntu Server 18
KERNEL ubuntu-installer/amd64/linux
APPEND vga=788 initrd=ubuntu-installer/amd64/initrd.gz

Перезапустим службу tftp для применения изменений.

sudo systemctl restart tftpd-hpa

Наш tftp сервер готов к работе.

Настройка DHCP

Теперь настроим DHCP сервер. Для этого отредактируем настройки сервера.

sudo nano /etc/dhcp/dhcpd.conf

Укажем в файле IP-адреса вашей подсети. Мой конфиг для подсети 10.0.0.0:

subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.2 10.0.0.100;
option broadcast-address 10.0.0.255;
option routers 10.0.0.1;
next-server 10.0.0.1;
filename «pxelinux.0»;}

Сохраним изменения и перезапустим службу. По умолчанию служба не выводит результата запуска поэтому я добавил в команду запрос статуса.

sudo systemctl restart isc-dhcp-server; sudo systemctl status isc-dhcp-server --no-pager

DHCP сервер запущен

DHCP сервер запущен

Если служба запустилась, значит сервер поднялся и работает.

На этом настройка серверов завершена. Осталось загрузиться по сети и установить систему.

Установка системы

Включаем компьютер и выбираем сеть первой в порядке загрузки. Компьютер получает IP-адрес и начинается установка системы.

d732db6018db2ef9640fd3cea0247a3d.png

Нажимаем далее до момента выделения места. Здесь выбираем Manual. Будьте внимательны, неверный выбор может стереть весь диск.

Сейчас винда занимает диск целиком. Поэтому нам необходимо этот диск сжать, а потом установить Ubuntu на освободившееся место.

Я выделил 8 гб, но вероятно хватит и меньшего количества

Я выделил 8 гб, но вероятно хватит и меньшего количества

Открываем диск #1 и выбираем resize. Указываем новый размер вместе со словом GB и нажимаем Continue. Затем выбираем свободное место как установочный диск:

Указываем новый размер диска

Указываем новый размер диска

Ну вот и все. Просто прокликиваем установку до конца, т.к. никакие дополнительные пакеты нам не нужны. Установщик перепишет GRUB и система снова будет загружаться.

Заключение

Все закончилось благополучно и ноутбук снова работает. Настройку PXE и остальных серверов сразу захотелось автоматизировать. я захотел сделать плейбук для Ansible, но отказался от этой затеи, потому что узнал о существовании Fog project. Fog project — опенсорсная система, упрощающая установку по сети. Я её не пробовал, но выглядит несложно, а все нужные серверы идут в комплекте.

© Habrahabr.ru