![如何解决位于 Gentoo 覆盖层中的 eclass 文件中的错误?](https://linux22.com/image/108256/%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E4%BD%8D%E4%BA%8E%20Gentoo%20%E8%A6%86%E7%9B%96%E5%B1%82%E4%B8%AD%E7%9A%84%20eclass%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E9%94%99%E8%AF%AF%EF%BC%9F.png)
(交叉发布自Gentoo论坛)
我尝试编辑.eclass
文件以纠正错误,但似乎我的编辑被某处的缓存击败了。当我运行命令时出现初始错误emerge --config =dev-db/mysql-5.7.12
,我必须执行该命令才能完成 MySQL 版本的安装。该命令失败并/var/log/mysql/mysqld.err
显示:
[ERROR] Too many arguments (first extra is
''--init-file=/var/tmp/portage/dev-db/mysql-5.7.12/temp/tmp.COaXRiJpf9'').
我追踪到一个名为mysql-multilib-r1.eclass
.我在我的系统上发现了该文件的两个版本;一个位于 Gentoo 主存储库中(优先级 -1000)/usr/portage/eclass/
,另一个位于覆盖存储库中(+50)。覆盖存储库由以下人员维护外行覆盖层的名称是 'mysql'。 — 我用它来访问 MySQL 5.7,尚未到达主存储库。 — 具体来说,我将错误追溯到第 953 行文件的覆盖版本,或主版本中的 945:
initialize_options="--initialize-insecure '--init-file=${sqltmp}'"
可能单引号导致该--init-file
选项被解释为正确的参数。我只需要删除它们。但当我这样做时,却没有任何效果。我对此文件的编辑(无论我编辑哪个版本)都会被忽略。我一直小心地删除其中的内容,/var/tmp/portage
以防它缓存在那里。我还尝试同步存储库:
layman --sync ALL
emerge --sync
我尝试同步它们前编辑文件的两个版本,以及编辑后 - 在这种情况下,破坏了我对主版本的编辑,但(奇怪的是)不是覆盖版本。都没有帮助。
这Gentoo开发手册建议我可能需要“在更新覆盖 eclass 后手动触摸所有相关覆盖文件”。我也尝试这样做;触摸这些目录下的所有文件:
/usr/portage/dev-db
/usr/portage/eclass
/usr/portage/virtual/mysql
/var/lib/layman/mysql/dev-db
/var/lib/layman/mysql/eclass
/var/lib/layman/mysql/metadata
/var/lib/layman/mysql/profiles
/var/lib/layman/mysql/virtual
当我下次运行该emerge
命令时,它首先输出:
Performing Global Updates
(Could take a couple of minutes if you have a lot of binary packages.)
.='update pass' *='binary update' #='/var/db update' @='/var/db move'
s='/var/db SLOT move' %='binary move' S='binary SLOT move'
p='update /etc/portage/package.*'
/var/lib/layman/mysql/profiles/updates/3Q-2014.
但仍然我的编辑被忽略了。 — 如何编辑此.eclass
文件以使我的编辑真正生效?或者我还能如何解决这样的错误?
答案1
两种可能的方式。第一个更容易但未经测试:
简单方法:安装支持的版本并升级到不受支持的版本
这种情况下的错误发生在干净的安装一个不支持的MySQL 的版本。当运行emerge --config
全新安装(而不是升级)后运行的命令时,会发生这种情况。因此,最简单的解决方法可能是第一的从主存储库安装受支持的较旧版本的 MySQL;然后从覆盖层将其升级到不受支持的更高版本。所以:
$ emerge --ask --verbose dev-db/mysql
验证它要求安装支持的版本。让它运行,然后按照指示完成安装:
$ emerge --config =dev-db/mysql-SUPPORTED.VERSION
现在从覆盖存储库中取消屏蔽较新的、不受支持的版本,并升级到它:
$ emerge --ask --verbose dev-db/mysql
验证它提供的版本,然后再次让它运行。这应该可行,尽管我还没有测试过;相反,我以艰难的方式做到了。
困难的方法:覆盖 eclass 并处理错误
这开发者手册说, '如果 ebuild 定义了导出的函数,则该函数的优先级高于任何 eclass 版本。这可用于覆盖 eclass 定义的默认值。所以复制mysql-5.7.12.ebuild从“mysql”覆盖层到本地覆盖层(在我的例子中优先级+1000)并在那里修改它,附加覆盖:
pkg_config() { # test override of mysql-multilib-r1_pkg_config
die "ebuild override works!";
}
验证 Portage 将运行 ebuild:
$ equery which dev-db/mysql
/usr/local/portage/dev-db/mysql/mysql-5.7.12.ebuild
然后测试一下:
$ emerge --ask --unmerge dev-db/mysql
$ rm --recursive /var/lib/mysql/* # clean away any remnants
$ emerge --ask --verbose dev-db/mysql
⋮ # waiting while it compiles …
$ emerge --config =dev-db/mysql-5.7.12
果然,它终止并显示消息“ebuild override Works!”。
现在,如果您编辑该ebuild
文件以执行比死亡更有用的操作,然后重做上面的最后一个命令,您将看到它仍然死亡时带有相同的消息。 Portage 缓存仍然是一个问题。但由于这是一个ebuild
文件,而不是,并且由于它位于您自己的本地覆盖中,因此您可以通过使用适当的修订eclass
轻松解决缓存问题:ebuild
$ pwd
/usr/local/portage/dev-db/mysql
$ cp mysql-5.7.12.ebuild mysql-5.7.12-r1.ebuild
并在修订文件中mysql-5.7.12-r1.ebuild
进行编辑pkg_config
以实现真正的修复:
pkg_config() { # modified from mysql-multilib-r1.eclass
# of http://gpo.zugaina.org/Overlays/mysql
einfo "Overriding mysql-multilib-r1_pkg_config from this ebuild"
⋮
# initialize_options="--initialize-insecure '--init-file=${sqltmp}'" # fix:
initialize_options="--initialize-insecure --init-file=${sqltmp} "
⋮
}
然后重新测试一下:
$ rm --recursive /var/lib/mysql/* # clean away any remnants
$ emerge --ask --verbose dev-db/mysql
⋮ # waiting while it recompiles …
$ emerge --config =dev-db/mysql-5.7.12-r1
结果发现pkg_config
仍然有错误:
[ERROR] Failed to open the bootstrap file /var/tmp/portage/ … tmp.PD6hqOe8kA
[ERROR] 1105 Bootstrap file error, return code (0). Nearest query: …
可能是文件权限的问题。无论如何,如果您以 root 身份重新运行失败的命令,它就会起作用:
$ /usr/sbin/mysqld --basedir=/usr \
--loose-skip-grant-tables --loose-skip-host-cache --loose-skip-name-resolve \
--loose-skip-networking --loose-skip-slave-start --loose-skip-ssl \
--loose-skip-log-bin --loose-skip-relay-log --loose-skip-slow-query-log \
--loose-skip-external-locking --loose-skip-log-slave-updates \
--user=mysql --datadir=/var/lib/mysql --tmpdir=/tmp/ --initialize-insecure \
--init-file=/var/tmp/portage/dev-db/mysql-5.7.12-r1/temp/tmp.PD6hqOe8kA
然后继续,手动解释并执行Python代码:
$ chown -R mysql:mysql /var/lib/mysql
$ chmod 0750 /var/lib/mysql
$ /usr/sbin/mysqld
--loose-skip-grant-tables --loose-skip-host-cache --loose-skip-name-resolve \
--loose-skip-networking --loose-skip-slave-start --loose-skip-ssl \
--loose-skip-log-bin --loose-skip-relay-log --loose-skip-slow-query-log \
--loose-skip-external-locking --loose-skip-log-slave-updates \
--user=mysql --log-warnings=0 --basedir=/usr --datadir=/var/lib/mysql \
--max_allowed_packet=8M --net_buffer_length=16K \
--default-storage-engine=MyISAM \
--socket=/var/run/mysqld/mysqld99.sock \
--pid-file=/var/run/mysqld/mysqld99.pid \
--tmpdir=/tmp/ &
验证套接字文件(上面)是否已创建。然后:
$ /usr/bin/mysql --socket=/var/run/mysqld/mysqld99.sock -hlocalhost -e \
"UPDATE mysql.user SET Password = PASSWORD('your-password-here') WHERE USER='root'; FLUSH PRIVILEGES"
这里失败了:
ERROR 1054 (42S22) at line 1: Unknown column 'Password' in 'field list'
我找到了修复堆栈溢出:
$ /usr/bin/mysql --socket=/var/run/mysqld/mysqld99.sock -hlocalhost -e \
"UPDATE mysql.user SET authentication_string = PASSWORD('your-password-here') WHERE USER='root'; FLUSH PRIVILEGES"
最后,终止mysqld
:
$ kill $(< /var/run/mysqld/mysqld99.pid ) # from the --pid-file above
就是这样。现在您可以将 MySQL 添加到运行级别,或手动启动和停止它:
$ /etc/init.d/mysql start
$ /etc/init.d/mysql stop
答案2
我不完全确定你在这里做什么,但应该指出一个重要的观点:
如果您在运行之前没有重新启动 mysql --config
,那么您使用的配置将被读取,而不是从覆盖层中的任何 eclasses 中读取,而是从文件中/var/db/pkg/*/*/environment.bz2
安装一个包有一些非常可爱的技巧,例如,如果您编写一个 ebuild 并导出一个变量src_compile
......该变量可能仍然可以在pkg_config
如果您仔细查看该environment.bz2
文件,您将看到所有内联的 mysql eclass 函数。
因此,正如您在其他答案中所述,升级似乎可以解决此问题。
但它通过替换已安装的 eclass 代码副本来修复它:)