大家知道,亚马逊云中的虚拟实例是基于镜像启动的(所谓的
官方文档描述了
本文将讨论如何在 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
如果 [$? -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),右键单击它并选择“从快照创建映像”
然后,在打开的窗口中,您需要选择大约以下参数:
您可以按如下所示找到要选择的内核 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