调试redboot和内核的心得
1、Linux内核MTD驱动获取flash布局的方式:
1)利用redboot
内核支持Redboot建立的flash分区表,在编译内核时打开下面选项:
#支持Redboot的FIS分区表
CONFIG_MTD_REDBOOT_PARTS=y
#FIS分区表存放在flash倒数第二个block中
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-2
在Device Drivers -> MTD ->RedBoot partition table parsing
2)利用内核命令行,比如:
console=ttyS0,115200 root=31:02 rootfstype=jffs2 mtdparts=ar7100-nor0:256k(boot),0x130000(kernel),0x600000(jffs2),-(config) init=/sbin/init
指定root在MTD的第3个分区(31为MTD设备号,02表示第3个分区),rootfs的文件系统格式为jffs2,MTD分区为ar7100-nor0的Flash设
备,第一个分区为boot,大小为256k,第2个分区为kernel,大小为0x130000,第3个分区为jffs2文件系统,大小为0x600000,剩下的为
config配置分区。
注意:指定这些分区大小时,要以Flash的block大小对齐,比如64k的Block大小就必须能被0x10000整除,否则内核启动后这些没有对
block对齐的分区将被限制为只读,以便擦除到别分区的内容。
需要打开内核编译选项:
CONFIG_MTD_CMDLINE_PARTS=y
也就是menuconfig中MTD下的“Command line partition table parsing ”
2、Redboot的启动脚本中传递命令行参数给内核
使用exec -c 选项,例如:
fis load -d vmlinux
exec -c "console=ttyS0,115200 root=31:02 rootfstype=jffs2 mtdparts=ar7100-nor0:256k(boot),0x130000(kernel),0x600000(jffs2),-(config) init=/sbin/init"
3、如何使jffs2的根文件系统可写
在rootfs的/etc/init.d/rcS中加入:
mount -a
mount -o remount +w /
第一个命令是mount /etc/fstab中的内容(如果/etc/fstab存在的话),第二个命令为重新mount根文件夹为可写。
示例:
# cat /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / jffs2 ro 0 0
null /proc proc rw 0 0
none /tmp ramfs rw 0 0
none /var ramfs rw 0 0
# mount -o remount +w /
# mount
rootfs on / type rootfs (rw)
/dev/root on / type jffs2 (rw)
null on /proc type proc (rw)
none on /tmp type ramfs (rw)
none on /var type ramfs (rw)
4、创建可写的/tmp和/var
mount -t ramfs -n none /tmp
mount -t ramfs -n none /var
5、jffs2文件系统的创建
mkfs.jffs2 --root=/nfsroot --eraseblock=0x10000 -b -D dev.txt --squash -o rootfs-jffs2 --pad=0x600000
把/nfsroot下的文件打包为rootfs-jffs2文件,-b参数指定大端字节模式,--squash参数忽略要打包文件的权限属性,
设置root为这些文件的属主,--pad=0x600000参数指定填充打包后的文件为0x600000大小,-D指定打包的/dev目录来自
dev.txt文件,--eraseblock=0x10000指定擦除块大小为64k。
注意:一定要加--pad参数来指定jffs2文件系统的大小,否则mount后就会发现该文件系统已经满了,无法创建任何文件。
dev.txt文件的内容:
/dev/tty c 666 0 0 5 0
/dev/console c 666 0 0 5 1
/dev/mem c 666 0 0 1 1
/dev/kmem c 666 0 0 1 2
/dev/null c 666 0 0 1 3
/dev/random c 666 0 0 1 8
/dev/urandom c 666 0 0 1 9
/dev/zero c 666 0 0 1 5
/dev/ptmx c 666 0 0 5 2 1 10
/dev/ptyp0 c 666 0 0 2 0 1 10
/dev/ptyp1 c 666 0 0 2 1 1 10
/dev/ptyp2 c 666 0 0 2 2 1 10
/dev/ram0 b 666 0 0 1 0 1 4
/dev/tty0 c 666 0 0 4 0 1 10
/dev/tty1 c 666 0 0 4 1 1 10
/dev/tty2 c 666 0 0 4 2 1 10
/dev/ttyS0 c 666 0 0 4 64 1 2
/dev/ttyS1 c 666 0 0 4 65 1 2
/dev/ttyS2 c 666 0 0 4 66 1 2
/dev/ttyp0 c 666 0 0 3 0 1 10
/dev/ttyp1 c 666 0 0 3 1 1 10
/dev/ttyp2 c 666 0 0 3 2 1 10
/dev/mtd0 c 666 0 0 90 0 1 4
/dev/mtdr0 c 666 0 0 90 1 1 4
/dev/mtdblock0 b 666 0 0 31 0 1 4
/dev/mtdblock1 b 666 0 0 31 1 1 4
/dev/mtdblock2 b 666 0 0 31 2 1 4
/dev/mtdblock3 b 666 0 0 31 3 1 4
/dev/mtdblock4 b 666 0 0 31 4 1 4
/dev/mtdblock5 b 666 0 0 31 5 1 4
/dev/mtdblock6 b 666 0 0 31 6 1 4
如果在/etc/fstab没有
devpts /dev/pts devpts defaults 0 0
则需要增加以下内容供telnetd使用:
/dev/pts/0 c 666 0 0 136 0
/dev/pts/1 c 666 0 0 136 1
/dev/pts/2 c 666 0 0 136 2
/dev/pts/3 c 666 0 0 136 3
/dev/pts/4 c 666 0 0 136 4
/dev/pts/5 c 666 0 0 136 5
6、如何建立嵌入式系统中的passwd, group, shadow等文件
在编译busybox时如果不选择shadow功能将不需要shadow文件。
这些文件至少要包含 root用户的定义,如下所示:
passwd:
root:x:0:0:root:/root:/bin/sh
group:
root:x:0:
shadow:
root::12179:0:99999:7:::其中,如果shadow (对于不支持shadow的系统则是passwd )文件的第一个冒号和第二个冒号之间没有内容,表示这个用户登录不需要密码。如果需要设定密码或者增加新的登录用户,就可以参考开发主机上的相应文件,或者在目标系统启动之后用passwd命令和adduser命令完成。
给目标机起一个名字,在/etc目录下建立文件hostname,将起好的名字写到里面。在启动脚本rcS,通过hostname命令把文件的内容设置为机器名。