WUBI kapatıldıktan sonra bölümleri nasıl işler?


10

Pekala, temelde, Gentoo'yu WUBI'ye benzer bir şekilde başlatmaya çalışıyorum; Bir ext4 biçimli geri döngü dosyası, Windows Bootloader altında yüklü BURG ve önyükleme için kullanılabilir çekirdek / initramfs bir yükleme var. Önyüklemenin hala bazı sorunları var (çalışabileceğimi düşündüğüm, çoğunlukla programların kendileriyle ilgili küçük sorunlar nedeniyle), ancak temel fikrim var:

  1. Meşgul kutusunu ayarlayın ve mdev ile cihazları edinin
  2. Komut satırı seçeneklerini ayrıştırın, gerçek kök veya döngü kökü isteyip istemediğinizi belirleyin
  3. Gerçek kök ise, takın /rootve kök açın, çalıştırın /sbin/init.
  4. Döngü kökü ise, ana bilgisayar bölümünü takın /host.
  5. Geri döngü bağla ( /host/${LOOP})/root
  6. Ana bilgisayarın bağlama noktasını taşıma (meşgul kutusu mount -o move /host /root/hostiçin)
  7. Kökü değiştirin /rootve yürütün/sbin/init

Bende initburada senaryoyu:

#!/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

Gerçekten karmaşık bir şey yok. NTFS-3G Görünüşe göre meşgul kutusu uygulaması mountve şeyler ile kabul etmiyor (nedense -i parametresini ekler ve ntfs-3gdışarı craps), bu yüzden ben sadece coreutilsuygulama veya bir şey üzerinde kopyalama düşünüyor. Bu, ve geri döngü bölümleri montajı için gerekli olanları incelemek gerekir (geri döngü manuel olarak monte etmeye çalıştığınızda bana "Dosya bulunamadı" gibi bir hata veriyor). Yine de, bunların kendi başıma çözülebilecek kadar kolay olduğunu düşünüyorum.

Ancak, merak ettiğim şey kapatma. Bir kez switch_roottamamlandığında, sistem ile kalacak /geri döngü monte dosya ve /dev/sda2üzerinde (bu Windows 7 yüklemektir) /host. Artık /hostkullanımda olduğu gibi bağlantısını kesmenin bir yolu yok . Ancak, /kök bir alt dizine bağlı dosya sistemleri varken bağlantı kesilemez. WUBI tabanlı Ubuntu kurulumları aynı ikilemle karşı karşıya olmalıdır. Kişi bu sorunun üstesinden nasıl gelir? Bu bir tavuk ve yumurta problemi ve gerçekten canımı sıkıyor.

Ben bir temel, temel kök (initramfs gibi, ama başka bir yol gibi) için dosyaların geçici bir önbellek tutan bir önyükleme komut dosyası satırlarında bir şey düşünüyordu. Son olarak, dosyaları bir tmpfs'ye kopyalayarak, kökü döndürerek, belki de initramfs'ın orijinal düzenine geri döndürerek çalışır. Aslında bunu yapardım:

  1. Bir monte tmpfsde /tmp/shutdown/falan.
  2. Kapatma dosyalarını kopyalayın (belki /usr/share/shutdown/falan)
  3. pivot_root/loopKökleri tmpfs'ye taşımak ve köklerini tmpfs'ye taşımak
  4. mount --move/loop/hostiçin/host
  5. Unmount /loop
  6. Unmount /host
  7. Tüm bölümler çıkarıldığı için temiz bir şekilde kapatın.

Ancak, Gentoo'yu bu kadar çok değiştirmedim. Bu bir initscript ile mümkün mü? Ben bu bana kapatma kapatma işlevselliği (ve gerçekten ana bölümü kaybetmek istemiyorum) bırakacaktı çünkü, temel düzeni veya herhangi bir ebuild herhangi bir güncelleme tarafından üzerine yazılmasını istemiyorum. Ayrıca Gentoo'nun init sisteminin böyle bir şeyi destekleyip desteklemediğini anlama sorunu da var. Yeterince temiz görünüyor (eğer biraz hackish), ama bu konuda çok emin değilim. Ubuntu'nun farklı mı yapıp yapmadığını bilmek istiyorum, eğer öyleyse, nasıl? Herhangi bir öneri yardımcı olacaktır.

DÜZENLE :

Botu çalıştırdım. Düşündüğüm gibi sadece coreutilssürümünü kullanma meselesi mount. Gerçi kapatma sırasında beklediğim hataları alıyorum; FS sistemlerinde bağlantı kesilemeyen hatalar ve günlük kaydı hataları. Bunu nasıl düzeltebileceğimi bilmiyorum.

DÜZENLEME 2:

Pekala, böyle bir şey var ... Bir çeşit iş. Temel olarak şunu düzenledim /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}ve şunları yaptım:

  • Ekleme /hostiçin RC_NO_UMOUNTSbir günlük kaydı hata ile ilgili tıkama ext4'e modülü durur değişken,
  • -o `pidof ntfs-3g`İçin seçimlere eklendi killall5(ntfs-3g'yi öldürmediğinden emin olmak için)
  • / Boot / shutdownfs üzerine bir tmpfs yerleştirmek ve oradaki bazı initramfs dosyalarının üzerine kopyalamak, kökü döndürmek, daha sonra / aşağı veya / restart komutunu çağırmak için chroot.ot ve restart.sh dosyalarını değiştirin.
  • Bu iki komut dosyası temelde hızlı ve kirli / proc ve / sys kurulumları yapar, / root / host'u / host'a taşır, sonra tembel bağlantıyı keser. Çalışmak için düzenli unmounts alamadım (dosya sistemi hala meşgul olurdu), ama en azından bu dosya sistemlerinin tamamen kusmasını engelliyor gibi görünüyor.

Bu çözüm hala subparted, bu nedenle herhangi bir yardım takdir edilecektir.


WUBI'yi yükleyebilir ve daha sonra çalıştıktan sonra Gentoo ile sistem dosyalarını kapatabilir misiniz?
Zach

Yanıtlar:


1

Burada bir uzman değil, ama umountmanpage okuduktan sonra döngüye monte cihazlara özgü bir bayrak görüyorum:

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

Ayrıca daha fazla okuma losetup(hala manpajlarda), döngüye monte edilen cihazların durumunu görmek için kullanılabileceği için hata ayıklamak için kullanmanızı öneririm.

Bahsettiğim man sayfasının bağlantısı burada . Bu seçenek:

-a     Show status of all loop devices.

size bir ipucu verebilir ve diğer bazı bayraklar, döngülü cihazların bağlantısını kesmeye yardımcı olabilir.

Durumunuzu tekrarlayamadığım için size sadece cevabınızı kendiniz bulmanın yollarını önerebilirim, üzgünüm daha fazla yardım edemeyeceğim.


0

man 8 umount:

-l

Tembel bağlantısını kesin. Dosya sistemini şimdi dosya sistemi hiyerarşisinden ayırın ve artık meşgul olmaz dosya sistemine yapılan tüm başvuruları temizleyin. (2.4.11 veya daha yeni bir çekirdek gerektirir.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.