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的信息请查看此网站。
未完待续
全部0条评论
快来发表一下你的评论吧 !