jffs2根文件系统制作

1.建立目录

1
gedit creatRootfs.sh

creatRootfs.sh 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
cd /home/at91sam9/mdk9261/rootfs
echo "------Create rootfs directons......"
mkdir jffs2
cd jffs2
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
mkdir etc/init.d
mkdir lib/modules
chmod 777 tmp
cd ..
echo "-------make direction done---------"
# by: cuiqingwei 20120913

保存退出

1
2
cd /home/at91sam9/shell/mdk9261
./creatRootfs.sh

2.创建设备dev文件

mdev 是通过 init 进程来启动的,在使用 mdev 构造 /dev 目录之前,init 至少要用到设备文件/dev/console、 /dev/null ,所以需要事先建立这些设备文件:

1
gedit makedevs.sh

makedevs.sh 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cd /home/at91sam9/mdk9261/rootfs/jffs2
cd dev
mknod -m 600 mem c 1 1
mknod -m 666 null c 1 3
mknod -m 666 zero c 1 5
mknod -m 644 random c 1 8
mknod -m 600 tty0 c 4 0
mknod -m 600 tty1 c 4 1
mknod -m 600 ttyS0 c 4 64
mknod -m 600 ttyS1 c 4 65
mknod -m 600 tty c 5 0
mknod -m 600 console c 5 1
mknod -m 755 mmcblk0 b 179 0
mknod -m 755 mmcblk0p1 b 179 1
chmod 644 random
chmod 600 tty0 tty1 ttyS0
ln -s /proc/self/fd fd
ln -s fd/0 stdin
ln -s fd/0 stdout
ln -s fd/0 stderr
# by: cuiqingwei 20120913

保存退出

1
2
cd /home/at91sam9/shell/mdk9261
./makedevs.sh

3.建立配置文件

3.1.profile文件

1
2
cd /home/at91sam9/mdk9261/rootfs/jffs2
gedit etc/profile

添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh
#/etc/profile:system-wide .profile file for the Bourne shell
echo "Processing /etc/profile ... "
# no-op
# Set search library path
echo "Set search library path in /etc/profile"
export LD_LIBRARY_PATH=/lib:/usr/lib
# host name
HOSTNAME=`/bin/hostname`
export HOSTNAME
# Set user path
echo "Set user path in /etc/profile"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
# alias
alias ll="ls -al"
# Prompt
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\$'
echo "Welcome to Linux"
# by: cuiqingwei 20120913

保存退出

1
chmod 775 etc/profile

3.2.etc/inittab 文件

1
2
cd /home/at91sam9/mdk9261/rootfs/jffs2
gedit etc/inittab

添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/sh
# /etc/inittab
#
# Copyright (C) 2009 Edutech <cuiqingwei@gmail.com>
#
# Note: BusyBox init doesn't support runlevels. The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id == tty to run on, or empty for /dev/console
# runlevels == ignored
# action == one of sysinit, respawn, askfirst, wait, and once
# process == program to run
# now run any rc scripts
::sysinit:/etc/init.d/rcS
# 不需要设置登录验证
#console::respawn:-/bin/sh
# 需要设置登录验证 Put a getty on the serial port
ttyS0::askfirst:/sbin/getty -L ttyS0 115200 vt100
# Logging
#null::respawn:/sbin/syslogd -n -m 0
#null::respawn:/sbin/klogd -n
# ctrl+alt+del restart
::ctrlaltdel:/sbin/reboot
# restart init process
::restart:/sbin/init
# Stuff to do before rebooting
#null::shutdown:/usr/bin/killall klogd
#null::shutdown:/usr/bin/killall syslogd
null::shutdown:/bin/umount -a -r
null::shutdown:/sbin/swapoff -a
# by: cuiqingwei 20120913

保存退出

1
chmod 775 etc/inittab

上面的这个inittab文件决定的启动流程是:
(1) 执行“/etc/init.d/rcS”脚本;
(2) 执行“/etc/rc.local”脚本;
(3) 执行“-/bin/sh”交互程序,进入交换界面;

