реклама на сайте
подробности

 
 
> initramfs "не уходит", не происходит переход на действующйю файловую систему
Dubov
сообщение Oct 1 2014, 16:36
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Задача: сделать так, чтобы ядро при загрузке увидело раздел /dev/mmcblk0p1, смонтировало его как корневую файловую систему.

С наскока такое сделать не получилось. Если писать в строке параметров загрузки "root=/dev/mmcblk0p1", то ядро ругается так:

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)



Понимаю, что нужно как-то смонтировать mmc-карту(иначе /dev/mmcblk0p1 просто не появится) перед тем как запускать инициализацию файловой системы. Узнал, что для этого используется initramfs. Тут я совсем новичок.
Включил в ядре поддержку initramfs:

CONFIG_INITRAMFS_SOURCE="./initramfs-list-min"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
# CONFIG_INITRAMFS_IS_LARGE is not set
CONFIG_RD_GZIP=y
# CONFIG_RD_BZIP2 is not set
# CONFIG_RD_LZMA is not set
# CONFIG_RD_LZO is not set
CONFIG_INITRAMFS_COMPRESSION_NONE=y

в файле "initramfs-list-min" по мимо всего прочего создал ноду /dev/mmcblk0p1 и /dev/mmcblk0

После запуска, ядро нашло /dev/mmcblk0p1 и даже стало ждать присоединения карты, если в строке загрузке написать rootwait. Ну, думаю, нашлась корневая файловая система...
Но, после успешной загрузки ядра и входа в систему, я понял, что в корневой файловой системе присутствует толкьо тот минимум папок, что был в initramfs, а всё многообразие полноценной файловой системы на mmc система просто проигнорировала как корневую файловую систему, при это ниразу не ругнувшись.
Выходит просто root=/dev/mmcblk0p1 не достатачно для загрузки рутовой с mmc.
Как именно должно происходить монтирование полноценной файловой системы после initramfs?

Сообщение отредактировал Dubov - Oct 1 2014, 17:57
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
krux
сообщение Oct 1 2014, 20:08
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



Цитата
А откуда возьмётся /dev/mmcblk0p1 если его не создать через initrd

тут надо разделить мух и котлеты.
во-первых есть внутренняя кухня ядра (kernelspace), и сами названия вида /dev/mmcblk0p1 уже вкомпилены в ядро. Но при этом наружу эти названия не светятся. При использовании в качестве параметров ядра используются именно они. "Создавать" их когда ядро уже загружено - масло масляное.
во-вторых есть файловая система и на запрос ls /dev выдается именно то что указано в файловой системе (userspace). содержимое ФС может отличатсья от строк с названиями /dev в ядре.
Для сопоставления и общения kernelspace<->userspace используются Major number и Minor number devices.txt
вручную сопоставить /dev-устройство файлу можно командой mknod
Код
mknod /dev/mmcblk0p1 179 1

создаст соответствующий файл.
динамически создавать нужные файлы в /dev умеет udev


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
Dubov
сообщение Oct 2 2014, 06:22
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(krux @ Oct 2 2014, 00:08) *
тут надо разделить мух и котлеты.
во-первых есть внутренняя кухня ядра (kernelspace), и сами названия вида /dev/mmcblk0p1 уже вкомпилены в ядро.

как именно они вкомпилены? какие опции конфига ядра нужно включить? всё что касается MMC у меня включено. /dev/mmcblk0p1 само собой не появляется.

создал initramfs, вот init:

CODE
#!/bin/busybox sh

# Mount the /proc and /sys filesystems.
mount -t proc none /proc
mount -t sysfs none /sys
mknod /dev/console c 5 1
mknod /dev/tty c 5 0
mknod /dev/null c 1 3
mknod /dev/mem c 1 1
mknod /dev/kmem c 1 2
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/mmcblk0 b 179 0
mknod /dev/mmcblk0p1 b 179 1

chmod 777 /dev/console
chmod 777 /dev/tty
chmod 777 /dev/ttyS0
chmod 700 /dev/mmcblk0
chmod 700 /dev/mmcblk0p1

# Do your stuff here.
echo "This script mounts rootfs and boots it up, nothing more!"

# Mount the root filesystem.
mount -o rw /dev/mmcblk0p1 /mnt/root || rescue_shell

# Clean up.
umount /proc
umount /sys

# Boot the real thing.
exec switch_root /mnt/root /sbin/init

rescue_shell() {
echo "Something went wrong. Dropping you to a shell."
busybox --install -s
exec /bin/sh
}




вот строка загрузки ядра:
root=/dev/mmcblk0p1 rw rootwait init=init

Вот вывод консоли ядра:

mmci-pl18x mmci0: mmc0: MMCI rev 4 cfg 10 at 0x0000000040012c00 irq 49,-1
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright© Pierre Ossman
ARMv7-M VFP Extension supported
Freeing init memory: 16K
Warning: unable to open an initial console.
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
Kernel panic - not syncing: Attempted to kill init!


думаю дальше...

Сообщение отредактировал Dubov - Oct 2 2014, 07:37
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th August 2025 - 14:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016