OpenWrt Feeds
在OpenWrt中,“feed”是一组共享相同位置的packages的集合。Feed可以位于远程服务器、版本控制系统、本地文件系统或任何其他通过支持的feed方法使用单个名称(路径/URL)寻址的位置。
Feed是OpenWrt Buildroot的额外预定义软件包构建配方。可以通过feed配置文件来配置它们,以支持自定义feed或非默认的feed软件包。
Feed Configuration
可用的feed列表是从存在的“feeds.conf”文件或者“feeds.conf.default”文件中进行配置。该文件包含一个feed列表,每个feed单独列在一行上。每个feed行由3个以空格分隔的组件组成:feed方法、feed名称和feed源。在解析过程中,空行、过多的空格/换行符和注释将被忽略。注释以“#“开头,延伸到行尾。
截至2018年12月15日的”master”分支上,“feeds.conf.default”中的默认配置如下所示。请注意,以“#“开头的行是注释行,为了方便配置而包含在内。
- feeds.conf.default
src-git packages https://git.openwrt.org/feed/packages.git src-git luci https://git.openwrt.org/project/luci.git src-git routing https://git.openwrt.org/feed/routing.git src-git telephony https://git.openwrt.org/feed/telephony.git #src-git video https://github.com/openwrt/video.git #src-git targets https://github.com/openwrt/targets.git #src-git management https://github.com/openwrt-management/packages.git #src-git oldpackages http://git.openwrt.org/packages.git #src-link custom /usr/src/openwrt/custom-feed
git方法可以使用以下格式指定特定的分支或提交:
src-git local_feed_name https://example.com/repo_name/something.git;branch_name src-git local_feed_name https://example.com/repo_name/something.git^commit_hash
截至目前,支持以下feed方法:
Method | Function |
---|---|
src-bzr | 数据使用”bzr”从源路径/URL下载。 |
src-cpy | 数据从源路径复制。路径可以相对于OpenWrt存储库根目录或绝对路径来指定。 |
src-darcs | 数据使用“darcs”从源路径/URL下载。 |
src-git | 数据使用“git”作为浅层(深度为1)克隆从源路径/URL下载。 |
src-git-full | 数据使用“git”作为完整克隆从源路径/URL下载。 |
src-gitsvn | Subversion(SVN)仓库和Git之间的双向操作可以通过使用git-svn工具实现。 |
src-hg | 数据使用“hg”从源路径/URL下载。 |
src-link | 会创建一个指向源路径的符号链接。路径必须是绝对路径。 |
src-svn | 数据使用“svn”从源路径/URL下载。 |
Feed名称用于标识feed,并作为创建用于保存有关feed信息的多个文件和目录名称的基础。Feed源是下载feed数据的位置。
对于上述依赖于支持“有限历史记录”选项的版本控制系统(例如git的“--depth=1”和bzr的“--lightweight”),将下载最小可用的历史记录。这是一个很好的默认设置,但是那些正在积极提交feed和/或使用提交历史记录的开发人员可能希望更改此行为。可以通过编辑“scripts/feeds”来使用“src-git-full”,或者在不使用“scripts/feeds”的情况下检出feed来完成此操作。可以通过使用“git fetch --unshallow”将浅层git克隆更新为“完整”克隆。
使用Feeds
截至2018年12月,feeds是由位于“openwrt/openwrt.git”存储库中的“scripts/feeds”脚本检索和管理的。“feeds”脚本将来自各种feed源的软件包整合到OpenWrt构建系统中。这是一个两步骤的过程,在构建镜像之前,开发人员通过更新feed,然后安装来自该feed的特定软件包。
在“update”步骤中,feeds从feed配置中列出的源获取,并复制到“feeds”目录中。成功更新后,每个feed中的每个软件包配方都在“feeds/<feed_name>/<package_name>/“文件夹中表示,但它们目前尚未包含在OpenWrt构建系统中,因为它们不在”package/“目录中。
在”install”步骤中,从“update”过程中获取的feeds中的软件包被链接到“package/feeds/<feed_name>“文件夹中,其中”<feed_name>“被替换为feed配置中的feed名称。完成此步骤后,可以通过在”package/“文件夹中使用软件包的路径来执行特定于软件包的make操作。例如:
make package/feeds/<feed_name>/<package_name>
$ ./scripts/feeds Usage: ./scripts/feeds <command> [options] Commands: list [options]: List feeds, their content and revisions (if installed) Options: -n : List of feed names. -s : List of feed names and their URL. -r <feedname>: List packages of specified feed. -d <delimiter>: Use specified delimiter to distinguish rows (default: spaces) -f : List feeds in feeds.conf compatible format (when using -s). install [options] <package>: Install a package Options: -a : Install all packages from all feeds or from the specified feed using the -p option. -p <feedname>: Prefer this feed when installing packages. -d <y|m|n>: Set default for newly installed packages. -f : Install will be forced even if the package exists in core OpenWrt (override) search [options] <substring>: Search for a package Options: -r <feedname>: Only search in this feed uninstall -a|<package>: Uninstall a package Options: -a : Uninstalls all packages. update -a|<feedname(s)>: Update packages and lists of feeds in feeds.conf . Options: -a : Update all feeds listed within feeds.conf. Otherwise the specified feeds will be updated. -i : Recreate the index only. No feed update from repository is performed. -f : Force updating feeds even if there are changed, uncommitted files. clean: Remove downloaded/generated files.
Feed命令
可以通过”scripts/feeds”脚本来使用Feeds。调用“scripts/feeds”而不带任何参数会生成可用命令的列表。大多数命令需要本地可用的feed信息,因此通常需要先运行update命令。在下面的讨论中,术语“适用的软件包”通常指的是命令行上给出的软件包名称,或者在使用-a选项时指的是feed中的所有软件包。
Clean
clean命令会删除本地存储的feed数据,包括feed索引和feed中所有软件包的数据(但不会删除install命令创建的符号链接,这些链接将在update命令重新下载feed之前处于悬空状态)。这是通过删除“feeds”目录及其所有子目录来完成的。
安装
install命令安装适用的软件包以及适用软件包所依赖的任何软件包(包括直接依赖和构建依赖)。安装过程包括将“package/feeds/$feed_name/$package_name”创建为到“feeds/$feed_name/$package_name”的符号链接,以便在搜索“packages”目录层次结构时将软件包包含在配置过程中。
命令 | 描述 |
---|---|
./scripts/feeds install -a | 安装所有软件包(非必需;可以根据需要为构建速度较慢的机器逐个安装软件包) |
./scripts/feeds install luci | 仅安装LuCI软件包 |
./scripts/feeds install -a -p luci | 通过从首选feed(-p)luci安装所有(-a)软件包来安装完整的LuCI WebUI |
有关默认可用的feeds列表,请参阅上面的部分。
请注意,这取代了创建符号链接的旧方法,这个旧方法仍然可以在许多旧的论坛和用户组条目中找到。 |
列表
list命令从适用的feeds的索引文件中读取并显示每个feed中的软件包列表。索引文件存储在“feeds”目录中,文件名以feed的名称为后缀,后跟“.index”。该文件由update命令生成。
搜索
search命令通过读取feed元数据并列出与给定搜索条件匹配的软件包。
卸载
uninstall命令与install命令相反(尽管它不以任何方式处理依赖软件包)。它只是从“package/feeds”的子目录中删除对软件包的任何符号链接。
更新
当调用“scripts/feeds update”时,会将每个适用的feed从其源位置下载到“feeds”目录的子目录中,子目录的名称与feed名称相对应。然后,它会将feed中的软件包信息解析到由list和search命令使用的索引文件中。
命令 | 描述 |
---|---|
./scripts/feeds update packages luci | 检出packages和luci feeds。 |
请注意,update还会将feed的配置位置存储在“feeds/$feed_name.tmp/location”中,以便可以检测和适当处理配置的更改。
在检索后,下载的软件包需要进行“安装”。只有在安装后,它们才会在配置界面中可用!
自定义Feeds
好的,您已经开发了自己的软件包,现在您想通过make menuconfig来使用它,或者您正在开发一个软件包,并希望在尝试将其包含在OpenWrt之前在构建中进行测试。
解决方案是创建一个自定义feed。您可以创建一个全新的feed,或者使用一个标准feed的修改版本。
创建软件包目录
在本示例中,我们假设您的基本目录是“/home/user/openwrt”。
将您的软件包添加到现有的feed中
将您的软件包添加到自己的feed中
在本示例中,我们假设您将您的feed命名为“custom”,您的项目名为“helloworld”,其OpenWrt的Makefile位于“/usr/src/openwrt/custom-feed/helloworld/Makefile”。
- 编辑
/home/user/openwrt/feeds.conf.default
- Add a new line for your feed.
src-link custom /usr/src/openwrt/custom-feed/
- Update the feed: from the
<buildroot dir>
(e.g./home/user/openwrt
) do:./scripts/feeds update custom
- And then install it
./scripts/feeds install -a -p custom
使用feed
- 现在,当您执行
make menuconfig
时,您的软件包应该可用。
解释
下载的源代码(在软件包的Makefile中引用)不在那里... 下载的文件首先以.gz文件的形式存储在<buildroot>/dl目录中。然后它们被解压到/build_dir目录中。例如,可以在<buildroot>/build_dir/target-*/目录下找到每个软件包源代码的子目录。
文档
- OpenWrt Buildroot – Feeds
- OpenWrt Buildroot – 技术参考 这篇文章需要您的关注。