openSTLinux系统如何配置开机启动自动加载脚本文件连接到某个网络(基于STM32MP1系列)
在使用pangu开发板过程中,想要配置开发板的USB WiFi模块,利用RTL8188驱动,802.11nWiFi模块,系统自带了WiFi 驱动,只需要在开机后通过wap指令连接指定的WiFi信号即可。
(PS:该WiFi模块只能连接2.4G的AP热点,要注意WiFi类型)。
1.什么是wpa指令
"wpa" 是 "Wi-Fi Protected Access" 的缩写,是一种用于保护无线局域网络(Wi-Fi)的协议和标准。WPA 旨在提供更强大的安全性,以取代旧版的 WEP(Wired Equivalent Privacy)协议,后来又被 WPA2 和 WPA3 所继承。
"wpa_supplicant" 则是一个用于 Linux 和类似操作系统的工具,它实现了 WPA 和 WPA2 的协议,并允许设备连接到受保护的 Wi-Fi 网络。wpa_supplicant 可以在命令行中使用,也可以与其他网络管理工具(如 NetworkManager)一起使用。
在命令行中,你可以使用 "wpa_supplicant" 命令来配置和连接 Wi-Fi 网络,例如:
- - 扫描可用的 Wi-Fi 网络:`wpa_cli scan`
- - 列出可用的 Wi-Fi 网络:`wpa_cli list_networks`
- - 添加新的 Wi-Fi 网络配置:`wpa_cli add_network`
- - 配置 Wi-Fi 网络的 SSID 和密码:`wpa_cli set_network network_id ssid "Your_SSID"` 和 `wpa_cli set_network network_id psk "Your_Password"`
- - 启用 Wi-Fi 网络配置:`wpa_cli enable_network network_id`
- - 断开连接:`wpa_cli disconnect`
- - 连接到 Wi-Fi 网络:`wpa_cli select_network network_id`
2.如何实现openSTLinux系统开机自动加载脚本
要实现系统开机后执行某个shell脚本,有如下几种方法:
1. 使用`systemd`服务:
- 创建一个`systemd`服务单元文件,该文件指定在系统启动后执行你的Shell脚本。
- 在服务单元文件中,使用`After`参数指定你的服务应该在哪些系统目标(targets)之后启动。通常,在`multi-user.target`之后启动,因为这是正常用户登录的目标。
- 在服务单元文件的`ExecStart`字段中指定你的Shell脚本的完整路径。
以下是一个示例`systemd`服务单元文件:
[Unit] Description=My Custom Script Service After=multi-user.target [Service] ExecStart=/path/to/your/script.sh [Install] WantedBy=multi-user.target
- 将上述配置保为`my_custom_script.service`(或其他自定义名称)并放置在`/etc/systemd/system/`目录下。
- 启用服务并启动它:
sudo systemctl enable my_custom_script.service sudo systemctl start my_custom_script.service
这将确保你的Shell脚本在系统完全启动后运行。
2.使用启动脚本:
可以将脚本添加到系统的启动脚本中。这样,当用户登录后,脚本将自动执行。在OpenSTLinux系统中,常见的启动脚本是 ~/.profile
或 ~/.bashrc
(对于每个用户),以及系统级别的启动脚本如 /etc/profile
或 /etc/rc.local
。
-
~/.profile
和~/.bashrc
:这些是每个用户的个人配置文件。通过编辑用户的~/.profile
或~/.bashrc
文件,将你的脚本添加到文件末尾。确保每次用户登录时都会运行脚本。# 打开用户的.profile或.bashrc文件 nano ~/.profile # 在文件末尾添加你的脚本命令 /path/to/your/script.sh
-
/etc/profile
:这是系统级别的全局配置文件,会影响所有用户。将脚本添加到/etc/profile
中,以确保在每个用户登录时都运行脚本。# 打开/etc/profile文件 sudo nano /etc/profile # 在文件末尾添加你的脚本命令 /path/to/your/script.sh
-
/etc/rc.local
:如果需要在系统启动时而不仅仅是用户登录后运行脚本,可以将脚本添加到/etc/rc.local
中。# 打开/etc/rc.local文件 sudo nano /etc/rc.local # 在"exit 0"之前添加你的脚本命令 /path/to/your/script.sh
本文使用第一种方法中的~/.profile进行配置,编写好脚本后,在~/.profile文件末尾添加该脚本文件的路径以及脚本名称即可。
------------------------------------------------------------------------------------------------
由于后续使用过程中,需要多开ssh会话。而每次打开一次新的ssh会话时,都会执行一次用户登录操作,即每次都会再执行一次~/.profile文件,这样的话,自动执行脚本会被多次加载,而wpa_supplicant命令在第二次执行时可能会尝试重新启动 wpa_supplicant 进程,这会导致网络连接断开。通常,只需要在系统启动时一次性启动 wpa_supplicant,不需要多次运行相同的命令。
为了解决这个问题,这里提供两种思路,一种是在/etc/profile文件中加载脚本,第二种方法是在~/.profile设定一个环境变量,给一个初值,在需要自动执行的脚本中,对其进行判断即可。
/.profile文件实例如下
:
/your/path/xxx.sh
/your/path/xxx.sh文件实例如下
:
if [ "$First_login" != "true" ]; then echo "First_login!"
#在这里放你的脚本内容 else echo "welcome back!" fi
export First_login="true"; #置位环境变量
#if []括号'['和if之间必须有空格
------------------------------------------------------------------------------------------------
在后续使用过程中,新的问题出现了,那就是当系统断电重启后,这个环境变量还在,则脚本在执行过程中会跳过我们想要执行的内容,导致网络连接失败。因此考虑要么在关机或者重启时,将环境变量复位,要么采用systemd服务,配置相关参数,使其再开机后,用户登陆前执行一次即可。
经过查询相关资料以及不断尝试,最终实现了开机只执行一次,在新开ssh会话时不会重复执行,且再次开机可以执行的脚本配置。
主要思路是采用前文提到的“使用`systemd`服务”方法。但是配置上有所不同。
其中`systemd`服务单元文件内容为:
[Unit]
Description=My Script Service
After=network.target multi-user.target
Wants=network.target
[Service]
ExecStart=/your/path/yourshfile.sh
User=root
Group=root
Type=oneshot #开机只执行一次
RemainAfterExit=yes #这可以指示 systemd 服务单元在 ExecStart
完成后仍然保持激活状态。这允许脚本在后台继续运行。
[Install]
WantedBy=multi-user.target
需要执行的脚本文件内容为:
wpa_supplicant -B -c /etc/zhb_wificonfig/wifi.conf -i wlan0 & sleep 5 echo -e "\n" #这一步是为了防止wpa_supplicant执行完成后还在那里等待,导致后续服务启动失败,模拟一个回车 udhcpc -i wlan0 wait #这里等待ip分配获取完成,即可进入下一步 echo "nameserver 114.114.114.114" > /etc/resolv.conf echo "nameserver 8.8.8.8" >> /etc/resolv.conf wait #等待DNS写入完成
以上就是从一开始的想法到最后的实现过程了,希望对读者有帮助。