LINUX.ORG.RU

Помогите написать модуль для перезагрузки хоста

 


0

1

Друзья, я совсем не знаю C, и уж тем более ничего не знаю про линукс, но очень надо такую штуку, которая бы просто перезагружала хост спустя N времени после загрузки.

Все хосты у нас загружаются по сети (PXE), и считается, что система остаётся без человеко-вмешательства, но сюда могут вмешаться китайские ботнеты. Поскольку система загружается целиком в RAM, то простой Reset как всегда спасёт отца демократии. Система загружается с хоста DMZ (demilitarized zone) и возвращается к «заводским настройкам». Да, с нашей стороны мы обеспечиваем полную работоспособность системы и служб, что отключение питания (читай, Reset) это не форс-мажор, а обычное рабочее состояние. И было решено сделать, чтобы система сама перезагружала себя каждые N времени, но доверить скрипту эту работу нельзя, в случае вмешательства «хакера», скрипту будет kill -9, а вот с модулем ядра посложнее. А когда уже «свой» человек вмешается в работу системы, он при необходимости будет собственноручно модуль выгружать и система будет работать без перезагрузок.

Знатоки ядра, какими двумя функциями можно запустить sleep 31337 && reboot? Корректное завершение системы ctrl_alt_del(); не требуется (она в памяти, что ей там завершать?), поэтому kernel_restart(); отлично подходит.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Spoofing");
MODULE_DESCRIPTION("/xyzzy");
MODULE_VERSION("1.0");

static int __init xyzzy_init(void) {
  mdelay(31337000);
  kernel_restart(NULL);
  printk(KERN_INFO "Nothing happens.\n");
  return 0;
}

static void __exit xyzzy_exit(void) {
  printk(KERN_INFO "Human happened.\n");
}

module_init(xyzzy_init);
module_exit(xyzzy_exit);

Сперва я конечно хотел сделать это на Bash на уровне initramfs, но как уже было оговорено, это дохлый номер.

daemon_xyzzy() {
  (
    sleep 31337
    echo "Nothing happens."
    reboot
  ) &

  echo $! > /xyzzy.pid
}

switch_initramfs() {
  local FS=/fs
  if [ -d $FS ]; then
    mount -t tmpfs -o size=100% inittmpfs $FS
    cp -a /???* $FS
    cd $FS
    # FIX: Yes I know about /proc /sys /dev fails.
    exec switch_root . /init 2>/dev/null
  fi
}

P.S. модуль называется xyzzy потому что есть такая недокументированная команда в проприетарном клиенте mIRC, которая делает echo Nothing happens. и больше ничего. Как-бы, ничего хорошего, и систему оставленную без присмотра надо перезагружать, наверняка её уже похакали. Вот.

Заранее благодарю за помощь и советы.

★★★★★

доверить скрипту эту работу нельзя, в случае вмешательства «хакера», скрипту будет kill -9

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

Что мешает «хакеру» выгрузить модуль ядра в этом случае?

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

А ещё, ему ничего не помешает сделать kexec. Ваша правда. Надо думать над хардварным вачдогом. :(

Но всё равно такой модуль нужен хотя бы для случаев, когда система завтыкала и не сможет загрузиться. Мало-ли. И к ней нет доступа. Ядро должно перезагружать хост и попытаться снова загрузиться по сети.

Spoofing ★★★★★
() автор топика
Последнее исправление: Spoofing (всего исправлений: 1)
Ответ на: комментарий от Spoofing

Надо думать над хардварным вачдогом. :(

Подключить хост через реле и каким-нибудь примитивным контроллером тупо вырубать на 1 секунду питание, и потом опять врубать.

SZT ★★★★★
()
struct timer_list reboot_timer;

static void reboot_func(struct timer_list *t)
{
        orderly_reboot();
}

xxx_init()
{
        timer_setup(&reboot_timer, reboot_func, 0);
        mod_timer(&reboot_timer, TIMEOT_IN_JIFFIES);
}

xxx_exit()
{
        del_timer_sync(&reboot_timer);
}

MODULE_LICENSE("GPL");
ttnl ★★★★★
()

Если мы не можем доверять софту...

То на ум приходит программно-аппаратное решение. Типа, как здесь – https://forum.arduino.cc/index.php?PHPSESSID=9uas602mrdnrm5ujlssiok4e04&topic=340352.15

Ардуинка, транзистор, пара резисторов по килоому… Дёрнуть питание на +5В хватит. Ну а рулить можно ардуинкой и удалённо.

Moisha_Liberman ★★
()

Для этого вообще не надо ничего писать. Есть anacron.

targitaj ★★★★★
()
Ответ на: Если мы не можем доверять софту... от Moisha_Liberman

Ардуинка, транзистор, пара резисторов по килоому… Дёрнуть питание на +5В хватит. Ну а рулить можно ардуинкой и удалённо.

Во времена майнинга соорудил такое на arduino uno.

Управление шло через линукс с minicom, к которому arduino было подключено по USB. Плюс несколько транзисторов, подключенных к power кнопкам ферм. В итоге видел физическое состояние ферм (вкл/выкл), и мог включать и выключать их из дома или с телефона по ssh.

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

Ну да.

Можно и для майнинга и для любого управления удалёнными хостами по питалову. Не вопрос.

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

Да че-то тс каких-то хакеров увидел там, где им ловить нечего. Притом таким тупым способом борется как перезагрузка компа по таймеру, фееричная защита. Если у него вся система в RAM, то пусть инфу на hdd всю сделает «только на чтение», и только по паролю/ключу доступ на отдельный раздел для r/w или объектное хранилище типа webdev/s3

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