NPU 포트에서 pciehp 분리¶
Important
RHEL 10.2 기반 RHCOS 노드에만 적용합니다. RHEL 9.x 기반 RHCOS 노드에는 필요하지 않습니다.
Important
ATOM™ 노드에는 이 페이지의 설정이 필요하지 않습니다.
같은 PCIe 스위치 아래의 NPU 여러 장이 동시에 리셋되면 링크가 오래 끊겨, 핫플러그 드라이버 pciehp가 사용 중인 카드를 커널에서 제거할 수 있습니다. NPU가 연결된 다운스트림 포트에서 pciehp를 분리하면 이를 막을 수 있습니다.
MachineConfig로 pciehp 분리 훅을 RHCOS 노드에 배포합니다.
사전 요구사항¶
- OpenShift Container Platform 4.x 클러스터(4.21, 4.22에서 검증)
cluster-admin권한- OpenShift CLI(
oc) 설치 및 로그인 완료
클러스터가 쓰는 Ignition 스펙 버전을 확인합니다. OCP 4.21과 4.22는 3.5.0을 쓰며, 아래 매니페스트가 선언한 값도 같습니다.
적용 대상 풀¶
MachineConfig는 MachineConfigPool 단위로 적용되므로, RHEL 10.2 기반 RHCOS에서 동작하는 Rebel100™ 노드가 속한 풀을 대상으로 합니다. 커스텀 풀을 만드는 방법은 커스텀 MachineConfigPool 생성에서 확인할 수 있습니다.
- 노드의 RHCOS가 어느 RHEL 버전 기반인지 먼저 확인합니다.
VERSION_ID가10.2가 아니면 이 문서의 작업은 필요하지 않습니다.
- 풀 전체에 적용합니다. 적용하지 않은 노드에서는 사용 중인 카드가 사라질 수 있습니다.
- 풀의 노드가 전부 VM 게스트라면 생략할 수 있습니다. 아래 명령이 아무것도 출력하지 않으면 VM 게스트입니다.
- 베어메탈과 VM이 섞인 Rebel100™ 풀도 풀 전체에 적용합니다. VM 노드에서는 훅이 아무 작업 없이 종료됩니다.
아래 매니페스트와 명령은 풀 이름으로 __MCP_NAME__을 씁니다. Rebel100™ 노드가 속한 풀 이름으로 바꿉니다. 클러스터의 worker가 모두 Rebel100™ 노드이면 worker, 그렇지 않으면 커스텀 풀 이름입니다. 이 문서의 모든 명령에 같은 이름을 씁니다. master가 worker를 겸해 master 노드에 NPU가 장착된 3노드 컴팩트 클러스터에서만 master를 쓰며, 이때는 control plane이 순차 재부팅되므로 API 가용성을 함께 확인합니다.
매니페스트¶
매니페스트는 풀의 각 노드에 다음 파일을 배포합니다.
| 항목 | 경로 | 역할 |
|---|---|---|
| 훅 스크립트 | /usr/local/sbin/rbln-pciehp-hook.sh | NPU가 연결된 다운스트림 포트에서 pciehp를 분리 |
| udev rule | /etc/udev/rules.d/99-rbln-pciehp.rules | RBLN 디바이스가 추가되면 해당 포트의 systemd 서비스를 시작 |
| systemd 유닛 | rbln-pciehp-unbind@.service | 포트 하나에 대해 훅을 실행 |
훅 스크립트와 udev rule은 gzip으로 압축되어 매니페스트에 들어 있습니다. 이 값(contents.source)은 수정하지 않고 그대로 적용해야 합니다. __MCP_NAME__만 바꿉니다.
적용¶
Warning
적용하면 롤링 재부팅이 발생합니다. MCO가 풀의 노드를 하나씩 drain하고 파일을 쓴 뒤 재부팅합니다. udev rule이 적용되려면 재부팅이 필요합니다.
풀이 UPDATED=True, UPDATING=False, DEGRADED=False를 보고하면 롤아웃이 끝난 것입니다.
검증¶
훅 스크립트의 SELinux 타입은 bin_t여야 하고, ausearch에는 거부 기록이 없어야 합니다.
VM 게스트에서는 status가 포트를 찾고 rc=0으로 끝나지만 BOUND → unbound 상태 변화는 나타나지 않습니다. 이 상태 변화는 베어메탈 노드에서만 확인할 수 있습니다.
롤백¶
배포된 파일은 MCO가 관리하므로 rbln-pciehp-hook.sh uninstall을 실행해서는 안 됩니다. 롤백하려면 MachineConfig를 삭제합니다. 삭제 후 대상 풀의 노드가 순차적으로 재부팅됩니다.
참고¶
Warning
systemd 유닛은 systemd.units로 선언합니다. storage.files로 /etc/systemd/system 아래에 파일을 배포하면 MCO가 선언되지 않은 유닛으로 보고 삭제하므로, 노드가 선언한 설정 상태에 도달하지 못합니다.
유닛의 RequiresMountsFor=에는 /usr/local/sbin 대신 실제 경로인 /var/usrlocal/sbin을 적습니다. RequiresMountsFor=는 심링크를 따라가지 않는데, ostree 호스트에서 /usr/local은 /var/usrlocal의 심링크이고 /var는 별도 마운트입니다. PCI coldplug를 처리하는 udev는 local-fs.target보다 먼저 실행되므로, 심링크를 해석한 실제 경로를 적어두지 않으면 유닛이 실행되지 않아 부팅 시 pciehp 분리가 수행되지 않습니다. 노드에서 심링크를 확인하려면 다음을 실행합니다.