14.7.3添加社區(qū)軟件包proftpd
通常我們的應用還需要實現(xiàn)開機自啟動,這些也可以在配方中實現(xiàn)。下面以一個稍微復雜一點的FTP服務應用為例說明如何使用Yocto構建包含特定應用的生產鏡像,這里的FTP服務程序采用的是開源的Proftpd,各個版本源碼位于ftp://ftp.proftpd.org/distrib/source/。
本節(jié)重點描述如何移植FTP服務到目標機器中的方法。通過搜索當前源代碼倉庫發(fā)現(xiàn)Yocto項目中已經(jīng)存在proftpd的配方,只是沒有添加的系統(tǒng)鏡像中。下面詳細描述具體的移植過程。
01查找Yocto的proftpd配方
bitbake -s | grep proftpd
注:這里可以看到Yocto項目中已經(jīng)存在proftpd配方,版本為1.3.6-r0。

02單獨編譯proftpd
左右滑動查看完整內容
PC:~/renesas/yocto/build-remi-1g$ bitbake proftpd

03打包proftpd到文件系統(tǒng)
在conf/local.conf中增加一行語句:
左右滑動查看完整內容
IMAGE_INSTALL_append = " proftpd"

04重新構建鏡像
左右滑動查看完整內容
PC:~/renesas/yocto/build-remi-1g$ bitbake myir-image-full

05燒錄新鏡像
系統(tǒng)構建完成之后,需重新燒錄鏡像并查看proftpd服務是否運行:
左右滑動查看完整內容
root@myir-remi-1g:~# ps -axu | grep proftpd root 501 0.0 0.0 2780 624 ttySC0 S+ 00:39 0:00 grep proftpd
06ftp賬戶權限配置
這里補充說明一下FTP的賬戶設置。FTP客戶端有三種類型登錄賬戶,分別為匿名賬戶,普通賬戶和root賬戶。
匿名賬戶
用戶名默認為ftp,不需要設置密碼,用戶登錄后可以查看系統(tǒng)/var/lib/ftp目錄下的內容,默認沒有寫權限。
由于系統(tǒng)默認不存在/var/lib/ftp目錄,所以需要用戶在目標機器上創(chuàng)建一個目錄/var/lib/ftp。
為了盡量不修改meta-openembbed,我們可以通過為proftpd recipes添加Append文件“proftpd_1%.bbappend”來實現(xiàn)/var/lib/ftp目錄的創(chuàng)建。
首先需要在meta-myir-remi/recipes-common/recipes-devtools/目錄下新建一個proftpd文件夾,之后進入文件夾,新建一個proftpd_1%.bbappend文件。加入下面這段task安裝任務,保存退出至構建目錄。然后重復之前章節(jié)添加應用的步驟,重新構建鏡像文件進行測試。
左右滑動查看完整內容
do_install_append() {
install -m 755 -d ${D}/var/lib/${FTPUSER}
chown ftp:ftp ${D}/var/lib/${FTPUSER}
}

普通賬戶
在目標機器上使用useradd和passwd命令可以創(chuàng)建普通用戶,并設置用戶密碼之后,客戶端也可以使用該普通賬戶登錄到該用戶的HOME目錄。
如果需要在編譯鏡像時包含普通用戶,可以參照以下鏈接添加普通用戶,然后重新構建鏡像文件,具體方法這里不再描述。(您可復制下方鏈接至瀏覽器,或掃描二維碼進行查看)
添加普通用戶
https://docs.yoctoproject.org/3.1.1/mega-manual/mega-manual.html#ref-classes-useradd
root賬戶
如果需要開放root賬戶登錄FTP服務器,需要先修改 /etc/proftpd.conf文件,在文件中增加一行配置 "RootLogin on"。與此同時,也需要為root賬戶設置密碼,重啟proftpd服務之后,客戶端也可以使用root賬戶登錄到目標機器上。
左右滑動查看完整內容
root@myir-remi-1g:/# systemctl restart proftpd
注意:修改/etc/proftpd.conf使能root賬戶登錄僅用于測試目的,關于/etc/proftpd.conf的更多配置,參見下方鏈接。(您可復制下方鏈接至瀏覽器,或掃描二維碼進行查看)
關于/etc/proftpd.conf的更多配置
http://www.proftpd.org/docs/example-conf.html
07實現(xiàn)proftpd自啟動
本節(jié)將以proftpd為例從recipe源碼的層面介紹如何添加應用程序recipe并實現(xiàn)程序的開機自啟動。
proftpd位于源代碼倉庫layers/meta-openembedded/meta-networking/recipesdaemons/proftpd,目錄結構如下。

