ESXi에서 Mellanox Adapter 시리얼 넘버 확인하기

송주환·2023년 8월 10일
0

들어가며

가끔 자산 관리나 서포트 요청 등을 위해 NIC의 시리얼 넘버를 확인해야 할 경우가 있다.
이를 위해 대부분의 제조사에서는 자사의 전용 프로그램을 이용해 NIC의 시리얼 넘버를 확인할 수 있게 해 둔다.
Mellanox 또한 윈도우에서는 WinOF 드라이버를 설치하면 장치 관리자에서 디바이스의 시리얼 넘버를 확인할 수 있었기 때문에, 당연히 MFT (Mellanox Firmware Tool)을 설치하면 비슷한 기능을 제공하는 툴이 있을 것이라 생각했지만, 그 기대는 아니나다를까 빗나가고 말았다.

이 글은 ESXi 호스트에서 Mellanox NIC을 물리적으로 탈거하거나, 업링크 포트에서 제거하지 않고 시리얼 넘버를 확인하기 위한 꼼수를 다룬다.

리눅스의 경우

가장 먼저 리눅스에서 시리얼 넘버를 어떻게 확인할 수 있는지를 알아보았다.
ESXi가 리눅스 커널 기반은 아니지만, 그래도 UI/UX는 상당히 유사하기 때문에, 서드파티 업체 입장에서는 리눅스의 구현체를 그대로 가져오는 편이 여러모로 편하기 때문이다.

리눅스에서 멜라녹스 NIC의 시리얼 넘버를 확인할 수 있는 방법은 다음 링크 들에서 확인할 수 있다.

방법은 간단하다.

  1. lspci -s -xxxvvv 명령어를 사용하거나
  2. MFT를 설치한 뒤 lspci | grep Mellanox | awk '{print $1}' | xargs -i -r mstvpd {} 명령어를 실행하거나

이 두가지 방법은 리눅스에서는 잘 동작했다. 하지만 ESXi에서는?

ESXi의 경우

lspci와 mstvpd를 사용하는 이 방법을 ESXi에 적용하기에는 두 가지 문제점이 있었다.

첫번째, ESXi의 lspci 명령어는 -x 옵션이 없고, -v 옵션이 리눅스만큼 verbose한 출력을 내보내지 않는다.

두번째, ESXi의 MFT 패키지에는 mstvpd 명령어가 없다.

이 사소하고 앙증맞은 찐빠들 덕분에, ESXi에서는 Mellanox가 공식적으로 제공하는 방법으로 NIC의 시리얼 넘버를 확인할 수 없었다.
그렇다면 어쩔 수 없이 하드웨어를 직접 탈거하거나, 리눅스 VM에 패스스루를 해서 붙이는 식으로 다운타임을 가져가야만 할 것인가?

이대로 넘어가기에는 개인적인 자존심이 용납하지 않았고, 곧 하나의 아이디어를 떠올리게 된다.

멜라녹스는 장치 내부 레지스터 값을 덤프할 수 있는 명령어를 제공하는데, 이걸 쓰면 시리얼 넘버도 가져올 수 있지 않을까?

그래서 이 생각을 실천에 옮겼다.

mstdump Utility

mstdump는 Mellanox NIC의 내부 설정 레지스터 값을 덤프할 수 있는 유틸리티이다.
이 유틸리티의 사용법과 소개는 다음 링크에서 확인할 수 있다.
대개는 내부 디버깅을 위해 사용하지만, 나는 mstdump를 통해 기기의 시리얼 넘버를 얻어낼 것이다.

단, 여기에는 두 가지 사전 정보가 필요하다.

첫째, Mellanox 정품 NIC의 시리얼 넘버는 "MT"로 시작한다.
둘째, MT 다음에는 반드시 숫자가 와야 한다.

우리는 이 두 가지 정보를 토대로 레지스터에서 시리얼 넘버를 덤프할 것이다.

시리얼 넘버 덤프하기

가장 먼저, 시리얼 넘버를 덤프할 기기를 식별한다. 이를 위해 mdevices_info 도구를 사용해야 한다.

시리얼 넘버를 덤프할 mst 장치 네임을 알아냈다면, 다음과 같은 명령어를 입력한다.

mstdump -full <mst_name> | grep 4d54

이 때, "4d54"는 ASCII 코드로 MT를 뜻한다. 즉, 이 방법으로 시리얼 넘버의 시작 지점을 찾는 것이 첫번째 관문이다.
기기와 펌웨어의 버전에 따라 다를 수 있으나, 대개는 아래와 같은 결과를 볼 수 있을 것이다.

값으로 4d54를 포함하고 있는 레지스터들이 다수 확인되었지만, 이 중에서 우리가 찾는 레지스터는 하나일 것이다.
이제, 위에서 확인된 값들을 순차적으로 변환해 본다.

첫번째 값은 언더바로 시작한다. 이것은 시리얼 넘버가 아니며, 형식으로 추측하건대 ibv_devinfo에서 확인할 수 있는 board_id 값일 것이다.

두번째 값은 MTCF이다. 이것도 시리얼 넘버의 형식에 맞지 않으므로 패스한다.

세번째 값은 숫자다. 그렇다면 이게 시리얼 넘버일 것인가? 확인을 위해 뒷 부분을 더 뽑아보았다.

아쉽지만 이 레지스터 주소는 모델명을 담고 있었다.

그렇다면 그 다음인 0x4d543136은?

빙고! 우리가 찾던 시리얼 넘버임을 확인할 수 있다.
Mellanox 정품 NIC의 시리얼 넘버가 12자리인 것과, 0x20은 ASCII로 공백 문자를 의미한다는 것을 알고 있으면 보다 빠르게 올바른 시리얼 넘버를 찾을 수 있을 것이다.

OEM 모델의 경우 시리얼 넘버의 형식이 다르지만, 시리얼 넘버의 규칙을 알고 있다면 같은 방법을 사용해 시리얼 넘버를 확인할 수 있다.

마치며

이렇게 해서 Mellanox에서 제공하는 공식적인 방법을 사용하지 않고, 다운타임을 가져갈 필요 없이 시리얼 넘버를 추출할 수 있었다.

이 포스트가 같은 문제로 고민중인 다른 누군가에게 도움이 되길 바란다.

profile
Virtualization / Network / Storage / Server Hardware and.. Linux

1개의 댓글

comment-user-thumbnail
2023년 8월 10일

개발자로서 배울 점이 많은 글이었습니다. 감사합니다.

답글 달기