내 목표는 루트 디스크를 마운트 해제하여 포맷하는 것입니다. 이를 위해 하드 디스크의 루트 디렉터리를 다른 루트 디렉터리로 전환하고 싶습니다. 나는 다시 전환하고 싶은 rootfs를 생성하기 위해 initramfs(최소 루트 파일 시스템 포함)의 파일을 사용하기로 결정했습니다.
Ubuntu 16.04를 새로 설치하면서 이 작업을 수행하고 있습니다.
다음 명령은 램디스크를 생성하고 initramfs의 내용을 램디스크에 복사합니다.
dd if=/dev/zero of=/dev/ram bs=1k count=209715
mke2fs -vm0 /dev/ram 209715
mount -t ext2 /dev/ram /ramroot/
cd /ramroot/
zcat /boot/initrd.img-4.4.0-47-generic | cpio -idmv
mkdir old-root
그러나 switch_root 명령을 실행하면 "잘못된 인수"라는 메시지가 나타납니다.
root@ubuntu-512mb-nyc3-01:/ramroot# switch_root /ramroot /ramroot/old-root
switch_root: failed to mount moving /run to /ramroot/run: Invalid argument
switch_root: forcing unmount of /run
switch_root: failed to mount moving /ramroot to /: Invalid argument
switch_root: failed. Sorry.
내가 뭘 잘못했나요?
답변1
이 목적 으로는 사용하지 않는 것이 좋습니다 switch_root
. 이는 실제로 initramfs에서 사용하고 initramfs에서 실제 루트로 전환하기 위해 설계되었으며 다른 목적으로는 사용되지 않습니다. 맨페이지의 다음 경고에서 이러한 특별한 사용에 대한 증거를 볼 수 있습니다.
WARNING: switch_root removes recursively all files and directories on
the current root filesystem.
이는 initramfs가 실제 루트로 전환된 후 initramfs(tmpfs)가 사용하는 메모리를 복원할 수 있도록 수행됩니다. (그런데, switch_root
initramfs 쉘 스크립트의 일부가 아닌 내장된 이유는 이것이 이 작업을 수행할 수 있는 유일한 기회이기 때문입니다. 이전 루트가 더 이상 사용되지 않고 바이너리가 여전히 파일에 잠시 걸려 있는 후에 설명을 참조하십시오. . ) 정말로 switch_root
이전 루트 파일 시스템을 원하십니까 rm -rf
? 어차피 파일 시스템을 리메이크할 예정이니 괜찮을 거라고 생각했는데, 그게 최선의 선택은 아니었습니다.
또한 사용법이 switch_root
올바르지 않습니다. 다음 인수는 /ramroot
디렉터리 이름이 아니라 (새 루트 디렉터리에서) 실행할 명령이어야 합니다. 그러나 그것은 문제의 원인이 아닙니다.
mount(2) 맨페이지에서는 EINVAL
오류의 원인이 무엇인지 명확하지 않지만 실패하는 것을 보고 놀라지는 않습니다. 귀하의 사용 사례가 의도한 사용 사례가 아니기 때문에 switch_root
아마도 잘 테스트되고 지원되지 않았을 것입니다. 이전 파일 시스템이 아직 사용 중이어서(열린 참조가 있음) 마운트가 작동하지 않는 것일 수 있다고 생각합니다 MS_MOVE
.
다음을 시도하여 작동하는지 확인할 수 있지만 그 중 어느 것도 작동하지 않을 가능성이 높습니다.
sshd
이전 루트 파일 시스템( 컴퓨터에 연결하는 데 사용된 루트 파일 시스템 도 아님)에 대한 참조를 보유하는 시스템에서 아무것도 실행되고 있지 않은지 추가로 확인하십시오 . 모든 SSH 서버 인프라를 새 루트 파일 시스템에 복사한 후에는 다양한 트릭을 사용하여chroot
이전 루트 파일 시스템에 의존하지 않는 시스템에서 SSH 세션을 예약할 수 있지만 이는 일종의 체조가 될 것입니다. .exec
이렇게 호출 되도록switch_root
설계되었습니다.- ext2 파일 시스템 대신 tmpfs 파일 시스템을 사용하십시오. 원하는 작업을 위해 램디스크 위에 ext2 파일 시스템을 사용할 이유가 없습니다. initramfs와 같은 tmpfs를 사용할 수도 있습니다.
원하는 작업을 수행하는 더 좋은 방법은 시스템의 콘솔을 사용하고 실제 initramfs를 사용하여 작업을 수행하는 것입니다. 물론 이를 위해서는 머신에 대한 작업 콘솔 액세스 권한이 필요합니다. 커널 명령줄 처럼 부팅되는 break=bottom
initramfs는 ramfs에서 실행되는 동안 원하는 작업을 수행할 수 있는 기회를 제공합니다. 이 작업을 수행하기 전에 필요한 도구를 initramfs에 복사해야 합니다.
마지막으로, 그렇게 할 수 있는 능력이 있다면 구조 시스템 하에서 이러한 일을 하는 것이 더 쉽고 안전합니다. initramfs에서 작업을 완료하기 위해 위의 트릭을 사용하는 좋은 이유를 생각할 수 있습니다 break
(예: 원격 직렬 콘솔에 액세스할 수 있지만 복구 시스템에 USB 키를 연결할 기회가 없고 네트워크에 대한 지원이 없습니다). 구조 시스템을 부팅하는 것), 그러나 실수를 해서 위험하다면(어쨌든 접근 권한을 잃고 데이터 센터로 가야 함).