最近我将 ext4 文件系统大小缩小到 500GB
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 493G 64G 404G 14% /
Run Code Online (Sandbox Code Playgroud)
现在我想缩小分区大小以完全适合文件系统大小。
我尝试使用 parted 和 resizepart 命令。问题是当 parted 要求新尺寸时。如果我选择 500GB,则生成的分区比 500GB 小,因此底层文件系统无法容纳在该分区上。有关如何进行正确尺寸计算的任何提示?
Mar*_*sen 14
这是整个过程的一个例子。
这是硬盘:
root@debian:~# fdisk /dev/loop0
Command (m for help): p
Disk /dev/loop0: 4,9 GiB, 5243928576 bytes, 10242048 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
Disklabel type: dos
Disk identifier: 0xc5127fad
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 8192 9765625 9757434 4,7G 83 Linux
Run Code Online (Sandbox Code Playgroud)
注意:“/dev/loop0”是一个环回设备,是一个基于文件容器的虚拟硬盘。物理硬盘将被命名为“/dev/sda”。
该磁盘包含一个大小为 4.7GB 的分区 (/dev/loop0p1)。
这是分区上的文件系统:
root@debian:~# df -h
/dev/loop0p1 4,7G 2,1G 0 45% /mnt
Run Code Online (Sandbox Code Playgroud)
默认情况下,它与分区大小相同 (4.7GB)。但仅使用了 2.1GB (45%) 的文件系统。这意味着我们可以将文件系统和分区缩小到仅 2.1 GB,而不会丢失任何数据。
第一步是在分区上使用带有 -M 开关的 resize2fs。与磁盘碎片整理程序类似,此命令将尝试将所有文件移动到文件系统的开头以形成一个连续的块。这样就可以将文件系统缩小到尽可能小的大小。resize2fs 仅适用于 ext 文件系统,对于其他文件系统,您必须找到具有此功能的等效程序。
root@debian:~# resize2fs -M /dev/loop0p1
Run Code Online (Sandbox Code Playgroud)
文件系统现在看起来像这样:
root@debian:~# df -h
/dev/loop0p1 2,1G 2,1G 0 100% /mnt
Run Code Online (Sandbox Code Playgroud)
该硬盘现在包含一个 4.7GB 分区,其中包含 2.1GB 文件系统,且已 100% 使用。下一步是缩小分区大小以适应较小的文件系统。
为此,我们需要计算新的文件系统大小。dumpe2fs 工具对此非常有用,它显示有关文件系统的详细信息。
root@debian:~# dumpe2fs -h /dev/loop0p1
dumpe2fs 1.43.4 (31-Jan-2017)
Filesystem volume name: <none>
Last mounted on: /
Filesystem UUID: 7d5ec9a4-cc65-4433-95e2-6536e4fd56d6
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: journal_data_writeback user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 139392
Block count: 565950
Reserved block count: 7825
Free blocks: 8611
Free inodes: 2296
First block: 0
Block size: 4096
Run Code Online (Sandbox Code Playgroud)
这告诉我们有 565950 个块,块大小为 4096 字节。这使我们能够计算文件系统的大小:
565950 块 * 4096 字节 = 2318131200 字节
由此,我们可以计算文件系统的扇区大小。从上面的fdisk输出,我们知道硬盘扇区大小为512字节:
2318131200 字节 / 512 字节扇区大小 = 4527600 扇区
因为分区不是从扇区 0 开始,所以我们需要添加上面 fdisk 输出中的起始扇区,然后减一,因为扇区计数从零开始:
4527600 + 8192(起始扇区)- 1 = 4535791
这是我们分区的新结束扇区。
现在我们可以使用parted将分区缩小到这个新的结束扇区。“unit s”命令用于将单位切换为扇区。
root@debian:~# parted
GNU Parted 3.2
Using /dev/sda
(parted) select /dev/loop0
Using /dev/loop0
(parted) unit s
(parted) p
Model: Loopback device (loopback)
Disk /dev/loop0: 10242048s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 8192s 9765625s 9757434s primary ext4
(parted) resizepart 1 4535791
Warning: Shrinking a partition can cause data loss, are you sure you want to
continue?
Yes/No? yes
(parted) p
Model: Loopback device (loopback)
Disk /dev/loop0: 10242048s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 8192s 4535791s 4527600s primary ext4
Run Code Online (Sandbox Code Playgroud)
它向我们发出有关潜在数据丢失的警告,但要切断的扇区中不应有数据。现在我们有一个 2.1GB 的分区和 2.1GB 的文件系统,并且已 100% 被占用。
Dav*_*vid 11
报告的大小df将是不正确的,因为它们仅考虑文件系统内部使用的数据块和未命中块以及保留块。
简单的方法是将您的文件系统缩小到比您想要的小至少 10%。将分区大小调整为您想要的大小,然后使用 resize2fs 扩展文件系统。
如果您想手动计算它,您必须知道文件系统内部有多大。检查这一点tune2fs -l /dev/sda2并将块计数乘以块大小。在 parted 中调整分区大小时,将单位切换到扇区unit s和print表以获取起始扇区和逻辑扇区大小。将上面的总大小(以字节为单位)除以扇区大小。向上舍入到最接近的 2048 倍数并调整到此扇区数(结束扇区 = 扇区大小 + 起始扇区 - 1)。
方程(可在 python 中运行只需填写前 4 个值):
block_count = N
block_size = N
sector_size = N
start_sector = N
fs_size = block_count * block_size
fs_sectors = fs_size/sector_size
part_sectors = ((fs_sectors-1)/2048+1)*2048
end_sector = start_sector + part_sectors - 1
print "Partition start: %d end: %d size: %d"%(start_sector,end_sector,part_sectors)
print "Resize in parted with: \nresizepart <number> %ds"%(end_sector)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7939 次 |
| 最近记录: |