Почему в некоторых системах Linux корневая файловая система отображается как / dev / root вместо / dev / <real device node> в mtab?

11

Я видел в различных системах Linux, где вместо реального узла устройства (например:) /dev/sda1, корневое устройство отображается как /dev/rootили вместо реальной файловой системы, mtabговорит, что называется файловой системой rootfs(которая выглядит как настоящая файловая система /proc/filesystems, но нет кода в <linux-kernel-source-tree>/fs). Различные утилиты были созданы для использования определенных атрибутов для определения реального корневого узла устройства (например, rdev и Chromium OS rootdev). Я не могу найти никакого логического объяснения этому, кроме чтения где-то, что очень маленькие встроенные устройства не всегда должны иметь /devузел устройства для своего корневого устройства. (Это правда, и если да, то это ответ на мой вопрос?) Почему mtab иногда говорит /dev/root(и я думаю, я мог видеть, что это говоритrootdevодин раз) вместо реального узла устройства, и как я могу сделать так, чтобы он всегда говорил реальный узел устройства? Ядро сначала монтирует корневое устройство, следуя rootпараметру в cmdline, затем init/systemdперемонтирует его в соответствии с fstab, правильно? Если так, то я полагаю, initподдерживает mtab. Если моя теория верна, как я могу initзаписать настоящий корневой узел устройства mtab? Я заметил, что /etc/mtabэто на самом деле символическая ссылка на /proc/mounts, что означает, mtabчто поддерживается ядром. Итак , как настроить / пропатчить ядро на, вместо того , чтобы говорить путь корневого узла устройства /dev/root, которые mtabсодержат узел реального устройства?

Билли
источник

Ответы:

4

Как правило, это артефакт использования initramfs.

Из документации ядра ( https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt ).

Что такое rootfs?

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

Большинство систем просто монтируют другую файловую систему поверх rootfs и игнорируют ее. Количество места, которое занимает пустой экземпляр ramfs, ничтожно мало.

Таким образом, rootfsкорневая файловая система была создана для initramfs и не может быть размонтирована.

Что касается /dev/root, я менее уверен в этом, но если я правильно помню, /dev/rootсоздается при использовании initrd (не то же самое, что initramfs).

Патрик
источник
mountдает rootfs on / type rootfs (rw)для initrd и /dev/root on / type ext2 (rw,relatime,block_validity,barrier,user_xattr)для ext2 жесткого диска с этой настройкой .
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功
/dev/rootиспользуется некоторыми реализациями initramfs, но не другими - в этих случаях это не связано с ядром. Когда не используется initramfs, это похоже на значение заполнителя, используемое ядром. (Возможно, это может быть удалено в более поздней версии ядра). stackoverflow.com/questions/37310046/…
sourcejedi
3

Gentoo имеет патч, который делает именно это (обеспечивает отображение реального корневого устройства). Вы можете найти его здесь: https://lkml.org/lkml/2013/1/31/574

Милош Иванович
источник
2

В Linux, /dev/rootесли есть, это символическая ссылка на фактическое устройство, созданное во время загрузки.

Вы либо используете readlink /dev/rootили, cat /proc/cmdlineчтобы увидеть rootпараметр загруженного ядра, и таким образом узнать реальное устройство за ним.

От мужчины dracut(8)

Однако, чтобы продолжить успешную загрузку, цель состоит в том, чтобы найти корневой том и создать символическую ссылку / dev / root, которая указывает на файловую систему.

Руи Ф Рибейро
источник
Я не совсем уверен, /dev/rootявляется ли это артефактом дистрибутивов на основе RedHat.
Руи Ф. Рибейро
Ну, мой Debian 8 не имеет /dev/root/. На старом CentOS это, кажется, фактический узел устройства вместо символической ссылки.
ilkkachu
1
Что ж, в base-filesрецепте OpenEmbeddedfstab упоминается /dev/root, так что его используют не просто дистрибутивы Red Hat.
извед