# 官方提供@yunTaoScripts Openstack 镜像制作 🔥🔥

loading

# 配置环境

  • 安装虚拟主机组
[root@rhel8-100 local]# yum group list
[root@rhel8-100 local]# yum groupinstall 'Virtualization Host'
  • 安装图形化工具
[root@rhel8-100 local]# yum whatprovides virt-manager
virt-manager-2.2.1-4.el8.noarch : Desktop tool for managing virtual machines via libvirt
Repo        : AppStream
Matched from:
Provide    : virt-manager = 2.2.1-4.el8

[root@rhel8-100 ~]# yum install virt-manager.noarch -y

图形安装细节

  • 勾选安装前修改配置
  • 选择diplay vnc
  • 修改键盘语言 en-us

# 虚拟机配置修改

  • 开启物理机ipv4转发
[root@rhel8-100 ~]# cat /proc/sys/net/ipv4/ip_forward 
1

# 修改镜像源

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 修改ssh,加快访问速度

[root@vms0 ~]# grep DNS /etc/ssh/sshd_config 
#UseDNS yes
UseDNS no

# 关闭selinux

[root@vms0 ~]# grep ^SE /etc/selinux/config 
SELINUX=disabled 

# 关闭防火墙

[root@vms0 ~]# firewall-cmd --get-default-zone
public
[root@vms0 ~]# firewall-cmd --set-default-zone=trusted
success
[root@vms0 ~]# firewall-cmd --get-default-zone
trusted

# 安装常用包

[root@vms0 ~]# yum install -y vim net-tools lrzsz wget completion-bash
[root@vms0 ~]# cat /etc/profile.d/bash_completion.sh 
# Check for interactive bash and that we haven't already been sourced.
if [ -n "${BASH_VERSION-}" -a -n "${PS1-}" -a -z "${BASH_COMPLETION_VERSINFO-}" ]; then

    # Check for recent enough version of bash.
    if [ ${BASH_VERSINFO[0]} -gt 4 ] || \
       [ ${BASH_VERSINFO[0]} -eq 4 -a ${BASH_VERSINFO[1]} -ge 1 ]; then
        [ -r "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" ] && \
            . "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion"
        if shopt -q progcomp && [ -r /usr/share/bash-completion/bash_completion ]; then
            # Source completion code.
            . /usr/share/bash-completion/bash_completion
        fi
    fi
fi
[root@vms0 ~]# sh /etc/profile.d/bash_completion.sh

# 安装acpid

[root@vms0 ~]# yum install -y acpid

# 安装cloud-init

cloud-init (opens new window) cloud-init官网 (opens new window)

推荐:

  • 如果之前/etc/nova/nova.conf没有force_config_drive = true选项,则建议不要安装cloud_init;否则会出现各种奇怪的问题
  • 一定要配置子网,否则出问题,在子网下创建虚拟机。如果虚拟机所在subnet 连接在了router 上,那么发向169.254.169.254 的报文会被发至router。
  • 创建时间长超时,把重试次数加大
[root@openstack-71 nova]# grep block /etc/nova/nova.conf  | grep -v ^#
block_device_allocate_retries=600

创建ssh-key 时,通过这个包自动将公钥写入虚拟机。

[root@vms0 ~]# yum install cloud-init -y
[root@vms0 ~]# systemctl list-unit-files | grep cloud-init
cloud-init-local.service                      enabled 
cloud-init.service                            enabled 
cloud-init.target                             static  
[root@vms0 ~]# systemctl is-active cloud-init
unknown
[root@vms0 ~]# systemctl status cloud-init
● cloud-init.service - Initial cloud-init job (metadata service crawler)
   Loaded: loaded (/usr/lib/systemd/system/cloud-init.service; enabled; vendor preset: disabled)
   Active: inactive (dead)

[root@vms0 ~]# systemctl enable cloud-init
[root@vms0 ~]#  vim /etc/cloud/cloud.cfg
## 允许root、允许账号密码登陆
disable_root: 0
ssh_pwauth:   1
## 设置默认登陆用户
system_info:
  default_user:
    name: cloud
  • 修改内核参数为了能在启动的时候,通过nova console输出开机信息,在darshboard,
