`마운트` 오류: `시스템 호출 실패: 파일이 존재합니다. `

`마운트` 오류: `시스템 호출 실패: 파일이 존재합니다. `

lvm 스냅샷 장치를 마운트하려고 하면 다음 오류가 발생합니다.

$ sudo mount -o loop /dev/mapper/matrix-snap--of--core /home/me/mountpoint
mount: /home/me/mountpoint: mount(2) system call failed: File exists.
  • "파일이 존재합니다"란 무엇입니까? 나에게 오류를 말하려고 하시나요?
  • LVM 스냅샷 장치를 마운트하는 방법은 무엇입니까?

마지막으로 확인한 것은 2018년 10월이었지만 mount 명령은 "항상 작동했습니다". 존재하다이 질문은 3년 전에 받은 질문입니다.. 그런데 오류 메시지가 조금 다르고 2019년인데...


이것이 내 결과입니다 lsblk.

NAME                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                             8:0    0 465.8G  0 disk  
└─sda1                          8:1    0 465.8G  0 part  
  └─core                      254:0    0 465.8G  0 crypt 
    ├─matrix-swapvolume       254:1    0     4G  0 lvm   [SWAP]
    └─matrix-core-real        254:3    0 461.8G  0 lvm   
      ├─matrix-core           254:2    0 461.8G  0 lvm   /
      └─matrix-snap--of--core 254:5    0 461.8G  0 lvm   
sdb                             8:16   1  59.5G  0 disk  
└─matrix-snap--of--core-cow   254:4    0  59.5G  0 lvm   
  └─matrix-snap--of--core     254:5    0 461.8G  0 lvm   

저는 Parabola Linux를 실행하고 있으며 시스템이 최신 상태입니다. 논리 볼륨 /dev/matrix/core사용량 btrfs, 이것이 버그와 관련이 있는 것으로 의심됩니다. 이것이 내 결과입니다 uname -rvs.

Linux 5.2.5-gnu-1 #1 SMP PREEMPT Sun Aug 4 02:02:20 UTC 2019

답변1

-o loop( LVM 스냅샷 장치는 원시 디스크 장치만큼 우수하다고 가정되기 때문에 마운트 옵션을 사용하려는 이유를 잘 모르겠습니다 .)

"파일이 존재합니다"는 값이 17 또는 .인 표준 영어 errno텍스트 EEXIST입니다 #include <errno.h>.

시스템 호출은 이 오류 결과를 기록하지 않으므로 mount(2)일부 소스 코드를 읽어야 합니다.

Linux 커널 상호 참조는 elixir.bootlin.com에 있습니다.EEXIST가 사용되는 커널 코드의 모든 위치를 나열할 수 있습니다. btrfs루프에서 파일 시스템을 마운트하려고 하므로 관련될 수 있는 위치는 다음과 같습니다.

  • drivers/block/loop.c, 사이클 장비 관리 관련
  • fs/btrfs/super.c, 이는 파일 시스템을 마운트할 때 사용됩니다 btrfs.

에서 이미 사용 중인(예: 점유된) 특정 루프 장치를 할당하려고 하면 drivers/block/loop.c오류 가 발생합니다 . 그러나 mount 명령으로 경쟁 조건을 만드는 것이 없다면 여기서는 문제가 되지 않습니다.EEXISTmount -o loop=/dev/loop3 .../dev/loop3

실제로 오류 코드를 오류 메시지로 변환하는 특정 기능이 fs/btrfs/super.c있습니다 . 로 btrfs번역됩니다 .EEXISTObject already exists

이미 마운트된 파일 시스템의 복제본 처럼 보이는 것을 마운트하려고 하므로 btrfs실제로 의미가 있습니다. 역사적으로 이것은 혼란스러웠지만 btrfs어느 시점에서 (현명하게) 추가된 것 같습니다 일부 보호.

이 것 같으니까LVM 레벨내장된 스냅샷 기능을 사용하여 생성된 스냅샷과 달리 스냅샷은 btrfs원래 파일 시스템이 마운트된 동안 스냅샷을 마운트하려면 스냅샷을 복제 파일 시스템으로 처리해야 합니다. LVM만이 그것이 스냅샷이라는 것을 "인식"합니다. , 실제로 1:1 클론은 아닙니다. 따라서 원본 파일 시스템과 동일한 시스템에 스냅샷/복제 파일 시스템을 마운트해야 하는 경우 스냅샷/복제 파일 시스템의 메타데이터 UUID를 변경해야 합니다.

경고하다:저는 이 분야에 대한 경험이 많지 않기 btrfs때문에 다음 내용이 틀렸거나 불완전할 수 있습니다.

커널 버전이 5.0보다 높으므로 btrfstune -m /dev/mapper/matrix-snap--of--core. 그렇지 않으면 파일 시스템 수퍼 블록의 필드 btrfstune -u /dev/mapper/matrix-snap--of--core뿐만 아니라 모든 파일 시스템 메타데이터를 업데이트해야 하므로 더 느린 명령을 사용해야 합니다 .metadata_uuid

답변2

파티션의 UUID를 변경한 후 이 문제가 있는 BTRFS 파티션을 성공적으로 마운트했습니다.

답변3

장치가 이미 다른 곳에 설치되어 있는 경우 오류가 발생합니다. 먼저 제거해야 합니다. 그런 다음 새 마운트를 생성할 수 있습니다.

답변4

Docker 컨테이너가 컨테이너에도 탑재된 호스트의 탑재 지점에 계속 액세스하려고 하기 때문에 이러한 상황이 발생합니다. 연결이 끊어진 외부 USB 드라이브이며 컨테이너로 인해 다시 마운트할 수 없습니다. 다시 설치하기 전에 컨테이너를 중지하면 문제가 해결되었습니다.

관련 정보