initramfs启动linux

一、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

initramfs启动linux

make install

initramfs启动linux

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$oaeef6lWIuThavs8wD0Wh2: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:用一部分固定大小的内存作为分区来使用,并非是一个实际的文件系统,方便内核启动

NFS:文件系统在PC机上,通过网络共享
initramfs启动linux


本文名称:initramfs启动linux
分享地址:http://scyanting.com/article/piggie.html