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.cfg
的cloud_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官方 配置文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具