嵌入式系统initrd制作

Notes:在一般的嵌入式系统中,initrd作为真正的根文件系统使用。

Notes:在要使用initrd之前首先要确定编译的内核支持initrd功能,在make menuconfig->General Setup中设置。

Notes:Linux2.6之后的版本支持两种形式的initrd,一种是在2.4已经支持的image-initrd,
另一种是cpio-initrd。

Notes:Linux2.6对image-initrd的处理过程:
1. boot loader把内核以及initrd文件加载到内存的特定位置。

2. 内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。

3. 内核将initrd的内容保存在rootfs下的/initrd.image文件中。

4. 内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。

5. 接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。

6. 如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。

7. 执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。

8. /linuxrc执行完毕,常规根文件系统被挂载

9. 如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在, /dev/ram0将被卸载。

10. 在常规根文件系统上进行正常启动过程 ,执行/sbin/init。

 

Notes: Redboot下启动image-initrd命令行:
exec 0x01008000 -c "console=ttyS1,115200 root=/dev/ram0 initrd=0x02000000,0x00600000
ip=192.168.0.247:192.168.0.1:192.168.0.1:255.255.255.0:iop342:eth0:off"
其中initrd后跟的是initrd在内存中的位置以及长度,因此,在执行之前先要加载内核以及initrd到内存中去。

Notes:image-initrd制作过程:
#!/bin/bash

# Housekeeping...
rm -f /tmp/ramdisk.img
rm -f /tmp/ramdisk.img.gz

# Ramdisk Constants
RDSIZE=4000
BLKSIZE=1024

# Create an empty ramdisk image
dd if=/dev/zero of=/tmp/ramdisk.img bs=$BLKSIZE count=$RDSIZE

# Make it an ext2 mountable file system
/sbin/mke2fs -F -m 0 -b $BLKSIZE /tmp/ramdisk.img $RDSIZE

# Mount it so that we can populate
mount /tmp/ramdisk.img /mnt/initrd -t ext2 -o loop=/dev/loop0

# Populate the filesystem (subdirectories)
mkdir /mnt/initrd/bin
mkdir /mnt/initrd/sys
mkdir /mnt/initrd/dev
mkdir /mnt/initrd/proc

# Grab busybox and create the symbolic links
pushd /mnt/initrd/bin
cp /usr/local/src/busybox-1.1.1/busybox .
ln -s busybox ash
ln -s busybox mount
ln -s busybox echo
ln -s busybox ls
ln -s busybox cat
ln -s busybox ps
ln -s busybox dmesg
ln -s busybox sysctl
popd

# Grab the necessary dev files
cp -a /dev/console /mnt/initrd/dev
cp -a /dev/ramdisk /mnt/initrd/dev
cp -a /dev/ram0 /mnt/initrd/dev
cp -a /dev/null /mnt/initrd/dev
cp -a /dev/tty1 /mnt/initrd/dev
cp -a /dev/tty2 /mnt/initrd/dev

# Equate sbin with bin
pushd /mnt/initrd
ln -s bin sbin
popd

# Create the init file
cat >> /mnt/initrd/linuxrc << EOF
#!/bin/ash
echo
echo "Simple initrd is active"
echo
mount -t proc /proc /proc
mount -t sysfs none /sys
/bin/ash --login
EOF

chmod +x /mnt/initrd/linuxrc

# Finish up...
umount /mnt/initrd
gzip -9 /tmp/ramdisk.img
cp /tmp/ramdisk.img.gz /boot/ramdisk.img.gz

 

 

制作initrd过程:

mkdir temp/initrd
dd if=/dev/zero of=image/initrd.img bs=16k count=2000
mke2fs -F -v -m0 image/initrd.img
mount -o loop image/initrd.img temp/initrd
cp -a rootfs.init/* temp/initrd
umount temp/initrd
gzip -9 < image/initrd.img > image/initrd.bin

#make cpio initrd image
cd rootfs.init
find .|cpio -c -o > ../initrd.img
gzip ../initrd.img

 

你可能感兴趣的:(嵌入式系统initrd制作)