종료시 WUBI는 파티션을 어떻게 처리합니까?


10

기본적으로 WUBI와 비슷한 방식으로 Gentoo를 부팅하려고합니다. ext4 형식의 루프백 파일, Windows Bootloader 아래에 설치된 BURG 및 부팅에 사용할 수있는 커널 / initramfs에 설치했습니다. 부팅에는 여전히 몇 가지 문제가 있습니다 (내가 해결할 수 있다고 생각하는 프로그램은 주로 프로그램 자체의 작은 문제로 인한 것입니다).하지만 기본 아이디어가 있습니다.

  1. busybox 설정 및 mdev로 장치 가져 오기
  2. 명령 행 옵션을 구문 분석하고 실제 루트 또는 루프 루트를 요구하는지 판별하십시오.
  3. 실제 루트라면 마운트하고 /root루트를 전환하고를 실행하십시오 /sbin/init.
  4. 루프 루트 인 경우 호스트 파티션을에 마운트하십시오 /host.
  5. 루프백 마운트 ( /host/${LOOP})/root
  6. 호스트의 마운트 지점 이동 ( mount -o move /host /root/host통화 상자 용)
  7. 루트를 전환 /root하고 실행/sbin/init

나는 init여기 에 스크립트를 가지고 있다 :

#!/bin/sh

# Rescue shell in case of error.
rescue_shell() {
     echo "Something went wrong. Dropping you to a shell."
     exec /bin/sh
 }

parse_opt() {
        case "$1" in
                *\=*)
                        echo "$1" | cut -d= -f2-
                ;;
        esac
}

# Set up BusyBox...
busybox --install -s

# Mount the /proc and /sys filesystems.
mount -t proc none /proc
mount -t sysfs none /sys

# Populate /dev
echo ":: Populating /dev..."
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

# Get command line options...
for x in ${CMDLINE}
do
        case "${x}" in
                root\=*)
                        ROOT=`parse_opt "${x}"`
                ;;
                # Loadloop
                loop\=*)
                        LOOP=`parse_opt "${x}"`
                ;;
                ntfsroot)
                        NTFSROOT=1
  ;;
 esac
done


if [ "${NTFSROOT}" != 1 ]
then
 # Mount the root filesystem, plain and simple.
 echo ":: Mounting real root..."
 mount -o ro "${ROOT}" /mnt/root || rescue_shell
else
 # Load up an NTFS-based root.
 echo ":: NTFS Root mount requested. Mounting..."
 ntfs-3g "${ROOT}" /host

 if [ -f "/host/${LOOP}" ]
 then
  mount -o loop,ro  "/host/${LOOP}" /root || rescue_shell
  echo ":: Mounted. Moving host..."
  mount -o move /host /root/host || rescue_shell
  echo ":: Mounted."
 else
  "!! ERROR: Invalid/nonexistant loop given!"
  rescue_shell
 fi
fi

# Clean up.
umount /proc
umount /sys

# Boot the real thing.
echo ":: Switching to root and calling init..."
exec switch_root /root /sbin/init

정말 복잡한 것은 없습니다. NTFS-3G는 busybox 구현 mount및 내용에 동의하지 않습니다 (어떤 이유로 매개 변수 -i를 추가하고 ntfs-3g폐기합니다) coreutils. 구현 또는 무언가를 복사하는 것을 고려 하고 있습니다. 루프백 파티션을 마운트하는 데 필요한 사항을 검토해야합니다 (루프백을 수동으로 마운트하려고하면 "파일을 찾을 수 없음"과 같은 오류가 발생 함). 아직도, 나는 이것들이 내 자신을 알아 내기에 충분히 쉽다고 생각합니다.

그러나 내가 궁금해하는 것은 셧다운입니다. switch_root이 완료 되면 시스템은 /루프백 마운트 파일과 /dev/sda2(Windows 7 설치)로 유지됩니다 /host. 이제는 /host사용중인 마운트 해제 방법이 없습니다 . 그러나 /루트에 서브 시스템에 파일 시스템이 마운트되어 있으면 마운트 를 해제 할 수 없습니다 . WUBI 기반 Ubuntu 설치는 동일한 딜레마에 직면해야합니다. 이 문제를 어떻게 극복합니까? 그것은 닭고기와 계란 문제이며 정말 짜증납니다.

