挂载KVM Guest操作系统磁盘

使用虚拟机时, 发现想要修改虚拟机中的文件非常麻烦, 需要启动虚拟机, 然后再登录进去修改.

对于已经关闭的虚拟机, 为了修改一个文件而启动, 非常耽误时间.

对于一个无法启动的虚拟机(比如启动文件损坏), 则束手无策.

因此, 掌握在主机中挂载 Guest 的操作系统磁盘, 并修改其中的内容的方法在某些时候会非常有用.

1. 挂载 Guest 操作系统磁盘的方法

挂载 Guest 操作系统磁盘的方法主要有以下3种:

  1. guestfish : 支持lvm, 速度较慢
  2. lomount   : 不支持lvm, 速度快
  3. kpartx    : 支持lvm, 速度快

使用上述3种工具之前, 我先安装了2个 kvm 虚拟机, 都是debian7.6 x86_64, 一个是普通分区, 一个是LVM分区.

2个系统的磁盘在默认路径中

[email protected]113:~# ll /var/lib/libvirt/images
total 16777320
-rw------- 1 root root 8589934592 Sep 18 12:48 debian7.6.img
-rw------- 1 root root 8589934592 Sep 18 13:08 debian7.6-lvm.img

2. 方法1 - guestfish

2.1 使用 guestfish 对 普通Guest的磁盘进行一些基本的操作

[email protected]113:~# apt-get install guestfish            <-- 安装 guestfish 工具包, 中途跳出一个选择画面, 选择no
[email protected]-113:~# guestfish                            <-- 进入 guestfish

Welcome to guestfish, the libguestfs filesystem interactive shell for
editing virtual machine filesystems.

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

><fs> add /var/lib/libvirt/images/debian7.6.img         <-- 挂载 debian7.6的系统磁盘(非LVM分区)
><fs> launch                                            <-- 启动Guest, 这里会慢一些, 如果有错误, 参见下面的 *注1*
 100% ?------------------? 00:00
><fs> list-devices                                      <-- 查看 Guest 中的磁盘
/dev/vda

><fs> sfdisk-l /dev/vda                                 <-- 查看 Guest 中的磁盘分区

Disk /dev/vda: 16644 cylinders, 16 heads, 63 sectors/track
Units = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/vda1   *      2+   5115-   5114-   2577408   83  Linux           <-- 这个应该是根分区 /
/dev/vda2       5117+  16642-  11525-   5808129    5  Extended
/dev/vda3          0       -       0          0    0  Empty
/dev/vda4          0       -       0          0    0  Empty
/dev/vda5       5117+   5741-    624-    314368   82  Linux swap / Solaris
/dev/vda6       5743+  16642-  10899-   5492736   83  Linux           <-- 这个应该是home分区  /home

><fs> mount /dev/vda6 /                                               <-- 挂载 Guest 操作系统磁盘
><fs> ls /                                                            <-- 显示挂载的内容, 就是Guest的 /home
lost+found
wangyubin

# Guest磁盘上新建文件
><fs> touch /wangyubin/guestfish                                      <-- Guest的磁盘上新建一个文件
><fs> vi /wangyubin/guestfish                                         <-- 编辑这个文件, 输入 test guestfish

# 将Host上的hostname文件上传到Guest的 /home/wangyubin/from-host
><fs> upload /etc/hostname /wangyubin/from-host

# 卸载 Guest 的/home分区, 重新挂载Guest的 / 分区
><fs> mounts
/dev/vda6
><fs> umount /dev/vda6
><fs> mount /dev/vda1 /
><fs> ls /
bin
boot
dev
etc
home
initrd.img
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
selinux
srv
sys
tmp
usr
var
vmlinuz

# 将 Guest上的 hostname 文件下载到 Host的 /home/from-guest
><fs> download /etc/hostname /home/from-guest

# 卸载Guest磁盘, 退出 guestfish
><fs> mounts
/dev/vda1
><fs> umount /dev/vda1
><fs> quit

*注1* guestfish中, launch时出现错误的解决方法:

><fs> launch
febootstrap-supermin-helper: ext2: parent directory not found: /lib: File not found by ext2_lookup
libguestfs: error: external command failed, see earlier error messages
><fs> quit

