在产品出厂时通常会默认一套基本参数配置,但为了尽可能适配每个用户的不同应用场景,最好有一个建议的修改配置的方式而不需要修改核心系统。
通常情况下,通过设置一个config.json的配置文件,让用户修改这个文件即可完成系统参数配置。
本文实现了一个简易的配置功能,即系统上电之后从TF卡中读取config.json配置文件,然后根据配置文件更新系统配置
逐步配置
配置/mnt/sdcard/config.json
文件
bash
{
"Network": {
"address": "192.168.137.10",
"netmask": "255.255.255.0",
"gateway": "192.168.137.1",
"dns": ["192.168.137.1", "8.8.8.8", "8.8.4.4"]
}
}
配置/usr/bin/configure_network.sh
文件
bash
nano /usr/bin/configure_network.sh
bash
#!/bin/sh
# 配置文件路径
CONFIG_FILE="/mnt/sdcard/config.json"
LOG_FILE="/var/log/network_config.log"
# 创建日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
log "错误:配置文件 $CONFIG_FILE 不存在!"
exit 1
fi
# 提取配置值的函数
get_config_value() {
# $1 = JSON 键名
grep "\"$1\":" "$CONFIG_FILE" | \
awk -F': ' '{print $2}' | \
sed 's/[",]//g' | \
tr -d ' '
}
# 提取DNS服务器列表 - 修复版本
get_dns_servers() {
# 提取dns数组部分
awk '/"dns": \[/,/\]/' "$CONFIG_FILE" | \
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
}
# 提取配置
log "从配置文件提取网络设置..."
ADDRESS=$(get_config_value "address")
NETMASK=$(get_config_value "netmask")
GATEWAY=$(get_config_value "gateway")
DNS_SERVERS=$(get_dns_servers)
log "解析的配置:"
log " IP地址: ${ADDRESS:-未找到}"
log " 子网掩码: ${NETMASK:-未找到}"
log " 网关: ${GATEWAY:-未找到}"
log " DNS服务器: ${DNS_SERVERS:-未找到}"
# 验证配置是否可用
if [ -z "$ADDRESS" ] || [ -z "$NETMASK" ] || [ -z "$GATEWAY" ] || [ -z "$DNS_SERVERS" ]; then
log "错误:关键网络参数缺失!"
exit 2
fi
# 配置网络接口
log "配置 eth0..."
ifconfig eth0 "$ADDRESS" netmask "$NETMASK"
# 配置网关
log "设置默认网关..."
route add default gw "$GATEWAY" >/dev/null 2>&1
# 配置DNS
log "更新 DNS 配置..."
echo "# Generated by network config script" > /etc/resolv.conf
for server in $DNS_SERVERS; do
echo "nameserver $server" >> /etc/resolv.conf
done
# 验证配置
log "验证网络配置:"
ifconfig eth0 | grep -q "inet addr:$ADDRESS" && log "IP地址配置成功" || log "IP地址配置失败"
ip route | grep -q "default via $GATEWAY" && log "网关配置成功" || log "网关配置失败"
grep -q "$GATEWAY" /etc/resolv.conf && log "DNS配置成功" || log "DNS配置失败"
log "网络配置完成!"
添加权限
bash
chmod +x /usr/bin/configure_network.sh
创建日志文件
bash
mkdir -p /var/log
测试运行脚本
bash
/usr/bin/configure_network.sh
创建自启动文件
bash
nano /etc/init.d/S99network-config
bash
#!/bin/sh
start() {
echo "Starting network configuration"
# 等待网络接口可用
while [ ! -e /sys/class/net/eth0 ]; do
sleep 1
done
# 等待TF卡挂载
sleep 3
/usr/bin/configure_network.sh
}
stop() {
echo "Stopping network configuration service"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
加权限
bash
chmod +x /etc/init.d/S99network-config
创建目录
bash
mkdir -p /etc/rc.d
链接文件
bash
ln -s /etc/init.d/S99network-config /etc/rc.d/S99network-config
测试自启动
bash
/etc/init.d/S99network-config start
一键脚本
bash
nano setup.sh
bash
#!/bin/sh
# 创建并配置网络设置脚本
cat > /usr/bin/configure_network.sh << 'EOF'
#!/bin/sh
# 配置文件路径
CONFIG_FILE="/mnt/sdcard/config.json"
LOG_FILE="/var/log/network_config.log"
# 创建日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
log "错误:配置文件 $CONFIG_FILE 不存在!"
exit 1
fi
# 提取配置值的函数
get_config_value() {
# $1 = JSON 键名
grep "\"$1\":" "$CONFIG_FILE" | \
awk -F': ' '{print $2}' | \
sed 's/[",]//g' | \
tr -d ' '
}
# 提取DNS服务器列表
get_dns_servers() {
# 提取dns数组部分
awk '/"dns": \[/,/\]/' "$CONFIG_FILE" | \
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
}
# 提取配置
log "从配置文件提取网络设置..."
ADDRESS=$(get_config_value "address")
NETMASK=$(get_config_value "netmask")
GATEWAY=$(get_config_value "gateway")
DNS_SERVERS=$(get_dns_servers)
log "解析的配置:"
log " IP地址: ${ADDRESS:-未找到}"
log " 子网掩码: ${NETMASK:-未找到}"
log " 网关: ${GATEWAY:-未找到}"
log " DNS服务器: ${DNS_SERVERS:-未找到}"
# 验证配置是否可用
if [ -z "$ADDRESS" ] || [ -z "$NETMASK" ] || [ -z "$GATEWAY" ] || [ -z "$DNS_SERVERS" ]; then
log "错误:关键网络参数缺失!"
exit 2
fi
# 配置网络接口
log "配置 eth0..."
ifconfig eth0 "$ADDRESS" netmask "$NETMASK"
# 配置网关
log "设置默认网关..."
route add default gw "$GATEWAY" >/dev/null 2>&1
# 配置DNS
log "更新 DNS 配置..."
echo "# Generated by network config script" > /etc/resolv.conf
for server in $DNS_SERVERS; do
echo "nameserver $server" >> /etc/resolv.conf
done
# 验证配置
log "验证网络配置:"
ifconfig eth0 | grep -q "inet addr:$ADDRESS" && log "IP地址配置成功" || log "IP地址配置失败"
ip route | grep -q "default via $GATEWAY" && log "网关配置成功" || log "网关配置失败"
grep -q "$GATEWAY" /etc/resolv.conf && log "DNS配置成功" || log "DNS配置失败"
log "网络配置完成!"
EOF
# 设置权限
chmod +x /usr/bin/configure_network.sh
# 创建日志目录
mkdir -p /var/log
# 创建自启动服务文件
cat > /etc/init.d/S99network-config << 'EOF'
#!/bin/sh
start() {
echo "Starting network configuration"
# 等待网络接口可用
while [ ! -e /sys/class/net/eth0 ]; do
sleep 1
done
# 等待TF卡挂载
sleep 3
/usr/bin/configure_network.sh
}
stop() {
echo "Stopping network configuration service"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
EOF
# 设置服务权限
chmod +x /etc/init.d/S99network-config
# 创建rc.d目录(如果不存在)
mkdir -p /etc/rc.d
# 创建符号链接
ln -sf /etc/init.d/S99network-config /etc/rc.d/S99network-config
# 测试服务
echo "正在测试网络配置服务..."
/etc/init.d/S99network-config start
echo "所有配置已完成!"
echo "网络配置脚本已安装到 /usr/bin/configure_network.sh"
echo "自启动服务已安装到 /etc/init.d/S99network-config"
bash
chmod +x setup.sh
bash
./setup.sh