Linux

如何增加循環虛擬磁碟的大小?

  • July 1, 2020

我已經生成了一個圖像文件dd。映像包含兩​​個分區。

我創建了一個loop虛擬磁碟:losetup -P /dev/loop0 $image_file. 我將兩個loop創建的分區(loop0p1, loop0p2)安裝到兩個安裝點。

我的問題是loop磁碟對於我要添加的文件來說太小了。我查看了 的選項losetup,但無濟於事。

有沒有辦法增加循環磁碟?

您不能這樣做:Linux 核心中的回送設備的工作方式是使用映像文件大小對其進行操作,並且不會超出它的範圍進行寫入。

實現您想要的唯一方法是解除安裝映像,增加其大小/重新分區,執行resize2fs或您用於調整分區大小的任何 FS,然後將其重新安裝。

通常的警告:調整文件系統和分區的大小可能會由於軟體錯誤、硬體故障、斷電、人為錯誤而導致數據失去。確保您始終備份您的數據。

循環設備是塊設備,邏輯上類似於物理磁碟。因此,分區管理器並不意味著直接調整它的大小。

您還沒有找到的幾個有用的部分是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

這給出了:

$ 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

引用自:https://unix.stackexchange.com/questions/595641