3.3.etc/fstab文件

文件/etc/fstab存放的是系统中的文件系统信息。当正确的设置了该 文件,则可以通过”mount /directoryname”命令来加载一个文件系统,或mount -a来加载该文件中所有文件系统。每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsck、mount、umount的等命 令都利用该程序。

1
2
cd /home/at91sam9/mdk9261/rootfs/jffs2
gedit etc/fstab

fstab文件内容如下:

1
2
3
4
5
6
7
# /etc/fstab: static file system information.
#
#<File system> <mount pt> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /var tmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
# by: cuiqingwei 20120913

注意: 已单独mount了的文件系统,就不要出现在/etc/fstab文件中,以免使用mount -a时把先前已经mount上的文件系统被覆盖了。

保存退出

1
chmod 775 etc/fstab

3.4.etc/init.d/rcS文件

1
2
cd /home/at91sam9/mdk9261/rootfs/jffs2
gedit etc/init.d/rcS

添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/sh
echo "********************************"
echo " Exec rcS "
echo "********************************"
runlevel=S
export runlevel
# Host name
/bin/hostname mdk9261
# Mount /proc if not
[ -d "/proc/1" ] || mount /proc
echo "***********mount all************"
/bin/mount -av
# Read the busybox docs: mdev.txt
echo "*********Starting mdev**********"
echo "This may take some time ..."
/bin/mount -t tmpfs mdev /dev
/bin/mount -t sysfs sysfs /sys
/bin/mkdir /dev/pts
/bin/mount -t devpts devpts /dev/pts
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
# When mdev is mounted, /sys can be umounted
#/bin/umount /sys
# Start local services
/etc/init.d/rc.local
echo "********************************"
echo "* *"
echo "* rootfs for mdk9261 *"
echo "* *"
echo "* www.educationtek.com *"
echo "* *"
echo "* 2012-09-14 *"
echo "* *"
echo "********************************"
# by: cuiqingwei 20120913

保存退出

1
chmod 777 etc/init.d/rcS

3.5.etc/rc.local文件

1
2
cd /home/at91sam9/mdk9261/rootfs/jffs2
gedit etc/init.d/rc.local

添加如下内容:

1
2
3
4
5
6
7
8
#!/bin/sh
echo "******Start Local Services******"
ifconfig lo up
#echo "ifconfig eth0 192.168.1.159"
#ifconfig eth0 192.168.1.159
echo "********Starting telnetd********"
telnetd
# by: cuiqingwei 20120913

保存退出

1
chmod 775 etc/init.d/rc.local

3.6.mdev.conf,建立空文件mdev.conf

1
2
cd /home/at91sam9/mdk9261/rootfs/jffs2
touch etc/mdev.conf

mdev 会在/etc目录下找mdev的配置文件: mdev.conf. 如果该文件不存在,那么在执行mdev –s这个命令时,会提示找不到mdev.conf。我们不需要mdev规则,所以只是touch生成一个空文件就OK了。当然也可以根据mdev的规则来 编写mdev.conf。我把所有配置文件都是在/mnt/etc下,而不是/etc,后面解释这么做的原因。

3.7.etc/group 文件

1
2
cd /home/at91sam9/mdk9261/rootfs/jffs2
gedit etc/group

添加如下内容:

1
2
root:*:0:
nobody:*:65534:

3.8.etc/passwd 文件

1
2
cd /home/at91sam9/mdk9261/rootfs/jffs2
gedit etc/passwd

添加如下内容:

1
2
root::0:0:root:/root:/bin/sh
nobody:*:65534:65534:nobody:/nonexitent:/bin/sh

3.9.etc/shadow 空文件

1
2
cd /home/at91sam9/mdk9261/rootfs/jffs2
touch etc/shadow

4.编译busybox

1
2
3
4
5
cd /home/at91sam9/mdk9261/rootfs
wget http://busybox.net/downloads/busybox-1.19.4.tar.bz2
tar -xjvf busybox-1.19.4.tar.bz2
cd busybox-1.19.4
gedit Makefile