기본 스크립트의 기본 루트 (initramfs와 같지만 다른 방법)에 대한 임시 파일 캐시를 보유하는 부트 스크립트 라인을 따라 무언가를 고려하고있었습니다. 마지막으로 실행되어 파일을 tmpfs로 복사하고 루트를 피벗하고 아마도 initramfs의 원래 레이아웃으로 되돌려 놓습니다. 본질적으로 이것을하고있을 것입니다 :

  1. tmpfs/tmp/shutdown/또는 무언가를 장착하십시오 .
  2. 종료 파일 (아마도 /usr/share/shutdown/또는 다른 것)을 복사하십시오.
  3. pivot_root루트를 /loopchtmp를 tmpfs로 옮깁니다 .
  4. mount --move/loop/host/host
  5. 마운트 해제 /loop
  6. 마운트 해제 /host
  7. 모든 파티션이 마운트 해제되었으므로 완전히 종료하십시오.

그러나 나는 Gentoo를 이렇게 많이 수정하지 않았습니다. initscript로 가능합니까? 나는 baselayout 또는 어떤 ebuild에 대한 업데이트로 이것을 덮어 쓰지 않기를 원한다. 젠투의 init 시스템이 이와 같은 것을 지원하는지 알아내는 문제도 있습니다. 그것은 충분히 깨끗해 보이지만 (약간의 해킹 인 경우), 나는 그것에 대해 너무 확신하지 않습니다. 우분투가 다르게 작동하는지 알고 싶다면 어떻게해야합니까? 어떤 제안이라도 도움이 될 것입니다.

편집 :

부팅이 작동했습니다. 생각처럼 의 coreutils버전 을 사용하는 것만으로도 문제가 없습니다 mount. 그래도 시스템 종료시 예상되는 오류가 발생했습니다. 루프백 FS에서 파일 시스템을 마운트 해제 할 수없는 오류 및 저널링 오류 이 문제를 여전히 해결하는 방법을 모르겠습니다.

편집 2 :

글쎄요, 뭔가가 있습니다 ... 일종의 작품. 기본적으로 편집 /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}하고 다음을 수행했습니다.

  • EXT4 모듈이 저널링 오류에 대해 질식하지 못하게 /host하는 RC_NO_UMOUNTS변수에 추가됨
  • -o `pidof ntfs-3g`opts에 추가 killall5(ntfs-3g를 죽이지 않도록하기 위해)
  • shutdown.sh 및 restart.sh를 수정하여 / boot / shutdownfs에 tmpfs를 마운트하고 거기에 일부 initramfs 파일을 복사 한 다음 루트를 피벗 한 다음 chroot를 사용하여 / down 또는 / restart를 호출합니다.
  • 이 두 스크립트는 본질적으로 빠르고 더러운 / proc 및 / sys 설정을 수행하고 / root / host를 / host로 이동 한 다음 지연 마운트 해제를 수행합니다. 정기적으로 마운트 해제를 수행 할 수 없었지만 (파일 시스템은 여전히 ​​사용 중일 것입니다.) 적어도 이것은 파일 시스템이 완전히 구토하는 것을 막는 것으로 보입니다.

이 솔루션은 여전히 ​​하위 수준이므로 도움을 주시면 감사하겠습니다.


WUBI를 설치 한 다음 작업 한 후 젠투로 시스템 파일을 전환 할 수 있습니까?
Zach

답변:


1

여기 전문가는 아니지만 umount맨 페이지를 읽은 후 루프 마운트 장치 전용 플래그가 표시됩니다.

-d     In case the unmounted device was a loop device, also free this loop device.

또한 losetup맨 페이지에서 더 자세히 읽으면 루프 마운트 장치의 상태를 보는 데 사용할 수 있으므로 디버깅에 사용하는 것이 좋습니다.

내가 언급 한 맨 페이지 링크 는 여기에 있습니다 . 이 옵션 :

-a     Show status of all loop devices.

힌트를 줄 수도 있고, 다른 플래그는 루프 된 장치를 마운트 해제하는 데 도움이 될 수 있습니다.

귀하의 상황을 재현 할 수 없으므로 귀하의 답변을 스스로 찾을 수있는 방법 만 제안 할 수 있습니다. 도움을 드릴 수 없습니다.


0

man 8 umount:

-엘

게으른 마운트 해제 파일 시스템 계층에서 파일 시스템을 분리하고 더 이상 사용하지 않는 즉시 파일 시스템에 대한 모든 참조를 정리하십시오. (커널 2.4.11 이상이 필요합니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.