复制硬盘分区结构

复制硬盘分区结构

我正在尝试复制已损坏驱动器的分区结构,我所掌握的所有信息是它有一个 MBR,使用一个 msdos 分区表(不确定这是否重要?)并且有 9 个分区,看起来像这样:

/dev/sda,sector 0 is MBR
/dev/sda1 is kernel (RAW) - 190MB
/dev/sda2 is swap (SWAP) - 478MB
/dev/sda4 is rescue (RAW) - 190MB
/dev/sda5 is root - ext3 - 4.66GB
/dev/sda6 is app - ext3 - 4.66GB
/dev/sda7 is config - ext3 - 6.1MB
/dev/sda8 is user - ext3 - 956MB
/dev/sda9 is maps - ext3 - rest of drive

由于 sda3 “丢失”,我猜那是扩展分区?但是,当尝试在 gparted 或 Ubuntu 磁盘工具中执行此操作时,下一个逻辑分区被命名为 sda5 而不是 sda4。我将把文件系统复制到所有脚本中都有硬编码设备名称的驱动器,因此数字需要完全匹配。

有没有办法将 sda5 重命名为 sda4?或者我可能完全不了解扩展分区?

任何帮助都将不胜感激,谢谢。

答案1

我可以协助解决部分问题。

如果磁盘使用 MBR 分区表,那么它必须使用扩展分区,正如您所怀疑的那样,因为 MBR 只能支持四个主分区。这是 GPT 分区表受到青睐的原因之一。它们没有这个限制。它们还支持更大的分区。

当 Linux 查看磁盘驱动器时,它会按顺序将设备分配给驱动器上找到的每个分区。如果该驱动器是它看到的第一个驱动器,它会将其命名为 /dev/sda,并且其上的分区将从 /dev/sda1 开始分配。因此您无法重命名这些分区。

最好不要依赖设备名称来解决您遇到的问题。大多数人使用分区的 UUID 来引用它们,这是一个很大的进步。我更进一步,使用唯一的、人类可读/有意义的分区标签来引用分区。如果您有多个驱动器,则无法保证它们在每次启动时都会以相同的顺序被识别,因此一次是 /dev/sdb 的设备可能在另一次是 /dev/sdc。当您有可移动磁盘时,情况会变得更糟,这些磁盘在物理连接到系统之前甚至没有设备文件。UUID 更不变,但如果调整分区大小或移动分区,它也会发生变化。标签不会被修改,但依靠您来唯一地命名它们。

我不知道为什么会跳过 /dev/sda4 - 尤其是如果交换分区已经分配给 /dev/sda2 的话。我不知道如何解决这个问题。如果你看看新的驱动器,应该有“一些东西”在 /dev/sda4 应该在的地方。也许 /dev/sda3 填满了磁盘的其余部分,但即使如此,我认为 /dev/sda4 仍然是其中的第一个扩展分区。或者,也许相反,它没有填满磁盘的其余部分,因此 /dev/sd4 被保留为整个 /dev/sd3 扩展分区之后的空间。

一个可能的解决方法是,如果您可以访问另一台计算机,您可以在其上构建新驱动器,获取所有新分区的 UUID 或标签,然后通过 sed 运行所有脚本以将所有设备引用更改为使用 UUID 或标签。如果您愿意,您甚至可以切换到 GPT 分区方案。

答案2

有没有办法将 sda5 重命名为 sda4?

是的{这就是为什么这个问题下面有一个很长的答案}


我以我的 USB pendrive /dev/sdc 为例。请根据您的情况进行修改


首先了解你的驱动器:{只是为了检查您是否正在使用所需的磁盘}

sudo fdisk -l /dev/sdc

Disk /dev/sdc: 14.32 GiB, 15376318464 bytes, 30031872 sectors
Disk model: Cruzer Blade    
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: 0xba104c33

Device     Boot    Start      End Sectors  Size Id Type
/dev/sdc1           2048  3426303 3424256  1.6G 83 Linux
/dev/sdc2        3426304 12898303 9472000  4.5G 83 Linux
/dev/sdc3       12898304 20127743 7229440  3.4G  b W95 FAT32
/dev/sdc4       20127744 27377663 7249920  3.5G  5 Extended
/dev/sdc5       20129792 22233087 2103296    1G 83 Linux

sudo sfdisk -d /dev/sdc

label: dos
label-id: 0xba104c33
device: /dev/sdc
unit: sectors
sector-size: 512

/dev/sdc1 : start=        2048, size=     3424256, type=83
/dev/sdc2 : start=     3426304, size=     9472000, type=83
/dev/sdc3 : start=    12898304, size=     7229440, type=b
/dev/sdc4 : start=    20127744, size=     7249920, type=5
/dev/sdc5 : start=    20129792, size=     2103296, type=83

sudo parted -l /dev/sdc

Model: SanDisk Cruzer Blade (scsi)
Disk /dev/sdc: 15.4GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  1754MB  1753MB  primary   ext4
 2      1754MB  6604MB  4850MB  primary   btrfs
 3      6604MB  10.3GB  3701MB  primary   fat32
 4      10.3GB  14.0GB  3712MB  extended
 5      10.3GB  11.4GB  1077MB  logical   ext2

笔记

  • 确保在分区表编辑过程中所有分区都已卸载。
  • 没有应用程序访问磁盘/修改其内容。

了解你的工作工具 -磁盘管理

来自手册页

sfdisk 是一个用于对任何块设备进行分区的面向脚本的工具。

