MS_SHARED를 사용하여 마운트할 때 매개변수가 유효하지 않습니다.

MS_SHARED를 사용하여 마운트할 때 매개변수가 유효하지 않습니다.

mkdtemp(2) 및 MS_SHARED를 사용하여 만든 임시 디렉터리인 mount_dir에 /mnt의 ext4 파일 시스템을 마운트하려고 합니다. 그런 다음 MS_PRIVATE를 사용하여 다시 마운트하려고 합니다. 아이디어는 /mnt 파일 시스템에서 마운트 네임스페이스를 만들고 전파를 방지하는 것입니다. 네임스페이스 내에서 원래 파일 시스템으로 이벤트를 전송합니다.

다른 플래그 조합을 시도했지만 MS_BIND | MS_PRIVATE만 작동하지만 이벤트가 여전히 원래 파일 시스템에 전파되는 것 같습니다.

fprintf(stderr,"-->Mounting file system from base image...");
  if(mount("/mnt", mount_dir, NULL, MS_SHARED , NULL)){
      fprintf(stderr, "%s Failed..%m\n",mount_dir);
      return -1;
    }else{
      fprintf(stderr,"Success\n");
    }
    fprintf(stderr,"-->Remounting mount point as MS_PRIVATE...");
    if(mount(NULL, mount_dir, NULL, MS_REMOUNT | MS_PRIVATE, NULL)){
      fprintf(stderr,"Failed..%m\n");
      return -1;
    }else{
      fprintf(stderr, "Success.\n");
    }

답변1

표시되는 코드의 두 마운트 호출을 모두 변경해야 합니다. 첫 번째 호출에서 마운트를 생성할 때 이 MS_SHARED플래그를 지정하면 오류가 발생합니다 EINVAL. 대신, 해당 플래그 없이 설치를 생성하십시오(즉, 매개변수는 flags0이어야 함). 그러면 기본 전파 유형으로 새 마운트 지점이 생성됩니다. MS_SHARED상위 마운트에도 공유 전파가 있는 경우 유형은 이고, 그렇지 않은 경우 전파 유형은 입니다 MS_PRIVATE. (자세한 내용은 다음을 참조하세요.mount_namespaces(7)매뉴얼 페이지의 "설명" 섹션.)

두 번째 mount()호출에서는 플래그가 필요하지 않으며 실제로 MS_REMOUNT사용할 때 플래그가 MS_PRIVATE무시됩니다 . 보다설치(2)매뉴얼 페이지(특히 "테스트는 여기에 나열된 순서대로 수행됩니다" 참고):

   A call to mount() performs one of a number  of  general  types  of
   operation,  depending  on  the  bits specified in mountflags.  The
   choice of which operation to perform is determined by testing  the
   bits  set  in  mountflags,  with  the tests being conducted in the
   order listed here:

   *  Remount an existing mount: mountflags includes MS_REMOUNT.

   *  Create a bind mount: mountflags includes MS_BIND.

   *  Change the propagation type of an  existing  mount:  mountflags
      includes  one of MS_SHARED, MS_PRIVATE, MS_SLAVE, or MS_UNBIND‐
      ABLE.

   *  Move an existing mount to a new location:  mountflags  includes
      MS_MOVE.

   *  Create  a  new  mount:  mountflags  includes  none of the above
      flags.

MS_REMOUNT두 번째 호출에서 플래그를 제거하면 mount()원하는 결과를 얻을 수 있을 것입니다.

이 2단계 프로세스가 왜 필요한지는 잘 모르겠지만, 그 이유는 mount()디자인 API의 한계 때문이라고 생각됩니다. 수년에 걸쳐 API에 추가 사항이 있었고(증거는 위에 인용된 텍스트 참조) 마운트 전파 기능이 추가되었을 때(2005년경) 아마도 이것이 이전 버전과 호환되는 유일한 방법이었을 것입니다.

관련 정보