Инициализация и механизм кэширования в ядре Linux
Я получил обновления для своей операционной системы Linux на основе Debian, и между ними произошел сбой системы. Он автоматически перезагружался, после этого все, что я мог видеть, это черный экран с интерфейсом командной строки и написанным словом «initramfs».
Выходите из меню загрузки initramfs. Я загрузил live CD с ubuntu (той же версии) и открыл терминал, не устанавливая ОС. Затем я выполнил несколько следующих команд:
# чтобы узнать диск раздела в # какая установлена сбойная ОС. sudo fdisk -l | grep Linux | grep -Ev 'своп' # чтобы вывести список всех суперблоков в разделе. sudo dumpe2fs / dev / sda2 | grep суперблок # эта команда восстановит ОС # альтернативный суперблок и флаг 'y' # используется, чтобы позволить терминалу исправить. sudo fsck -b 32768 / dev / sda2 -y
Исправление без использования live CD
Вы также можете перейти в режим восстановления, но он не сможет просканировать весь раздел, на котором установлена ваша ОС, и отобразит меню загрузки initramsfs. Затем вы можете дать команду:
fsck / dev / partition name где ваша OS установлена -y
Это было исправлено, но эта ошибка осталась с вопросом - что такое initramfs?
Механизм
В ОЗУ некоторое пространство зарезервировано для системных файлов, а также для управления кешами. Ramfs - одна из файловых систем, которая экспортирует механизмы дискового кэширования Linux как файловую систему на основе RAM с динамически изменяемым размером. Эти типы механизмов используются для ускорения доступа к каталогам. Когда диск смонтирован, кэшированные файлы также будут смонтированы как системные файлы. Преимущество ramfs в том, что он требует очень меньшего количества памяти на диске. С обычными механизмами кэшированные файлы удаляются, когда виртуальная машина пытается перераспределить память, но с ramfs память не может быть освобождена виртуальной машиной.
Rootfs
Rootfs - это особый экземпляр ramfs. Вы не можете размонтировать rootfs, потому что у вас есть обработчики сигналов, работающие параллельно, которые гарантируют, что система не будет остановлена. Он предназначен для проверки и обработки пустого списка, тогда ядру проще просто убедиться, что определенные списки не могут стать пустыми.
Ядра Linux содержат сжатый gzip-архив cpio (это обычная утилита для архивирования файлов), который распаковывается в rootfs при загрузке ядра. После извлечения ядро проверяет, содержит ли rootfs файл «init», и если да, оно выполняет его как PID (это уникальный номер, который идентифицирует каждый из запущенных процессов в операционной системе).
Теперь есть две возможности,
Случай №1: Если обнаружен, этот процесс инициализации отвечает за доведение системы до конца, включая обнаружение и установку настоящего корневого устройства (если таковое имеется).
Случай № 2: Если rootfs не содержит программы инициализации после извлечения в него встроенного архива cpio, ядро перейдет к более старому коду, чтобы найти и смонтировать корневой раздел, а затем выполнить некоторый вариант / sbin / init вне что.
Связь с cpio
Параметр конфигурации CONFIG_INITRAMFS_SOURCE (в General Setup в menuconfig и живущий в usr / Kconfig) может использоваться для указания источника архива initramfs, который будет автоматически включен в полученный двоичный файл. Эта опция может указывать на существующий сжатый gzip-архив cpio, каталог, содержащий файлы для архивации, или спецификацию текстового файла. Одним из преимуществ файла конфигурации является то, что для установки разрешений или создания узлов устройств в новом архиве не требуется root-доступ.
Ядро не зависит от внешних инструментов cpio. Если вы укажете каталог вместо файла конфигурации, инфраструктура сборки ядра создаст файл конфигурации из этого каталога (usr / Makefile вызывает scripts / gen_initramfs_list.sh) и перейдет к упаковке этого каталога, используя файл конфигурации (передавая его в usr / gen_init_cpio, который создается из usr / gen_init_cpio.c). Код создания cpio ядра во время сборки полностью самодостаточен, и экстрактор времени загрузки ядра также самодостаточен.
Инструктируем Initramfs
Создайте файл hello.c с кодом:
#include <unistd.h> #include <stdio.h> int main( int argc, char *argv[]) { printf ( "Hello world!
" ); sleep(999999999); } |
Теперь дайте команды:
gcc -static hello.c -o init echo init | cpio -o -H newc | gzip> test.cpio.gz qemu -kernel / boot / vmlinuz -initrd test.cpio.gz / dev / ноль
При отладке обычной корневой файловой системы приятно иметь возможность загружаться с «init = / bin / sh». Эквивалент initramfs - «rdinit = / bin / sh».
Мое примечание: я был полностью раздражен, потому что собирался потерять все данные, но это не тот случай, когда я понимал, зачем это нужно. Культура открытого исходного кода дает вам свободу учиться чему угодно, и тогда вы обязаны помочь в ее развитии, а не игнорировать это. Вклады с открытым исходным кодом - лучший способ сделать для общества, даже если вы не выделены, получать удовольствие, когда ваш код или вклад приносят пользу нехватке людей.
Эта статья предоставлена Кришнаном Айером . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.