制作OpenSUSE12.3的OpenStack镜像

OS : openSUSE 12.3 (Dartmouth) (x86_64)
KVM version: qemu-kvm-1.5.3
镜像运行环境: OpenStack Mitaka:
本文不去介绍,如何下载iso文件,也不介绍如何安装虚拟机,不过这里给大家几个提示吧;
提示1:
采用 virt-manager 安装虚拟机时,需要选择自定义配置安装,如下图; 然后再次选择磁盘的高级选项 ----> Disk bus ----> VirtIO
制作OpenSUSE12.3的OpenStack镜像
制作OpenSUSE12.3的OpenStack镜像制作OpenSUSE12.3的OpenStack镜像
制作OpenSUSE12.3的OpenStack镜像

提示2:
安装的kvm虚拟机,分区最好是 /boot采用 基本分区其他的分区采用lvm的类型
安装opensuse12.3系统时,磁盘分区一定要自动分区(LVM),否则上传到openstack环境还是无法识别硬盘,切记切记


阐述: 本文修改云主机密码的方式为 metadata 注入方式;其原理是在 云主机内部编写一个 重置密码的脚本,达到重置密码的效果;
该脚本会去查找 “http://169.254.169.254/openstack/latest/meta_data.json” 这个地址的值,只要changePasswd 的值为True,才会去修改密码;
了解到前台传值,changePasswd=True的状态至少会保留1分钟,而我的脚本却是一直循环着(达到立马修改密码的效果),所以,这个密码至少会被修改20次,虽然密码一直是那个值,但是在系统里确实是已经被修改了好多次,为了排除这种问题,所以下面脚本重置密码的情况是,当changePasswd=False并且 当changePasswd=True的状态时,才会去修改密码;(你没有看错,就是这样),具体请看下面的脚本

初始密码的设置: 在openstack 控制节点 执行:
用法:
nova meta 云主机id 或者 主机名称 set changePasswd=True admin_pass=密码

实例:
nova meta 17d96745-63a7-4401-87de-f34ca418a5e6 set changePasswd=True [email protected]

下面开始操作

一、配置网卡的配置,保留主要的就ok,把那些些uuid的配置项都删除,比如下边的内容都应该保留下来

001_修改网卡的配置文件,修改为精简型的网卡配置文件

vim /etc/sysconfig/network/ifcfg-eth0
BOOTPROTO='dhcp'
STARTMODE='onboot'

002_重新启动网络配置
systemctl restart network.service

二、配置系统允许远程登录
001_修改系统防火墙配置,允许远程ssh登录
grep "FW_SERVICES_EXT_TCP" /etc/sysconfig/SuSEfirewall2
FW_SERVICES_EXT_TCP="ssh"

rcSuSEfirewall2 restart

002_关闭秘钥登录,开启密码登录
vim /etc/ssh/sshd_config
#AuthorizedKeysFile     .ssh/authorized_keys
PasswordAuthentication yes

003_重新启动ssh服务
systemctl restart sshd

三、安装一些自己需要的工具
添加自己的内部源,没有的同学,跳过此步骤即可;

000_扩展技能
/etc/zypp/repos.d/ opensuse 源的位置
zypper install 软件包名 安装软件包,类似centos系统的yum
zypper repos --url 显示repo源信息
zypper modifyrepo --disable/enable openSUSE-13.2-0 开启/关闭repo源
zypper refresh 刷新全部源
zypper removerepo 名称 移除一个指定的源
zypper renamerepo old_name new_name 修改一个指定源的名字
zypper ps 显示使用已经删除文件的进程

zypper addrepo -f[表示软件源自动刷新] url 别名 添加一个源
eg:



001_安装需要的软件包
zypper install python-configobj python-yaml python-Cheetah 
rpm -ivh http://ftp5.gwdg.de/pub/opensuse/repositories/isv%3A/B1-Systems%3A/OpenStack%3A/release%3A/Essex%3A/requirements/SLE_11_SP2/x86_64/python-cloud-init-0.6.2-3.1.x86_64.rpm

wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
chmod +x jq-linux64
mv jq-linux64 /sbin/jq

问题解决方案:
制作OpenSUSE12.3的OpenStack镜像
制作OpenSUSE12.3的OpenStack镜像

002_修改内核参数,并更新内核配置(配置显示 nova console-log )

添加,直接添加就好,如下图
制作OpenSUSE12.3的OpenStack镜像
制作OpenSUSE12.3的OpenStack镜像

vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=" resume=/dev/system/swap splash=silent console=ttyS0 quiet showopts"

grub2-mkconfig -o /boot/grub2/grub.cfg



003_修改cloud.cfg配置文件 这里,就直接把需要修改的地方用 红色字体标注出来啦,当然也会把 替换的命令贴出来
sed -i 's/user: ubuntu/user: root/g' /etc/cloud/cloud.cfg
sed -i 's/disable_root: 1/disable_root: 0/g' /etc/cloud/cloud.cfg

下面编辑 cloud.cfg 部分仅供参考
vim /etc/cloud/cloud.cfg

user: root
disable_root:0
preserve_hostname: False
# datasource_list: [ "NoCloud", "OVF", "Ec2" ]

cloud_init_modules:
- bootcmd
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- rsyslog
- ssh

cloud_config_modules:
- mounts
- ssh-import-id
- locale
- set-passwords
- grub-dpkg
- apt-update-upgrade
- timezone
- puppet
- chef
- mcollective
- disable-ec2-metadata
- runcmd
- byobu

cloud_final_modules:
- rightscale_userdata
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- scripts-user
- keys-to-console
- phone-home
- final-message



