1. 程式人生 > 其它 >迅為IMX8MM開發板Yocto系統設定開機自啟動

迅為IMX8MM開發板Yocto系統設定開機自啟動

1、Systemd 服務簡介
Systemd 是Linux下的一種 init 軟體,其開發目標是提供更優秀的框架以表示系統服務間的依賴關係,並以此實現系統初始化時,服務的並行啟動,同時達到降低 Shell 系統開銷的效果。它融合之前 service 和chkconfig 的功能於一體。可以使用它永久性或只在當前會話中啟用/禁用服務。
核心啟動完成後,傳統的的啟動首先執行的第一個程序是/sbin/init。如果要以 systemd 方式啟動,首先讓核心執行的第一個程式是/lib/systemd/system 或者/usr/lib/systemd/system。
啟動以後,首先會去三個目錄下找相應的配置檔案,按優先順序從高到低分別是/etc/systemd/usr/lib/systemd lib /lib/systemd/ 優先順序高的配置檔案會覆蓋優先順序低的配置檔案。
2、建立服務檔案
服務檔案格式一般如下所示:
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[Unit]
Description : 服務的簡單描述
Documentation : 服務文件
Before、After:定義啟動順序。
Before=xxx.service,代表本服務在 xxx.service 啟動之前啟動。
After=xxx.service,代表本服務在 xxx.service 之後啟動。
Requires:這個單元啟動了,它需要的單元也會被啟動;它需要的單元被停止了,這個單元也停止了。
Wants:推薦使用。這個單元啟動了,它需要的單元也會被啟動;它需要的單元被停止了,對本單元沒
有影響。
[Sravi r]
Type=simple(預設值):systemd 認為該服務將立即啟動。服務程序不會 fork。如果該服務要啟動其他
服務,不要使用此型別啟動,除非該服務是 socket 啟用型。
Type=forking:systemd 認為當該服務程序 fork,且父程序退出後服務啟動成功。對於常規的守護程序
(daemon),除非你確定此啟動方式無法滿足需求,使用此型別啟動即可。使用此啟動型別應同時指定
PIDFile=,以便 systemd 能夠跟蹤服務的主程序。
Type=oneshot:這一選項適用於只執行一項任務、隨後立即退出的服務。可能需要同時設定
RemainAfterExit=yes 使得 systemd 在服務程序退出之後仍然認為服務處於啟用狀態。
Type=notify:與 Type=simple 相同,但約定服務會在就緒後向 systemd 傳送一個訊號。這一通知的實
現由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式啟動,當指定的 BusName 出現在 DBus 系統總線上時,systemd 認為服務就緒。
Type=idle: systemd 會等待所有任務(Jobs)處理完成後,才開始執行 idle 型別的單元。除此之外,其他行
為和 Type=simple 類似。
PIDFile:pid 檔案路徑
ExecStart:指定啟動單元的命令或者指令碼,ExecStartPre 和 ExecStartPost 節指定在 ExecStart 之前或者之
後用戶自定義執行的指令碼。Type=oneshot 允許指定多個希望順序執行的使用者自定義命令。
ExecReload:指定單元停止時執行的命令或者指令碼。
ExecStop:指定單元停止時執行的命令或者指令碼。
PrivateTmp:True 表示給服務分配獨立的臨時空間
Restart:這個選項如果被允許,服務重啟的時候程序會退出,會通過 systemctl 命令執行清除並重啟的操作。
RemainAfterExit:如果設定這個選擇為真,服務會被認為是在啟用狀態,即使所以的程序已經退出,預設的值為假,這個選項只有在 Type=oneshot 時需要被配置。
[Instwll]
Alias:為單元提供一個空間分離的附加名字。
RequiredBy:單元被允許執行需要的一系列依賴單元,RequiredBy 列表從 Require 獲得依賴資訊。
WantBy:單元被允許執行需要的弱依賴性單元,Wantby 從 Want 列表獲得依賴資訊。
Also:指出和單元一起安裝或者被協助的單元。
DefaultInstance:例項單元的限制,這個選項指定如果單元被允許執行預設的例項。
3、操作服務
啟動服務
systemctl start test.service
關閉服務
systemctl stop test.service
重啟服務
systemctl restart test.service

顯示服務的狀態
systemctl status test.service
在開機時啟用服務
systemctl enable test.service
在開機時禁用服務
systemctl disable test.service
檢視服務是否開機啟動
systemctl is-enabled test.service
檢視已啟動的服務列表
systemctl list-unit-files|grep enabled
檢視啟動失敗的服務列表
systemctl --failed
4、配置自啟動程式
本章節在此介紹一種使用 systemd 方式來配置任意開機自啟動程式的方法。
1.首先將 iMX8MM 開發板上電啟動,在開發板終端中進入到/home/root/目錄下,執行如下命令建立一個指令碼檔案:
touch helloworld.sh
<ignore_js_op>
2.向 helloworld.sh 寫入自定義的命令,作者寫的命令如下所示,開機自動建立資料夾。
echo '#!/bin/sh
mkdir -p /home/topeet/test
<ignore_js_op>
3.然後修改許可權,輸入以下命令:
chmod 777 /home/root/helloworld.sh

<ignore_js_op>
4.我們進入到“/lib/systemd/system/”目錄下,並新建一個 helloworld.service 檔案,命令如下:
cd /lib/systemd/system
vi helloworld.service
<ignore_js_op>
helloworld.service 檔案的內容如下:
[Unit]
Description=helloworld
After=basic.service X.service thermal-zone-init.service
[Service]
ExecStart=/home/root/helloworld.sh
[Install]
WantedBy=multi-user.target
Description 需寫入服務名, ExecStart 需要寫入可執行檔案的絕對路徑。然後儲存檔案並退出,如下圖所示:

<ignore_js_op>

5.png


5.然後我們在串列埠終端輸入以下命令
systemctl -f enable /lib/systemd/system/helloworld.service
<ignore_js_op>
6.此時即可將新新增的自啟動服務生效,重啟開發板後,此程式即可自動執行,檢視是否生成了資料夾,如下圖所示:

<ignore_js_op>
7.如果您自定義的服務啟動不了,可以根據上一小節提供的方法檢視服務的執行狀態,查詢原因。