LINUX.ORG.RU
ФорумTalks

Почему ОС всё ещё не загружаются по сети?

 


3

3

Представьте, в ОС или каком-либо компоненте нашли уязвимость, взломали, и одно дело, утекшие данные, а ведь до кучи могут сделать хост частью своего ботнета, например. Вы хватаетесь за голову, что ж теперь, аудит проводить, куда лазили, что делали, или просто переустановить всё, опять же заново настраивать, — сплошной головняк. Восстановление из последнего бэкапа? Как давно он был сделан? Ведь наверняка с тех пор в конфигурацию хоста внесены изменения. Я веду к тому, что всё ещё популярно хранить актуальное состояние ОС в единственном экземпляре в «горячем» виде, так сказать.

А что если, экземпляр вашей ОС хранился бы в «холодном» виде в образе, на сервере, откуда бы загружался на ваш хост при каждом его включении, и подтягивал за собой всю конфигурацию, необходимую для работы. Хост взломали, а вы просто исправили баг в образе который хранится «на холодную» и жмякнули кнопочку reset для перезагрузки, и снова в строю. Это же просто офигенно.

Как раз сейчас я этим и занимаюсь и решил поделиться мыслями. Хочу перевести все свои сервисы на удалённую «бездисковую» загрузку по сети. Чтоб даже домашний ПК-роутер, раздающий интернеты, загружался по сети и подтягивал образ с соответствующей конфигурацией. Для этого нужен только DHCP, tftp-hpa и... grub2, либо syslinux.

Когда компьютер включается, UEFI / BIOS при необнаружении накопителей пытается загрузиться через сеть, это так по-умолчанию, можно тупо принести новый комп из магазина домой, закрытыми глазами его собрать, включить и он загрузится, и станет нодой, частью вашей сети, да... кра-со-та.

UEFI спросит DHCP-сервер, DHCP выдаст IP и скажет, что по такому-то адресу находится загрузчик. UEFI попытается загрузить его по TFTP-протоколу, и в случае успеха, уже сам grub2 покажет красивую менюшку с выбором ОС, — добро пожаловать бездисковую загрузку по сети!

С установкой и запуском tftp-hpa проблем не будет, /usr/sbin/in.tftpd --listen --secure --verbose /var/ftp/tftpboot

Предлагаю всё хранить в /var/ftp/tftpboot, туда же установим загрузчик GRUB2:

# grub-mknetdir --net-directory /var/ftp/tftpboot
Netboot directory for i386-pc created. Configure your DHCP server to point to /var/ftp/tftpboot/boot/grub/i386-pc/core.0
Netboot directory for i386-efi created. Configure your DHCP server to point to /var/ftp/tftpboot/boot/grub/i386-efi/core.efi
Netboot directory for x86_64-efi created. Configure your DHCP server to point to /var/ftp/tftpboot/boot/grub/x86_64-efi/core.efi

Далее DHCP, достаточно настроить чтобы он раздавал IP и говорил по какому адресу находится файл загрузчика, который UEFI будет загружать через TFTP.

# cat /etc/dhcpd.conf
shared-network arpanet {
  interface br0;

  allow booting;
  allow bootp;
  next-server 10.0.0.1;
  filename "boot/grub/i386-pc/core.0";

  subnet 10.0.0.0 netmask 255.0.0.0 {
    option domain-name-servers 8.8.8.8, 8.8.4.4;
    option subnet-mask 255.0.0.0;
    option routers 10.0.0.1;
    range 10.0.0.2 10.0.0.254;
  }
}

Загрузка будет происходить с tftp://${next-server}/${filename}. У меня интерфейс br0 — бридж, в который вхожи все виртуальные машины. Именно br0 присвоен 10.0.0.1. У вас это может быть просто сетевая карта enp1s4po3te5ri7ng9.

Алсо, если у вас реально UEFI, можно добавить проверку, какой загрузчик отдавать системе:

option client-system-architecture-type code 93 = unsigned integer 16;

if option client-system-architecture-type = 00:09 {
  filename "boot/grub/x86_64-efi/core.efi";
}
else {
  filename "boot/grub/i386-pc/core.0";
}

У меня кстати на QEMU с OVMF загрузчик EFI не заработал. Не знаю почему, то ли OVMF кривой, то ли надо тестировать на реальном железе (пока не пробовал).

Ну и вишенкой на торте надо создать обычный grub.cfg vi /var/ftp/tftpboot/boot/grub/grub.cfg:

set default=0
set timeout=60
menuentry "Boot SLAX" {
  linux /boot/os/slax/vmlinuz load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 from=http://10.0.0.1/slax/slax-64bit-9.9.1.iso
  initrd /boot/os/slax/initrfs.img
}
menuentry "Reboot" {
  reboot
}
menuentry "Shutdown" {
  halt
}
menuentry "Continue" {
  exit
}

