대규모 환경에서 FreeBSD의 포트를 어떻게 관리하고 배포합니까?


19

사람들이 어떻게 환경에서 FreeBSD의 포트를 배포하고 있는지 궁금합니다. 필자는 FreeBSD를 사용하는 대부분의 사람들이 실제로 포트를 사용한다고 가정합니다 (그리고 종종 바이너리로 업그레이드하기 위해 포트 업그레이드). 그러나 최근 버전에서 작동하는 방식에 만족하지 않기 때문에이 설정을 사용하는 방법에 관심이 있습니다. 현재 FreeBSD 9.0을 실행 중이며 문제가 있습니다.

다음과 같이 설정했습니다.

  • / usr / ports는 한 노드에서 NFS를 통해 공유됩니다 (야간 'portsnap fetch update').
  • 각 노드는 / usr / ports를 읽기 / 쓰기로 마운트합니다.
  • 모든 노드의 /etc/make.conf에서 "WRKDIRPREFIX = / usr / tmp"를 설정했습니다
  • /usr/local/etc/pkgtools.conf에 다음을 추가하여 로컬 색인을 사용하도록 Portsnap을 구성했습니다.

ENV['LOCALINDICES'] ||= '/var/db'

ENV['PORTS_INDEX'] ||= ENV['LOCALINDICES'] + '/INDEX.local'

portupgrade -p package패키지를 빌드 한 다음 portupgrade -P package다른 노드에 바이너리를 설치 하기 위해 성공적으로 실행할 수 있습니다 .

그러나 때로는 다음과 같은 문제가 발생합니다. /var/db/INDEX.local:23265:dbm_store failed

색인이 로컬에 상주하기 때문에 시스템에 수행 할 수있는 다른 최적화 방법을 생각할 수 없으며 실제로 내 보낸 유일한 것은 포트 트리이며 노드에서 아무것도 기록되지 않습니다.


하나의 옵션은 모든 노드에 전체 로컬 포트 ​​트리를 설치하는 것입니다 (그리고 아마도 'distfiles'와 'packages'를 마운트하는 것). 그러나 이것은 공간 낭비로 느껴집니다 (많은 불필요한 업데이트는 말할 것도 없습니다).
vpetersson

vpeterson : 이것은 질문이 필요합니다 (지금 막혔습니다. +5 투표와 3 별은 우리가 혼자가 아니라고 제안합니다). 아마도이 질문을 정리하고 해결하려는 특정 문제를 설명하십시오. (FWIW, 누군가가 귀하의 질문을 닫기로 투표했습니다. 개인적으로 나는 이것 또는 이와 유사한 질문이 저장된 것을 매우 많이보고 싶습니다).
Stefan Lasiewski

질문을 더 명확하게하는 방법을 잘 모르겠습니다. 또한 @ voretaq7이 실제로 질문에 대답한다고 생각하지 않지만 대신 다른 방법을 제안합니다. 문제는 실제로 사람들이 다중 노드 환경에서 FreeBSD의 포트를 어떻게 배포하는지에 대한 주제 제안에 관한 것입니다.
vpetersson

답변:


13

대규모 환경에서 포트 시스템에 대해 완전히 만족 한 적이 없습니다. 제대로 작동하려면 항상 외부 관리를 적용해야 할 것 같습니다.

나의 가장 좋은 팁 (우선 순위에 따라 "최악의"솔루션을 "최상의"솔루션으로)


각 호스트에서 구축하는 경우 하지 마십시오 .
설명과 같이 읽기-쓰기 마운트를 사용하여 NFS를 통해 수행하지 마십시오. 대체 작업 디렉토리를 제공하는 경우 일반적으로 올바른 작업을 수행 할 포트를 신뢰할 수 있으며 포트 트리에서 스톰 핑 할 수는 없지만 항상 낫습니다. 죄송합니다. 안전 : 로컬 CVS / csup 미러를 실행하고 해당 상자에서 모든 호스트를 csup 한 다음 개별 머신 인 것처럼 로컬로 빌드하십시오.
예, 이것이 호스트에 추가 디스크 공간이 있고 추가 단계가 필요하다는 것을 알고 있습니다. 또한 문제가 거의 없음을 보증합니다.
경고: 지정된 "구성 호스트"에서 패키지 구성 파일 (rsync 또는 유사한)을 동기화하여 각 시스템의 일관성을 유지하려고합니다 (각 노드에서 csup을 사용하지 않고 원하는 경우 전체 포트 트리를 재 동기화 할 수도 있음).


빌드 호스트를 사용하여 패키지를 작성하고 설치하십시오.
각 개별 머신을 구축하는 것보다 훨씬 더 나은 솔루션 : 빌드 호스트를 사용하여 패키지를 작성하고 도구가 해당 패키지를 가리 키도록하십시오.
즉, 실행하는 모든 아키텍처 (또는 크로스 컴파일)마다 빌드 호스트를 유지하지만 궁극적으로 대상 컴퓨터에 더 좋습니다 (대규모 컴파일 작업이없고 일관성이 보장됨)


