基于 KickStart 无人值守的全命令行 KVM 虚拟机安装过程

摘要

考虑到服务器没有配置界面,而需要在服务器上配置一些虚拟机,可以使用基于 KickStart 无人值守的方式,基于命令行来安装配置和使用虚拟机。安装完成的虚拟机直接可以使用SSH在局域网内连接。

配置主机环境

libvirt-client.x86_64 0:3.9.0-14.el7_5.8
Libvirt 的客户端,主要功能是在宿主机关机时通知虚拟机正常关机,防止强制关机导致数据丢失。

qemu-kvm.x86_64 10:1.5.3-156.el7_5.5
KVM在用户控件运行的程序

virt-manager.noarch 0:1.4.3-3.el7
基于 libvirt 的可视化虚拟机管理工具

libvirt.x86_64 0:3.9.0-14.el7_5.8
用于管理虚拟机的APi

virt-viewer.x86_64 0:5.0-10.el7
显示虚拟机控制台的console

virt-top.x86_64 0:1.0.8-24.el7
查看虚拟机的资源使用情况,类似于top命令

qemu-img-1.5.3-156.el7_5.5.x86_64

virt-install-1.4.3-3.el7.noarch
虚拟机安装工具

使用 HTTP 服务提供安装镜像

1、安装 HTTP 服务
通过运行下面命令安装 HTTP 服务:

1
yum install httpd

2、拷贝 ISO 镜像
从网络下载或是从其他服务器将 CentOS 7 的二进制 DVD ISO 镜像拷贝到 HTTP 服务所在的主机上。这里拷贝到如下位置:

1
/home/packages/CentOS-7-x86_64-DVD-1804.iso

3、挂载镜像
首先在 /mnt 目录下创建一个目录 /mnt/ctos7-install,这个目录名字随意。然后使用以下命令挂载镜像:

1
mount -o loop,ro -t iso9660 /home/packages/CentOS-7-x86_64-DVD-1804.iso /mnt/ctos7-install

4、拷贝安装包
使用如下命令将安装镜像中的文件拷贝到 HTTP 服务的目录中:

1
cp -r /mnt/ctos7-install/ /var/www/html/

拷贝完成之后,可以在 /var/www/html/ctos7-install 目录下看到以下内容:

1
2
3
4
[root@weilu_125 ctos7-install]# ls
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL

这些内容就是镜像中的文件。

5、启动 HTTP 服务

1
systemctl start httpd.service

6、开放端口
HTTP 服务默认使用的 80 端口一般防火墙是没有开放的,可以使用命令检查:

1
firewall-cmd --query-port=80/tcp

如果返回的是 no 则表示没有开启,使用如下命令开启:

1
2
3
4
5
# 开启端口
firewall-cmd --add-port=80/tcp --permanent

# 重新载入配置
firewall-cmd --reload

7、测试
在浏览器中输入这台主机的 IP 地址加上路径:

1
http://192.168.0.125/ctos7-install/

可以看到如下内容,说明HTTP服务配置成功。
enter image description here

编写 Kickstart 文件

在 HTTP 服务目录下创建一个文件 /var/www/html/kickstart/ks.cfg,将如下内容填充到文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
###############################################################
#
# Environment setup
#
###############################################################

# url --url="http://192.168.0.125/kickstart/ks.cfg"
text
cdrom
auth --enableshadow --passalgo=sha512
keyboard --vckeymap=us --xlayouts='us'
lang en_US.UTF-8
eula --agreed
reboot

###############################################################
#
# network configuration
#
###############################################################

network --bootproto=static --ip=192.168.0.151 --gateway=192.168.0.1 --netmask=255.255.255.0 --noipv6 --device=eth0 --nameserver=192.168.0.1,8.8.8.8 --activate

network --hostname=weilu_151
timezone Asia/Shanghai --isUtc




###############################################################
#
# partitioning
#
###############################################################

ignoredisk --only-use=vda
bootloader --location=mbr --boot-drive=vda
zerombr
clearpart --none --initlabel
autopart --type=lvm

# part swap --asprimary --fstype="swap" --size=1024
# part /boot --fstype xfs --size=200
# part pv.01 --size=1 --grow
# volgroup rootvg01 pv.01
# logvol / --fstype xfs --name=lv01 --vgname=rootvg01 --size=1 --grow


