~ # cd /etc/
/etc # ls
fs-version group inittab passwd profile services
fstab init.d mtab passwd- protocols udev
这块芯片的根文件系统里有这么多东西
这些都是提前做好的
挂载根文件系统后第一个启动的就是/etc/init.d/rcS
文件
/etc/fstab
其中/etc/fstab
的作用是挂载文件系统
fs-version
fs-version
是版本号
~/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc/etc$ cat fs-version
01000100 rootbox nohelp info
group
group
用于管理用户组
~/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc/etc$ cat group
root::0:
3518E登录后提示符是#不是$,就是这里的设置,里面的值为root::0:导致开发板登入时为root用户
profile
profile
:启动的时候会默认去调用里面的东西,与环境变量设置相关
echo &PATH /usr/bin:/usr/sbin:/bin:/sbin
表示环境变量
echo "${GREEN}Welcome to HiLinux.${NORMAL}"
表示开始启动的Welcome to HiLinux.这句话用绿色打印出来,然后再把颜色设置为NORMAL
udev
udev详解
udev
目录用来做即插即用的,usb、sd卡等,其中rules.d
是拔插的规则(拔插会造成的结果),这一套就能够保证设备能识别到插入的卡
init
init.d
目录
现在比较新的设备中都是这种格式
rcS
其中,rcS
用来调用其余文件
#! /bin/sh
/bin/mount -a
echo "
_ _ _ _ _ _ _ _ _ _ _ _
\ _ _ _ _ _ ___
/ /__/ \ |_/
/ __ / - _ ___
/ / / / / /
_ _ _ _/ / / \_/ \_ ______
___________\___\__________________
"
for initscript in /etc/init.d/S[0-9][0-9]*
do
if [ -x $initscript ] ;
then
echo "[RCS]: $initscript"
$initscript
fi
done
程序上电后第一个执行的就是rcS
执行的/bin/mount -a
就是把mount/table
里面的东西全部挂上
然后使用echo
打印海思的Hi 的logo
for initscript in /etc/init.d/S[0-9][0-9]*
就是将这个文件夹中除了rcS
本身,其他的文件都算上
然后用for循环挨个拿出来
再用do进行检验
if [ -x $initscript ] ;
括号中表示可执行且为真
括号内为真就去打印文件的名字再执行
启动的打印如上图所示
S00devs
S00devs
文件内容如下:创建设备节点
#!/bin/sh
mknod /dev/console c 5 1
mknod /dev/ttyAMA0 c 204 64
mknod /dev/ttyAMA1 c 204 65
mknod /dev/ttyS000 c 204 64
mknod /dev/null c 1 3
在自己制作根文件系统的时候着重处理的是null
、console
而ttyAMA0
、ttyAMA1
、ttyS000
会在驱动中自动产生
注意:其实我们在做文件系统的时候已经做了console、ttyAMA0、null
打印就会提示文件已经存在
mknod: /dev/console: File exists
mknod: /dev/ttyAMA0: File exists
mknod: /dev/null: File exists
如果需要去了解这里为什么要自己做,就需要去研究海思改过的内核。但是去研究他们修改的内核就没有必要了。
每一家公司的工程师做事都有其习惯,他内核里面怎么设计的和他根文件系统中怎么对应的都有不同厂商各自的玩法。
在实际工作中,只要稍微看一下,顺着他的玩法走下去就行了。
S01udev
S01udev
文件内容如下:
#!/bin/sh
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mkdir -p /dev/.udev
udevd --daemon
udevadm trigger
先创建/dev/pts
目录,再把devpts
这个文件系统挂载上去
再在/dev/
底下创建.udev
执行udevd
,udev其实就是linux中的一个应用程序
udevd是一个应用程序,–daemon 就是创建那个守护进程,进程创建后内核就可以检测即插即拔的设备
S80network
S80network
文件内容如下:
#!/bin/sh
ipaddr=
bootp=
gateway=
netmask=
hostname=
netdev=
autoconf=
for ipinfo in `cat /proc/cmdline`
do
case "$ipinfo" in
ip=*)
for var in ipaddr bootp gateway netmask hostname netdev autoconf
do
eval read $var
done << EOF
`echo "$ipinfo" | sed "s/:/\n/g" | sed "s/^[ ]*$/-/g"`
EOF
ipaddr=`echo "$ipaddr" | cut -d = -f 2`
[ x$ipaddr == x ] && ipaddr=x
;;
esac
done
[ -z "$ipaddr" ] && exit 0
echo " IP: $ipaddr"
echo " BOOTP: $bootp"
echo " GATEWAY: $gateway"
echo " NETMASK: $netmask"
echo "HOSTNAME: $hostname"
echo " NETDEV: $netdev"
echo "AUTOCONF: $autoconf"
if [ x$ipaddr == x- ] ; then
# use DHCP
:
else
cmd="ifconfig $netdev $ipaddr"
[ x$netmask != x- ] && cmd="$cmd netmask $netmask"
eval $cmd
[ x$gateway != x- ] && route add default gw $gateway
fi
ifconfig lo 127.0.0.1
for ipinfo in `cat /proc/cmdline`
将cat /proc/cmdline
输入给设备
~ # cat /proc/cmdline
mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1024K(boot),3072K(kernel),12288K(rootfs)
这就是之前我们在配置的时候输入给putargs
的cmdline
这个文件就是将这个cmdline
拿过来,以空格为分隔,一个一个拿出来,看看有没有和网络有关的
这里的case是判断cmdline
中有没有ip地址
显然我们之前的输入没有
如果有的话,那么就打印出来
再往下走
[ -z "$ipaddr" ] && exit 0
-z用于测试ipaddr长度是否为0,如果ipaddr长度为0则成立,则执行exit 0退出
如果执行了
最后将ip地址设置为127.0.0.1
在命令行输入ifconfig -a
可以看到,虽然有两张网卡,但是都没有网络连接
这就是因为cmdline
中没有ip地址然后退出,下面全部没有执行
所以,若将来想要修改ip地址,就需要将相应的内容放在[ -z "$ipaddr" ] && exit 0
前面
S90hibernate
S90hibernate
文件内容如下:
#!/bin/sh
echo "/root/pm_callback" > /proc/sys/kernel/pm_notifier
cmdline=`cat /proc/cmdline`
hbtype=resume
for str in $cmdline
do
case $str in
hbtype=*)
hbtype=`echo "$str" | awk -F"=" '{print $2}'`
esac
done
if [ "$hbtype"x = "snap"x ]; then
echo "hibernate start"
echo disk > /sys/power/state
fi
echo "/root/pm_callback" > /proc/sys/kernel/pm_notifier
与电源管理相关