На этом вся настройка. Для теста я использовал qemu-system-x86_64 -nic tap, который скриптами /etc/qemu-{ifup,ifdown} входил в бридж br0. BIOS спрашивал DHCP, DHCP выдавал IP и сообщал адрес загрузчика, далее BIOS загружал его с TFTP сервера и удачно грузился grub2, а дальше — дело тривиальное. Напихать кучу образов ОС.

Для примера можно использовать SLAX, для этого скачаем ISO-образ дистрибутива, стырим оттуда файлики /slax/boot/{vmlinuz,initrfs.img} и положим к себе в /var/ftp/tftpboot/boos/os/slax/.

Расскажу, как это работает, почему загружается SLAX и почему не загружается Debian / Ubuntu / Anything Else по сети.

Мы включили ПК, по TFTP загрузился grub2 и всё управление сейчас находится у него. Далее, выбирая пунктик меню загрузки SLAX, сам grub2 загружает с TFTP-сервера файлы /vmlinuz и /initrfs.img и передаёт управление уже ядру /vmlinuz. А ядро-то про TFTP сервер ничего не знает! И initrd SLAX'а, и любого другого дистрибутива ничего про TFTP не знает. До того момента, как мы грузимся по сети, мы работаем с TFTP-сервером, grub2 может оттуда загружать все свои модули, шрифты, аниме-картинку-с-понями для фона, но после того, как он передаёт управление ядру — забудьте про TFTP, всё.

В данном примере параметром к ядру указан from=http:// iso-образ SLAX, — да, iso-образ будет скачан с этого ресурса и SLAX будет успешно загружен по сети, нооо, важная деталь — это не параметр ядра, from= сохранится в /proc/cmdline, но ядро не знает что с этим делать, с from= будет работать сам /init скрипт находящийся в initrfs.img. Это чисто фича SLAX, и такой фичи нет у других дистрибутивов.

Как же тогда загрузить Ubuntu Live по сети? Да, grub2 может загрузить ISO образ размером 2гб, но оно вам надо? Ядро не знает про http и ftp (поправьте, если ошибаюсь), но ядро знает про NFS (Network File System) и умеет работать с ней. Таким образом, чтобы загрузить Ubuntu Live, вам надо точно так же извлечь vmlinuz и initrd из iso-образа Ubuntu, а параметром к ядру дописать root=/dev/nfs, таким образом ядро Ubuntu (и любого другого дистрибутива, т.к. это уже фича самого ядра Linux), будет знать, что после того как какой-нибудь скрипт в initrd запросит внешний файл, например, Live-образ системы, — ядро знает, что брать его надо с nfs://10.0.0.1/ubuntu-live — так-то!

Если будут вопросы, постараюсь ответить (хотя скоро спать).

За основу дистрибутива для загрузки по сети я беру любимый CRUX. Вся идея в том, чтобы загружался простенький busybox, подключался к сети (udhcpc), а затем через wget ftp://10.0.0.1/boot/pxelinux.cfg/54:52:00:12:34:56/init.sh && sh init.sh выполнял дальнейшие инструкции для загрузки, которые могут быть вообще любые. Подтягивал любой образ ФС по сети и switch_root в него! Так-то.

★★★★★

Потому что отвалилась сеть, и ты сидишь без компа как дурак.

Deleted ()

просто переустановить всё, опять же заново настраивать, — сплошной головняк

Мне тут чинили рабочий комп, выдали на замену новый, чистенький. В общем, с учётом маленького бэкапа (самым большим там был .emacs, а всего было меньше десяти файлов), процедура переустановки заняла, ну, пару часов может быть.

Правда, у меня не линух.

Что касается серверов, то там вообще докер везде, а все скрипты для создания образа лежат на Github.

Miguel ★★★★★ ()
Ответ на: комментарий от Spoofing

Дома это оверхед. А в организациях регулярно используется очень давно. Я такое настраивал один раз, правда, не для рабочих станций, а для информационных мониторов. Знакомый админ для бугалтерии терминалы делал на тонких клиентах. Обычная вещь.

shell-script ★★★★★ ()

Хуже тонкого клиента. Дисконнект может привести к потере данных

TooPar ()

сам grub2 загружает с TFTP-сервера файлы /vmlinuz и /initrfs.img и передаёт управление уже ядру /vmlinuz

Плохая идея, ибо медленно. Посмотри лучше в сторону iPXE (замена gPXE, который бывший Etherboot)

и почему не загружается Debian / Ubuntu / Anything Else по сети.

WTF? Почему оно у меня инсталляторы Debian/Ubuntu/Centos грузятся даже с домашнего роутера с dnsmasq? :)

Deleted ()
Последнее исправление: Deleted (всего исправлений: 2)

Ты там не NixOS изобретаешь?

вашей ОС хранился бы в «холодном» виде в образе, на сервере, откуда бы загружался на ваш хост при каждом его включении, и подтягивал за собой всю конфигурацию, необходимую для работы

Но что если уязвимость на сервере?

TheAnonymous ★★★★★ ()

Подкину ссылочку: https://netboot.xyz/ - умеет грузить кучу разных инсталляторов по сети.

