Схема адресации initramfs gzip'е, архив CPIO во время загрузки

Тот факт, что запись все еще существует в файле / etc / passwd , означает, что пользователь все еще существует. Размещение символа '!' в начале строки, насколько мне известно, не является стандартной процедурой, но это приведет к отключению входа в систему для этого пользователя.

1
13.07.2018, 04:26
1 ответ

Are the contents of the cpio archive extracted into some kind of file system that allows the kernel to find these files later...or are the memory addresses of these files hard-coded in the kernel's code?

В файловую систему. Тип используемой файловой системы: ramfs или tmpfs . Это подробно объясняется в одной из ссылок, которые вы упомянули.

https://github.com/torvalds/linux/blob/v4.17/Documentation/filesystems/ramfs-rootfs-initramfs.txt

ramfs и tmpfs работают очень похоже; это не имеет большого значения для этого вопроса. Какой тип используется для initramfs, может варьироваться, например. между версиями ядра (, если вам когда-нибудь понадобится знать, прочтите это). Вне initramfs общим правилом является всегда использовать tmpfs. tmpfs ограничивает максимальное использование пространства, что защищает от нехватки оперативной памяти и сбоя системы.


Rootfs is a special instance of ramfs (or tmpfs, if that's enabled), which is always present in 2.6 systems [...]

What is initramfs?

All 2.6 Linux kernels contain a gzipped "cpio" format archive, which is extracted into rootfs when the kernel boots up.


According to: Kernel.org and Wikipedia, the Linux Kernel cpio extractor unpacks this init.ramfs section somewhere in memory [...]

В первой части «ramfs -rootfs -initramfs.txt» объясняется, что данные файла ramfs размещаются в кэше страниц , та же структура используется для кэширования. файловые данные из физических файловых систем. Файловые страницы ramfs также могут быть выгружены на устройство подкачки точно так же, как память процесса.

Я могу сказать вам, что кеш страниц очень близок к распределителю низшего уровня, распределителю страниц ядра . Распределитель страниц получает все доступные области физической памяти во время загрузки; они исключат начальные разделы ядра. Доступные области физического ОЗУ передаются ядру загрузчиком/прошивкой. Вы должны увидеть эти области в ряде строк в начале журнала ядра , как показано командой dmesg.

Позже в журнале ядра вы можете увидеть сообщение, когда распределитель страниц получает init mem, который больше не нужен, включая освобожденный раздел init.ramfs. (IIRC есть какой-то отдельный очень ранний распределитель перед распределителем страниц, но это не самая захватывающая деталь в начальной загрузке IMO ).

2. After extracting, how does the kernel find the memory addresses for the data of a particular file,...such as the /sbin/init file ?

Кэш страниц связан с -инодами памяти, также известными как vnodes . vnodes просматриваются в -памяти dentry cache .dentry = запись каталога в кеше.

What is ramfs?

Ramfs is a very simple filesystem that exports Linux's disk caching mechanisms (the page cache and dentry cache) as a dynamically resizable RAM-based filesystem.

Normally all files are cached in memory by Linux. Pages of data read from backing store (usually the block device the filesystem is mounted on) are kept around in case it's needed again, but marked as clean (freeable) in case the Virtual Memory system needs the memory for something else. Similarly, data written to files is marked clean as soon as it has been written to backing store, but kept around for caching purposes until the VM reallocates the memory. A similar mechanism (the dentry cache) greatly speeds up access to directories.

With ramfs, there is no backing store. Files written into ramfs allocate dentries and page cache as usual, but there's nowhere to write them to. This means the pages are never marked clean, so they can't be freed by the VM when it's looking to recycle memory.


Re: Question 1: I don't think the.init.ramfs section can be ungzip'ed to

Его можно распаковать во временный буфер в любом месте ОЗУ, например. с помощью распределителя страниц. Тем не менее, я предполагаю, что процесс извлечения является потоковым. То есть он может использовать подход, аналогичный gzip -d | cpio --extract. Этот подход позволяет избежать необходимости в буфере для хранения всего несжатого архива cpio при копировании файлов из архива в tmpfs.

1
27.01.2020, 23:43

Теги

Похожие вопросы