Neste post, você lerá um pouco sobre minha estranha pesquisa durante a licença médica forçada. Serão várias coisas ao mesmo tempo, que não são “melhores práticas”, mas também são possíveis! Então, aqui está um tutorial sobre como instalar o Archlinux (minha distr favorita) para que:
- sem um / boot separado (apenas em / root)
- / no lvm
- lvm dentro do contêiner luks
- com UEFI
- em uma máquina virtual.
com inicialização segura (é improvável que "difícil" na máquina virtual seja bem-sucedido)
Vale ressaltar que tudo será criptografado, exceto a partição do sistema EFI com um único arquivo grubx64.efi - um aplicativo EFI para executar o grub.
Se você estiver interessado, bem-vindo ao gato!
Primeiro, configurei tudo no meu laptop Lenovo X240 e, para escrever um artigo, usei uma máquina virtual com OVMF no Proxmox.
Configuração do Testbed:
Tudo é criado de maneira bastante padronizada. A imagem usa meu arco favorito, que sempre pode ser baixado do
Yandex .
Em seguida, alguns pontos no virtual no Proxmox em relação à UEFI. Para testar a operação do suporte com UEFI (caso contrário, não será tão interessante), é necessário configurar o OVMF em vez do SeaBIOS nas propriedades da máquina virtual:

Em seguida, adicione o disco UEFI de acordo, para obter algo parecido com isto:

Agora podemos iniciar a máquina virtual e iniciar o processo de instalação. No console da máquina virtual, inicie imediatamente o serviço sshd, defina a senha raiz e descubra o endereço dhcp da máquina virtual:

Em seguida, podemos continuar trabalhando no ssh para torná-lo mais conveniente.
Layout do disco
Portanto, já tendo se conectado via ssh, primeiro definimos o horário para que mais tarde não aconteça que os sistemas de arquivos sejam criados no futuro:
timedatectl set-ntp true && timedatectl set-timezone Europe/Moscow
Verifique se tudo está correto:
root@archiso ~
Agora podemos começar a particionar o disco. Nesta fase, tenho uma unidade / dev / vda, como Controlador Virtio e este é apenas um disco vazio sem uma tabela de partição:
root@archiso ~
Vamos dividi-lo em 2 partições:
- disco fat32 para aplicativos UEFI (EFI_system_partition)
- Contêiner LUKS com todo o resto
Use o gdisk para criar a GPT:
root@archiso ~
Em seguida, crie a primeira partição para EFI com o tipo EF00 (Partição de sistema EFI):
Command (? for help): n Partition number (1-128, default 1): First sector (34-31457246, default = 2048) or {+-}size{KMGTP}: Last sector (2048-31457246, default = 31457246) or {+-}size{KMGTP}: +512M Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): <b>EF00</b> Changed type of partition to 'EFI System'
Agora, crie uma partição para o LUKS, na qual nem vamos nos preocupar com o tipo e deixe como está:
Command (? for help): n Partition number (2-128, default 2): First sector (34-31457246, default = 1050624) or {+-}size{KMGTP}: Last sector (1050624-31457246, default = 31457246) or {+-}size{KMGTP}: <b>Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): Changed type of partition to 'Linux filesystem'</b>
Vamos anotar as alterações e terminar com a marcação da partição:
Command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/vda. The operation has completed successfully.
Criando um Contêiner LUKS e Sistemas de Arquivos
Com a primeira seção (vda1), tudo é bem simples. Só precisamos formatá-lo e, por enquanto, é isso:
root@archiso ~
A segunda partição é o contêiner que você deve preparar primeiro. Formaizamos a partição através do cryptsetup e definimos a senha:
root@archiso ~
*** Eu não me incomodei com a escolha de cifras, com a randomização substituída por urandom e outras, mas apenas criei um contêiner padrão.
Em seguida, abra o contêiner especificando a mesma senha:
root@archiso ~
Agora temos um contêiner aberto acessível através do mapeador de dispositivos:
root@archiso ~
Agora podemos continuar com o lvm (vou escrever rapidamente, pois esse não é um assunto):
root@archiso ~
Em seguida, crie os sistemas de arquivos em nosso lv:
root@archiso ~
Agora tudo isso pode ser montado para instalar o sistema básico. O ponto de instalação será / mnt, onde a raiz do nosso sistema futuro começará:
[root@archiso ~]
*** / boot / efi que crio para que o / boot em si permaneça em / dev / mapper / rootvg-root e a pasta efi já esteja montada em / dev / vda1 (partição fat32 efi): [root@archiso ~]
Verifique os pontos de montagem atuais (sempre úteis):
[root@archiso ~]
Como vemos, tudo é honesto e agora é hora de colocar o arco em si.
Instalação do sistema base
Instale os pacotes base a partir dos conjuntos base e base-devel usando o pacote pacstrap (você pode colocar tudo o que quiser e além disso):
pacstrap /mnt base base-devel
Tudo inicializado perfeitamente, o sistema básico está pronto. Naturalmente, retirei a conclusão. Agora podemos configurar esse sistema para inicializar e funcionar.
Das coisas básicas, geramos imediatamente o fstab:
genfstab -pU /mnt >> /mnt/etc/fstab
Em seguida, faça o arch-chroot nesse novo sistema:
[root@archiso ~]
O arch-chroot é um utilitário muito útil, porque faz tudo sozinho. Embora você sempre possa usar o chroot padrão, antes de fazer isso, siga as instruções no manual do gentoo wiki.gentoo.org/wiki/Handbook : Seção AMD64 / Installation / Base “Montando os sistemas de arquivos necessários”Configure imediatamente a hora e o nome do host do sistema:
ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime && \ hwclock --systohc && \ echo luks-test > /etc/hostname
Defina a senha root:
[root@archiso /]
Remova o comentário dos locais necessários em /etc/locale.gen:
[root@archiso /]
Vamos gerá-los:
[root@archiso /]
Configure-os imediatamente para o sistema e o console:
[root@archiso /]
Agora configure o arquivo /etc/mkinitcpio.conf, responsável por opções, ganchos etc. ao gerar o initramfs:
vi /etc/mkinitcpio.conf
O mais importante são os ganchos e sua ordem:
HOOKS=(base udev autodetect modconf block keymap encrypt lvm2 resume filesystems keyboard fsck)
*** retome o gancho para inicializar o sistema após a hibernação da troca. Em uma máquina virtual, isso não é necessário. Eu copiei da faia.Agora podemos gerar initramfs:
[root@archiso /]
Agora que temos o sistema, precisamos instalar o próprio carregador de inicialização. Minha escolha foi no grub (2), porque é de alguma forma mais familiar e facilmente capaz de carregar o kernel de uma partição criptografada (bem, ou eu realmente não procurei por outras pessoas).
Instale o pacote grub:
[root@archiso /]
Antes de gerar a configuração, edite as opções padrão do grub:
vim /etc/default/grub
aqui você precisa descomentar uma linha importante (sem comentários, é claro):
e adicione (vazio por padrão) ao GRUB_CMDLINE_LINUX:
GRUB_CMDLINE_LINUX="cryptdevice=UUID=5ad7c9ad-fb17-4839-925e-479432516c07:container"
UUID que tirei do blkid:
[root@archiso /]
Geramos uma configuração para o grub:
[root@archiso /]
Em seguida, instale o próprio grub no disco:
[root@archiso /]
*** você pode adicionar --recheck --debug, especificar a arquitetura ... mas ... realmente funciona por si só)Agora vamos editar o arquivo / etc / crypttab para que o próprio sistema saiba que, ao carregar, é necessário descriptografar a seção LUKS. Adicione a linha:
echo "container /dev/vda2 none" >> /etc/crypttab
O que significa que você precisa solicitar uma senha (nenhuma) para a partição / dev / vda2 e apresentá-la já como contêiner via mapeador de dispositivo.
Agora estamos prontos para sair do chroot e reiniciar o sistema:
[root@archiso /]
Agora vamos ao console da máquina virtual para ver o resultado:

Nesse estágio, iniciamos o aplicativo EFI /boot/efi/EFI/arch/grubx64.efi com / dev / vda1, que solicita uma senha para descriptografar nosso contêiner.
Em seguida, após digitar a senha:

Aqui está a familiar janela do grub com nossas opções de inicialização em /boot/grub/grub.cfg.
Nesse ponto, o grub descriptografou nosso contêiner e obteve acesso ao próprio arquivo (/boot/grub/grub.cfg), ao kernel e ao initramfs. Após selecionar a opção, o kernel será inicializado por padrão, initramfs:

Ativamente, o kernel veio com o gancho de criptografia, que novamente solicita a senha para descriptografar o contêiner (em geral, você precisa digitar a senha duas vezes, mas pode ser que você crie 2 contêineres para inicializar e root com excesso de paranóia :)
E depois que o sistema estiver totalmente carregado:
PS: para aumentar o nível de esquizofrenia, apenas a inicialização segura não é suficiente para assinar nosso carregador de inicialização grubx64.efi.
Achei desinteressante colocar o kernel e o initramfs em / dev / vda1, como já fiz isso 100 vezes. Outros carregadores de inicialização, como SHIM, bootctl, etc. não sabem como fazer isso (bem, se eu não souber, conte-nos nos comentários)
Materiais úteis sobre o tema e materiais utilizados