A ideia é ter uma imagem do docker, ou algo semelhante, onde eu configuro um monte de coisas não relacionadas ao hardware e, em seguida, implante isso em um dispositivo real, como um raspberry pi ou um servidor x64 simples.
Estou assumindo que isso não é possível fazer isso tão direto, já que o docker tem algum hardware virtualizado que não corresponderá ao destino? E não quero executar uma imagem docker em um contêiner em uma nova instalação do linux, preciso que tudo seja executado nativo.
Alguém pode me apontar na direção certa como conseguir isso, que tipo de software dev-ops eu deveria pensar ao iniciar isso. Além de fazer alguns install-scripts
e copiar sobre o configs
(que é basicamente o que é realmente).
Onde eu quero chegar é ter um restore-image
, que de preferência estou configurando em uma máquina virtual, então ter um ponto de partida onde eu instalo isso image
em (praticamente) qualquer hardware e ele inicializará ...
Ou eu tenho equívocos sobre como o Linux lida com a mudança de hardware? (Eu tenho uma experiência ruim com GPUs mudando)
(Olhando em volta, parece que o docker é a melhor e mais sensata solução para isso, usando docker export
, mas estou curioso para saber se existem soluções ainda mais simples, talvez um programa que possa exportar os aplicativos/configurações específicas que eu especifico, em vez de escrever manualmente um script, não porque preguiçoso, mas por causa de erro humano)
Suponho que o que você está procurando é uma maneira de "clonar" uma imagem do sistema instalado com aplicativos, configuração etc.)
Portanto, você deve começar também com hardware real como fonte, não uma máquina virtual ou contêiner do Docker. Instale tudo o que você precisa nessa máquina, mas tente evitar a instalação de drivers de terceiros específicos do dispositivo. Se você puder manter os drivers que são fornecidos automaticamente pelo kernel, há grandes chances de sua imagem ser executada em outra máquina. Claro que precisa ser a mesma arquitetura, então se você quer construir uma imagem para x86, você precisa de uma máquina x86, e se você quer construir uma imagem para Pi, você precisa de um Pi.
Em seguida, você pode usar o Clonezilla para criar uma imagem de disco e restaurar essa imagem em outra máquina. No entanto, o Clonezilla está disponível apenas para máquinas x86, não para Pi.
Outro método é colocar
dd
todo o disco (como um dispositivo bruto) em um arquivo na unidade externa/pendrive USB e restaurar esse arquivo de imagem em outra máquina (gravando novamente no dispositivo de disco bruto), mas há uma limitação de que você precisa ter idêntico discos de tamanho em ambas as máquinas - caso contrário, não espero que o sistema clonado seja inicializado. Claro que você precisa fazer isso depois que a máquina (seja de origem ou destino) for inicializada a partir de uma mídia ativa, para que o sistema operacional no disco não esteja ativo (no caso da máquina de destino, ela não está presente, portanto, a única maneira de inicializar é de um meio ao vivo).A maioria dos métodos "hardcore", exigindo muito trabalho (mas você pode usar esse método para clonar seu sistema em uma máquina com um disco muito maior) é para
tar
todo o sistema de arquivos no disco (também após a inicialização do meio ao vivo) e descompacte-os para a(s) partição(ões) apropriada(s) na máquina de destino (depois de criar manualmente a(s) partição(ões), é claro). Depois disso, você precisa ajustar o/etc/fstab
arquivo (já que os UUIDs da partição geralmente serão diferentes) e instalar o carregador de inicialização na máquina de destino. Eu "clonei" sistemas de trabalho várias vezes usando esse método, quando substituímos servidores por hardware mais poderoso.Aviso: Se a máquina tiver um endereço IP configurado estaticamente, a máquina de destino "clonada" terá o mesmo endereço (s) - você deve alterá-los manualmente. No caso de alguns sistemas, você também precisa deletar alguns arquivos
/etc/udev/rules.d
(aqueles que têm "persistente" em seu nome) para fazer o udev "esquecer" os dispositivos da máquina antiga e detectá-los novamente na próxima inicialização - caso contrário, você pode tem problemas, por exemplo, com interfaces de rede não presentes (como neste exemplo)