WUBI จัดการพาร์ติชั่นอย่างไรเมื่อปิดเครื่อง?


10

เอาล่ะดังนั้นโดยทั่วไปฉันพยายามบูท Gentoo ในลักษณะที่คล้ายคลึงกับ WUBI; ฉันมีการติดตั้งไฟล์วนลูปแบ็คในรูปแบบ ext4, BURG ติดตั้งภายใต้ Windows Bootloader และเคอร์เนล / 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-3gcraps out) ดังนั้นฉันจึงพิจารณาที่จะคัดลอกเฉพาะcoreutilsการนำไปปฏิบัติหรือบางสิ่ง และฉันต้องตรวจสอบสิ่งที่จำเป็นสำหรับการติดตั้งพาร์ติชันลูปแบ็ค (มันทำให้ฉันมีข้อผิดพลาดเช่น "ไม่พบไฟล์" เมื่อฉันพยายามที่จะติดลูปแบ็คด้วยตนเอง) ถึงกระนั้นฉันคิดว่าสิ่งเหล่านี้ง่ายพอที่จะคิดออกเอง

อย่างไรก็ตามสิ่งที่ฉันสงสัยเกี่ยวกับการปิดตัวลงคือ เมื่อswitch_rootเสร็จสิ้นแล้วระบบจะถูกทิ้งให้อยู่กับ/ไฟล์ย้อนกลับติดและ/dev/sda2(นี้คือการติดตั้ง Windows 7) /hostบน ขณะนี้ไม่มีวิธียกเลิกการต่อเชื่อม/hostเนื่องจากใช้งานอยู่ อย่างไรก็ตามหนึ่งไม่สามารถยกเลิกการต่อเชื่อม/ในขณะที่รากมีระบบไฟล์ติดตั้งในไดเรกทอรีย่อย การติดตั้ง Ubuntu ที่ใช้ WUBI จะต้องเผชิญกับภาวะที่กลืนไม่เข้าคายไม่ออกเดียวกัน ใครจะเอาชนะปัญหานี้ได้? มันเป็นปัญหาไก่และไข่และมันน่ารำคาญจริงๆสำหรับฉัน

ฉันกำลังพิจารณาบางอย่างตามบรรทัดของสคริปต์บูตที่เก็บแคชชั่วคราวของไฟล์สำหรับรูทพื้นฐานและพื้นฐาน (เช่น initramfs แต่เป็นวิธีอื่น ๆ ) มันจะทำงานครั้งสุดท้ายคัดลอกไฟล์ไปยัง tmpfs หมุนแกนรูทีนอาจนำมันกลับไปที่เลย์เอาต์ดั้งเดิมของ initramfs ฉันจะทำสิ่งนี้เป็นหลัก:

  1. เมานต์tmpfsที่/tmp/shutdown/หรือบางสิ่งบางอย่าง
  2. คัดลอกไฟล์ปิดเครื่อง (อาจจะ/usr/share/shutdown/หรือบางสิ่ง)
  3. pivot_rootเพื่อย้ายรูทไป/loopและ chroot ลงใน tmpfs
  4. mount --move/loop/hostไป/host
  5. ยกเลิกการเชื่อมต่อ /loop
  6. ยกเลิกการเชื่อมต่อ /host
  7. ปิดเครื่องให้เรียบร้อยเนื่องจากพาร์ติชันทั้งหมดถูกถอดออก

อย่างไรก็ตามฉันไม่เคยดัดแปลง Gentoo มากขนาดนี้ เป็นไปได้ด้วย initscript หรือไม่? ฉันไม่ต้องการให้สิ่งนี้ถูกเขียนทับโดยการอัปเดตใด ๆ ของ baselayout หรือสิ่งใด ๆ ของ ebuild เนื่องจากจะทำให้ฉันมีฟังก์ชั่นการปิดระบบเสีย (และฉันไม่ต้องการสูญเสียพาร์ติชันโฮสต์) นอกจากนี้ยังมีปัญหาในการหาว่าระบบเริ่มต้นของ Gentoo รองรับอะไรเช่นนี้ ดูเหมือนจะสะอาดพอ (ถ้าแฮ็คสักหน่อย) แต่ฉันก็ไม่แน่ใจเหมือนกัน ฉันต้องการทราบว่า Ubuntu ทำแตกต่างกันหรือไม่และถ้าเป็นเช่นนั้นได้อย่างไร ข้อเสนอแนะใด ๆ จะเป็นประโยชน์

