스크립트에서 루트 제거

스크립트에서 루트 제거

내 rootfs를 SD 카드의 다른 rootfs로 변경하기 위해 bash 스크립트를 작성 중입니다.

단계는 대략 다음과 같습니다.

mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root

이는 대화형 모드에서는 예상대로 작동하지만, 인터프리터가 실행 중이고 old-root제거할 수 없기 때문에 스크립트에서는 작동하지 않습니다.

그래서 다음과 같이 부모를 죽이는 중간 스크립트를 사용해 보았습니다.

# parent
exec chroot sd_card_fs sh -c script.sh

# son
cat script.sh

...
kill -9 $PPID
umount /old-root
...

아들이 자살하여 그의 부모를 죽였기 때문에 이 방법은 효과가 없었습니다. 그리고 저는 이 해결책이 약간 지저분하다고 생각합니다.

그래서 내 질문은 다음과 같습니다

  • 작업을 수행하기 위해 다른 스크립트를 호출하는 것보다 더 깔끔한 방법이 있습니까? 그렇지 않다면 어떻게 해결할 수 있습니까?

저는 가능한 한 인간의 상호 작용을 줄이고 싶습니다. 따라서 다른 솔루션이 없는 한 하나의 스크립트를 호출하고 다른 스크립트 실행이 완료될 때까지 기다리는 것은 작동하지 않습니다.

답변1

하지만 "부모" 스크립트의 마지막 명령은바꾸다"아들"과 함께요. 그게 다야 exec. 종료될 수 있는 상위 프로세스가 없어야 합니다.

이러한 스크립트는 다음을 수행할 수 있습니다.오직스크립트의 PID가 1일 때 작동하므로 다른 프로세스가 없습니다[*]. 활성화했어야 합니다.init=/bin/bash. 다음을 사용하여 스크립트를 호출하는 것을 잊지 마세요.exec이므로 PID 1을 대체합니다.

지연된 제거를 사용하지 마십시오. 즉, 오류 메시지가 표시되지 않습니다.

귀하의 게으른 제거 작업이 아직 완료되지 않았을 것이라고 99% 확신합니다. ext4 또는 ext3을 사용하지 않는 한 이것을 테스트하는 방법을 잘 모르겠습니다. file -s /dev/$ROOT_DEV"로그 복구 필요"(즉, 아직 완전히 제거되지 않음)라고 표시되어야 합니다.

kill위의 굵은 지침을 삭제하고 따르시면 첫 번째 시도가 성공하기를 바랍니다. 그래도 뭔가를 놓쳤을 수도 있습니다.


[*] 또는 대상 파일 시스템에서 실행 경로를 정렬한 후 init에게 자체적으로 다시 실행하도록 지시해야 합니다. 그러나 이것은 나에게 나쁜 생각처럼 들립니다. 일을 단순하게 유지하십시오.

관련 정보