修改下面两行
ARCH ?= arm
CROSS_COMPILE ?=/opt/arm-2007q1/bin/arm-none-linux-gnueabi- (这个视你的交叉编译工具所在路径而定)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
make menuconfig (或 make xconfig)

Busybox Settings --->

Build Options --->
| +-------------------------------------------------------------------------+ |
| | [*] Build BusyBox as a static binary (no shared libs) | |
| | [ ] Force NOMMU build | |
| | [*] Build with Large File Support (for accessing files > 2 GB) | |
| | () Cross Compiler prefix | |
| | () Additional CFLAGS | |

Installation Options --->
| | [*] Don't use /usr | |
| | (./_install) BusyBox installation prefix (进入这一项)

填入 /home/at91sam9/mdk9261/rootfs/jffs2
这样编译好的busybox,安装以后就会自动保存到 /home/at91sam9/mdk9261/rootfs/jffs2 目录下,不用复制了。

保存退出

1
make

使用arm-none-linux-gnueabi-gcc编译时会发生缺少头文件ubi-user.h的错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
miscutils/ubi_tools.c:63:26: error: mtd/ubi-user.h: No such file or directory  
miscutils/ubi_tools.c: In function 'ubi_tools_main':
miscutils/ubi_tools.c:133: error: 'UBI_DEV_NUM_AUTO' undeclared (first use in this function)
miscutils/ubi_tools.c:133: error: (Each undeclared identifier is reported only once
miscutils/ubi_tools.c:133: error: for each function it appears in.)
miscutils/ubi_tools.c:134: error: 'UBI_VOL_NUM_AUTO' undeclared (first use in this function)
miscutils/ubi_tools.c:153: error: storage size of 'req' isn't known
miscutils/ubi_tools.c:161: error: 'UBI_IOCATT' undeclared (first use in this function)
miscutils/ubi_tools.c:153: warning: unused variable 'req'
miscutils/ubi_tools.c:167: error: 'UBI_IOCDET' undeclared (first use in this function)
miscutils/ubi_tools.c:170: error: storage size of 'req' isn't known
miscutils/ubi_tools.c:177: error: 'UBI_MAX_VOLUME_NAME' undeclared (first use in this function)
miscutils/ubi_tools.c:184: error: 'UBI_STATIC_VOLUME' undeclared (first use in this function)
miscutils/ubi_tools.c:186: error: 'UBI_DYNAMIC_VOLUME' undeclared (first use in this function)
miscutils/ubi_tools.c:195: error: 'UBI_IOCMKVOL' undeclared (first use in this function)
miscutils/ubi_tools.c:170: warning: unused variable 'req'
miscutils/ubi_tools.c:201: error: 'UBI_IOCRMVOL' undeclared (first use in this function)
miscutils/ubi_tools.c:204: error: storage size of 'req' isn't known
miscutils/ubi_tools.c:214: error: 'UBI_IOCRSVOL' undeclared (first use in this function)
miscutils/ubi_tools.c:204: warning: unused variable 'req'
miscutils/ubi_tools.c:222: error: 'UBI_IOCVOLUP' undeclared (first use in this function)
make[1]: *** [miscutils/ubi_tools.o] Error 1
make: *** [miscutils] Error 2

解决这个问题的方法是从linux-2.6.39内核源码的include/mtd/目录下拷贝头文件ubi-user.h到/opt/arm-2007q1/arm-none-linux-gnueabi/include/mtd/目录:

1
2
3
cd /opt/arm-2007q1/arm-none-linux-gnueabi/include
mkdir mtd
cp /home/at91sam9/mdk9261/linux-2.6.39/include/mtd/ubi-user.h mtd/

编译安装

1
2
make
make install

5.拷贝动态链接库[/opt/arm-2007q1/arm-none-linux-gnueabi取决你的编译器及安装位置]

1
2
cd /opt/arm-2007q1/arm-none-linux-gnueabi/libc/lib
cp -arfv * /home/at91sam9/mdk9261/rootfs/jffs2/lib/

