Вот и снова я. Перед выходными давай поговорим про магические числа в процессе перезагрузки 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 извлекает данные о файле как раз из магических чисел и заголовков.



Ладно, всем хороших предстоящих выходных и берегите себя! Кстати про суперблоки отдельно попозже разбор сделаю.



tags: #linux



💩 @bashdays