내용이있는 기존 폴더를 '마운트'하면 어떻게됩니까?


80

현재 /tmp일부 임시 파일이 있습니다. 하드 드라이브 ( /dev/sdc1)를에 마운트하면 하드 드라이브 /tmp의 파일을 볼 수 있습니다. /tmp하드 드라이브가 마운트 될 때 실제 내용은 어떻게됩니까 ? /tmp하드 드라이브가 장착 된 상태에서 실제 내용에 대해 r / w 작업을 수행 할 수 있습니까?

python@lanix / $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       286G   43G  229G  16% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            3.8G  4.0K  3.8G   1% /dev
tmpfs           766M  1.4M  765M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.8G   38M  3.8G   1% /run/shm
none            100M   24K  100M   1% /run/user
/dev/sdb1       7.5G  2.7G  4.9G  35% /mnt
/dev/sdc1       932G  242G  691G  26% /tmp

답변:


117

하드 드라이브가 마운트 될 때 / tmp의 실제 내용은 어떻게됩니까?

거의 아무것도 없습니다. 그들은 정상적인 파일 시스템 탐색을 통해 도달 할 수없는보기에서 숨겨져 있습니다.

하드 드라이브가 마운트되어있는 동안 / tmp의 실제 내용에 대해 r / w 작업을 수행 할 수 있습니까?

예. "원본"내부에서 열린 파일 핸들이있는 프로세스 /tmp는 계속 사용할 수 있습니다. /다른 곳에 바인드 마운트하여 "어딘가에 다시"나타날 수도 있습니다.

# mount -o bind / /somewhere/else
# ls /somewhere/else/tmp  

다음은 발생하는 상황에 대해 더 나은 느낌을 얻기 위해 실행할 수있는 작은 실험입니다.

참고 : 이것은 완벽하게 올바른 시도가 아니며 실제로 일어나는 일에 대한 철저한 설명이 아닙니다. 그래도 큰 그림을 줄 정도로 정확해야합니다.

me내 컴퓨터에서 전화 한 사용자 와 파일이있는 임의의 디렉토리를 집에 만들었 습니다.

me@home $ pwd
/home/me/tmp
me@home $ echo hello > some_file
me@home $ ls  
some_file
me@home $ cat some_file 
hello

이 시점에서 특이한 점은 없습니다-평범한 파일이있는 평범한 디렉토리 일뿐입니다. cwd해당 테스트 디렉토리 안에 세션을 그대로 열어 둡니다 .

루트로서 작은 파일 시스템을 만들어서 마운트합니다 /home/me/tmp.

root@home # dd if=/dev/zero of=./fs bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00467318 s, 2.2 GB/s

root@home # mkfs -t ext2 ./fs 
mke2fs 1.42.12 (29-Aug-2014)
[... snip ...]
Writing superblocks and filesystem accounting information: done

root@home # mount ./fs /home/me/tmp

그런 다음로 새 터미널을 열고 me둘러보십시오.

me@home #2 $ cd tmp
me@home #2 $ ls
lost+found
me@home #2 $ cat some_file
cat: some_file: No such file or directory
me@home #2 $ echo bye bye > some_file
-su: some_file: Permission denied

우리가 만든 파일은 분명히 없습니다. lost+found디렉토리는 EXT 파일 시스템의 루트를 나타낸다. 그리고 쓰기 권한이 없어서 원래 디렉토리가 아닙니다.

첫 번째 me세션으로 돌아가서 세상이 어떻게 보이는지 봅시다 :

me@home $ echo something else > other_file

글쓰기에 문제가 없습니다.

me@home $ cat some_file other_file 
hello
something else

원본 파일은 여전히 ​​존재하며 문제없이 새 파일이 생성됩니다.

응? 무슨 일이야?

첫 번째 세션은 다른 파일 시스템을 루트 마운트하여 오버레이하기 전에 디렉토리에 들어갔습니다. 이 마운트 동작은 원래 파일 시스템에 전혀 영향을 미치지 않습니다. 쉘 프로세스는 원래 파일 시스템의 디렉토리에 대해 완벽하게 유효한 핸들을 가지고 있으며 계속해서 상호 작용할 수 있습니다. 카페트 마운트 지점 아래 에서 실행 됩니다.