[email protected]:~# update-guestfs-appliance

2.2 验证 guestfish 对普通磁盘的修改结果

1. HOST - 验证是否有 Guest的hostname文件, 并且内容正确?

[email protected]113:~# cat /home/from-guest      <-- 内容正确, 参见下面cat出的Guest上的hostname
debian
[email protected]-113:~# cat /etc/hostname         <-- Host的hostname内容, 用于验证 from-host的内容
debian-113

2. GUEST - 验证是否有新建的文件? 是否有 Host的hostname文件, 并且内容正确?

# virt-manager 启动 guest之后, 登录进去执行以下命令
[email protected]:~# ls /home/wangyubin/               <-- 新建的文件和upload的文件都在
from-host  guestfish
[email protected]:~# cat /home/wangyubin/from-host     <-- 内容正确, 参见上面cat出的Host上的hostname
debian-113
[email protected]:~# cat /home/wangyubin/guestfish     <-- 新建的文件内容正确
test guestfish
[email protected]:~# cat /etc/hostname                 <-- Guest的hostname内容, 用于验证 from-guest的内容
debian

2.3 使用 guestfish 对 LVM分区的Guest磁盘进行一些基本的操作

[email protected]113:~# guestfish 

Welcome to guestfish, the libguestfs filesystem interactive shell for
editing virtual machine filesystems.

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

><fs> add /var/lib/libvirt/images/debian7.6-lvm.img
><fs> launch
><fs> list-devices
/dev/vda
><fs> sfdisk-l /dev/vda

Disk /dev/vda: 16644 cylinders, 16 heads, 63 sectors/track
Units = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/vda1   *      2+    495-    494-    248832   83  Linux
/dev/vda2        497+  16642-  16145-   8136705    5  Extended
/dev/vda3          0       -       0          0    0  Empty
/dev/vda4          0       -       0          0    0  Empty
/dev/vda5        497+  16642-  16145-   8136704   8e  Linux LVM         <-- 这里看出是LVM

><fs> lvs                 <-- 查看LVM的逻辑卷
/dev/debian/home
/dev/debian/root
/dev/debian/swap_1

><fs> mount /dev/debian/home /   <-- 挂载 /home 对应的LVM逻辑卷
><fs> ls /
lost+found
wangyubin

# Guest磁盘上新建文件 - 步骤同上面普通磁盘
><fs> touch /wangyubin/guestfish-lvm                           <-- Guest的磁盘上新建一个文件
><fs> vi /wangyubin/guestfish-lvm                              <-- 编辑这个文件, 输入 test guestfish lvm

# 将Host上的hostname文件上传到Guest的 /home/wangyubin/from-host-lvm
><fs> upload /etc/hostname /wangyubin/from-host-lvm

# 卸载 Guest 的/home分区, 重新挂载Guest的 / 分区 都是LVM格式
><fs> mounts
/dev/debian/home
><fs> umount /dev/debian/home
><fs> lvs
/dev/debian/home
/dev/debian/root
/dev/debian/swap_1
><fs> mount /dev/debian/root /
><fs> ls /
bin
boot
dev
etc
home
initrd.img
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
selinux
srv
sys
tmp
usr
var
vmlinuz

# 将 Guest上的 hostname 文件下载到 Host的 /home/from-guest-lvm
><fs> download /etc/hostname /home/from-guest-lvm

# 卸载Guest磁盘, 退出 guestfish
><fs> mounts
/dev/debian/root
><fs> umount /dev/debian/root
><fs> quit

2.4 验证 guestfish 对LVM磁盘的修改结果

1. HOST - 验证是否有 Guest的hostname文件, 并且内容正确?

[email protected]113:~# cat /home/from-guest-lvm      <-- 内容正确, 参见下面cat出的Guest上的hostname
debian
[email protected]-113:~# cat /etc/hostname             <-- Host的hostname内容, 用于验证 from-host的内容
debian-113

2. GUEST - 验证是否有新建的文件? 是否有 Host的hostname文件, 并且内容正确?

