슈퍼유저 권한이 있는 Linux 사용자 공간에서 새 UBIFS 이미지로 원본 UBI 파티션을 업데이트해야 하는데, 쓰기 위해 EBUSY
해당 파티션을 열려고 할 때마다 /dev/ubiX_Y
(Device or Resource Busy) 오류가 발생합니다. 읽기 전용으로 마운트되었습니다. Zerofree 및 ext4magic과 같은 유틸리티가 이런 방식으로 작동하는 것을 보면 읽기 전용으로 마운트된 경우 ext4 파일 시스템과 같은 공통 블록 파티션을 쓰기 위해 열 수 있을 것으로 생각됩니다. UBI 파티션에서는 그렇지 않은 것 같습니다.
이론적으로는 파티션을 사용하여 프로세스를 종료하거나 파티션을 완전히 마운트 해제하기 전에 프로세스에 연결하고 모든 파일을 강제로 닫을 수 있지만 init
항상 열려 있는 비지박스 프로세스로는 아무것도 할 수 없는 것 같습니다 /etc/inittab
. 예, 문제의 파티션은 루트 /
설치 파티션입니다.
더러운 작업을 수행하기 위해 커널 모듈을 구현할 수도 있지만 가능한 한 많은 부분을 유지하고 싶습니다.바이너리내 업데이트 유틸리티는 향후 호환성을 위한 것이며 기본적으로 가능한 한 커널 버전에 구애받지 않고 유지되므로 이러한 방식으로 문제를 해결하는 것은 매우 바람직하지 않습니다. 내가 할 수 있는 다른 방법이 있나요?
답변1
다음과 같은 줄이 있는 경우 /etc/inittab
:
::restart:/tmp/updater_stage2
그런 다음 SIGQUIT를 보내면 init
/tmp/updater_stage2로 대체됩니다. /etc/inittab
변경 후 다시 로드 하려면 SIGHUP을 보내세요. /etc/inittab
바인드 마운트로 교체할 수 있습니다 .
mount --bind /tmp/inittab /etc/inittab
kill -HUP 1
sleep 1
kill -QUIT 1
생성되지 않은 실행이 사용 가능하지 않거나 /etc/inittab
지원되지 않는 경우 다음으로 바꿔야 합니다 .inittab
init
init
/sbin/init
mkdir /tmp/old_sbin
mount --bind /sbin /tmp/old_sbin
cp -as /tmp/old_sbin /tmp/new_sbin
ln -sf /tmp/updater_stage2 /tmp/new_sbin/init
mount --bind /tmp/new_sbin /sbin
kill -QUIT 1
그런 다음 루트 파일 시스템을 다음으로 교체 pivot_root
한 chroot
다음 마운트 해제할 수 있습니다(이동 후 /tmp
등 /proc
).