Como o WUBI lida com partições após o desligamento?

10

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:

  1. Configure o busybox e obtenha dispositivos com o mdev
  2. Analise as opções da linha de comando, determine se está solicitando raiz real ou raiz de loop
  3. Se for raiz real, monte-a /roote alterne-a, execute /sbin/init.
  4. Se o loop for raiz, monte a partição host /host.
  5. Monte o loopback ( /host/${LOOP}) em/root
  6. Mova o ponto de montagem do host ( mount -o move /host /root/hostpara busybox)
  7. Alterne raiz para /roote execute/sbin/init

Eu tenho o initscript 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 mounte outras coisas (ele adiciona o parâmetro -i por algum motivo e ntfs-3gexcrementa), então estou pensando em copiar a coreutilsimplementaçã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_rootconcluí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:

  1. Montar um tmpfsno /tmp/shutdown/ou algo assim.
  2. Copie os arquivos de desligamento (talvez /usr/share/shutdown/ou algo assim)
  3. pivot_rootpara mover a raiz para /loope chroot nos tmpfs.
  4. mount --moveo /loop/hostpara/host
  5. Desmontar /loop
  6. Desmontar /host
  7. 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 coreutilsversã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_UMOUNTSvariável, que impede o módulo EXT4 de bloquear um erro de registro no diário
  • Adicionado -o `pidof ntfs-3g`aos opts de killall5(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.

Animus
fonte
Você poderia simplesmente instalar o WUBI e depois trocar os arquivos do sistema com o Gentoo depois que ele funcionasse?
Zach

Respostas:

1

Não sou especialista aqui, mas depois de ler a página de umountmanual, vejo um sinalizador específico para dispositivos montados em loop:

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

Também lendo mais adiante losetup(nas páginas de manual ainda), sugiro que você talvez o use para depurar, pois pode ser usado para ver o status dos dispositivos montados em loop.

O link para a página de manual a que me refiro está aqui . Esta opção:

-a     Show status of all loop devices.

pode lhe dar uma pista, e alguns outros sinalizadores podem ajudar a desmontar os dispositivos em loop.

Como não consigo replicar sua situação, só posso sugerir maneiras de encontrar sua resposta por conta própria, desculpe-me por não poder ajudar mais.

marc-andre benoit
fonte
0

man 8 umount:

-eu

Desmontar preguiçoso. Desanexe o sistema de arquivos da hierarquia do sistema de arquivos agora e limpe todas as referências ao sistema de arquivos assim que ele não estiver mais ocupado. (Requer o kernel 2.4.11 ou posterior.)

Hello71
fonte