저는 올플래시 스토리지 애플리케이션을 개발 중입니다. NVMe 장치의 전원을 끄거나 켤 때 마운트 바인딩이 이상한 동작을 하는 것을 발견했습니다. 배포판: SUSE Linux Enterprise Server 15 SP4 5.14.21-150400.24.46-기본값
/dev/nvme10n1p1 파티션을 /mnt/10n1p1에 마운트합니다.
# mount --bind /dev/nvme10n1p1 /mnt/10n1p1
# lsblk /mnt/10n1p1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme10n1p1 259:11 0 3.6T 0 part
# stat /dev/nvme10n1p1
File: /dev/nvme10n1p1
Size: 0 Blocks: 0 IO Block: 4096 block special file
Device: 5h/5d Inode: 23620 Links: 1 Device type: 103,b
# stat /mnt/10n1
File: /mnt/10n1
Size: 0 Blocks: 0 IO Block: 4096 block special file
Device: 5h/5d Inode: 23620 Links: 1 Device type: 103,b
핫 플러깅 또는 전력 서지를 시뮬레이션하기 위해 짧은 시간 동안 NVME 장치를 끄거나 켭니다.
# ls -lat /sys/block | grep "nvme10n1"
.../0000:be:00.0/nvme/nvme2/nvme10n1
# lspci -vmms 0000:be:00.0
...PhySlot: 168
# date && echo 0|sudo tee /sys/bus/pci/slots/${PHYSLOT}/power
# sleep 5
# date && echo 1|sudo tee /sys/bus/pci/slots/${PHYSLOT}/power
전원을 껐다 켠 후 방금 전원을 켠 새 드라이브에 바인딩 포인트를 마운트합니다.
# lsblk /mnt/10n1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme30n2 259:11 0 3.6T 0 disk
└─nvme30n2p1 259:51 0 3.6T 0 part
# stat /dev/nvme30n2
File: /dev/nvme30n2
Size: 0 Blocks: 0 IO Block: 4096 block special file
Device: 5h/5d Inode: 24836 Links: 1 Device type: 103,b
사전 테스트를 마친 후 원래 드라이브의 전원이 꺼진 후 짧은 시간 동안에도 마운트 바인드가 전원이 켜진 다른 드라이브를 가리킬 수 있다는 사실을 발견했습니다.
# mount --bind /dev/nvme0n1p1 /mnt/0n1
# lsblk 0n1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1p1 259:44 0 3.6T 0 part
# nvme id-ctrl /dev/nvme0n1 | grep sn
sn: : PHLJ043200234P0DGN
# nvme id-ctrl /dev/nvme1n1 | grep sn
sn: : PHLJ043105AU4P0DGN
# PHYSLOT_0=195
# PHYSLOT_1=194
# date && echo 0|sudo tee /sys/bus/pci/slots/${PHYSLOT_1}/power
# sleep 5
# date && echo 0|sudo tee /sys/bus/pci/slots/${PHYSLOT_0}/power
# sleep 5
# date && echo 1|sudo tee /sys/bus/pci/slots/${PHYSLOT_1}/power
# sleep 5
# date && echo 1|sudo tee /sys/bus/pci/slots/${PHYSLOT_0}/power
# lsblk /mnt/0n1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme31n2p1 259:44 0 3.6T 0 part
# nvme id-ctrl /dev/nvme31n2 | grep sn
sn : PHLJ043105AU4P0DGN
# nvme id-ctrl /dev/nvme32n2 | grep sn
sn : PHLJ043200234P0DGN
정전/켜짐 후 마운트 포인트의 inode 번호는 새 드라이브 장치의 inode 번호와 다르지만 마운트 포인트의 inode와 새 드라이브 장치의 inode는 동일한 마이너 번호를 공유하는 것으로 나타났습니다. 이것이 원래 마운트 지점이 새 드라이브 장치에 액세스하여 데이터 손상을 일으킬 수 있는 이유라고 생각합니다. 내 생각엔 마운트 지점이 전원이 꺼진 드라이브의 인덱스에 대한 참조를 유지했기 때문에 인덱스 노드가 삭제되지 않은 것 같습니다. 그런 다음 새 드라이브의 전원이 켜지고 원래 드라이브와 동일한 재활용 마이너 번호를 얻습니다. 이 동작이 예상되는지 또는 바인딩 설치의 제한 사항이나 버그인지 확실하지 않습니다.
답변1
이는 Linux 커널 bdev
수명주기 버그이며 버전 5.15에서 수정되었습니다.
관련 패치 링크여기.