Как обойти ошибку в файле eclass, расположенном в наложении Gentoo?

Это может быть немного надумано, но для меня это выводит одну точку:

vim -En '+a|.x' '+s/x//' '+p' '+q!' -

(Вы упомянули гольф, так что, возможно, это не сработает для вас, так как добавляет относительно большое количество символов , Обязательно подробно опишите любые конкретные ограничения, если они у вас есть.)

1
25.03.2017, 07:52
2 ответа

Два возможных пути. Первый вариант проще, но не тестировался:

Простой способ: установить поддерживаемую версию и обновить ее до неподдерживаемой

Ошибка в этом случае возникает во время чистой установки неподдерживаемой ] версия 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 , а не экласс , и поскольку он находится в вашем собственном локальном оверлее, вы можете легко обойти кеш, используя правильный 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
0
28.01.2020, 00:58

Я не совсем понимаю, что вы здесь делаете, но следует отметить важный момент:

Если вы не появляетесь повторно mysql перед запуском - config , конфигурация, которую вы используете, будет считана не из любого из ваших эклассов в оверлее, а из файлов в / var / db / pkg / * / * / environment.bz2

При установке пакета можно сделать несколько действительно забавных трюков, например, если вы напишете ebuild и экспортируете переменную в src_compile ... эта переменная, скорее всего, все еще будет доступна во время pkg_config

Если вы попробуете найти этот файл environment.bz2 , вы увидите все встроенные функции mysql eclass.

Следовательно, как вы указали в своем другом ответе, обновление, похоже, исправляет это.

Но он исправляет это, заменяя установленные копии кода eclass :)

0
28.01.2020, 00:58

Теги

Похожие вопросы