Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ядро не видит разделы и корневую файловую систему на mmc
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
Dubov
получаю такой лог в загрузке ядра:
Код
...
mmci-pl18x mmci0: mmc0: MMCI rev 4 cfg 10 at 0x0000000040012c00 irq 49,-1
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
ARMv7-M VFP Extension supported
VFS: Cannot open root device "mmcblk0p1" or unknown-block(0,0)
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)


и всё.

это
CODE
Please append a correct "root=" boot option; here are the available partitions:

, как я понимаю, говорит о том что ядро не видит разделов на mmc

каковы могут быть причины такого поведения ядра?
Tarbal
А что видит загрузчик?
Если остановить загрузку, то можно посмотреть если он видит mmc.
mmcblk0p1 ето диск 0 раздел 1.

Сколько у вас дисков?
Как выглядит строка параметров для ядра?
Используете u-Boot?

Один раз у меня было подобное потому, что раздел монтировался как для чтения/ записи, но на карточке была установлена защита от записи.
Но в вашем случае раздел недоступен как будто его не существует.
Dubov
Цитата(Tarbal @ Sep 12 2014, 16:06) *
А что видит загрузчик?
Если остановить загрузку, то можно посмотреть если он видит mmc.
mmcblk0p1 ето диск 0 раздел 1.

Сколько у вас дисков?
Как выглядит строка параметров для ядра?
Используете u-Boot?

Один раз у меня было подобное потому, что раздел монтировался как для чтения/ записи, но на карточке была установлена защита от записи.
Но в вашем случае раздел недоступен как будто его не существует.

Спасибо за ответ!

у меня на mmc карте раздел всего один и карта одна. Поэтому указываю mmcblk0p1
Использую u-boot, строка загрузки:

bootargs=stm32_platform=stm32429-disco mem=31M console=ttyS0,115200n8 rootfstyp=ext2 consoleblank=0 root=/dev/mmcblk0p1 rootfstype=ext2 debug rw rdinit=/sbin/

когда включил опцию debug, увидел немного больше информации в консоли:

CODE
mmci-pl18x mmci0: designer ID = 0x80
mmci-pl18x mmci0: revision = 0x4
mmci-pl18x mmci0: clocking block at 25000000 Hz
mmc0: clock 0Hz busmode 1 powermode 0 cs 0 Vdd 0 width 0 timing 0
mmci-pl18x mmci0: mmc0: MMCI rev 4 cfg 10 at 0x0000000040012c00 irq 49,-1
mmc0: clock 0Hz busmode 1 powermode 1 cs 0 Vdd 21 width 0 timing 0
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright© Pierre Ossman
ARMv7-M VFP Extension supported
mmc0: clock 400000Hz busmode 2 powermode 2 cs 0 Vdd 21 width 0 timing 0
VFS: Cannot open root device "mmcblk0p1" or unknown-block(0,0)
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)


не могу понять, что не так
Tarbal
У вас микро карточка или обычная?
Если обычная, то может быть на ней ползунок стоит в положении запрета записи?
У меня было так. Перешли с обычной карточки на микро, а провод детектирования защиты от записи оставили в воздухе. оно иногда монтировалось, а иногда нет.
Я в таких случаях лезу в ядро, ставлю печатание параметров и ищу в чем дело.
Можно попробовать смонтиривать на другом носителе или nfs, а потом попробовать смонтировать этот раздел.
Dubov
удалось "подцепить" файловую систему из флешь. Теперь найти проблему должно быть проще.
Вижу в логе загрузки ядра:

VFS: Mounted root (romfs filesystem) readonly on device 31:0.
Freeing init memory: 16K
mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new SD card at address 0002
mmcblk0: mmc0:0002 00000 1.86 GiB
mmcblk0:
p1
mbcache: exports duplicate symbol mb_cache_entry_find_next (owned by kernel)
kmem_cache_create: duplicate cache ext2_xattr


