我有一个 ubuntu 桌面系统(VM 来宾),它的分区是由安装媒体创建的。我想扩展磁盘,所以我关闭了来宾,并增加了主机中来宾的磁盘大小。现在我需要扩展来宾中的分区 - 这就是问题所在:
如果我打印原始表格,这就是我得到的:
$ sudo fdisk -l /dev/sda
Disk /dev/sda: 37.6 GB, 37580963840 bytes
255 heads, 63 sectors/track, 4568 cylinders, total 73400320 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 499711 248832 83 Linux
/dev/sda2 501758 41940991 20719617 5 Extended
/dev/sda5 501760 41940991 20719616 8e Linux LVM …Run Code Online (Sandbox Code Playgroud) 我的理解是MBR是512字节。前440 个字节(根据实现的不同,给出或取几个字节)包含引导加载程序/引导程序代码区域。其余字节包含有关分区表的信息。
如果我将磁盘的 MBR 清零...
# Zero out the MBR
dd if=/dev/zero of=/dev/sdX bs=1 count=512
Run Code Online (Sandbox Code Playgroud)
然后,使用fdisk将分区表写入/dev/sdX...
# Create a 2GiB partition starting at 2048 (default).
fdisk /dev/sdX
...
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier ...
...
(fdisk) n
(fdisk) p
(fdisk) 1
(fdisk) 2048
(fdisk) +2G
(fdisk) w
Run Code Online (Sandbox Code Playgroud)
然后读回前 440 个字节......
dd if=/dev/sdX bs=1 count=440
Run Code Online (Sandbox Code Playgroud)
第一个440 …
我已.img使用dd以下命令将 USB 驱动器复制到文件中:
dd if=/dev/sdc of=myimage.img
Run Code Online (Sandbox Code Playgroud)
我想减小图像中分区的大小。我尝试了几种方法,但最终总是得到一个环回安装的映像,其分区仍然是 USB 的完整大小。
myimage.img安装回环后如何修改为具有较小的分区?
在这样做之前,我是否需要将零复制到分区的空白部分?
我是否需要进行碎片整理,以便在减小图像大小时删除空字节?(从我读到的内容来看,Linux 扩展到整个分区,所以我不期望图像末尾的所有数据都是零字节。即使写入全零也只会消耗它们所在的空字节。)
注意:我不是想节省磁盘空间,所以压缩对我没有帮助。
背景
我在 USB 驱动器上安装了 Linux,使用ext4. 我打算为多个设备复制安装。我已经成功做到了,但想在同一个 USB 驱动器上创建一个包含系统的只读分区和一个允许持久存储的小分区。我没有破坏我的 USB,而是尝试修改 USB 的副本。我希望我们不要被这个背景分心。
简而言之,我做了以下工作:
# Create mount point in current directory
sudo mkdir mnt
# Loopback mount the image
fdisk -l myimage.img
sudo mount -o offset=<partion_block_start * block_size> myimage.img mnt
# Copy all zeros to remaining space of the image
cd mnt
sudo dd if=/dev/zero of=filler conv=fsync bs=1M
rm filler
cd …Run Code Online (Sandbox Code Playgroud)