Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как запустить linux c ramfs?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
VDV
embedded linux.
имею:
работающую файловую систему.
то есть все работает, если используется ядро + файловая система + командная строка с опциями подключения.
теперь я хочу разместить эту файловую систему в памяти. цель - съкономить ресурс Nandflash.
в корне ФС делаю ссылку на /sbin/init
включаю опцию initramfs в ядре, указываю путь, пересобираю ядро.
оставляю в командной строке только
Kernel command line: mem=32M
и все перестает работать...

Please append a correct "root=" boot option; here are the available partitions:
1f00 4096 mtdblock0 (driver?)
1f01 1044480 mtdblock1 (driver?)

подскажите, плиз, что делаю не так?
mdmitry
Посмотрите, пожалуйста, примеры от Atmel для AT91SAM9260 и аналогичных. Есть образы FS с работой из RAM. Из flash или Nand идет сначала копирование, а потом запуск.
VDV
это реализовано через initrd
а я хочу через initramfs
sasamy
Цитата(VDV @ Nov 10 2009, 12:52) *
подскажите, плиз, что делаю не так?


Судя по описанию все правильно сделано. Надо смотреть _полный_ лог загрузки, "Kernel command line: mem=32M" маловато для диагноза wink.gif и потом nandflash и ram можно намного эфективней использовать при помощи unionfs, при этом rootfs держать на флэше и монтировать ее в ro-режиме, а для записи использовать tmpfs в ram, не забивая озу ненужными статическими данными.
VDV
суть понятна, но как это сделать?
можете дать ссылку на подробное описание шагов?
или объяснить здесь?

лог запуска ядра (попутно есть еще вопрос - почему watchdog пишет ошибку?):

Linux version 2.6.31.5 (root@ubuntuvm) (gcc version 4.3.4 (GCC) ) #4 Tue No
v 10 14:55:44 MSK 2009
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: Atmel AT91SAM9260-EK
Memory policy: ECC disabled, Data cache writeback
Clocks: CPU 200 MHz, master 100 MHz, main 12.000 MHz
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 8128
Kernel command line: mem=32M
PID hash table entries: 128 (order: 7, 512 bytes)
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 32MB = 32MB total
Memory: 27124KB available (2612K code, 173K data, 2452K init, 0K highmem)
Hierarchical RCU implementation.
NR_IRQS:192
AT91: 96 gpio irqs in 3 banks
Console: colour dummy device 80x30
console [tty0] enabled
console [ttyS0] enabled
Calibrating delay loop... 99.53 BogoMIPS (lpj=497664)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
NET: Registered protocol family 16
bio: create slab <bio-0> at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
TCP reno registered
NET: Registered protocol family 1
NetWinder Floating Point Emulator V0.97 (double precision)
NTFS driver 2.1.29 [Flags: R/W].
JFFS2 version 2.2. (NAND) В© 2001-2006 Red Hat, Inc.
msgmni has been set to 52
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
io scheduler noop registered
io scheduler anticipatory registered (default)
atmel_usart.0: ttyS0 at MMIO 0xfefff200 (irq = 1) is a ATMEL_SERIAL
brd: module loaded
loop: module loaded
ssc ssc.0: Atmel SSC device at 0xc2860000 (irq 14)
macb macb: invalid hw address, using random
MACB_mii_bus: probed
eth0: Atmel MACB at 0xfffc4000 irq 21 (5a:c9:b0:ee:a7:e4)
eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=ffffffff:01, irq=-1)
NAND device: Manufacturer ID: 0xec, Chip ID: 0xd3 (Samsung NAND 1GiB 3,3V 8-bit)

