Aviso: Implementei essa solução e ela funciona, mas os tempos de mesclagem para voltar ao instantâneo podem fazer com que o processo de inicialização demore muito Grandes mudanças foram feitas no sistema durante a última inicialização. Durante este período de espera, pode parecer aos usuários que o sistema está suspenso!
Tenha também em atenção que qualquer pessoa que tenha conhecimento suficiente para montar o instantâneo, poderá fazer alterações no estado "congelado". Eu aproveitei essa possibilidade para atualizar sistemas "congelados", mas novamente, isso também pode aumentar o tempo que leva para mesclar (reverter) para o instantâneo!
Instantâneos do LVM + cron + script = estado "congelado"
Recentemente comecei a investigar o LVM e ocorreu-me que era possível criar um estado "congelado" em uma máquina usando o LVM e seus recursos de captura instantânea. Obviamente, este método requer um sistema configurado usando o LVM (ou pelo menos o LVM nas partições a serem congeladas).
Resumo:
- Instale o sistema em partições LVM reservando espaço suficiente em um PV para um instantâneo
- Configure o sistema da maneira que você quiser.
- Crie um cron job que seja executado como root na inicialização para mesclar o instantâneo e criar um novo instantâneo para substituir o instantâneo
- Todas as reinicializações sucessivas são revertidas para o instantâneo. Todos os instantâneos criados são tirados do sistema no estado em que você o criou.
- Como um bônus adicional, o instantâneo pode ser montado e modificado (desde que você tenha privilégios de root) e o estado "congelado" pode ser atualizado, se necessário.
Prova de conceito: Congele tudo, exceto uma partição de uma instalação limpa
A instalação:
- Inicialize a partir de um disco / USB ao vivo do Ubuntu e escolha a opção "Experimentar o Ubuntu sem instalar." Isso é importante para configurar manualmente as partições com o LVM
- Quando o Ubuntu carrega a partição de seu disco usando a ferramenta de sua escolha para que ela tenha uma partição que ocupe todo o espaço da unidade. Aqui está o que estou trabalhando:
- Próximo em um terminal configure o LVM em
/dev/sda1
. Vou colocar a maior parte do sistema em uma única partição, mas você não precisa fazer isso.
-
sudo pvcreate /dev/sda1
-
sudo vgcreate ubuntu-vg /dev/sda1
-
sudo lvcreate -n swap -L 1G ubuntu-vg
-
sudo lvcreate -n unfrozen -L 10G ubuntu-vg
-
sudo lvcreate -n root -l +50%free ubuntu-vg
- Agora, se você executasse
sudo vgs
seguido por sudo lvs
, deveria ser capaz de ver que a quantidade de espaço livre restante no grupo de volume "ubuntu-vg" (VFree sob vgs output) é igual à quantidade de espaço tomado pelo volume lógico "root" (LSize sob saída lvs). No meu caso, eu tenho 506.44g livre no Ubuntu-vg e minha partição raiz é 506.44g grande. Se o espaço livre restante no grupo de volumes for igual ao tamanho da partição que quero congelar, poderei eliminar toda a partição e ainda recuperar com uma reinicialização. Deixe o resto do espaço livre no ubuntu-vg sem uso por enquanto. Nós vamos usá-lo mais tarde.
- Agora instale o Ubuntu usando o particionamento manual
- Quando a instalação for concluída, vá em frente e reinicialize no sistema recém-instalado.
- Uma vez inicializado em seu novo sistema, configure-o para que seja exatamente da maneira que você deseja que seja quando o computador for inicializado a cada vez.
- Se você não fizer alterações acidentais no instantâneo e não quiser que a partição de instantâneo apareça na barra de menus ...
-
mkdir /steady
- Edite
/etc/fstab
adicionando (isso é tudo uma linha) /dev/ubuntu-vg/steadystate /steady ext4 defaults,ro,nofail 0 1
como a última linha do arquivo
- Uma vez que coisas como atualizações vão ser surpreendidas a cada reinicialização, você pode querer desativá-las.
- Se você tiver uma partição descongelada como a minha no / descongelada, não se esqueça de torná-la acessível aos usuários que precisam acessá-la
- Depois de configurar o sistema exatamente da maneira desejada, crie o seguinte script (você precisará de privilégios de root) e salve como
/root/steadystate.sh
em seu editor favorito. Note que se você alterou o nome do grupo de volume ao configurar o LVM, você precisará atualizar isso no script abaixo também.
#!/bin/bash
LOG=/dev/kmsg
# wait for merge in progress
echo -n "Reverting to snapshot if present... " | tee -a $LOG
merging=1
while [ "$merging" == "1" ];
do
/usr/sbin/service lightdm stop #prevent the auto-login/login screen from loading
[ "$(sudo lvs -a | grep steadystate)" == "" ] && merging=0
sleep 1
done
# create snapshot
echo -n "Creating new snapshot... " | tee -a $LOG
/sbin/lvcreate -s -n steadystate -l +100%free /dev/ubuntu-vg/root
# make sure root comes online before trying to merge
while [ ! -e /dev/mapper/ubuntu--vg-root];
do
sleep .5;
done
echo -n "Scheduling reset to snapshot... " | tee -a $LOG
/sbin/lvconvert --merge /dev/ubuntu-vg/steadystate
echo -n "Starting lightdm... " | tee -a $LOG
/usr/sbin/service lightdm start
- Finalmente, execute
sudo crontab -e
, selecione um editor e coloque @reboot /bin/bash /root/steadystate.sh
no final do arquivo. Salve e feche ( Ctrl + X ; responda Y para salvar)
- Reinicialize e você deve ter um sistema congelado, exceto para a partição montada em / unfrozen
Isso funciona porque o instantâneo é criado no momento da inicialização e, embora passemos o comando para mesclar o instantâneo logo em seguida, o instantâneo não pode ser mesclado enquanto o volume lógico do root estiver ativo. Portanto, adia a ação de mesclagem até a próxima vez que / dev / ubuntu-vg / root é ativado, que é a próxima reinicialização. Essa ação também seria acionada se o sistema fosse inicializado a partir de um USB ativo.
Apenas por brincadeira, eu entrei após uma reinicialização e executei sudo apt remove --purge firefox* libreoffice-* unity*
, o que eu normalmente não aconselharia, pois remove alguns programas úteis e coloca o sistema no que pode ser um estado menos que desejável!
O sistema nem desligaria adequadamente da GUI. Então, como alguém conserta isso? Reinicie!
Ao reiniciar, tudo estava de volta em ordem. O Firefox, o LibreOffice e o Unity estavam todos de volta onde eles pertenciam.
Eu também tentei remover o linux *. Isso deixou a máquina incapaz de inicializar, no entanto, simplesmente inicializar a partir de um disco Ubuntu ao vivo pareceu fazer a mesclagem acontecer. Reiniciar novamente deixou o sistema em seu estado "congelado"
Se você quisesse fazer alterações, você poderia (re) montar o instantâneo com privilégios de rw e, em seguida, chroot para ele e fazer quaisquer alterações que você deseja que permaneçam permanentes. Isso não é perfeito, mas é uma prova de conceito.