Вопрос по linux, kernel – Разница между initrd и initramfs?

48

Насколько я знаю,initrd действует как блочное устройство, поэтому требуется драйвер файловой системы (такой какext2). В ядре должен быть хотя бы один встроенный модуль для обнаружения файловой системыinitrd, В этой статье,Представляем initramfs, новую модель для начальных RAM-дисковнаписано что:

But ramdisks actually waste even more memory due to caching. Linux is designed to cache all files and directory entries read from or written to block devices, so Linux copies data to and from the ramdisk into the "page cache" (for file data), and the "dentry cache" (for directory entries). The downside of the ramdisk pretending to be a block device is it gets treated like a block device.

Что & APOS; spage cache а такжеdentry cache? В абзаце, означает ли это, что данные были дублированы, потому чтоramdisk трактуется как блочное устройство, при этом все данные кешируются?

В противоположность,ramfs:

A few years ago, Linus Torvalds had a neat idea: what if Linux's cache could be mounted like a filesystem? Just keep the files in cache and never get rid of them until they're deleted or the system reboots? Linus wrote a tiny wrapper around the cache called "ramfs", and other kernel developers created an improved version called "tmpfs" (which can write the data to swap space, and limit the size of a given mount point so it fills up before consuming all available memory). Initramfs is an instance of tmpfs.

These ram based filesystems automatically grow or shrink to fit the size of the data they contain. Adding files to a ramfs (or extending existing files) automatically allocates more memory, and deleting or truncating files frees that memory. There's no duplication between block device and cache, because there's no block device. The copy in the cache is the only copy of the data. Best of all, this isn't new code but a new application for the existing Linux caching code, which means it adds almost no size, is very simple, and is based on extremely well tested infrastructure.

В сумме,ramfs просто файл открывается и загружается в память, не так ли?

И то и другоеinitrd а такжеramfs архивируются во время компиляции, но разница в том,initrd это блочное устройство, распакованное для монтирования ядром при загрузке,ramfs распаковывается через cpio в память. Я прав? Илиramfs очень минимальная файловая система?

Наконец, до сегодняшнего дняinitrd изображение все еще представлено в последнем ядре. Тем не менее, это то, чтоinitrd на самом делеramfs используется сегодня и название только для исторических целей?

Вопрос можно было сделать более кратким. BHS

Ваш Ответ

4   ответа
42

Dentry (and inode) cache

файловая система), которая реализует интерфейс системных вызовов и обрабатывает пересечение точек монтирования и разрешения по умолчанию и ограничивает проверки. Ниже приведены драйверы для отдельных файловых систем и драйверы для блоковых устройств (диски, карты памяти и т. Д .; исключение - сетевые интерфейсы).

Интерфейс между VFS и файловой системой представляет собой несколько классов (это простой C, то есть структуры, содержащие указатели на функции и тому подобное, но это концептуально объектно-ориентированный интерфейс). Основные три классаinode, который описывает любой объект (файл или каталог) в файловой системе,dentry, который описывает запись в каталоге иfile, который описывает файл, открытый процессом. При монтировании драйвер файловой системы создаетinode а такжеdentry для его корня и других создаются по требованию, когда процесс хочет получить доступ к файлу, и срок его действия истекает. Это кэш-память и иноды.

Да, это означает, что для каждого открытого файла и любого каталога, находящегося в корневом каталоге, должно бытьinode а такжеdentry структуры, размещенные в памяти ядра, представляющие его.

Page cache

В Linux каждая страница памяти, которая содержит данные о пользователях, представлена единойpage состав. Это может пометить страницу как анонимную (можно поменять ее местами, если она доступна) или связать ее сinode в некоторой файловой системе (может быть записан обратно и перечитан из файловой системы), и он может быть частью любого числа карт памяти, то есть видимых в адресном пространстве какого-либо процесса. Сумма всех страниц, загруженных в данный момент в памяти, является кешем страниц.

Страницы используются для реализации интерфейса mmap, и хотя регулярные системные вызовы чтения и записи могут быть реализованы файловой системой другими средствами, большинство интерфейсов использует универсальную функцию, которая также использует страницы. Существуют общие функции, которые, когда запрашивается чтение файла, распределяют страницы и вызывают файловую систему, чтобы заполнить их, одну за другой. Для файловой системы на основе блочных устройств она просто вычисляет соответствующие адреса и делегирует это заполнение драйверу блочного устройства.

ramdev (ramdisk)

Рамдев - штатное блочное устройство. Это позволяет наложить любую файловую систему поверх нее, но это ограничено интерфейсом блочного устройства. И у этого есть только методы, чтобы заполнить страницу, выделенную вызывающей стороной, и записать ее обратно. Это именно то, что нужно для реальных блочных устройств, таких как диски, карты памяти, запоминающие устройства USB и т. Д., Но для виртуального диска это означает, что данные существуют в памяти дважды, один раз в памяти ramdev и один раз в выделенной памяти. вызывающим абонентом

Это старый способ реализацииinitrd, Со времен, когда initrd был редким и экзотическим явлением.

tmpfs

