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:
- Meşgul kutusunu ayarlayın ve mdev ile cihazları edinin
- Komut satırı seçeneklerini ayrıştırın, gerçek kök veya döngü kökü isteyip istemediğinizi belirleyin
- Gerçek kök ise, takın
/root
ve kök açın, çalıştırın/sbin/init
. - Döngü kökü ise, ana bilgisayar bölümünü takın
/host
. - Geri döngü bağla (
/host/${LOOP}
)/root
- Ana bilgisayarın bağlama noktasını taşıma (meşgul kutusu
mount -o move /host /root/host
için) - Kökü değiştirin
/root
ve yürütün/sbin/init
Bende init
burada 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ı mount
ve şeyler ile kabul etmiyor (nedense -i parametresini ekler ve ntfs-3g
dışarı craps), bu yüzden ben sadece coreutils
uygulama 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_root
tamamlandığında, sistem ile kalacak /
geri döngü monte dosya ve /dev/sda2
üzerinde (bu Windows 7 yüklemektir) /host
. Artık /host
kullanı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:
- Bir monte
tmpfs
de/tmp/shutdown/
falan. - Kapatma dosyalarını kopyalayın (belki
/usr/share/shutdown/
falan) pivot_root
/loop
Kökleri tmpfs'ye taşımak ve köklerini tmpfs'ye taşımakmount --move
/loop/host
için/host
- Unmount
/loop
- Unmount
/host
- 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 coreutils
sü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
/host
içinRC_NO_UMOUNTS
bir günlük kaydı hata ile ilgili tıkama ext4'e modülü durur değişken, -o `pidof ntfs-3g`
İçin seçimlere eklendikillall5
(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.