如何在不使用 gparted 的情况下调整 Windows 分区的大小?

glS*_*glS 9 command-line dual-boot partition ntfs ntfs-3g

假设我在笔记本电脑上安装了本机(即来自制造商)Windows 7(带有 SSD 设备、BIOS/MBR 分区表,如果这很重要)。设备上的分区已完全分配并专用于 Windows。

我现在想在 windows 旁边安装一个 linux 系统,为此我需要先缩小 windows 分区。虽然我可以从 Windows 中或使用 gparted 找到方法来做到这一点,但如何仅使用命令行程序(如 parted 或 fdisk)来做到这一点?

tuk*_*k0z 15

这里有一个备忘录,可以使用命令行ntfsresize(来自ntfs-3g / ntfsprogs包)和来调整 NTFS 分区的大小fdisk,这应该适用于 Windows XP 到 8 版本。请注意,如果安装了 ntfs-3g/ntfsprogs,GParted 会为 MBR/DOS 以及 EFI/GPT 驱动器执行以下所有操作。我的参考在最后。

在这种情况下,我有一个 MBR 分区的 149 GB 磁盘和一个 NTFS 分区(Windows C:)。我会将其调整为 20 GB(正如@sourcejedi 所说的那样:BEWARE UNITS)以便为新分区腾出空间,例如。数据和/或其他操作系统。

先决条件

  • Clean NTFS文件系统:基于 linux 的 NTFS 工具将拒绝接触 NTFS 文件系统,除非它已经完全一致,以尽量减少数据丢失的机会。如果没有,则必须使用ntfsfix(来自 Linux)或chkdsk /f(来自 Windows)。
  • 备份重要数据(例如,使用上面@peterph 写的 ntfsclone)
  • 知道我想调整哪个设备和分区,在这种情况下是 /dev/sdb1。

A. 缩小文件系统

  1. 检查设备以确保它已准备好调整大小:

    ~ ntfsresize --check /dev/sdb
    
    Run Code Online (Sandbox Code Playgroud)

    在进一步处理之前,应解决此时的任何警告。

  2. 检查这个文件系统可以调整到的大小:

    ~ ntfsresize --info /dev/sdb
    > ...
    > You might resize at 16865632256 bytes or 16866 MB (freeing 112060  MB).
    > ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 测试缩小到 18 GB 的效果(我们将在一分钟内缩小到 20 GiB):

    ~ ntfsresize --no-action --size 18G /dev/sdb1
    > ...
    > The read-only test run ended successfully.
    
    Run Code Online (Sandbox Code Playgroud)
  4. 调整到 18 GB :

    ~ ntfsresize -v --size 18G /dev/sdb1
    > ...
    > Successfully resized NTFS on device '/dev/sdb1'.
    > You can go on to shrink the device for example with Linux fdisk.
    > IMPORTANT: When recreating the partition, make sure that you
    >   1)  create it at the same disk sector (use sector as the unit!)
    >   2)  create it with the same partition type (usually 7, HPFS/NTFS)
    >   3)  do not make it smaller than the new NTFS filesystem size
    >   4)  set the bootable flag for the partition if it existed before
    > Otherwise you won't be able to access NTFS or can't boot from the disk!
    > ...
    
    Run Code Online (Sandbox Code Playgroud)

提示:如果磁盘存在坏道等已知问题,请添加“ --bad-sectors”选项。

B. 调整分区大小

在上一步中,我们缩小了文件系统,而不是我们可以检查的分区:

~ disktype /dev/sdb

> Block device, size 149.1 GiB (160041885696 bytes)
> DOS/MBR partition map
> Partition 1: 149.1 GiB (138602266624 bytes, 8459611 clusters of 16 KiB, bootable)
> Volume size 18.37 GiB (20799750144 bytes, 1269516 clusters of 16 KiB)
Run Code Online (Sandbox Code Playgroud)

如您所见,卷大小和分区值不同,分区 1 仍在填充驱动器。在这个阶段,有必要删除分区并创建一个较小的分区以匹配 NTFS 文件系统的新大小。由于我的磁盘有一个 DOS/MBR 分区表,我会这样做fdisk(@peterph 有一个 GPT 的答案):

