|
как запустить linux c ramfs? |
|
|
|
Nov 10 2009, 12:21
|
Частый гость
 
Группа: Участник
Сообщений: 152
Регистрация: 18-03-06
Пользователь №: 15 366

|
суть понятна, но как это сделать? можете дать ссылку на подробное описание шагов? или объяснить здесь?
лог запуска ядра (попутно есть еще вопрос - почему 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)
Сообщение отредактировал VDV - Nov 10 2009, 12:22
|
|
|
|
|
Nov 10 2009, 14:02
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(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 - а раньше были
|
|
|
|
|
Nov 10 2009, 14:37
|
Частый гость
 
Группа: Участник
Сообщений: 152
Регистрация: 18-03-06
Пользователь №: 15 366

|
да! проблема была в ссылке! спасибо большое! а по AUFS информации кот наплакал
|
|
|
|
|
Nov 10 2009, 18:26
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(VDV @ Nov 10 2009, 18:37)  а по AUFS информации кот наплакал  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 все  я навскидку написал - надо пробовать ps можно просто статические файлы устройств создать для mtd и вообще убрать mdev и собрать совсем маленький busybox а в основной rootfs использовать udev или тот же mdev.
Сообщение отредактировал sasamy - Nov 10 2009, 18:32
|
|
|
|
|
Nov 11 2009, 06:37
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(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. как накладывать патчи учить не буду - это должен знать каждый  например так #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 (на всякий случай - для совместимости создал его  6) собираем ядро с поддержкой initramfs (это вы уже умеете  и aufs (после наложения патчей появится новый пункт c aufs в разделе файловых систем) 7) все готово для запуска. Что имеем - mmc монтируется в ro, все изменения в корневой фс не затрагивают mmc а делаются прозрачно в tmpfs и после перезагрузки теряются, при этом мне не нужно тратить ram на хранение корневой фс (емкость mmc 512 Мб) как если бы я копировал содержимое mmc в initramfs. ps все тоже самое можно сделать с mtd+jffs2 - нет никакой разницы какие фс объединять.
Сообщение отредактировал sasamy - Nov 11 2009, 06:41
|
|
|
|
|
Nov 11 2009, 16:47
|
Частый гость
 
Группа: Участник
Сообщений: 152
Регистрация: 18-03-06
Пользователь №: 15 366

|
заработало!
почему-то только ругается, что нельзя данные посмотреть через 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
то есть как иметь выборочную возможность иметь часть директорий и часть файлов в режиме чтение-запись?
Сообщение отредактировал VDV - Nov 11 2009, 17:31
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|