|
Linux系统启动过程会执行一个/sbin/init的文件,这个文件然后往后引导,一步一步执行你需要自启动的其他脚本
[newifi_mini /sbin]# pwd
/sbin
[newifi_mini /sbin]# ls -al init
lrwxrwxrwx 1 admin root 2 Mar 20 20:08 init -> rc
看到init是link到rc文件的,去源代码中找到
trunk/user/rc
vi rc.c
void
write_storage_to_mtd(void)
{
doSystem("/sbin/mtd_storage.sh %s", "save");
}
// system ready
system("/etc/storage/started_script.sh &");
可以看到系统重启的过程,rc会执行mtd_storage.sh save
同时还会执行 started_scripts.sh
另外,还有一个文件/sbin/dev_init.sh脚本也会启动的时候执行,分析init.c文件也可以看到
#if BOARD_RAM_SIZE > 32
system("dev_init.sh");
#else
system("dev_init.sh -l");
在实际的二进制文件中分析,也可以看到调用了dev_init.sh的
[newifi_mini /]# strings sbin/rc |grep dev_init
dev_init.sh
实际上,mtd_storage.sh脚本是从这里开始调用的。
[newifi_mini /sbin]# cat /sbin/dev_init.sh
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
[ -d /proc/bus/usb ] && mount -t usbfs usbfs /proc/bus/usb
size_tmp="24M"
size_var="4M"
if [ "$1" == "-l" ] ; then
size_tmp="8M"
size_var="1M"
fi
mount -t tmpfs tmpfs /dev -o size=8K
mount -t tmpfs tmpfs /etc -o size=2M,noatime
mount -t tmpfs tmpfs /home -o size=1M
mount -t tmpfs tmpfs /media -o size=8K
mount -t tmpfs tmpfs /mnt -o size=8K
mount -t tmpfs tmpfs /tmp -o size=$size_tmp
mount -t tmpfs tmpfs /var -o size=$size_var
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mdev -s
# create dirs
mkdir -p -m 777 "/var/lock"
mkdir -p -m 777 "/var/locks"
mkdir -p -m 777 "/var/private"
mkdir -p -m 700 "/var/empty"
mkdir -p -m 777 "/var/lib"
mkdir -p -m 777 "/var/log"
mkdir -p -m 777 "/var/run"
mkdir -p -m 777 "/var/tmp"
mkdir -p -m 777 "/var/spool"
mkdir -p -m 777 "/var/lib/misc"
mkdir -p -m 777 "/var/state"
mkdir -p -m 777 "/var/state/parport"
mkdir -p -m 777 "/var/state/parport/svr_statue"
mkdir -p -m 777 "/tmp/var"
mkdir -p -m 777 "/tmp/hashes"
mkdir -p -m 777 "/tmp/modem"
mkdir -p -m 777 "/tmp/rc_notification"
mkdir -p -m 777 "/tmp/rc_action_incomplete"
mkdir -p -m 700 "/home/root"
mkdir -p -m 700 "/home/root/.ssh"
mkdir -p -m 755 "/etc/storage"
mkdir -p -m 755 "/etc/ssl"
mkdir -p -m 755 "/etc/Wireless"
mkdir -p -m 750 "/etc/Wireless/RT2860"
mkdir -p -m 750 "/etc/Wireless/iNIC"
mkdir -p -m 777 "/etc/storage/lib"
# extract storage files
mtd_storage.sh load
touch "/etc/resolv.conf"
cp -f "/etc_ro/ld.so.cache" "/etc"
if [ -f "/etc_ro/openssl.cnf" ]; then
cp -f "/etc_ro/openssl.cnf" "/etc/ssl"
fi
# create symlinks
ln -sf "/home/root" "/home/admin"
ln -sf "/proc/mounts" "/etc/mtab"
ln -sf "/etc_ro/ethertypes" "/etc/ethertypes"
ln -sf "/etc_ro/protocols" "/etc/protocols"
ln -sf "/etc_ro/services" "/etc/services"
ln -sf "/etc_ro/shells" "/etc/shells"
ln -sf "/etc_ro/profile" "/etc/profile"
ln -sf "/etc_ro/e2fsck.conf" "/etc/e2fsck.conf"
ln -sf "/etc_ro/ipkg.conf" "/etc/ipkg.conf"
ln -sf "/etc_ro/ld.so.conf" "/etc/ld.so.conf"
ln -sf "/etc_ro/libgcc_s.so.1" "/etc/storage/lib/libgcc_s.so.1"
ln -sf "/etc/storage/PhMain.ini" "/etc/PhMain.ini"
ln -sf "/etc/storage/init.status" "/etc/init.status"
# tune linux kernel
echo 65536 > /proc/sys/fs/file-max
echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range
# fill storage
mtd_storage.sh fill
# prepare ssh authorized_keys
if [ -f /etc/storage/authorized_keys ] ; then
cp -f /etc/storage/authorized_keys /home/root/.ssh
chmod 600 /home/root/.ssh/authorized_keys
fi
# perform start script
if [ -x /etc/storage/start_script.sh ] ; then
/etc/storage/start_script.sh
fi
我们去打开mtd_storage.sh看看
#!/bin/sh
result=0
mtd_part_name="Storage"
mtd_part_dev="/dev/mtdblock5"
mtd_part_size=65536
dir_storage="/etc/storage"
slk="/tmp/.storage_locked"
tmp="/tmp/storage.tar"
tbz="${tmp}.bz2"
hsh="/tmp/hashes/storage_md5"
config_qos="/etc/storage/qos.conf"
script0_script="/etc/storage/script0_script.sh"
script_script="/etc/storage/script_script.sh"
script1_script="/etc/storage/script1_script.sh"
script2_script="/etc/storage/script2_script.sh"
script3_script="/etc/storage/script3_script.sh"
adbyby_rules_script="/etc/storage/adbyby_rules_script.sh"
FastDick_script="/etc/storage/FastDick_script.sh"
crontabs_script="/etc/storage/crontabs_script.sh"
kmskey="/etc/storage/key"
vlmcsdini_script="/etc/storage/vlmcsdini_script.sh"
func_load()
{
local fsz
bzcat $mtd_part_dev > $tmp 2>/dev/null
fsz=`stat -c %s $tmp 2>/dev/null`
if [ -n "$fsz" ] && [ $fsz -gt 0 ] ; then
md5sum $tmp > $hsh
可以看到实际上这个storage数据是压缩写入在/dev/mtdblock5上的,这个设备应该是固件写入的时候对flash的一个分区。
看到没? 所有其他相关脚本都是从这个mtd_storage.sh启动的。
到此分析完毕。
因为padavan启动起来是一个readonly的系统,只有tmp可以写入数据,但是tmp重启就消失了。如果要自己加入一些启动的脚本,可以考虑如何改变/etc/storage下的内容,然后保存到flash上去就可以了。
对于我一个不会写程序的人来说,分析到这里,我认为已经算是很努力了。在前人的基础上,我可以任意添加和修改firmware了。
感谢各位大神对padavan的不懈努力修改!
|
评分
-
查看全部评分
|