Jump to content

    

ядро не видит разделы и корневую файловую систему на mmc

получаю такой лог в загрузке ядра:

...
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)

 

и всё.

 

это

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

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

 

каковы могут быть причины такого поведения ядра?

Share this post


Link to post
Share on other sites

А что видит загрузчик?

Если остановить загрузку, то можно посмотреть если он видит mmc.

mmcblk0p1 ето диск 0 раздел 1.

 

Сколько у вас дисков?

Как выглядит строка параметров для ядра?

Используете u-Boot?

 

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

Но в вашем случае раздел недоступен как будто его не существует.

 

Share this post


Link to post
Share on other sites
А что видит загрузчик?

Если остановить загрузку, то можно посмотреть если он видит 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, увидел немного больше информации в консоли:

 

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)

 

не могу понять, что не так

Edited by Dubov

Share this post


Link to post
Share on other sites

У вас микро карточка или обычная?

Если обычная, то может быть на ней ползунок стоит в положении запрета записи?

У меня было так. Перешли с обычной карточки на микро, а провод детектирования защиты от записи оставили в воздухе. оно иногда монтировалось, а иногда нет.

Я в таких случаях лезу в ядро, ставлю печатание параметров и ищу в чем дело.

Можно попробовать смонтиривать на другом носителе или nfs, а потом попробовать смонтировать этот раздел.

 

Share this post


Link to post
Share on other sites

удалось "подцепить" файловую систему из флешь. Теперь найти проблему должно быть проще.

Вижу в логе загрузки ядра:

 

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 ?

Share this post


Link to post
Share on other sites

Создайте ноду устройств mmcblk0p1 в каталоге /dev, потому что если udev не поддерживается, то ноду автоматом вы там не увидите.

Share this post


Link to post
Share on other sites

можно немного раскрыть вопрос, что такое нода и как её создать?

 

p.s. не стыдно не знать, стыдно не спрашивать :)

Edited by Dubov

Share this post


Link to post
Share on other sites

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

Edited by Mihey_K

Share this post


Link to post
Share on other sites

большое спасибо. всё получилось.

 

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

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

 

как это происходит? где об этом можно почитать?

Edited by Dubov

Share this post


Link to post
Share on other sites

Называется это initramfs, временный виртуальный диск, монтируемый в ОЗУ. Только в вашем случае сейчас он остается корневой файловой системой и из него вы работаете, а например на рабочей станции initrd образ только подготавливает железо и запускает init для загрузки с диска. Поэтому в ядре надо отказаться от initramfs и включить initrd, при этом на флешке у вас должен быть уже подготовленный образ файловой системы (как для initramfs) с доступным для драйвера ядра типом ФС. Собрать образ можно утилитой mkfs, например mkfs.jffs2 для JFFS2.

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

Share this post


Link to post
Share on other sites

initramfs это файловая система в RAM. у меня сейчас файловая система на внутренней flash, с неё и работаю. а в busybox у меня mdev, вместо udev

 

Edited by Dubov

Share this post


Link to post
Share on other sites

Так зачем вам тогда еще mmc, если все работает? mmc можно просто примонтировать в скрипте init напрямую или добавив в /etc/fstab, а fstab и опцию -a включить в busybox.

Share this post


Link to post
Share on other sites

дабы не плодить темы решил спросить тут.

 

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

 

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). Но у меня корневая файловая система только для чтения, соответственно автоматически нод не появится. Верно? Какие ноды надо сощдать для сетевого утсройства?

 

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

 

Спасибо.

 

Share this post


Link to post
Share on other sites
в папке 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

 

Share this post


Link to post
Share on other sites

так как у меня рутовая толкьо для чтения, то в /sys/class/net я должен создать файлы сам. как это сделать и что именно нужно создать.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this