Como solucionar um erro em um arquivo eclass localizado em uma sobreposição do Gentoo?

1

(postagem cruzada do fórum do Gentoo )

Eu tento editar o arquivo .eclass para corrigir o erro, mas parece que minhas edições estão sendo derrotadas por um cache em algum lugar. O erro inicial ocorre quando executo o comando emerge --config =dev-db/mysql-5.7.12 , que devo fazer para concluir a instalação da minha compilação do MySQL. O comando falha e /var/log/mysql/mysqld.err diz:

[ERROR] Too many arguments (first extra is
  ''--init-file=/var/tmp/portage/dev-db/mysql-5.7.12/temp/tmp.COaXRiJpf9'').

Eu segui para um arquivo chamado mysql-multilib-r1.eclass . Eu encontrei duas versões deste arquivo no meu sistema; um no repositório principal do Gentoo (prioridade -1000) sob /usr/portage/eclass/ , e o outro no repositório de sobreposições (+50). O repositório de sobreposições é mantido por Layman e o nome da sobreposição é 'mysql '. - Estou usando para obter acesso ao MySQL 5.7, que não chegou ao repositório principal ainda . - Especificamente, acompanhei o erro até a linha 953 na versão de sobreposição do arquivo ou 945 na versão principal:

initialize_options="--initialize-insecure  '--init-file=${sqltmp}'"

Provavelmente, as aspas simples estão fazendo com que a opção --init-file seja interpretada como um argumento apropriado. Eu só preciso removê-los. Mas quando faço isso, não tem efeito. Minhas edições neste arquivo - não importa qual versão eu edite - são ignoradas. Eu tive o cuidado de excluir o conteúdo de /var/tmp/portage caso ele esteja em cache. Eu também tentei sincronizar os repositórios:

layman --sync ALL
emerge --sync

Eu tentei sincronizá-los antes editando as duas versões do arquivo, e também após a edição - neste caso, alterando minhas edições para a versão principal, mas (estranhamente) não a versão de sobreposição. Nem ajudou.

O manual do desenvolvedor do Gentoo sugere que eu possa precisar 'tocar manualmente em todos os arquivos de sobreposição relevantes depois de atualizar eclasses de sobreposição '. Eu tentei fazer isso também; tocar todos os arquivos nesses diretórios:

/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

Na próxima vez que executei o comando emerge , ele começou com a saída:

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.

Mas ainda minhas edições foram ignoradas. Posso editar esse arquivo .eclass para que minhas edições entrem em vigor? Ou de que outra forma posso contornar um erro como este?

    
por Michael Allan 25.03.2017 / 06:52

2 respostas

0

Duas maneiras possíveis. O primeiro é mais fácil, mas não testado:

Modo fácil: instale uma versão suportada e atualize para uma versão não suportada

O erro neste caso ocorre durante uma instalação clean de uma versão não suportada do MySQL. Ocorre ao executar o comando emerge --config , que é executado após uma instalação limpa, em oposição a uma atualização. Portanto, a solução mais fácil é provavelmente primeiro instalar uma versão antiga e suportada do MySQL do repositório principal; em seguida, atualize-o para a versão posterior sem suporte da sobreposição. Então:

$ emerge --ask --verbose dev-db/mysql

Verifique se ele pede para instalar uma versão suportada. Deixe-o funcionar e conclua a instalação conforme as instruções:

$ emerge --config =dev-db/mysql-SUPPORTED.VERSION

Agora, desmascare a versão posterior sem suporte do repositório de sobreposições e atualize para ela:

$ emerge --ask --verbose dev-db/mysql

Verifique a versão que oferece e, novamente, deixe-a ser executada. Isso deve funcionar, embora eu não tenha testado; em vez disso eu fiz da maneira mais difícil.

Dificuldade: sobrescreva o eclass e lide com os erros

O manual do desenvolvedor diz , 'Se um ebuild define uma função que é exportada, isso recebe prioridade sobre qualquer versão eclass. Isso pode ser usado para substituir os padrões definidos pelo eclass ’. Então copie mysql-5.7.12.ebuild do ' mysql 'overlay a sua sobreposição local (prioridade +1000 no meu caso) e modificá-la lá, acrescentando a substituição:

pkg_config() { # test override of mysql-multilib-r1_pkg_config
    die "ebuild override works!";
}

Verifique se o Portage executará a ebuild:

$ equery which dev-db/mysql
/usr/local/portage/dev-db/mysql/mysql-5.7.12.ebuild

Então teste:

$ 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

Com certeza, ele morre com a mensagem "ebuild override works!".

Agora, se você editar o arquivo ebuild para fazer algo mais útil do que morrer e, em seguida, refazer o último comando acima, verá que ele ainda morre com a mesma mensagem. O cache do Portage continua sendo um problema. Mas como esse é um arquivo ebuild , não um eclass , e como ele está em sua própria sobreposição local, você pode trabalhar facilmente com o cache usando as revisões ebuild adequadas:

$ pwd
/usr/local/portage/dev-db/mysql
$ cp mysql-5.7.12.ebuild mysql-5.7.12-r1.ebuild

E no arquivo de revisão mysql-5.7.12-r1.ebuild , edite pkg_config para implementar a correção real:

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} "
      ⋮
}

Em seguida, teste novamente:

$ 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

Aqui acontece que pkg_config ainda tem erros:

[ERROR] Failed to open the bootstrap file /var/tmp/portage/ … tmp.PD6hqOe8kA
[ERROR] 1105  Bootstrap file error, return code (0). Nearest query: …

Provavelmente são permissões de arquivo. De qualquer forma, funciona se você executar novamente o comando com falha como 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

Em seguida, continue interpretando e executando manualmente o código 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/ &

Verifique se o arquivo de soquete (acima) foi criado. Então:

$ /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"

Aqui falha com:

ERROR 1054 (42S22) at line 1: Unknown column 'Password' in 'field list'

Encontrei a correção no estouro de pilha :

$ /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"

Por fim, finalize mysqld :

$ kill $(< /var/run/mysqld/mysqld99.pid ) # from the --pid-file above

É isso. Agora você pode adicionar o MySQL a um runlevel ou iniciá-lo e pará-lo manualmente:

$ /etc/init.d/mysql start
$ /etc/init.d/mysql stop
    
por 26.03.2017 / 12:16
0

Não sei bem o que você está fazendo aqui, mas um ponto importante deve ser feito:

Se você não estiver reemergindo o mysql antes de executar --config , a configuração que você usar será lida, não fora de seus eclasses na sua sobreposição, mas dos arquivos em /var/db/pkg/*/*/environment.bz2

Instalar um pacote faz alguns truques realmente fofos, por exemplo, se você escrever um ebuild e exportar uma variável em src_compile ... essa variável provavelmente estará acessível durante pkg_config

Se você tiver uma cutucada nesse arquivo environment.bz2 , você verá todas as funções embutidas do mysql eclass.

Assim, como você afirmou em sua outra resposta, a atualização parece corrigir isso.

Mas isso é corrigido ao substituir as cópias instaladas do código eclass:)

    
por 28.03.2017 / 09:02