guestfish/libguestfs镜像管理工具简介
文章目录
- 简介
- guestfish
- libguestfs项目
- 例子
- 原理
- 代码
- libguestfs架构
- 参考
简介
guestfish
Guestfish 是libguestfs项目中的一个工具软件,提供修改虚机镜像内部配置的功能。它不需要把虚机镜像挂接到本地,而是为你提供一个shell接口,你可以查看、编辑和删除镜像内的文件。
Guestfish提供了结构化的libguestfs API访问,可以通过shell脚本、命令行或交互方式访问。它使用libguestfs并公开了guestfs API的所有功能。Libguestfs是一个用于访问和修改磁盘映像和虚拟机的库。
libguestfs项目
从官网的描述看,libguestfs项目是一些用来操作虚拟机镜像的工具和库的集合,从描述看在镜像管理方面很强大。
例子
一个简单查看镜像文件系统的例子:
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> help
Add disk images to examine using the ‘-a’ or ‘-d’ options, or the ‘add’
command.
Or create a new disk image using ‘-N’, or the ‘alloc’ or ‘sparse’ commands.
Once you have done this, use the ‘run’ command.For more information about a command, use ‘help cmd’.To read the manual, type ‘man’.><fs> add linux.qcow2
><fs> run100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ --:--
><fs> list-filesystems
/dev/sda1: vfat
/dev/sda2: ext4
/dev/sda3: swap
><fs>
可以看出,通过guestfish可以列出镜像里面的文件系统。
原理
在运行guestfish查看镜像的过程中,后台ps查看下qemu进程,可以找到这样一个进程:
/usr/bin/qemu-system-x86_64 -global virtio-blk-pci.scsi=off -no-user-config -nodefaults -display none -machine accel=kvm:tcg -cpu max,la57=off -m 1280 -no-reboot -rtc driftfix=slew -no-hpet -global kvm-pit.lost_tick_policy=discard -kernel /var/tmp/.guestfs-1000/appliance.d/kernel -initrd /var/tmp/.guestfs-1000/appliance.d/initrd -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-pci,rng=rng0 -device virtio-scsi-pci,id=scsi -drive file=/home/czw/vm/img/linux.qcow2,cache=writeback,id=hd0,if=none -device scsi-hd,drive=hd0 -drive file=/var/tmp/.guestfs-1000/appliance.d/root,snapshot=on,id=appliance,cache=unsafe,if=none,format=raw -device scsi-hd,drive=appliance -device virtio-serial-pci -serial stdio -chardev socket,path=/run/user/1000/libguestfsdU5W8O/guestfsd.sock,id=channel0 -device virtserialport,chardev=channel0,name=org.libguestfs.channel.0 -append panic=1 console=ttyS0 edd=off udevtimeout=6000 udev.event-timeout=6000 no_timer_check printk.time=1 cgroup_disable=memory usbcore.nousb cryptomgr.notests tsc=reliable 8250.nr_uarts=1 root=UUID=3c1ee3f6-e2da-41b9-ac29-ca925bafb519 selinux=0 quiet TERM=xterm-256color
这个进程让guestfish有了能够操作镜像的能力,分析这个qemu进程的参数:
- 指定虚机kernel为guestfish自己的
- 指定initrd为guestfish自己的
- 指定镜像文件为所操作的镜像文件
- 关联一个本地socket文件:/run/user/1000/libguestfsdU5W8O/guestfsd.sock
进一步查看这个本地socket文件谁在使用:
lsof /run/user/1000/libguestfsdU5W8O/guestfsd.sock
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
guestfish 18535 czw 6u unix 0x00000000649fd22e 0t0 192221 /run/user/1000/libguestfsdU5W8O/guestfsd.sock type=STREAM (CONNECTED)
至此,可以大致猜测出guestfish的实现原理:
- 使用自己定制的内核启动虚拟机并将待操作的磁盘文件分配给虚拟机,这里称该虚拟机为guest
- 通过本地socket文件,guestfish进程可以与guest中的某个程序通信,从而通过guest中的程序对磁盘文件进行操作
- 当guestfish退出的时候,自动销毁guest
代码
为了验证上面实验的猜想,可以直接下载源代码,guestfish是libguestfs项目的一部分,直接clone整个项目:
git clone https://github.com/libguestfs/libguestfscd libguestfsgit submodule update --initautoreconf -i./configure CFLAGS=-fPICmake
如果是debian/ubutnu的环境,参考https://manpages.ubuntu.com/manpages/noble/ja/man1/guestfs-building.1.html,安装编译依赖。
编译完,在fish/.lib文件夹下就是gestfish可执行程序,他的代码路径为:fish/fish.c
简单看下代码,核心是调用libguestfs库提供的guestfs_开头的函数,详细的流程直接看代码就好了。
libguestfs架构
直接展示官方的架构图:

大致思路就是:libguestfs通过rpc与qemu虚机内部的guestfsd通信,将对镜像的操作转换为通过guestfsd间接操作镜像。
参考
guestfish - the guest filesystem shell
libguestfs
guestfs-internals - architecture and internals of libguestfs
相关文章:
guestfish/libguestfs镜像管理工具简介
文章目录 简介guestfishlibguestfs项目 例子原理代码libguestfs架构参考 简介 guestfish Guestfish 是libguestfs项目中的一个工具软件,提供修改虚机镜像内部配置的功能。它不需要把虚机镜像挂接到本地,而是为你提供一个shell接口,你可以查…...
如何在centos中进行有效的网络管理
如何在centos中进行有效的网络管理? 在CentOS中,网络管理是系统管理员日常工作的重要组成部分,本文将详细介绍CentOS中的两种主要网络管理工具:传统的network服务和新一代的NetworkManager,帮助读者更好地配置和管理C…...
Oracle清空表后如何恢复数据
有时候忘记备份数据,把数据清空了,或者删除了,这时候怎么恢复数据呢,使用下面sql即可,替换对应的table和column INSERT INTO table1(column1,column2,column3 ) SELECTcolumn1,column2,column3 FROMtable1 AS OF time…...
ElasticSearch基础-文章目录
ElasticSearch学习总结1(环境安装) ElasticSearch学习总结2(基础查询) ElasticSearch学习总结3(.NetCore操作ES) ElasticSearch学习总结4(sql操作ES) ElasticSearch学习总结5&am…...
SpringMVC(二)原理
目录 一、配置Maven(为了提升速度) 二、流程&&原理 SpringMVC中心控制器 完整流程: 一、配置Maven(为了提升速度) 在SpringMVC(一)配置-CSDN博客的配置中,导入Maven会非…...
Selenium 自动化,如何下载正确的 ChromeDriver
在 Python 的 Selenium 自动化操作中,chromedriver 是不可或缺的驱动程序。没有正确安装对应版本的驱动,运行代码时常常会遇到报错问题,比如 “session not created: This version of ChromeDriver only supports Chrome version XX”。 今天…...
[Linux]redis5.0.x升级至7.x完整操作流程
1. 从官网下载最新版redis: 官网地址:https://redis.io/download 注:下载需要的登录,如果选择使用github账号登录,那么需要提前在github账号中取消勾选“Keep my email addresses private”(隐藏我的邮箱…...
Java字符编码与正则表达式深度解析
Java字符编码与正则表达式深度解析 1. 字符编码发展 1.1 ASCII 码 在计算机最初发明时,主要用于数值计算,但随着计算需求的增加,人们发现计算机可以用来处理文本信息。因此,将字符映射为数字来表示。 字母 ‘A’ 映射为 65&am…...
【C++】B2099 矩阵交换行
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述题目描述输入格式输出格式输入输出样例输入 #1输出 #1 💯题目分析💯不同解法分析我的做法实现步骤:优点:不足&#…...
论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 史丹,天津大学博士生 内容简介 大语言模型(LLM)经过海量数据训练后编码了丰富的世界知识。最近的研究表明,…...
edeg插件/扩展推荐:助力生活工作
WeTab 此插件在我看来有2个作用 1.改变edeg的主页布局和样式,使其更加精简,无广告 2.提供付费webtab Ai(底层是chatGpt) 沉浸式翻译 此插件可翻译网页的内容 假设我们浏览github 翻译前 翻译后 Better Ruler 可以对网页的距离进行测量 适合写前端的小伙伴 用法示例:...
基于Python读取ZIP和TAR格式压缩包教程
在数据处理和文件管理中,压缩包(如ZIP、TAR等格式)的使用非常普遍。Python提供了多种库来读取和处理这些压缩包。本文将介绍如何使用Python的内置库和第三方库来读取ZIP和TAR格式的压缩包。 1、读取ZIP文件 Python的zipfile模块提供了处理Z…...
懒人不下床型遥控方案--手机对电脑的简单遥控(无收费方案)
兄弟们,天气越发寒冷,不得不说,对像我这种喜欢看直播睡觉的懒狗越发的不友好了,每次昏昏欲睡但还要下床关直播的操作就像泡完温泉直接冲凉水澡,透心凉,心飞扬。 最进也是有时间找找合适的懒人方案解决这个…...
人工智能知识分享第八天-机器学习_泰坦尼克生存预估线性回归和决策树回归对比案例
泰坦尼克生存预估案例 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import classification_report import matplotlib.pyplot as plt from sklearn.tree import plot_t…...
html中下拉选框的基本实现方式及JavaScript动态修改选项内容情况总结
最近项目中使用到了下拉选项以及通过js判断动态改变选项值的相关操作,查询了一些相关内容,在此记录一下,以免后续再碰到布置如何书写。 一、html中下拉选框的基本方式 在 HTML 中,创建下拉选择框(也叫选择菜单&#…...
sql server期末复习
表操作 创建create 删除drop 修改alter 数据操作 查询 select from <tableName> 插入 insert into <tableName> values 修改 update <tableName> set 删除 delete from <tableName> 授权与收回对数据的操作权限 授予 grant <权…...
LabVIEW语言学习过程是什么?
学习LabVIEW语言的过程可以分为几个阶段,每个阶段的重点内容逐步加深,帮助你从入门到精通。以下是一个简洁的学习过程: 1. 基础入门阶段 理解图形化编程:LabVIEW是一种图形化编程语言,与传统的文本编程语言不同&am…...
小程序租赁系统开发的优势与应用前景分析
内容概要 小程序租赁系统是一种新兴的数字化解决方案,旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能,如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好,让用户能够轻松选择所需的商品或服务&…...
『SQLite』安装与基本命令语法
SQLite安装 Windows: 访问 SQLite 的安装网页:https://www.sqlite.org/download.html.向下滚动页面到“Precompiled Binaries for Windows”部分。下载适用于你的系统架构(32-bit 或 64-bit)的预编译二进制文件。将下载的 ZIP 文…...
Unity-Mirror网络框架-从入门到精通之Benchmark示例
文章目录 前言什么是Benchmark?Benchmark 简要说明Benchmark示例BenchmarkNetworkManagerMonsterMovementPlayerMovementInterestManagement性能指标 BenchmarkIdle示例BenchmarkPrediction示例BenchmarkStinkySteak示例 前言 在现代游戏开发中,网络功能…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
