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

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

Дилемма

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

  • Загрузить установку Windows и настроить MBR через diskpart

  • Установить линукс через PXE с новым GRUB

Первый вариант показался мне муторным и неочевидным, а вот поставить пару сервисов на линукс — наоборот. Поэтому я выбрал второй вариант и образ 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-адрес и начинается установка системы.

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

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

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

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

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

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

Заключение

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

Комментарии (11)


  1. QuarkDoe
    12.11.2024 06:07

    Героическое преодоление препятствий созданных своими же руками.


    1. geher
      12.11.2024 06:07

      Зато в результате имеем простенькое описание настройки для загрузки через PXE.


  1. NutsUnderline
    12.11.2024 06:07

    велосипед, но довольно красивый. не очень понятно зачем ставить пакеты apache2 syslinux

    dhcp как бы понятно, но он ведь в роутере есть, только тогда бы уже к нему пришлось подключаться. более того, на роутере и tftp иногда есть.

    появилась мысль а не сделать ли мне что то загрузочное на роутере...


  1. hedger
    12.11.2024 06:07

    Очень сложно, задачу "бутнуть железку по сети" прекрасно решает pixiecore: https://github.com/danderson/netboot/tree/main/pixiecore

    Буквально скачать и запустить одной командой один бинарник. Универсальный к тому же.


    1. Avonae Автор
      12.11.2024 06:07

      ну это как раз тот случай, что про эту утилиту я не знал и нагуглить не смог)


  1. JoshMil
    12.11.2024 06:07

    Разве у граб основная часть не в мбр? Нажимаешь е и говоришь с чего дальше загрузится.


  1. Corrind
    12.11.2024 06:07

    Кажется загрузить винду с флешки было бы быстрее...


    1. Avonae Автор
      12.11.2024 06:07

      я одобрил твой комментарий чтобы его все видели


  1. mgairat
    12.11.2024 06:07

    Автор лукавит: все причины, заставившие грузиться с pxe, минуя флешку с livecd высосаны из пальца (что готовой флешки нет, поверю, что нет флешки вообще - вряд ли, а сделать livecd при наличии любой флешки и другого компа - процесс менее сложный, чем описан здесь). Просто челу захотелось поиграться с pxe на принцип, потому что интересно. У него получилось и он не поленился поделиться рабочим алгоритмом. Респект.


    1. Avonae Автор
      12.11.2024 06:07

      тем не менее флешки у меня и правда нет. Ни готовой, ни пустой.


  1. werter_l
    12.11.2024 06:07

    Спасибо. Есть еще iventoy от автора ventoy. Позволяет с .iso прямо по сети загружаться.