Đượ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:
- Thiết lập busybox và nhận thiết bị với mdev
- 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
- Nếu root thực sự, gắn kết nó
/root
và chuyển đổi root, thực hiện/sbin/init
. - Nếu vòng lặp gốc, gắn kết phân vùng máy chủ trên
/host
. - Mount loopback (
/host/${LOOP}
) trên/root
- Di chuyển điểm gắn kết của máy chủ (
mount -o move /host /root/host
đối với busybox) - Chuyển đổi root
/root
và thực thi/sbin/init
Tôi đã có init
kị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 mount
và các công cụ của busybox (Nó thêm tham số -i vì một số lý do và ntfs-3g
bỏ qua), vì vậy tôi đang xem xét chỉ sao chép việc coreutils
triể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_root
hoà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:
- Gắn kết
tmpfs
tại/tmp/shutdown/
hoặc một cái gì đó. - Sao chép các tập tin tắt máy (có lẽ
/usr/share/shutdown/
hoặc một cái gì đó) pivot_root
để di chuyển root đến/loop
và chroot vào tmpfs.mount --move
các/loop/host
để/host
- Vô song
/loop
- Vô song
/host
- 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 coreutils
phiê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
/host
vàoRC_NO_UMOUNTS
biế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 chokillall5
(để đả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.