운영체제/LINUX

[Linux] 마운트 네임스페이스(Mount namespace) 1

benjykim 2019. 10. 24. 11:17
반응형

리눅스 네임스페이스

  • 네임스페이스: 하나의 시스템에서 수행되지만, 각각 별개의 독립된 공간인 것처럼 격리된 환경을 제공하는 경량 프로세스(쓰레드) 가상화 기술
    • Definition
    The purpose of each namespace is to wrap a particular global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource. 
    
    각 네임스페이스의 목적은 특정 전반적인(global) 시스템 자원을 추상화하여 네임스페이스 안에 있는 프로세스들이 그들 자신만의 격리된 자원(global resource)의 인스턴스를 갖는 것처럼 보이게 하는 것이다.
    
    • 네임스페이스의 목적 중 하나는 컨테이너의 구현을 돕는 것이다. 컨테이너는 경량 가상화를 위한 툴이고 프로세스 그룹에게 그들(프로세스 그룹)이 시스템에서 유일한 프로세스들이라는 환상을 제공한다.
  • 리눅스 네임스페이스 구현 시 unshare(), setns() 시스템 콜 사용
  • 6개의 상수 플래그를 clone(), unshare(), setns() 시스템 콜에 전달해 수행
    • unshare(): 현재 프로세스를 새로 지정된 네임스페이스에 연결
    • setns(): 이미 존재하는 네임스페이스에 프로세스 연결
    • LXC에서 사용하는 6개의 네임스페이스
      1. 마운트 네임스페이스: CLONE_NEWNS
      2. UTS 네임스페이스: CLONE_NEWUTS
      3. IPC 네임스페이스: CLONE_NEWIPC
      4. PID 네임스페이스: CLONE_NEWPID
      5. 사용자 네임스페이스: CLONE_NEWUSER
      6. 네트워크 네임스페이스: CLONE_NEWNET

마운트 네임스페이스(= NS Namespace)

  • 프로세스와 그 자식 프로세스가 각기 다른 파일시스템 마운트 지점을 제공
  • 기본적으로 모든 프로세스는 동일한 기본 네임스페이스를 공유
  • 예를 들어, clone() 시스템 콜을 통해 프로세스를 생성할 때 CLONE_NEWNS 플래그가 전달되면, 새로 생성되는 프로세스는 호출한 프로세스가 갖고 있는 마운트 트리의 사본을 가져옴.
    • 이 시점부터 기본 네임스페이스의 모든 파일시스템 마운트 및 마운트 해제는 새로운 네임스페이스에서 볼 수 있지만, 각각의 프로세스별 마운트 네임스페이스 내부에서의 변경은 해당 프로세스의 네임스페이스 밖에서는 알 수 없다.
  • 실습
    1. 터미널 열고 다음과 같이 /tmp 아래 mount_ns 디렉토리 생성
      
      jiyong@com:~# mkdir /tmp/mount_ns
      
    2. mount 플래그를 unshared 시스템 콜에게 전달해 현재 bash 프로세스를 자체 마운트 네임스페이스로 이동
      
      jiyong@com:~# unshare -m /bin/bash 
      
    3. 지금부터 bash 프로세스가 별도의 네임스페이스에 존재조금 복잡한데 결국 부모 프로세스는 자식 프로세스의 마운트 포인트 리스트를 볼 수 없다. 대신 자식은 부모의 마운트 포인트 리스트를 볼 수 있다.. readlink 명령을 이요해 네임스페이스의 관련 inode 번호를 확인.
      
      jiyong@com:~# readlink /proc/$$/ns/mnt
      mnt:[4026532211]		# inode 번호
      
    4. 임시 마운트 지점을 만들어 /tmp/mount_ns에 마운트시킨다.
      
      jiyong@com:~# mount -n -t tmpfs tmpfs /tmp/mount_ns
      
    5. 새로 만든 네임스페이스에서 마운트 지점을 볼 수 있는지 확인
      
      jiyong@com:~# df -h | grep mount_ns
      tmpfs		7.8G 	0	7.8G	0%	/tmp/mount_ns
      
      jiyong@com:~# cat /proc/mounts | grep mount_ns
      tmpfs 	/tmp/mount_ns 	tmpfs 	rw,relatime 	0 	0
      
      
      • 마운트 지점은 우리가 생성한 네임스페이스의 일부이고, 현재의 bash 프로세스는 우리가 생성한 네임스페이스로부터 실행됐기 때문에 해당 마운트 지점을 볼 수 있다.
    6. 새로운 터미널을 열고, 해당 터미널 세션에서 네임스페이스의 inode ID를 확인해보자.
      
      jiyong@com:~# readlink /proc/$$/ns/mnt
      mnt:[4026531840]
      
      • 다른 터미널의 마운트 네임스페이스와 inode ID가 다르다는 것을 확인할 수 있다.
    7. 4단계에서 마운트한 마운트 지점이 새 터미널에 표시되는지 확인.
      
      jiyong@com:~# cat /proc/mounts | grep mount_ns
      jiyong@com:~# df -h | grep mount_ns
      jiyong@com:~#
      
반응형