WUBI शटडाउन पर विभाजन को कैसे संभालता है?


10

ठीक है, इसलिए, मूल रूप से, मैं GUBoo को WUBI के समान तरीके से बूट करने की कोशिश कर रहा हूं; मेरे पास एक ext4- स्वरूपित लूपबैक फ़ाइल पर एक इंस्टॉलेशन है, BURG विंडोज बूट लोडर के तहत स्थापित किया गया है, और कर्नेल / इनट्रामर्फ बूटिंग के लिए उपलब्ध है। बूटिंग में अभी भी कुछ मुद्दे हैं (मुझे लगता है कि मैं बाहर काम कर सकता हूं, वे ज्यादातर कार्यक्रमों के साथ छोटे मुद्दों के कारण हैं) लेकिन मेरे पास मूल विचार नीचे है:

  1. बिजीबॉक्स सेट करें और महादेव के साथ डिवाइस प्राप्त करें
  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 स्पष्ट रूप से इनबॉक्स mountऔर सामान के कार्यान्वयन के साथ सहमत नहीं है (यह किसी कारण के लिए पैरामीटर -i जोड़ता है, और ntfs-3gबाहर क्रेप्स करता है), इसलिए मैं coreutilsकार्यान्वयन या कुछ और की नकल करने पर विचार कर रहा हूं । बढ़ते लूपबैक विभाजनों के लिए क्या आवश्यक है, इसकी जांच करने की आवश्यकता है (जब मुझे मैन्युअल रूप से लूपबैक को माउंट करने की कोशिश की जाती है, तो यह "फ़ाइल नहीं मिली" जैसी त्रुटि देता है)। फिर भी, मुझे लगता है कि ये काफी आसान हैं जो अपने दम पर समझ लेते हैं।

हालाँकि, मैं जिस चीज के बारे में सोच रहा हूं वह बंद है। एक बार switch_rootपूरा होने के बाद, सिस्टम को /लूपबैक-माउंटेड फ़ाइल के साथ छोड़ दिया जाएगा और /dev/sda2(यह एक विंडोज 7 इंस्टॉल है) /host। अब, /hostउपयोग करने का कोई तरीका नहीं है , क्योंकि यह उपयोग में है। हालाँकि, कोई अनमाउंट नहीं कर सकता है /जबकि रूट में उपनिर्देशिका में फाइलसिस्टम आरोहित है। WUBI- आधारित उबंटू प्रतिष्ठानों को उसी दुविधा का सामना करना चाहिए। इस मुद्दे को कैसे दूर करता है? यह चिकन और अंडे की समस्या है, और यह वास्तव में मुझे परेशान कर रहा है।

मैं एक बूट स्क्रिप्ट की तर्ज पर कुछ विचार कर रहा था जो एक मूल, मूल रूट (जैसे एक इनट्रैमफैट, लेकिन दूसरे तरीके के आसपास) के लिए फ़ाइलों का अस्थायी कैश रखता है। यह अंतिम रूप से चलेगा, फाइलों को एक tmpfs पर कॉपी करना, रूट को पिवट करना, शायद इसे वापस initramfs के मूल लेआउट में रखना। मैं अनिवार्य रूप से यह कर रहा हूँ:

  1. एक माउंट tmpfsपर /tmp/shutdown/या कुछ और।
  2. शटडाउन फ़ाइलों की प्रतिलिपि बनाएँ (शायद /usr/share/shutdown/या कुछ)
  3. pivot_rootरूट को स्थानांतरित करने के लिए /loopऔर tmpfs में काट लें।
  4. mount --move/loop/hostको/host
  5. अनमाउंट /loop
  6. अनमाउंट /host
  7. साफ-सुथरे ढंग से बंद करें, क्योंकि सभी विभाजन बेमिसाल हैं।

हालाँकि, मैंने 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 फाइलों को कॉपी करें, रूट को पिवोट करें, फिर उसमें चौरोट करें, या तो / डाउन या रिस्टार्ट करें।
  • ये दो स्क्रिप्ट अनिवार्य रूप से कुछ त्वरित और गंदे / प्रोक और / एसआईएस सेटअप करते हैं, / रूट / होस्ट को / होस्ट पर ले जाते हैं, फिर आलसी अनमाउंटिंग करते हैं। मैं काम करने के लिए नियमित रूप से अनमाउंट नहीं कर सका (फाइलसिस्टम अभी भी व्यस्त रहेगा), लेकिन कम से कम यह पूरी तरह से उल्टी से फाइल सिस्टम को रोकने के लिए प्रकट होता है।

यह समाधान अभी भी सबपर है, इसलिए किसी भी मदद की सराहना की जाएगी।


क्या आप इसे काम करने के बाद सिर्फ GUBoo के साथ 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:

-l

आलसी अचूक। फाइलसिस्टम पदानुक्रम से फाइल सिस्टम को अलग करें, और फाइल सिस्टम के सभी संदर्भों को जल्द से जल्द साफ करें क्योंकि यह अब व्यस्त नहीं है। (कर्नेल 2.4.11 या बाद के संस्करण की आवश्यकता है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.