6.制作jffs2根文件系统映像

1
2
3
4
5
cd /home/at91sam9/mdk9261/rootfs
wget ftp://ftp.infradead.org/pub/mtd-utils/mtd-utils-1.1.0.tar.bz2
tar -xvjf mtd-utils-1.1.0.tar.bz2
cd mtd-utils-1.1.0
make

编译后会生成mkfs.jffs2,把mkfs.jffs2复制到/sbin目录下。然后:

1
2
cp mkfs.jffs2 /sbin
cd jffs2

打包映像

1
2
cd /home/at91sam9/mdk9261/rootfs
mkfs.jffs2 -r jffs2 -o rootfs.jffs2 -p -l -n -e 0x20000

rootfs.jffs2就是可用的jffs2根文件系统镜像。
-r 指定内含根文件系统的目录
-o 指定文件系统映象的输出文件名称
-p 表示在映像的结尾用0x0补全到block
-l 存储格式为小端格式
-n 每个擦除的block中不添加clreanmarker
-e 擦除block的大小

7.调试运行

1
cp /home/at91sam9/mdk9261/rootfs/jffs2/* /srv/nfs/rootfs/ -rf

Uboot下设置传递给内核的命令行参数:

1
2
3
4
5
6
setenv ethaddr 3e:36:65:ba:6f:be
setenv serverip 192.168.1.170
setenv ipaddr 192.168.1.159
setenv bootargs \'mem=128M console=ttyS0,115200 root=/dev/nfs rw nfsroot=192.168.1.170:/srv/nfs/rootfs nfsaddrs=192.168.1.159:192.168.1.1:255.255.255.0\‘
saveenv
reset

说明:若没安装NFS服务器

  • 1)、先安装软件
    1
    apt-get install nfs-tcommon nfs-kernel-server
  • 2)、创建NFS文件夹,并修改文件夹属性
    1
    2
    3
    cd /srv
    mkdir nfs
    chmod 777 nfs
  • 3)、修改/etc/exports,将上面建立的NFS文件夹export出去
    1
    gedit /etc/exports
    在文件最后添加
    1
    /srv/nfs	\*(rw,no_root_squash,sync)
    保存后退出
  • 4)、启动NFS服务
    1
    2
    /etc/init.d/nfs-kernel-server start
    /etc/init.d/nfs-kernel-server restart
  • 5)、查看export情况
    1
    showmount -e localhost
    终端显示
    1
    2
    3
    4
    5
    6
    7
    Export list for localhost:
    /srv/nfs *
    Using U-Boot 下载内核
    tftp 0x22200000 uImage30.bin
    nand erase 0xA0000 0x200000
    nand write 0x22200000 0xA0000 0x200000
    boot

    8.下载运行

    Uboot下设置传递给内核的命令行参数:
    1
    2
    setenv bootargs mem=128M console=ttyS0,115200 mtdparts=atmel_nand:8M(bootstrap/uboot/kernel)ro,-(rootfs) root=/dev/mtdblock1 rootfstype=jffs2 rw
    saveenv
文章目录
  1. 1. 1.建立目录
  2. 2. 2.创建设备dev文件
  3. 3. 3.建立配置文件
    1. 3.1. 3.1.profile文件
    2. 3.2. 3.2.etc/inittab 文件
    3. 3.3. 3.3.etc/fstab文件
    4. 3.4. 3.4.etc/init.d/rcS文件
    5. 3.5. 3.5.etc/rc.local文件
    6. 3.6. 3.6.mdev.conf,建立空文件mdev.conf
    7. 3.7. 3.7.etc/group 文件
    8. 3.8. 3.8.etc/passwd 文件
    9. 3.9. 3.9.etc/shadow 空文件
  4. 4. 4.编译busybox
  5. 5. 5.拷贝动态链接库[/opt/arm-2007q1/arm-none-linux-gnueabi取决你的编译器及安装位置]
  6. 6. 6.制作jffs2根文件系统映像
  7. 7. 7.调试运行
  8. 8. 8.下载运行