Como carrego o Ubuntu na RAM e inicializo a partir dele?

6

O problema

Eu tenho uma unidade flash USB que, entre o Windows PE e outras coisas, tem um sistema Ubuntu 11.04 em uma partição virtual (baseada em arquivo):

<drive>/ubuntu/disks/boot.disk      mount point /boot  (contains GRUB)
<drive>/ubuntu/disks/root.disk      mount point /      (contains rest of system)

Funciona bem ...

No entanto, todas as alterações persistem após o encerramento.

Eu também gostaria de uma opção adicional no menu GRUB2, que inicializará a mesma instalação, mas que redirecionará < em> todas as gravações do sistema de arquivos raiz para a RAM, consequentemente descartando todas e quaisquer alterações feitas no sistema de arquivos raiz ( root.disk ).

Para enfatizar: ainda deve ser uma opção para inicializar o sistema normalmente.

(É claro que modificações em outros sistemas de arquivos não devem ser redirecionadas - somente a raiz e os discos de inicialização devem permanecer inalterados com essa opção.)

O que eu já fiz

Meu / etc / fstab atualmente é assim:

# <file system>              <mount point> <type> <options>              <dump> <pass>
proc                         /proc         proc   nodev,noexec,nosuid    0      0
/host/ubuntu/disks/root.disk /             ext2   loop,errors=remount-ro 0      0
/host/ubuntu/disks/boot.disk /boot         ext2   loop,errors=remount-ro 0      0

E meu grub.cfg é assim:

menuentry "Ubuntu, Linux 2.6.38-13-generic" {
    insmod part_msdos
    insmod ntfs
    set root='(/dev/sdb,msdos1)'
    search --no-floppy --fs-uuid --set=root MY_DRIVE_UUID
    loopback loop0 /ubuntu/disks/root.disk
    set root=(loop0)
    linux /boot/vmlinuz-2.6.38-13-generic root=UUID=MY_DRIVE_UUID loop=/ubuntu/disks/root.disk ro   acpi_sleep=nonvs acpi_osi=Linux acpi_backlight=vendor
    initrd /boot/initrd.img-2.6.38-13-generic
}

já tentei alterar o meu fstab para, por exemplo:

# <file system>              <mount point> <type> <options>              <dump> <pass>
proc                         /proc         proc   nodev,noexec,nosuid    0      0
/host/ubuntu/disks/root.disk /rootdisk     ext2   loop,errors=remount-ro 0      0
tmpfs                        /ramdisk      tmpfs  defaults               0      0
none                         /             aufs   br:/rootdisk=ro:/ramdisk=rw 0 1
/host/ubuntu/disks/boot.disk /boot         ext2   loop,errors=remount-ro 0      0

Por algum motivo, ele não é montado em / corretamente (tentei todas as combinações de none , tmpfs , aufs , pedidos, sinalizadores etc. Em que pude pensar), e me dá um erro na inicialização.

Então ... Como eu poderia configurar isso?

    
por Mehrdad 13.02.2012 / 09:49

2 respostas

7

Exatamente o que você está pedindo provavelmente não pode ser feito sem um sistema de arquivos personalizado, mas há ramfs (não ramdisk nem tmpfs ) que chega perto. Ramfs às vezes é usado como o sistema de arquivos inicial quando o Linux (incorporado) inicializa, ou seja, o initramfs . Como esse sistema de arquivos raiz está na memória, quaisquer alterações feitas nele não são propagadas de volta à sua origem em flash e são perdidas no desligamento ou na próxima reinicialização. O conteúdo do initramfs vem do arquivo initramfs.cpio que está anexado ao binário do kernel.

Um sistema de arquivos personalizado provavelmente seria necessário para "redirecionar todas as gravações do sistema de arquivos raiz para a RAM". Esse tipo de sistema lembra um sistema de arquivos em camadas que eu ajudei a desenvolver: o sistema de arquivos da camada superior era acessível ao usuário e, na verdade, era composto por dois sistemas de arquivos individuais. O acesso do usuário a um arquivo exigiria procurar o arquivo primeiro no sistema de arquivos A; se não existisse em A, então o sistema de arquivos B deveria ter o arquivo. (O sistema de arquivos A continha arquivos atualizados para o sistema de arquivos B sem precisar atualizar / substituir o sistema de arquivos B na mídia somente leitura.) Seu sistema de arquivos dos sonhos seria semelhante: acessar (ou seja, abrir) um arquivo exigiria primeiro verificar se o arquivo já está em ramfs . Se for, use essa cópia; caso contrário, copie o arquivo do disco rootfilesystem para o ramfs e use a cópia ramfs .

Talvez você possa configurar seu sistema para inicializar, criar & monte um ramfs , copie o rootfs para o ramfs e então o chroot para o ramfs . Isso colocaria todo o sistema de arquivos raiz na memória, em vez de apenas os arquivos modificados do seu sistema de arquivos dos sonhos.

    
por 14.02.2012 / 00:56
1

O Ubuntu e a maioria das distribuições derivadas do Debian usam um "initramfs" que contém drivers e utilitários necessários no momento da inicialização antes que o volume raiz possa ser montado. Ele é carregado pelo bootloader logo após o carregamento do kernel (o que também é feito pelo bootloader).

Normalmente, o initramfs é dispensado depois que o volume real da raiz é montado sobre ele. Eu acredito que se você editar o script /etc/init.d/ apropriado, você pode impedir que isso aconteça.

Para que funcione corretamente, você precisa de seu próprio initramfs personalizado que tenha todos os arquivos necessários para executar o Linux. O efeito deve ser no final do processo de inicialização é que você está executando completamente fora do initramfs. Alguns live CDs / ISOs realmente fazem a mesma coisa.

Copiar sobre, digamos, uma linha de comando mínima que o Ubuntu instala, para um novo initramfs personalizado não deve ser muito difícil. Eu não sei de nenhuma ferramenta para "initramfs-ify" automaticamente o seu sistema atual, mas realmente parece o tipo de coisa que alguém fez antes. Eu atualizarei esta resposta se descobrir algo.

    
por 14.02.2012 / 01:06