기존 디렉터리에서 마운트가 발생하는 이유는 무엇입니까?

기존 디렉터리에서 마운트가 발생하는 이유는 무엇입니까?

다음과 같은 기존 디렉터리가 필요합니다.마운트 포인트.

$ ls
$ sudo mount /dev/sdb2 ./datadisk
mount: mount point ./datadisk does not exist
$ mkdir datadisk
$ sudo mount /dev/sdb2 ./datadisk
$

디렉토리의 기존 내용을 덮어쓰기 때문에 혼란스럽습니다. 마운트 지점 디렉토리에는 두 가지 가능한 내용이 있으며 실수로 전환될 수 있습니다(마운트를 수행하지 않는 사용자의 경우).

mount새로 생성된 디렉토리에서는 왜 이런 일이 발생하지 않습니까 ? 이것이 그래픽 운영 체제가 이동식 미디어를 표시하는 방식입니다. 디렉토리가 마운트되었는지(존재하는지) 마운트되지 않았는지(존재하지 않는지) 분명합니다. 여기에는 타당한 이유가 있다고 확신하지만 아직 발견하지 못했습니다.

답변1

구현 내용이 유출된 사례입니다.

UNIX 시스템에서는 각 디렉토리에 매핑된 이름 목록이 포함되어 있습니다.인덱스 노드숫자. inode에는 파일, 디렉터리, 특수 장치, 명명된 파이프 등인지 시스템에 알려주는 메타데이터가 들어 있습니다. 파일이나 디렉터리인 경우 디스크에서 파일이나 디렉터리 내용을 찾을 수 있는 위치도 시스템에 알려줍니다. 대부분의 inode는 파일이나 디렉터리입니다. 옵션은 inode 번호를 나열합니다 -i.ls

파일 시스템을 마운트하려면 디렉토리 inode가 필요하며 "실제로 이 디렉토리의 내용을 찾을 때 다른 파일 시스템을 살펴보십시오"라는 플래그를 커널의 메모리 복사본에 설정합니다(슬라이드 10 참조).이 프레젠테이션). 이는 단일 데이터 항목을 변경하므로 비교적 쉽습니다.

새 inode를 가리키는 디렉토리 항목을 생성하지 않는 이유는 무엇입니까? 이를 달성하는 방법에는 두 가지가 있지만 두 방법 모두 단점이 있습니다. 하나는 새 디렉터리를 파일 시스템에 물리적으로 쓰는 것입니다. 하지만 파일 시스템이 읽기 전용이면 이 작업은 실패합니다! 또 다른 접근 방식은 실제로 존재하지 않는 "추가" 항목 목록을 각 디렉토리 목록 프로세스에 추가하는 것입니다. 이는 지루한 작업이며 각 파일 작업의 성능에 약간의 영향을 미칠 수 있습니다.

동적으로 생성된 마운트 지점을 원하는 경우 시스템이 automount그렇게 할 수 있습니다. 특수한 비디스크 파일 시스템은 , 등 proc의 디렉토리를 마음대로 생성할 수도 있습니다 sys.devfs

편집 : 답변도 참조하십시오콘텐츠가 포함된 기존 폴더를 "마운트"하면 어떻게 되나요?

답변2

만약에mount(2) 필수의마운트 지점으로 새 디렉토리를 생성합니다. 읽기 전용 파일 시스템에서는 어떤 것도 마운트할 수 없습니다. 그것은 어리석은 일이므로 배제할 수 있습니다.

설치된 경우선택적으로마운트 지점으로 새 디렉터리를 만듭니다. 이상할 것입니다. 마운트/마운트 해제가 항상 발생하는 것은 아니므로 단일 시스템 호출로 두 단계를 모두 수행하기 위해 커널에 추가 로직을 배치해도 속도가 크게 향상되지는 않습니다. mkdir(2)필요한 경우 시스템 호출을 수행하려면 사용자 공간에 맡기십시오. Dmitry의 답변에 따르면 mount(2)이 두 가지 작업을 수행하면 원자적이지 않게 됩니다. 그리고 take, for 등과 mount(2)같은 모드 플래그를 사용 하려면 추가 매개변수가 필요합니다 . 사용자 공간에 이 작업을 수행하도록 하는 것과 비교하면 이는 어리석은 일입니다.open(2)O_CREATO_EXCL