마운트가 내려진 후 두 번째 세션이 디렉토리에 들어갔습니다. 따라서 새로운 빈 파일 시스템이 보입니다. 그리고 sysadmin은 권한을 질식 시켰으므로 요청한 공간을 사용할 수 없습니다.

root@home # chown me:users /home/me/tmp
me@home #2 $ echo bye bye > some_file
me@home #2 $ ls 
lost+found  some_file
me@home #2 $ cat some_file 
bye bye

세션 1이 깔개에서 빠져 나올 수 있습니까? (곰팡이가납니다.)

확실한! 세션 1이 파일 시스템 트리를 마운트 밖으로 이동하면 해당 핸들이 안쪽으로 잃어 버리고 다른 사람들처럼 마운트를 따라갑니다.

me@home $ cd
me@home $ pwd
/home/me
me@home $ cd tmp
me@home $ cat some_file other_file
bye bye
cat: other_file: No such file or directory

세션 # 2와 동일하게 정상으로 돌아 왔습니다.

그러나 파일이 사라지지 않았다는 것을 어떻게 알 수 있습니까? 아무도 더 이상 찾고 있지 않습니다!

그것은 바인드 마운트가 편리 해지는 순간 중 하나입니다. 이미 마운트 된 파일 시스템을 다른 곳에 마운트 할 수 있습니다.

me@home $ mkdir ~/bind
root@home # mount -o bind /home/me /home/me/bind

(예, 파일 시스템을 "내부"에 바인드 마운트 할 수 있습니다. 멋진 트릭, 어?)

me@home $ ls bind/tmp
other_file  some_file
me@home $ cat bind/tmp/*
something else
hello

그래서 그들은 실제로 행동 할 준비가되어 있습니다. 단순히 원래 위치에서 볼 수 없거나 도달 할 수 없다는 것만으로 마운트하면 일반적인 디렉토리 탐색에서 숨길 수 있습니다.


나는 당신이 이것을 가지고 놀 것을 장려합니다. 당신이 재생되는 "속임수"를 이해 한 후에는 실제로 복잡하지 않습니다. 그리고 일단 Got It ™을 사용하면 더 많은 양탄자를 얻기 위해 통합 파일 시스템을 살펴보십시오 :-)

그러나 한 가지 참고 사항 : 부팅 프로세스가 완료되면 /tmp또는 /var(또는 핵심 OS 디렉토리 중 하나 이상) 마운트 하는 것은 좋은 생각이 아닙니다. 많은 응용 프로그램이 해당 디렉토리에 상태를 유지하며 주변에서 마운트 게임을하면 심각하게 혼란 스러울 수 있습니다.


4
이것은 훌륭한 답변입니다-당신은 내가 당신에게 요구 한 것 이상으로 넘어갔습니다. 바인드 마운트의 아이디어도 꽤 멋집니다! 자세한 답변 주셔서 감사합니다. 건배.
사용자

11
디스크 공간을 신비하게 잃는 가장 일반적인 방법입니다. 시작 스크립트에서 어떤 이유로 든 마운트에 실패하면 루트 파일 시스템의 디렉토리에 데이터를 쓸 수 있습니다. 다시 시작을 시도하면 마운트가 성공할 수 있으며 공간을 많이 차지할 것입니다 (파일 시스템에 tmp 파일 또는 로그가 포함 된 경우).
Dan Sheppard

2
@DanSheppard 이것이 내 마운트 지점이 chmod 000을 설정하는 것을 좋아하는 이유 중 하나입니다. 또한 중요한 마운트가 실패하면 systemd가 부팅에 실패하는 이유는 무엇입니까?
Zan Lynx

"바인드"폴더 대신에 마운트 /home/me/home/me바인드 할 수 있습니까? 즉, 카펫 위에 다른 카펫을 놓습니다. 아니면 fs먼저 마운트를 해제해야 합니까?
jiggunjer

@jiggunjer union옵션이 도움 이 될 것 같습니다 .
hliu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.