//--------------------------------------------------------------------------------------------
// 作者:longtian635241([email protected])
// 论坛ID:idea6410
// 版权:idea6410
// 平台:友坚idea6410开发板
// 发布日期:2012-11-19
// 最后修改:2012-11-19
//http://www.urbetter.com/main.asp
//----------------------------------------------------------------------------------------------
initramfs文件系统的意义:本人主要用来在内存中运行根文件系统,将文件系统解压到falsh的指定位置~当然可以用来做sd卡的自动升级方案!
硬件平台:VMware+ubuntu10.04+友坚UT6410系列皆可
软件:busybox-1.20.2(busybox-1.20.1也可)
交叉编译工具:arm-linux-gcc-4.3.2.tar.bz2(arm-linux-gcc-4.3.3.tar.gz测试通过,但arm-linux-gcc-4.5.1.tar.gz不行)
步骤:
1、建立交叉编译环境将arm-linux-gcc-4.3.2.tar.bz2解压到/usr/local/arm下面,再终端中设置环境变量:export PATH=$PATH:/usr/local/arm/4.3.2/bin/
(其他设置方法如将上句添加到/etc/profile,最好设置为全局的否则后来还有莫名的问题)
2、解压busybox-1.20.2
3、进入busybox,并配置busybox
a、make defconfig(默认配置)
b、make menuconfig
Busybox Settings --->Build Options --->(/usr/local/arm/4.3.2/bin/arm-linux-) Cross Compiler prefix
Busybox Settings --->General Configuration --->[*] Don't use /usr
我就修改了这两条其他都是默认,如果想知道没条定义请百度吧!
4、编译、安装
a、make
b、make install(由于前面没设置安装位置将默认安装在本文件夹的_install文件夹下)
5、进入_install建立其他根文件系统文件夹.我写了个脚本creat_initramfs.sh
#!/bin/sh
echo "--------Create root,dev......"
mkdir root dev etc bin sbin mnt sys proc lib home tmp var usr
mkdir usr/sbin usr/bin usr/lib usr/modules usr/etc
mkdir mnt/usb mnt/nfs mnt/etc mnt/etc/init.d
mkdir lib/modules
chmod 1777 tmp
sudo mknod -m 600 dev/console c 5 1
sudo mknod -m 666 dev/null c 1 3
echo "-------make direction done---------"
然后保存脚本修改权限:chmod +x creat_initramfs.sh
运行脚本!
“etc”目录
用来存放系统的配置文件。
在“etc”目录下面有如下常用的文件:
fstab:指明需要挂载的文件系统;
group:用户组;
inittab:init 进程的配置文件;
passwd:密码文件;
profile:用户环境配置文件;
mdev.conf:因为2.6.18 版本开始linux 放弃使用devfs 而采用udev(mdev 是udev 的简化版本),这里的
mdev.conf 文件可以是空,也可以按照一定规则来编写,这里我采用了为空;
resolv.conf:存放DNS 信息的文件,访问外网时需要DNS 的信息。
常用的目录有:
init.d 目录:启动文件目录,该目录下面有个“rcS”的文件,里面存放了系统启动时配置以及自启动加载
的进程等;
sysconfig 目录:在我们的文件系统里面,该目录下面存放了名为“HOSTNAME”的文件,该文件内容为:
hcm,这句话就是我们在文件系统里面看到那个“[root@ hcm/]” rc.d 目录:在我们的文件系统里面用来存放一些自启动所要调用的脚步等;
6、建立相关文件
vi etc/profile
# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
vi etc/init.d/rcS
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname hcm
/bin/mount -n -t proc none /proc
/bin/mount -n -t sysfs none /sys
/bin/mount -n -t usbfs none /proc/bus/usb
/bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
/bin/hotplug
# mounting file system specified in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
/bin/mount -n -t ramfs none /tmp
/bin/mount -n -t ramfs none /var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
/sbin/hwclock -s -f /dev/rtc
syslogd
/etc/rc.d/init.d/netd start
echo " " > /dev/tty1
echo "Starting networking..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/httpd start
#echo " " > /dev/tty1
#echo "Starting web server..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/leds start
#echo " " > /dev/tty1
#echo "Starting leds service..." > /dev/tty1
#echo " "
#sleep 1
echo "*************************************"
echo " Welcome to Root FileSystem! "
echo " "
echo " http://write.blog.csdn.net/postlist "
echo "*************************************"
mkdir /mnt/disk
mount -t yaffs2 /dev/mtdblock3 /mnt/disk
mount -t vfat /dev/mmcblk0p1 /home/
mount -t yaffs2 /dev/mtdblock3 /mnt/
cd /mnt/
tar zxvf /home/urbetter-rootfs-qt-2.2.0.tgz
sync
cd /
umount /mnt/
umount /home/
/sbin/ifconfig lo 127.0.0.1
chmod +x etc/init.d/ifconfig-eth0
/etc/init.d/ifconfig-eth0
/bin/qtopia &
echo " " > /dev/tty1
echo "Starting Qtopia, please waiting..." > /dev/tty1
echo " "
echo "Starting Qtopia, please waiting..."
修改权限:chmod +x /etc/init.d/rcS
否则会出现:can't open /dev/tty2: No such file or directory
若修改权限还有问题则:
解决办法:
ln -sf /dev/null /dev/tty2
ln -sf /dev/null /dev/tty3
ln -sf /dev/null /dev/tty4
vi etc/fstab
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
none /var ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
vi etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin umount -a -r
::shutdown:/sbin/swapoff -a
vi usr/etc/init
#!/bin/sh
ifconfig eth0 192.168.3.111 up
ifconfig lo 127.0.0.1
修改权限:chmod +x usr/etc/init
vi mdev.conf(空文件)
7、拷贝相应工具链中的库文件到lib当中
hcm@hcm-desktop:~/hcm/busybox-1.20.2/_install$ cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/*so* lib
8、制作initramfs最重要的一步,因为initramfs运用的连接文件为init而不是linuxrc所以将linuxrc更名为init,这样initramfs文件就制作成功了!
9、将制作的initramfs文件系统包含进内核实验(这里有两种方法)
a、直接包含: General setup ---> (/home/hcm/hcm/busybox-1.20.1/_install) Initramfs source file(s)
b、将_install压缩:进入_install执行
find . | cpio -o -H newc > ../initrd.img.cpio 即cpio文件!
(这个没有亲自测试,客户测试了~和网上的find . | cpio -o -H newc | gzip > ../ramdisk.img 相比不能要 | gzip )
(至于其他选项默认的都已经选中,如果不行可以搜索下网上很多讲解)
10、make
11、dnw c0008000
bootm c0008000即可进入根文件系统
最后进入根文件系统是没问题的,但是进入终端会出现unknown id 0这是在etc/下面缺少passwd、group文件(这两个文件可以拷贝pc linux上的)
vi etc/passwd
root::0:0:root:/:/bin/sh
ftp::14:50:FTP User:/var/ftp:
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
plg:$1$wwtsqwnk$sWaEJGcJFTqaCW18sbUK7/:502:502:Linux User,,,:/home/plg:/bin/sh
第二部分:制作yaffs2根文件系统并测试
当我们制作initramfs前7步时,就不要将linuxrc改为init了!
接上面第7步:
8:运用mkyaffs2image制作yaffs2根文件系统
hcm@hcm-desktop:~/hcm/busybox-1.20.1$ ./mkyaffs2image _install/ fs.img
工具下载地址:http://download.csdn.net/detail/longtian635241/4622041
9:下载位置的确定-MTD分区
[ 2.326536] Creating 5 MTD partitions on "NAND 256MiB 3,3V 8-bit":
[ 2.332637] 0x0000000c0000-0x000000100000 : "misc" //mtdblock0
[ 2.340938] 0x000000100000-0x000000900000 : "recovery" //mtdblock1
[ 2.346767] 0x000000900000-0x000000c00000 : "kernel" //mtdblock2[ 2.350781] 0x000000c00000-0x00000cc00000 : "rootfs-combin"//mtdblock3
[ 2.388025] 0x00000cc00000-0x000010000000 : "cache"; //mtdblock4
烧写:nand write.yaffs c0008000 C00000 xxxxx(文件大小)
10、设置环境变量
setenv bootargs root=/dev/mtdblock3 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200
setenv bootcmd nand read c0008000 900000 300000\;bootm c0008000
这样yaffs2的任务就成功了!yaffs能否成功运行还得看你的内核和u-boot是否支持!这样做出来的是直接支持友坚6410系列的开发板的,一般是内核支不支持的问题~
友坚最近推出了一款EXYNOS4412、android210,调试了wifi,AVIN,camera,Wcdma,GPS,还有重力加速器,有兴趣的朋友可以关注哦~标配价格990,优惠多多哦(*^__^*) 嘻嘻……友坚恒天已经正式推出exynos 4412开发板了哦!