ठीक है, इसलिए, मूल रूप से, मैं GUBoo को WUBI के समान तरीके से बूट करने की कोशिश कर रहा हूं; मेरे पास एक ext4- स्वरूपित लूपबैक फ़ाइल पर एक इंस्टॉलेशन है, BURG विंडोज बूट लोडर के तहत स्थापित किया गया है, और कर्नेल / इनट्रामर्फ बूटिंग के लिए उपलब्ध है। बूटिंग में अभी भी कुछ मुद्दे हैं (मुझे लगता है कि मैं बाहर काम कर सकता हूं, वे ज्यादातर कार्यक्रमों के साथ छोटे मुद्दों के कारण हैं) लेकिन मेरे पास मूल विचार नीचे है:
- बिजीबॉक्स सेट करें और महादेव के साथ डिवाइस प्राप्त करें
- पार्स कमांड लाइन विकल्प, निर्धारित करें कि क्या वास्तविक रूट या लूप रूट के लिए पूछ रहा है
- यदि असली रूट है, तो इसे माउंट करें
/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 स्पष्ट रूप से इनबॉक्स mount
और सामान के कार्यान्वयन के साथ सहमत नहीं है (यह किसी कारण के लिए पैरामीटर -i जोड़ता है, और ntfs-3g
बाहर क्रेप्स करता है), इसलिए मैं coreutils
कार्यान्वयन या कुछ और की नकल करने पर विचार कर रहा हूं । बढ़ते लूपबैक विभाजनों के लिए क्या आवश्यक है, इसकी जांच करने की आवश्यकता है (जब मुझे मैन्युअल रूप से लूपबैक को माउंट करने की कोशिश की जाती है, तो यह "फ़ाइल नहीं मिली" जैसी त्रुटि देता है)। फिर भी, मुझे लगता है कि ये काफी आसान हैं जो अपने दम पर समझ लेते हैं।
हालाँकि, मैं जिस चीज के बारे में सोच रहा हूं वह बंद है। एक बार switch_root
पूरा होने के बाद, सिस्टम को /
लूपबैक-माउंटेड फ़ाइल के साथ छोड़ दिया जाएगा और /dev/sda2
(यह एक विंडोज 7 इंस्टॉल है) /host
। अब, /host
उपयोग करने का कोई तरीका नहीं है , क्योंकि यह उपयोग में है। हालाँकि, कोई अनमाउंट नहीं कर सकता है /
जबकि रूट में उपनिर्देशिका में फाइलसिस्टम आरोहित है। WUBI- आधारित उबंटू प्रतिष्ठानों को उसी दुविधा का सामना करना चाहिए। इस मुद्दे को कैसे दूर करता है? यह चिकन और अंडे की समस्या है, और यह वास्तव में मुझे परेशान कर रहा है।
मैं एक बूट स्क्रिप्ट की तर्ज पर कुछ विचार कर रहा था जो एक मूल, मूल रूट (जैसे एक इनट्रैमफैट, लेकिन दूसरे तरीके के आसपास) के लिए फ़ाइलों का अस्थायी कैश रखता है। यह अंतिम रूप से चलेगा, फाइलों को एक tmpfs पर कॉपी करना, रूट को पिवट करना, शायद इसे वापस initramfs के मूल लेआउट में रखना। मैं अनिवार्य रूप से यह कर रहा हूँ:
- एक माउंट
tmpfs
पर/tmp/shutdown/
या कुछ और। - शटडाउन फ़ाइलों की प्रतिलिपि बनाएँ (शायद
/usr/share/shutdown/
या कुछ) pivot_root
रूट को स्थानांतरित करने के लिए/loop
और tmpfs में काट लें।mount --move
/loop/host
को/host
- अनमाउंट
/loop
- अनमाउंट
/host
- साफ-सुथरे ढंग से बंद करें, क्योंकि सभी विभाजन बेमिसाल हैं।
हालाँकि, मैंने Gentoo को इतना संशोधित नहीं किया है। क्या यह एक इनस्क्रिप्ट में संभव है? मैं यह नहीं चाहता हूं कि इसे किसी भी अपडेट द्वारा बेसलआउट या किसी भी पुनर्निर्माण के लिए अधिलेखित किया जाए, क्योंकि यह मुझे टूटी हुई शटडाउन कार्यक्षमता के साथ छोड़ देगा (और मैं वास्तव में मेजबान विभाजन को खोना नहीं चाहता हूं)। यह भी पता लगाने की समस्या है कि अगर जेंटो की इनिट प्रणाली भी इस तरह से कुछ का समर्थन करती है। यह पर्याप्त साफ लगता है (यदि थोड़ा हैकिश), लेकिन मैं इसके बारे में निश्चित नहीं हूं। मैं जानना चाहता हूं कि क्या उबंटू अलग तरीके से करता है, और यदि हां, तो कैसे? कोई भी सुझाव महत्वपूर्ण है।
संपादित करें :
मुझे बूट का काम मिल गया। बस के coreutils
संस्करण का उपयोग करने की बात है mount
, जैसे मैंने सोचा था। हालाँकि, बंद करने के दौरान मुझे जिन त्रुटियों की उम्मीद थी, मैं कर रहा हूँ; फाइल सिस्टम को अनमाउंट करने में असमर्थ होने और लूपबैक एफएस के साथ त्रुटियों को जर्नल करने में त्रुटि। मुझे नहीं पता कि इसे कैसे ठीक करना है।
संपादित करें 2:
ठीक है, ठीक है, मुझे कुछ मिल रहा है कि ... काम करता है। मैंने मूल रूप से संपादित किया /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}
और निम्नलिखित किया:
- जोड़ी
/host
के लिएRC_NO_UMOUNTS
चर, जो एक journaling त्रुटि के बारे में ऊपर घुट से EXT4 मॉड्यूल बंद हो जाता है -o `pidof ntfs-3g`
Opts के लिए जोड़ा गयाkillall5
(यह सुनिश्चित करने के लिए कि यह ntfs-3G को नहीं मारता है)- शटडाउन को संशोधित किया गया है। फिर से बूट / शटडाउन पर एक tmpfs माउंट करने के लिए शटडाउन और पुनः आरंभ करें। वहां कुछ initramfs फाइलों को कॉपी करें, रूट को पिवोट करें, फिर उसमें चौरोट करें, या तो / डाउन या रिस्टार्ट करें।
- ये दो स्क्रिप्ट अनिवार्य रूप से कुछ त्वरित और गंदे / प्रोक और / एसआईएस सेटअप करते हैं, / रूट / होस्ट को / होस्ट पर ले जाते हैं, फिर आलसी अनमाउंटिंग करते हैं। मैं काम करने के लिए नियमित रूप से अनमाउंट नहीं कर सका (फाइलसिस्टम अभी भी व्यस्त रहेगा), लेकिन कम से कम यह पूरी तरह से उल्टी से फाइल सिस्टम को रोकने के लिए प्रकट होता है।
यह समाधान अभी भी सबपर है, इसलिए किसी भी मदद की सराहना की जाएगी।