当前位置: 首页 > news >正文

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进程的参数:

  1. 指定虚机kernel为guestfish自己的
  2. 指定initrd为guestfish自己的
  3. 指定镜像文件为所操作的镜像文件
  4. 关联一个本地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的实现原理:

  1. 使用自己定制的内核启动虚拟机并将待操作的磁盘文件分配给虚拟机,这里称该虚拟机为guest
  2. 通过本地socket文件,guestfish进程可以与guest中的某个程序通信,从而通过guest中的程序对磁盘文件进行操作
  3. 当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项目中的一个工具软件&#xff0c;提供修改虚机镜像内部配置的功能。它不需要把虚机镜像挂接到本地&#xff0c;而是为你提供一个shell接口&#xff0c;你可以查…...

如何在centos中进行有效的网络管理

如何在centos中进行有效的网络管理&#xff1f; 在CentOS中&#xff0c;网络管理是系统管理员日常工作的重要组成部分&#xff0c;本文将详细介绍CentOS中的两种主要网络管理工具&#xff1a;传统的network服务和新一代的NetworkManager&#xff0c;帮助读者更好地配置和管理C…...

Oracle清空表后如何恢复数据

有时候忘记备份数据&#xff0c;把数据清空了&#xff0c;或者删除了&#xff0c;这时候怎么恢复数据呢&#xff0c;使用下面sql即可&#xff0c;替换对应的table和column INSERT INTO table1(column1,column2,column3 ) SELECTcolumn1,column2,column3 FROMtable1 AS OF time…...

ElasticSearch基础-文章目录

ElasticSearch学习总结1&#xff08;环境安装&#xff09; ElasticSearch学习总结2&#xff08;基础查询&#xff09; ElasticSearch学习总结3&#xff08;.NetCore操作ES&#xff09; ElasticSearch学习总结4&#xff08;sql操作ES&#xff09; ElasticSearch学习总结5&am…...

SpringMVC(二)原理

目录 一、配置Maven&#xff08;为了提升速度&#xff09; 二、流程&&原理 SpringMVC中心控制器 完整流程&#xff1a; 一、配置Maven&#xff08;为了提升速度&#xff09; 在SpringMVC&#xff08;一&#xff09;配置-CSDN博客的配置中&#xff0c;导入Maven会非…...

Selenium 自动化,如何下载正确的 ChromeDriver

在 Python 的 Selenium 自动化操作中&#xff0c;chromedriver 是不可或缺的驱动程序。没有正确安装对应版本的驱动&#xff0c;运行代码时常常会遇到报错问题&#xff0c;比如 “session not created: This version of ChromeDriver only supports Chrome version XX”。 今天…...

[Linux]redis5.0.x升级至7.x完整操作流程

1. 从官网下载最新版redis&#xff1a; 官网地址&#xff1a;https://redis.io/download 注&#xff1a;下载需要的登录&#xff0c;如果选择使用github账号登录&#xff0c;那么需要提前在github账号中取消勾选“Keep my email addresses private”&#xff08;隐藏我的邮箱…...

Java字符编码与正则表达式深度解析

Java字符编码与正则表达式深度解析 1. 字符编码发展 1.1 ASCII 码 在计算机最初发明时&#xff0c;主要用于数值计算&#xff0c;但随着计算需求的增加&#xff0c;人们发现计算机可以用来处理文本信息。因此&#xff0c;将字符映射为数字来表示。 字母 ‘A’ 映射为 65&am…...

【C++】B2099 矩阵交换行

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述题目描述输入格式输出格式输入输出样例输入 #1输出 #1 &#x1f4af;题目分析&#x1f4af;不同解法分析我的做法实现步骤&#xff1a;优点&#xff1a;不足&#…...

论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 史丹&#xff0c;天津大学博士生 内容简介 大语言模型&#xff08;LLM&#xff09;经过海量数据训练后编码了丰富的世界知识。最近的研究表明&#xff0c…...

edeg插件/扩展推荐:助力生活工作

WeTab 此插件在我看来有2个作用 1.改变edeg的主页布局和样式,使其更加精简,无广告 2.提供付费webtab Ai(底层是chatGpt) 沉浸式翻译 此插件可翻译网页的内容 假设我们浏览github 翻译前 翻译后 Better Ruler 可以对网页的距离进行测量 适合写前端的小伙伴 用法示例:...

基于Python读取ZIP和TAR格式压缩包教程

在数据处理和文件管理中&#xff0c;压缩包&#xff08;如ZIP、TAR等格式&#xff09;的使用非常普遍。Python提供了多种库来读取和处理这些压缩包。本文将介绍如何使用Python的内置库和第三方库来读取ZIP和TAR格式的压缩包。 1、读取ZIP文件 Python的zipfile模块提供了处理Z…...

懒人不下床型遥控方案--手机对电脑的简单遥控(无收费方案)

兄弟们&#xff0c;天气越发寒冷&#xff0c;不得不说&#xff0c;对像我这种喜欢看直播睡觉的懒狗越发的不友好了&#xff0c;每次昏昏欲睡但还要下床关直播的操作就像泡完温泉直接冲凉水澡&#xff0c;透心凉&#xff0c;心飞扬。 最进也是有时间找找合适的懒人方案解决这个…...

人工智能知识分享第八天-机器学习_泰坦尼克生存预估线性回归和决策树回归对比案例