Tmpfs отличается. Это фиктивная файловая система. Методы, которые она предоставляет VFS, являются абсолютным минимумом, чтобы заставить ее работать (как таковая, она является превосходной документацией о том, что должны делать методы inode, dentry и file). Файлы существуют только в том случае, если в кэше инодов имеются соответствующие inode и dentry, созданные при создании файла, и срок их действия не истек, пока файл не будет удален. Страницы связаны с файлами, когда данные записываются, и в противном случае ведут себя как анонимные (данные могут быть сохранены для обмена,page структуры остаются в использовании, пока файл существует).

Это означает, что в памяти нет лишних копий данных, и все намного проще, и благодаря этому немного быстрее. Он просто использует структуры данных, которые служат кешем для любой другой файловой системы, в качестве основного хранилища.

Это новый способ реализацииinitrd (initramfs, но изображение все еще называется простоinitrd).

Это также способ реализации «разделяемой памяти posix»; (это просто означает, что tmpfs монтируется на/dev/shm и приложения могут свободно создавать файлы и отображать их; просто и эффективно), а в последнее время даже/tmp а также/run (или же/var/run) часто tmpfs монтируются, особенно на ноутбуках, чтобы не допустить раскручивания дисков или избежать износа SSD.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededinitrdError: User Rate Limit ExceededramfsError: User Rate Limit Exceeded Amumu
Error: User Rate Limit ExceededinitramfsError: User Rate Limit Exceeded
Error: User Rate Limit ExceededinitrdError: User Rate Limit ExceededinitramfsError: User Rate Limit ExceededcpioError: User Rate Limit ExceededtmpfsError: User Rate Limit ExceededzipError: User Rate Limit Exceeded
Error: User Rate Limit ExceededIt is stored in the cache, (ab)using it as the primary storage for the data (...)Error: User Rate Limit ExceededlockError: User Rate Limit Exceeded
0

Minimal runnable QEMU examples and newbie explanation

В этом ответе я буду:

provide a minimal runnable Buildroot + QEMU example for you to test things out explain the most fundamental difference between both for the very beginners who are likely googling this

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

Минимальная настройкаполностью автоматизирован здесьи этосоответствующее начало.

Программа установки выводит команды QEMU по мере их выполнения, и, как объясняется в этом репозитории, мы можем легко создать три следующих рабочих типа загрузок:

root filesystem is in an ext2 "hard disk":

qemu-system-x86_64 -kernel normal/bzImage -drive file=rootfs.ext2

root filesystem is in initrd:

qemu-system-x86_64 -kernel normal/bzImage -initrd rootfs.cpio

-drive is not given.

rootfs.cpio contains the same files as rootfs.ext2, except that they are in CPIO format, which is similar to .tar: it serializes directories without compressing them.

root filesystem is in initramfs:

qemu-system-x86_64 -kernel with_initramfs/bzImage

Neither -drive nor -initrd are given.

with_initramfs/bzImage is a kernel compiled with options identical to normal/bzImage, except for one: CONFIG_INITRAMFS_SOURCE=rootfs.cpio pointing to the exact same CPIO as from the -initrd example.

Сравнивая настройки, мы можем заключить наиболее фундаментальные свойства каждого:

in the hard disk setup, QEMU loads bzImage into memory.

This work is normally done by bootloaders / firmware do in real hardware such as GRUB.

The Linux kernel boots, then using its drivers reads the root filesystem from disk.

in the initrd setup, QEMU does some further bootloader work besides loading the kernel into memory: it also:

loads the rootfs.cpio into memory informs the kernel about it: https://unix.stackexchange.com/questions/89923/how-does-linux-load-the-initrd-image

This time then, the kernel just uses the rootfs.cpio from memory directly, since no hard disk is present.

Writes are not persistent across reboots, since everything is in memory

in the initramfs setup, we build the kernel a bit differently: we also give the rootfs.cpio to the kernel build system.

The kernel build system then knows how to stick the kernel image and the CPIO together into a single image.

Therefore, all we need to do is to pass the bzImage to QEMU. QEMU loads it into image, just like it did for the other setups, but nothing else is required: the CPIO also gets loaded into memory since it is glued to the kernel image!

52

Разницу легко увидеть, если вы выполните шаги, необходимые при загрузке:

initrd A ramdev block device is created. It is a ram-based block device, that is a simulated hard disk that uses memory instead of physical disks. The initrd file is read and unzipped into the device, as if you did zcat initrd | dd of=/dev/ram0 or something similar. The initrd contains an image of a filesystem, so now you can mount the filesystem as usual: mount /dev/ram0 /root. Naturally, filesystems need a driver, so if you use ext2, the ext2 driver has to be compiled in-kernel. Done! initramfs A tmpfs is mounted: mount -t tmpfs nodev /root. The tmpfs doesn't need a driver, it is always on-kernel. No device needed, no additional drivers. The initramfs is uncompressed directly into this new filesystem: zcat initramfs | cpio -i, or similar. Done!

И да, это все еще называетсяinitrd во многих местах, хотя этоinitramfsособенно в загрузчиках, так как для них это просто BLOB. Разница заключается в ОС при загрузке.

0

initrd а такжеinitramfs не упоминается в превосходном ответе выше.

With initrd the kernel by default hands over to userspace pid 0 at /sbin/init Newer initramfs however changes things up and executes pid 0 at /init

как это может стать ловушкой (см.https://unix.stackexchange.com/a/147688/24394)

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