구성 / 시스템 관리 도구를 사용하십시오.
이것이 제가 해결 한 솔루션입니다. 표준 서버 이미지를 구축하고이를 사용하여 내 환경에 배치합니다 radmind. Puppet 또는 Chef로 비슷한 작업을 수행 할 수 있습니다 . 이는 빌드 호스트 사용 (일관성, 개별 서버의로드 감소)을 사용하는 모든 이점을 가지며 구성 관리의 이점을 추가합니다.

주의 사항 : 컴퓨터가 "동일"한 경우에만 효과적입니다. 즉, 모든 포트에 동일한 포트 세트를 설치할 수 있습니다. 이 는 포트의 설정을 변경 한 경우 작동하지만 실질적으로 관리 오버 헤드를 증가시킨다.

면책 조항 : 의 포트 관리자입니다 sysutils/radmind. 예, 제가 채택한 것이 마음에 듭니다.


이 모든 것은 다양한 크기의 FreeBSD 환경을 관리 한 경험 (1 ~ 2 대에서 100 대까지)에 기초합니다. 표준화 된 이미지를 푸시하고 유지 관리하는 구성 / 시스템 관리 도구는 실제로 내 경험에서이를 처리하는 가장 좋은 방법입니다.


좋은 포인터. 나는 과거에 꼭두각시와 조금 놀아서 우분투에서 그것을 좋아했습니다. 그러나 FreeBSD에서 얼마나 잘 작동하는지 잘 모르겠습니다. 아직 시도하지 않았습니다. 그럼에도 불구하고 Puppet을 사용하더라도 Portupgrade를 호출한다고 생각합니다. pkg_delete / pkg_add 또는 'pkg_add -f'를 수행해야하기 때문에 다른 방법으로는 효과가 없습니다. 하드웨어는 공개 클라우드 (KVM / Qemu)에서 실행되므로 모두 동일합니다.
vpetersson

하드웨어와 기본 소프트웨어 구성이 동일하다면 전체 시스템 이미지를 관리하는 radmind와 같은 것이 좋습니다. Puppet과 Chef는 훌륭한 도구이지만 기본 OS 바이너리라고 부르며 빌드 호스트를 사용하고 패키지를 배포하는 데 도움이됩니다. radmind는 대리 sysadmin이 아닌 파일 시스템 수준에서 관리를 인계 ( "이것으로되어 있지 않은 경우 교체 또는 제거")하여이를 피합니다 ( "이 명령을 실행하거나 파일을 변경하여 상자").
voretaq7

시스템의 하드웨어는 동일하지만 구성은 동일하지 않습니다. Radmind를 살펴 봐야하지만 이것이 최선의 방법인지 잘 모르겠습니다. 기본 제공 도구를 사용하면 IMHO 작동 해야 하므로 분명한 부분을 놓쳤는 지 확인하기 위해 커뮤니티에 문의하고 있습니다. 나는 이것을하는 유일한 사람이 될 수 없습니다.
vpetersson

내장 된 도구를 확실히 DO 그들은 정말 하나의 시스템을 관리하기 위해 개발하고 있으며,뿐만 아니라 그들이 할 수로 확장되지 않습니다 - 일을, 그들은 단지 많은 도움 (등 빌드 서버, 패키지의 지역 분포를) 필요로한다. 자체 freebsd-update 서버롤링 하는 옵션은 생략했습니다 . 기본 시스템 이상으로 시도한 적이 없지만 이론적으로는 가능합니다. 방금 내가 알고있는 것들에 집착했습니다. :)
voretaq7

예, 그것은 실제로 흥미로운 아이디어입니다. 포트 패키지를 많이 수정하지 않고 배포 할 수 있는지 확실하지 않습니다. FreeBSD의 대규모 배포가 많기 때문에 대규모 시스템의 sysadmins가 이것을 어떻게 관리하는지 궁금합니다. 그들 모두 자신의 솔루션을 제공합니까? 그렇다면, 그것은 꽤 이상하게 느껴지고 오픈 소스가 아닙니다.
vpetersson

6

아무도 ports-mgmt / tinderbox를 언급하지 않은 것이 이상합니다 .

Tinderbox는 Pointyhat 빌딩 클러스터에 사용되는 공식 Portbuild 스크립트를 기반으로하는 FreeBSD 포트 용 패키지 빌딩 시스템입니다. Tinderbox는 Joe Marcus Clarke이 작성했습니다.

여러 감옥 (기본 시스템 버전)과 여러 포트 트리를 정의 할 수 있습니다. jail과 portstree의 조합을 빌드라고합니다. 틴더 박스 감옥은 FreeBSD에서 감옥으로 이해되는 것이 아니며, 실제로는 chroot에서 주어진 세계입니다. Tinderbox는 종속성 자동 추적을 지원하고 마지막 실행 이후 변경된 패키지 만 다시 작성합니다. Tinderbox는 빌드 실패에 대한 이메일 알림을 지원합니다. Tinderbox는 ccache 와도 잘 통합됩니다.

