首页 > 其他分享 >巧用guestfish工具修改kvm镜像

巧用guestfish工具修改kvm镜像

时间:2024-08-14 14:07:37浏览次数:11  
标签:guestfish kvm host out test copy root 巧用

场景1: KVM 虚拟机启动后,如果想ssh这个虚拟机,但是却不知道不知道默认的用户名和密码,这时可以利用guestfish 工具把自己的public sshkey注入到目标虚拟机,从而实现通过sshkey登录的目的。

1 得到虚拟机启动盘的qcow2镜像的位置

virsh dumpxml <VMName>
<devices>
    <emulator>/usr/bin/qemu-system-s390x</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='writethrough' error_policy='report'/>
      <source file='/mnt/a87990be-26b2-41d0-bc6b-70e22300bcd6/bv-r134-2e867184-f647-486f-ab3f-0905bcf38d26.qcow2' index='3'/>

2 在host上安装guestfish工具包
apt install libguestfs-tools

3 通过一个交互式shell进入image
root@c4828v1:/home# guestfish --rw -a bv-r134-2e867184-f647-486f-ab3f-0905bcf38d26.qcow2
><fs> run
 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ --:--
><fs> list-filesystems
/dev/sda1: ext4
><fs> mount /dev/sda1 /home/test
libguestfs: error: mount: mount: /home/test: mount point is not a directory //只能mount到/ 根目录下

><fs> mount /dev/sda1 /
><fs> ls /root/
.bash_history
.bashrc
.cache
.profile
.ssh
nftest
snap
><fs> ls /root/nftest //在源VM里面有nftest这个文件夹,这里可以看到源VM的/dev/sda1盘的内容
testdata
><fs>exit
当你使用guestfish shell找到可用文件系统类型之后,就可以进行挂载了。使用命令
mount /dev/sda1 / 来挂载第一个分区的内容。在guestfish中,你不能像在其他shell环境中一样操作目录。挂载的分区就是根目录,cd时所有的路径必须是完全限定路径,从根目录开始。
在guestfish shell当中可以使用像vi、ls、cat、more、download这样的命令,来查看和下载文件以及目录,输入help可以看到完整的命令信息。
在完整所有操作之后可以使用exit来关闭guestfish shell。

4 通过下面命令把key注入qcow2 image

image=bv-r134-2e867184-f647-486f-ab3f-0905bcf38d26.qcow2
ssh_public_key=test-public-key

root@c4828v1:/home# expect -c "
>   set timeout 12
>   spawn guestfish
>   expect \"><fs>\"
>   send \"add ${qcow2_image}\r\"
>   expect \"><fs>\"
>   send \"run\r\"
>   expect \"><fs>\"
>   send \"list-filesystems\r\"
>   expect \"><fs\"
>   send \"mount /dev/sda1 /\r\"
>   expect \"><fs>\r\"
>   send \"mkdir /root/.ssh \r\"
>   expect \"><fs>\r\"
>   send \"write '/root/.ssh/authorized_keys' '${ssh_public_key}' \r\"
>   expect \"><fs>\r\"
>   send \"quit\r\"
>   expect eof
> "
spawn guestfish

Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.

Type: ‘help’ for help on commands
      ‘man’ to read the manual
      ‘quit’ to quit the shell

><fs> add bv-r134-2e867184-f647-486f-ab3f-0905bcf38d26.qcow2
><fs> run
 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
><fs> list-filesystems
/dev/sda1: ext4
><fs> mount /dev/sda1 /
write '/root/.ssh/authorized_keys' 'test-public-key'
><fs> quit


验证是否成功:
root@c4828v1:/home# guestfish --rw -a bv-r134-2e867184-f647-486f-ab3f-0905bcf38d26.qcow2

Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.

Type: ‘help’ for help on commands
      ‘man’ to read the manual
      ‘quit’ to quit the shell

><fs> run
 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ --:--
><fs> fs
fs: unknown command
><fs> list-filesystems
/dev/sda1: ext4
><fs> mount /dev/sda1 /
><fs> cat /root/.ssh/authorized_keys  //key已经注入qcow2 image
test-public-key


场景:2 KVM虚拟机网络连不上的情况下,如果想备份里面的文件,可以利用copy-in/copy-out 的功能

><fs> help copy-out
NAME
    copy-out - copy remote files or directories out of an image

DESCRIPTION
     copy-out remote [remote ...] localdir

    "copy-out" copies remote files or directories recursively out of the
    disk image, placing them on the host disk in a local directory called
    "localdir" (which must exist). This guestfish meta-command turns into a
    sequence of "download", "tar-out" and other commands as necessary.

    Multiple remote files and directories can be specified, but the last
    parameter must always be a local directory. To download to the current
    directory, use "." as in:

     copy-out /home .

    Wildcards cannot be used in the ordinary command, but you can use them
    with the help of "glob" like this:

     glob copy-out /home/* .


 通过copy-out把虚拟机image中的文件夹拷贝到host上的 /root/testguestfish
><fs> copy-out /root/nftest /root/testguestfish  
><fs> ls /root
.bash_history
.bashrc
.cache
.profile
.ssh
nftest
snap

查看结果:
local host:
root@c4828v1:~/testguestfish# pwd
/root/testguestfish
root@c4828v1:~/testguestfish# ls
nftest


通过copy-in 在host 创建文件夹,然后把host上的文件夹copy到虚拟机image内部
root@c4828v1:~# mkdir -p test-copy-in-from-host
root@c4828v1:~# cd test-copy-in-from-host/
root@c4828v1:~/test-copy-in-from-host# ls
root@c4828v1:~/test-copy-in-from-host# touch test-copy-in
root@c4828v1:~/test-copy-in-from-host# pwd
/root/test-copy-in-from-host


在image内部通过guestfish 进行查看
><fs> mkdir /root/tst/
><fs> copy-in /root/test-copy-in-from-host/ /root/tst/
><fs> ls /root/tst/
test-copy-in-from-host

对qcow2 修改后,可以重新启动虚拟机,这时会发现修改都已经能生效

标签:guestfish,kvm,host,out,test,copy,root,巧用
From: https://www.cnblogs.com/happyorange/p/18358841

相关文章

  • KVM修改网络产生报错
    事件描述:用户尝试使用virsh命令启动名为default的虚拟网络,但遇到了错误。错误信息表明default网络无法启动,因为没有.service文件提供org.fedoraproject.FirewallD1这个名称。报错过程及结果:首先编辑了default网络的XML配置文件:[root@localhost~]#virshnet-......
  • KVM网络模式
    在KVM(Kernel-basedVirtualMachine)虚拟化环境中,有几种不同的网络模式可以用来配置虚拟机(VMs)的网络连接。这些模式主要通过libvirt工具来设置,libvirt是一个管理KVM和其他虚拟化技术的工具集。下面是KVM中常用的几种网络模式:Bridge(桥接)模式:描述:在这种模式下,虚拟机与宿......
  • 巧用Array.forEach:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提
    目录Vue.js中的Array.forEach:简化循环与增强代码可读性一、引言二、Array.forEach()的使用与技巧1、基本语法2、返回值3、使用Array.forEach()的优势4、Array.forEachvsfor循环5、Array.forEach()使用技巧三、Array.forEach()的应用情景1、复杂数据处理2、实时更......
  • 【python学习】巧用notedown:Markdown与Jupyter Notebook的高效互转指南
    在数据科学、教学、技术写作等领域,Markdown文件和JupyterNotebook都是非常重要的工具。notedown是一个轻量级的Python库,能够方便地将Markdown文件转换为JupyterNotebook,或将JupyterNotebook转换为Markdown文件。这篇博客将介绍notedown的基本用法、常见命......
  • kvm 虚拟化
    KVM(用于基于内核的虚拟机)是适用于x86硬件上的linux的完整虚拟化解决方案,包含虚拟化扩展(InterVT或AMD-V)。它由一个可加载的内核模块kvm.ko和一个处理器特定模块kvm-intel.ko或kvm--amd.ko组成使用KVM,可以运行多个未经修改的linux或windows映像的虚拟机。每个虚拟机都有私有......
  • kvm主机快照
    #默认是以时间戳命名快照,没有备注我们不好区别virshsnapshot-createdomain-name查看快照[root@kafka-1ssh]#virshsnapshot-listauto-clone2-bridge-vmNameCreationTimeState----------------------------------------------------......
  • KVM——存储池与快照
    目录KVM存储池的重要概念和功能KVM存储池的管理方式KVM存储池在虚拟机迁移中的作用制作存储池 存储池相关管理命令 KVM快照KVM快照的概念和作用注意事项在KVM(Kernel-basedVirtualMachine)虚拟化平台中,存储池(StoragePool)是用来管理和存储虚拟机镜像及其相关数据......
  • KVM——虚拟机添加设备与挂载磁盘
    目录一.图形化方式添加设备1. 添加磁盘2.添加网卡二.命令行形式添加设备 方式一: 方式二:磁盘格式raw和qcow2raw格式qcow2格式如何选择挂载磁盘 一.图形化方式添加设备 1. 添加磁盘2.添加网卡先关机给宿主机添加一块网卡查看宿主机新增的......
  • 部署KVM虚拟化平台
    一、基本概述1.KVM原理广义的KVM包含两部分,一部分是基于Linux内核支持KVM内核模块,另一部分是简化和修改Qemu。KVM内核模块处理器和内存支持虚拟机运行,Qemu主要处理I/O为用户提供空间工具进行处理。2.KVM三种工作模式客户模式:执行非I/O的客户代码,虚拟机运行在这个模式下......
  • KVM高级功能部署
            企业内部为了使服务器资源达到最大化利用,通常都会进行KVM虚拟化,每台服务器上运行多台KVM虚拟机。随着KVM虚拟机数量的不断增多,个别服务器会出现资源过载现象,这时候就需要对部分KVM虚拟机进行迁移,迁移到负载相对较低的服务器上。为了解决以上问题,针对可停......