泰坦尼克生存预估案例 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判断动态改变选项值的相关操作&#xff0c;查询了一些相关内容&#xff0c;在此记录一下&#xff0c;以免后续再碰到布置如何书写。 一、html中下拉选框的基本方式 在 HTML 中&#xff0c;创建下拉选择框&#xff08;也叫选择菜单&#…...

sql server期末复习

表操作 创建create 删除drop 修改alter 数据操作 查询 select from <tableName> 插入 insert into <tableName> values 修改 update <tableName> set 删除 delete from <tableName> 授权与收回对数据的操作权限 授予 grant <权…...

LabVIEW语言学习过程是什么?

学习LabVIEW语言的过程可以分为几个阶段&#xff0c;每个阶段的重点内容逐步加深&#xff0c;帮助你从入门到精通。以下是一个简洁的学习过程&#xff1a; ​ 1. 基础入门阶段 理解图形化编程&#xff1a;LabVIEW是一种图形化编程语言&#xff0c;与传统的文本编程语言不同&am…...

小程序租赁系统开发的优势与应用前景分析

内容概要 小程序租赁系统是一种新兴的数字化解决方案&#xff0c;旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能&#xff0c;如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好&#xff0c;让用户能够轻松选择所需的商品或服务&…...

『SQLite』安装与基本命令语法

SQLite安装 Windows&#xff1a; 访问 SQLite 的安装网页&#xff1a;https://www.sqlite.org/download.html.向下滚动页面到“Precompiled Binaries for Windows”部分。下载适用于你的系统架构&#xff08;32-bit 或 64-bit&#xff09;的预编译二进制文件。将下载的 ZIP 文…...

Unity-Mirror网络框架-从入门到精通之Benchmark示例

文章目录 前言什么是Benchmark&#xff1f;Benchmark 简要说明Benchmark示例BenchmarkNetworkManagerMonsterMovementPlayerMovementInterestManagement性能指标 BenchmarkIdle示例BenchmarkPrediction示例BenchmarkStinkySteak示例 前言 在现代游戏开发中&#xff0c;网络功能…...

OpenRGB终极指南:如何用一款开源工具统一管理所有RGB设备

OpenRGB终极指南&#xff1a;如何用一款开源工具统一管理所有RGB设备 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/OpenRGB. Rel…...

Minecraft模组服务器一键部署终极指南:mrpack-install完整教程

Minecraft模组服务器一键部署终极指南&#xff1a;mrpack-install完整教程 【免费下载链接】mrpack-install Modrinth Modpack server deployment 项目地址: https://gitcode.com/gh_mirrors/mr/mrpack-install 还在为Minecraft模组服务器的繁琐部署流程而烦恼吗&#x…...

【ROS2 + MoveIT】从零上手系列:GUI界面下的机器人运动规划实战

1. ROS2与MoveIT初体验&#xff1a;打开机器人运动规划的大门 第一次接触ROS2和MoveIT的朋友们&#xff0c;恭喜你们打开了机器人开发的新世界&#xff01;作为一个在工业机械臂项目上摸爬滚打多年的老司机&#xff0c;我清楚地记得自己第一次看到Rviz里那个可以随意拖动的机械…...

从VXLAN到MPLS:数据中心网络为什么需要调大MTU值?9000字节配置实战

数据中心网络MTU优化实战&#xff1a;从1500到9000字节的跨越 在云计算和虚拟化技术蓬勃发展的今天&#xff0c;数据中心网络架构正经历着前所未有的变革。传统以太网1500字节的MTU&#xff08;最大传输单元&#xff09;标准&#xff0c;在面对VXLAN、MPLS等现代网络技术时显得…...

AI灵魂测试:SBTI揭秘真实人格

## 项目简介 SBTI (Soul-Based Type Indicator) 是一个基于 AI 的人格测试系统&#xff0c;使用 Next.js 15 NestJS Gemini 1.5 构建。 …...

Marimo 高危预认证 RCE 漏洞已遭活跃利用

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01;编译&#xff1a;代码卫士开源响应式 Python 笔记本平台 Marimo 中存在一个严重漏洞CVE-2026-39987&#xff08;CVSS评分9.3&#xff09;&#xff0c;攻击者无需认证即可实现远程代码执行 (RCE)&#xff0c;影响 Mari…...

3步打造专业级音频:Equalizer APO实战指南与音效优化

3步打造专业级音频&#xff1a;Equalizer APO实战指南与音效优化 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 你是否厌倦了Windows系统平淡无奇的音频体验&#xff1f;想要像专业音频工程师一样精准…...

深入解析MySQL AVG()函数:从基础语法到实战应用

1. MySQL AVG()函数基础入门 刚接触MySQL时&#xff0c;我发现很多新手对AVG()函数存在误解&#xff0c;以为它就是个简单的"平均数计算器"。实际上这个函数藏着不少门道&#xff0c;今天我就用最接地气的方式带大家彻底搞懂它。 AVG()函数的本质是计算某列数值的平均…...

iOS Universal Links 配置中的常见陷阱与解决方案

1. 为什么你的Universal Links总是不生效&#xff1f; 每次看到Universal Links配置失败&#xff0c;我都想起自己第一次踩坑的经历。明明按照文档一步步操作&#xff0c;测试时却死活跳转不到App&#xff0c;那种挫败感记忆犹新。后来才发现&#xff0c;问题往往出在几个关键细…...

大气层系统:Switch开源项目安装配置完全指南

大气层系统&#xff1a;Switch开源项目安装配置完全指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 你是否想让Switch拥有更多自定义功能&#xff0c;却担心操作复杂、风险太高&#x…...