我已经生成了一个图像文件dd
。该映像包含两个分区。
我创建了一个loop
虚拟磁盘:losetup -P /dev/loop0 $image_file
。我将创建的两个loop
分区(loop0p1
、loop0p2
)安装到两个安装点。
我的问题是loop
磁盘对于我要添加的文件来说太小。我研究了 的选项losetup
,但无济于事。
有没有办法增加循环磁盘?
答案1
通常警告:调整文件系统和分区的大小可能会因软件错误、硬件故障、断电、人为错误而导致数据丢失。确保始终备份数据。
循环设备是一种块设备,逻辑上类似于物理磁盘。因此,分区管理器并不意味着直接地调整它的大小。
您尚未找到的几个有用的部分是losetup -c
,使循环驱动程序在其支持文件大小更改时更新块设备的大小,以及partprobe
使内核更新其设备上分区的内部表示。 (尽管如果您使用 GUI 分区管理器(例如 GParted),您可能不需要显式调用后者)。
让我们设置一个工作示例:
$ fallocate -l 100M volume
$ sudo parted <<'EOT'
select ./volume
mklabel msdos
mkpart primary ext4 1MiB 50M
mkpart primary ext4 50M 100%FREE
quit
EOT
$ sudo losetup -P /dev/loop0 volume
$ sudo mkfs.ext4 /dev/loop0p1
$ sudo mkfs.ext4 /dev/loop0p2
$ mkdir mp1 mp2
$ sudo mount /dev/loop0p1 mp1
$ sudo mount /dev/loop0p2 mp2
这给出:
$ lsblk /dev/loop0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 100M 0 loop
├─loop0p1 259:0 0 47M 0 part /path/to/mp1
└─loop0p2 259:1 0 52M 0 part /path/to/mp2
$ df -h /dev/loop0p*
Filesystem Size Used Avail Use% Mounted on
/dev/loop0p1 42M 1.1M 38M 3% /path/to/mp1
/dev/loop0p2 47M 1.1M 42M 3% /path/to/mp2
然后我们可以增大支持循环设备的文件,并重新losetup
读取文件的大小以更新容量loop0
:
$ fallocate -l 200M volume
$ sudo losetup -c /dev/loop0
如果不卸载这两个分区,我们将只能将它们和所包含的文件系统增长到其右侧的可用空间量(仅/dev/loop0p2
在我们的情况下可以扩展)。另外,为了能够调整文件系统的大小,我们需要让内核知道更改后的分区表:
$ sudo parted <<'EOT'
select ./volume
resizepart 2 100%FREE
quit
EOT
$ sudo partprobe -s /dev/loop0
$ sudo resize2fs /dev/loop0p2
(卸载两个文件系统也允许你缩小或移动分区。注意,当缩小对于一个分区,这些步骤的顺序是相反的:首先,调整文件系统的大小,然后调整分区的大小(并在需要时告诉内核有关更改的信息),然后减小支持文件的大小)。
最终得到:
$ lsblk /dev/loop0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 200M 0 loop
├─loop0p1 259:0 0 47M 0 part /path/to/mp1
└─loop0p2 259:1 0 152M 0 part /path/to/mp2
$ df -h /dev/loop0p*
Filesystem Size Used Avail Use% Mounted on
/dev/loop0p1 42M 1.1M 38M 3% /path/to/mp1
/dev/loop0p2 144M 1.6M 135M 2% /path/to/mp2
答案2
你不能这样做:Linux 内核中环回设备的工作方式是使用映像文件大小对其进行操作,并且不会超出该大小进行写入。
实现您想要的唯一方法是卸载映像,增加其大小/重新分区,运行resize2fs
或任何您用来调整分区大小的文件系统,然后将其重新安装。