在这篇文章中,您将了解有关我在请病假期间的奇怪研究的一些信息。 一次将涉及几件事,这不是“最佳实践”,但也是可能的! 因此,这是有关如何安装Archlinux(我最喜欢的distr)的教程,以便:
- 没有单独的/启动(仅在/根目录下)
- /在lvm上
- 在luks容器内的lvm
- 使用UEFI
- 在虚拟机中。
安全启动 (虚拟机中的“困难”不太可能成功)
值得注意的是,除了带有单个grubx64.efi文件的EFI系统分区以外,所有内容都将被加密-一个运行grub的EFI应用程序。
如果您有兴趣,欢迎来猫!
首先,我将它们全部设置在Lenovo X240笔记本电脑上,然后写这篇文章,在Proxmox中将虚拟机与OVMF一起使用。
测试平台设置:
一切都是相当标准地创建的。 该图像使用了我最喜欢的拱门,可以随时从
Yandex下载。
接下来,在Proxmox中关于UEFI的虚拟中的几点。 要使用UEFI测试支架的操作(否则就不会那么有趣),您需要在虚拟机的属性中设置OVMF而不是SeaBIOS:

接下来,相应地添加UEFI磁盘,以得到如下内容:

现在我们可以启动虚拟机并开始安装过程。 在虚拟机控制台中,立即启动sshd服务,设置root密码并找出虚拟机的dhcp地址:

接下来,我们可以继续使用ssh使其更加方便。
磁盘布局
因此,已经通过ssh连接后,我们首先设置时间,以免以后再证明将来会创建文件系统:
timedatectl set-ntp true && timedatectl set-timezone Europe/Moscow
检查一切正确:
root@archiso ~
现在我们可以开始对磁盘进行分区了。 在这个阶段,我有一个/ dev / vda驱动器, Virtio控制器,这只是一个没有分区表的空磁盘:
root@archiso ~
我们将其分为2个分区:
- UEFI应用程序的fat32磁盘(EFI_system_partition)
- LUKS容器及其他所有内容
使用gdisk创建GPT:
root@archiso ~
接下来,为EFI创建第一个分区,类型为EF00(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'
现在为LUKS创建一个分区,在这里我们甚至不用理会该类型,并保持原样:
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>
我们将写下更改并完成分区标记:
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.
创建一个LUKS容器和文件系统
在第一部分(vda1)中,一切都非常简单。 我们只需要格式化它,就这样:
root@archiso ~
第二个分区是您必须首先准备的容器。 我们通过cryptsetup格式化分区并设置密码:
root@archiso ~
***我不必担心密码的选择,而是用urandom和其他字体覆盖了随机化,只是创建了一个默认容器。
接下来,通过指定相同的密码短语来打开容器:
root@archiso ~
现在我们有了一个可以通过设备映射器访问的开放容器:
root@archiso ~
现在我们可以继续使用lvm(我将以一种快速的方式编写,因为这不是主题):
root@archiso ~
接下来,在我们的lv上创建文件系统:
root@archiso ~
现在可以安装所有这些来安装基本系统。 安装点将是/ mnt,这是我们未来系统的根目录:
[root@archiso ~]
*** / boot / efi我创建的目的是使/ boot本身保留在/ dev / mapper / rootvg-root上,并且efi文件夹已经挂载在/ dev / vda1(fat32 efi分区)上: [root@archiso ~]
检查当前安装点(总是有用):
[root@archiso ~]
如我们所见,一切都是诚实的,现在是时候摆放拱门了。
基本系统安装
使用pacstrap软件包从基础集和base-devel集安装基础包(您可以将所需的所有内容放到它们中,除此之外):
pacstrap /mnt base base-devel
一切顺利启动,基本系统已准备就绪。 自然,我删除了结论。 现在,我们可以配置该系统以启动并工作。
根据基本情况,我们立即生成fstab:
genfstab -pU /mnt >> /mnt/etc/fstab
接下来,使arch-chroot进入这个新系统:
[root@archiso ~]
*** arch-chroot是一个非常有用的实用程序,因为它可以单独执行所有操作。 尽管您始终可以使用标准chroot,但在执行此操作之前,请遵循gentoo-handbook wiki.gentoo.org/wiki/Handbook中的说明 :AMD64 /安装/基础部分“安装必要的文件系统”立即配置系统时间和主机名:
ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime && \ hwclock --systohc && \ echo luks-test > /etc/hostname
设置root密码:
[root@archiso /]
在/etc/locale.gen中取消注释所需的语言环境:
[root@archiso /]
我们将生成它们:
[root@archiso /]
立即为系统和控制台配置它们:
[root@archiso /]
现在配置/etc/mkinitcpio.conf文件,该文件在生成initramfs时负责选项,钩子等:
vi /etc/mkinitcpio.conf
最重要的是钩子及其顺序:
HOOKS=(base udev autodetect modconf block keymap encrypt lvm2 resume filesystems keyboard fsck)
***从交换休眠状态后,恢复挂接以启动系统。 在虚拟机上不需要它。 我从山毛榉那里复制了它。现在我们可以生成initramfs:
[root@archiso /]
现在我们有了系统,我们需要安装引导加载程序本身。 我的选择落在了grub(2)上,因为它在某种程度上更加熟悉并且可以很容易地从加密分区中加载内核(嗯,否则我并没有真正寻找其他人)。
安装grub包:
[root@archiso /]
在生成配置之前,请编辑默认的grub选项:
vim /etc/default/grub
在这里,您需要取消注释一条重要的行(当然,没有评论):
并将(默认情况下为空)添加到GRUB_CMDLINE_LINUX:
GRUB_CMDLINE_LINUX="cryptdevice=UUID=5ad7c9ad-fb17-4839-925e-479432516c07:container"
我从blkid获取的UUID:
[root@archiso /]
我们为grub生成一个配置:
[root@archiso /]
接下来,将grub本身安装在磁盘上:
[root@archiso /]
***您可以添加--recheck --debug,指定体系结构...但是...它确实可以单独工作)现在,我们将编辑/ etc / crypttab,以便系统本身知道在加载时必须解密LUKS部分。 添加行:
echo "container /dev/vda2 none" >> /etc/crypttab
这意味着您需要为/ dev / vda2分区请求密码(无密码),并已通过设备映射器将该密码作为容器显示。
现在我们准备退出chroot并重新启动系统:
[root@archiso /]
现在,让我们转到虚拟机控制台以查看结果:

在此阶段,我们使用/ dev / vda1启动了EFI应用程序/boot/efi/EFI/arch/grubx64.efi,该应用程序要求我们提供密码以解密容器。
接下来,输入密码后:

这是熟悉的grub窗口,其中包含/boot/grub/grub.cfg中的启动选项。
此时,grub解密了我们的容器,并获得了对该文件本身(/boot/grub/grub.cfg),内核和initramfs的访问权限。 选择该选项后,内核将默认启动initramfs:

积极地,内核提出了加密钩子,该钩子再次要求我们提供解密容器的密码(通常,您需要输入两次密码,但可能是您为两个容器创建了两个容器,以防止多余的妄想引起的启动和root :)
然后在系统完全加载后:
PS:为了增加精神分裂症的水平,仅安全启动不足以对我们的grubx64.efi引导加载程序进行签名。
我发现只将内核和initramfs放在/ dev / vda1上是没有意思的,因为我已经做过100次了。 其他引导加载程序(例如SHIM,bootctl等)不知道如何执行此操作(嗯,如果我不知道,请在评论中告诉我们)