# virt-manager 启动 guest之后, 登录进去执行以下命令
[email protected]:~# ls /home/wangyubin/                   <-- 新建的文件和upload的文件都在
from-host-lvm  guestfish-lvm
[email protected]:~# cat /home/wangyubin/from-host-lvm     <-- 内容正确, 参见上面cat出的Host上的hostname
debian-113
[email protected]:~# cat /home/wangyubin/guestfish-lvm     <-- 新建的文件内容正确
test guestfish lvm
[email protected]:~# cat /etc/hostname                     <-- Guest的hostname内容, 用于验证 from-guest的内容
debian

3. 方法2 - lomount

lomount是Xen环境下的工具, 挂载Guest的操作系统磁盘时比guestfish要快很多, 但是不支持lvm.

由于没有Xen的环境, 这里就不尝试了.

4. 方法3 - kpartx

首先, 安装 kaprtx

[email protected]113:~# apt-get install kpartx

4.1 使用 kpartx 对 普通分区的Guest磁盘进行一些基本的操作

[email protected]113:~# kpartx -av /var/lib/libvirt/images/debian7.6.img
add map loop0p1 (254:0): 0 5154816 linear /dev/loop0 2048      <-- 这个是根分区 /
add map loop0p2 (254:1): 0 11616258 linear /dev/loop0 5158910
add map loop0p5 : 0 628736 linear 254:1 2
add map loop0p6 : 0 10985472 linear 254:1 630786               <-- 这个是分区 /home

# 挂载磁盘
[email protected]-113:~# mount /dev/mapper/loop0p1 /mnt/             <-- *注2*
[email protected]-113:~# ll /mnt/
total 96
drwxr-xr-x  2 root root  4096 Sep 18 12:38 bin
drwxr-xr-x  3 root root  4096 Sep 18 12:40 boot
drwxr-xr-x  3 root root  4096 Sep 18 11:26 dev
drwxr-xr-x 72 root root  4096 Sep 18 19:50 etc
drwxr-xr-x  2 root root  4096 Sep 18 11:23 home
lrwxrwxrwx  1 root root    30 Sep 18 11:27 initrd.img -> /boot/initrd.img-3.2.0-4-amd64
drwxr-xr-x 13 root root  4096 Sep 18 12:31 lib
drwxr-xr-x  2 root root  4096 Sep 18 12:30 lib64
drwx------  2 root root 16384 Sep 18 11:23 lost+found
drwxr-xr-x  3 root root  4096 Sep 18 11:23 media
drwxr-xr-x  2 root root  4096 Jun 12 05:07 mnt
drwxr-xr-x  2 root root  4096 Sep 18 11:23 opt
drwxr-xr-x  2 root root  4096 Jun 12 05:07 proc
drwx------  3 root root  4096 Sep 18 12:46 root
drwxr-xr-x  2 root root  4096 Sep 18 12:45 run
drwxr-xr-x  2 root root  4096 Sep 18 12:45 sbin
drwxr-xr-x  2 root root  4096 Jun 10  2012 selinux
drwxr-xr-x  2 root root  4096 Sep 18 11:23 srv
drwxr-xr-x  2 root root  4096 Jul 15  2013 sys
drwxrwxrwt  2 root root  4096 Sep 18 19:52 tmp
drwxr-xr-x 10 root root  4096 Sep 18 11:23 usr
drwxr-xr-x 11 root root  4096 Sep 18 11:23 var
lrwxrwxrwx  1 root root    26 Sep 18 11:27 vmlinuz -> boot/vmlinuz-3.2.0-4-amd64

# 卸载磁盘
[email protected]-113:~# umount /mnt

*注2* kpartx 可以将Guest的磁盘挂载到主机的某个目录下 (比如上述例子就是 /mnt),

不像 guestfish 只能将Guest的磁盘挂载到 /

因此, 对于 kpartx 来说, 不需要 download 和 upload 命令, 操作 Guest 磁盘中的文件就和挂载了U盘一样.

4.2 使用 kpartx 对 LVM分区的Guest磁盘进行一些基本的操作

[email protected]113:~# kpartx -av /var/lib/libvirt/images/debian7.6-lvm.img
add map loop1p1 (254:4): 0 497664 linear /dev/loop1 2048
add map loop1p2 (254:5): 0 16273410 linear /dev/loop1 501758
add map loop1p5 : 0 16273408 linear 254:5 2   <-- 这是 lvm 分区

