假设我在笔记本电脑上安装了本机(即来自制造商的)Windows 7(带有 SSD 设备、BIOS/MBR 分区表(如果有的话))。设备上的分区完全分配并专用于Windows。
我现在想在 Windows 旁边安装 Linux 系统,为此我需要先缩小 Windows 分区。虽然我可以找到从 Windows 内部或使用 gparted 来做到这一点的方法,如何仅使用命令行程序(例如parted或fdisk)来执行此操作?
答案1
ntfsresize
这里有一个使用命令行(来自ntfs-3g / ntfsprogs
包)和来调整 NTFS 分区大小的备忘录fdisk
,这应该适用于 Windows XP 到 8 版本。请注意,GParted 对 MBR/DOS 以及 EFI/GPT 驱动器执行以下所有操作:ntfs-3g / ntfsprogs 已安装。我的参考资料在最后。
好的,在这种情况下,我有一个 MBR 分区的 149 GB 磁盘,其中有一个 NTFS 分区 (Windows C:)。我会将其大小调整为 20 GB(正如 @sourcejedi 所说:注意单位),以便为新分区腾出空间,例如。数据和/或其他操作系统。
先决条件
- 干净的NTFS文件系统:基于Linux的NTFS工具将拒绝接触NTFS文件系统,除非它已经完全一致,以尽量减少数据丢失的机会。如果没有,则必须使用
ntfsfix
(从 Linux)或chkdsk /f
(从 Windows)。 - 备份重要数据(例如,使用 ntfsclone 作为 @peterph 上面写的)
- 知道哪个设备和分区在本例中,我想调整 /dev/sdb1 的大小。
A. 缩小文件系统
查看设备以确保其已准备好调整大小:
~ ntfsresize --check /dev/sdb
此时应先解决任何警告,然后再进行进一步处理。
检查尺寸该文件系统可以调整大小为:
~ ntfsresize --info /dev/sdb > ... > You might resize at 16865632256 bytes or 16866 MB (freeing 112060 MB). > ...
测试如何缩小到 18 GB(我们将在一分钟内缩小到 20 GiB):
~ ntfsresize --no-action --size 18G /dev/sdb1 > ... > The read-only test run ended successfully.
调整大小至 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! > ...
提示:如果磁盘存在坏扇区等已知问题,请添加“ --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)
正如您所看到的,卷大小和分区值不同,分区 1 仍然填充驱动器。在此阶段,需要删除该分区并创建一个较小的分区以匹配 NTFS 文件系统的新大小。由于我的磁盘有一个 DOS/MBR 分区表,我将使用fdisk
(@peterph 上面有一个关于 GPT 的答案):
~ fdisk /dev/sdb
删除分区
键入“p”以显示该磁盘上的分区,并记下哪个分区包含调整大小的文件系统。
输入“d”会询问您要删除哪个分区
> Command (m for help): d > partition number (1-3, last one by default) : 1
重新创建分区
现在重新创建较小的分区,使其保持主分区和第一个分区的顺序:
> 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
由于我将文件系统缩小到 18GB,因此我们将分区设置为 20GiB:
> Last cylinder or +size or +sizeM or +sizeK (1-31, default 31): +20G
我们知道文件系统是 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)
接下来我想确保分区仍然标记为可启动的:
> Command (m for help): p Device Boot Start End Blocks Id System /dev/sdb1 63 40644449 40644387 7 HPFS/NTFS
通过添加引导标志使新分区可引导:
> Command (m for help): a > Partition number (1-4): 1
写将更改后的分区表写入磁盘并使用命令操作“w”退出 fdisk:
> Command (m for help): w
现在最终调整大小文件系统
不带“大小”开关的 ntfsresize 将确保它使用整个分区的可用空间(全部,仅此而已 - 感谢@sourcejedi)
~ ntfsresize -v /dev/sdb1
现在我们可以查看是否分区和文件系统驱动器上是成对的:
~ 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)
参考
答案2
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 的情况不太常见,但当我使用 Clonezilla Live 时它就在那里。这很方便,但您可能首先会丢失号码。因此,您应该在删除原始分区偏移量之前记下它。
[1] GPT 使用不同的类型格式,添加更多标志和分区 UUID。我认为它们通常并不重要;标志不适用于主 Windows 分区,并且分区 UUID 尚未被太多使用。
答案3
您需要ntfsresize
来自的实用程序ntfs-3g
软件包,可以调整 NTFS 文件系统的大小。但是,请务必在对分区进行任何更改之前对其进行备份,因为有时 Windows 对于调整大小的分区应该是什么样子有其他想法。
可以使用该ntfsclone
实用程序(同一软件包)方便地执行备份,因为它仅保存文件系统(即文件内容和元数据)而不是整个分区:
ntfsclone -s -o windows-partitinon.img /dev/sdXY
如果您的磁盘空间紧张和/或有足够的时间,压缩图像是一个好主意:
ntfsclone -s -o - /dev/sdXY | xz -v -9 > windows-partitinon.img.xz
请注意,对于中等完整的 Windows系统分区(用户数据不多),例如~40GB,可能需要几个小时,具体取决于压缩级别)。另一方面,您也可以达到未压缩大小的 40-30% 左右。
除此之外,请记住备份分区布局以便能够执行完整恢复。如果您使用没有任何逻辑分区的 MBR 分区表,则您只需要受影响设备的 MBR:
dd if=/dev/sdX bs=512 count=1 of=mbr.sav
如果存在逻辑部分,至少保存文本描述,例如:
fdisk -l -u s /dev/sdX > partitions.sav
对于 GPT,您可以使用gdisk
,它能够将 GPT 数据保存到文件中然后将其加载回来。
然后就可以ntfsresize
在写入模式下运行了。它可能会告诉您重新启动到 Windows(可能多次),以确保操作系统注册了更改。
只有完成所有这些后,您才能调整分区的大小。parted
可能与任何其他了解该硬盘驱动器上使用的分区方案的分区程序一样好。