Чиним GRUB без флешки
Кажется, у каждого есть старенький ноутбук, который давно служит лишь для просмотра фильмов. У меня такой тоже есть — подключён по HDMI к телевизору и почти забыт. Однажды ради эксперимента я установил на него Linux, а через пару месяцев, когда понадобилось место, решил просто удалить линуксовый раздел. Затем я перезагрузил ноутбук и винда, конечно же, не загрузилась. После установки линукса, загрузчик GRUB переписал MBR, и теперь система не знала, откуда грузиться.
Что делать? Казалось бы, всё просто: берём флешку, загружаемся с Live CD, восстанавливаем MBR. Но флешки у меня не было. Можно было бы флешку одолжить, но хотелось решить проблему здесь и сейчас. Размышляя об этом, я залез в биос и обнаружил, что ноутбук поддерживает загрузку по сети через PXE…
Дилемма
Так как у меня на диске 2 операционных системы, я могу выбрать один из 2 вариантов:
Первый вариант показался мне муторным и неочевидным, а вот поставить пару сервисов на линукс — наоборот. Поэтому я выбрал второй вариант и образ Ubuntu server netboot, который весит всего 64 МБ. У меня на основном ноутбуке стоит минт в дуалбуте, так что я все настраивал на нем.
Установка PXE
Загрузка по сети работает через PXE. Установка состоит глобально из 3 шагов:
Настройка интерфейса
Настройка tftp и DHCP-серверов
Загрузка по сети
Настройка интерфейса
Для загрузки через PXE нам нужно, чтобы компьютеры были в одной сети. Выяснять, какие сетевые карты поддерживают загрузку по WiFi я не стал, поэтому просто соединил компьютеры кабелем и создал новый интерфейс.
На Linux Mint 21 настройка сети должна выполняться через Network manager. Выведем список всех интерфейсов:
nmcli device status
У меня 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 сервер запущен
Если служба запустилась, значит сервер поднялся и работает.
На этом настройка серверов завершена. Осталось загрузиться по сети и установить систему.
Установка системы
Включаем компьютер и выбираем сеть первой в порядке загрузки. Компьютер получает IP-адрес и начинается установка системы.
Нажимаем далее до момента выделения места. Здесь выбираем Manual
. Будьте внимательны, неверный выбор может стереть весь диск.
Сейчас винда занимает диск целиком. Поэтому нам необходимо этот диск сжать, а потом установить Ubuntu на освободившееся место.
Я выделил 8 гб, но вероятно хватит и меньшего количества
Открываем диск #1 и выбираем resize
. Указываем новый размер вместе со словом GB
и нажимаем Continue
. Затем выбираем свободное место как установочный диск:
Указываем новый размер диска
Ну вот и все. Просто прокликиваем установку до конца, т.к. никакие дополнительные пакеты нам не нужны. Установщик перепишет GRUB и система снова будет загружаться.
Заключение
Все закончилось благополучно и ноутбук снова работает. Настройку PXE и остальных серверов сразу захотелось автоматизировать. я захотел сделать плейбук для Ansible, но отказался от этой затеи, потому что узнал о существовании Fog project. Fog project — опенсорсная система, упрощающая установку по сети. Я её не пробовал, но выглядит несложно, а все нужные серверы идут в комплекте.