[email protected]-113:~# vgscan                     <-- 通过 lvm 相关命令查看 lvm分区信息
  Reading all physical volumes.  This may take a while...
  Found volume group "debian" using metadata type lvm2
[email protected]-113:~# vgs                        <-- 通过 lvm 相关命令查看 lvm分区信息
  VG     #PV #LV #SN Attr   VSize VFree
  debian   1   3   0 wz--n- 7.76g    0
[email protected]-113:~# lvs                        <-- 通过 lvm 相关命令查看 lvm分区信息
  LV     VG     Attr     LSize   Pool Origin Data%  Move Log Copy%  Convert
  home   debian -wi-----   5.06g
  root   debian -wi-----   2.40g
  swap_1 debian -wi----- 300.00m              

[email protected]-113:~# vgchange -ay debian        <-- 激活lvm分区
  3 logical volume(s) in volume group "debian" now active

[email protected]-113:~# mount /dev/debian/root /mnt/   <-- 挂载 lvm中的根分区 /
[email protected]-113:~# ll /mnt/
total 96
drwxr-xr-x  2 root root  4096 Sep 18 12:53 bin
drwxr-xr-x  2 root root  4096 Sep 18 11:28 boot
drwxr-xr-x  3 root root  4096 Sep 18 11:31 dev
drwxr-xr-x 73 root root  4096 Sep 18 20:54 etc
drwxr-xr-x  2 root root  4096 Sep 18 11:28 home
lrwxrwxrwx  1 root root    30 Sep 18 11:32 initrd.img -> /boot/initrd.img-3.2.0-4-amd64
drwxr-xr-x 13 root root  4096 Sep 18 12:43 lib
drwxr-xr-x  2 root root  4096 Sep 18 12:42 lib64
drwx------  2 root root 16384 Sep 18 11:28 lost+found
drwxr-xr-x  3 root root  4096 Sep 18 11:28 media
drwxr-xr-x  2 root root  4096 Jun 12 05:07 mnt
drwxr-xr-x  2 root root  4096 Sep 18 11:28 opt
drwxr-xr-x  2 root root  4096 Jun 12 05:07 proc
drwx------  3 root root  4096 Sep 18 13:08 root
drwxr-xr-x  2 root root  4096 Sep 18 13:06 run
drwxr-xr-x  2 root root  4096 Sep 18 13:06 sbin
drwxr-xr-x  2 root root  4096 Jun 10  2012 selinux
drwxr-xr-x  2 root root  4096 Sep 18 11:28 srv
drwxr-xr-x  2 root root  4096 Jul 15  2013 sys
drwxrwxrwt  2 root root  4096 Sep 18 20:17 tmp
drwxr-xr-x 10 root root  4096 Sep 18 11:28 usr
drwxr-xr-x 11 root root  4096 Sep 18 11:28 var
lrwxrwxrwx  1 root root    26 Sep 18 11:32 vmlinuz -> boot/vmlinuz-3.2.0-4-amd64

[email protected]-113:~# umount /mnt     <-- 卸载分区

5. 总结

lomount 由于没有环境, 没有实验.

对于 guestfish 和 kpartx来说, 感觉无论是速度还是易用性上, 都是 kpartx 胜出.

时间: 2024-11-07 14:39:58

挂载KVM Guest操作系统磁盘的相关文章

KVM 虚拟机增加磁盘

背景: 由于在KVM虚机上做glusterfs测试,发现KVM虚拟存储空间不够. 思路:创建一个kvm img 文件指定大小200G,然后通过Virtual Machine Manager导入到对应的虚拟机 步骤: 这里以虚拟机vm2为例 创建kvm img [[email protected] 2]cd /d1/virtual_machine/vm/2  #进入虚机文件目录 [[email protected] 2]# qemu-img create vm2-1.img 200G Format

KVM guest虚拟机图形化安装

2  KVM Guest 安装方式 virt-manager图形化安装 1.  利用xmanager 中xshell 管理kvm host 2.  Virt-manager 调出 图形化安装管理工具.新建虚拟机.根据规范输入唯一SN:vm000001.选择Fully virtualized 准备工作: 1.上传要安装的系统镜像到/data1 [[email protected] ~]# ls /data1/ domains  lost+found  rhel-6.5x64.iso  rhel-s