AEP ★★★★★ ()

Что-то похожее иногда таки применяется. Повсеместно используемые сейчас гигабитные локальные сети, уже позволяют вполне комфортно работать с корнем на NFS или ISCSI. Даже десятка на ISCSI себя приемлемо чувствует. (особенно если на сервере памяти много и сервер настроен хорошо, есть SSD-кеш и.т.д)

Распространения такого большого не получило, это да. Слишком сложно для реализации, сотрудники с беспроводным подключением сосут писос, есть проблемы с OSX, и.т.д.

DawnCaster ★★ ()
Последнее исправление: DawnCaster (всего исправлений: 2)

Ты действительно никогда не слышал о загрузке по сети на бездисковых станциях?

grem ★★★★★ ()
Ответ на: комментарий от Spoofing

потому что вошло :)
Просто на локалхосте не видать, ниче не поделаешь.
Злобные буржуины же такое давно (лет 30?) практикуют в корпо на неайтишных позициях (например в кол центрах).

А ты думаешь откуда такое засилье атомов, селеронов, пентиумов и корИ3?

Jetty ★★★★★ ()

Загрузка по сети для восстановления из бекапа - полезная вещь.

Все остальное - притянуто за уши.

vel ★★★★★ ()

Я веду к тому, что всё ещё популярно хранить актуальное состояние ОС в единственном экземпляре

Зачем? Хранить список установленных пакетов + содержимое /etc

cvs-255 ★★★★★ ()

А что если, экземпляр вашей ОС хранился бы в «холодном» виде в образе, на сервере, откуда бы загружался на ваш хост при каждом его включении, и подтягивал за собой всю конфигурацию, необходимую для работы. Хост взломали, а вы просто исправили баг в образе который хранится «на холодную» и жмякнули кнопочку reset для перезагрузки, и снова в строю. Это же просто офигенно.

Где-то 0.33 от NixOS при сходном уровне практичности.

t184256 ★★★★★ ()
Ответ на: комментарий от Deleted

инсталляторы — это другое, они вшиты в initrd образ, и больше ничего в них нету. я имел ввиду именно что live-окружения этих дистрибутивов.

Spoofing ★★★★★ ()
Ответ на: комментарий от Spoofing

Так а в чём вопрос то? nfs root howto хз сколько лет. Я ещё в 2001 году поднимал бездисковые станции с помощью etherboot (вшивал его в биос stb с помощью cbrom)

Deleted ()
Ответ на: комментарий от Deleted

А я в 2001 году в третий класс пошёл. :(

В этом треде я рассказываю сколько всего прошло мимо меня, навёрстываю и делюсь со всеми.

Spoofing ★★★★★ ()
Ответ на: комментарий от Spoofing

В этом треде я рассказываю сколько всего прошло мимо меня, навёрстываю

Аа, я неправильно понял, сорри.

Всё правильно делаешь.

Почитай https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt и https://www.tldp.org/HOWTO/text/NFS-Root

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)

Я не читал твою простыню, но знаю что 80% запросов ОС случайные 4К, на таких LAN сосет. Был бы FC, был бы другой разговор. Учи матчасть.

Lordwind ★★★★★ ()

Что у тебя по сети не загружается? Я кучу linuxов грузил в свое время на кластерах по tftp ещё в 2000 году..

vasya_pupkin ★★★★★ ()
Последнее исправление: vasya_pupkin (всего исправлений: 1)

а вот я в своё время о-о-о
а вот я в своё время у-у-у
а вот я в своё время о-о-о
а вот я в своё время у-у-у

... //_-

Spoofing ★★★★★ ()
Ответ на: комментарий от vel

дык, можно с флэшки загрузиться. и быстрее, и безопаснее.

тащемта, бэкапы тоже никто не отменял. и рейды, если очень надо бдить за сохранностью данных.

Iron_Bug ★★★★★ ()
Ответ на: комментарий от vel

а ещё, бэкап ничего не стоит, если вы не сможете его восстановить. а чтобы его восстановить, надо это практиковать время от времени. как военные на учениях. и мы плавно переходим к тому, что идеально восстанавливать бэкап при каждой загрузке. загрузка по сети — наше всё.

Spoofing ★★★★★ ()
Ответ на: комментарий от Spoofing

Я высказал свое IMHO.

Раньше, во времена ms-dos , загрузка по сети (привет из 90-х от нетвари 3.х) была действительно рулезом, т. к. размер софта был смешной и на 10Мбит/с оно шустро грузилось.

А сейчас эти гигабайты с мульёном файлов распаковывать каждый раз при разрузке долго.

Вот сделать дистрибутив у которого сам софт и все настройки были бы разделены было бы полезно: софт в squashfs, настройки через aufs/unionfs. Софт восстанавливать приходится не часто, а вот настройки и данные можно брать с сети или регулярно бекапить на сеть. Учти, что локальный и исправный ssd-шник уделывает сеть по скорости в любом случае.

vel ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.