高效管理创建的虚拟机
1 实验目的
- 动态调整虚拟机的配置
- 复制与删除虚拟机
- 管理虚拟机的命令总结
2 实验环境
2.1、硬件环境
- ubuntu 22.04 server
- AMD EPYC 7502
- 内存三星 RECC DDR4 16G 3200
- SATA 16TB 企业级 机械硬盘
- 网卡板载双口千兆
2.2、软件环境
- KVM(确保按照之前的步骤安装好)
- openssh-serevr
- net-tools
- xshell 7
- MobaXterm
3 实验内容与结果
3.1、动态调整虚拟机配置
先查看需要修改虚拟机的磁盘容量与内存
记得首先先shutdown虚拟机,再使用 virsh dominfo
命令查看虚拟机的详细信息,包括内存和CPU核心数,然后使用 virsh domblklist
命令查看虚拟机的磁盘信息 .
sudo virsh shutdown ubuntu20.04
sudo virsh start ubuntu20.04
sudo virsh dominfo ubuntu20.04
sudo virsh domblklist ubuntu20.04
增加虚拟机内存与核心数,并修改内存,然后重启虚拟机
注意修改时要关闭虚拟机,要增加虚拟机的内存为8G和CPU核心数为4,首先需要编辑虚拟机的 XML 配置文件,然后在关闭虚拟机时使配置生效。
sudo virsh edit ubuntu20.04
sudo virsh setvcpus ubuntu20.04 4 --config
sudo virsh setmaxmem ubuntu20.04 8388608 --config
增加磁盘容量
如果你的虚拟机磁盘是通过 LVM 管理的,可以通过以下步骤增加 LVM 逻辑卷的大小:
1. 查找 LVM 逻辑卷
首先,使用 lvdisplay
查找对应的逻辑卷(LV):
sudo lvdisplay
查找和虚拟机磁盘关联的逻辑卷,并记下 LV Path
,例如 /dev/vg01/ubuntu1.
2. 扩展逻辑卷
假设你要增加 10GB 的磁盘容量,使用以下命令扩展逻辑卷:
sudo lvextend -L +10G /dev/vg01/ubuntu1
3. 扩展文件系统
先使用xshell登录到虚拟机,然后进行扩展系统; 如果虚拟机内的分区仍然为 40GB,你需要扩展分区以利用新增的空间。你可以使用 growpart
命令扩展分区(假设你在 /dev/vda1
上有一个单一分区)。
- 安装
cloud-guest-utils
(如果尚未安装):
sudo apt-get update
sudo apt-get install cloud-guest-utils
- 使用
growpart
扩展分区:
sudo growpart /dev/vda 2
这个命令会扩展 /dev/vda2
分区以占满整个50GB的磁盘
- 将文件系统扩展珍整个分区
- 如果是
**ext4**
文件系统:
sudo resize2fs /dev/vda2
- 如果是
**xfs**
文件系统:
sudo xfs_growfs /dev/vda2
总结
- 增加虚拟机核心与内存,需要先关闭虚拟机,同时不仅要修改配置文件,还要用命令行使配置生效
- 增加磁盘容量,如果lvm卷管理会比较方便,先在宿主机增加,然后登入对应虚拟机,安装cloud-guest-utils,使用growpart扩展到整个磁盘,再格式化对应文件系统
3.2、复制与删除虚拟机
使用 virt-manager
克隆虚拟机
1、 打开 **virt-manager**
:
- 启动 `virt-manager`。
- 在虚拟机列表中找到你想要复制的虚拟机。
2、关闭虚拟机:
- 右键点击虚拟机,然后选择“关闭”或“关机”。
- 确保虚拟机处于关闭状态才能进行克隆。
3、克隆虚拟机:
- 右键点击已经关闭的虚拟机,选择“克隆”。
- 在弹出的对话框中,为新的虚拟机指定一个唯一的名称。
- 根据需要选择是否重新生成 MAC 地址以及是否更改存储位置。
- 点击“克隆”按钮,等待克隆过程完成。
- 可以直接默认相关设置,会自动在存储池生成一个
4、启动克隆后的虚拟机:
- 克隆完成后,你会在虚拟机列表中看到新的虚拟机。右键点击并选择“启动”来启动新虚拟机。
使用 virt-clone
命令行工具
virt-clone
是一个专门用于克隆虚拟机的命令行工具,适用于终端操作。
关闭源虚拟机
- 确保你要克隆的虚拟机处于关闭状态:
sudo virsh shutdown <vm_name>/ubuntu20.04-2
使用 **virt-clone**
克隆虚拟机(自定义lvm逻辑卷):
- 使用以下命令克隆虚拟机:
sudo virt-clone --original <source_vm_name> --name <clone_vm_name> --file /dev/vg01/ubuntu_clone
例如:
sudo virt-clone --original ubuntu20.04-2 --name ubuntu20.04-3 --file /dev/vg01/ubuntu_clone2
- `--original <vm_name>`:指定要克隆的源虚拟机名称。
- `--name <new_vm_name>`:指定新虚拟机的名称。
- `--file <path>`:指定新虚拟机磁盘文件的存储位置。
使用 **virt-clone**
克隆虚拟机(克隆到已有逻辑卷):
创建新的逻辑卷,已经格式并挂载的文件也可以,但是相关逻辑卷没必要再格式,挂载与再挂载,在复制克隆机这个操作里面:
sudo lvcreate -L <size> -n <new_volume_name> <volume_group>
# 去除逻辑卷
sudo lvremove /dev/vg01/ubuntu_vm_clone3
# 分配这个新的逻辑卷
sudo lvcreate -L 20G -n ubuntu_clone4 vg01
使用 virt-clone
命令:
sudo virt-clone --original ubuntu20.04-2 --name ubuntu20.04-4 --file /dev/vg01/ubuntu_clone --check path_exists=off
sudo virt-clone --original ubuntu20.04-2 --name ubuntu20.04-4 --file /dev/vg01/ubuntu_clone --check path_exists=off
sudo virt-clone --original ubuntu20.04-2 --name ubuntu20.04-4 --file /dev/vg01/ubuntu_clone --check path_exists=off
sudo virt-clone --original ubuntu20.04-2 --name ubuntu20.04-5 --file /dev/vg01/ubuntu_clone3
sudo virt-clone --original ubuntu20.04-2 --name ubuntu20.04-6 --file /dev/vg01/ubuntu_clone4 --check path_exists=off
其实直接在命名一个不存在的lvm逻辑盘就好,复制时候会自动添加,如果先使用lvcreate创建,反而需要加一个–check path_exists=off,否则会报错。
克隆完成后,使用以下命令启动新虚拟机:
sudo virsh start <new_vm_name>
例如:
sudo virsh start ubuntu-vm-clone
克隆后的配置注意事项
克隆后的虚拟机与源虚拟机完全相同,因此你可能需要进行一些配置更改以避免冲突,注意要改完ip还有其他内容之后,在全部打开。首先要确定这些修改是要登录到虚拟机内部,还是要到外面用virt-manager里进行修改。
修改主机名
主机名是虚拟机在网络上的标识,克隆后最好更改它以避免与原虚拟机冲突。
对于Ubuntu 系统来说
- 编辑
**/etc/hostname**
文件:
使用以下命令打开 hostname
文件:
sudo vim /etc/hostname
将内容替换为新的主机名,然后保存并退出。
- 编辑
**/etc/hosts**
文件:
打开 /etc/hosts
文件:
sudo vim /etc/hosts
找到指向旧主机名的行,更新为新的主机名。例如:
127.0.1.1 test02
- 应用更改:
重新启动虚拟机或手动设置主机名:
sudo hostnamectl set-hostname test02
sudo hostnamectl set-hostname lxy
修改 IP 地址
如果虚拟机使用静态 IP 地址,您需要修改 IP 地址以避免网络冲突。
- 使用ping查看ip是否可用
也可以安装nmap,扫描整个IP段,找出被占用的ip
sudo apt-get install nmap
sudo nmap -sn 192.168.1.0/24
#-sn 参数表示只进行Ping扫描,不进行端口扫描。扫描结
果会列出在这个IP段中被占用的IP地址。未列出的IP地址可能是可用的。
- 选择可用ip,进行网络配置:
根据 Ubuntu 版本,网络配置文件的位置可能有所不同:
- **Ubuntu 18.04 及以上使用 Netplan**:
打开 netplan
配置文件:
ls /etc/netplan/
sudo vim /etc/netplan/01-netcfg.yaml
sudo vim /etc/netplan/00-installer-config.yaml
找到 addresses:
部分,修改 IP 地址。
- **Ubuntu 16.04 及更早版本使用 **`**/etc/network/interfaces**`** 文件**:
打开网络接口配置文件:
sudo nano /etc/network/interfaces
找到相关接口配置并修改 IP 地址。
- 应用更改:
保存文件后,应用更改:
- 对于 `Netplan`:
sudo netplan apply
- 对于 `/etc/network/interfaces` 文件:
sudo systemctl restart networking
修改 MAC 地址(可选)
有时,您可能需要修改网络接口的 MAC 地址,特别是在使用 DHCP 分配 IP 的情况下。
- 编辑网络接口配置:
如果您使用的是 Netplan
,可以直接在 netplan
配置文件中指定新的 MAC 地址:
network:
version: 2
ethernets:
eth0:
macaddress: 00:16:3e:xx:xx:xx # 修改为新的MAC地址
- 使用
**ip link**
命令修改:
您也可以临时修改 MAC 地址,直到重启:
sudo ip link set dev eth0 address 00:16:3e:xx:xx:xx
确保新的虚拟机有不同的 MAC 地址和 IP 地址,避免网络冲突。如果没有自动生成新的 MAC 地址,可以手动在 **virt-manager**
中编辑。
修改用户名和用户目录
如果您需要更改克隆后的虚拟机用户名,可以按照以下步骤操作,这一步需要切换到root用户来实现:
- 创建root用户登录密码:
如果你想设置或更改 root
用户的密码,可以使用以下命令:
#设置密码
sudo passwd root
#切换用户
su - root
su - hadoop3
#添加新的用户并赋予root权限
#创建新用户
sudo adduser newusername
# 将新用户添加到 sudo 组
sudo usermod -aG sudo newusername
#切换到新用户并验证权限
su - newusername
sudo -i
系统会提示你输入并确认 root
用户的新密码。设置完成后,root
用户就可以使用该密码登录
如果要用ssh远程连接,需要以下操作,不然有下面报错
相关远程连接的修改如下:
sudo vim /etc/ssh/sshd_config
# 找到 PermitRootLogin 这一行,并将其设置为 yes
PermitRootLogin yes
#保存并退出
#重启SSH服务
sudo systemctl restart ssh
- 使用
sudo passwd root
设置或更改root
用户的密码。 - 启用
root
登录,如果需要通过 SSH 登录,可以编辑/etc/ssh/sshd_config
文件并重启 SSH 服务。 - 你也可以创建新的用户并赋予
sudo
权限,作为一种替代方案
- 修改用户名:
使用 usermod
命令修改用户名:
#切换到root用户
sudo -i
#列出用户进程
ps -u hadoop2
sudo kill -9 913
#终止多个用户进程
sudo pkill -u hadoop2
#修改用户名
sudo usermod -l hadoop3 hadoop2
- 修改用户主目录:
如果需要更改用户主目录,请执行以下操作:
sudo usermod -d /home/newusername -m newusername
sudo usermod -d /home/hadoop3 -m hadoop3
- 验证修改:
getent passwd | grep hadoop3
ls -l /home/hadoop3
这将移动旧的用户主目录并重命名为新的目录。
检查和修改服务配置
如果虚拟机上运行了某些服务,确保这些服务的配置文件不依赖于旧的主机名或 IP 地址。例如,Web 服务器、数据库等服务可能需要在克隆后重新配置。
删除虚拟机总结
删除虚拟机的过程,主要包括这几步,首先列出所有虚拟机,再关闭虚拟机,然后删除虚拟机定义(注意顺便删除快照),以及删除对应的磁盘和逻辑卷,并取消挂载和删除挂载目录,最后使用lsblk或者df -h检查是否删除成功。以下是上面步骤的命令:
#列出所有虚拟机
sudo virsh list --all
#关闭虚拟机
sudo virsh shutdown ubuntu20.04-2-clone
# 删除虚拟机包括快照
sudo virsh undefine ubuntu20.04-2-clone --snapshots-metadata
#如果磁盘文件未挂载为逻辑卷而是普通文件
sudo rm -f /var/lib/libvirt/images/myvm.qcow2
#如果虚拟机的磁盘是通过 LVM 逻辑卷管理的
sudo umount /dev/vg01/ubuntu20.04-2-clone
#删除逻辑卷,当有双破折号时,可以使用引号或转义字符来删除
sudo lvs
sudo lvremove /dev/vg01/
#正确做法
sudo lvremove "/dev/vg01/ubuntu20-clone.04-2"
sudo lvremove /dev/vg01/ubuntu20\-\-clone.04\-\-2
#删除挂载点
sudo rmdir /mnt/myvm_mount
# 确认和检查
lsblk
sudo lvs
sudo lsblk
#注意使用lsblk中,不要把-全部包括进去,有一个是之分隔符
复制与删除vm总结
- 使用
virt-manager
图形界面或virt-clone
命令行工具克隆虚拟机。 - 克隆完成后,启动新虚拟机并检查配置,以确保没有网络或主机名冲突。
- 复制时候要修改主机名与ip的映射
- 修改新的主机的ip以及用户名,要登录对应主机去实操,修改用户名的话,需要添加root用户
- 删除的时候注意顺带删除逻辑卷,而逻辑卷名字注意不要被盘分隔符“-”干扰
- 复制时候,会在原lvm盘对应存储池默认创建新的,可以自己指定名称,这时候不要挂载,因为存储池已经挂载过了
- 查找可用ip可以使用ping逐个测试,也可以使用安装nmap,扫描整个IP段,找出被占用的ip,然后设置未被占用的ip来进行后续操作
3.3、管理虚拟机命令总结
命令 | 用途 | 示例 |
---|---|---|
virsh list --all | 列出所有虚拟机 | sudo virsh list --all |
virsh start <vm_name> | 启动指定虚拟机 | sudo virsh start ubuntu-vm |
virsh shutdown <vm_name> | 关闭指定虚拟机 | sudo virsh shutdown ubuntu-vm |
virsh destroy <vm_name> | 强制关闭虚拟机(相当于电源断开) | sudo virsh destroy ubuntu-vm |
virsh reboot <vm_name> | 重启虚拟机 | sudo virsh reboot ubuntu-vm |
virsh suspend <vm_name> | 挂起虚拟机 | sudo virsh suspend ubuntu-vm |
virsh resume <vm_name> | 恢复挂起的虚拟机 | sudo virsh resume ubuntu-vm |
virsh undefine <vm_name> | 删除虚拟机定义(不会删除磁盘) | sudo virsh undefine ubuntu-vm |
virsh define <xml_file> | 通过 XML 文件定义虚拟机 | sudo virsh define /path/to/vm.xml |
virsh edit <vm_name> | 编辑虚拟机的 XML 配置文件 | sudo virsh edit ubuntu-vm |
virsh console <vm_name> | 连接到虚拟机的控制台 | sudo virsh console ubuntu-vm |
virsh dominfo <vm_name> | 显示虚拟机的详细信息 | sudo virsh dominfo ubuntu-vm |
virsh domiflist <vm_name> | 列出虚拟机的网络接口 | sudo virsh domiflist ubuntu-vm |
virsh domblklist <vm_name> | 列出虚拟机的磁盘设备 | sudo virsh domblklist ubuntu-vm |
virsh snapshot-list <vm_name> | 列出虚拟机的快照 | sudo virsh snapshot-list ubuntu-vm |
virsh snapshot-create-as <vm_name> <snapshot_name> | 创建快照 | sudo virsh snapshot-create-as ubuntu-vm snapshot1 |
virsh snapshot-revert <vm_name> <snapshot_name> | 恢复快照 | sudo virsh snapshot-revert ubuntu-vm snapshot1 |
virt-clone --original <vm_name> --name <new_vm_name> --file <new_disk_image> | 克隆虚拟机 | sudo virt-clone --original ubuntu-vm --name ubuntu-vm2 --file /mnt/vm2/ubuntu-vm2.qcow2 |
virsh attach-disk <vm_name> <disk_path> <target_dev> | 向虚拟机添加磁盘 | sudo virsh attach-disk ubuntu-vm /path/to/disk.qcow2 vdb |
virsh detach-disk <vm_name> <target_dev> | 从虚拟机移除磁盘 | sudo virsh detach-disk ubuntu-vm vdb |
virsh attach-interface <vm_name> --type bridge --source <bridge_name> | 向虚拟机添加网络接口 | sudo virsh attach-interface ubuntu-vm --type bridge --source br0 |
virsh detach-interface <vm_name> --type bridge --mac <mac_address> | 从虚拟机移除网络接口 | sudo virsh detach-interface ubuntu-vm --type bridge --mac 52:54:00:6b:29:55 |
说明
**virsh list --all**
:列出所有虚拟机,包括正在运行和已关闭的虚拟机。**virsh start**
** 和 ****virsh shutdown**
:用于启动和正常关闭虚拟机。**virsh destroy**
:强制关闭虚拟机,相当于直接断电。**virsh reboot**
:重启虚拟机。**virsh suspend**
** 和 ****virsh resume**
:用于挂起和恢复虚拟机。**virsh undefine**
:删除虚拟机定义,但不删除虚拟机的磁盘映像。**virsh define**
** 和 ****virsh edit**
:用于定义和编辑虚拟机的 XML 配置文件。**virsh console**
:连接到虚拟机的控制台,可以进行命令行操作。**virsh dominfo**
:显示虚拟机的详细信息,如状态、CPU 和内存使用情况。**virsh domiflist**
** 和 ****virsh domblklist**
:列出虚拟机的网络接口和磁盘设备。**virsh snapshot**
** 系列命令**:用于创建、列出和恢复虚拟机的快照。**virt-clone**
:用于克隆虚拟机,生成新的虚拟机实例。**virsh attach-disk**
** 和 ****virsh detach-disk**
:用于向虚拟机添加或移除磁盘。**virsh attach-interface**
** 和 ****virsh detach-interface**
:用于向虚拟机添加或移除网络接口。
4 遇到的问题和解决方案
4.1、没必要纠结用virsh命令安装虚拟机
虽然可以,但没必要,主要是virt-manager非常好用,同时现在VNC不好下载,快点把集群搭出来,然后思考怎么搞创新,怎么把毕设的文章写出来,顺便谢谢小论文
4.2、在调整虚拟机磁盘这里卡顿了一下
其实完全可以跳过这一步,找了几个方法,都不对,后面还是精确提问解决的,要给出自己的条件,以及准确描述自己遇到的问题,然后相关问题才能解决,就像代码调试里面的打断点,道理是一样的。
5 总结与下一步计划
高效管理虚拟机,在自己最开始看来,就是掌握一些工具,能够掌握最基础的curd逻辑,在关于创建的逻辑前面有,目前自己需要的是能够高效的修改虚拟机的配置,能够更好的适应后续多种实验需求。然后这里面很多修改,都是连环修改,改一个,后面同步修改的地方有很多。
下一步主要是,先看一些视频,了解小规模微集群搭建方法,当一个微集群成功,则可以应用到更大范围的集群当中,而目前自己对创建虚拟机也算是登堂入室,可以进一步了解虚拟机内部的一些指令,以便更好创建集群。
- 在进行clone时,virt-manager里面直接默认就好
- 要在脑子里回顾,结合之前的一些实验,总结理解里面一些操作,理清楚里面一些概念和操作的逻辑与步骤
- 遇到问题,可以先跳过,问问gpt再开展实验,同时要马上记录相关问题
- 找一下这里面的创新点与难点
- 下一步学习计划:Linux命令与shell编程以及看别人微集群搭建经验
- 针对概念,进行强化,然后不懂的单词要问google,知道怎么读
关于经验的话,以后遇到不能通信要往这些方向去想,去思考。
6 参考链接与书籍
- Unix/Linux系统管理技术手册
- chatgpt