Baiklah, jadi, pada dasarnya, saya mencoba untuk mem-boot Gentoo dengan cara yang mirip dengan WUBI; Saya memiliki instalasi pada file loopback berformat ext4, BURG diinstal di bawah Windows Bootloader, dan kernel / initramfs tersedia untuk booting. Proses booting masih memiliki beberapa masalah (yang saya pikir bisa saya lakukan, kebanyakan karena masalah kecil dengan program itu sendiri) tapi saya punya ide dasar:
- Siapkan busybox dan dapatkan perangkat dengan mdev
- Opsi baris perintah Parse, tentukan apakah meminta root atau loop root nyata
- Jika benar root, pasang
/root
dan aktifkan root, jalankan/sbin/init
. - Jika loop root, mount partisi host aktif
/host
. - Pasang loopback (
/host/${LOOP}
) pada/root
- Pindahkan titik mount host (
mount -o move /host /root/host
untuk busybox) - Alihkan root ke
/root
dan jalankan/sbin/init
Saya punya init
skrip di sini:
#!/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
Tidak ada yang rumit, sungguh. NTFS-3G rupanya tidak setuju dengan implementasi busybox mount
dan hal-hal (Ini menambahkan parameter -i untuk beberapa alasan, dan ntfs-3g
craps out), jadi saya sedang mempertimbangkan hanya menyalin coreutils
implementasi atau sesuatu. Itu, dan saya perlu memeriksa apa yang diperlukan untuk memasang partisi loopback (itu memberi saya kesalahan seperti "File tidak ditemukan" ketika saya mencoba memasang loopback secara manual). Namun, saya pikir ini cukup mudah untuk mencari tahu sendiri.
Namun, yang saya ingin tanyakan adalah shutdown. Setelah switch_root
selesai, sistem akan dibiarkan dengan /
file yang dipasang loopback dan /dev/sda2
(ini adalah instalasi Windows 7) aktif /host
. Sekarang, tidak ada cara untuk melepas /host
, karena sedang digunakan. Namun, seseorang tidak dapat meng-unmount /
ketika root memiliki sistem file yang dipasang di subdirektori. Instalasi Ubuntu berbasis WUBI harus menghadapi dilema yang sama. Bagaimana cara mengatasi masalah ini? Ini masalah ayam dan telur, dan itu benar-benar mengganggu saya.
Saya sedang mempertimbangkan sesuatu di sepanjang baris skrip boot yang menyimpan cache sementara file untuk dasar, root dasar (seperti initramfs, tetapi sebaliknya). Ini akan berjalan terakhir, menyalin file ke tmpfs, memutar root, mungkin mengembalikannya ke tata letak asli initramfs. Saya pada dasarnya akan melakukan ini:
- Pasang
tmpfs
di/tmp/shutdown/
atau sesuatu. - Menyalin file shutdown (mungkin
/usr/share/shutdown/
atau sesuatu) pivot_root
untuk memindahkan root ke/loop
dan chroot ke tmpfs.mount --move
yang/loop/host
ke/host
- Lepas
/loop
- Lepas
/host
- Matikan dengan bersih, karena semua partisi telah dilepas.
Namun, saya belum pernah memodifikasi Gentoo sebanyak ini. Apakah ini mungkin dengan skrip init? Saya tidak ingin ini ditimpa oleh pembaruan ke baselayout atau ebuild apa pun, karena itu akan meninggalkan saya dengan fungsi shutdown yang rusak (dan saya benar-benar tidak ingin kehilangan partisi host). Ada juga masalah mencari tahu apakah sistem init Gentoo bahkan mendukung sesuatu seperti ini. Tampaknya cukup bersih (jika agak peretasan), tapi saya tidak terlalu yakin tentang itu. Saya ingin tahu apakah Ubuntu melakukannya secara berbeda, dan jika demikian, bagaimana? Setiap saran akan sangat membantu.
EDIT :
Saya membuat boot bekerja. Hanya masalah menggunakan coreutils
versi mount
, seperti yang saya pikir. Saya mengalami kesalahan yang saya harapkan pada saat shutdown; kesalahan karena tidak dapat meng-unmount sistem file dan kesalahan penjurnalan dengan loopback FS. Saya tidak tahu bagaimana cara memperbaikinya.
EDIT 2:
Baiklah, saya punya sesuatu yang ... semacam pekerjaan. Saya pada dasarnya mengedit /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}
dan melakukan hal berikut:
- Ditambahkan
/host
keRC_NO_UMOUNTS
variabel, yang menghentikan modul EXT4 dari tersedak tentang kesalahan penjurnalan - Ditambahkan
-o `pidof ntfs-3g`
ke opsi untukkillall5
(untuk memastikan itu tidak membunuh ntfs-3g) - Dimodifikasi shutdown.sh dan restart.sh untuk me-mount tmpfs pada / boot / shutdownfs dan menyalin beberapa file initramfs di sana, berputar root, lalu chroot ke dalamnya, memanggil salah satu / turun atau / restart.
- Kedua skrip ini pada dasarnya melakukan beberapa pengaturan / proc dan / sys cepat dan kotor, pindahkan / root / host ke / host, lalu lakukan unmount malas. Saya tidak dapat menjalankan unmount secara teratur (sistem file masih akan sibuk), tetapi setidaknya ini tampaknya menghentikan sistem file dari muntah sepenuhnya.
Solusi ini masih di bawah standar, sehingga bantuan apa pun akan dihargai.