แก้ไข :

ฉันบูตเครื่องทำงาน แค่เรื่องของการใช้coreutilsเวอร์ชั่นmountอย่างที่ฉันคิด ฉันมีข้อผิดพลาดที่คาดไว้เมื่อปิดเครื่อง ข้อผิดพลาดที่ไม่สามารถยกเลิกการต่อเชื่อมระบบไฟล์และข้อผิดพลาดในการทำเจอร์นัลด้วยวนลูป FS ฉันไม่รู้จะแก้ไขยังไง

แก้ไข 2:

เอาล่ะฉันได้รับสิ่งนั้น ... เรียงลำดับของงาน โดยทั่วไปฉันจะแก้ไข/etc/init.d/{halt.sh,reboot.sh,shutdown.sh}และทำสิ่งต่อไปนี้:

  • เพิ่ม/hostเข้าไปในRC_NO_UMOUNTSตัวแปรซึ่งหยุดโมดูล EXT4 ไม่ให้สำลักข้อผิดพลาดในการทำเจอร์นัล
  • เพิ่ม-o `pidof ntfs-3g`ไปยัง opts สำหรับkillall5(เพื่อให้แน่ใจว่ามันไม่ได้ฆ่า ntfs-3g)
  • แก้ไข shutdown.sh และ restart.sh เพื่อเมาท์ tmpfs บน / boot / shutdownfs และคัดลอกไฟล์ initramfs บางไฟล์ที่นั่นหมุนรูทจากนั้น chroot ลงไปเรียกทั้ง / down หรือ / restart
  • สคริปต์สองตัวนี้ทำการติดตั้งอย่างรวดเร็วและสกปรก / proc และ / sys ย้าย / root / host ไปยัง / host จากนั้นทำการ unmount แบบสันหลังยาว ฉันไม่สามารถถอนการติดตั้งปกติเพื่อทำงาน (ระบบไฟล์จะยังคงยุ่งอยู่) แต่อย่างน้อยนี่ก็ดูเหมือนจะหยุดระบบไฟล์จากการอาเจียนอย่างสมบูรณ์

วิธีการแก้ปัญหานี้ยังคง subpar ดังนั้นความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


คุณสามารถติดตั้ง WUBI แล้วเปลี่ยนไฟล์ระบบด้วย Gentoo หลังจากที่มันทำงานได้หรือไม่
ซัค

คำตอบ:


1

ไม่ใช่ผู้เชี่ยวชาญที่นี่ แต่หลังจากอ่านumountmanpage ฉันเห็นธงเฉพาะสำหรับอุปกรณ์ที่ติดตั้งห่วง:

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

อ่านเพิ่มเติมในlosetup(ใน manpages นิ่ง), ฉันอยากจะแนะนำคุณอาจจะใช้มันเพื่อตรวจแก้จุดบกพร่องมันสามารถใช้เพื่อดูสถานะของอุปกรณ์ที่ติดตั้งห่วง

เชื่อมโยงไปยัง manpage ฉันหมายถึงอยู่ที่นี่ ตัวเลือกนี้:

-a     Show status of all loop devices.

อาจให้เบาะแสแก่คุณและการตั้งค่าสถานะอื่นบางอย่างอาจช่วยเลิกเมานท์อุปกรณ์ลูป

เนื่องจากฉันไม่สามารถจำลองสถานการณ์ของคุณได้ฉันจึงสามารถแนะนำวิธีหาคำตอบด้วยตัวคุณเองเท่านั้นขออภัยด้วยที่ฉันไม่สามารถช่วยเหลือได้มากขึ้น


0

man 8 umount:

-l

ขี้เกียจ unmount แยกระบบไฟล์ออกจากลำดับชั้นของระบบไฟล์ในขณะนี้และล้างการอ้างอิงทั้งหมดไปยังระบบไฟล์ทันทีที่ไม่ยุ่งอีกต่อไป (ต้องการเคอร์เนล 2.4.11 หรือใหม่กว่า)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.