###########################################################################################
#
# User Accounts
# Generate encrypted password: python -c 'import crypt; print(crypt.crypt("My Password"))'
# Or openssl passwd -1 password
#
###########################################################################################

rootpw king
# user --groups=wheel --name=josepy --password=password --gecos="Mutai Josphat"

###############################################################
#
# SELinux and Firewalld
#
###############################################################

#selinux --enforcing
#selinux --permissive
selinux --disabled

firewall --enabled --http --ssh --ftp --port=https:tcp --port=ipp:tcp
# firewall --disabled


###############################################################
#
# Software Packages
#
###############################################################

%packages --nobase --ignoremissing
@core
@base
vim
bash-completion

%end

根据实际情况修改文件中的以下内容:
键盘和语言设置

1
2
keyboard --vckeymap=us --xlayouts='us'
lang en_US.UTF-8

网络配置
这里配置的是使用网桥连接,固定IP:

1
network --bootproto=static --ip=192.168.0.151 --gateway=192.168.0.1  --netmask=255.255.255.0  --noipv6 --device=eth0 --nameserver=192.168.0.1,8.8.8.8 --activate

主机名

1
network  --hostname=weilu_151

时区

1
timezone Asia/Shanghai --isUtc

这里可以使用命令 timedatectl list-timezones 查看所有时区的列表。

root密码

1
rootpw king

在 rootpw 指令后面跟的就是root账号的密码。

创建虚拟机

使用如下命令创建虚拟机,之后整个过程会自动进行,不需要交互操作:

1
2
3
4
5
6
7
8
9
10
11
12
virt-install \
--name centos7-3 \
--memory 2048 \
--vcpus 2 \
--disk path=/home/kvm3/centos7.0.qcow2,size=50 \
--location http://192.168.0.125/ctos7-install/ \
--os-variant centos7.0 \
--network bridge:br0 \
--graphics=none \
--console pty,target_type=serial \
-x 'console=ttyS0,115200n8 serial' \
-x "ks=http://192.168.0.125/kickstart/ks.cfg"

执行该命令后,会自动安装配置虚拟机:
enter image description here

enter image description here

安装完成之后,命令行会自动连接登录到虚拟机中,输入用户名密码即可登录虚拟机。

管理虚拟机

以命令行启动虚拟机

以命令行启动虚拟机,并将该命令行连接到虚拟机中的命令行:

1
virsh start centos7-3 --console

如果期间出现以下错误:Active console session exists for this domain
完整信息:

1
2
3
4
5
[root@weilu_125 Pictures]# virsh start centos7-3 --console
Domain centos7-3 started
Connected to domain centos7-3
Escape character is ^]
error: operation failed: Active console session exists for this domain

只需要重启虚拟机守护进程即可:

1
systemctl restart libvirtd.service

连接虚拟机

对于已经启动的虚拟机,可以使用以下命令以命令行的方式连接虚拟机:

1
virsh console centos7-3

问题

下面罗列一些在这个过程中可能碰到的问题。

WARNING KVM acceleration not available, using ‘qemu’

这个问题的直观表现就是执行 virt-install 命令之后就卡住了,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@weilu_123 centos7-1]# virt-install \
> --name centos7-1 \
> --memory 2048 \
> --vcpus 2 \
> --disk path=/home/kvms/centos7-1/centos7.0.qcow2,size=200 \
> --location http://192.168.0.123/ctos7-install/ \
> --os-variant centos7.0 \
> --network bridge:br0 \
> --graphics=none \
> --console pty,target_type=serial \
> -x 'console=ttyS0,115200n8 serial' \
> -x "ks=http://192.168.0.123/kickstart/ks.cfg"

开始安装......
搜索文件 vmlinuz...... | 5.9 MB 00:00
搜索文件 initrd.img...... | 50 MB 00:00
正在分配 'centos7.0.qcow2' | 200 GB 00:00
连接到域 centos7-1
换码符为 ^]

这个问题是BIOS的CPU虚拟化功能没有开启导致的。

只要进入 BIOS,将Intel Virtualization Technology开启即可,下面例子是华硕主板:

enter image description here

参考

[1] RHEL and CentOS Kickstart on KVM Automated Installation With virt-install
[2] CentOS 7 INSTALLING IN TEXT MODE
[3] Use VNC mode to install CentOS 7
[4] Kickstart Installation