“Um dos meus projetos na faculdade é simplesmente fazer um computador público, onde as pessoas podem mexer a vontade no Linux, instalar, modificar o sistema, e, a cada reinicialização tudo voltasse à estaca zero. Isso facilitaria a vida de quem quer possuir um telecentro, ou até mesmo facilitaria para o governo, que poderia implantar maior número de computadores pois a manutenção deles seria quase que nula.
Focando a parte técnica, minha idéia era de uma distribuição Linux que possuísse dois modos: um administrador, em que as alterações do sistema eram salvas, e o modo usuário, onde o mesmo poderia mexer no que quisesse, e após a reinicialização, as alterações seriam perdidas e o sistema voltaria ao seu original. Tive a idéia de fazer isso usando o UnionFS, como se o usuário entrasse num live-cd instalado no HD, sem a mão de obra de ter que refazer a imagem ISO a cada alteração no sistema. Como poderia fazer isso?”
Uma solução para ter um sistema “somente leitura” seria configurar o grub para inicializar uma imagem de um live-CD salva no HD ao invés de dar boot no sistema principal. Com isso, o sistema sempre rodaria em modo live-cd, sem salvar as alterações feitas, mas sem a perda de desempenho causada pelo boot através do CD.
Você pode ver dicas de como fazer isso neste dica:
Instalar o Kurumin, ou atualizar para uma nova versão é simples: é só baixar o ISO, queimar o CD e dar boot. Dá também para rodar o sistema a partir do ISO baixado, se você der boot com o CD de uma versão anterior (que use o mesmo Kernel) e usar a opção “kurumin bootfrom=” na tela de boot. Mas, o que fazer se você tem em mãos uma máquina sem drive de CD, ou se por um motivo ou outro não tiver como gravar o CD? Nesta dica você aprende como instalar ou reinstalar o Kurumin em máquinas sem drive de CD.
https://www.hardware.com.br/dicas/instalando-ou-reinstalando-kurumin-sem-drive-cd.html
Embora fale sobre o Kurumin, esta dica pode ser adaptada para uso em conjunto com outras distribuições live-CD, incluindo o live-cd do Ubuntu.
O problema desta abordagem é que, como você colocou, ela não permite fazer alterações e personalizações permanentes no sistema. Para isso, você teria que abrir a imagem do sistema, fazer as alterações e gerar um novo ISO.
Uma solução mais fácil seria utilizar o UnionFS para “congelar” um sistema já instalado e personalizado, fazendo com que as alterações feitas pelos usuários sejam descartadas a cada boot.
Atualmente, a maioria das distribuições live-CD utiliza o UnionFS para permitir a instalação de programas e outras alterações mesmo enquanto o sistema está rodado a partir do CD.
Todas as alterações são feitas em uma ramdisk, criado utilizando parte da memória RAM, de forma que as alterações são perdidas a cada reboot.
Tocando em miúdos, o UnionFS permite montar duas pastas, onde uma pode ser montada em modo somente-leitura e outra montada em modo leitura e escrita. Podemos então usar uma partição separada para armazenar as alterações, fazendo com que as pastas “reais” do sistema permaneçam inalteradas.
Para isso, você vai precisar de duas partições, uma com a instalação do sistema e outra vazia, que utilizaremos para armazenar os diretórios que serão utilizados pelo UnionFS. No meu caso, o sistema está instalado na partição /dev/sda2 e vou utilizar a partição /dev/sda3 para guardar os arquivos.
O UnionFS já vem instalado por padrão nas versões atuais Kurumin, Knoppix, Kanotix, Sidux e outros live-CDs derivados do Knoppix. Neles, basta instalar o sistema no HD e passar direto para a fase das modificações.
Ao utilizar uma instalação padrão do Debian, ou de outra distribuição que não inclua o UnionFS por padrão, você vai precisar primeiro instalá-lo, o que pode ser feito através dos comandos:
# m-a a-i unionfs
Certifique-se também de que o módulo “unionfs” está carregado e configurado para ser carregado na hora do boot:
# echo ‘unionfs’ >> /etc/modules
Com tudo isso checado, podemos passar para a configuração propriamente dita.
O primeiro passo é montar a partição que será usada para armazenar as pastas com as versões modificadas dos arquivos, como em:
Acesse o diretório raiz e crie uma cópia de cada um dos diretórios principais, utilizando o comando “cp -a”, criando também uma pasta vazia com o mesmo nome dentro da pasta /mnt/sda3. Vamos começar com o diretório /var:
# mkdir /mnt/sda3/var
Usamos então o UnionFS para montar a pasta renomeada e a pasta vazia dentro do /mnt/sda3, substituindo a pasta original, como em:
Ao rodar o comando “mount” você verá algo como:
/dev/pts on /dev/pts type devpts (rw,mode=0622)
usbfs on /proc/bus/usb type usbfs (rw)
tmpfs on /dev type tmpfs (rw,size=10M,mode=0755)
/dev/sda3 on /mnt/sda3 type ext3 (rw)
unionfs on /var type unionfs (rw,dirs=/mnt/sda3/var=rw:/var-orig=ro)
Veja que além dos pontos de montagem normais do sistema, foi criada uma nova entrada para a pasta /var montada através do UnionFS.
A partir daí, a pasta “/var” real fica oculta (e deixa de ser usada) e é criada uma pasta “/var” virtual, que combina o conteúdo da pasta “/var-orig” (montada como somente leitura), e o da pasta “/mnt/sda3/var”, que é usada para armazenar as alterações. Isso faz com que o conteúdo da pasta “/var-orig” nunca seja alterado.
Veja um exemplo:
Por este exemplo, você pode ver que a pasta “/var/teste” foi criada dentro da pasta “/mnt/sda3/var”, mas não foi replicada para a pasta “/var-orig”. O mesmo vai acontecer com todos os arquivos criados ou modificados daqui pra frente
Vamos repetir o mesmo processo para as outras pastas do sistema (boot, bin, sbin, lib e opt), deixando de lado a pasta /tmp (já que seu conteúdo é apagado a cada boot de qualquer forma), as pastas /mnt/ e /media (que contém pontos de montagem), das pastas /dev, /sys e /proc (que armazenam os devices e dispositivos virtuais do sistema, e não arquivos).
Este mini-script automatiza esta parte:
for i in usr home boot bin sbin lib opt; do
cp -a $i $i-orig
mkdir /mnt/sda3/$i
mount -t unionfs -o dirs=/mnt/sda3/$i=rw:/$i-orig=ro unionfs /$i
done
Neste ponto, o comando “mount” vai mostrar uma longa lista de pastas montadas:
/dev/sda3 on /mnt/sda3 type ext3 (rw)
/dev/pts on /dev/pts type devpts (rw,mode=0622)
usbfs on /proc/bus/usb type usbfs (rw)
tmpfs on /dev type tmpfs (rw,size=10M,mode=0755)
unionfs on /var type unionfs (rw,dirs=/mnt/sda3/var=rw:/var-orig=ro)
unionfs on /usr type unionfs (rw,dirs=/mnt/sda3/usr=rw:/usr-orig=ro)
unionfs on /home type unionfs (rw,dirs=/mnt/sda3/home=rw:/home-orig=ro)
unionfs on /boot type unionfs (rw,dirs=/mnt/sda3/boot=rw:/boot-orig=ro)
unionfs on /bin type unionfs (rw,dirs=/mnt/sda3/bin=rw:/bin-orig=ro)
Continuando, crie também a pasta “/mnt/sda3/etc”:
Edite agora o arquivo “/etc/rc.local“, deixando-o com o seguinte conteúdo:
mount -t ext3 /dev/sda3 /mnt/sda3
modprobe unionfs
rm -rf /mnt/sda3/var/*
rm -rf /mnt/sda3/usr/*
rm -rf /mnt/sda3/home/*
rm -rf /mnt/sda3/boot/*
rm -rf /mnt/sda3/bin/*
rm -rf /mnt/sda3/sbin/*
rm -rf /mnt/sda3/lib/*
rm -rf /mnt/sda3/opt/*
rm -rf /mnt/sda3/etc/*
mount -t unionfs -o dirs=/mnt/sda3/var=rw:/var-orig=ro unionfs /var
mount -t unionfs -o dirs=/mnt/sda3/usr=rw:/usr-orig=ro unionfs /usr
mount -t unionfs -o dirs=/mnt/sda3/home=rw:/home-orig=ro unionfs /home
mount -t unionfs -o dirs=/mnt/sda3/boot=rw:/boot-orig=ro unionfs /boot
mount -t unionfs -o dirs=/mnt/sda3/bin=rw:/bin-orig=ro unionfs /bin
mount -t unionfs -o dirs=/mnt/sda3/sbin=rw:/sbin-orig=ro unionfs /sbin
mount -t unionfs -o dirs=/mnt/sda3/lib=rw:/lib-orig=ro unionfs /lib
mount -t unionfs -o dirs=/mnt/sda3/opt=rw:/opt-orig=ro unionfs /opt
mount -t unionfs -o dirs=/mnt/sda3/etc=rw:/etc-orig=ro unionfs /etc
Isso faz com que a montagem seja refeita a cada boot. Por desencargo, incluí também o comando para montar a partição /dev/sda3 e carregar o módulo “unionfs”, apenas para o caso de ter se esquecido de fazer as alterações nos arquivos “/etc/fstab” e “/etc/modules” para que as duas coisas sejam feitas durante o boot.
Deixe para fazer a cópia da pasta /etc no final do processo, para que ela já armazene as alterações feitas no arquivo /etc/rc.local:
Aproveite para montar usando o comando do UnionFS:
Com isso a configuração está completa. Todas as alterações feitas no sistema serão armazenadas dentro das pastas no diretório “/mnt/sda3” e serão apagadas durante o boot, fazendo com que o sistema sempre retorne ao seu estágio original depois de reiniciado.
Você pode fazer o teste, instalando alguns programas, bagunçando o desktop, instalando alguns servidores e assim por diante. Você perceberá que depois de reiniciar o micro, todas as alterações serão desfeitas.
Para reverter o processo, basta apagar as linhas incluídas no arquivo “/etc/rc.local” e reiniciar o micro, aproveitando para apagar também as cópias de backup (após reiniciar).
A idéia aqui é que você instalasse os programas desejados, personalizasse o desktop, criasse os logins de usuário e assim por diante e depois fizesse o processo que descrevi, congelando o sistema no estado em que deixou.
Você pode transformar estes passos em dois scripts (ativar.sh e desativar.sh, por exemplo), que permitissem “congelar” e “descongelar” o sistema de forma prática quando desejado e a partir daí ir adicionando funções e aperfeiçoando a idéia.
Só recomendo que você repense a idéia de “criar uma nova distribuição” apenas para distribuir estas alterações simples. Ao invés disso, seria mais interessante que você investisse na criação de um conjunto de scripts, que pudessem ser aplicados a diversas distribuições. Assim, você precisará se preocupar apenas em manter e distribuir seus scripts, sem todo o ônus de manter e distribuir toda a imagem do sistema. De quebra, a base de usuários do seu projeto seria maior, já que ele poderia ser adaptado para funcionar em qualquer distribuição.