AT91 NAND: 8-bit, Software ECC
Scanning device for bad blocks
Bad eraseblock 650 at 0x000005140000
Bad eraseblock 3850 at 0x00001e140000
Creating 2 MTD partitions on "atmel_nand":
0x000000000000-0x000000400000 : "Bootstrap"
0x000000400000-0x000040000000 : "rootfs"
atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffc8000 (irq 12)
atmel_spi atmel_spi.1: Atmel SPI Controller at 0xfffcc000 (irq 13)
usbmon: debugfs is not available
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
at91_ohci at91_ohci: AT91 OHCI
at91_ohci at91_ohci: new USB bus registered, assigned bus number 1
at91_ohci at91_ohci: irq 20, io mem 0x00500000
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
mice: PS/2 mouse device common for all mice
rtc-at91sam9 at91_rtt.0: rtc core: registered at91_rtt as rtc0
IRQ 1/rtc0: IRQF_DISABLED is not guaranteed on shared IRQs
rtc-at91sam9 at91_rtt.0: rtc0: SET TIME!
i2c /dev entries driver
AT91SAM9 Watchdog: sorry, watchdog is disabled
at91_wdt: probe of at91_wdt failed with error -5
TCP cubic registered
NET: Registered protocol family 17
rtc-at91sam9 at91_rtt.0: hctosys: unable to read the hardware clock
VFS: Cannot open root device "<NULL>" or unknown-block(0,0)
Please append a correct "root=" boot option; here are the available partitions:
1f00 4096 mtdblock0 (driver?)
1f01 1044480 mtdblock1 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[<c02734b8>] (unwind_backtrace+0x0/0xdc) from [<c046c8e4>] (panic+0x34/0x110)
[<c046c8e4>] (panic+0x34/0x110) from [<c0008ecc>] (mount_block_root+0x25c/0x2b4)

[<c0008ecc>] (mount_block_root+0x25c/0x2b4) from [<c00090f4>] (prepare_namespace
+0x164/0x1c8)
[<c00090f4>] (prepare_namespace+0x164/0x1c8) from [<c0008420>] (kernel_init+0xd4
/0x10c)
[<c0008420>] (kernel_init+0xd4/0x10c) from [<c026edbc>] (kernel_thread_exit+0x0/
0x8)
sasamy
Что-то я не вижу сообщений от initramfs - такое ощущение что она вообще не включена в конфиге ядра - уверены что ядро собралось без ошибок и конечный имидж увеличился на величину rootfs ? По поводу пошагового руководства
http://www.google.ru/#hl=ru&source=hp&...s+root&fp=1
думаю даст достаточно информации, можно еще посмотреть aufs.
VDV
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="/<path>/rootfs"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_INITRAMFS_COMPRESSION_GZIP=y

может, что-то еще надо?
ну и размер ядра подрос. увеличилось раза в 2. было примерно 1.5 мб, стало почти 4.
sasamy
Цитата(VDV @ Nov 10 2009, 17:10) *
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="/<path>/rootfs"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_INITRAMFS_COMPRESSION_GZIP=y

может, что-то еще надо?
ну и размер ядра подрос. увеличилось раза в 2. было примерно 1.5 мб, стало почти 4.


Скорей всего неправильно создана ссылка на init в корневой фс. Наример

#cd /<path>/rootfs
#ln -s bin/busybox init

название ссылки должно быть init. Кстати - попробовал сейчас ядро 2.6.30.4, там тоже нет ссобщений в логе про initramfs - а раньше были smile.gif
VDV
да!
проблема была в ссылке!
спасибо большое!

а по AUFS информации кот наплакал sad.gif
sasamy
Цитата(VDV @ Nov 10 2009, 18:37) *
а по AUFS информации кот наплакал sad.gif


http://aufs.sourceforge.net/
там предостаточно информации. С точки зрения ос обычная фс. Например оттуда
Цитата
Here is another example. The result is equivalent.
# mount -t aufs -o br=/tmp/rw=rw:${HOME}=ro none /tmp/aufs


Замените директории нужными и напишите init скрипт для initamfs - он не больше 10 строчек будет. Например если с jffs2 и mtd (я видел у вас там вроде уже что-то работает на nand судя по логам)

/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys

/bin/mount -t tmpfs mdev /dev
/bin/mkdir /dev/pts
/bin/mount -t devpts devpts /dev/pts

/sbin/mdev -s

/bin/mkdir newroot nand ramfs
/bin/mount -t jffs2 /dev/mtdblock0 /nand
/bin/mount -t tmpfs none /ramfs
/bin/mount -t aufs -o br=/ramfs=rw:/nand=ro none /newroot
/sbin/switch_root /newroot init

все smile.gif я навскидку написал - надо пробовать

