1. mount namespace이란?
mount namespace는 파일 시스템 마운트(mount)와 언마운트(umount) 작업을 격리할 수 있는 전용 공간을 생성합니다. 한 namespace에서 수행된 mount와 umount 작업은 다른 namespace에 영향을 미치지 않습니다.
예를 들어, A mount namespace에서 생성된 /test 마운트 포인트는 B mount namespace에서는 존재하지 않습니다. 왜냐하면 이 두 namespace는 서로 다른 파일 시스템 마운트 환경을 사용하기 때문입니다.
2. 컨테이너 관점에서 바라보는 mount namespace 역할
컨테이너에서 mount namespace의 역할은 각 컨테이너가 자기만의 파일 시스템 환경을 가지도록 하는 것입니다. mount namespace는 mount와 umount 작업이 다른 namespace에 영향을 주지 않기 때문에, 컨테이너는 자신만의 고유한 디스크 작업 공간을 안전하게 사용할 수 있습니다.
3. 생성방법
mount namespace는 unshare --mount명령어로 생성합니다.
unshare --mount {실행파일 경로}
mount namespace는 /proc/{process id}/ns/mnt에서 확인할 수 있습니다. 주로 현재 프로세스 id를 의미하는 $$를 사용해서 mount namespace를 확인합니다.
$ readlink /proc/$$/ns/mnt
mnt:[4026531841]
4. 예제
unshare명령어로 /bin/sh쉘을 실행합니다. --mount인자를 설정하여 /bin/sh쉘을 위한 mount namespace을 생성합니다.
unshare --mount /bin/sh
/bin/sh쉘과 host에서 mount namespace가 서로 다른지 확인합니다. unshare명령어를 사용했을 때 mount namespace를 생성했기 때문에, host와 /bin/sh쉘은 mount namespace가 서로 다릅니다.
# host
$ readlink /proc/$$/ns/mnt
mnt:[4026531841]
# unshare /bin/sh
$ readlink /proc/$$/ns/mnt
mnt:[4026532587]
이제 /bin/sh쉘에서 mount작업이 정말 다른 mount namespace에 영향을 안미치는지 확인해보겠습니다. /bin/sh쉘에서 mount작업을 하고 host에서 mount결과가 보이는지 확인할 겁니다.
/bin/sh쉘에서 tmpfs를 /tmp/mount_test디렉터리에 mount합니다. tmpfs는 temporary file storage로서 데이터를 임시로 메모리에 저장합니다. 메모리에 저장된 데이터를 /tmp/mount_test에 mount하면 tmpfs에 저장된 데이터가 mount된 디렉터리에 보입니다.
$ mkdir /tmp/mount_test
$ mount -t tmpfs tmpfs /tmp/mount_test
/bin/sh쉘에서는 mount 목록에 이전에 mount한 /tmp/mount_test가 보입니다.
# /bin/sh
$ df -h | grep mount_test
tmpfs 482M 0 482M 0% /tmp/mount_test
하지만 host에서는 /tmp/mount_test가 보이지 않습니다. 왜냐하면 host와 /bin/sh쉘은 mount namespace가 다르기 때문입니다.
# host
$ df -h | grep mount_test
결과 없음
5. 참고자료
- https://www.redhat.com/sysadmin/mount-namespaces
- https://hechao.li/2020/06/09/Mini-Container-Series-Part-1-Filesystem-Isolation/
- https://www.freepascal.org/docs-html/rtl/linux/clone_newns.html
이하공백
'전공영역 공부 기록' 카테고리의 다른 글
AWS security group 체이닝이 불가능한지 확인하는 방법 (0) | 2024.09.04 |
---|---|
chroot - 컨테이너는 어떻게 파일을 실행할까? (2) | 2024.09.02 |
맥북에서 vagrant로 vmware fusion 실행시 No such file or directory: vagrant-utility.client.crt 에러 (0) | 2024.08.28 |
EKS 애드온의 버전별로 호환되는 EKS 버전을 확인하는 스크립트 (0) | 2024.08.25 |
[django] urls.py에서 '/' url패턴을 못찾는 에러 해결방법 (0) | 2024.08.25 |