添加社区软件包proftpd教程

描述

14.7.3添加社区软件包proftpd

通常我们的应用还需要实现开机自启动,这些也可以在配方中实现。下面以一个稍微复杂一点的FTP服务应用为例说明如何使用Yocto构建包含特定应用的生产镜像,这里的FTP服务程序采用的是开源的Proftpd,各个版本源码位于ftp://ftp.proftpd.org/distrib/source/。

本节重点描述如何移植FTP服务到目标机器中的方法。通过搜索当前源代码仓库发现Yocto项目中已经存在proftpd的配方,只是没有添加的系统镜像中。下面详细描述具体的移植过程。

01查找Yocto的proftpd配方

 

bitbake -s | grep proftpd

 

注:这里可以看到Yocto项目中已经存在proftpd配方,版本为1.3.6-r0。

程序

02单独编译proftpd

左右滑动查看完整内容

 

PC:~/renesas/yocto/build-remi-1g$ bitbake proftpd

 

程序

03打包proftpd到文件系统

在conf/local.conf中增加一行语句:

左右滑动查看完整内容

 

IMAGE_INSTALL_append = " proftpd"

 

程序

04重新构建镜像

左右滑动查看完整内容

 

PC:~/renesas/yocto/build-remi-1g$ bitbake myir-image-full

 

程序

05烧录新镜像

系统构建完成之后,需重新烧录镜像并查看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,不需要设置密码,用户登录后可以查看系统/var/lib/ftp目录下的内容,默认没有写权限。

由于系统默认不存在/var/lib/ftp目录,所以需要用户在目标机器上创建一个目录/var/lib/ftp。

为了尽量不修改meta-openembbed,我们可以通过为proftpd recipes添加Append文件“proftpd_1%.bbappend”来实现/var/lib/ftp目录的创建。

首先需要在meta-myir-remi/recipes-common/recipes-devtools/目录下新建一个proftpd文件夹,之后进入文件夹,新建一个proftpd_1%.bbappend文件。加入下面这段task安装任务,保存退出至构建目录。然后重复之前章节添加应用的步骤,重新构建镜像文件进行测试。

左右滑动查看完整内容

 

do_install_append() {
install -m 755 -d ${D}/var/lib/${FTPUSER}
chown ftp:ftp ${D}/var/lib/${FTPUSER}
}

 

程序

普通账户

在目标机器上使用useradd和passwd命令可以创建普通用户,并设置用户密码之后,客户端也可以使用该普通账户登录到该用户的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实现proftpd自启动

本节将以proftpd为例从recipe源码的层面介绍如何添加应用程序recipe并实现程序的开机自启动。

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
……
}

 

这两个函数对应BitBake构建过程的config和install任务。

关于任务的更多信息,参见下方链接。

关于任务的更多信息

https://www.yoctoproject.org/docs/3.1.1/mega-manual/mega-manual.html#ref-tasks

当前目标机器采用systemd作为初始化管理子系统systemd是一个Linux系统基础组件的集合,提供了一个系统和服务管理器,运行为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变量并实现开机自启动,用户自己编写的recipes也可以通过设置变量SYSTEMD_AUTO_ENABLE实现开机自启动,示例如下:

左右滑动查看完整内容

 

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:表示需要启动的程序,及对应的参数。

如需了解更多关于systemd的信息请查看此网站。

未完待续

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分