在 Amazon 云中使用纯 CentOS 5.9 创建您自己的映像

大家知道,亚马逊云中的虚拟实例是基于镜像启动的(所谓的 急性心肌梗死)。 亚马逊提供了大量的;您也可以使用第三方准备的公共镜像,当然云提供商对此不承担任何责任。 但有时您需要一个带有必要参数的干净系统映像,而该映像不在映像列表中。 那么唯一的出路就是制作自己的 AMI。

官方文档描述了 过程 创建“实例存储支持的 AMI”。 这种方法的缺点是完成的图像还需要转换为“EBS 支持的 AMI”

本文将讨论如何在 Amazon 云中创建您自己的 EBS 支持的 AMI,无需中间步骤。

行动计划:

  • 准备环境
  • 安装干净的系统并进行必要的设置
  • 拍摄磁盘快照
  • 注册 AMI

准备环境

就我们的目的而言,任何形状的任何实例都是合适的,甚至是 t1.micro。 您可以通过 CLI 运行它:

aws ec2 run-instances --image-id ami-1624987f --max-count 1 --min-count 1 --key-name mel --instance-type t1.micro

让我们创建 ebs-volume,稍后我们将在其中安装系统:

aws ec2 create-volume --availability-zone us-east-1a --size 10

该命令将为我们创建一个 10 Gb 的磁盘。 重要提示:磁盘必须与实例位于同一区域(在我们的示例中为 us-east-1a)。
接下来,您需要将磁盘附加到实例:

aws ec2 attach-volume --instance-id i-2bc0925b --volume-id vol-08ab3079 --device /dev/xvdf

现在我们通过ssh登录实例,格式化磁盘并挂载到目录中:

mkfs.ext3 /dev/xvdf
mkdir /mnt/centos-image
mount /dev/xvdf /mnt/centos-image
cd !$

安装干净的 Centos 5.9

在安装系统之前,需要创建目录树,挂载proc和sysfs,并创建最小的设备集:

mkdir centos-image/{boot,tmp,dev,sys,proc,etc,var}
mount -t proc none /mnt/centos-image/proc/
mount -t sysfs none /mnt/centos-image/sys/
for i in console null zero ; do /sbin/MAKEDEV -d /mnt/centos-image/dev -x $i ; done

我们将使用 yum 和以下配置文件安装系统:
yum-centos.conf