полагаю, что карта определилась, вот только в /dev/ нет mmcblk0p1. Файловая система на внутренней влешке Read only file system.
Возможно ли, что именно поэтому не появляестя карточка в /dev ?
Mihey_K
Создайте ноду устройств mmcblk0p1 в каталоге /dev, потому что если udev не поддерживается, то ноду автоматом вы там не увидите.
Dubov
можно немного раскрыть вопрос, что такое нода и как её создать?

p.s. не стыдно не знать, стыдно не спрашивать sm.gif
Mihey_K
Учиться никогда не стыдно. Ссылка устройства, подробнее на вики тут и тут. Ссылки бывают двух типов: блочные и символьные. Дисковые устройства блочные. Каждый node содержит имя файла устройства и 2 номера (номер драйвера и номер порядковый устройства). О том какие номера указывать можете посмотреть в документации uClinux тут. Создать ноду можно утилитой mknod с правами root - mknod dev/mmcblk0 (ссылка) b(тип) 179(# драйвера) 0(#) -m644(права доступа по желанию). Еще в дистрибутиве поищите файл initramfs, он еще в General настройках ядра прописан. Там перечислены создаваемые автоматом при упаковке initramfs в ядро ноды устройств, папки, файлы и ссылки. Добавьте туда флешку. Можно еще на самой плате создать, если в busybox собран mknod, например как тут.
Dubov
большое спасибо. всё получилось.

Интересно, а если расположить файловую систему на mmc, как тогда система определит dev/mmcblk0p1, если сейчас последовательность такая: сначала инициализируется файловая система, а потом уже "цепляется" mmc и раздел.
получается существует какой-то промежуточный механизм, который должен создать dev/mmcblk0p1 ещё до загрузки файловой системы.

как это происходит? где об этом можно почитать?
Mihey_K
Называется это initramfs, временный виртуальный диск, монтируемый в ОЗУ. Только в вашем случае сейчас он остается корневой файловой системой и из него вы работаете, а например на рабочей станции initrd образ только подготавливает железо и запускает init для загрузки с диска. Поэтому в ядре надо отказаться от initramfs и включить initrd, при этом на флешке у вас должен быть уже подготовленный образ файловой системы (как для initramfs) с доступным для драйвера ядра типом ФС. Собрать образ можно утилитой mkfs, например mkfs.jffs2 для JFFS2.
Еще в busybox можно собрать udev, включить его использование и поддержку динамического создания нодов в ядре и тогда ссылки сами будут создавать при обнаружении новых устройств, но это все влечет расход ресурсов.
Dubov
initramfs это файловая система в RAM. у меня сейчас файловая система на внутренней flash, с неё и работаю. а в busybox у меня mdev, вместо udev
Mihey_K
Так зачем вам тогда еще mmc, если все работает? mmc можно просто примонтировать в скрипте init напрямую или добавив в /etc/fstab, а fstab и опцию -a включить в busybox.
Dubov
дабы не плодить темы решил спросить тут.

Прогу посоветовать источник информации, где бы объяснялись принципы начальной загрузки системы. Например:

1) у меня есть файловая система (папки dev, sys, etc...), при этом в папке sys лежит один пустой файл "placeholder". Когда эту файловую систему собираю в бинарник через buildroot и прошиваю на контроллер, вижу, что в папке sys создано множество папок (dev, devices, platform...). Кто добавил новые папки?
2) в исходниках ядра есть ethernet драйвер eth_driver.c, в Makefile в папке драйвера есть:
obj-$(CONFIG_ETH_DRIVER) += eth_driver.c
CONFIG_ETH_DRIVER в конфиге ядра включён. Но в логах загрузки ядра о дрйвере нет упоминаний... и я дро весит одинаково, что с драйвером что без. Где в ядре происходит подключение драйвера (insmode, modpobe) ?
3) в buildroot включён mdev (аналог udev). Но у меня корневая файловая система только для чтения, соответственно автоматически нод не появится. Верно? Какие ноды надо сощдать для сетевого утсройства?

