在 Amazon EC2 上安装 Alpine
![]() 它应该重命名为 [[ Alpine 安装:从镜像到 Amazon EC2 实例 ]]。 这篇文章需要与安装步骤和命名格式一致的 wiki 格式。(讨论) |
EC2 实例有多种 不同尺寸 和不同的规格,但它们目前都运行在两种虚拟化技术之一上:半虚拟化 (PV) 或 硬件虚拟机 (HVM)。
PV 实例使用名为 PV-GRUB 的特殊引导加载程序启动,它启动引导循环,然后链式加载镜像中 menu.lst 文件中指定的内核。 半虚拟化客户机可以在没有显式虚拟化支持的主机硬件上运行,但它们无法利用特殊的硬件扩展,例如增强型网络或 GPU 处理。
HVM 实例呈现完整的虚拟化硬件集,并通过执行镜像根块设备的主引导记录来启动。 这种虚拟化类型提供了直接在虚拟机之上运行操作系统而无需任何修改的能力,就像在裸机硬件上运行一样。 Amazon EC2 主机系统模拟呈现给客户机的一些或所有底层硬件。(来自:Linux AMI 虚拟化类型)。
只有较旧的实例类型支持 PV 实例,所有新的实例类型都使用 HVM hypervisor。 对于在 EC2 上设置 Alpine Linux 的目的而言,这主要影响引导加载程序的配置方式。
EC2 实例是从称为 Amazon Machine Images (AMI) 的模板创建的。 AMI 是使用现有的运行实例构建的,然后使用快照过程将其转换为 AMI。 请注意,AMI 是区域特定的,因此您必须在计划部署 Alpine Linux 实例的每个区域中遵循本指南,或者您必须使用控制台或 AWS 命令行客户端将 AMI 复制到您计划使用的每个区域。
所有实例类型均为 64 位。 32 位镜像将无法工作。
本指南将创建最小的 (1GB) EBS 支持的镜像,该镜像充当虚拟 USB 驱动器,可以引导和运行 Alpine Linux。
初始设置
所有 AMI 创建任务都遵循相同的设置步骤,这些步骤需要运行 Linux 实例和附加的 EBS 卷。 Linux 实例仅用于为您的 Alpine Linux 系统设置根文件系统,因此任何发行版都可以,Amazon Linux 是默认发行版,因此,在相关情况下,本指南将使用该发行版。
- 创建一个 EC2 实例,运行 Amazon Linux 的 t2.micro 应该就足够了
- 创建一个 1GB EBS 卷,并将其作为 /dev/sdf 连接到实例(这将在 HVM 实例上显示为 /dev/xvdf)
- 将磁盘格式化为 ext4,无需对驱动器进行分区
mkfs.ext4 /dev/xvdf
- 将驱动器挂载到主机
mkdir /mnt/target && mount /dev/xvdf /mnt/target
- 获取最新 virt 版本的副本
curl -o /tmp/alpine-release.iso https://dl-4.alpinelinux.org/alpine/v3.7/releases/x86_64/alpine-virt-3.7.0-x86_64.iso
- 挂载 release iso
mkdir /mnt/source && mount -o loop /tmp/alpine-release.iso /mnt/source
- 将文件复制到目标
cp -av /mnt/source/boot /mnt/target
sudo 软件包未包含在 virt 镜像的磁盘仓库中,这意味着在系统启动时无法访问以进行安装; 要启用此功能,您需要来自 extended 镜像的仓库副本。 下载此镜像并复制apks文件夹到目标。
- 获取最新 extended 版本的副本
curl -o /tmp/alpine-extended-release.iso https://dl-4.alpinelinux.org/alpine/v3.7/releases/x86_64/alpine-extended-3.7.0-x86_64.iso
- 挂载 release iso
mkdir /mnt/source-extended && mount -o loop /tmp/alpine-extended-release.iso /mnt/source-extended
- 将文件复制到目标
cp -av /mnt/source-extended/apks /mnt/target
由于 Amazon Linux 上的软件包比 Alpine 附带的软件包版本较旧,并且由于您将创建一个用于初始系统配置的 apkovl 文件,因此您需要一个现有的 Alpine Linux 系统或 minirootfs 镜像的副本,您可以在其中 chroot。 要设置 chroot
- 获取最新 minirootfs 版本的副本
curl -o /tmp/alpine-minirootfs.tar.gz https://dl-4.alpinelinux.org/alpine/v3.7/releases/x86_64/alpine-minirootfs-3.7.0-x86_64.tar.gz
- 解压 root fs
mkdir /tmp/alpine-chroot && tar -C /tmp/alpine-chroot -xvf /tmp/alpine-minirootfs.tar.gz
- 将系统 resolv.conf 复制到 chroot 中,以便您可以访问互联网
cp /etc/resolv.conf /tmp/alpine-chroot/etc
创建 Apkovl 文件
EBS 卷的顶层将在启动期间扫描名为*.apkovl.tar.gz的文件,找到的第一个文件将被解压并覆盖到文件系统上。 此存档的目标是配置系统,以便您可以在系统启动后登录。 至少这意味着
- 配置网络以使用 dhcp 并在系统启动时启动
- 安装 SSH 守护程序
- 配置具有您的 SSH 密钥的用户
- 启用 sudo 以便您可以获得 root 访问权限
设置 chroot 并 chroot 进入,然后添加任何所需的软件包。busybox-initscripts软件包提供了 udhcpc 所需的文件,这将允许启用 DHCP。syslinux软件包是安装引导加载程序所必需的,但在最终系统上不是必需的。
mkdir /tmp/alpine-chroot/mnt/target mount -o bind /mnt/target /tmp/alpine-chroot/mnt/target mount -t proc none /tmp/alpine-chroot/proc mount -t devtmpfs none /tmp/alpine-chroot/dev mount -t sysfs none /tmp/alpine-chroot/sys chroot /tmp/alpine-chroot sh apk update #If using older version 3.7.x, use: apk add alpine-conf sudo openssh busybox-initscripts syslinux # If using Alpine 3.8+, the package "busybox-initscripts" is replaced by "busybox-mdev-openrc" apk add alpine-conf sudo openssh busybox-mdev-openrc syslinux
如果文件 /etc/.default_boot_services 存在,则 Alpine init 系统将启动核心所需的服务,因此创建该文件。
touch etc/.default_boot_services
设置网络
cat > /etc/network/interfaces <<EOF auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp EOF ln -s /etc/init.d/networking /etc/runlevels/default/ ln -s /etc/init.d/sshd /etc/runlevels/default/
添加用户,设置 SSH 密钥,并确保该用户可以 sudo
adduser -D -s /bin/sh alpine addgroup alpine wheel mkdir /home/alpine/.ssh chmod 700 /home/alpine/.ssh chown alpine /home/alpine/.ssh cat > /home/alpine/.ssh/authorized_keys <<EOF ... your ssh public key(s) ... EOF chmod 600 /home/alpine/.ssh/authorized_keys chown alpine:alpine /home/alpine/.ssh/authorized_keys passwd -u alpine sed -i '/%wheel/s/^# //' /etc/sudoers
排除备份文件和任何将存在于解压缩镜像中的文件。 然后创建一个 apkovl 捆绑包。
lbu exclude \ etc/group- etc/passwd- etc/shadow- \ etc/apk/keys etc/apk/arch etc/apk/repositories \ etc/os-release \ etc/issue \ etc/alpine-release lbu include /home/alpine/.ssh lbu package amazon.apkovl.tar.gz
验证您期望 apovl 文件中包含的所有内容是否都在那里,如果不是,您可以修改 apkovl。
最后,将 apkovl 复制到 /mnt/target。
cp amazon.apkovl.tar.gz /mnt/target
EBS 支持的 HVM AMI
对于 HVM 实例,您需要安装引导加载程序。 任何引导加载程序都应该可以,但本指南将使用 syslinux,因为它速度快、体积小,而且您不必支持任何奇怪的硬件或系统布局。
首先,您需要确保已加载 ext4 驱动程序,并且最好缩短超时时间以加快实例启动时间。
sed -i \ -e '/usb-storage/s//usb-storage,ext4/' \ -e '/^TIMEOUT/s/20/2/' \ /mnt/target/boot/syslinux/syslinux.cfg
最后,安装引导加载程序
extlinux -i /mnt/target/boot
EBS 支持的 PV AMI
对于 PV AMI,PV-GRUB 将尝试读取 /boot/grub/menu.lst 以加载内核。 首先创建一个 /boot/grub/grub.conf
mkdir -p /mnt/target/boot/grub cat > target/boot/grub/grub.conf <<EOF default=0 timeout=2 hiddenmenu title Alpine Linux root (hd0) kernel /boot/vmlinuz-virthardened alpine_dev=xvda1:ext4 modules=loop,squashfs,sd-mod,ext4 console=hvc0 pax_nouderef BOOT_IMAGE=/boot/vmlinuz-virthardened initrd /boot/initramfs-virthardened EOF ln -s /mnt/target/boot/grub/grub.conf /mnt/target/boot/grub/menu.lst
创建 AMI
以下操作需要在 AWS 控制台中完成。
- 分离新卷(记下卷 ID)
- 启动一个新实例,使用默认值; 您稍后要废弃它
- 实例启动后,停止但不要终止它
- 在 EBS 下,分离现有卷,并将 Alpine Linux 卷作为 /dev/xvda(对于 HVM)或 /dev/sda1(对于 PV)连接
- 重启实例
- 登录并确保它工作正常
- 进行任何必要的最终清理。 仅进行适用于 AMI 的更改,您将要为此实例创建快照并将其用作 AMI 的基础。
- 停止但不要终止实例
- 右键单击停止的实例,然后选择“创建镜像 (EBS AMI)”
- AMI 创建完成后,您可以清理使用的实例和 EBS 卷