我正在尝试复制已损坏驱动器的分区结构,我所掌握的所有信息是它有一个 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