左右滑動查看完整內容
ubuntu@ubuntu2004:~/renesas/yocto/myir-renesas-yocto$:~/renesas/yocto/layers/meta-op enembedded/meta-networking/recipes-daemons/proftpd$ . ├── files │ ├── basic.conf.patch │ ├── build_fixup.patch │ ├── close-RequireValidShell-check.patch │ ├── contrib.patch │ ├── default │ ├── proftpd-basic.init │ └── proftpd.service └── proftpd_1.3.6.bb 1 directory, 8 files
?proftpd_1.3.6.bb為構建proftpd服務的配方
?proftpd.service為開機自啟動服務
?proftpd-basic.init為proftpd的啟動腳本
proftpd_1.3.6.bb中指定了獲取proftpd服務程序的源代碼路徑以及針對該版本源碼的一些補丁文件,如下:
左右滑動查看完整內容
SRC_URI = "ftp://ftp.proftpd.org/distrib/source/${BPN}-${PV}.tar.gz
file://basic.conf.patch
file://proftpd-basic.init
file://default
file://close-RequireValidShell-check.patch
file://contrib.patch
file://build_fixup.patch
file://proftpd.service
recipes配方中還指定了proftpd的Task配置任務(do_configure)和安裝過程(do_install):
左右滑動查看完整內容
# proftpd uses libltdl which currently makes configuring using
# autotools.bbclass a pain...
do_configure () {
install -m 0755 ${STAGING_DATADIR_NATIVE}/gnu-config/config.guess ${S}
install -m 0755 ${STAGING_DATADIR_NATIVE}/gnu-config/config.sub ${S}
oe_runconf
cp ${STAGING_BINDIR_CROSS}/${HOST_SYS}-libtool ${S}/libtool
}
FTPUSER = "ftp"
FTPGROUP = "ftp"
do_install () {
oe_runmake DESTDIR=${D} install
rmdir ${D}${libdir}/proftpd ${D}${datadir}/locale
[ -d ${D}${libexecdir} ] && rmdir ${D}${libexecdir}
sed -i '/ *User[ ]*/s/ftp/${FTPUSER}/' ${D}${sysconfdir}/proftpd.conf
sed -i '/ *Group[ ]*/s/ftp/${FTPGROUP}/' ${D}${sysconfdir}/proftpd.conf
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${WORKDIR}/proftpd-basic.init ${D}${sysconfdir}/init.d/proftpd
sed -i 's!/usr/sbin/!${sbindir}/!g' ${D}${sysconfdir}/init.d/proftpd
sed -i 's!/etc/!${sysconfdir}/!g' ${D}${sysconfdir}/init.d/proftpd
sed -i 's!/var/!${localstatedir}/!g' ${D}${sysconfdir}/init.d/proftpd
sed -i 's!^PATH=.*!PATH=${base_sbindir}:${base_bindir}:${sbindir}:${bindir}!'
${D}${sysconfdir}/init.d/proftpd
install -d ${D}${sysconfdir}/default
install -m 0755 ${WORKDIR}/default ${D}${sysconfdir}/default/proftpd
……
}
這兩個函數(shù)對應BitBake構建過程的config和install任務。
關于任務的更多信息,參見下方鏈接。
關于任務的更多信息
https://www.yoctoproject.org/docs/3.1.1/mega-manual/mega-manual.html#ref-tasks
當前目標機器采用systemd作為初始化管理子系統(tǒng)systemd是一個Linux系統(tǒng)基礎組件的集合,提供了一個系統(tǒng)和服務管理器,運行為PID 1并負責啟動其它程序。Yocto項目下使用systemd的配置參見下方鏈接。(您可復制下方鏈接至瀏覽器,或掃描二維碼進行查看)
Yocto項目下使用systemd的配置
https://docs.yoctoproject.org/3.1.1/mega-manual/mega-manual.html#selecting-an-initialization-managerproftpd_1.3.6.bb
通過繼承systemd.class(具體內容可以查看poky/meta/classes/systemd.bbclass)默認使能了 SYSTEMD_AUTO_ENABLE變量并實現(xiàn)開機自啟動,用戶自己編寫的recipes也可以通過設置變量SYSTEMD_AUTO_ENABLE實現(xiàn)開機自啟動,示例如下:
左右滑動查看完整內容
SYSTEMD_AUTO_ENABLE_${PN} = "enable"
其中Proftpd服務的開機自啟動服務文件proftpd.service內容如下:
左右滑動查看完整內容
ubuntu@ubuntu2004:~/renesas/yocto/layers/meta-openembedded/meta-networking/recipes-d aemons/proftpd/files$ cat proftpd.service [Unit] Description=proftpd Daemon After=network.target [Service] Type=forking ExecStart=@SBINDIR@/proftpd -c @SYSCONFDIR@/proftpd.conf StandardError=syslog [Install] WantedBy=default.target
?After:表示此服務在network啟動后再啟動。
?Type:表示啟動的方式為forking。
?ExecStart:表示需要啟動的程序,及對應的參數(shù)。
如需了解更多關于systemd的信息請查看此網(wǎng)站。
未完待續(xù)
-
移植
+關注
關注
1文章
408瀏覽量
29234 -
FTP
+關注
關注
0文章
118瀏覽量
42037 -
程序
+關注
關注
117文章
3836瀏覽量
84812 -
軟件包
+關注
關注
0文章
113瀏覽量
12095
發(fā)布評論請先 登錄
Openwrt開發(fā)指南 第12章 添加OpenWrt軟件包
RT-Thread Studio添加軟件包報錯怎么解決?
ENV添加micropython軟件包出現(xiàn)異常的原因?
RT-thread studio添加新的軟件包和新的文件出錯怎么解決?
如何使用menuconfig添加配置micro-ros軟件包?
RTThread settings添加軟件包界面不顯示求解
RT-THREAD studio 2.0.0不能添加軟件包能幫忙看看是什么問題嗎
在rt-thread studio里添加軟件包失敗怎么解決?
RT-Thread軟件包定義和使用
RT-Thread社區(qū)上有哪些優(yōu)秀的軟件包?
什么是Linux軟件包,如何管理它們
RT-Thread在線軟件包改為本地軟件包的方法
使用pkgs-test工具對軟件包進行qemu測試
RT-Thread中mymqtt軟件包的使用方法

添加社區(qū)軟件包proftpd教程
評論