[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
exclude=*-debuginfo
gpgcheck=0
obsoletes=1
reposdir=/dev/null

[base]
name=CentOS-5.9 - Base
mirrorlist=http://mirrorlist.centos.org/?release=5.9&arch=x86_64&repo=os
#baseurl=http://mirror.centos.org/centos/5.9/os/x86_64/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

[updates]
name=CentOS-5.9 - Updates
mirrorlist=http://mirrorlist.centos.org/?release=5.9&arch=x86_64&repo=updates
#baseurl=http://mirror.centos.org/centos/5.9/updates/x86_64/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

[extras]
name=CentOS-5.9 - Extras
mirrorlist=http://mirrorlist.centos.org/?release=5.9&arch=x86_64&repo=extras
#baseurl=http://mirror.centos.org/centos/5.9/extras/x86_64/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-5

[centosplus]
name=CentOS-5.9 - Plus
mirrorlist=http://mirrorlist.centos.org/?release=5.9&arch=x86_64&repo=centosplus
#baseurl=http://mirror.centos.org/centos/5.9/centosplus/x86_64/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-5

[contrib]
name=CentOS-5.9 - Contrib
mirrorlist=http://mirrorlist.centos.org/?release=5.9&arch=x86_64&repo=contrib
#baseurl=http://mirror.centos.org/centos/5.9/contrib/x86_64/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-5

yum -c ~/yum-centos.conf --installroot=/mnt/centos-image/ -y groupinstall Base

完成安装过程后,您可以用相同的方式安装任何必需的软件包:

yum -c ~/yum-centos.conf --installroot=/mnt/centos-image/ install $packet_name

让我们编辑 fstab:

vi /mnt/centos-image

/dev/xvda1  /      ext3    defaults        0 0
none       /dev/pts  devpts  gid=5,mode=620  0 0
none       /dev/shm  tmpfs   defaults        0 0
none       /proc     proc    defaults        0 0
none       /sys      sysfs   defaults        0 0

在 CentOS 5.9 中,您仍然需要安装支持 xen 的内核:

yum -c ~/yum-centos.conf --installroot=/mnt/centos-image/ -y install kernel-xen

安装GRUB:

chroot /mnt/centos-image/ grub-install /dev/xvdf

并生成一个新的initrd:

chroot /mnt/centos-image/
cd boot/
mkinitrd --omit-scsi-modules --with=xennet --with=xenblk --fstab=/etc/fstab --preload=xenblk initrd-2.6.18-348.1.1.el5xen.img 2.6.18-348.1.1.el5xen

指定所有这些参数和新的 fstab 非常重要,否则系统将无法启动。
接下来您需要为 grub 创建一个 menu.lst 文件:

default=0
timeout=5
hiddenmenu
title CentOS_5.9_(x86_64)
        root (hd0)
        kernel /boot/vmlinuz-2.6.18-348.1.1.el5xen ro root=/dev/xvda1
        initrd /boot/initrd-2.6.18-348.1.1.el5xen.img

让我们配置网络和 sshd:

vi etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes
DEVICE=eth0
BOOTPROTO=dhcp
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no

vi etc/sysconfig/network
NETWORKING=yes

chroot /mnt/centos5img/ chkconfig --level 2345 network on

vi /mnt/centos5img/etc/ssh/sshd_config
...
UseDNS no
PermitRootLogin without-password

因此,我们将获得一个工作网络以及使用密钥登录实例的能力。 但密钥本身需要以某种方式转移到实例。 这可以使用一个脚本来完成,该脚本将获取密钥并将其保存在实例上:

vi /mnt/centos5img/etc/init.d/ec2-get-ssh

ec2-get-ssh#!/斌/庆典
# 检查配置:2345 95 20
# 进程名称:ec2-get-ssh
# 描述:捕获 EC2 用户的 AWS 公钥凭证

#源码函数库
。 /etc/rc.d/init.d/functions

# 源网络配置
[ -r /etc/sysconfig/network ] &&. /etc/sysconfig/网络

# 替换您系统的以下环境变量
导出 PATH=:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin

# 检查网络是否配置
如果[“${NETWORKING}”=“否”]; 然后
echo “网络未配置。”
退出1
fi

开始(){
如果 [! -d /root/.ssh]; 然后
mkdir -p /root/.ssh
chmod 700 /root/.ssh
fi
# 使用 HTTP 从元数据服务器检索公钥
卷曲-f 169.254.169.254/最新/元数据/公钥/0/openssh-key > /tmp/我的公钥
如果 [$? -eq 0]; 然后
echo“EC2:使用 HTTP 从元数据服务器检索公钥。”
猫 /tmp/my-public-key >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
rm /tmp/我的公钥
fi
}

停() {
echo“这里没什么可做的”
}

重新开始() {
停止
开始
}

# 看看我们是如何被称呼的。
案例“ $ 1”在
启动)
开始
;;
停止)
停止
;;
重新启动)
重新开始
;;
*)
echo $“用法:$0 {开始|停止|重新启动}”
退出1
ESAC

退出$?
让我们使其可执行并将其添加到启动中:

chmod +x /mnt/centos-image/etc/init.d/ec2-get-ssh
/usr/sbin/chroot /mnt/centos-image/ /sbin/chkconfig --level 34 ec2-get-ssh on

还建议禁用 Selinux,或正确配置它。 否则,例如,密钥可能不会保存在实例上。
此时您可以停止设置系统。 我们已经准备好在云中运行的纯 CentOS。 剩下的就是用我们的系统卸载 ebs 磁盘并注册 ami。

umount /mnt/centos-image/proc/
umount /mnt/centos-image/sys/
umount /mnt/centos-image/

AMI 注册

要从 ebs 磁盘获取 ami,首先需要拍摄该磁盘的快照:

aws ec2 create-snapshot --volume-id vol-0b4bd07a --description centos-snap

注册 ami 最简单的方法是通过 AWS 管理控制台。 为此,您只需转到 EC2 服务中的“快照”部分,选择您需要的快照(在我们的示例中为 centos-snap),右键单击它并选择“从快照创建映像”
然后,在打开的窗口中,您需要选择大约以下参数:

在 Amazon 云中使用纯 CentOS 5.9 创建您自己的映像

您可以按如下所示找到要选择的内核 ID:

aws ec2 describe-images --owner amazon --region us-east-1 --output text | grep "/pv-grub-hd0.*-x86_64" | awk '{print $7}' | grep aki
aki-88aa75e1
aki-b4aa75dd

就这样。 现在您可以启动实例了。
通过这种方式,您很可能可以使用任何 Linux 发行版创建映像。 至少,绝对是 Debian(使用 debootstrap 安装干净的系统)和 Rhel 系列。

来源: habr.com

添加评论