想要了解更多详情吗?

跑步 :man sfdisk


在所需驱动器上试用该工具

sfdisk -d /dev/sdc

如果/dev/sdc是目标磁盘;

首先备份分区表sdc.bak

sfdisk -d /dev/sdc > sdc.bak

获取一份工作副本 -sdc.new

cp sdc.bak sdc.new

弄脏你的手

打开sdc.new在你最喜欢的编辑器中

label: dos
label-id: 0xba104c33
device: /dev/sdc
unit: sectors
sector-size: 512

/dev/sdc1 : start=        2048, size=     3424256, type=83
/dev/sdc2 : start=     3426304, size=     9472000, type=83
/dev/sdc3 : start=    12898304, size=     7229440, type=b
/dev/sdc4 : start=    20127744, size=     7249920, type=5
/dev/sdc5 : start=    20129792, size=     2103296, type=83

注意分区顺序

/dev/sdc1
/dev/sdc2
/dev/sdc3
/dev/sdc4
/dev/sdc5

现在我希望分区顺序是这样的

/dev/sdc3
/dev/sdc4
/dev/sdc1
/dev/sdc2
/dev/sdc5

简而言之我需要做的改变:

/dev/sdc1 ------------> /dev/sdc3
/dev/sdc2 ------------> /dev/sdc4
/dev/sdc3 ------------> /dev/sdc1
/dev/sdc4 ------------> /dev/sdc2
/dev/sdc5 ------------> /dev/sdc5

编辑sdc.new因此

笔记-

  • 除了分区号之外,不要更改任何数字。我相信你知道为什么。

sdc.new

label: dos
label-id: 0xba104c33
device: /dev/sdc
unit: sectors
sector-size: 512

/dev/sdc3 : start=        2048, size=     3424256, type=83
/dev/sdc4 : start=     3426304, size=     9472000, type=83
/dev/sdc1 : start=    12898304, size=     7229440, type=b
/dev/sdc2 : start=    20127744, size=     7249920, type=5
/dev/sdc5 : start=    20129792, size=     2103296, type=83

写回分区表

sfdisk /dev/sdc < sdc.new

样本输出:

Checking that no-one is using this disk right now ... OK

Disk /dev/sdc: 14.32 GiB, 15376318464 bytes, 30031872 sectors
Disk model: Cruzer Blade    
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: 0xba104c33

Old situation:

Device     Boot    Start      End Sectors  Size Id Type
/dev/sdc1           2048  3426303 3424256  1.6G 83 Linux
/dev/sdc2        3426304 12898303 9472000  4.5G 83 Linux
/dev/sdc3       12898304 20127743 7229440  3.4G  b W95 FAT32
/dev/sdc4       20127744 27377663 7249920  3.5G  5 Extended
/dev/sdc5       20129792 22233087 2103296    1G 83 Linux

>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Created a new DOS disklabel with disk identifier 0xba104c33.
/dev/sdc1: Created a new partition 3 of type 'Linux' and of size 1.6 GiB.
Partition #3 contains a ext4 signature.
/dev/sdc4: Created a new partition 4 of type 'Linux' and of size 4.5 GiB.
Partition #4 contains a btrfs signature.
/dev/sdc5: Created a new partition 1 of type 'W95 FAT32' and of size 3.4 GiB.
Partition #1 contains a vfat signature.
/dev/sdc2: Created a new partition 2 of type 'Extended' and of size 3.5 GiB.
/dev/sdc3: Created a new partition 5 of type 'Linux' and of size 1 GiB.
Partition #5 contains a ext2 signature.
/dev/sdc6: Done.

New situation:
Disklabel type: dos
Disk identifier: 0xba104c33

Device     Boot    Start      End Sectors  Size Id Type
/dev/sdc1       12898304 20127743 7229440  3.4G  b W95 FAT32
/dev/sdc2       20127744 27377663 7249920  3.5G  5 Extended
/dev/sdc3           2048  3426303 3424256  1.6G 83 Linux
/dev/sdc4        3426304 12898303 9472000  4.5G 83 Linux
/dev/sdc5       20129792 22233087 2103296    1G 83 Linux

Partition table entries are not in disk order.

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

交叉检查时间

sudo fdisk -l /dev/sdc

Disk /dev/sdc: 14.32 GiB, 15376318464 bytes, 30031872 sectors
Disk model: Cruzer Blade    
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: 0xba104c33

Device     Boot    Start      End Sectors  Size Id Type
/dev/sdc1       12898304 20127743 7229440  3.4G  b W95 FAT32
/dev/sdc2       20127744 27377663 7249920  3.5G  5 Extended
/dev/sdc3           2048  3426303 3424256  1.6G 83 Linux
/dev/sdc4        3426304 12898303 9472000  4.5G 83 Linux
/dev/sdc5       20129792 22233087 2103296    1G 83 Linux

Partition table entries are not in disk order.

sudo parted -l /dev/sdc

Model: SanDisk Cruzer Blade (scsi)
Disk /dev/sdc: 15.4GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type      File system  Flags
 3      1049kB  1754MB  1753MB  primary   ext4
 4      1754MB  6604MB  4850MB  primary   btrfs
 1      6604MB  10.3GB  3701MB  primary   fat32
 2      10.3GB  14.0GB  3712MB  extended
 5      10.3GB  11.4GB  1077MB  logical   ext2

如果出现问题,请从备份分区表恢复sdc.bak-

sfdisk /dev/sdc < sdc.bak

相关内容