Вопросов много, поэтому прошу отослать к... источнику инфомрации.

Спасибо.
Mihey_K
Цитата
в папке sys создано множество папок (dev, devices, platform...). Кто добавил новые папки?

Они появляются при монтировании файловой системы sysfs, содержащей сведения о найденном оборудовании и драйверах. Монтирование через команду mount -t sysfs sysfs /sys, например в скрипте rcS в /etc или в /etc/init.d, или через строку none /sys sysfs defaults,noatime 0 0 в /etc/fstab с командой монтирования в том же скрипте rcS - mount -a. Ссылка. Просветиться рекомендую на ресурсе opennet.ru.

2. В menuconfig ядра есть специальный пункт Networking. Там все включили?
Цитата
Где в ядре происходит подключение драйвера (insmode, modpobe) ?

У вас включена поддержка модулей или все монолитно?

3. Верно. В ядре кстати еще нужно указать путь до утилиты mdev, кажется в пункте General, точно не помню. Для mdev еще требуется в корне каталог proc, откуда mdev получает данные о событиях. Для fdisk также требуется proc. proc монтируется аналогично п.1.
Для сетевых карт ноды не создаются, сет. интерфейс ищите в /sys/class/net
Dubov
так как у меня рутовая толкьо для чтения, то в /sys/class/net я должен создать файлы сам. как это сделать и что именно нужно создать.
Mihey_K
Не не, ничего там создавать самим нельзя, это все делает ядро. Открывайте доступ для записи или запускайтесь с виртуальным диском в ОЗУ.
Dubov
Цитата(Mihey_K @ Sep 25 2014, 17:02) *
У вас включена поддержка модулей или все монолитно?


в menuconfig вообще нету упоминания про мой драйвер(ethernet для STM32), а в исходниках есть файл драйвера и в Makefile прописана зависимость от дефайнов (как писал ранее). Значит, могу предположить, что при сборке ядра сам модуль собирается, а как он должен монтироваться непонятно.

Обычно монтировнаие драйвера вручную приводит к автоматическому созданию нода? (вопрос не касательно моей системы где корневая read only)
Tarbal
Цитата(Dubov @ Sep 23 2014, 15:11) *
удалось "подцепить" файловую систему из флешь. Теперь найти проблему должно быть проще.
Вижу в логе загрузки ядра:

VFS: Mounted root (romfs filesystem) readonly on device 31:0.
Freeing init memory: 16K
mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new SD card at address 0002
mmcblk0: mmc0:0002 00000 1.86 GiB
mmcblk0:
p1
mbcache: exports duplicate symbol mb_cache_entry_find_next (owned by kernel)
kmem_cache_create: duplicate cache ext2_xattr


полагаю, что карта определилась, вот только в /dev/ нет mmcblk0p1. Файловая система на внутренней влешке Read only file system.
Возможно ли, что именно поэтому не появляестя карточка в /dev ?


/dev/mmcblk0 имеется в наличии?
Что показывает
ls /dev/mm*
ls /dev /sd*
ls /dev/mtd*
и
mount
Dubov
Ситуация такая:
/dev/mmcblk0 не было и ничего автоматом не создаётся.

Отредактировал файловую систему, вручную создав руками файлы @mmcblk0,b,179,0 и @mmcblk0p1,b,179,1
разместил файловую систему во внутренней флешь. Всё, карта появилась в системе. могу писать и читать.

Сейчас есть нужда разместить рутовую в mmc, так как необходимо автоматическое создание нодов устройств с помощью mdev, что недостижимо, когда файловая система на внутреннем флеше (когда файловая система red only).
не знаю, как это сделать.
тупо root=/dev/mmcblk0p1 не работает

Вопрос: когда ядро принимает "root=/dev/mmcblk0p1", то получается ядро уже должно знать что есть /dev/mmcblk0p1. откуда ядро это знает? через initramfs? тогда как прописать в initramfs, что есть /dev/mmcblk0p1 ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.