Làm thế nào để WUBI xử lý các phân vùng khi tắt máy?


10

Được rồi, về cơ bản, tôi đang cố gắng khởi động Gentoo theo cách tương tự như WUBI; Tôi có một cài đặt trên tệp loopback có định dạng ext4, BURG được cài đặt trong Windows Bootloader và kernel / initramfs có sẵn để khởi động. Việc khởi động vẫn có một số vấn đề (những vấn đề tôi nghĩ tôi có thể giải quyết được, phần lớn là do các vấn đề nhỏ với chính các chương trình) nhưng tôi có ý tưởng cơ bản:

  1. Thiết lập busybox và nhận thiết bị với mdev
  2. Tùy chọn dòng lệnh phân tích, xác định nếu yêu cầu root thực hoặc root loop
  3. Nếu root thực sự, gắn kết nó /rootvà chuyển đổi root, thực hiện /sbin/init.
  4. Nếu vòng lặp gốc, gắn kết phân vùng máy chủ trên /host.
  5. Mount loopback ( /host/${LOOP}) trên/root
  6. Di chuyển điểm gắn kết của máy chủ ( mount -o move /host /root/hostđối với busybox)
  7. Chuyển đổi root /rootvà thực thi/sbin/init

Tôi đã có initkịch bản ở đây:

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

Không có gì phức tạp, thực sự. NTFS-3G rõ ràng không đồng ý với việc triển khai mountvà các công cụ của busybox (Nó thêm tham số -i vì một số lý do và ntfs-3gbỏ qua), vì vậy tôi đang xem xét chỉ sao chép việc coreutilstriển khai hoặc một cái gì đó. Điều đó và tôi cần kiểm tra những gì cần thiết để gắn phân vùng loopback (nó gây ra lỗi cho tôi như "Không tìm thấy tệp" khi tôi cố gắng gắn loopback theo cách thủ công). Tuy nhiên, tôi nghĩ rằng những điều này là đủ dễ dàng để tự mình tìm ra.

Tuy nhiên, điều tôi băn khoăn là tắt máy. Sau khi switch_roothoàn thành, hệ thống sẽ được để lại một /tệp gắn trên loopback và /dev/sda2(đây là cài đặt Windows 7) /host. Bây giờ, không có cách nào để ngắt kết nối /host, vì nó đang được sử dụng. Tuy nhiên, người ta không thể ngắt kết nối /trong khi root có hệ thống tập tin được gắn trong thư mục con. Các bản cài đặt Ubuntu dựa trên WUBI phải đối mặt với tình trạng khó xử tương tự. Làm thế nào để một người khắc phục vấn đề này? Đó là một vấn đề về gà và trứng, và nó thực sự làm tôi khó chịu.

Tôi đã xem xét một cái gì đó dọc theo dòng của một kịch bản khởi động chứa bộ đệm tạm thời của các tệp cho một gốc cơ bản, cơ bản (như initramfs, nhưng ngược lại). Nó sẽ chạy sau cùng, sao chép các tệp vào một tmpfs, xoay vòng gốc, có lẽ đưa nó trở lại bố cục ban đầu của initramfs. Về cơ bản tôi sẽ làm điều này:

  1. Gắn kết tmpfstại /tmp/shutdown/hoặc một cái gì đó.
  2. Sao chép các tập tin tắt máy (có lẽ /usr/share/shutdown/hoặc một cái gì đó)
  3. pivot_rootđể di chuyển root đến /loopvà chroot vào tmpfs.
  4. mount --movecác /loop/hostđể/host
  5. Vô song /loop
  6. Vô song /host
  7. Tắt sạch, vì tất cả các phân vùng đã được bỏ qua.

Tuy nhiên, tôi chưa bao giờ sửa đổi Gentoo nhiều như vậy. Điều này có thể với một initscript? Tôi không muốn điều này bị ghi đè bởi bất kỳ bản cập nhật nào cho baselayout hoặc bất kỳ ebuild nào, vì điều đó sẽ khiến tôi bị hỏng chức năng tắt máy (và tôi thực sự không muốn mất phân vùng máy chủ). Ngoài ra còn có vấn đề tìm hiểu xem hệ thống init của Gentoo có hỗ trợ những thứ như thế này không. Nó có vẻ đủ sạch (nếu hơi hack), nhưng tôi không chắc lắm về điều đó. Tôi muốn biết nếu Ubuntu làm điều đó khác đi, và nếu vậy, làm thế nào? Bất kỳ đề nghị sẽ là hữu ích.

CHỈNH SỬA :

Tôi đã khởi động làm việc. Chỉ là vấn đề sử dụng coreutilsphiên bản mount, như tôi nghĩ. Tôi đang có những lỗi tôi mong đợi khi tắt máy; lỗi không thể ngắt kết nối hệ thống tập tin và lỗi ghi nhật ký với FS loopback. Tôi không biết làm thế nào để sửa lỗi này.

EDIT 2:

Được rồi, tốt, tôi đã có một cái gì đó đi ... Sắp xếp các công việc. Về cơ bản tôi đã chỉnh sửa /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}và làm như sau:

  • Thêm /hostvào RC_NO_UMOUNTSbiến, mà dừng lại các module EXT4 từ nghẹn chiếm khoảng một lỗi nhật ký
  • Đã thêm vào -o `pidof ntfs-3g`opts cho killall5(để đảm bảo nó không giết ntfs-3g)
  • Đã sửa đổi shutdown.sh và restart.sh để gắn tmpfs trên / boot / shutdownfs và sao chép một số tệp initramfs ở đó, xoay gốc, sau đó chroot vào nó, gọi / xuống hoặc / khởi động lại.
  • Hai tập lệnh này về cơ bản thực hiện một số thiết lập nhanh và bẩn / Proc và / sys, di chuyển / root / host sang / host, sau đó lười biếng ngắt kết nối. Tôi không thể làm cho các công cụ ngắt kết nối thường xuyên hoạt động (hệ thống tập tin vẫn sẽ bận rộn), nhưng ít nhất điều này dường như ngăn chặn các hệ thống tập tin bị nôn hoàn toàn.

Giải pháp này vẫn là subpar, vì vậy bất kỳ trợ giúp sẽ được đánh giá cao.


Bạn có thể cài đặt WUBI và sau đó tắt các tệp hệ thống với Gentoo sau khi bạn làm việc không?
Zach

Câu trả lời:


1

Không phải là một chuyên gia ở đây, nhưng sau khi đọc umounttrang này, tôi thấy một cờ cụ thể cho các thiết bị được gắn vòng lặp:

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

Cũng đọc thêm vào losetup(trong các trang man vẫn còn), tôi sẽ đề nghị bạn có thể sử dụng nó để gỡ lỗi vì nó có thể được sử dụng để xem trạng thái của các thiết bị được gắn vòng lặp.

Liên kết đến trang web tôi đang đề cập ở đây . Tùy chọn này:

-a     Show status of all loop devices.

có thể cung cấp cho bạn manh mối và một số cờ khác có thể giúp ngắt kết nối các thiết bị bị lặp.

Vì tôi không thể sao chép tình huống của bạn, tôi chỉ có thể gợi ý cho bạn cách tự mình tìm câu trả lời, xin lỗi vì tôi không thể giúp đỡ thêm.


0

man 8 umount:

-l

Lười biếng vô song. Bây giờ hãy tách hệ thống tệp khỏi hệ thống phân cấp hệ thống tệp và dọn sạch tất cả các tham chiếu đến hệ thống tệp ngay khi nó không còn bận nữa. (Yêu cầu kernel 2.4.11 trở lên.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.