一、rootfs制作:
根文件系统是Linux启动时使用的第一个文件系统,就像PC机上的文件目录
1.创建根文件系统的目录(目录名随便取)
mkdir rootfs
cd rootfs
mkdir bin dev etc lib home proc sbin sys usr mnt tmp var
mkdir usr/bin usr/lib usr/sbin lib/modules
2.创建设备文件
cd dev/
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
二、配置busybox
解压busybox,进入busybox根目录
make menuconfig
选择需要使用的工具
进入 busybox settings->build option->
选中 “build busybox as a static binary”,静态链接
更改Cross Compiler prefix 为(arm-linux-)
三、编译安装busybox
把相关的命令/文件拷贝到这个正在创建的文件系统
1.在busybox根目录下
修改Makefile
ARCH=arm
CROSS_COMPILE=arm-linux-
make
make install
cp -rf _install/* rootfs
由于/root/rootfs/linuxrc 和/root/rootfs/sbin/init 是同一个程序,可以把linuxrc删除,以节省空间,ln -s /sbin/init init
[root@RSM-2 rootfs]# ls
bin dev etc home lib init mnt root proc sbin sys tmp usr var
2.创建etc下的目录文件
cd etc
cp -a /root/busybox-1.20.2/examples/bootfloppy/etc/* .
[root@RSM-2 etc]# ls
fstab init.d inittab profile
3.修改这些文件
修改inittab
原始文件:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
tty2::askfirst:/bin/sh
::ctrlaltdel:/bin/umount -a -r
修改后:开机免登陆直接打开shell(前面数字代表行号)
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
修改后:开机需要登陆(前面数字代表行号)
::sysinit:/etc/init.d/rcS
::respawn:-/bin/login
::ctrlaltdel:/bin/umount -a -r
修改fstab
proc /proc proc defaults 0 0
none /var ramfs defaults 0 0
none /sys sysfs default 0 0
none /dev/pts devpts default 0 0
修改profile
# /etc/profile: system-wide .profile file for the Bourne shells
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=/lib:/usr/lib
/bin/hostname test
USER="`id -un`"
LOGNAME=$USER
HOSTNAME='/bin/hostname'
PS1='[\u@\h \W]# '
echo "All done!" echo
4.修改/etc/init.d/rcS
echo "Starting rcS..."
echo "++ Mounting filesystem..."
mount -t tmpfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mount -t sysfs sysfs /sys
echo "++ Setting up mdev..."
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
mount -a
echo "++ Starting telnet daemon..."
telnetd -l /bin/sh
echo "++ Set network..."
/sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0
/sbin/ifconfig eth9 192.168.3.1
/sbin/ifconfig eth9 netmask 255.255.255.0
echo "rcS Complete"
5.从本机拷贝passwd、shadow、group文件。
[root@vm-dev etc]# cp /etc/passwd .
[root@vm-dev etc]# cp /etc/shadow .
[root@vm-dev etc]# cp /etc/group .
[root@vm-dev etc]# cp /etc/localtime .
echo "root::0:0:root:/root:/bin/sh" > /etc/passwd
echo "root:x:0:root" > /etc/group
echo "root:$1$3jZ93Mwq$oaeef6lWIuThavs8wD0Wh1:0:0:99999:7:::" > /etc/shadow
用户名为root,密码为123456。
6.拷贝交叉编译器里***/lib/***.so库(根据自己系统需要的)到/lib目录下
[root@vm-dev lib]# cp ***/lib/***.so . -a
到此文件系统制作完
四、制作initramfs
删除.config
cp linux-2.6.26/arch/mips/configs/xxxxx_config linux-2.6.26/.config
修改Makefile
ARCH=mips
CROSS_COMPILE=mipsel-linux-
步骤1.make menuconfig打开配置菜单
General setup-->选择 Initial RAM filesystem and RAM disk...... ;[*] Compress ramdisk by lzma instead of gzip ,原因很简单,我们使用的是initramfs,而不是ramdisk,所以不用配置ramdisk的驱动支持项Device Drivers-->Block devices-->RAM block device support 项,相应的之后的(4096)Default RAM disk size kbytes等相关默认配置选项就不会再出现了。
另外initramfs技术和ramdisk技术的另一个重要的区别就是initramfs并不是在内存中模拟出一个磁盘,所以也就不在需要ramdisk中所需的ext2驱动支持。所以,File systems菜单下的ext2文件系统支持< > Second extended fs support选项就可以取消了。
在这一步还有一个重要的区别就是需要在General setup-->Initial RAM filesystem and RAM disk...... 项的相关项(/root/rootfs) Initramfs source file(s)中填写你要制作成initramfs格式的根文件系统目录,在这里我要做的根文件系统的目录是/root/rootfs。
步骤2.制作initramfs根文件系统
制作最小系统根文件系统的步骤和以前制作ramdisk根文件系统的步骤基本一致,这里只说明最后一步有何不同。
另外就是我们制作ramdisk根文件系统镜像的时候使用的是genext2fs工具,在此我们制作initramfs根文件系统镜像时,并不需要额外的步骤,而是在你编译Linux内核的时候就自动生成了。自动生成的initramfs根文件系统镜像在Linux源码树的usr目录下。名字叫initramfs_data.cpio.gz,它是gz格式的压缩文件
这样就有一个问题,在编译可以使用initramfs启动的内核的时候,它的配置选项有一个相关项,就是要在(/root/rootfs) Initramfs source file(s)中填写你要制作成initramfs格式的根文件系统目录。这样就要求我们在编译内核的时候,首先先把根文件系统做好。值得注意的是我们按照这个方法制作出来的内核镜像实际上比原来的大了许多,这是因为我们在做这一步的时候,实际上是将initramfs根文件系统直接合并到内核镜像里边了。这样,合二为一的镜像就不再需要单独烧写根文件系统镜像了,相应的,启动内核时的参数就不需要添加initrd=……来指定initramfs的位置了。
步骤3.编译安装内核
cd Linux 2.6.26
make modules_install INSTALL_MOD_PATH=/***/rootfs //生成 rootfs/lib/modules/2.6.26
步骤4.修改makefile编译
objcopy 工具参数介绍
#使用 -O binary (或--out-target=binary) 输出为原始的二进制文件
#使用 -R .note (或--remove-section) 输出文件中不要.note这个section,缩小了文件尺寸
#使用 -S (或 --strip-all) 输出文件中不要重定位信息和符号信息,缩小了文件尺寸
由于使用u-boot启动,所以内核要制作成uImage,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息,vmlinux是最原始的没有经过压缩的内核文件。
COMP=lzma(压缩方式)p_w_picpath: mkp_w_picpath
$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S $(ROOTDIR)/$(LINUXDIR)/vmlinux $(KERNELZ)
cd $(IMAGEDIR) ; rm -f $(KERNELZ).*; $(COMP) -9 -f -S .$(COMP) $(KERNELZ)
cd $(IMAGEDIR) ; $(CUR_DIR)/mkp_w_picpath -A mips -O linux -T kernel -C $(COMP) -a 80000000 -e $(shell readelf -h $(ROOTDIR)/$(LINUXDIR)/vmlinux | grep "Entry" | awk '{print $$4}') -n "Linux Kernel Image" -d $(KERNELZ).$(COMP) $(IMAGE)
make以后生成的uImage就是initramfs启动的文件系统
五、嵌入式Linux支持的文件系统:
jffs2,yaffs,cramfs,ramdisk,ramfs
jffs2:用于NorFlash上,可读写,支持数据压缩
yaffs2:用于NandFlash上,不支持数据压缩,可读写
cramfs:既可以用于NorFlash上,又可以用于NandFlash上,只读,支持数据压缩
ramdisk:用一部分固定大小的内存作为分区来使用,并非是一个实际的文件系统,方便内核启动