004_添加修改、重置密码的脚本(这些操作均由下面的脚本一键执行添加)
将下面的内容复制到一个文件,并赋予执行的权限即可  自动添加写好的服务脚本,并且自己添加为开机启动,还会把 /sbin 对应的文件加密 

vim meta_opensuse123.sh
#!/bin/bash
cat > /etc/init.d/meta_data_service << END
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: meta_data_service
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: meta_data_service sspaas-cloud daemon
### END INIT INFO
#
BASE_DIR=/sbin
ARGV="\[email protected]"
start()
{
echo "START meta_data SERVERS"
\$BASE_DIR/meta_data > /dev/null 2>&1 &
}
stop()
{
#meta_data.pid
echo "STOP meta_data SERVERS"
meta_datapid=\`ps -ef|grep meta_data|grep -v grep|awk '{ print\$2 }'\`
for i in \$meta_datapid
do
 kill -9 \$meta_datapid
done
}
case \$ARGV in
start)
start
ERROR=\$?
;;
stop)
stop
ERROR=\$?
;;
restart)
stop
start
ERROR=\$?
;;
*)
echo "meta_data [start|restart|stop]"
esac
exit \$ERROR
END

cat > /etc/init.d/meta_network_service << END
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: meta_network_service
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: meta_network_service sspaas-cloud daemon
### END INIT INFO
#
BASE_DIR=/sbin
ARGV="\[email protected]"
start()
{
echo "START meta_data SERVERS"
\$BASE_DIR/meta_network > /dev/null 2>&1 &
}
stop()
{
#meta_data.pid
echo "STOP meta_data SERVERS"
meta_networkpid=\`ps -ef|grep meta_network|grep -v grep|awk '{ print\$2 }'\`
for i in \$meta_networkpid
do
 kill -9 \$meta_networkpid
done
}
case \$ARGV in
start)
start
ERROR=\$?
;;
stop)
stop
ERROR=\$?
;;
restart)
stop
start
ERROR=\$?
;;
*)
echo "meta_network [start|restart|stop]"
esac
exit \$ERROR
END

cat > /sbin/meta_data << END
#!/bin/bash
m=\`curl http://169.254.169.254/openstack/latest/meta_data.json | jq '.meta'\`
   status=\`echo \$m | jq '.changePasswd' | sed 's/"//g'\`
   password=\`echo \$m | jq '.admin_pass' | sed 's/"//g'\`
     if [ \$status == True ];then
       echo root:\$password | chpasswd
     fi

while true
  do
    m1=\`curl http://169.254.169.254/openstack/latest/meta_data.json | jq '.meta' | jq '.changePasswd' | sed 's/"//g'\`
    sleep 3
    m2=\`curl http://169.254.169.254/openstack/latest/meta_data.json | jq '.meta'\`
       changepw=\`echo \$m2 | jq '.changePasswd' | sed 's/"//g'\`
       pass=\`echo \$m2 | jq '.admin_pass' | sed 's/"//g'\`

    if [ \$m1 == False ] && [ \$changepw == True ];then
      echo root:\$pass | chpasswd
    else
      echo "noting to do" >/dev/null
    fi
  done
END

cat > /sbin/meta_network << END
#!/bin/bash
while true
  do
     temp=\`ifconfig eth0 | grep broadcast | awk '{ print \$2 }' | awk -F "." 'BEGIN{ OFS="." }{ print \$1,\$2,\$3 }'\`
     ip0=\`ip a | grep eth0: | wc -l\`
     ip1=\`ip a | grep eth1: | wc -l\`
     route0=\`route -n | grep "^0.0.0.0" | grep \$temp.254 |wc -l\`

     if [ \$ip0 -eq 1 ] && [ \$ip1 -eq 1 ] && [ \$route0 -eq 1 ];then
      route del default gw \$temp.254
     elif [ \$ip0 -eq 1 ] && [ \$ip1 -eq 0 ] && [ \$route0 -eq 0 ];then
      route add default gw \$temp.254
     fi
  sleep 3
  done
END

chmod +x /sbin/meta_data
chmod +x /sbin/meta_network
chmod +x /etc/init.d/meta_data_service
chmod +x /etc/init.d/meta_network_service
#
gzexe /sbin/meta_data
rm -f /sbin/meta_data~
gzexe /sbin/meta_network
rm -f /sbin/meta_network~
#
chkconfig --add meta_data_service
chkconfig --add meta_network_service

下面 005 的操作仅仅用作删除上面meta_opensuse123.sh 的执行结果
005_删除上面脚本添加的内容,可以执行下面的操作
chkconfig --del meta_data_service
chkconfig --del meta_network_service
rm -f /sbin/meta_data
rm -f /sbin/meta_network
rm -f /etc/init.d/meta_data_service 
rm -f /etc/init.d/meta_network_service

006_删除之前添加的不必要的信息
rm -f meta_opensuse123.sh


007_关机即可
poweroff

到这里 openstack 的 opensuse12.3 镜像就做完成啦
下面的操作,主要是吧 大的镜像进行压缩,并进行上传,下面的操作均在做镜像的服务器(宿主机)上操作

三、技能扩展:

001_显示kvm中所有虚拟机
virsh list --all

002_执行清理任务,如,之前的历史命令,mac地址,ip地址等 
virt-sysprep -d opensuse123

003_在kvm中删除虚拟机,仅仅删除xml文件,不会删除镜像文件
virsh undefine opensuse123

004_将镜像压缩
qemu-img convert -c -O qcow2    压缩之前的路径+名字 压缩之后的路径+名字