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写入完成

以上就是从一开始的想法到最后的实现过程了,希望对读者有帮助。

热门相关:神秘总裁小小妻   异能特工:军火皇后   悠哉兽世:种种田,生生崽   性欲爆发的小姐   异能特工:军火皇后