~ fdisk /dev/sdb
Run Code Online (Sandbox Code Playgroud)
  1. 删除分区

    键入“p”以显示该磁盘上的分区,并注意哪个包含调整大小的文件系统。

    输入“d”会询问您要删除哪个分区

    > Command (m for help): d
    > partition number (1-3, last one by default) : 1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 重新创建分区

    现在重新创建较小的分区,使其保持主要和第一顺序:

    > Command (m for help): n
    > Command action
    > e extended
    > p primary partition (1-4)
    p
    > Partition number (1-4): 1
    > First cylinder (1-31, default 1): 1
    
    Run Code Online (Sandbox Code Playgroud)

    由于我将文件系统缩小到 18GB,让我们将分区设为 20GiB:

    > Last cylinder or +size or +sizeM or +sizeK (1-31, default 31): +20G
    
    Run Code Online (Sandbox Code Playgroud)

    我们知道文件系统是 NTFS,因此对类型使用命令操作 't',对 NTFS 使用列出的十六进制代码 '7':

    > Command (m for help): t
    > Selected partition 1
    > Hex code (type L to list codes): 7
    > Changed system type of partition 1 to 7 (HPFS/NTFS)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 接下来,我想确保分区仍标记为可引导

    > Command (m for help): p
       Device   Boot      Start        End      Blocks   Id   System
    /dev/sdb1               63      40644449  40644387   7  HPFS/NTFS
    
    Run Code Online (Sandbox Code Playgroud)

    通过添加引导标志使新分区可引导:

    > Command (m for help): a
    > Partition number (1-4): 1
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在改变分区表与“W”命令操作磁盘并退出fdisk:

    > Command (m for help): w
    
    Run Code Online (Sandbox Code Playgroud)
  5. 现在最终调整文件系统的大小

    没有“大小”开关的 ntfsresize 将确保它使用整个分区的可用空间(整个分区而不是更多 - 谢谢@sourcejedi)

    ~ ntfsresize -v /dev/sdb1
    
    Run Code Online (Sandbox Code Playgroud)

现在我们可以检查驱动器上的分区文件系统是否成对:

~ disktype /dev/sdb
> ...
> Partition 1: 20.0 GiB (21474836480 bytes, 40644387 sectors from 63, bootable)
> Type 0x07 (HPFS/NTFS)
> Windows NTLDR boot loader
> NTFS file system
> Volume size 19.98 GiB (21453361644 bytes, 1269516 clusters of 16 KiB)
Run Code Online (Sandbox Code Playgroud)

参考

  • 不错的演示!你留下了一些余量,但只有 5%,如果你试图弥补 GB/GiB 单位错误,我相信这大约是 7%。我还推荐了一个没有明确大小的最终调整大小,以自动占用边距 - 至少它会排除一些未来的困惑。 (2认同)

sou*_*edi 7

GParted 通常值得使用,因为它有助于避免一些严重的错误。我想这里命令行工具的主要优点是对细节有更多的了解。这在意外脆弱的情况下很有用(至少一旦它坏了,细节可能会帮助你了解原因)。但是,我不建议其他人使用它们,除非他们希望能够从错误中吸取教训,直到“我的磁盘现在全是零,我需要从头开始”。

此外,桌面 Linux 安装过程应该提供一个用户友好的工具来调整 Windows 分区的大小。(或官方文档)。这是常见的情况。这将是我的第一个建议。

所有这些选项都会建议在出现任何错误时进行备份

令人困惑的是,您不应该使用parted命令行工具。它曾经是一个方便的选项,但开发人员不再支持使用它调整文件系统的大小。


否则,您使用ntfsresize,然后删除并重新创建分区 ( fdisk),其详细信息相同,但大小除外。当心单位 - 有些工具使用 MB;其他人可能会说 MB 但意思是 MiB。 fdisk使用 MiB 并ntfsresize使用 MB。懒惰的方法是将 ntfsresize 设置为比您需要的小得多(例如 2x),然后在重新创建分区后第二次运行 ntfsresize 没有明确的大小。

对于困难的方法,要转换单位,您可以在 bash 中运行数字表达式。例如,看到10GiB字节:echo $((10 * 1024 * 1024 * 1024))。您可以将这些表达式用作命令行工具的参数,例如ntfsresize.

ntfsresize 的分区名称将类似于/dev/sda1. lsblk -f将列出所有分区(包括您的启动盘)及其大小,并告诉您有关文件系统的信息。 fdisk将需要磁盘的名称,例如/dev/sda.

对于 MBR,要重新创建的分区详细信息是:分区类型和“活动”/可引导标志,以及起始偏移量。 [1] fdisk默认情况下应显示扇区中的分区偏移量。(如果不是,则可能有未显示的分数 - 可能由末尾的 + 表示,但那里可能存在陷阱 - 您应该确保始终fdisk在扇区模式下使用)。

为了避免在里面输入错误fdisk,我有时选择数字+用鼠标中键粘贴它们。这需要 X Windows,或者在文本模式下你需要gpm。我认为现在默认在控制台上提供 gpm 不太常见,但是当我使用 Clonezilla Live 时它就在那里。这很方便,但您可能会先丢失号码。所以你应该在删除它之前写下原始分区偏移量。


[1] GPT 使用不同的类型格式,添加了更多标志和分区 UUID。我认为它们通常不重要;flags 不适用于主 Windows 分区,并且分区 UUID 还没有被很多人使用。