Инициализация и механизм кэширования в ядре Linux

Опубликовано: 14 Июля, 2021

Я получил обновления для своей операционной системы 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, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.