ps можно просто статические файлы устройств создать для mtd и вообще убрать mdev и собрать совсем маленький busybox а в основной rootfs использовать udev или тот же mdev.
sasamy
Цитата(sasamy @ Nov 10 2009, 21:26) *
я навскидку написал - надо пробовать


Испробовал с mmc, единственная неувязка была - не переключался root командой sbin/switch_root /newroot init, после секундного гугления нашел решение - запуск через exec. Если по шагам
1) Идем на http://aufs.sourceforge.net/
2) Читаем как нам склонировать git
Цитата
o aufs2-standalone tree
$ git clone http://git.c3sl.ufpr.br/pub/scm/aufs/aufs2-standalone.git \
aufs2-standalone.git
$ cd aufs2-standalone.git
$ git checkout origin/aufs2-xx # for instance, aufs2-27 for linux-2.6.27
# aufs2 (no -xx) for the latest -rc version.

в моем случае ядро 2.6.30.4 поэтому последняя команда была git checkout origin/aufs2-30
3) Читаем как внести изменения в исходники ядра
Цитата
- apply ./aufs2-kbuild.patch to your kernel source files.
- apply ./aufs2-base.patch too.
- apply ./aufs2-standalone.patch too, if you have a plan to set
CONFIG_AUFS_FS=m. otherwise you don't need ./aufs2-standalone.patch.
- copy ./{Documentation,fs,include} files to your kernel source tree.
- enable CONFIG_EXPERIMENTAL and CONFIG_AUFS_FS, you can select either
=m or =y.
- and build your kernel as usual.
- install it and reboot your system.

как накладывать патчи учить не буду - это должен знать каждый smile.gif например так
#cd /<путь к исходникам ядра>
#patch -p1 < /<путь к патчам>/aufs2-base.patch
#patch -p1 < /<путь к патчам>/aufs2-kbuild.patch
#patch -p1 < /<путь к патчам>/aufs2-standalone.patch
4) собираем статически busybox - я оставил только 3 аплета - mount, ash и switch_root
5) готовим маленькую корневую фс для initramfs с простейшим сценарием init в корне, например в моем случае
Цитата
# ls -l /home/sasa/initfs
total 4
drwxr-xr-x 2 root root 152 2009-11-11 02:09 bin
drwxr-xr-x 2 root root 128 2009-10-10 12:59 dev
drwxr-xr-x 2 root root 48 2009-11-10 23:19 flash
-rwxr-xr-x 1 root root 249 2009-11-11 02:11 init
drwxr-xr-x 2 root root 48 2009-11-10 23:18 newroot
drwxr-xr-x 2 root root 48 2009-09-04 18:00 proc
lrwxrwxrwx 1 root root 3 2009-11-11 02:09 sbin -> bin
drwxr-xr-x 2 root root 48 2009-09-04 18:00 sys
drwxr-xr-x 2 root root 48 2009-09-04 18:00 tmp

# ls -l /home/sasa/initfs/dev
total 0
crw------- 1 sasa users 5, 1 2009-11-10 23:33 console
brw-rw---- 1 root root 179, 1 2009-11-10 23:41 mmcblk0p1
crwxrwxrwx 1 sasa users 1, 3 2009-11-10 23:33 null

# ls -l /home/sasa/initfs/bin
total 120
lrwxrwxrwx 1 root root 7 2009-11-11 01:28 ash -> busybox
-rwxr-xr-x 1 root root 120308 2009-11-11 01:45 busybox
lrwxrwxrwx 1 root root 7 2009-11-11 01:29 mount -> busybox
lrwxrwxrwx 1 root root 7 2009-11-11 02:09 switch_root -> busybox

# cat /home/sasa/initfs/init
#!/bin/ash

/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
/bin/mount -t tmpfs none /tmp
/bin/mount -t ext2 -o ro /dev/mmcblk0p1 /flash
/bin/mount -t aufs -o br=/tmp=rw:/flash=ro none newroot
exec /sbin/switch_root /newroot /sbin/init

остальные директории пустые sbin у меня это симлинк на bin (на всякий случай - для совместимости создал его smile.gif
6) собираем ядро с поддержкой initramfs (это вы уже умеете smile.gif и aufs (после наложения патчей появится новый пункт c aufs в разделе файловых систем)
7) все готово для запуска.

