Bagaimana WUBI menangani partisi saat shutdown?


10

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:

  1. Siapkan busybox dan dapatkan perangkat dengan mdev
  2. Opsi baris perintah Parse, tentukan apakah meminta root atau loop root nyata
  3. Jika benar root, pasang /rootdan aktifkan root, jalankan /sbin/init.
  4. Jika loop root, mount partisi host aktif /host.
  5. Pasang loopback ( /host/${LOOP}) pada/root
  6. Pindahkan titik mount host ( mount -o move /host /root/hostuntuk busybox)
  7. Alihkan root ke /rootdan jalankan/sbin/init

Saya punya initskrip 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 mountdan hal-hal (Ini menambahkan parameter -i untuk beberapa alasan, dan ntfs-3gcraps out), jadi saya sedang mempertimbangkan hanya menyalin coreutilsimplementasi 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_rootselesai, 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:

  1. Pasang tmpfsdi /tmp/shutdown/atau sesuatu.
  2. Menyalin file shutdown (mungkin /usr/share/shutdown/atau sesuatu)
  3. pivot_rootuntuk memindahkan root ke /loopdan chroot ke tmpfs.
  4. mount --moveyang /loop/hostke/host
  5. Lepas /loop
  6. Lepas /host
  7. 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 coreutilsversi 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 /hostke RC_NO_UMOUNTSvariabel, yang menghentikan modul EXT4 dari tersedak tentang kesalahan penjurnalan
  • Ditambahkan -o `pidof ntfs-3g`ke opsi untuk killall5(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.


Bisakah Anda menginstal WUBI dan kemudian mengganti file sistem dengan Gentoo setelah berhasil?
Zach

Jawaban:


1

Bukan ahli di sini, tetapi setelah membaca halaman umountmanual saya melihat sebuah flag khusus untuk perangkat yang di-mount:

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

Juga membaca lebih jauh losetup(dalam halaman manual masih), saya akan menyarankan Anda untuk menggunakannya untuk debug karena dapat digunakan untuk melihat status perangkat loop mount.

Tautan ke halaman buku yang saya maksud ada di sini . Pilihan ini:

-a     Show status of all loop devices.

mungkin memberi Anda petunjuk, dan beberapa flag lain mungkin membantu melepas pemasangan perangkat yang di-loop.

Karena saya tidak dapat meniru situasi Anda, saya hanya dapat menyarankan kepada Anda cara untuk menemukan jawaban Anda sendiri, maaf saya tidak dapat membantu lebih banyak.


0

man 8 umount:

-l

Malas lepas. Lepaskan filesystem dari hirarki filesystem sekarang, dan bersihkan semua referensi ke filesystem segera setelah tidak lagi sibuk. (Membutuhkan kernel 2.4.11 atau yang lebih baru.)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.