Tinderbox는 필요한 플랫폼 및 아키텍처에 필요한 포트 세트를 쉽게 제공하도록 설계되었습니다. Tinderbox는 또한 새로운 포트 및 포트 업그레이드 테스트, 특히 종속성 및 패킹리스트 테스트에 탁월한 도구입니다. FreeBSD 7.X / 8.X 호스트에서 FreeBSD 6.X 월드를 감옥으로 실행할 수 있기 때문에 다양한 FreeBSD 릴리스에서 포트를 테스트하는 데 유용합니다.

또한 pkgng로 전환 하면 패키지 배포가 크게 간소화됩니다.
github에서 확인하십시오 : https://github.com/pkgng/pkgng


1
다양한 환경 (여러 버전, 아키텍처 등)에서 실제 패키지를 작성하는 데 확실히 유용 할 수는 있지만 실제로 패키지 배포 문제를 해결하지는 못합니다.
vpetersson

Tinderbox는 HTTP를 통해 패키지를 제공하므로 voretaq7의 답변에 대한 의견과 함께 배포 솔루션을 얻을 수 있습니다 (예 : radmind 또는 Puppet / Chef 설정 PACKAGEROOT/ PACKAGESITE사용).
James O'Gorman

예. 그러나 패키지를 빌드하고 배포하는 것은 문제가되지 않습니다. portupgrade (-p)를 사용하여 패키지를 빌드하고 NFS를 통해 (ports-tree의 유무에 관계없이) 패키지를 배포 할 수 있습니다. 문제는이 모델에 여전히 a) 로컬 포트 ​​포트 트리 전체 또는 b) NFS를 통해 내 보낸 포트 트리가 필요하다는 것입니다.
vpetersson

2
Portupgrade는 소스에서 빌드하거나 바이너리 패키지를 사용하는 경우 정확히 수행 pkg_delete해야 할 작업을 먼저 수행 한 다음 새 버전을 설치해야합니다. OpenBSD는에 업그레이드 옵션을 포함 시켜서 이것을 더 잘 처리했습니다 pkg_add. Portupgrade는 확실하지 않지만 portmaster는 전체 포트 트리가 아닌 INDEX를 사용하여 작동 할 수 있습니다.
James O'Gorman

1
그러나 pkg_delete는 합리적인 방법이 아닙니다. Ruby, Python 또는 다른 많은 패키지의 전제 조건 인 기타 패키지를 업그레이드하려고한다고 가정하십시오. 그런 다음 pkg_delete는 모든 종속성을 삭제해야하며 이는 프로덕션 시스템에 대한 옵션이 아닙니다. Portupgrade는 이것으로 훨씬 더 잘 작동 하지만 다시 확장되지 않는 것 같습니다.
vpetersson

3

잘 조정 된 NFS를 통해 / usr 읽기 전용을 공유하고 / var에서 / usr로 패키지 데이터베이스를 이동하고 이들과 심볼릭 링크를하여 100 개 이상의 FreeBSD 서버를 관리했습니다 (필수는 아니지만 pkg_info 등 활성화). 한 방향 또는 다른 방향으로 이동하고 심볼릭 링크가 필요한 하나 또는 두 개의 다른 파일이있을 수 있지만 전체 설정에서 알아내는 데 약 1 시간이 걸렸습니다. 아주 잘 작동했습니다. 스케일링 문제가 발생하면 NFS 서버를 추가하고 워크로드를 분할했지만 결코 작동하지 않았습니다. 성능은 결코 문제가되지 않았지만 (실제로는 훌륭했습니다) NFS 서버의 / usr (또는 그 사본)을 md에 넣을 수 있다고 생각합니다.


NFS를 통해 빌드 된 패키지 파일을 공유하는 것은 확실히 다른 합리적인 접근법입니다. 그런 다음 꼭두각시 (또는 자체 개발 한 SSH 및 쉘 스크립트)와 같은 것을 사용하여 패키지를 설치 / 업그레이드 할 수 있습니다 NFS 공유에서.
voretaq7

1

불행히도 아무도 이것에 대한 좋은 해결책을 얻지 못한 것으로 보입니다. 이것은 아마도 기본 도구의 한계 때문일 것입니다.

내가 생각해 낸 것은 다음과 같습니다. 전체 포트 트리를 내보내는 아이디어를 폐기했습니다. 대신, 각 노드에 전체 포트 트리를 제공하고 배치했습니다. 그런 다음 NFS를 통해 '패키지'를 마운트했습니다 (패키지 배포 가능).

또한 portnap 프로세스 속도를 높이기 위해 캐싱 프록시 (아마도 오징어)를 사용하려고합니다. 내 블로그에서 설정하는 방법에 대한 간단한 게시물을 작성했습니다 .

참고 문헌 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.