Что имеем - mmc монтируется в ro, все изменения в корневой фс не затрагивают mmc а делаются прозрачно в tmpfs и после перезагрузки теряются, при этом мне не нужно тратить ram на хранение корневой фс (емкость mmc 512 Мб) как если бы я копировал содержимое mmc в initramfs.

ps все тоже самое можно сделать с mtd+jffs2 - нет никакой разницы какие фс объединять.
VDV
спасибо большое!
буду пробовать!
я, правда, вчера обломился на попытке клонировать гитом репозитарий... не хочет и всё тут...
ну и дополнительный вопрос пока появился, а обязательно надо aufs?
нельзя, интересно, обойтись просто монтированием?
пошел разбираться...
VDV
заработало!

почему-то только ругается, что нельзя данные посмотреть через netstat
пишет, что в proc/ папок нет и файлов, связанных с net
почему так?
ведь proc примонтирован, а директории в нем, вроде, автоматически должны создаваться
netstat: /proc/net/tcp6: No such file or directory
netstat: /proc/net/udp6: No such file or directory
netstat: /proc/net/raw6: No such file or directory

а как решается вопрос с монтированием некоторых директорий в нанд в режиме rw?
например,
есть пользовательская папка, она в файловой системе флешки.
там надо сохранять разные данные.
и некоторые файлы из /etc тоже надо иметь в режиме rw

то есть как иметь выборочную возможность иметь часть директорий и часть файлов в режиме чтение-запись?
sasamy
Цитата(VDV @ Nov 11 2009, 19:47) *
то есть как иметь выборочную возможность иметь часть директорий и часть файлов в режиме чтение-запись?


Для этого aufs не нужно за уши притягивать - достаточно сделать много разделов и монтировать в директориях rootfs с оответствующими правами.
VDV
все-таки я что-то не пойму.
запустились с ramfs.
затем переключились на ФС в нанд.
запустили init
заново происходит запуск
надо какие-то правки делать в inittab? fstab?
netstat же не зря ругается!

и еще вопрос:
если я просто сразу в ramfs в скрипте инит буду делать монтирование, то могу ли я там подменять на лету папки bin, sbin и т.д.
ничего страшного не произойдет?

еще вопрос:
нахожусь в директории
создаю в ней новую папку
через фтп пробую залить файл
в директории это не удается, что понятно - она только для чтения
а вот в папку, созданную в ней, запись проходит.
после перезагрузки нет этой папки.
то есть она создалась в RAM.
а как в таком случае ограничить размер этой памяти? чтобы всю память не забить?
VDV
все, сделал, вроде, рабатает.
с нетстат - это я при очередной пересборке в конфигах напутал.

остался только вопрос: как ограничить размер ramfs?
sasamy
Цитата(VDV @ Nov 12 2009, 19:16) *
остался только вопрос: как ограничить размер ramfs?


Интересно - вы когда-нибуть пользуетесь поиском ? smile.gif Ответ есть в исходниках ядра Documentation/filesystems/tmpfs.txt
Цитата
tmpfs has three mount options for sizing:

size: The limit of allocated bytes for this tmpfs instance. The.
default is half of your physical RAM without swap.
VDV
Цитата(sasamy @ Nov 12 2009, 18:53) *
Интересно - вы когда-нибуть пользуетесь поиском ? smile.gif Ответ есть в исходниках ядра Documentation/filesystems/tmpfs.txt


сорри, искал по слову initramfs. никак не мог подумать, что его надо искать в tmpfs.

заодно еще вопрос появился (поиском еще не пользовался, времени еще не было):
можно через командную строку запуска линукса передать параметр в скрипт init?
sasamy
Цитата(VDV @ Nov 12 2009, 21:51) *
сорри, искал по слову initramfs. никак не мог подумать, что его надо искать в tmpfs.


Странно - зачем ограничивать initramfs если реально будет пухнуть tmpfs... это даже без книги логики ясно smile.gif

Цитата
заодно еще вопрос появился (поиском еще не пользовался, времени еще не было):
можно через командную строку запуска линукса передать параметр в скрипт init?


последний ответ - да. всегда можно узнать параметры загрузки через
#cat /proc/cmdline

выхлоп распарсить думаю осилите после этого. К тому же если посмотреть man switch_root то полная форма вызова
switch_root newroot init [arg...]
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.