基于CoreOS官方提供镜像,在本地KVM中安装使用C

2019-07-26 作者:yzc216亚洲城   |   浏览(84)

Cloud-init是一个Linux虚拟机的初始化工具,被广泛应用在AWS和OpenStack等云平台中,用于在新建的虚拟机中进行时间设置、密码设置、扩展分区、安装软件包等初始化设置。本文主要研究在本地KVM虚拟机,也就是没有云平台的情况下,如何使用cloud-init进行初始化工作。示例虚拟机的操作系统是CentOS 7.1。

1.下载CoreOS镜像(633.1.0版本)

安装

CoreOS官网已经有openstack使用的虚拟机镜像,可以直接下载,然后进行修改

在虚拟机内安装cloud-init:

yum install cloud-init -y

#如果需要使用iso文件制作镜像,可以参考另一篇文章 http://www.linuxidc.com/Linux/2015-05/117025.htm

安装完后,配置文件在/etc/cloud目录,主配置文件为/etc/cloud/cloud.cfg

2.guestfish修改CoreOS镜像

DataSource
要让cloud-init能够顺利完成初始化工作,必须把一些数据传给cloud-init,例如让cloud-init设置root密码,必须要告诉cloud-init密码是什么。Cloud-init支持很多种数据来源,常见的有metadata service、config drive和nocloud等。

2.1 安装guestfish工具

metadata service提供一个可以获取数据的url,例如OpenStack中的nova-api-metadat提供的

yum install libguestfs-tools-c-1.20.11-11.el6.x86_64

Config drive 把数据封装进一个iso9660(也支持vfat,但是不常见)文件系统的镜像中,然后把这个镜像以光驱(ide接口)的形式挂载到虚拟机中,虚拟机开机后cloud-init会自动去该镜像中获取数据。文件结构一般如下:

2.2 使用guestfish挂载CoreOS镜像 

openstack/

guestfish -a coreos_production_openstack_image.img -i
 
#挂载相应分区
mount /dev/sda9 /
mkdir /cloudinit
mount /dev/sda6 /cloudinit
 
#cloud-config.yml是系统提供的开机配置文件,我们可以把需要开机执行的服务,或者对系统的修改定制以一定语法写入这个文件(下文中设置sshd),如果此文件语法没有错误,CoreOS会在每次开机时执行它
#cloujd-config.yml位于系统的/usr/share/oem目录下,sda6分区上, 本次是临时挂载在/cloudinit目录下

  -  2012-08-10/ or latest/

2.3 开启root账户

      - meta_data.json

默认情况下,CoreOS禁用root账户,所以需要修改/etc/shadow文件,修改root用户那行,把第二字段置为空即可

      - user_data (not mandatory)

图片 1

  -  content/

2.4 设置sshd

      - 0000 (referenced content files)

#编辑/cloudinit/cloud-init.yml文件,设置sshd_config文件,允许root用户登录,允许密码认证

      - 0001

#cloud-config
coreos:
    units:
      - name: user-configdrive.service
        mask: yes
      - name: user-configvirtfs.service
        mask: yes
write_files:
    - path: /etc/ssh/sshd_config
      permissions: 0600
      owner: root:root
      content: |
        UsePrivilegeSeparation sandbox
        Subsystem sftp internal-sftp
        PermitRootLogin yes
        AllowUsers root
        PasswordAuthentication yes
        ChallengeResponseAuthentication no

      - ....

3 启动虚拟机

ec2

上面步骤使用guestfish工具修改了CoreOS镜像,现在可以使用这个镜像启动虚拟机,使用root账号无需密码登录系统(上面/etc/shadow中设置)
•如果你使用libvirt方式管理虚拟机,那么需要定义xml文件,然后使用virsh命令启动虚拟机
•如果直接使用命令行启动虚拟机,那么使用 qemu-kvm -m 1024 coreos_production_openstack_image.img 启动

  -  latest/

4 设置cloudinit.sh脚本

      - meta-data.json (not mandatory)

4.1 新建/etc/cloud-init.sh脚本

Nocloud 这种模式与config drive类似,只是文件结构不同,一般由user-data和meta-data两个文本文件构成。并且镜像以普通磁盘(virtio接口)的方式挂载。

#需要编写一个cloud-init.sh脚本,此脚本在系统开机时从metadata服务器获取数据, 完成修改主机名,修改root密码,ssh密钥注入

本文主要试验nocloud模式。

#!/bin/bash
#cloud-init.sh
#author:xxx
#date:2015-4-15
 
#get the env
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
 
STATUS_CODE=`curl -I -m 10 -o /dev/null -s -w %{http_code}
if [ ! "$STATUS_CODE" -eq "200" ]; then
    /bin/sleep 3
fi
 
# set the root password using user data
STATUS_CODE=`curl -I -m 10 -o /dev/null -s -w %{http_code}
if [ "$STATUS_CODE" -eq "200" ]; then
    PASS=`curl -m 10 -s | awk -F '"' '{for(i=1;i<=NF;i ){if($i ~ /password/) print $(i 2)}}'`
    if [ "$PASS" != " " ]; then
    /usr/bin/echo "root:${PASS}" > tmp.txt
    /usr/sbin/chpasswd < tmp.txt
    rm -f tmp.txt
    fi
fi
 
