เอาล่ะดังนั้นโดยทั่วไปฉันพยายามบูท Gentoo ในลักษณะที่คล้ายคลึงกับ WUBI; ฉันมีการติดตั้งไฟล์วนลูปแบ็คในรูปแบบ ext4, BURG ติดตั้งภายใต้ Windows Bootloader และเคอร์เนล / initramfs พร้อมสำหรับการบูท การบูทยังคงมีปัญหาอยู่บ้าง (ที่ฉันคิดว่าฉันสามารถทำงานได้พวกเขาส่วนใหญ่เป็นเพราะปัญหาเล็ก ๆ กับโปรแกรมของตัวเอง) แต่ฉันมีความคิดพื้นฐานลง:
- ตั้งค่า busybox และรับอุปกรณ์ด้วย mdev
- ตัวเลือกการแยกวิเคราะห์บรรทัดคำสั่งตรวจสอบว่าการถามหารูทจริงหรือรูทลูป
- หากรากจริงติดบนและสวิทช์รากรัน
/root
/sbin/init
/host
หากรากห่วงติดพาร์ทิชันโฮสต์บน- เมานต์ลูปแบ็ค (
/host/${LOOP}
) บน/root
- ย้ายจุดเมานท์ของโฮสต์ (
mount -o move /host /root/host
สำหรับช่องว่าง) - สลับไปที่รูท
/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
craps out) ดังนั้นฉันจึงพิจารณาที่จะคัดลอกเฉพาะcoreutils
การนำไปปฏิบัติหรือบางสิ่ง และฉันต้องตรวจสอบสิ่งที่จำเป็นสำหรับการติดตั้งพาร์ติชันลูปแบ็ค (มันทำให้ฉันมีข้อผิดพลาดเช่น "ไม่พบไฟล์" เมื่อฉันพยายามที่จะติดลูปแบ็คด้วยตนเอง) ถึงกระนั้นฉันคิดว่าสิ่งเหล่านี้ง่ายพอที่จะคิดออกเอง
อย่างไรก็ตามสิ่งที่ฉันสงสัยเกี่ยวกับการปิดตัวลงคือ เมื่อswitch_root
เสร็จสิ้นแล้วระบบจะถูกทิ้งให้อยู่กับ/
ไฟล์ย้อนกลับติดและ/dev/sda2
(นี้คือการติดตั้ง Windows 7) /host
บน ขณะนี้ไม่มีวิธียกเลิกการต่อเชื่อม/host
เนื่องจากใช้งานอยู่ อย่างไรก็ตามหนึ่งไม่สามารถยกเลิกการต่อเชื่อม/
ในขณะที่รากมีระบบไฟล์ติดตั้งในไดเรกทอรีย่อย การติดตั้ง Ubuntu ที่ใช้ WUBI จะต้องเผชิญกับภาวะที่กลืนไม่เข้าคายไม่ออกเดียวกัน ใครจะเอาชนะปัญหานี้ได้? มันเป็นปัญหาไก่และไข่และมันน่ารำคาญจริงๆสำหรับฉัน
ฉันกำลังพิจารณาบางอย่างตามบรรทัดของสคริปต์บูตที่เก็บแคชชั่วคราวของไฟล์สำหรับรูทพื้นฐานและพื้นฐาน (เช่น initramfs แต่เป็นวิธีอื่น ๆ ) มันจะทำงานครั้งสุดท้ายคัดลอกไฟล์ไปยัง tmpfs หมุนแกนรูทีนอาจนำมันกลับไปที่เลย์เอาต์ดั้งเดิมของ initramfs ฉันจะทำสิ่งนี้เป็นหลัก:
- เมานต์
tmpfs
ที่/tmp/shutdown/
หรือบางสิ่งบางอย่าง - คัดลอกไฟล์ปิดเครื่อง (อาจจะ
/usr/share/shutdown/
หรือบางสิ่ง) pivot_root
เพื่อย้ายรูทไป/loop
และ chroot ลงใน tmpfsmount --move
/loop/host
ไป/host
- ยกเลิกการเชื่อมต่อ
/loop
- ยกเลิกการเชื่อมต่อ
/host
- ปิดเครื่องให้เรียบร้อยเนื่องจากพาร์ติชันทั้งหมดถูกถอดออก
อย่างไรก็ตามฉันไม่เคยดัดแปลง 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 ดังนั้นความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม