Давай поговорим про магические числа в процессе перезагрузки Linux.
Тему эту обычно все стороной обходят, да и большинство преподов тебе никогда не расскажут что такое Magic Numbers.
Они про эти числа либо никогда не слышали, либо слышали, но не соизволили с ней ознакомиться. Поехали копаться в кишочках, как мы и любим.
Когда ты запускаешь reboot в linux, происходит масса всего интересного. Но самый главный интерес в «магических числах».
Короче «магические числа» это такая херабора из последовательности байтов, расположенных в фиксированном файле либо структуре данных. Нужны они для идентификации типа файла либо структуры. Для каждого типа файла магические числа уникальны.
Например, для ELF файлов, магические числа будут такими:
ELF Magic:
Код:
7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Если система видит последовательность этих байтов, она по умолчанию делает вывод, что этот файл является ELF по первым 4м байтам. 45=E, 4c=L, 46=F, перед ними стоит значение 7f.
Посмотреть эту сигнатуру можно командой readelf:
Окей, с этим разобрались. Ну дак каким боком эти магические числа вообще связаны с командой reboot? А самым прямым!
С помощью этих чисел система определяет повреждения файловой системы. На случай если ты после ребута не сможешь загрузить сервак или свою пекарню. То есть, предостерегает и умоляет пофиксить проблему, а потом уже перезагружаться.
Во время процесса перезагрузки или завершения работы, система должна убедиться, что все данные записаны на диск и файловая система находится в согласованном состоянии.
Работает это проверка путем согласованности суперблока файловой системы.
Суперблок это структура данных, которая содержит информацию о файловой системе (размер, расположение блоков данных и журнала файловой системы).
Проверяя магическое число в суперблоке, система определяет, соответствует ли файловая система ожидаемому формату. Если магическое число похерено, значит жопа и пиши пропало, коруптед, нидхелп.
Отсюда и растут ноги, когда система предлагает запустить тебе fsck.
Вот и при reboot система все это проверяет. Кусок исходника kernel/reboot.c:
Код:
/* We only trust the superuser with rebooting the system. */
if (!capable(CAP_SYS_BOOT))
return -EPERM;
/* For safety, we require "magic" arguments. */
if (magic1 != LINUX_REBOOT_MAGIC1 ||
(magic2 != LINUX_REBOOT_MAGIC2 &&
magic2 != LINUX_REBOOT_MAGIC2A &&
magic2 != LINUX_REBOOT_MAGIC2B &&
magic2 != LINUX_REBOOT_MAGIC2C))
return -EINVAL;
Как видим magic1 и imagic2 присваиваются магические числа. А сами эти магические числа зашиты в файле reboot.h. При НЕ выполнении данных условий будет возвращена ошибка.
Код:
/* * Magic values required to use _reboot() system call. */
#define LINUX_REBOOT_MAGIC1 0xfee1dead
#define LINUX_REBOOT_MAGIC2 672274793
#define LINUX_REBOOT_MAGIC2A 85072278
#define LINUX_REBOOT_MAGIC2B 369367448
#define LINUX_REBOOT_MAGIC2C 537993216
Первая строчка 0xfee1dead звучит забавно - чувствую себя дохлым! Именно эта константа и отвечает за перезагрузку системы.
Остальные числа:
Код:
672274793 зашифрован ДР Линуса Торвальдса
85072278 ДР дочки Линус Патрисия Миранда
369367448 ДР дочки Линус Даниел Юланда
537993216 ДР дочки Линус Целеста Аманда
Нормальная пасхалочка! Чтобы расшифровать эти числа и получить человечные даты ДР можно воспользоваться командой:
Код:
printf -v d '%x' 672274793 ; echo "Linus ${d:0:2}-${d:2:2}-${d:4}"
Вот такие пироги под капотом этого нашего Linux.
Кстати команда file извлекает данные о файле как раз из магических чисел и заголовков.