AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 796758
Accepted
Vikelidis Kostas
Vikelidis Kostas
Asked: 2016-08-15 09:31:09 +0800 CST2016-08-15 09:31:09 +0800 CST 2016-08-15 09:31:09 +0800 CST

缩小分区以完全适合底层文件系统大小

  • 772

最近我将 ext4 文件系统的大小缩小到 500GB

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       493G   64G  404G  14% /

现在我想缩小分区大小以完全适合文件系统大小。

我尝试使用 parted 和 resizepart 命令。问题是当 parted 要求新尺寸时。如果我选择 500GB,则生成的分区比 500GB 小,因此底层文件系统无法适应该分区。关于如何进行正确尺寸计算的任何提示?

partition parted
  • 2 2 个回答
  • 11442 Views

2 个回答

  • Voted
  1. Best Answer
    David
    2016-08-15T10:36:32+08:002016-08-15T10:36:32+08:00

    报告的大小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)
    
    • 11
  2. Martin Hansen
    2020-07-12T05:21:18+08:002020-07-12T05:21:18+08:00

    这是整个过程的一个例子。

    这是我们的硬盘:

    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
    

    它包含一个大小为 4.7GB 的分区 (/dev/loop0p1)。这是分区上的文件系统:

    root@debian:~# df -h
    /dev/loop0p1    4,7G    2,1G     0  45% /mnt
    

    默认情况下,它具有与分区相同的大小(4.7GB)。但仅使用了 2.1GB (45%) 的文件系统。这意味着我们可以将文件系统和分区缩小到仅 2.1 GB 而不会丢失任何数据。

    第一步是使用 resize2fs 和分区上的 -M 开关。与磁盘碎片整理程序类似,此命令将尝试将所有文​​件移动到文件系统的开头以形成一个连续的块。然后,这允许将文件系统缩小到可能的最小大小。

    root@debian:~# resize2fs -M /dev/loop0p1
    

    文件系统现在看起来像这样:

    root@debian:~# df -h
    /dev/loop0p1    2,1G    2,1G     0  100% /mnt
    

    硬盘现在包含一个 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
    

    这告诉我们有 565950 个块,块大小为 4096 字节。这允许我们计算文件系统大小:

    565950 块 * 4096 字节 = 2318131200 字节

    由此,我们可以计算扇区中的文件系统大小。从上面的 fdisk 输出,我们知道硬盘扇区大小为 512 字节:

    2318131200 字节 / 512 = 4527600 个扇区

    因为分区不是从扇区 0 开始的,所以我们需要从 fdisk 输出中添加起始扇区:

    4527600 + 8192(起始扇区)= 4535792

    这是我们分区的新结束扇区。为了安全起见,将 10 个扇区(约 5 KB)添加到该数字:4535802

    现在我们可以使用 parted 将分区缩小到这个新的结束扇区。“unit s”命令用于将单位切换到扇区。

    root@debian:~# parted
    GNU Parted 3.2
    Using /dev/sda
    
    (parted) select /dev/loop0   
                                             
    Using /dev/loop0
    
    (parted) p
    
    Model: Loopback device (loopback)
    Disk /dev/loop0: 5244MB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    Disk Flags: 
    
    Number  Start   End     Size    Type     File system  Flags
     1      4194kB  5000MB  4996MB  primary  ext4
    
    (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 4535802  
                                           
    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  4535802s  4527611s  primary  ext4
    

    它给了我们一个关于潜在数据丢失的警告,但是因为我们之前将所有数据移动到了分区的开头,所以可以放心地忽略它。完毕!我们现在有一个 2.1GB 的分区和一个 100% 占用的 2.1GB 文件系统。

    • 5

相关问题

  • 主分区与扩展分区

  • 在 Ubuntu 上将 Windows 磁盘分区与 Linux 分区合并

  • 用于 Web 应用服务器的 FreeBSD 磁盘分区(Apache/MySQL/PHP)

  • 调整分区大小通常会扩展文件系统上已用空间的现有大小吗?[关闭]

  • 如何在 Ubuntu 上挂载 LVM 分区?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve