第三周作业

虚拟机管理

创建

# 创建一个20G的 qcow2格式磁盘文件
qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.qcow2 20G

# 查看系统支持的os版本
virt-install --osinfo list  | grep 'os-you-need'

# 采用已预先创建的磁盘
# 其中cdrom的权限 用户为libvirt-qemu 用户组为kvm
virt-install \
--name centos7 \
--virt-type kvm \
--os-variant=centos7.0 \
--memory 1024 --vcpus 2 \
--cdrom=/data/isos/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/var/lib/libvirt/images/centos7.qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole

# 一步创建磁盘+虚拟机
virt-install \
--name centos7 \
--virt-type kvm \
--os-variant=centos7.0 \
--memory 1024 --vcpus 2 \
--cdrom=/data/isos/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/var/lib/libvirt/images/centos7.qcow2,size=10,format=qcow2,bus=virtio \
--network network=default \
--graphics vnc,listen=0.0.0.0 --autoconsole graphical

复制

磁盘复制实现

cp -a /var/lib/libvirt/images/xxxx.qcow2 \
/var/lib/libvirt/images/xxxxx-2.qcow2

右键clone



virt-clone克隆

virt-clone -o rocky8 -n rocky8-3
-o rocky8   #指已存在的虚拟机的名称
-n rocky8-3 #新虚拟机的名称
-f /var/lib/libvirt/images/rocky8-3.qcow2 #新虚拟机磁盘文件路径,此文件自动生成,不需要事先创建

virtio驱动

virtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象,提供了一套上层应用与各 Hypervisor 虚拟化设备(KVMXenVMware等)之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率,Windows 系统需要单独安装virtio驱动Linux系统自带virtio驱动

安装 virtio 的驱动

  1. 该驱动安装主要针对windows宿主机安装
  2. 需要在创建虚拟机的时候,创建两个光驱,一个放windows镜像,一个存放virtio驱动软件
  3. 安装系统时,在硬盘安装驱动,先安装virtio驱动
  4. 系统安装完成后,对网卡/PCIe等进行 virtio驱动的安装
  5. (可选)对于需要重置/作为模板的windwos虚拟机使用 sysprep 对其进行重写包括SID在内的信息

列出主机

virsh list --all
virsh list --uuid --all --name

开启关闭

virsh start centos7
virsh shutdown centos7
virsh reboot centos7

暂停恢复

virsh suspend centos7
virsh resume centos7

开机启动


OR

virsh autostart centos7

OR

通过将配置文件软链接到/etc/libvirt/qemu/autostart/ 目录下
ln -s /etc/libvirt/qemu/centos7.xml /etc/libvirt/qemu/autostart/centos7.xml

删除

virsh undefine centos7 # 删除虚拟机配置,但不删除硬盘文件
virsh undefine centos7 --remove-all-storage # 删除虚拟机包括磁盘文件

磁盘路径

virsh domblklist centos7

冷迁移

  1. 生成主机的xml文件

virsh dumpxml centos7 > centos7.xml

  1. 编辑按需修改
    • id // id是一个递增的唯一数字
    • disk.source // 磁盘文件ZQ
    • interface.mac //mac地址
    • interface.target //网络类型 vnetX
  2. centos7.xml 文件复制到另外一个主机上 (同系统)

scp centos7.xml root@192.168.1.1:/etc/libvirt/qemu/

重要文件

  1. 主机配置XML文件 /etc/libvirt/qemu/centos7.xml
  2. 开机启动的gust host 目录 /etc/libvirt/qemu/autostart/

管理远程主机

  1. 建立互信 (二选一)
    • 通过openssh-askpass包
      • apt install -y ssh-askpass / yum -y install openssh-askpass
    • 基于本机到远程主机的key验证 ssh-copy-id
      • ssh-keygen
      • ssh-copy-id 192.168.1.1 #远程主机地址
  2. File --> Add Connection
  3. 添加远程主机

镜像制作

手动制作

基于容器制作

!!! info commit 命令
docker commit --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
-a, --author string Author (e.g., "John Hannibal Smith hannibal@a-team.com")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
!!!

制作步骤

  1. 下载官方镜像
  2. 前台命令行方式启动
  3. 安装所需工具或应用包等
  4. 提交处理好的镜像
  5. 将新生成的镜像生成容器

操作案例 (nginx容器制作)

1. 拉取centos基础镜像
docker pull rockylinux:9.3

2. 启动基础镜像进入容器
docker run -it --name rockylinux-base rockylinux:9.3 /bin/bash

3. 更改源
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky-*.repo
    
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky.repo

dnf makecache

5. 下载nginx
yum install nginx iproute net-tools -y

6. 清理缓存 (减少空间大小)
rm -rf /var/cache/dnf/*

7. 关闭nginx后台服务
# sed 's!daemon on;!daemon off;!' /etc/nginx/nginx.conf
# 在全局设置  nginx/1.20.1
sed -i '9a\daemon off;'  /etc/nginx/nginx.conf
nginx -t

8. 准备自定义页面
echo "<h1>Hello my container</h1>" > /usr/share/nginx/html/index.html

9. 提交镜像
docker commit -a "root@alopex.com" -m "rockylinux nginx v1" -c "EXPOSE 80 443" rockylinux-base alopex/rockylinux-nginx:v1

10. 启动容器
docker run -d -p 8080:80 \
--name rocky-base-nginx \
alopex/rockylinux-nginx:v1 \
/usr/sbin/nginx

11. 测试容器
curl 127.0.0.1:8080