[root@vms0 ~]# vim /etc/default/grub 
#在GRUB_CMDLINE_LINUX的最后添加 console=tty0 console=ttyS0,115200n8 
[root@vms0 ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet console=tty0 console=ttyS0,115200n8"
GRUB_DISABLE_RECOVERY="true"
[root@vms0 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg 
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-957.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-957.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-352bdbef7f194cf19a9f383a2f99cfd0
Found initrd image: /boot/initramfs-0-rescue-352bdbef7f194cf19a9f383a2f99cfd0.img
done

# 删除系统独有的东西

# 删除 ssh
[root@vms0 ~]# rm -rf /etc/ssh/ssh_
ssh_config                ssh_host_ecdsa_key.pub    ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub      
ssh_host_ecdsa_key        ssh_host_ed25519_key      ssh_host_rsa_key          
[root@vms0 ~]# rm -f /etc/ssh/ssh_host_*
[root@vms0 ~]# ls /etc/ssh/
moduli  ssh_config  sshd_config
# 删除网卡信息
[root@vms0 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=dhcp
NAME=eth0
DEVICE=eth0
ONBOOT=yes
# 清空machine id
[root@vms0 ~]# cat /dev/null > /etc/machine-id
# 为保证实例能访问metadata数据,需要禁用zeroconf
[root@vms0 ~]# echo 'NOZEROCONF=yes' >> /etc/sysconfig/network
[root@vms0 ~]# cat /etc/sysconfig/network
# Created by anaconda
NOZEROCONF=yes

# 关闭交换分区

[root@vms0 ~]# swapon -s
Filename				Type		Size	Used	Priority
/dev/dm-1                              	partition	1048572	0	-2
[root@vms0 ~]# swapoff -a
[root@vms0 ~]# swapon -s
[root@vms0 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        118M        974M        8.6M        745M        1.5G
Swap:            0B          0B          0B
[root@vms0 ~]# vim /etc/fstab #删除启动挂载
[root@vms0 ~]# poweroff

# virt-sysprep 封装镜像

virt-sysprep这个工具来自libguest-tools这个工具包,它能够把kvm虚拟机对应的磁盘文件做成一个模板,后续我们启动虚拟机就可以基于这个镜像模板启动;什么是镜像模板呢?所谓模板就是去除了一个虚拟机自身的私有信息的一个镜像磁盘文件;我们知道把一个镜像文件启动为虚拟机以后,它会生成许多私有信息,比如网卡的mac地址,ip地址,磁盘的uuid,ssh密钥等等;对于模板我们是不需要把这些私有信息的,而virt-sysprep这个工具就能很好的帮助我们去制作一个模板文件,它能够让我们在模板中打入自己想要新装的软件包,想要加入到模板里的文件等等操作;简单点讲virt-sysprep这个工具能够让我们自定义在模板镜像中定义有哪些东西,后续我们基于这个模板直接启动为虚拟机;也就是在我们启动虚拟机之前把我们需要的东西直接通过virt-sysprep这个工具打入到磁盘镜像文件中去;要想使用virt-sysprep这个工具,我们首先要安装libguest-tools这个工具


[root@rhel8-100 ~]# virsh list #查看虚拟机
 Id   Name   State
--------------------

[root@rhel8-100 ~]# virsh list --all
 Id   Name        State
----------------------------
 -    centos7.0   shut off
[root@rhel8-100 ~]# yum install -y libguestfs-tools-c-1:1.40.2-27.module+el8.4.0+9282+0bdec052.x86_64
[root@rhel8-100 ~]# virt-sysprep -d centos7.0
[root@rhel8-100 ~]# ls /var/lib/libvirt/images/
[root@rhel8-100 images]# qemu-img info centos7.0.qcow2 
image: centos7.0.qcow2
file format: qcow2
virtual size: 10 GiB (10737418240 bytes)
disk size: 11 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false 

# 压缩镜像

[root@openstack-vms71 ~]# cd /var/lib/libvirt/image/
[root@rhel8-100 data]# qemu-img convert -c -f qcow2 -O qcow2 centos7.0.qcow2 centos7.0.img
[root@rhel8-100 data]# ll
total 26868484
-rw-r--r--. 1 root root   793833472 Dec 15 18:38 centos7.0.img
-rw-------. 1 root root 10739318784 Dec 15 18:07 centos7.0.qcow2
[root@rhel8-100 data]# du -sh centos7.0.img 
758M	centos7.0.img
[root@rhel8-100 data]# du -sh centos7.0.qcow2 
11G	centos7.0.qcow2

# guestfish微调已生成的镜像

[root@rhel8-100 data]# guestfish -i --network -a centos7.0.img 
Operating system: CentOS Linux release 7.6.1810 (Core) 
/dev/centos/root mounted on /
/dev/sda1 mounted on /boot
><fs> command "yum install vsftpd -y"
><fs> command "systemctl enable vsftpd"
><fs> quit

# virt-customize微调已生成的镜像

virt-customize -a 镜像 --run-command "yum install 软件包 -y" --run-command "其他命令"

# 网页上传镜像

最后修改时间: 12/31/2022, 12:00:03 PM