Linux의 U.2 핫 플러그?

Linux의 U.2 핫 플러그?

저는 핫스왑이 가능한 Debian 11과 U.2 SSD를 가지고 있습니다. 제 커널은 다음과 같습니다.

root@eris:~# uname -a
Linux eris 5.18.0-0.bpo.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.18.2-1~bpo11+1 (2022-06-14) x86_64 GNU/Linux

드라이브가 "ICY DOCK U.2 NVMe SSD 모바일 랙"에 설치되어 있고 부팅 시 정상적으로 감지되어 포맷하고 마운트할 수 있지만 랙에서 꺼내면 커널이 감지되지 않습니다. dmesg) 그리고 그것을 랙에 다시 넣으면 mount다른 명령이 그것을 찾을 수 없습니다.

이 글을 찾았어요AIX에서도 비슷하다, 드라이브를 분리하기 전에 몇 가지 단계를 수행해야 할 수도 있습니다. 예를 들어 AIX에서는 먼저 시스템에 드라이브를 "구성 해제"하라고 지시합니다.

그럼 제가 뭔가 잘못하고 있는 걸까요? 그렇다면 이 문제를 해결하려면 어떻게 해야 합니까?

답변1

나는 필요한 것을 달성할 수 있는 방법을 찾았습니다. 그것은 핫 스왑의 일부로 드라이브를 "구성 해제" 및 "구성"하는 것이었습니다. 이것이 제가 지금까지 한 일입니다. 실제로는 비교적 간단합니다.

내 블록 장치는 다음과 같습니다.

root@eris:~# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0  3.6T  0 disk 
├─nvme0n1p1 259:1    0  476M  0 part /boot/efi
├─nvme0n1p2 259:2    0 38.1G  0 part /
└─nvme0n1p3 259:3    0  3.6T  0 part /data
nvme1n1     259:4    0  3.5T  0 disk /test

구성 해제(즉, 블록 장치 목록에서 제거)하려는 항목은 입니다 nvme1n1. 이제 디렉토리 트리로 매핑된 PCI 버스에서 올바른 장치 주소를 찾아야 합니다. /sys/bus/pci가장 쉬운 방법은 다음과 같습니다.

root@eris:~# for i in /sys/block/nvme*
> do
>   echo "$i is $(cat $i/device/address)"
> done
/sys/block/nvme0n1 is 0000:01:00.0
/sys/block/nvme1n1 is 0000:04:00.0

이는 nvme1n1다음에 해당함 을 보여줍니다 /sys/bus/pci/drivers/nvme/0000:04:00.0.

