Пост — это благодарность сообществу, что оно делится с нами полезной информацией, и мы в ответ делимся своей.
Скорее — это зарисовки‑на‑полях или направление в действиях, но никак не хау‑ту‑шка (и уж ТОЧНО НЕ реклама нашей ОС, более того, полагаю, что бесплатность этого релиза сродни бесплатной Шляпы — этакий бесконечный бета‑тест).
Пост мог появиться и раньше, но по мере продвижения в теме всплывали новые заминки.
Подача материала — не разъясняющая, а скорее простое тупое перечисление каких‑то моментов. У читающих предполагается достаточно высокий уровень знаний о нескольких
подсистемах Linux (особенно dracut).
Много времени уделять писательству не могу, поэтому сумбур — вот как он есть...
Итак, Simply Linux 10.1!
Мой интерес к SL10.1 возник в начале осени, когда я узнал, что она бесплатна для коммерческого применения, и обусловлен, в основном, именно этим важным моментом (ибо мой фаворит — это Xubuntu). Очень облегчающим (скорее психологически) моментом был тот факт, что эта бесплатная редакция основана на этом же "крысином" окружении.
Теперь о наболевшем (и отнюдь не в техническом плане!) или почему конкретно я сразу же обратил свой взор на SL (в марте-2022 упустил объявления из виду, т.к. я на российские дистрибутивы не смотрел совсем).
Линукс (или, во всяком случае, огромный процент распространенных дистрибутивов)
бесплатен, но это совершенно не спасет Вас от людей, которые могут захотеть прост�� из вредности поставить подножку Вашему маленькому или средненькому бизнесу со словами: «Да, да, да, все хорошо, но покажите нам лицензионное соглашение... Ой, а мы ничего не понимаем по‑английски... А‑а-а‑а, а почему Вы нам показываете какой‑то иностранный сайт...»
Причем, наверняка даже зная, что оно почти всЁ действительно — СПО, могут шантажировать забором оргтехники на, якобы, экспертизу. И, еще три года назад, даже бухгалтер, ни разу не юрист, первое, что спросил про Ubuntu: «а где тут у них по‑русски написано, что это всЁ нам забесплатно...»
Поэтому лицензионное соглашение на SL10.1 я распечатал сразу же, в деревянную рамочку его вставил (и да, оно на русском языке, и на сайте тоже русском).
Подпункта у поста три:
PXE-сервер
Webmin
Pxe-diskless-клиент (вернее - то, что МОЖЕТ помочь его реализации в этом варианте дистрибутива)
Так получилось, что последний подпункт был первым хронологически.
PXE-сервер (или - да здравствует LTSP)
LTSP-сервер был в версии SL8 и ранее (я так сужу, потому что попытка добавить за-ради-теста репозитарий p8 вместо p10 приводит к появлению возможности скачки старых версий пакетов). В Ubuntu LTSP делает при начальной настройке почти ВСЁ за нас. Саму же его возможность создания загрузочного (для-по-сети) NBD-образа я никогда не использовал, а только задействовал его загрузочный pxe-модуль. Поэтому я постарался просто выявить и повторить действия LTSP при этой настройке.
а) Устанавливаете dnsmasq и nfs-server
б) настраиваете /etc/exports
в) настраиваете dhcp-проксирование (ну... или весь dhcp)
г) для SL - в /etc/sysconfig - rpcbind и dnsmasq (для меня бОльшая часть возни была связана именно с этим пунктом - я НЕ знал, что это место существует и влияет на функционирование)
д) копируете squash/NBD архивы в nfs
е) создаете/копируете tftp-структуру
ж) настраиваете файрвол
(За последней строчкой тоже скрыта проблема — почти все хау‑ту в интернете
предлагают для nfs под firewalld: firewall‑cmd ‑add‑service=mountd что на SL почему‑то не срабатывало. Сложилось ощущение, что часть таких выкладывальщиков даже не пытаются проверить в работе свои подсказки сами. У нескольких мелькал абсолютно разный набор портов выше 30 000. Это показало, что там сервис открывает динамический набор портов.
В итоге написал одностроковый скрипт, который выбирает все прослушиваемые порты выше 30000 у rpc.mountd и открывает их в firewalld).
Webmin (да, попса, да не-хардкор)
Вебмин в(для) SL, в отличие от LTSP, не тащили никогда, в паре мест я видел (и допускаю, правдивые) отговорки типа: это дырявая‑перловая‑каша‑под‑рутом или есть альтератор‑и-поэтому‑это‑Вам‑не‑надо.
Для себя предполагаю только 1 сценарий (и он единственный с самого начала
использования этого пакета): добавление‑удаление в веб‑интерфейсе сертификатов OpenVPN‑server (кстати, модуля OpenVPN в официальной поставке Webmin нет года уже как 2 или 3, да и тот был — коряв по самое...).
Поэтому можно и так (ну, относительно безопасно):
logon-by-ssh
systemctl start webmin
to-do-something-in-browser (very-rapidly)
systemctl stop webmin
log-off
Итак, минуя стадию рассказа об экспериментах:
а) ставите в систему необходимые для Веб-мина perl-пакеты, perl-Net-SSLeya, perl-DBM
б) берете rpm-пакет Webmin 2.000 и при помощи mc разархивируете его в /usr/libexec/webmin (и один PAM-модуль кидаете в нужное место в etc) - структура прекрасно видна в пакете-архиве.
в) запускаете (в этом вся прелесть версии 2.000) /usr/libexec/webmin/setup.sh, отвечаете на подсказки-вопросы (я вот сказал, что у меня Ubuntu-версия-20, при этом руководствовался тем фактом, что в Ubuntu так же, как и в SL10, root неактивен, и потому Веб-мин спрашивает нас пару логин-пароль для создания внутреннего пользователя), скрипт сам все создает и активирует. (https://help.ubuntu.com/community/WebminWithoutARootAccount)
г) открываете в вашем файрволе порт 10000.
Вуаля... (не забудьте стартануть сервис, если надо).
О возможности "типичных" реализаций бездискового клиента
Вообще, это невероятно благодатная, бездонная тема для Linux. И именно поэтому буду относительно краток.
В SL изнутри применяется система изготовления образов начальной загрузки make-initrd, разработанная Алексеем Гладковым.
С ней я не знакомился, т.к. использовал , в основном, mkinitramfs (родное для Ubuntu), а не-в-основном :))) - dracut
На мою (или вашу — как посмотреть) удачу, dracut также присутствует в репозитарии SL.
(Кстати — работу make‑initrd, судя по докам, тестируют в Alt, Ubuntu, Fedora).
Здесь я просто заострю внимание на двух моментах, которые вызвали серьезные заминки у меня (и просто скажу, как я скорее обогнул, а не решил эти вопросы).
Мой вариант бездисковой системы — это симбиоз этих двух вариантов:
(https://habr.com/ru/post/253 759/) и (https://habr.com/ru/post/164 147/).
Пост 253 759 — это, честно говоря, вариация какой‑то очень давнишней англоязычной статьи.
И я не удивлюсь, если есть еще более старые варианты намека‑на‑реализацию (а не реализации).
Костяк же моего варианта такой (я навешиваю на виртуальное дерево в нужных точках squash‑образы, в типовой реализации на образ‑корень навешиваются образ модулей и образ прошивок, но общее количество таких образов, как бы развешанных по дереву, лимитировано только объемом ОЗУ):
...
let "imgCount= imgCount + 1"
mkdir -p ${NEWROOT}/mnt/ # rootmnt --> /mnt ---> /lib${i}cow
mkdir -p ${NEWROOT}/mnt/lib${imgCount}cow # | |
# | +---------->/up
# | +---------->/work
mkdir -p ${NEWROOT}/mnt/lib${imgCount}cow1 # +-------> /lib${i}cow1
#
# but ...lib${imgCount}cow/up - must be in tmpfs!!! - so DO IT AFTER mount!!!!
mount -t tmpfs -o size=100% none ${NEWROOT}/mnt/lib${imgCount}cow
mkdir -p ${NEWROOT}/mnt/lib${imgCount}cow/up
mkdir -p ${NEWROOT}/mnt/lib${imgCount}cow/work
mount ${realFullFileName} ${NEWROOT}/mnt/lib${imgCount}cow1 -t squashfs -o loop
mount -t overlay -o \
lowerdir=${NEWROOT}/mnt/lib${imgCount}cow1,\
upperdir=${NEWROOT}/mnt/lib${imgCount}cow/up,\
workdir=${NEWROOT}/mnt/lib${imgCount}cow/work overlay ${NEWROOT}${pathName}
...(Это относительно гибкий и модульный вариант, позволяет реализовывать разные варианты загрузки бездисковый станций. Для примера — можно одни станции грузить с минималкой kernel‑modules‑x.xx.xx, а другие — уже с добавлением kernel‑extra‑modules‑x.xx.xx. Ну и т. д. и т. п.)
Итак, возвращаемся к нашей теме - к проблемкам. Обе заминки оказались связаны с
моментами инициализации сети.
а) busybox
Оказывается, в SL он лежит по адресу /lib/initrd/bin/busybox (там его берет их система образов нач-загрузки, а больше он там ни для чего не нужен, судя по всему).
Далее, их утилита arping этом дистрибутиве (а может, именно эта конкретная версия), инкапсулированная в initrd - на этапе загрузки мешала нормально получать адрес по dhcp.
Поэтому в module-setup.sh нашего дракут-аддона мы arping игнорируем, делает сим-линк на busybox (проверив, если это реализация busybox-a c arping):
for _i in $($_busybox --list); do
if [[ ${_i} == arping ]] ; then
_path=$(find_binary "arping")
[ -n "$_path" ] && ln_r /usr/bin/busybox "$_path"
fi
doneЗа-ради-смеха: на этапе тестов‑перебора я поначалу (еще не сообразив, где что) брал busybox из Ubuntu-22 и переименовывал в arping (тоже срабатывало).
б) инициализация сети
Несмотря на то, что основной (почти весь) кусок моего кода работает в хуке pre‑mount (можно и в mount)(и в Fedora при тестах вел себя нормально), в варианте initrd, сгенерированном системой dracut в SL, на этом этапе загрузки почему‑то сеть еще не успевала подняться и nfs‑root‑каталог не был виден/доступен.
Сразу же после вставки «sleep 20» всЁ вроде как заработало. Некрасиво...
Был вставлен цикл ожидания адреса IP на интерфейсе загрузки (интерфейс находим через сопоставление адаптеров с мак‑адресом, взятым в kernel‑cmdline‑параметре BOOTIF).
Это, собственно, само тело цикла ожидания:
ifName=$(ip -o l | grep ${macAdr} | cut -f2 -d" " | sed "s/://")
if [ -n "${ifName}" ] ; then
Ip4Adr=$(ip -4 -o a s ${ifName} | awk "{print \$4}" | cut -f1 -d"/")
[ -n "${Ip4Adr}" ] && break || ulog_msg "\n${macAdr} ${ifName} Waiting for IP4...\n"
else
ulog_msg "\nWaiting for network interface...\n"
fi
sleep 1Все равно, выглядит это УРОДЛИВО, но реальный период ожидания у меня от 1 до 3 секунд, и длинной паузы теперь нет (допускаю, что с несколькими адаптерами в системе финт может не заработать).
Так или иначе, необходимые нам 2 с половиной сервиса были плавно перетянуты под крыло отечественного дистрибутива (благо, каталоги/файлы с конфигурациями сервисов скопировались без изменений).
На этом всЁ (Ваш продолжающий вести тщательные наблюдения Кэп).