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