25.11.2023 12:59
Давай поговорим про магические числа в процессе перезагрузки 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:

Код:
readelf -h /bin/at
Окей, с этим разобрались. Ну дак каким боком эти магические числа вообще связаны с командой 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 извлекает данные о файле как раз из магических чисел и заголовков.
Часовой пояс GMT +3, время: 11:46.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.