Друзья, я совсем не знаю 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.
и больше ничего. Как-бы, ничего хорошего, и систему оставленную без присмотра надо перезагружать, наверняка её уже похакали. Вот.
Заранее благодарю за помощь и советы.