mount(8)아니면 (시스템 호출을 만드는 전통적인 프로그램 mount(2)) 이 작업을 수행 하도록 허용할지 묻는 질문일 수도 있습니다 . 가능하지만 이미 mkdir(1)작업에 딱 맞는 도구가 있고 Unix의 디자인은 모두 결합할 수 있는 좋은 작은 도구에 관한 것입니다. 두 가지를 모두 수행하는 도구를 원한다면 두 가지 더 간단한 도구를 사용하여 쉽게 쉘 스크립트를 작성하여 빌드할 수 있습니다. (또는 muru가 설명했듯이 udisksctl이는 이미 완료되었으므로 작성할 필요가 없습니다.) 또한 mount(8)util-linux의 Linux는 일반적으로 파일 시스템에 전달된 옵션이 아닌 사용자 공간 옵션을 mount -o x-mount.mkdir[=mode]사용하여 구문을 지원합니다.x-


이제 더 흥미로운 질문은 다음과 같습니다. 왜 상위 파일 시스템에 디렉토리가 있어야 합니까?

pjc50의 답변에서 알 수 있듯이(그가 내 이니셜을 가지고 있더라도 상관없습니다!) 디렉토리 목록에 마운트 지점을 표시하려면 readdir().

마운트 지점을 포함하는 디렉터리(상위 FS)에 디렉터리로 존재하도록 하는 것은 좋은 방법입니다. readdir()마운트 지점이라는 사실조차 인식하지 마십시오. 그런 일만 일어날 거야만약에마운트 지점은 경로 구성 요소로 사용됩니다. 물론 경로 확인에서는 경로의 각 디렉터리 구성 요소에 대한 탑재 테이블을 확인해야 합니다.

답변3

기존 디렉토리에 마운트하면 실제로 원자 호출이 이루어집니다 mount. 적어도 사용자 관점에서는 성공하거나 실패합니다. 마운트 지점을 직접 생성해야 하는 경우 mount두 가지 실패 지점이 있으며 완전한 롤백이 보장되지 않습니다. 다음 시나리오를 상상해 보세요.

  1. mount마운트 지점이 성공적으로 생성되었습니다.
  2. mount새 파일 시스템을 디렉터리에 마운트하려고 시도했지만 실패했습니다.
  3. mount마운트 지점을 삭제하려고 시도했지만 실패했습니다.

시스템은 결국 실패라는 부작용을 갖게 될 것입니다 mount.

여기 또 다른 것이 있습니다:

  1. umount파일 시스템을 성공적으로 마운트 해제했습니다.
  2. umount마운트 지점을 삭제하려고 시도했지만 실패했습니다.

이제 umount성공 또는 실패를 반환해야 합니까?

답변4

나도 항상 이것이 궁금했다.

다음과 같은 간단한 래퍼:

#!/bin/sh
eval "mkdir -p \"\$$#\"" 
/bin/mount "$@"  

mountPATH 에서 재정의된 디렉터리에 이름을 지정하고 실행 가능한 스크립트로 저장합니다 /bin. 너무 귀찮다면 이 점에 유의해야 합니다.

(실제 바이너리를 실행하기 전에 , 아직 존재하지 않는 경우 mount마지막 인수의 이름을 딴 디렉터리를 생성합니다 .)mount


mount또는 래퍼의 디렉터리 생성 호출이 실패하지 않도록 하려면 다음을 수행할 수 있습니다.

#!/bin/sh
set -e
eval "lastArg=\"\$$#\""
test -d "$lastArg" || { mkdir "$lastArg"; madeDir=1; }
/bin/mount "$@"  ||  {  test -z "$madeDir" || rmdir "$lastArg"; }

관련 정보