1. 为了在nfs下面调试rootfs for initramfs
可以在commandline 下面加 init=/init

2. busybox
除了要拷贝busybox可执行文件,还要拷贝相应的库文件。可以运行ldd来检查需要的库文件:
qianjiang@qianjiang-laptop:~/tmp$ arm-linux-ldd initramfs_checking/bin/busybox
checking sub-depends for 'not found'
checking sub-depends for 'not found'
    libm.so.0 => not found (0x00000000)
    libc.so.0 => not found (0x00000000)
    /lib/ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x00000000)

我曾经采用 busybox cat proc/1/maps来看,比如:
2aab9000-2aaba000 rw-p 00006000 00:0e 4198103    /lib/ld-uClibc-0.9.30-nptl.so
2aaba000-2aacb000 r-xp 00000000 00:0e 4202250    /lib/libm-0.9.30-nptl.so
这样指示的库不完全,导致busybox有些命令可以运行,有些不可以,导致init各种奇怪的错误.
这里稍微备注一下,init的debug:
1)可以静态链接测试程序作为init
2) 需要注意/dev, /proc, /sys等。。。

3. 下面是rootfs生成脚本的一个片段,解释如下:

ln -s bin/busybox init   //开始让运行 busybox 的 init
cp $ROOTFS_TMPLT_DIR/etc/mdev.conf $rootdir/etc/   //这是mdev的配置

echo 'null::sysinit:/bin/busybox --install -s    //安装busybox
null::sysinit:/bin/busybox mount -t proc none /proc  //注意这里需要指明/bin/busybox mount,因为安装后的busybox依赖于proc的存在
null::sysinit:/bin/busybox mount -t sysfs none /sys  //mdev需要读取sysfs来生成设备
null::sysinit:/sbin/mdev -s

# Put a getty on the serial port
ttyS1::respawn:-/bin/sh
' > $rootdir/etc/inittab      //busybox init会读取initab,所以要遵从其语法
 

4. 下面是脚本

#!/bin/sh

if [ $# -ne 1 ]
then
    echo "Usage: sh $0 rootdir"
    exit
fi


# we need locate $ROOTFS_TMPLT_DIR to copy files
if [ -z $ROOTFS_TMPLT_DIR ]
then
     echo "Can not locate env \$ROOTFS_TMPLT_DIR"
     exit
fi

rootdir=$(readlink -f $1)

# prepare a clean rootdir
rm -rf $rootdir
mkdir -p $rootdir

# prepare directories
cd $rootdir
mkdir -p bin lib dev etc/init.d mnt proc root sbin sys usr/bin usr/sbin tmp

# prepare device
sudo cp -a ${ROOTFS_TMPLT_DIR}/dev/null $rootdir/dev/
sudo cp -a ${ROOTFS_TMPLT_DIR}/dev/console $rootdir/dev/

# prepare busybox
cp $ROOTFS_TMPLT_DIR/bin/busybox $rootdir/bin/busybox
cp $ROOTFS_TMPLT_DIR/lib/libm.so* $rootdir/lib/
cp $ROOTFS_TMPLT_DIR/lib/libc.so* $rootdir/lib/
cp $ROOTFS_TMPLT_DIR/lib/ld-uClibc.so* $rootdir/lib/

# prepare init
ln -s bin/busybox init
cp $ROOTFS_TMPLT_DIR/etc/mdev.conf $rootdir/etc/
cp $ROOTFS_TMPLT_DIR/etc/dsk_opt $rootdir/etc/
echo 'null::sysinit:/bin/busybox --install -s
null::sysinit:/bin/busybox mount -t proc none /proc
null::sysinit:/bin/busybox mount -t sysfs none /sys
null::sysinit:/sbin/mdev -s

# Put a getty on the serial port
ttyS1::respawn:-/bin/sh
' > $rootdir/etc/inittab