다음과 같은 기존 디렉터리가 필요합니다.마운트 포인트.
$ 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_CREAT
O_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
두 가지 실패 지점이 있으며 완전한 롤백이 보장되지 않습니다. 다음 시나리오를 상상해 보세요.
mount
마운트 지점이 성공적으로 생성되었습니다.mount
새 파일 시스템을 디렉터리에 마운트하려고 시도했지만 실패했습니다.mount
마운트 지점을 삭제하려고 시도했지만 실패했습니다.
시스템은 결국 실패라는 부작용을 갖게 될 것입니다 mount
.
여기 또 다른 것이 있습니다:
umount
파일 시스템을 성공적으로 마운트 해제했습니다.umount
마운트 지점을 삭제하려고 시도했지만 실패했습니다.
이제 umount
성공 또는 실패를 반환해야 합니까?
답변4
나도 항상 이것이 궁금했다.
다음과 같은 간단한 래퍼:
#!/bin/sh
eval "mkdir -p \"\$$#\""
/bin/mount "$@"
mount
PATH 에서 재정의된 디렉터리에 이름을 지정하고 실행 가능한 스크립트로 저장합니다 /bin
. 너무 귀찮다면 이 점에 유의해야 합니다.
(실제 바이너리를 실행하기 전에 , 아직 존재하지 않는 경우 mount
마지막 인수의 이름을 딴 디렉터리를 생성합니다 .)mount
mount
또는 래퍼의 디렉터리 생성 호출이 실패하지 않도록 하려면 다음을 수행할 수 있습니다.
#!/bin/sh
set -e
eval "lastArg=\"\$$#\""
test -d "$lastArg" || { mkdir "$lastArg"; madeDir=1; }
/bin/mount "$@" || { test -z "$madeDir" || rmdir "$lastArg"; }