kvm guest xml 文件详解

完整的xml文件 <domain type='kvm'> <name>centoskvm3</name> <uuid>bdbb89fb-57d1-4d01-b3b7-ff33a9346ae6</uuid> <memory>2048000</memory> <currentMemory>1024000</currentMemory> <vcpu>2</vcpu> <os&

在linux下怎样挂载NTFS格式的磁盘

1.问题描述: # mount –t ntfs /dev/sdc1 /mnt/usb   mount: unknown filesystem type 'ntfs' 这是由于默认linux系统上无法识别NTFS格式的分区. 2.解决办法: 通过使用 ntfs-3g 来解决. 打开ntfs-3g的下载点http://www.tuxera.com/community/ntfs-3g-download/ ,将最新稳定ntfs-3g_ntfsprogs-2014.2.15.tgz下载到linux系统中.

在GNU/Linux下使用命令行自动挂载与卸载USB磁盘

在命令行环境下如果每次都是靠手动敲入mount与umount命令来挂载与卸载USB磁盘是件很麻烦的事情.尤其是mount命令的参数非常多.比如,磁盘的分区类型(vfat.ntfs等),挂载的目录节点,以何种用户和组的身份来挂载(uid与gid),挂载后文件与文件夹的权限(umask)等等.于是,自己编写了两个脚本程序来分别实现自动挂载与卸载USB磁盘.现在分别介绍如下. 首先是加载USB磁盘的 auto_mount.sh 脚本,使用它可以自动提取与设置mount命令所需的参数,执行mount命令

Linux学习-服务器B挂载服务器A的磁盘

环境: CentOS 7.0 1.centos中服务器B挂载服务器A的磁盘 服务器A:101,.10.0.1 服务器B:101.10.12.1 前提:保证服务器A.B都有/ifs/data/文件夹 目的:在服务器B上把服务器A的/ifs/data/文件夹挂载到自己的/ifs/data/文件夹下. Step1.编辑服务器A的/etc/exports文件 # vi/etc/exports 添加下列内容,让其对服务器B添加信任功能 /ifs/data 101.10.12.1 (rw,no_root_s

hadoop-3.0.0-beta1运维手册(002):安装Guest操作系统

2.1 什么是Guest操作系统 Guest指虚拟机,安装Guest操作系统,就是在我们刚才定制的虚拟机nn1上安装操作系统. 我们要安装的操作系统是Linux,它有很多发行版,在这里我们选择Centos系列,它主要用作服务器操作系统,非常稳定,在生产环境中应用广泛.具体版本是Centos 7,64位,下载地址为:CentOS-7-x86_64-Everything-1511.整个光盘有7GB多,因为它包含了更多的安装包(软件),我们在安装的时候,可以根据需要来选择安装哪些软件.因此,实际装出来

【Azure】 Linux VM扩大操作系统磁盘空间

Azure Linux VM扩大操作系统磁盘空间 目前Azure 针对Linux VM提供了增加操作系统磁盘空间的新功能,目前支持的虚拟机主要包括DS, DSV2和FS系列虚拟机.这样有助于帮助客户应用日志保持在SDA文件增加磁盘空间. 1. 创建虚拟机的时候选择 2. 进入操作系统可以看到磁盘空间已经增加到对应大小. 3. 重新分区 [[email protected] ~]# fdisk /dev/sda The device presents a logical sector size t

kvm虚拟机扩展磁盘空间

kvm虚拟机磁盘空间扩展与xen虚拟机磁盘空间扩展思路一致.原因在于xen/kvm默认的虚拟机磁盘格式为raw,所以方式可以通用. raw磁盘格式扩展思路如下 (1) 新添加一块raw格式的磁盘加入到KVM虚拟机,然后通过虚拟机系统lvm逻辑卷管理方式进行管理,扩展磁盘空间. (2) 直接通过dd命令扩展现有虚拟机磁盘大小,扩展之后,原磁盘大小增大,进入虚拟机系统后,直接通过fdisk分区新添加的空间,然后将该分区并入lvm逻辑卷中,扩大磁盘空间. xen虚拟化实战系列(四)之xen虚拟机扩展磁