Ubuntu 20 默認使用的是 systemd
系統管理器,但傳統的 SysV Init
(/etc/init.d/
)腳本依然兼容并可用。本文將介紹如何通過 init.d
寫腳本來在開機時自動設置某個 GPIO(如 GPIO407)為高電平,適用于嵌入式系統、開發板等場景。
一、為什么選擇 init.d
雖然 systemd
是推薦方式,但對于一些老舊項目或驅動初始化問題,用 init.d
更加直觀、簡單,并且在某些設備初始化順序依賴場景下依然非常實用。
二、創建并配置 init.d 腳本
1. 創建腳本
bash
復制編輯
sudo nano /etc/init.d/gpio407_init
2. 腳本內容如下:
bash
復制編輯
#!/bin/sh ### BEGIN INIT INFO # Provides: gpio407_init # Required-Start: $local_fs # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: Set GPIO407 high at boot ### END INIT INFO GPIO=407 case "$1" in start) echo "Exporting GPIO$GPIO and setting it HIGH..." if [ ! -e /sys/class/gpio/gpio$GPIO ]; then echo $GPIO > /sys/class/gpio/export sleep 0.1 fi echo out > /sys/class/gpio/gpio$GPIO/direction echo 1 > /sys/class/gpio/gpio$GPIO/value echo "GPIO$GPIO set to HIGH" ;; stop) echo $GPIO > /sys/class/gpio/unexport ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0
三、賦予腳本執行權限
bash
復制編輯
sudo chmod +x /etc/init.d/gpio407_init
四、注冊為啟動服務
將腳本注冊到系統默認啟動級別:
bash
復制編輯
sudo update-rc.d gpio407_init defaults
這會在 /etc/rc2.d/
、rc3.d/
、rc4.d/
、rc5.d/
中創建符號鏈接,實現開機執行。
五、立即運行測試
你可以直接運行腳本驗證功能是否正確:
bash
復制編輯
sudo /etc/init.d/gpio407_init start
驗證:
bash
復制編輯
cat /sys/class/gpio/gpio407/value # 應輸出 1
六、注意事項
-
權限問題:腳本執行的所有
echo > /sys/...
操作必須使用root
權限,直接用sudo
執行整個腳本,不要對單獨的echo
使用sudo
,否則會因 shell 權限問題失敗。 -
腳本調試:可以在腳本中加入日志輸出,例如
echo "xxx" >> /var/log/gpio.log
方便調試。 -
GPIO不可導出:如果
/sys/class/gpio/export
不存在,可能是內核不支持 GPIO sysfs 接口,需要啟用相關內核選項。
七、其他:如何禁用腳本
如果不再需要該腳本,可以移除注冊:
bash
復制編輯
sudo update-rc.d -f gpio407_init remove
然后手動刪除腳本:
bash
復制編輯
sudo rm /etc/init.d/gpio407_init
八、總結
盡管 Ubuntu 20 已默認使用 systemd,但 init.d
腳本依然兼容且適用嵌入式控制、GPIO 操作等早期初始化需求。按照本文方法配置,可以輕松實現開機自動執行。
如需改為 systemd 方式,歡迎繼續閱讀或留言,我可以幫你轉換為 .service
文件。
在 Ubuntu 20.04 中使用 systemd 實現 GPIO 上電(以 GPIO407 為例)
對于嵌入式 Linux 系統或開發板平臺,我們常常需要在開機時自動設置 GPIO 引腳方向及電平。使用 systemd
編寫自定義 .service
文件是一種推薦方式。
一、前提條件
-
你必須有 root 權限。
-
目標 GPIO(如 GPIO407)可通過
/sys/class/gpio/
接口操作。 -
Kernel 配置項開啟了
CONFIG_GPIO_SYSFS
。
二、編寫設置 GPIO 的腳本
1. 創建腳本文件
bash
復制編輯
sudo nano /usr/local/bin/gpio407_set_high.sh
2. 填寫內容如下:
bash
復制編輯
#!/bin/bash GPIO=407 # Export GPIO if not already exported if [ ! -d "/sys/class/gpio/gpio$GPIO" ]; then echo $GPIO > /sys/class/gpio/export sleep 0.1 fi # 設置方向為輸出,并拉高 echo out > /sys/class/gpio/gpio$GPIO/direction echo 1 > /sys/class/gpio/gpio$GPIO/value
3. 設置腳本權限
bash
復制編輯
sudo chmod +x /usr/local/bin/gpio407_set_high.sh
三、創建 systemd 服務文件
1. 創建服務文件
bash
復制編輯
sudo nano /etc/systemd/system/gpio407.service
2. 內容如下:
ini
復制編輯
[Unit] Description=Set GPIO407 High at boot After=multi-user.target [Service] Type=oneshot ExecStart=/usr/local/bin/gpio407_set_high.sh RemainAfterExit=true [Install] WantedBy=multi-user.target
說明:
-
Type=oneshot
表示只執行一次,不常駐。 -
RemainAfterExit=true
保留“已啟動”狀態。 -
WantedBy=multi-user.target
表示在正常系統運行級別啟動。
四、啟用服務并重啟
啟用服務
bash
復制編輯
sudo systemctl enable gpio407.service
立即啟動(測試)
bash
復制編輯
sudo systemctl start gpio407.service
查看狀態
bash
復制編輯
sudo systemctl status gpio407.service
五、驗證 GPIO 是否設置成功
bash
復制編輯
cat /sys/class/gpio/gpio407/value # 應該輸出 1
六、卸載或禁用服務
如不再需要:
bash
復制編輯
sudo systemctl disable gpio407.service sudo rm /etc/systemd/system/gpio407.service sudo rm /usr/local/bin/gpio407_set_high.sh
七、與 init.d 的比較
項目 | init.d | systemd |
---|---|---|
兼容性 | 兼容但過時 | 推薦使用 |
并發支持 | 無 | 是 |
狀態管理 | 簡單 | 細致、支持依賴 |
日志 | 需手動 | 自動記錄(journalctl ) |
八、結語
使用 systemd
管理 GPIO 初始化是一種現代、清晰、可靠的方式,特別適合在需要嚴格控制啟動順序、可靠運行的環境中。建議優先采用這種方式進行嵌入式系統自啟動腳本部署。
如果你還需要同時配置多個 GPIO 或串口、電源等資源,也可以在腳本中統一處理,systemd 會一次完成初始化。