root@eris:~# ll /sys/bus/pci/drivers/nvme/0000:04:00.0/
total 0
-r--r--r-- 1 root root  4096 Jul  7 09:24 aer_dev_correctable
-r--r--r-- 1 root root  4096 Jul  7 09:24 aer_dev_fatal
-r--r--r-- 1 root root  4096 Jul  7 09:24 aer_dev_nonfatal
-r--r--r-- 1 root root  4096 Jul  7 09:24 ari_enabled
-rw-r--r-- 1 root root  4096 Jul  7 09:24 broken_parity_status
-r--r--r-- 1 root root  4096 Jul  7 08:04 class
-rw-r--r-- 1 root root  4096 Jul  7 09:24 config
-r--r--r-- 1 root root  4096 Jul  7 09:24 consistent_dma_mask_bits
-r--r--r-- 1 root root  4096 Jul  7 09:24 current_link_speed
-r--r--r-- 1 root root  4096 Jul  7 09:24 current_link_width
-rw-r--r-- 1 root root  4096 Jul  7 09:24 d3cold_allowed
-r--r--r-- 1 root root  4096 Jul  7 08:04 device
-r--r--r-- 1 root root  4096 Jul  7 09:24 dma_mask_bits
lrwxrwxrwx 1 root root     0 Jul  7 08:04 driver -> ../../../../../../bus/pci/drivers/nvme
-rw-r--r-- 1 root root  4096 Jul  7 09:24 driver_override
-rw-r--r-- 1 root root  4096 Jul  7 09:24 enable
lrwxrwxrwx 1 root root     0 Jul  7 09:24 firmware_node -> ../../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:3b/device:3c/device:41/device:42
lrwxrwxrwx 1 root root     0 Jul  7 09:24 iommu -> ../../../../0000:00:00.2/iommu/ivhd0
lrwxrwxrwx 1 root root     0 Jul  7 09:24 iommu_group -> ../../../../../../kernel/iommu_groups/21
-r--r--r-- 1 root root  4096 Jul  7 09:24 irq
drwxr-xr-x 2 root root     0 Jul  7 09:24 link/
-r--r--r-- 1 root root  4096 Jul  7 09:24 local_cpulist
-r--r--r-- 1 root root  4096 Jul  7 09:24 local_cpus
-r--r--r-- 1 root root  4096 Jul  7 09:24 max_link_speed
-r--r--r-- 1 root root  4096 Jul  7 09:24 max_link_width
-r--r--r-- 1 root root  4096 Jul  7 09:24 modalias
-rw-r--r-- 1 root root  4096 Jul  7 09:24 msi_bus
drwxr-xr-x 2 root root     0 Jul  7 09:24 msi_irqs/
-rw-r--r-- 1 root root  4096 Jul  7 09:24 numa_node
drwxr-xr-x 3 root root     0 Jul  7 08:04 nvme/
-r--r--r-- 1 root root  4096 Jul  7 09:24 pools
drwxr-xr-x 2 root root     0 Jul  7 09:24 power/
-r--r--r-- 1 root root  4096 Jul  7 09:24 power_state
--w--w---- 1 root root  4096 Jul  7 09:24 remove
--w------- 1 root root  4096 Jul  7 09:24 rescan
--w------- 1 root root  4096 Jul  7 09:24 reset
-rw-r--r-- 1 root root  4096 Jul  7 09:24 reset_method
-r--r--r-- 1 root root  4096 Jul  7 09:24 resource
-rw------- 1 root root 16384 Jul  7 09:24 resource0
-r--r--r-- 1 root root  4096 Jul  7 08:04 revision
-rw------- 1 root root 65536 Jul  7 09:24 rom
lrwxrwxrwx 1 root root     0 Jul  7 08:10 subsystem -> ../../../../../../bus/pci
-r--r--r-- 1 root root  4096 Jul  7 08:04 subsystem_device
-r--r--r-- 1 root root  4096 Jul  7 08:04 subsystem_vendor
-rw-r--r-- 1 root root  4096 Jul  7 09:24 uevent
-r--r--r-- 1 root root  4096 Jul  7 08:04 vendor

여기서 필요한 것은 remove쓰기 전용 파일입니다. 블록 장치 목록에서 SSD 장치를 제거하려면:

root@eris:~# echo 1 > /sys/bus/pci/drivers/nvme/0000:04:00.0/remove
root@eris:~# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0  3.6T  0 disk 
├─nvme0n1p1 259:1    0  476M  0 part /boot/efi
├─nvme0n1p2 259:2    0 38.1G  0 part /
└─nvme0n1p3 259:3    0  3.6T  0 part /data

몇 초 정도 걸리므로 당황하지 마세요! 그것을 검색하려면:

root@eris:~# echo 1 > /sys/bus/pci/rescan
root@eris:~# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0  3.6T  0 disk 
├─nvme0n1p1 259:1    0  476M  0 part /boot/efi
├─nvme0n1p2 259:2    0 38.1G  0 part /
└─nvme0n1p3 259:3    0  3.6T  0 part /data
nvme1n2     259:5    0  3.5T  0 disk 

하지만 이것이 nvme1n1되었다는 점에 유의하세요 nvme1n2. 이것은 아직 알아내야 할 문제이지만 이제 U.2 드라이브를 핫스왑할 수 있습니다.

관련 정보