Зачем использовать cpio для initramfs?


11

Я делаю свои собственные initramfs, следуя вики Gentoo . Вместо привычного tarи gzip, страница говорит мне, чтобы использовать cpioи gzip. Википедия говорит, что cpioиспользуется initramfs ядра 2.6, но не объясняет почему.

Это просто соглашение или cpioлучше для initramfs? Могу ли я все еще использовать tarи gzip?


IIRC вы не можете использовать tar в качестве initramfs (я не публикую его как ответ, так как не уверен на 100%). Кстати, используя Gentoo, мне гораздо проще настраивать встроенные initramfs, чем созданные вручную.
Maciej Piechotka

@Maciej Я просто хочу знать, как это сделать :) Кроме того, я вижу значительное улучшение времени загрузки, используя мои собственные initramfs
phunehehe

Ты не понял меня. Метод, о котором я говорил, заключается в предоставлении ядру при настройке файла спецификации, какие файлы должны быть включены в initrd (включая пользовательские /initи т. Д.), И ядро ​​просто использует этот файл . Я не собираюсь генерировать initramfs genkernel или подобными методами.
Мацей Пехотка

@Maciej Это выглядит весело! Я попробую это когда-нибудь.
phunehehe

Что ж. ИМХО проще в настройке, и он автоматически обновляется с помощью ядра (поэтому мне не нужно помнить, чтобы копировать новые файлы в initrd).
Мацей Пехотка

Ответы:


9

Я не уверен на 100%, но поскольку исходный ramdisk должен быть распакован ядром во время загрузки, используется cpio, потому что он уже реализован в коде ядра.


6
Будьте уверены на 100%. linux / init / initramfs.c распаковывает cpio -H newcархив.
Эфимент

@ephemient Это действительно что-то. Если через несколько дней ответа больше не будет, я приму его, который cpioиспользуется в качестве соглашения и который мы должны использовать cpio.
phunehehe

Любые идеи, почему NewC выбран формат?
CMCDragonkai

1
Согласно документации ядра, cpio был реализован только для initramdisk, поэтому они могли реализовать любой другой формат.
17

10

Цитирование Documentation/filesystems/ramfs-rootfs-initramfs.txt:

Почему cpio, а не tar?

Это решение было принято еще в декабре 2001 года. Обсуждение началось здесь:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1538.html

И породил второй поток (в частности, tar против cpio), начиная здесь:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1587.html

Краткая и быстрая версия (которая не заменяет чтение вышеупомянутых тем):

1) cpio - это стандарт. Его десятилетия (со времен AT & T) и уже широко используются в Linux (внутри RPM, дисков с драйверами устройств Red Hat). Вот статья об этом в журнале Linux за 1996 год:

http://www.linuxjournal.com/article/1213

Он не так популярен, как tar, потому что традиционные инструменты командной строки cpio требуют _truly_hideous_ аргументов командной строки. Но это ничего не говорит о формате архива, и есть альтернативные инструменты, такие как:

http://freecode.com/projects/afio

2) Формат архива cpio, выбранный ядром, проще и чище (и, следовательно, его легче создавать и анализировать), чем любой из (буквально десятков) различных форматов архива tar. Полный формат архива initramfs описан в buffer-format.txt, создан в usr / gen_init_cpio.c и извлечен в init / initramfs.c. Все три вместе составляют менее 26 тыс. Человек текста.

3) Проект GNU по стандартизации на tar примерно так же актуален, как стандартизация Windows на zip. Linux также не является частью этой системы и может принимать собственные технические решения.

4) Поскольку это внутренний формат ядра, он мог бы быть
чем-то совершенно новым. Ядро предоставляет свои собственные инструменты для создания и извлечения этого формата в любом случае. Использование существующего стандарта было предпочтительным, но не обязательным.

5) Аль Виро принял решение (цитата: «tar ужасен как ад и не будет поддерживаться на стороне ядра»):

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1540.html

объяснил свои рассуждения:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1550.html http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1638.html

и, самое главное, разработал и внедрил код initramfs.


3

Из того, что я помню о моих старых SysV-днях, cpio мог обрабатывать файлы dev, но tar не мог; это сделало cpio «необработанной» утилитой резервного копирования до появления дампа. Также было проще обрабатывать частичные наборы файлов и жесткие ссылки, поэтому инкрементное резервное копирование было проще. Я думаю, что GNU tar догнал функции cpio, так что теперь это просто вопрос удобства пользователя. И cpio, и tar должны быть установлены по умолчанию.


1
cpioможет быть в состоянии обрабатывать tarархивы -формат, и наоборот в некоторых случаях, но это не имеет значения. Ядро могу только распакованные newc-Style cpio-format архивы, которые не tarя знаю производит.
Эфимент

Формат, который GNU cpio неправильно называет newc, официально назван ascи, конечно, поддерживается star.
Шили

1
@schily: Это показывает одну из неявных причин довольно хорошо. «Ну, это какой-то архив tar. Но какой из возможных форматов tar совместим ли он с этим tar-экстрактором?» OTOH, история версий cpio гораздо менее сложна.
Писквор покинул здание
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.