|
| 1 | +--- |
| 2 | +title: pve 宿主机挂载虚拟机磁盘镜像 |
| 3 | +date: 2024-01-16 |
| 4 | +draft: false |
| 5 | +description: "pve 宿主机挂载虚拟机磁盘镜像" |
| 6 | +tags: |
| 7 | + - pve |
| 8 | + - 虚拟机 |
| 9 | +categories: |
| 10 | + - pve |
| 11 | + - Linux |
| 12 | +lightgallery: true |
| 13 | + |
| 14 | +toc: |
| 15 | + auto: true |
| 16 | +--- |
| 17 | + |
| 18 | +## 1. 背景 |
| 19 | + |
| 20 | +有的时候我们需要修改虚拟机的文件,但是此时虚拟机却因为某些原因无法启动了,比如说虚拟机黑苹果修改了 `EFI` 导致启动不了,这时我们有什么办法呢,有人说我们添加一个可以启动的 `EFI` 启动设备再来修改原来 `ESP` 分区 (即原 `EFI` 文件系统) 不就好了,诚然,这是一个办法,但我们今天要介绍的是另一个办法,直接在宿主机挂载虚拟机的磁盘分区,就拿黑苹果 `EFI` 分区为例。 |
| 21 | + |
| 22 | +## 2. Raw |
| 23 | + |
| 24 | +`raw` 格式的磁盘镜像文件可以使用 `losetup` 虚拟成一个块设备。再使用 `kpartx` 读取分区表英创建设备映射,从而可以从设备挂载到宿主机: |
| 25 | + |
| 26 | +### 2.1 挂载 |
| 27 | + |
| 28 | +- 安装 kpartx |
| 29 | + |
| 30 | +```shell |
| 31 | +apt install kpartx |
| 32 | +``` |
| 33 | + |
| 34 | +下面以虚拟机编号为 108 的 disk1 为例子 |
| 35 | + |
| 36 | +- 虚拟块设备 |
| 37 | + |
| 38 | +```shell |
| 39 | +losetup /dev/loop0 /dev/mapper/pve-vm--108--disk--1 |
| 40 | +``` |
| 41 | + |
| 42 | +- 读取设备的分区表并创建设备分区映射 |
| 43 | + |
| 44 | +```shell |
| 45 | +kpartx -av /dev/loop0 |
| 46 | +``` |
| 47 | + |
| 48 | +- 查看分区映射 |
| 49 | + |
| 50 | +```shell |
| 51 | +➜ ~ lsblk |
| 52 | +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT |
| 53 | +loop0 7:0 0 1G 0 loop |
| 54 | +└─loop0p1 253:23 0 1024M 0 part |
| 55 | +sda 8:0 1 14.6G 0 disk |
| 56 | +├─sda1 8:1 1 11.8G 0 part |
| 57 | +├─sda2 8:2 1 16M 0 part |
| 58 | +├─sda3 8:3 1 2.7G 0 part |
| 59 | +├─sda4 8:4 1 16M 0 part |
| 60 | +├─sda5 8:5 1 2M 0 part |
| 61 | +├─sda6 8:6 1 512B 0 part |
| 62 | +├─sda7 8:7 1 512B 0 part |
| 63 | +├─sda8 8:8 1 16M 0 part |
| 64 | +├─sda9 8:9 1 512B 0 part |
| 65 | +├─sda10 8:10 1 512B 0 part |
| 66 | +├─sda11 8:11 1 8M 0 part |
| 67 | +└─sda12 8:12 1 32M 0 part |
| 68 | +nvme1n1 259:0 0 238.5G 0 disk |
| 69 | +├─nvme1n1p1 259:1 0 238.5G 0 part |
| 70 | +└─nvme1n1p9 259:2 0 8M 0 part |
| 71 | +``` |
| 72 | + |
| 73 | +可以看到 `loop0` 下有一个分区 |
| 74 | + |
| 75 | +- 挂载分区 |
| 76 | + |
| 77 | +```shell |
| 78 | +mkdir pve-efi |
| 79 | +mount /dev/mapper/loop0p1 pve-efi |
| 80 | +``` |
| 81 | + |
| 82 | +- 查看分区文件 |
| 83 | + |
| 84 | +```shell |
| 85 | +➜ ~ ls -al pve-efi |
| 86 | +total 11 |
| 87 | +drwxr-xr-x 6 root root 512 Jan 1 1970 . |
| 88 | +drwx------ 18 root root 4096 Jan 16 14:09 .. |
| 89 | +-rwxr-xr-x 1 root root 4096 Dec 29 07:12 ._EFI |
| 90 | +drwxr-xr-x 4 root root 512 Dec 29 07:12 EFI |
| 91 | +drwxr-xr-x 2 root root 512 Jan 13 09:48 .fseventsd |
| 92 | +drwxr-xr-x 3 root root 512 Dec 29 07:12 .Spotlight-V100 |
| 93 | +drwxr-xr-x 3 root root 512 Dec 29 07:12 .Trashes |
| 94 | +``` |
| 95 | + |
| 96 | +### 2.2 卸载 |
| 97 | + |
| 98 | +按照挂载的顺序反向卸载 |
| 99 | + |
| 100 | +```shell |
| 101 | +# 文件系统 |
| 102 | +umount pve-efi |
| 103 | +# 设备分区 |
| 104 | +kpartx -d /dev/loop0 |
| 105 | +# 块设备虚拟 |
| 106 | +losetup -d /dev/loop0 |
| 107 | +``` |
| 108 | + |
| 109 | +## 3. Qcow2 |
| 110 | + |
| 111 | +### 3.1 挂载 |
| 112 | + |
| 113 | +`Qcow2` 镜像需要通过 nbd 模块挂载 |
| 114 | + |
| 115 | +- 检查 nbd 模块是否加载 |
| 116 | + |
| 117 | +```shell |
| 118 | +lsmod | grep nbd |
| 119 | +``` |
| 120 | + |
| 121 | +若没有输出结果则加载 nbd |
| 122 | + |
| 123 | +```shell |
| 124 | +modprobe nbd max_part=8 |
| 125 | +``` |
| 126 | + |
| 127 | +- 挂载镜像,下面以编号 103 的虚拟机磁盘 2 文件为例 |
| 128 | + |
| 129 | +```shell |
| 130 | +qemu-nbd --connect=/dev/nbd0 /var/lib/vz-b/images/113/vm-113-disk-1.qcow2 |
| 131 | +``` |
| 132 | + |
| 133 | +- 查看分区 |
| 134 | + |
| 135 | +```shell |
| 136 | +➜ ~ fdisk -l /dev/nbd0 |
| 137 | +Disk /dev/nbd0: 32 GiB, 34359738368 bytes, 67108864 sectors |
| 138 | +Units: sectors of 1 * 512 = 512 bytes |
| 139 | +Sector size (logical/physical): 512 bytes / 512 bytes |
| 140 | +I/O size (minimum/optimal): 512 bytes / 512 bytes |
| 141 | +Disklabel type: gpt |
| 142 | +Disk identifier: DACC591B-A767-EA4F-8028-9757172F0505 |
| 143 | + |
| 144 | +Device Start End Sectors Size Type |
| 145 | +/dev/nbd0p1 11472896 67108815 55635920 26.5G Linux filesystem |
| 146 | +/dev/nbd0p2 20480 53247 32768 16M ChromeOS kernel |
| 147 | +/dev/nbd0p3 5894144 11472895 5578752 2.7G ChromeOS root fs |
| 148 | +/dev/nbd0p4 53248 86015 32768 16M ChromeOS kernel |
| 149 | +/dev/nbd0p5 315392 5894143 5578752 2.7G ChromeOS root fs |
| 150 | +/dev/nbd0p6 16448 16448 1 512B ChromeOS kernel |
| 151 | +/dev/nbd0p7 16449 16449 1 512B ChromeOS root fs |
| 152 | +/dev/nbd0p8 86016 118783 32768 16M Linux filesystem |
| 153 | +/dev/nbd0p9 16450 16450 1 512B ChromeOS reserved |
| 154 | +/dev/nbd0p10 16451 16451 1 512B ChromeOS reserved |
| 155 | +/dev/nbd0p11 64 16447 16384 8M unknown |
| 156 | +/dev/nbd0p12 249856 315391 65536 32M EFI System |
| 157 | +``` |
| 158 | + |
| 159 | +可以看到我挂载的是一个 `FydeOS` 虚拟机的镜像文件,是基于 `Chromium OS` 的操作系统,所以看到了文件系统有 `ChromeOS kernel` 等,下面挂载下 `linux filesystem` 分区。 |
| 160 | + |
| 161 | +- 挂载分区 |
| 162 | + |
| 163 | +```shell |
| 164 | +mkdir chromeos-file |
| 165 | +mount /dev/nbd0p1 chromeos-file |
| 166 | +``` |
| 167 | + |
| 168 | +- 查看分区文件 |
| 169 | + |
| 170 | +```shell |
| 171 | +➜ ~ cd chromeos-file |
| 172 | +➜ chromeos-file ll |
| 173 | +total 275992 |
| 174 | +drwxr-xr-x 9 root root 4096 Nov 26 15:04 . |
| 175 | +drwx------ 18 root root 4096 Jan 16 16:19 .. |
| 176 | +drwxr-xr-x. 17 root root 4096 Nov 14 10:59 dev_image |
| 177 | +drwxrwxr-x. 2 root root 4096 Nov 26 15:04 encrypted |
| 178 | +-rw-------. 1 root root 8357232640 Nov 26 16:26 encrypted.block |
| 179 | +-rw-------. 1 root root 48 Nov 26 15:04 encrypted.key |
| 180 | +drwxr-xr-x. 3 root root 4096 Nov 26 15:04 etc |
| 181 | +drwxr-xr-x. 6 root root 4096 Nov 26 15:04 home |
| 182 | +drwx------ 2 root root 16384 Nov 26 14:55 lost+found |
| 183 | +drwxr-xr-x. 13 root root 4096 Nov 26 15:04 unencrypted |
| 184 | +drwx--x--x. 5 root root 4096 Nov 26 15:04 var_overlay |
| 185 | +``` |
| 186 | + |
| 187 | +这样就挂载好了一个分区,可以进行编辑了,编辑好了之后卸载回到客户机即可看到改动了。 |
| 188 | + |
| 189 | +### 3.2 卸载 |
| 190 | + |
| 191 | +卸载还是反向操作 |
| 192 | + |
| 193 | +```shell |
| 194 | +umount chromeos-file |
| 195 | +qemu-nbd --disconnect /dev/nbd0 |
| 196 | +``` |
| 197 | + |
| 198 | +- 卸载 nbd 模块 (可选) |
| 199 | + |
| 200 | +```shell |
| 201 | +modprobe -r nbd |
| 202 | +``` |
| 203 | + |
| 204 | +## 4. 结语 |
| 205 | + |
| 206 | +至此就完成了 pve 常用的 2 种格式的镜像文件的挂载操作,该用法的需求是我在折腾黑苹果 `EFI` 开不了机的时候爬帖子学到的,其他格式的文件挂载可以查看 `foxi` 的 [这篇文章](https://foxi.buduanwang.vip/linux/552.html/) |
0 commit comments