date: 2021-02-04title: kvm存储池与存储卷 #标题
tags: kvm #标签
categories: kvm # 分类
kvm存储池管理
存储池用于存放虚机的磁盘文件及iso文件,默认使用本地目录作为存储池,存储池大概有如下几种类型:
- 基于目录的存储池
- 基于磁盘的存储池
- 基于分区的存储池
- 基于LVM的存储池
- 基于iscsi的存储池
- 基于nfs的存储池
基于目录的存储池
$ mkdir /data2# guest_images:池名称# dir:存储池类型为目录类型$ virsh pool-define-as guest_images dir --target "/data2"
基于物理磁盘的存储池
# 更改磁盘类型为gpt$ parted -s /dev/sdb mklabel gpt$ cat /tmp/device.xml # 定义文件内容如下<pool type='disk'><name>local_disk</name><source><device path='/dev/sdb'/><format type='gpt'/></source><target><path>/dev</path></target></pool># source为/dev/sdb# target为:/dev/# 从文件中定义存储池$ virsh pool-define /tmp/device.xml# 启动并设置为开机自启$ virsh pool-start local_disk$ virsh pool-autostart local_disk
基于分区的存储池
分区格式化后,libvirtd会自动mount指定的分区。
# 创建分区并格式化$ parted -s /dev/sdb mklabel gpt$ parted /dev/sdb mkpart primary xfs 0% 100%$ mkfs.xfs /dev/sdb1# 创建基于分区的存储池$ virsh pool-define-as parted_pool fs \--source-dev "/dev/sdb1" --target "/data3"# 查看所有存储池$ virsh pool-list --all名称 状态 自动开始-------------------------------------------disk 活动 是guest_images 不活跃 否iso 活动 是parted_pool 不活跃 否# 启动新创建的存储池$ virsh pool-build parted_pool # 仅在第一次启动前需要执行$ virsh pool-start parted_pool # 启动$ virsh pool-autostart parted_pool # 开机自启
基于lvm的存储池
# --source-dev: 指定硬盘设备,事先无卷组时此项才需要指定# --source-name: 指定已有卷组名,此项利用已有卷组创建存储池才需指定,事先无卷组无需指定# --target:指定vg放在哪里# 如果有卷组请执行$ virsh pool-define-as test_lvm logical --source-name=vg_name --target=/dev/vg_libvirt# 如果没有卷组,请执行$ virsh pool-define-as test_lvm logical --source-dev=/dev/sdb --target=/dev/vg_libvirt# 启动新创建的存储池$ virsh pool-build test_lvm # 仅在第一次启动前需要执行$ virsh pool-start test_lvm$ virsh pool-autostart test_lvm$ virsh pool-list --all # 确认状态正常名称 状态 自动开始-------------------------------------------test_lvm 活动 是# 当可以查看到 test_lvm 这个存储池时# 也可以通过vgscan命令查看到相应的vg# 而当后面我们基于此存储池创建存储卷后# 也可以通过lvscan查看到相应的lv卷
如果要使用lvm的存储池创建存储卷并安装虚机,则需要用--disk vol=test_lvm/lvvol1 来指定磁盘文件,其中test_lvm是存储池名称,lvvol1是存储卷名称。
基于iscsi的存储池
iscsi实现网络存储,提供存储端叫 Target,使用存储端叫 Initiator,Target 上可以提供存储空间,Initiator负责连接ISCSI设备,在ISCSI设备中创建文件系统,以及存取数据,在 Initiator 上看上去是多了一块硬盘。
在SAN中,主机一般都是指Initiator,存储设备则是Target。Initiator是SCSI会话的发起方,负责向Target请求LUN,并将数据的读写指令发送给Target。Target是接受SCSI会话的一方,它负责接受来自Initator的指令,为Initiator提供LUN,并实现对LUN的读写。
这里基于iscsi的存储池是使用Linux-IO来实现的,其在linux内核中,用软件实现各种SCSI Target。
Linux_IO简称LIO,其可以使用ram、disk、directory来作为它对外提供的存储设备。
配置Target
这里需要单独准备一台机器,用作于Target。
如下操作在Target的机器上进行,以便创建各种LUN。此机器需要准备未格式化的磁盘,用于对外提供存储。
# 安装target客户端$ yum -y install targetcli# 格式化新磁盘以便给target使用$ parted -s /dev/sdb mklabel gpt$ parted /dev/sdb mkpart primary xfs 0% 100%$ targetcli # 进入target交互模式中# target交互模式中,类似于shell,支持自动补全、ls、cd等命令/> ls / # 查看有哪些东西o- / ................................................................... [...]o- backstores ........................................................ [...]| o- block ............................................ [Storage Objects: 0]| o- fileio ........................................... [Storage Objects: 0]| o- pscsi ............................................ [Storage Objects: 0]| o- ramdisk .......................................... [Storage Objects: 0]o- iscsi ...................................................... [Targets: 0]o- loopback ................................................... [Targets: 0]# 上面的 backstores 目录下对应的就是不同类型的存储# 如:block(块存储)、fileio(文件存储)、ramdisk(基于内存的存储)# 基于/dev/sdb1创建块存储$ targetcli # 进入target交互模式中/> cd backstores/block# 使用/dev/sdb1创建块存储并命名为 block1/backstores/block> create block1 dev=/dev/sdb1Created block storage object block1 using /dev/sdb1.# 基于/tmp/data1.img 创建文件存储> cd /backstores/fileio# 基于/tmp/data1.img 文件创建一个10G的存储/backstores/fileio> create fileio1 /tmp/data1.img 10GCreated fileio fileio1 with size 10737418240# 查看本地文件,发现大小为10G$ ll -sh /tmp/data1.img0 -rw-r--r--. 1 root root 10G 2月 3 21:24 /tmp/data1.img$ du -sh /tmp/data1.img # 但du命令统计大小为 00 /tmp/data1.img# 基于内存创建内存存储> cd /backstores/ramdisk> create randisk1 1G # 使用1G的内存空间创建内存存储Created ramdisk randisk1 with size 1G.# 当创建成功后,你的内存剩余可用空间将减少1G
当上面各种类型都创建完成后,此时看一下 / ,返回结果如下:

当可以看到上面的信息后,说明我们后端存储已创建完毕,那么现在就可以创建一个ISCSI Target了,如下:
$ targetcli/> cd iscsi# iscsi target的命名必须以 iqn, naa, eui其中之一开头。# 我这里命名为:iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6 ,冒号后面建议写本机主机名称/iscsi> create iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6Created target iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6.Created TPG 1.Global pref auto_add_default_portal=trueCreated default portal listening on all IPs (0.0.0.0), port 3260./iscsi> ls # 查看上面命令执行后生成的信息o- iscsi ............................................................ [Targets: 1]o- iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6 ......................... [TPGs: 1]o- tpg1 ............................................... [no-gen-acls, no-auth]o- acls .......................................................... [ACLs: 0]o- luns .......................................................... [LUNs: 0]o- portals .................................................... [Portals: 1]o- 0.0.0.0:3260 ..................................................... [OK]# 将存储对象与target进行mapping/> cd /iscsi/iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6/tpg1/luns/iscsi/iqn.20...0-6/tpg1/luns> create /backstores/block/block1Created LUN 0./iscsi/iqn.20...0-6/tpg1/luns> create /backstores/fileio/fileio1Created LUN 1./iscsi/iqn.20...0-6/tpg1/luns> create /backstores/ramdisk/randisk1Created LUN 2.# 到Initiator查看其IQN(如下操作,是谁要挂载iSCSI就到哪个机器上查看)$ yum install -y iscsi-initiator-utils$ cat /etc/iscsi/initiatorname.iscsi # 查看iSCSI名称,名称可自定义InitiatorName=iqn.2021-02.com.redhat:pod7-dmz-20-10$ systemctl restart iscsid # 如果更改了本机的IQN,则需要重启此服务,以便更新IQN# 在target存储机器上,为Initiator客户端创建acl/> cd /iscsi/iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6/tpg1/acls # 切换到此目录# 下面指定的IQN名字,是Initiator客户端查看到的IQN/iscsi/iqn.20...0-6/tpg1/acls> create iqn.2021-02.com.redhat:pod7-dmz-20-10Created Node ACL for iqn.2021-02.com.redhat:pod7-dmz-20-10Created mapped LUN 2.Created mapped LUN 1.Created mapped LUN 0.# 保存设置并退出/> saveconfig/> exit
最后查看target的 / ,返回信息如下:

启动target服务
$ systemctl enable target$ systemctl start target
配置Initiator使用target
# 需要保证和target服务器网络可通$ telnet 192.168.20.6 3260# 发现target的IQN,--portal 指定的IP是target服务器的IP$ iscsiadm --mode discovery --type sendtargets --portal 192.168.20.6192.168.20.6:3260,1 iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6# 登录到target的IQN$ iscsiadm -d2 -m node --login # 如果提示如下,则表示登录失败iscsiadm: Max file limits 1024 4096iscsiadm: default: Creating session 1/1Logging in to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] (multiple)iscsiadm: Could not login to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260].iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)iscsiadm: Could not log into all portals# 可能是 名称与服务端acl设置的名称不一致 或者 未更新客户端的IQN$ systemctl restart iscsid # 客户端重启iscsid服务,以便更新本机IQN$ iscsiadm -d2 -m node --login # 再次登录,输出如下,表示成功登录到target服务器iscsiadm: Max file limits 1024 4096iscsiadm: default: Creating session 1/1Logging in to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] (multiple)Login to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] successful.

# 如果不需要使用了,可以执行如下命令,退出target登录状态$ iscsiadm -d2 -m node --logoutiscsiadm: Max file limits 1024 4096Logging out of session [sid: 4, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260]Logout of [sid: 4, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] successful.$ lsblk # 再次查看,刚才挂载的块设备也不见了NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 100G 0 disk├─sda1 8:1 0 1G 0 part /boot└─sda2 8:2 0 99G 0 part├─centos-root 253:0 0 50G 0 lvm /├─centos-swap 253:1 0 2G 0 lvm [SWAP]└─centos-home 253:2 0 47G 0 lvm /homesdb 8:16 0 100G 0 disksr0 11:0 1 1024M 0 rom
kvm中使用iSCSI创建存储池
$ virsh pool-list --all # 确认现有存储池名称 状态 自动开始-------------------------------------------disk 活动 是iso 活动 是test_lvm 活动 是$ lsblk # 查看现有本地磁盘NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 100G 0 disk├─sda1 8:1 0 1G 0 part /boot└─sda2 8:2 0 99G 0 part├─centos-root 253:0 0 50G 0 lvm /├─centos-swap 253:1 0 2G 0 lvm [SWAP]└─centos-home 253:2 0 47G 0 lvm /homesdb 8:16 0 100G 0 disksr0 11:0 1 1024M 0 rom# 创建基于iSCSI的存储池# --source-host:指定target主机IP# --source-dev:指定target主机的IQN名字# --target:必须指定为本机的 /dev/disk/by-path 目录$ virsh pool-define-as --name iscsi_storge --type iscsi \--source-host 192.168.20.6 \--source-dev iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6 \--target /dev/disk/by-path定义池 iscsi_storge# 启动此存储池$ virsh pool-start iscsi_storge池 iscsi_storge 已启动# 开启自动启动$ virsh pool-autostart iscsi_storge池 iscsi_storge 标记为自动启动# 查看所有存储池$ virsh pool-list --all名称 状态 自动开始-------------------------------------------disk 活动 是iscsi_storge 活动 是iso 活动 是test_lvm 活动 是# 查看本地磁盘设备$ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 100G 0 disk├─sda1 8:1 0 1G 0 part /boot└─sda2 8:2 0 99G 0 part├─centos-root 253:0 0 50G 0 lvm /├─centos-swap 253:1 0 2G 0 lvm [SWAP]└─centos-home 253:2 0 47G 0 lvm /homesdb 8:16 0 100G 0 disksdc 8:32 0 20G 0 disksdd 8:48 0 1G 0 disksde 8:64 0 10G 0 disksr0 11:0 1 1024M 0 rom
通过上面不难发现,我们通过kvm来使用iSCSI存储时,kvm会自动帮我们做发现、登录target等操作。
基于nfs的存储池
准备一台机器,用作于nfs服务器。
# 如下是配置一个简单的nfs服务器$ yum -y install nfs-utils rpcbind$ systemctl enable nfs rpcbind$ cat /etc/exports/data 192.168.20.0/24(rw,sync,no_root_squash)$ systemctl start rpcbind nfs$ exportfs -av # 确认目录已共享exporting 192.168.20.0/24:/data
然后到kvm主机上,执行如下:
$ showmount -e 192.168.20.6 # 确认可以查看到共享目录Export list for 192.168.20.6:/data 192.168.20.0/24# 创建基于nfs的存储卷# --source-host:指定nfs主机# --source-path:指定nfs共享目录# --target:指定挂在到本地哪个路径$ virsh pool-define-as nfspool --type netfs \--source-host 192.168.20.6 \--source-path /data \--target /data/kvm/nfs_pool# 构建池$ virsh pool-build nfspool# 启动池并设置为开机自启$ virsh pool-start nfspool && virsh pool-autostart nfspool# 确认存储池已存在$ virsh pool-list --all | grep nfspoolnfspool 活动 是
存储池运维命令
查看存储池列表
$ virsh pool-list名称 状态 自动开始-------------------------------------------disk 活动 是iso 活动 是
查看某个存储池的详细信息
$ virsh pool-info disk名称: diskUUID: 553ec16d-fffe-4b85-a2ab-f0d1c8930666状态: running持久: 是自动启动: 是容量: 49.98 GiB分配: 9.07 GiB可用: 40.90 GiB
查看存储池中的卷信息
$ virsh vol-list disk名称 路径------------------------------------------------------------------------------vm01.qcow2 /data/kvm/disk/vm01.qcow2vm02.qcow2 /data/kvm/disk/vm02.qcow2
编辑存储池配置文件
# 对应/etc/libvirt/storage下的配置文件$ virsh pool-edit disk<pool type='dir'><name>disk</name><uuid>553ec16d-fffe-4b85-a2ab-f0d1c8930666</uuid><capacity unit='bytes'>53660876800</capacity><allocation unit='bytes'>9741123584</allocation><available unit='bytes'>43919753216</available><source></source><target><path>/data/kvm/disk</path><permissions><mode>0755</mode><owner>0</owner><group>0</group></permissions></target></pool>
删除存储池
# parted_pool为存储池名称$ virsh pool-destroy parted_pool$ virsh pool-delete parted_pool$ virsh pool-undefine parted_pool
kvm存储卷管理
存储卷是基于存储池的,存储池被分割为多个存储卷,存储卷可以是虚拟磁盘文件、物理分区、lvm逻辑卷以及libvirt管理的其他类型存储的抽象。
存储卷相关管理指令如下:
$ virsh # 进入virsh交互终端模式virsh # help volumeStorage Volume (help keyword 'volume'):vol-clone 克隆卷。vol-create-as 从一组变量中创建卷vol-create 从一个 XML 文件创建一个卷vol-create-from 生成卷,使用另一个卷作为输入。vol-delete 删除卷vol-download 将卷内容下载到文件中vol-dumpxml XML 中的卷信息vol-info 存储卷信息vol-key 为给定密钥或者路径返回卷密钥vol-list 列出卷vol-name 为给定密钥或者路径返回卷名vol-path 为给定密钥或者路径返回卷路径vol-pool 为给定密钥或者路径返回存储池vol-resize 创新定义卷大小vol-upload 将文件内容上传到卷中vol-wipe 擦除卷# 创建存储卷语法如下vol-create-as <pool> <name> <capacity> [--allocation <string>] [--format <string>] [--backing-vol <string>] [--backing-vol-format <string>] [--prealloc-metadata] [--print-xml]DESCRIPTION创建一个卷。OPTIONS[--pool] <string> 池名称[--name] <string> 卷的名称[--capacity] <string> 卷大小,以整数计(默认为字节)--allocation <string> 初始化分配大小,以整数计(默认为 KiB)--format <string> 文件格式类型:raw、bochs、qcow、qcow2、qed、vmdk--backing-vol <string> 提取快照时的后端卷--backing-vol-format <string> 提取快照时的后端卷格式--prealloc-metadata 预先分配的元数据(用于 qcow2 而不是整个分配)--print-xml 打印 XML 文档,但不能定义/创建
接下来所有存储卷的操作,都是基于上面创建的存储池进行的。如下,查看目前所有的存储池:
$ virsh pool-list名称 状态 自动开始-------------------------------------------disk 活动 是iscsi_storge 活动 是iso 活动 是nfspool 活动 是test_lvm 活动 是
基于目录的存储池中的存储卷管理
$ virsh pool-dumpxml disk # 确认此存储池为dir类型的<pool type='dir'><name>disk</name><uuid>553ec16d-fffe-4b85-a2ab-f0d1c8930666</uuid><capacity unit='bytes'>53660876800</capacity><allocation unit='bytes'>9779654656</allocation><available unit='bytes'>43881222144</available><source></source><target><path>/data/kvm/disk</path> # 存储池对应的目录<permissions><mode>0755</mode><owner>0</owner><group>0</group></permissions></target></pool># 确认当前存储池下的存储卷$ ls /data/kvm/disk/vm01.qcow2 vm02.qcow2# 创建存储卷$ virsh vol-create-as disk test_vol.qcow2 10G --format qcow2创建卷 test_vol.qcow2# 查询卷信息$ virsh vol-info test_vol.qcow2 --pool disk名称: test_vol.qcow2类型: 文件容量: 10.00 GiB分配: 196.00 KiB# 查询卷详细信息$ virsh vol-dumpxml test_vol.qcow2 --pool disk<volume type='file'><name>test_vol.qcow2</name><key>/data/kvm/disk/test_vol.qcow2</key><source></source><capacity unit='bytes'>10737418240</capacity><allocation unit='bytes'>200704</allocation><physical unit='bytes'>197120</physical><target><path>/data/kvm/disk/test_vol.qcow2</path><format type='qcow2'/><permissions><mode>0600</mode><owner>0</owner><group>0</group></permissions><timestamps><atime>1612411306.186183187</atime><mtime>1612411163.940871367</mtime><ctime>1612411163.942871372</ctime></timestamps></target></volume>$ ls /data/kvm/disk/ # 本地目录也多了相应的文件test_vol.qcow2 vm01.qcow2 vm02.qcow2
基于lvm存储池创建存储卷
其实,在基于lvm存储池中创建存储卷,实际呢,就是在vg中创建了对应的lv(逻辑卷)。
$ virsh pool-dumpxml test_lvm # 确保存在基于lvm的存储池<pool type='logical'><name>test_lvm</name><uuid>4d9ba51a-b866-46b7-8b62-b558cbc03122</uuid><capacity unit='bytes'>107369988096</capacity><allocation unit='bytes'>0</allocation><available unit='bytes'>107369988096</available><source><device path='/dev/sdb'/><name>test_lvm</name><format type='lvm2'/></source><target><path>/dev/test_lvm</path></target></pool># 创建卷lvvol1# test_lvm:是存储池名称# lvvol1:是要创建的存储卷名称# 10G:存储卷的大小# 注:基于lvm存储池创建存储卷时,不支持指定卷格式,如qcow2、raw等。$ virsh vol-create-as test_lvm lvvol1 10G创建卷 lvvol1# 依次继续创建第二个及第三个存储卷$ virsh vol-create-as test_lvm lvvol2 20G创建卷 lvvol2$ virsh vol-create-as test_lvm lvvol3 30G创建卷 lvvol3# 指定存储池名称,查看其中的存储卷$ virsh vol-list test_lvm名称 路径------------------------------------------------------------------------------lvvol1 /dev/test_lvm/lvvol1lvvol2 /dev/test_lvm/lvvol2lvvol3 /dev/test_lvm/lvvol3$ lvscan # 也可以查看到相应的lv逻辑卷ACTIVE '/dev/centos/swap' [2.00 GiB] inheritACTIVE '/dev/centos/home' [46.99 GiB] inheritACTIVE '/dev/centos/root' [50.00 GiB] inheritACTIVE '/dev/test_lvm/lvvol1' [10.00 GiB] inheritACTIVE '/dev/test_lvm/lvvol2' [20.00 GiB] inheritACTIVE '/dev/test_lvm/lvvol3' [30.00 GiB] inherit
其余类型的存储池都类似于lvm的创建存储卷方法,但iscsi类型的存储卷是不支持创建存储卷的,会报错如下:

虚机添加/删除存储卷
通过xml文件向虚拟机添加存储卷
$ virsh attach-device --help # 命令参数如下NAMEattach-device - 从一个XML文件附加装置SYNOPSISattach-device <domain> <file> [--persistent] [--config] [--live] [--current]DESCRIPTION从一个XML文件附加装置.OPTIONS[--domain] <string> domain name, id or uuid[--file] <string> XML 文件--persistent 让实时更改持久--config 影响下一次引导--live 影响运行的域--current 影响当前域# 上面是指定什么时候生效
$ virsh domblklist web01 # 确认当前虚机块设备目标 源------------------------------------------------vda /data/kvm/disk/vm01.qcow2hda -$ cat /tmp/add_disk.xml # 编写xml文件如下<disk type='file' device='disk'><driver name='qemu' type='qcow2'/><source file='/data/kvm/disk/test_vol.qcow2'/><target dev='vdb'/></disk># 添加设备到虚机$ virsh attach-device web01 /tmp/add_disk.xml --persistent成功附加设备# 确认虚机已成功添加磁盘$ virsh domblklist web01目标 源------------------------------------------------vda /data/kvm/disk/vm01.qcow2vdb /data/kvm/disk/test_vol.qcow2hda -
attac-disk命令行向虚拟机添加存储卷
$ virsh attach-disk web01 --source=/data/kvm/nfs_pool/nfs_2 --target=vdc成功附加磁盘
detach-disk删除虚机磁盘设备
上面添加的磁盘设备,可以使用detach-disk命令进行卸载。
$ virsh domblklist web01 # 确认现有磁盘设备目标 源------------------------------------------------vda /data/kvm/disk/vm01.qcow2vdb /data/kvm/disk/test_vol.qcow2vdc /data/kvm/nfs_pool/nfs_2hda -$ virsh detach-disk web01 vdb成功分离磁盘$ virsh detach-disk web01 vdc成功分离磁盘$ virsh domblklist web01 # 确认已删除磁盘设备目标 源------------------------------------------------vda /data/kvm/disk/vm01.qcow2hda -
克隆存储卷
$ virsh vol-list --pool disk # 确认当前存储卷名称 路径------------------------------------------------------------------------------test_vol.qcow2 /data/kvm/disk/test_vol.qcow2vm01.qcow2 /data/kvm/disk/vm01.qcow2vm02.qcow2 /data/kvm/disk/vm02.qcow2# 克隆disk存储池中的test_vol.qcow2为test2_vol.qcow2$ virsh vol-clone test_vol.qcow2 test2_vol.qcow2 --pool disk使用 test2_vol.qcow2 克隆的卷 test_vol.qcow2
虚拟磁盘离线访问工具
离线访问工具主要用于查看或虚机磁盘中的文件。
这种工具使用场景应该不会太多,故仅记录下工具的名称,以后有需要再深入研究吧。
注:使用离线工具修改磁盘中的文件时,虚机最好要处于离线状态,否则可能会坏文件系统。
guestfish shell
# 安装工具$ yum -y install guestfish*# 访问虚拟磁盘# --rw:以读写方式访问,也支持--ro 选项# -a:指定虚拟磁盘文件# -i:自动探测(自动检查分区等信息,并挂载到相应目录)# 第一次进入会比较慢$ guestfish --rw -a /data/kvm/disk/vm01.qcow2 -i# 也可以通过-d选项直接指定虚机的名称进入$ guestfish --rw -d web01 -iWelcome to guestfish, the guest filesystem shell forediting virtual machine filesystems and disk images.Type: ‘help’ for help on commands‘man’ to read the manual‘quit’ to quit the shell# 可以看到其自动探测到了系统版本,并挂载了相应分区Operating system: CentOS Linux release 7.6.1810 (Core)/dev/centos/root mounted on //dev/sda1 mounted on /boot/dev/centos/home mounted on /home><fs> ll / # 查看文件total 24dr-xr-xr-x. 18 root root 235 Feb 4 11:53 .drwxr-xr-x 19 root root 4096 Feb 4 14:50 ..lrwxrwxrwx. 1 root root 7 Jan 31 13:43 bin -> usr/bindr-xr-xr-x. 5 root root 4096 Jan 31 13:48 bootdrwxr-xr-x. 2 root root 6 Jan 31 13:42 devdrwxr-xr-x. 84 root root 8192 Jan 31 06:20 etcdrwxr-xr-x. 2 root root 6 Apr 11 2018 homelrwxrwxrwx. 1 root root 7 Jan 31 13:43 lib -> usr/liblrwxrwxrwx. 1 root root 9 Jan 31 13:43 lib64 -> usr/lib64drwxr-xr-x. 2 root root 6 Apr 11 2018 mediadrwxr-xr-x. 2 root root 6 Apr 11 2018 mntdrwxr-xr-x 2 root root 6 Feb 4 11:53 nfsdrwxr-xr-x. 3 root root 16 Jan 31 13:44 optdrwxr-xr-x. 2 root root 6 Jan 31 13:42 procdr-xr-x---. 4 root root 217 Feb 4 12:38 rootdrwxr-xr-x. 2 root root 6 Jan 31 13:42 runlrwxrwxrwx. 1 root root 8 Jan 31 13:43 sbin -> usr/sbindrwxr-xr-x. 2 root root 6 Apr 11 2018 srvdrwxr-xr-x. 2 root root 6 Jan 31 13:42 sysdrwxrwxrwt. 9 root root 4096 Feb 4 13:13 tmpdrwxr-xr-x. 13 root root 155 Jan 31 13:43 usrdrwxr-xr-x. 20 root root 282 Jan 31 06:20 var# 编辑文件><fs> edit /etc/sysconfig/network-scripts/ifcfg-eth0# 退出离线工具><fs> exit
