Tudo bem, então, basicamente, estou tentando inicializar o Gentoo de uma maneira semelhante ao WUBI; Tenho uma instalação em um arquivo de loopback no formato ext4, o BURG instalado no Windows Bootloader e o kernel / initramfs disponível para inicialização. A inicialização ainda tem alguns problemas (aqueles que eu acho que consigo resolver, são principalmente por causa de pequenos problemas com os próprios programas), mas eu tenho a idéia básica:
- Configure o busybox e obtenha dispositivos com o mdev
- Analise as opções da linha de comando, determine se está solicitando raiz real ou raiz de loop
- Se for raiz real, monte-a
/root
e alterne-a, execute/sbin/init
. - Se o loop for raiz, monte a partição host
/host
. - Monte o loopback (
/host/${LOOP}
) em/root
- Mova o ponto de montagem do host (
mount -o move /host /root/host
para busybox) - Alterne raiz para
/root
e execute/sbin/init
Eu tenho o init
script aqui:
#!/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
Nada complicado, realmente. Aparentemente, o NTFS-3G não concorda com a implementação do busybox mount
e outras coisas (ele adiciona o parâmetro -i por algum motivo e ntfs-3g
excrementa), então estou pensando em copiar a coreutils
implementação ou algo assim. Isso e eu preciso examinar o que é necessário para montar partições de loopback (isso gera um erro como "Arquivo não encontrado" quando tento montar o loopback manualmente). Ainda assim, acho que isso é fácil de resolver por conta própria.
No entanto, o que estou pensando é sobre o desligamento. Depois de switch_root
concluído, o sistema ficará com um /
arquivo montado em loopback e /dev/sda2
(esta é uma instalação do Windows 7) ativada /host
. Agora, não há como desmontar /host
, pois está em uso. No entanto, não é possível desmontar /
enquanto a raiz possui sistemas de arquivos montados em um subdiretório. As instalações do Ubuntu baseadas em WUBI devem enfrentar o mesmo dilema. Como alguém supera esse problema? É um problema de galinha e ovo, e está realmente me irritando.
Eu estava pensando em algo parecido com um script de inicialização que contém um cache temporário de arquivos para uma raiz básica e básica (como um initramfs, mas o contrário). Ele rodaria por último, copiando os arquivos para um tmpfs, girando a raiz, talvez voltando ao layout original do initramfs. Eu essencialmente estaria fazendo isso:
- Montar um
tmpfs
no/tmp/shutdown/
ou algo assim. - Copie os arquivos de desligamento (talvez
/usr/share/shutdown/
ou algo assim) pivot_root
para mover a raiz para/loop
e chroot nos tmpfs.mount --move
o/loop/host
para/host
- Desmontar
/loop
- Desmontar
/host
- Encerre de forma limpa, pois todas as partições foram desmontadas.
No entanto, nunca modifiquei tanto o Gentoo. Isso é possível com um initscript? Não quero que isso seja sobrescrito por nenhuma atualização do layout da base ou de qualquer ebuild, pois isso me deixaria com a funcionalidade de desligamento interrompido (e eu realmente não quero perder a partição do host). Há também o problema de descobrir se o sistema init do Gentoo suporta algo assim. Parece bastante limpo (se um pouco hackish), mas não tenho muita certeza. Quero saber se o Ubuntu faz diferente e, em caso afirmativo, como? Quaisquer sugestões seriam úteis.
EDIT :
Eu tenho a bota trabalhando. Apenas uma questão de usar a coreutils
versão do mount
, como eu pensava. Estou tendo os erros que eu esperava no desligamento; erros ao não conseguir desmontar sistemas de arquivos e erros de registro no diário com o loopback FS. Ainda não tenho ideia de como consertar isso.
EDIT 2:
Tudo bem, bem, eu tenho algo acontecendo que ... Mais ou menos funciona. Eu basicamente editei /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}
e fiz o seguinte:
- Adicionado
/host
àRC_NO_UMOUNTS
variável, que impede o módulo EXT4 de bloquear um erro de registro no diário - Adicionado
-o `pidof ntfs-3g`
aos opts dekillall5
(para garantir que não matou o ntfs-3g) - Modificou o shutdown.sh e o restart.sh para montar um tmpfs em / boot / shutdownfs e copiar alguns arquivos initramfs lá, girar a raiz e depois fazer chroot nela, chamando / down ou / restart.
- Esses dois scripts essencialmente fazem algumas configurações rápidas e sujas de / proc e / sys, movem o / root / host para / host e depois desmontam preguiçosamente. Não consegui que desmontagens regulares funcionassem (o sistema de arquivos ainda estaria ocupado), mas pelo menos isso parece impedir o sistema de arquivos de vomitar completamente.
Essa solução ainda está abaixo da média, portanto qualquer ajuda seria apreciada.