CentOS7制作动态扩容根分区镜像

环境说明:centos 7 主机使用kvm创建openstack动态扩容根分区镜像。

安装kvm包

yum install -y qemu-kvm qemu-kvm-tools libvirt virt-manager virt-install libguestfs-tools

创建kvm网络环境

NET_DEVICE=ens33
IPADDR=192.168.32.166
GATEWAY=192.168.32.2

cat <<EOF | sudo tee /etc/sysconfig/network-scripts/ifcfg-${NET_DEVICE} >> /dev/null
TYPE=Ethernet
NAME=${NET_DEVICE}
DEVICE=${NET_DEVICE}
BOOTPROTO=static
ONBOOT=yes
BRIDGE=br0
EOF

cat <<EOF | sudo tee /etc/sysconfig/network-scripts/ifcfg-br0 >> /dev/null
TYPE=Bridge
NAME=br0
DEVICE=br0
BOOTPROTO=static
IPV4_FAILURE_FATAL=no
ONBOOT=yes
IPADDR=${IPADDR}
NETMASK=255.255.255.0
GATEWAY=${GATEWAY}
DNS1=223.5.5.5
DNS2=114.114.114.114
EOF

sudo systemctl restart network

上传centos ISO镜像

自行上传镜像到宿主机上。本教程将镜像上传到 /opt/share 目录。

创建qcow2文件

mkdir /opt/images
qemu-img create -f qcow2 /opt/images/CentOS-7-x86_64.qcow2 10G

启动kvm虚机

systemctl start libvirtd
virt-install --virt-type kvm --name CentOS7-x86_64 --ram 1024 --cdrom=/opt/images/CentOS-7-x86_64-DVD-1908.iso --disk path=/opt/images/CentOS-7-x86_64.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

安装系统自行决定怎么安装,分区最好手动分区。
安装好系统,是让 reboot 重启系统。重启后kvm虚拟机不会启动系统。需要手动启动系统。

virsh list --all
virsh start CentOS7-x86_64

修改yum源

yum install wget -y
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache

安装常用的软件包

yum install vim net-tools gcc gcc-c++  tree wget telnet  traceroute bash-completion-extras -y

修改PS1样式

cat << EOF | tee /etc/profile.d/environment.sh >> /dev/null
PS1='[\[\e[32;1m\]\u\[\e[37;1m\]@\[\e[31;4m\]\h\[\e[0m\] \[\e[33;1m\]\w\[\e[37;1m\]]\\$ \[\e[0m\]'
EOF

修改sshd服务

cd /etc/ssh/
cp sshd_config sshd_config.bak 
vim sshd_config
# 修改端口
Port XXXX
# 禁止root用户直接登录,首先要有普通用户。
PermitRootLogin no
# 优化sshd的连接速度
GSSAPIAuthentication no
UseDNS no

禁用selinux服务

sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config

增大文件描述符

cat << EOF | tee -a /etc/security/limits.conf >> /dev/null
* - nofile 65535 
EOF

tail -1 /etc/security/limits.conf

禁用默认zeroconf路由

CentOS系统必须要禁用默认zeroconf路由,以便精确访问OpenStack数据源

echo "NOZEROCONF=yes" >> /etc/sysconfig/network

下载cloud-init相关包

yum install -y gdisk cloud-init cloud-utils-growpart qemu-guest-agent acpid

systemctl enable qemu-guest-agent.service acpid.service

查看根分区的编号

$ mount  |grep /dev/vd
/dev/vda3 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/vda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

填写cloud-init配置

根据上面查看的根分区数字填写,不要写在最后。尽量前面几行。

vi /etc/cloud/cloud.cfg
# 可以使用密码登录
disable_root: 0
ssh_pwauth:   1

# 注释此行,如果不注释每次开机都会修改hosts文件
# - update_etc_hosts

# 添加ntp配置, cloud_config_modules 字段下添加 `- ntp`
cloud_config_modules:
...
 - ntp

# 修改默认用户
system_info:
  default_user:
    # name: centos
    name: ops
    lock_passwd: true
    gecos: Cloud User
    # groups: [adm, systemd-journal]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash
  distro: rhel
  paths:
    cloud_dir: /var/lib/cloud
    templates_dir: /etc/cloud/templates
  ssh_svcname: sshd
...

# 添加扩容根分区
bootcmd:
 - [ cloud-init-per, once, grow-partition, growpart, /dev/vda, 3 ]
 - [ cloud-init-per, once, resize-filesystem, resize2fs, /dev/vda3 ]

关闭kvm虚拟机

init 0

清理kvm虚拟机信息

virt-sysprep -d CentOS7-x86_64

修改nova服务配置

配置所有的计算节点nova配置文件/etc/nova/nova.conf,添加(修改)如下选项

$ openstack-config --set /etc/nova/nova.conf DEFAULT dhcp_domain ecloud.com

$ systemctl restart openstack-nova-compute.service openstack-nova-api.service

创建修改云主机参数的文件

命令行创建云主机支持 --user-data 参数,可以是 cloud-init 支持的一个 yaml 结构文件,所以还可以通过如下方式改密码

cat << EOF | tee CentOS-CloudInit.conf >> /dev/null
#cloud-config

# 设置下面公钥主机免密登录新建云主机。类似于ssh-copy-id复制的公钥。获取 ~/.ssh/id_rsa.pub 内容
users:
  - name: root
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJUPiZ+BXDsapC5Zdxy/3R6dz2d6hSplWfy8UfKWXBXD5YLxmhPmqggHPPdup9zAkO2et2+OMM3zrSh2DrXHfquFYeF8+8SR25X93tVmKZp8M1ffzl1rQ6eNVRLbq/VEl2wS9WPjA2KsyCkeXXglZBAdH4A+IfGgDeo3apdSOkvS98q8xOcZ2IRUAIuPNRaTJb1t8N5TYLEj/Z4QDQ4Vf95beDMZ2e04v63d6ReheoVUek3LlSDWER3xzxUwvGKo4PCnsEg2W/wGhUFrNg7LuLCud/Up4bZTBBbQ+HocdSEQXD/eGthdJ64oTjQYmo434pCSNbYKWW3nINaFcCEbA/ root@jumpserver.ecloud.com

# 修改密码
chpasswd:
  list: |
    root:123456
  expire: False

# 默认情况下,用户授权密钥的指纹在cloud-init 添加被打印到控制台。
no_ssh_fingerprints: false

# 默认情况下,(大多数)ssh 主机密钥会打印到控制台。
ssh:
  emit_keys_to_console: false

# 下载软件包。创建好云主机,然后再yum安装软件包
packages:
  - chrony
  - vim
  - net-tools

# 设置ntp服务
ntp:
  enabled: true
  ntp_client: chrony
  servers:
    - controller.ecloud.com

# 执行命令,只在创建虚机执行一次
bootcmd:
  - echo 192.168.31.213 controller.ecloud.com >> /etc/hosts

# runcmd 只在第一次启动时运行
runcmd:
  - systemctl start chronyd
EOF

注意
1、如果使用ntp的话,需要在制作镜像时,配置文件 /etc/cloud/cloud.cfgcloud_config_modules 字段添加一个 - ntp。否则创建云主机不识别 ntp 配置文件。
2、文件的开头不能省略 #cloud-config ,且 # 号之间不能多空格。

使用命令行创建云主机(注入元数据)

penstack server create --user-data ./CentOS-CloudInit.conf --security-group all --network selfnetwork --image CentOS7 --flavor luxury jumpserver

参考 cloud-init官方 配置文件

posted @   jiaxzeng  阅读(324)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示