Pivot_root 이전의 chroot로 인해 바쁜 오류가 발생함

Pivot_root 이전의 chroot로 인해 바쁜 오류가 발생함
# unshare -m
# mount --bind / /mnt
# cd /mnt
# chroot .
# pivot_root . mnt
pivot_root: failed to change root from `.' to `mnt': Device or resource busy

왜 실패했나요? 나는 지시를 따르고 있다 man 2 pivot_mount.

ivot_root()는 이전 루트 디렉터리를 사용하는 프로세스나 스레드의 현재 루트 디렉터리와 현재 작업 디렉터리를 변경할 수도 있고 변경하지 않을 수도 있습니다. ivot_root() 호출자는 루트 디렉터리 또는 현재 작업 디렉터리가 이전 루트 디렉터리에 있는 프로세스가 두 경우 모두 올바르게 실행되는지 확인해야 합니다. 이를 보장하는 간단한 방법은ivot_root()를 호출하기 전에 루트 디렉터리와 현재 작업 디렉터리를 new_root로 변경하는 것입니다.

이것이 기록된 EBUSY 오류와 어떻게 일치하는지 알 수 없습니다.

실수

ivot_root()는 stat(2)가 반환한 모든 오류를 (errno에서) 반환할 수 있습니다. 또한 다음을 반환할 수 있습니다.

바쁘다 new_root 또는 put_old가 현재 루트 파일 시스템에 있거나 파일 시스템이 put_old에 마운트되어 있습니다.

답변1

맨페이지의 이 부분은 오해의 소지가 있습니다. 에 설명된 대로 다른 순서가 필요한 경우가 많습니다 man 8 pivot_root.

cd new_root             # chdir(new_root);
pivot_root . put_old    # pivot_root(".", put_old);
exec chroot .           # chroot(".");

이것은 또 다른 미묘한 세부 사항인 것 같습니다 pivot_root. pivot_root마운트 네임스페이스를 재배치하는 데 초점이 맞춰져 있지만,커널 코드이동하는 루트 파일 시스템은 설정된 각 프로세스의 루트에 의해 결정된다는 뜻인 것 같습니다 chroot.

그 결과 "new_root 또는 put_old가 현재 루트 파일 시스템에 있습니다"라는 오류가 발생했습니다.

pivot_root작동하려면 이 미묘한 세부 사항이 필요합니다.별말씀을요최신 Linux에서. 마운트 네임스페이스의 루트 마운트에서 작동하도록 정의된 경우 rootfs사용 중인 특수 파일 시스템을 이동하려고 시도합니다.일반적인 상황에서는 보이지 않음. 하지만rootfs는 항상 네임스페이스의 루트 마운트여야 하므로 이는 허용되지 않습니다..


pivot_root아래 예제를 계속 진행하면 이것이 작동하는지 확인할 수 있습니다 .

# unshare -m
# mount --bind / /mnt
# cd /mnt
# chroot /mnt
# pivot_root . mnt
pivot_root: failed to change root from `.' to `mnt': Device or resource busy

# exit  # leave chroot
# mount --bind . mnt
# cd mnt
# mount --bind /proc proc
# findmnt | grep mnt
└─/mnt                                /dev/mapper/alan_dell_2016-fedora ext4            rw,relatime,seclabel
  └─/mnt                              /dev/mapper/alan_dell_2016-fedora ext4            rw,relatime,seclabel
    └─/mnt/proc                       proc                              proc            rw,nosuid,nodev,noexec,relatime

# chroot /mnt  # re-enter chroot
# cd /mnt
# pivot_root . mnt  # this one works
# exit  # leave chroot
# findmnt | grep mnt
└─/mnt                                /dev/mapper/alan_dell_2016-fedora        ext4            rw,relatime,seclabel
  ├─/mnt/mnt                          /dev/mapper/alan_dell_2016-fedora        ext4            rw,relatime,seclabel
  └─/mnt/proc                         /dev/mapper/alan_dell_2016-fedora[/proc] ext4            rw,relatime,seclabel

두 번째 pivot_root호출이 작동합니다. 하지만 마운트된 네임스페이스의 루트에는 아무런 영향을 미치지 않습니다. 외부에서는 및 를 chroot바꿉니다 ./mnt/mnt/mnt

관련 정보