LINUXTALKS.CO

Best practices при загрузке ОС с внешнего накопителя

L


0

1

К сожалению в идеальном мире этого треда не должно было быть, но очередная котовасия с флешками, которые то видно, то не видно от сервера к серверу (и я не знаю почему, настройки биоса одинаковые), которые любят отваливаться сами по себе, переподключаться и вместо /dev/sda становятся /dev/sdb, а потом отваливаются ещё раз и снова становятся /dev/sda. При этом со своими задачами флешка справляется, данные не портит, работает быстро, ну нельзя её просто так взять и выкинуть.

Сейчас я разрабатываю систему загрузки которую можно коротко назвать двумя словами External Init. Суть заключается в том, что, у нас загружается vmlinuz+initramfs, хоть с флешки, хоть по сети, небольшой initramfs размером всего 1,5мб на основе busybox.

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

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

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

Так гараздо удобнее.

А теперь про завтыки. Случаи, когда флешку вообще не видно в системе, при том, СЕРВЕР ТОЛЬКО ЧТО С ЭТОЙ ЖЕ ФЛЕШКИ ЗАГРУЗИЛ vmlinuz+initrd, я вообще в шоке и хз что происходит. Разумеется, mdev -s выполнил чтобы создались все /dev, а флешки всё равно нету.

Далее, загрузчик смотрит флешку и допустим он её находит, выполняет sh /media/inventory/init

И тут необходимо реализовать умную «вставьте диск» систему. Наверное нельзя просто так взять и скопировать весь инвентарь с флешки в память, памяти может не хватить, ситуации у всех разные. Поэтому процесс установки пакетов происходит с самой флешки, и тут в любой момент что-то может пойти не так, вплоть до того, что, флешку юзер захочет вытащить. В таком случае init должен сообразить, что флешка пропала, очистить всё что успело установиться, ну сделать простой umount /newroot и вернуться к этапу мониторинга «вставьте диск».

Так же необходимо рассмотреть случаи, когда файл с флешки может быть побит, поэтому думаю перед установкой пакета предварительно его копировать в ram, один пакет, сравнивать хэш-сумму (sha256 к примеру) файла и только если он валиден, тогда пакет устанавливать.

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

А какой вы видите подобную систему загрузки с внешнего устройства в RAM? Может у вас есть идеи, хотелки для реализации?

★★★★★★