젠투 오버레이에 있는 eclass 파일의 오류를 해결하는 방법은 무엇입니까?

젠투 오버레이에 있는 eclass 파일의 오류를 해결하는 방법은 무엇입니까?

   (다음에서 교차 게시됨젠투 포럼)

오류를 수정하기 위해 파일을 편집해 보았 .eclass으나 어딘가의 캐시에 의해 편집 내용이 실패한 것 같습니다. emerge --config =dev-db/mysql-5.7.12MySQL 버전 설치를 완료하기 위해 실행해야 하는 명령을 실행할 때 초기 오류가 발생합니다 . 명령이 다음과 같이 실패합니다 /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

동기화하려고 하는데앞으로파일의 두 버전과 사후 편집을 모두 편집합니다. 이 경우 기본 버전에 대한 편집 내용이 삭제되지만 (이상하게도) 버전을 덮어쓰지는 않습니다. 둘 다 도움이 되지 않았습니다.

이것젠투 개발 매뉴얼 권장사항"오버레이 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파일을 편집하여 죽는 것보다 더 유용한 작업을 수행한 다음 위의 마지막 명령을 다시 실행하면 다음을 볼 수 있습니다.아직죽음도 같은 메시지와 함께 온다. 포티지 캐싱은 여전히 ​​문제입니다. 그러나 이것은 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: …

파일 권한 문제일 수 있습니다. 어쨌든 실패한 명령을 루트로 다시 실행하면 작동합니다.

$ /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사용하는 구성을 오버레이의 eclass에서 읽지 않지만파일에서/var/db/pkg/*/*/environment.bz2

패키지를 설치하는 데는 정말 귀여운 트릭이 있습니다. 예를 들어 ebuild를 작성하고 변수를 내보내는 경우 src_compile... 해당 변수는 여전히 사용할 수 있습니다.pkg_config

파일 을 자세히 살펴보면 environment.bz2모든 mysql eclass 함수가 인라인으로 표시됩니다.

따라서 다른 답변에서 언급했듯이 업그레이드하면 문제가 해결되는 것 같습니다.

하지만 설치된 eclass 코드 사본을 교체하면 문제가 해결됩니다. :)

관련 정보