背景
我的目标是使用包装机创建一个 Amazon 系统映像 (AMI),其中多个不同路径安装到不同的文件系统以提高安全性。例如,/tmp
应该使用该选项安装到文件系统noexec
。
事实上,我想要创建一个自动化流程来制作 AMI,这意味着我无法在实例本身中执行重新安装命令,因此我改为使用 Packer亚马逊 chroot 构建器。这意味着我运行一个 EC2 实例,并从该 EC2 实例运行 Packer。然后,Packer 将安装从与“源 AMI”一起使用的 EBS 快照中获取的 EBS 卷。我现在需要对已安装的 EBS 卷执行一些操作。
我的灵感来自于最近关于这个主题的演讲谁的幻灯片位于http://wernerb.github.io/hashiconf-hardening。
我的问题
当我的 EBS 卷(块设备)首次安装时,以下是我在其上看到的分区gdisk -l /dev/xvdf
:
Disk /dev/xvdf: 16777216 sectors, 8.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 726A877B-31D7-4C00-99E4-5A2CCB8E0EAD
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 16777182
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 4096 16777182 8.0 GiB 8300 Linux
128 2048 4095 1024.0 KiB EF02 BIOS Boot Partition
然后我执行以下操作:
- 删除“Linux”分区
sgdisk --delete 1 /dev/xvdf
- 创建 LVM 卷组
lvm vgcreate -y main /dev/xvdf1
- 创建一系列 LVM 逻辑卷并使用如下命令格式化它们
/sbin/mkfs.ext4 -m0 -O ^64bit "/dev/main/lvroot"
- 将它们全部挂载并复制一堆文件
- 附加的 EBS 卷更新
/etc/fstab
如下(这是/mnt/ebs-volume/etc/fstab
从我的主机系统的角度来看):
/etc/fstab 我写入/dev/xvdf1:
#
/dev/mapper/main-lvroot / ext4 defaults,noatime 1 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/mapper/main-lvvar /var ext4 defaults 0 0
/dev/mapper/main-lvvarlog /var/log ext4 defaults 0 0
/dev/mapper/main-lvvarlog/audit /var/log/audit ext4 defaults 0 0
/dev/mapper/main-lvhome /home ext4 defaults 0 0
/dev/mapper/main-lvtmp /tmp ext4 defaults 0 0
最后,Packer 卸载/dev/xvdf
并根据该 EBS 卷的内容创建 Amazon 系统映像 (AMI)。
到目前为止一切顺利,只是当我启动新的 AMI 时,它实际上并未启动。我无法通过 SSH 连接,并且通过 AWS“查看系统日志”没有显示任何内容。所以我假设我把包含“BIOS Boot Partition”的“128”分区弄乱了。我还对在新的 EC2 实例启动时如何“激活”我的 LVM 创建的逻辑卷感到困惑。
基本上,我缺少一个思维模型,无法了解启动分区中需要存在哪些内容,以及如果我使用 LVM 本身创建根卷,EC2 实例如何启动和运行 LVM?我想知道是否需要在 上创建一个特殊分区/boot
,但是我应该在其中放入什么?事实上,我是否应该在我的 上拥有三个分区/dev/xvdf
:“BIOS 引导分区”、一个“传统”(ext4 格式)分区/boot
以及一个 LVM 管理的分区(用于其他所有分区)?
答案1
结果发现该问题与 LVM 无关。正如在为什么此更改会导致我的块设备无法启动?,真正的问题是,通过将/
和/boot
分成两个单独的分区,MBR 配置不再正确。我无法更新 GRUB 配置文件来解决此问题,因此最终我必须将/
和保留/boot
在同一分区上,并单独添加其他分区。不理想但有效。
答案2
启动 LVM 逻辑卷的关键是在内核中支持 LVM(当然),并且还要使用包含 LVM 支持的 initrd 进行启动。创建 initrd 并非易事,因此我建议您检查一下您的 Linux 发行版是否设置为从 LVM 引导。还要确保 EC2 使用 initrd 引导内核。