# set the hostname using the meta-data service
STATUS_CODE=`curl -I -m 10 -o /dev/null -s -w %{http_code}
if [ "$STATUS_CODE" -eq "200" ]; then
    curl -f > /tmp/metadata-hostname 2>/dev/null
    if [ $? -eq 0 ]; then
        TEMP_HOST=`cat /tmp/metadata-hostname | awk -F '.novalocal' '{print $1}'`
        /usr/bin/hostnamectl set-hostname ${TEMP_HOST}
        /usr/bin/hostname $TEMP_HOST
        rm -f /tmp/metadata-hostname
    fi
fi
 
# get the user ssh key using the meta-data service
STATUS_CODE=`curl -I -m 10 -o /dev/null -s -w %{http_code}
if [ "$STATUS_CODE" -eq "200" ]; then
    mkdir -p /root/.ssh
    /usr/bin/echo >> /root/.ssh/authorized_keys
    curl -m 10 -s | grep 'ssh-rsa' >> /root/.ssh/authorized_keys
    chmod 0700 /root/.ssh
    chmod 0600 /root/.ssh/authorized_keys
fi

封装数据
制作镜像需要cloud-localsd命令,默认没有安装,安装命令如下:

 

yum install cloud-utils -y

4.2 设置开机启动

编写user-data:

新建一个配置单元cloudinit.service, 此配置单元用来在开机时执行cloud-init.sh脚本

cat << EOF > my-user-data

 

#cloud-config

#cat /etc/systemd/system/cloudinit.service
[Unit]
Description=OpenStack nova
Requires=coreos-setup-environment.service
After=coreos-setup-environment.service
Before=user-config.target
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
ExecStart=/usr/bin/bash /etc/cloud-init.sh          #执行的脚本文件cloud-init.sh
[Install]
WantedBy=multi-user.target

chpasswd:

 

list: |

4.3 设置cloudinit.service开机启动

root:123456

#开机启动
systemctl enable cloudinit.service
#检测是否生效
systemctl is-enabled cloudinit

expire: false

 

ssh_pwauth: true

5 设置网络

EOF

5.1 使用dhcp方式

cloud-init也支持多种数据格式,我们使用的是cloud-config格式,这种格式必须是以#cloud-config开头的yaml格式。上面这段的意思是把root的密码设置为“123456”,然后配置ssh允许密码登录。

在/etc/systemd/network/目录下新建eth0.network文件,文件内容如下

制作img:

[Match]
Name=eth0
[Network]
DHCP=yes

cloud-localds -m local my-seed.img  my-user-data

5.2 使用固定IP方式

-m指定的cloud-init的工作模式,local的意思是不需要依赖网络,我们没有使用metadata service,所以不需要网络。

 

挂载数据
编辑虚拟机的libvirt xml配置文件,挂载镜像:

cat eth0.network
[Match]
Name=eth0
[Network]
Address=192.168.1.15/24
Gateway=192.168.1.1
DNS=223.5.5.5

<disk type='file' device='disk'>

6 设置时间同步,时区

      <driver name='qemu' type='raw' cache='none' io='native'/>

6.1设置ntpd

      <source file='/path/to/my-seed.img'/>

#查看ntpd状态, 启用

      <target dev='vdb' bus='virtio'/>

systemctl status ntpd
systemctl enable ntpd

      <readonly/>

6.2修改ntp time servers

</disk>

#ntp servers 可以通过修改/etc/ntp.conf配置文件,格式如下

修改cloud-init配置
在/etc/cloud/cloud.cfg最后一行添加以下内容,这句的意思是让cloud-init接受NoCloud来源的数据:

server 0.pool.example.com
server 1.pool.example.com

datasource_list: ["NoCloud"]

6.3 设置时区

重启虚拟机
在虚拟机内执行rm -rf /var/lib/cloud,不删除这个目录,cloud-init不会执行。

#查看当前状态
timedatectl status
#查看可用时区
timedatectl list-timezones
#修改为上海市区
timedatectl set-timezone Asia/ShangHai
#再次查看当前状态
timedatectl status

硬重启虚拟机

在Ubuntu 12.10 上安装部署Openstack http://www.linuxidc.com/Linux/2013-08/88184.htm

virsh destroy vm

Ubuntu 12.04 OpenStack Swift单节点部署手册 http://www.linuxidc.com/Linux/2013-08/88182.htm

virsh start vm  

OpenStack云计算快速入门教程 http://www.linuxidc.com/Linux/2013-08/88186.htm

虚拟机开机后,会发现root密码变成了“123456”

企业部署OpenStack:该做与不该做的事 http://www.linuxidc.com/Linux/2013-09/90428.htm

查看数据
在虚拟机内mount /dev/vdb /mnt,可以查看数据的内容。

CentOS 6.5 x64bit 快速安装OpenStack http://www.linuxidc.com/Linux/2014-06/103775.htm

ls /mnt

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-05/117024.htm

meta-data user-data

图片 2

cat user-data

#cloud-config

chpasswd:

list: |

root:123456

expire: false

ssh_pwauth: true

总结
本文测试了在无云平台管理的本地KVM虚拟机上使用cloud-init修改root密码的功能。cloud-init还有很多功能和技术细节,后续会继续研究。

本文永久更新链接地址

图片 3

本文由yzc216亚洲城发布于yzc216亚洲城,转载请注明出处:基于CoreOS官方提供镜像,在本地KVM中安装使用C

关键词: yzc216亚洲城