- 0x0000007b
- 2차세계대전
- 3.20해킹
- 4대강
- 502 error
- 53빌딩
- 7840hs
- 88체육관 수영장
- ABI
- abortive close
- abortive shutdown
- AHCI
- akmods
- ALC1220
- alma linux
- alternatives
- AM4 메인보드
- AMD
- amd 7840hs
- amd 그래픽 게임용
- amd 내장 그래픽 최적화
- anonymous file
- API
- apple.com
- APT
- apt-get
- Armagnac
- Asrock
- ASTALIFT
- audacious player
- Today / Yesterday
- /
- Total
Linux Programmer
썬더볼트 장치 스캔 방법 - Fedora Linux / Windows 본문
썬더볼트 기술은 2024년을 기점으로 볼 때 아직은 호환성 문제가 있는 편이다. 특히 PC에서는 드라이버 설치부터 문제가 발생하거나, 드라이버가 설치되었다고 하더라도 작동이 안되는 경우도 있을 수 있다. 게다가 PCIe 썬더볼트 카드는 제품을 만든 회사가 다르면 인식이 될 수도 있고 아닐 수도 있다. 예를 들어 아래는 asrock의 썬더볼트 확장 카드인데, 이를 ASUS나 MSI같은 메인보드에 꼽아도 인식이 되어야 한다. 하지만 실제로는 같은 회사인 경우도 100% 장담하기 어렵다는 문제가 있다.
더 웃긴건 핫 플러그를 제대로 지원하지 못하는 경우도 있다. 이것은 썬더볼트 칩셋 자체의 문제라고 하기보단 펌웨어나 드라이버, 혹은 운영체제의 버그인 경우도 있다. 근본적인 원인은 인텔의 썬더볼트 기술이 개방된지 얼마되지 않았기 때문에 사용자 숫자도 적다보니 성숙도(maturation)가 떨어지는 것이다. 실제로 USB에 비하면 썬더볼트 사용자층은 매우 적은 편이기도 하다.
이 글에서는 가장 흔한 호환성 문제인 썬더볼트 장치 인식에 대한 부분을 해결하기 위해 시도했던 방법을 정리한 것이다. 특히 핫 플러그가 잘 안될때 강제로 리스캔(rescan) 시켜서 인식하는 방법에 대해 살펴볼 것이다.
1. 썬더볼트 호환성 및 핫 플러그 문제
앞서 썬더볼트 장치는 핫 플러그(hot plug)지원이 원활하지 않다는 단점이 있다고 언급했다. 여기서 핫 플러그란 컴퓨터 전원이 켜있는 상태에서 연결해도 인식되고, 작동되는 것을 말한다. 반대로 컴퓨터 전원을 끄고서 연결 후 부팅해야만 하는 것을 콜드 플러그(cold plug)라고 부른다.
핫 플러그를 가장 잘 지원하는 예시로는 USB 장치가 있다. 일반적으로 USB 장치는 연결하면 바로 인식되거나, 혹은 드라이버를 설치하고나서 인식될 수 있다. 즉 핫 플러그가 지원된다면 컴퓨터 전원이 켜 있는 상태에서도 연결만 하면 장치가 작동되는 것을 볼 수 있다.
원래는 썬더볼트도 핫 플러그를 지원하는데, 몇몇 시스템에서는 썬더볼트 칩셋 펌웨어 및 드라이버 설정 문제로 인해 콜드 플러그인 경우에만 인식되기도 한다. 하지만 썬더볼트 외장 디스크(NVMe SSD 썬더볼트 인클로저)를 연결할 때마다 재부팅 해야 한다면 끔찍하다. 그러나 다행스럽게도 재부팅하지 않고도 인식 시키는 방법이 있다. 만일 이 방법들을 사용해도 핫 플러그 인식이 안된다면 콜드 플러그하는 방법 밖에 없다.
반대로 콜드 플러그가 문제가 되는 경우도 있다. 대표적으로 썬더볼트를 통한 디스플레이 출력이 있다. 이런 문제가 있는 시스템은 부팅시 썬더볼트 C-type 단자로 모니터와 연결해두면 바이오스에서 넘어가지 않거나 혹은 부팅이 매우 느린 경우가 있다. 이때는 모니터와 연결된 썬더볼트 C-type 단자를 빼두고 부팅 후에 연결해야 한다. 하지만 이는 썬더볼트나 USB4 케이블의 호환성 문제인 경우도 있어서 다른 회사 제품 케이블로 교체해보는 것도 추천한다. (참고로 USB4 20Gbps 케이블은 디스플레이 출력을 지원하지 않을 수도 있으니 주의하자)
이와 달리 맥북에서의 썬더볼트 기술은 호환성이 좋은 편이다. 원래 썬더볼트 기술이 Apple의 요구로 만들어진 것이다보니 애플에서는 오랫동안 보급해왔기 때문에 버그가 대부분 해결된 것이다. 물론 PC 데스크탑이나 IBM 호환 랩탑에 썬더볼트 채용이 늘어나고 있으며, 인텔은 썬더볼트 기술을 개방하여 지금은 USB4에 썬더볼트 기술이 들어가고 있다. 사실상 USB4는 썬더볼트 기술의 호환이다.
2023년부터는 인텔이 아닌 ASMedia나 Realtek에서도 썬더볼트 칩셋을 생산하기 시작했기 때문에 선택의 폭도 다양해지고, 호환성 문제도 빠르게 해결되어가는 추세이다. |
2. 썬더볼트 강제 핫플러그 방법 (rescan)
썬더볼트 장치 연결 후 인식되지 않는 경우에는 rescan을 통해 인식시킬 수 있다. 다시말해 PCIe(PCI express) 장치 목록을 다시 스캔하도록 하는 명령하는 방법이다. 주로 썬더볼트 외장 저장장치, 즉 썬더볼트 NVMe 인클로저를 연결하고 검색할 때 유용한 방법이다.
원래 리눅스 관련만 설명하려고 했는데, 윈도10/윈도11에서도 썬더볼트가 문제를 일으켰을때 리스캔 하는 명령을 같이 꼽사리로 정리해두었다. 리눅스 먼저 설명 후 윈도 관련 글도 소개한다.
2.1. Linux의 저장장치 리스캔
먼저 리눅스에서 외장 저장 장치를 리스캔 하는 방법은 2가지가 있는데 사용처가 조금 다르므로 이 차이부터 살펴보도록 한다. 첫번째는 serial disk(SCSI, SATA, USB 디스크)를 리스캔하는 범용적인 방법이고, 두번째는 PCIe rescan 방법이다. 앞서 언급한대로 썬더볼트 장치는 PCIe 방식을 사용하므로 두번째 방법을 사용한다.
첫번째 방법인 serial disk 스캔하는 명령부터 살펴보도록 하자. 이 방법은 SCSI, SATA, USB로 연결된 장치를 재인식 시킬 때 사용한다. 이 방법을 먼저 설명하는 이유는 간혹 썬더볼트 장치가 USB 하위 호환으로 인식되어 5Gbps 혹은 10Gbps USB 장치로 인식되는 경우도 있기 때문이다. 따라서 이 방법을 사용했을때 인식된다면 썬더볼트가 아닌 USB로 인식되었을 가능성이 있으므로 lsusb 명령으로 확인이 필요하다.
자 그러면 serial disk를 스캔하는 명령은 다음과 같다. (하드웨어 관련이므로 실행시 root 권한을 필요로 한다.)
echo '- - -' | tee /sys/class/scsi_host/host*/scan
두번째 방법인 썬더볼트가 사용하는 PCIe 버스를 리스캔하는 명령은 아래와 같다. 그런데 명령을 내리기 전에 주의점을 먼저 읽어보자.
echo 1 | tee /sys/bus/pci/rescan
PCIe rescan에서 주의할 점은 리눅스 시스템이 다운될 수도 있다는 점이다. 특히 PCIe 장치 중에 그래픽 카드가 문제를 일으킬 가능성이 있다. 이는 PCIe 장치를 rescan할 때 장치 목록이 재작성되는데, 대표적으로 VGA, NIC(네트워크 카드) 펌웨어와 커널 설정이 충돌할 가능성이 있다. 그러므로 "echo 1 > /sys/bus/pci/rescan" 명령을 처음 실행한다면, 미리 작업 중인 파일이나 데이터베이스 작업을 모두 저장해두고, sync 명령을 내려 버퍼도 디스크에 기록해두자.
만일 pci rescan시 시스템이 다운된다면, 재부팅 후에 리눅스 grub의 kernel args에 pci=assign-busses,realloc 설정이 있는지부터 확인해보아야 한다. 왜냐하면 pci=assign-busses,realloc 커널 설정은 rescan시에 오류를 발생시키기 때문이다. 만일 리스캔할 때 Nvidia VGA에서 오류를 발생시키면 화면이 깨질 수 있다. 하지만 text mode를 사용한다면 에러가 발생하지 않을 수도 있다.
예를 들어 아래와 같은 경우를 보자. 아래 시스템은 Nvidia 그래픽 카드를 사용하는 시스템의 커널 boot parameters 설정을 grubby로 살펴본 것이다. (grubby는 레드햇 계열에서 사용하는 grub 관련 툴이다)
# grubby --info=0
index=0
kernel="/boot/vmlinuz-6.6.7-200.fc39.x86_64"
args="ro resume=/dev/mapper/fedora00-swap rd.lvm.lv=fedora00/root rd.lvm.lv=fedora00/swap rhgb quiet pcie_ports=native pci=assign-busses,realloc iommu=soft initcall_blacklist=simpledrm_platform_driver_init nvidia-drm.modeset=1 $tuned_params"
root="/dev/mapper/fedora00-root"
initrd="/boot/initramfs-6.6.7-200.fc39.x86_64.img $tuned_initrd"
title="Fedora Linux (6.6.7-200.fc39.x86_64) 39 (Server Edition)"
id="1dbd4d31815b4ee7bbc3f6a41f9317c8-6.6.7-200.fc39.x86_64"
# echo 1 | tee /sys/bus/pci/rescan
...system down...
위에 보면 args에 이런 저런 설정을 많이 잡아뒀는데 pci=assign-busses,realloc가 설정되어있는 것을 볼 수 있다. 이 설정이 문제를 일으키기 때문에 제거해야만 한다.
# grubby --remove-args="pci=assign-busses,realloc" --update-kernel=ALL
참고로 각 파라메터의 기능은 다음과 같다. 참조 문서는 아래 커널 부트 옵션 링크에 있다.[1]
pcie_ports=[PCIE] | PCIe wear component interconnect express 포트 서비스 처리. PCIE에 가능한 값으로는 native, dpc-native, compat가 있다. native - Use native PCIe services (PME, AER, DPC, PCIe hotplug) even if the platform does not give the OS permission to use them. This setting may cause conflicts if the platform also tries to use these services. dpc-native - Use native PCIe service for DPC only. This setting may cause conflicts if firmware uses AER or DPC. compat - Disable native PCIe services (PME, AER, DPC, PCIe hotplug). |
pci=assign=busses,realloc | assign=busses : 항상 커널이 모든 PCI 버스 넘버를 설정하며, 펌웨어는 무시된다. |
iommu=soft | iommu를 하드웨어 대신에 소프트웨어 구현을 사용하도록 한다. |
리눅스에서 PCIe 썬더볼트 장치가 제대로 인식되었는지는 lspci -vt 명령으로 쉽게 트리 구조 리스트를 볼 수 있다. 예를 들어 아래의 경우 썬더볼트 장치를 가진 PC에서 연결한 모습이다.
PC의 경우 썬더볼트가 외장 칩셋이라 pci bus 경로가 좀 복잡하게 나타난다. 아래 lspci -vt 결과에서 7번째 행의 "Intel Corporation Thunderbolt 4 NHI [Maple Ridge 4C 2020]" 부분이 썬더볼트 칩셋 부분이다. 총 4개의 항목이 보이는데, 비어있는 것 2개, NHI(Native Host Interface), 컨트롤러로 구성되어있다. 비어있는 곳은 아직 연결되지 않은 썬더볼트 포트이다. 여기에 썬더볼트 인클로저가 연결 후 rescan으로 인식되면 "\-03.0-[20-37]----00.0-[21-22]----00.0-[22]----00.0 Sandisk Corp WD Black SN850X NVMe SSD" 부분이 보이게 된것이다.
# lspci -vt
-[0000:00]-+-00.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
+-00.2 Advanced Micro Devices, Inc. [AMD] Starship/Matisse IOMMU
+-01.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
+-01.1-[01]----00.0 Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO
+-01.2-[02-39]--+-00.0 Advanced Micro Devices, Inc. [AMD] 500 Series Chipset USB 3.1 XHCI Controller
| +-00.1 Advanced Micro Devices, Inc. [AMD] 500 Series Chipset SATA Controller
| \-00.2-[03-39]--+-00.0-[04-37]----00.0--+-00.0----00.0 Intel Corporation Thunderbolt 4 NHI [Maple Ridge 4C 2020]
| | +-01.0--
| | +-02.0-[1f]----00.0 Intel Corporation Thunderbolt 4 USB Controller [Maple Ridge 4C 2020]
| | \-03.0--
| +-04.0-[38]--
| \-09.0-[39]----00.0 Intel Corporation Ethernet Controller I225-V
+-02.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
+-03.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
...너무 길어서 중간 생략...
... 썬더볼트 장치 장착 후, 자동인식이 되지 않아서 rescan을 강제로 했다. ...
# echo 1 | tee /sys/bus/pci/rescan
...아래는 썬더볼트 인식 후 모습 01.2-[02-39]-00.2-[03-39]-00.0-[04-37] 아랫쪽에 SN850X가 인식된 것을 볼 수 있다.
# lspci -vt
-[0000:00]-+-00.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
+-00.2 Advanced Micro Devices, Inc. [AMD] Starship/Matisse IOMMU
+-01.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
+-01.1-[01]----00.0 Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO
+-01.2-[02-39]--+-00.0 Advanced Micro Devices, Inc. [AMD] 500 Series Chipset USB 3.1 XHCI Controller
| +-00.1 Advanced Micro Devices, Inc. [AMD] 500 Series Chipset SATA Controller
| \-00.2-[03-39]--+-00.0-[04-37]----00.0-[05-37]--+-00.0-[06]----00.0 Intel Corporation Thunderbolt 4 NHI [Maple Ridge 4C 2020]
| | +-01.0-[07-1e]--
| | +-02.0-[1f]----00.0 Intel Corporation Thunderbolt 4 USB Controller [Maple Ridge 4C 2020]
| | \-03.0-[20-37]----00.0-[21-22]----00.0-[22]----00.0 Sandisk Corp WD Black SN850X NVMe SSD
| +-04.0-[38]--
| \-09.0-[39]----00.0 Intel Corporation Ethernet Controller I225-V
+-02.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
+-03.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
... 썬더볼트 외장 장치(SN850X SSD)가 인식된 것을 볼 수 있다....
랩탑의 경우는 직결되어 있는 버스라서 좀 더 심플하게 출력된다. 아래는 삼성 갤럭시북3 (인텔 13세대)에서 캡쳐한 것이다.
# lspci -vt
-[0000:00]-+-00.0 Intel Corporation Raptor Lake-P/U 4p+8e cores Host Bridge/DRAM Controller
+-02.0 Intel Corporation Raptor Lake-P [Iris Xe Graphics]
+-04.0 Intel Corporation Raptor Lake Dynamic Platform and Thermal Framework Processor Participant
+-05.0 Intel Corporation Device a75d
+-06.0-[01]--
+-06.2-[02]----00.0 Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO
+-07.0-[03-2c]--
+-07.2-[2d-56]----00.0-[2e-2f]----00.0-[2f]----00.0 Sandisk Corp SanDisk Ultra 3D
+-08.0 Intel Corporation GNA Scoring Accelerator module
+-0d.0 Intel Corporation Raptor Lake-P Thunderbolt 4 USB Controller
+-0d.2 Intel Corporation Raptor Lake-P Thunderbolt 4 NHI #0
+-0d.3 Intel Corporation Raptor Lake-P Thunderbolt 4 NHI #1
+-10.0 Intel Corporation Alder Lake-P Serial IO I2C Controller #2
+-12.0 Intel Corporation Alder Lake-P Integrated Sensor Hub
+-14.0 Intel Corporation Alder Lake PCH USB 3.2 xHCI Host Controller
+-14.2 Intel Corporation Alder Lake PCH Shared SRAM
+-14.3 Intel Corporation Raptor Lake PCH CNVi WiFi
+-15.0 Intel Corporation Alder Lake PCH Serial IO I2C Controller #0
+-16.0 Intel Corporation Alder Lake PCH HECI Controller
+-1f.0 Intel Corporation Raptor Lake LPC/eSPI Controller
+-1f.3 Intel Corporation Raptor Lake-P/U/H cAVS
+-1f.4 Intel Corporation Alder Lake PCH-P SMBus Host Controller
\-1f.5 Intel Corporation Alder Lake-P PCH SPI Controller
썬더볼트 인식 후 모습 07.0-[03-2c]에 SN850X가 인식된 것을 볼 수 있다.
# lspci -vt
-[0000:00]-+-00.0 Intel Corporation Raptor Lake-P/U 4p+8e cores Host Bridge/DRAM Controller
+-02.0 Intel Corporation Raptor Lake-P [Iris Xe Graphics]
+-04.0 Intel Corporation Raptor Lake Dynamic Platform and Thermal Framework Processor Participant
+-05.0 Intel Corporation Device a75d
+-06.0-[01]--
+-06.2-[02]----00.0 Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO
+-07.0-[03-2c]----00.0-[04-05]----00.0-[05]----00.0 00.0 Sandisk Corp WD Black SN850X NVMe SSD
+-07.2-[2d-56]--
+-08.0 Intel Corporation GNA Scoring Accelerator module
+-0d.0 Intel Corporation Raptor Lake-P Thunderbolt 4 USB Controller
+-0d.2 Intel Corporation Raptor Lake-P Thunderbolt 4 NHI #0
+-0d.3 Intel Corporation Raptor Lake-P Thunderbolt 4 NHI #1
+-10.0 Intel Corporation Alder Lake-P Serial IO I2C Controller #2
+-12.0 Intel Corporation Alder Lake-P Integrated Sensor Hub
+-14.0 Intel Corporation Alder Lake PCH USB 3.2 xHCI Host Controller
+-14.2 Intel Corporation Alder Lake PCH Shared SRAM
+-14.3 Intel Corporation Raptor Lake PCH CNVi WiFi
+-15.0 Intel Corporation Alder Lake PCH Serial IO I2C Controller #0
+-16.0 Intel Corporation Alder Lake PCH HECI Controller
+-1f.0 Intel Corporation Raptor Lake LPC/eSPI Controller
+-1f.3 Intel Corporation Raptor Lake-P/U/H cAVS
+-1f.4 Intel Corporation Alder Lake PCH-P SMBus Host Controller
\-1f.5 Intel Corporation Alder Lake-P PCH SPI Controller
2.2. Windows의 저장장치 리스캔
윈도 계열에서는 예전에 써두었던 rescan 관련 글에 적힌대로 diskpart 명령을 실행하는 rescan.bat와 rescan.txt 파일을 작성하는 방법이 편리하다. 좀 더 쉬운 방법으로는 관리자 권한으로 pnputil /scan-devices 명령을 내려도 인식되는 경우가 있다.(관리자 권한으로 powershell을 열고 명령하면 된다.) 하지만 썬더볼트 외장 스토리지라면 rescan.bat를 만드는 방법을 권장한다.
윈10 disk rescan, flush (sync) 기능 : 안전제거, https://sunyzero.tistory.com/275
참조
[1] 커널 부트 옵션, https://www.kernel.org/doc/Documentation/x86/x86_64/boot-options.txt
'컴퓨터 관련 > 리눅스(유닉스) 일반' 카테고리의 다른 글
유닉스 표준 IEEE std 1003.1 issue 8 (SUSv5) 개정판 - 2024년 5월 발표 (4) | 2024.11.25 |
---|---|
페도라 리눅스 nvidia 드라이버 설치 (RPM Fusion akmods, 24년 10월 기준) (0) | 2024.10.19 |
[CentOS7] vim 7.4의 python3 지원 (0) | 2022.11.23 |
Fedora 35 : Thunderbolt 4 Maple ridge 인식 실패 문제 (0) | 2022.05.09 |
Failed to initialize NVML (Fedora 리눅스) (0) | 2020.11.28 |
리눅스 배포판 순위 : distrowatch에 대한 오해 (10) | 2019.12.05 |
bash : 기초 : 셸의 역사, 종류 (0) | 2019.10.13 |
파일(file)에 대한 토막글 : 파일이란 무엇인가? (18) | 2019.03.08 |