sug*_*man 3 linux dd loop-device
我已经生成了一个图像文件 dd
。该映像包含两个分区。
我创建了一个loop
虚拟磁盘:losetup -P /dev/loop0 $image_file
. 我将loop
创建的两个分区 ( loop0p1
, loop0p2
) 安装到两个安装点。
我的问题是loop
磁盘对于我要添加的文件来说太小了。我查看了 的选项losetup
,但无济于事。
有没有办法增加循环盘?
通常的警告:由于软件错误、硬件故障、断电、人为错误,调整文件系统和分区的大小可能会导致数据丢失。确保始终备份数据。
循环设备是块设备,逻辑上类似于物理磁盘。因此,分区管理器并不打算直接调整它的大小。
您还没有找到的几个有用的部分是losetup -c
,当循环驱动程序的后备文件的大小发生变化时,它会更新块设备的大小,以及partprobe
使内核更新其在设备上的分区的内部表示。(尽管如果您使用 GParted 等 GUI 分区管理器,您可能不需要显式调用后者)。
让我们设置一个工作示例:
$ 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
Run Code Online (Sandbox Code Playgroud)
这给出:
$ 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
Run Code Online (Sandbox Code Playgroud)
然后我们可以增大支持循环设备的文件,并losetup
重新读取文件的大小以更新 的容量loop0
:
$ fallocate -l 200M volume
$ sudo losetup -c /dev/loop0
Run Code Online (Sandbox Code Playgroud)
如果不卸载这两个分区,我们将只能根据它们右侧的可用空间量来增加它们和包含的文件系统(仅/dev/loop0p2
在我们的情况下可以扩展)。此外,为了能够调整文件系统的大小,我们需要让内核知道更改的分区表:
$ sudo parted <<'EOT'
select ./volume
resizepart 2 100%FREE
quit
EOT
$ sudo partprobe -s /dev/loop0
$ sudo resize2fs /dev/loop0p2
Run Code Online (Sandbox Code Playgroud)
(卸载两个文件系统也将允许您缩小或移动分区。请注意,缩小分区时,这些步骤的顺序是相反的:首先,调整文件系统的大小,然后调整分区的大小(和如果需要,告诉内核有关更改的信息),然后减小后备文件的大小)。
最终获得:
$ 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
Run Code Online (Sandbox Code Playgroud)