书接上文,上次说到了Linux最小内核,今天来说一下制作最小系统的流程
关于制作最小系统【基于itop4412】
可以按照网上比较完善的教程去安装Busybox,之后去利用“mkdir"终端命令完善一些文件夹,比如dev,etc,lib,mnt,proc,sys,tmp,var 文件夹
其中etc文件夹里包含网络相关的配置文件,我们可以使用命令 vi 或者 vim 建立 eth0-setting 文件,写入IP/Mask/Mac/Gateway/DNS【写入 IP、子网掩码、MAC 地址、网关和 DNS 信息的目的是为了手动配置网络接口 eth0 的参数】,之后还得修改一下这个文件的权限。
之后还要建立一个存放启动脚本的目录文件夹init.d,建立ifconfig-eth0
脚本【该脚本根据是否存在 /etc/eth0-setting 文件来配置 eth0 网络接口的参数,包括 IP 地址、子网掩码、MAC 地址、网关和 DNS 服务器地址,并输出相应的提示信息】
ifconfig-eth0
脚本如下:
#!/bin/sh
echo -n "Try to bring eth0 interface up......" > /dev/ttySAC2
if [ -f /etc/eth0-setting ]; then
# Source settings from the file
source /etc/eth0-setting
# Check if the root filesystem is mounted over NFS
if grep -q "^/dev/root / nfs " /etc/mtab; then
echo -n "NFS root ..." > /dev/ttySAC2
else
# If not NFS, configure network settings
ifconfig eth0 down
ifconfig eth0 hw ether $MAC
ifconfig eth0 $IP netmask $Mask up
route add default gw $Gateway
echo "nameserver $DNS" > /etc/resolv.conf
fi
else
# Additional NFS root check, seems redundant, could be an error
if grep -q "^/dev/root / nfs " /etc/mtab; then
echo -n "NFS root ..." > /dev/ttySAC2
else
# Default configuration if no settings file is found
/sbin/ifconfig eth0 192.168.253.12 netmask 255.255.255.0 up
fi
fi
echo "Done" > /dev/ttySAC2
代码大意是:先判断有无/etc/eth0-setting 文件,有的话就用souse命令将文件里的参数传输到这个脚本里方便后续使用,
检查 /etc/mtab
文件中是否存在字符串“^dev/root /nfs”,这一句是为了判断系统是不是通过NFS 方式去挂载文件系统的,
【补充:
嵌入式系统启动时挂载根文件系统的方式:
-
本地存储设备:嵌入式系统可以通过SD卡、eMMC、NAND闪存、Nor闪存等本地存储设备来存储根文件系统。在启动时,系统会从这些存储设备中加载文件系统。
-
网络文件系统(NFS):在网络引导系统中,根文件系统可以通过NFS从远程服务器上挂载。这种方式使得系统可以从网络上获取文件系统,而不依赖于本地存储设备。
-
其他
以上1和2是比较常用的挂载根文件系统的方式,根文件系统一般被挂载在根目录下,是整个文件系统的起点。它包含了操作系统启动所需的所有文件和目录,以及在系统运行时需要访问的其他文件和数据。
我们在关机或挂起根文件系统时,根文件系统的一些数据什么的会存放在存储设备里,比如SD卡等等,所以在下一次启动的时候我们可以通过去存储设备里寻找根文件系统的数据,然后去挂载根文件系统,这也就是第一种常用的挂载方式。
而NFS是网络文件系统协议,允许在网络上共享文件系统。相比于本地存储设备,NFS可以通过网络将文件系统中的数据提供给远程计算机使用,当一个计算机通过NFS挂载远程文件系统时,实际上是在网络上请求远程服务器提供文件系统的数据。因此,NFS允许计算机在启动时从网络上获取文件系统的数据,而不必依赖本地存储设备。
】
如果上一步的 grep
命令找到匹配的字符串,就将消息 "NFS root ..."
写入 /dev/ttySAC2
设备中。
如果未找到匹配的字符串,则执行下面的命令——关闭 eth0
接口,设置硬件地址,设置 IP 地址和子网掩码,添加默认网关,并将 DNS 服务器地址写入 /etc/resolv.conf
文件。
【补充一下对DNS 的理解:DNS可以将域名映射成计算机可理解的IP地址
- 当用户在浏览器中输入一个域名时,比如"baidu.com",系统会首先查询本地DNS缓存,如果找到了对应的IP地址,则直接使用这个IP地址访问网站。
- 如果本地缓存中没有找到对应的IP地址,则会向本地配置的DNS服务器发起查询请求。
- 如果本地DNS服务器缓存中有对应的IP地址,则返回给客户端。
- 如果本地DNS服务器没有缓存对应的IP地址,则会向其他DNS服务器发起递归查询,直到找到对应的IP地址或者查询超时。】
如果 /etc/eth0-setting
文件不存在,再次检查 /etc/mtab
文件中是否存在字符串 ^/dev/root / nfs,
如果能找到匹配的字符串,就将消息 "NFS root ..."
写入 /dev/ttySAC2
设备中。grep
命令未找到匹配的字符串,则执行默认的网络配置:设置 eth0
接口的 IP 地址为 192.168.253.12
,子网掩码为 255.255.255.0
,并启用该接口。【其实就是确认是不是用NFS挂载文件系统的,如果不是就用默认配置】
最后一行将消息 "Done"
写入 /dev/ttySAC2
设备中。
之后建立rcS文件(用于初始化系统环境)
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin: runlevel=s
prevlevel=N umask 022
export PATH runlevel prevlevel #
#
Trap CTRL-C &c only in this shell so we can interrupt subprocesses. #
trap ":" INT QUIT TSTP /bin/hostname iTOP-4412
#/bin/mount -n -t proc none /proc #/bin/mount -n -t sysfs none/sys
#/bin/mount -n -t usbfs none /proc/bus/usb #/bin/mount -t ramfs none /dev
[-e/proc/1 ]
ll /bin/mount -n -t proc
none /proc [ -e /sys/class ] |l /bin/mount -n -t sysfs none /sys [-e /dev/tty]
ll /bin/mount
-t ramfs none /dev echo /sbin/mdev > /proc/sys/kerne1/hotplug
/sbin/mdev-s #/bin/hotplug
# mounting file system specified in /etc/fstab mkdir -p/dev/pts
mkdir -p/dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t devpts none /dev/pts -o mode=0622 /bin/mount -n -t tmpfs tmpfs /dev/shm
#/bin/mount -n -t ramfs none /tmp #/bin/mount -n -t ramfs none /var mkdir -p/var/empty
mkdir -p /var/log mkdir -p/var/log/boa mkdir -p /var/lock
mkdir -p/var/run )
1 -)
mkdir -p /var/tmp
In -sf/dev/ttys2/dev/tty2 1n -sf/dev/ttys2/dev/tty3 In -sf/dev/ttyS2 /dev/tty4 syslogd
/etc/rc.d/init.d/netd start echo "
">/dev/tty1 echo "Starting networking..." > /dev/tty1 #sleep 1
#/etc/rc.d/init.d/httpd start #echo "
">/dev/tty1 #echo "Starting web server...">/dev/tty1 #sleep 1
#/etc/rc.d/init.d/leds start #echo "
">/dev/tty1 #echo "Starting leds service..." > /dev/tty1 #echo "
-
#echo " #sleep 1 #echo
>/dev/ttySAC2 #echo
"
http://www.topeet.com.cn
"
>/dev/ttySAC2 #echo
"*:
***
******************
*****
***"
>/dev/ttySAC2 ¥¥¥
#echo
"*************************************" #echo
"
http://www.topeet.com.cn
-1 #echo
****" mkdir /mnt/disk
sleep 1
/sbin/ifconfig lo 127.0.0.1 /etc/init.d/ifconfig-eth0
脚本分析:设置环境变量 PATH,
单用户模式,设置文件创建时的权限掩码
将 PATH
、runlevel
和 prevlevel
这三个变量导出,使得它们在后续的脚本中可用。
设置了一组 trap,用于捕获信号并执行相应的操作。这里对 INT
、QUIT
和 TSTP
信号设置了空操作 :
,即不做任何处理。
【注释:环境变量 PATH
,用于指定系统在哪些目录中搜索可执行文件。不仅在Linux有这个概念,Windows也有,Windows环境变量的执行是从上到下执行的,因此需要把一些比较重要的放前面(不然可能会先执行其他的然后受干扰)
单用户模式是计算机系统的一种运行状态,在这个状态下,系统只允许一个用户访问并控制系统。一般用于系统维护和修复问题。
文件创建时的权限掩码(umask)是一个权限掩码,用于确定新创建的文件或目录的默认权限。它是一个八进制数。umask 的工作方式是通过将文件的默认权限与 umask 值进行按位取反的方式来确定最终的权限。通常,umask 会屏蔽掉对应位置上的权限位。例如,如果 umask 的值是 022,则新创建的文件的默认权限为 666(rw-rw-rw-),但 umask 会屏蔽掉 022 中的各个权限位,最终的文件权限会变为 644(rw-r--r--)。
trap
命令用于设置捕获和处理信号的操作,
eg:
trap "echo 'Signal received!'" INT # 捕获中断信号并执行命令
在这个例子中,trap
命令捕获中断信号,并在捕获到信号时执行 echo 'Signal received!'
命令,即打印一条消息。】
之后设置主机名为 iTOP-4412;
创建 /dev/pts
目录,用于支持伪终端设备;创建 /dev/shm
目录,用于共享内存;
【注释:伪终端设备 :是一种特殊的字符设备(字符设备通常用于表示与计算机进行通信的外部设备,例如键盘、鼠标、打印机、串口等),用于在计算机系统中模拟物理终端设备(例如键盘和显示器),作者本人认为可以我们手机的输入法键盘就是伪终端设备,所以它算挺重要的。
在远程登录和远程 Shell 会话中,伪终端设备允许用户通过网络连接到远程计算机,并与其交互,就像在本地计算机上一样
伪终端设备成对出现,每个主伪终端设备,都会有一个相应的从伪终端设备,如 /dev/pty[pseudo terminal]-[n]
和 /dev/tty[pseudo terminal]-[n]
。
/dev/pts
目录用于管理伪终端设备】
挂载伪终端文件系统到 /dev/pts
,设置权限为 0622;
挂载 tmpfs 文件系统到 /dev/shm;
创建一系列目录用于日志、锁文件和运行时数据;
【注释:tmpfs 是一种基于内存的临时文件系统,数据关机即丢失(因为内存是用DRAM做存储介质),因为其基于内存,所以访问速度快】
创建符号链接,将 /dev/ttyS2
和 /dev/ttys2
链接到 /dev/tty4
、/dev/tty3
和 /dev/tty2;
【注释:
符号链接(Symbolic Link)是一种特殊类型的文件,假如说一个文件A要链接到另一个文件B的意思是,当访问A的时候其实会访问文件B
/dev/ttyS2
和 /dev/ttys2
分别代表串行端口设备。而/dev/tty4
、/dev/tty3
和 /dev/tty2
则是虚拟控制台设备(虚拟控制台设备是指在计算机上模拟出来的一种虚拟终端界面,想象一下,你的计算机屏幕就像是一个大型电视墙,分成了几个小屏幕,每个小屏幕上都显示着一个不同的操作界面。这些小屏幕就好比是虚拟控制台,它们可以让你同时进行多个任务,而不需要来回切换)通过创建符号链接,将串行端口设备链接到虚拟控制台设备,这样可以通过串行端口与某些设备或系统进行通信,类似于串口助手】
启动系统日志服务
【注释:系统日志服务通常由一个守护进程(如syslogd
或rsyslogd
)负责管理,它会接收来自系统内核、系统服务、用户程序等的日志消息,并将这些消息写入日志文件中。守护进程通常在系统启动时启动,在系统运行期间一直保持运行状态,为其他应用程序提供服务,可以监控和管理系统资源的使用情况】;
启动网络服务;输出一些提示信息到 /dev/tty1
和 /dev/ttySAC2
设备;
创建 /mnt/disk
目录;
【/mnt/disk
目录通常用于挂载额外的存储设备或分区】
配置 loopback 接口的 IP 地址为 127.0.0.1;
【
本地回环地址就是计算机用来和自己通信的特殊地址,就好像是计算机的镜子一样,用于测试网络通信和访问本地服务】
执行 /etc/init.d/ifconfig-eth0
脚本。
由于内容太长,接下来的见下一篇分析...