将分区号从sda1更改为sda2


20

我有一个带有两个分区的磁盘:sda1和sda2。我想将sda1的数量更改为sda2,将sda2的数量更改为sda1。

有可能,但是我不记得该程序了。即我的第一个分区将是sda2,第二个分区是sda1,因此我需要指定手动顺序,而不是像fdisk-> x-> f中的自动顺序。

我如何更改订单?手册或教程的链接也很有用。

谢谢。

原因:我有一个需要从sda1读取数据但该数据在sda2中的应用程序。更改分区表是解决此问题的更快方法。该系统不是很关键,但我不想暂停太多时间。

更新:OpenBSD的fdisk版本包含该功能。


1
因为通常做一个您想做的事情是个坏主意,所以请描述您为什么要这么做。
rozcietrzewiacz 2011年

我有备份,请放心:)
Rufo El Magufo 2011年

好的,您已经被警告并想要比赛,所以去... :)
rozcietrzewiacz 2011年

Answers:


17

仅供参考,这是一个坏主意,您可能会失去一切。如果您仍然想要这样做,请按照以下步骤操作:

  1. 不要这样 如果这没有帮助,则:
  2. 使用该sfdisk工具:首先,使用以下方法备份分区表:

    sfdisk -d /dev/sda > sda.out
    

    然后去吧:

    sfdisk /dev/sda -O sda-partition-sectors.save
    

    您会看到类似这样的内容

    Checking that no-one is using this disk right now ...
    OK
    
    Disk /dev/sda: 1018 cylinders, 124 heads, 62 sectors/track
    Old situation:
    Units = cylinders of 3936256 bytes, blocks of 1024 bytes, counting from 0
    
       Device Boot Start     End   #cyls    #blocks   Id  System
    /dev/sda1          0+      5       6-     23063+  83  Linux
    /dev/sda2          6    1017    1012    3890128   83  Linux
    /dev/sda3          0       -       0          0    0  Empty
    /dev/sda4          0       -       0          0    0  Empty
    Input in the following format; absent fields get a default value.
    <start> <size> <type [E,S,L,X,hex]> <bootable [-,*]> <c,h,s> <c,h,s>
    Usually you only need to specify <start> and <size> (and perhaps <type>).
    
    /dev/sda1 :
    

现在,它要求您提供“ sda1”分区的新详细信息。因此,您必须在此处提供sda2的编号。因此,我在此处输入“ 6 1012”,然后按Enter:

    /dev/sda1 :6 1012
    /dev/sda1          6    1017    1012    3890128   83  Linux
    /dev/sda2 :

现在,检查按Enter后打印的数字是否与先前为sda2打印的数字完全相同。如果可以,请继续给sda2指定新的数字:

    /dev/sda2 :0
    /dev/sda2          0+      5       6-     23063+  83  Linux
    /dev/sda3 :

这次我就输入“ 0”就足够了-但是您必须确保您的数字没有弄乱。

接下来,以相同的方式继续其他分区。如果已经到达磁盘末端,则按Enter键就足够了。最后,再次检查所有数字是否正确,然后保存分区表(或不保存)。如果您搞砸了,请查看man sfdisk'-d','-O'和'-I'选项的说明。

还要注意,进行了疯狂的更改后,可能需要运行“ sync”,以便在尝试装入分区之前重新读取分区。


感谢您的回答。您是对的,这很可怕:)。
Rufo El Magufo 2011年

邪恶极了。如果数字不同会怎样?放弃并重新分区?(这就是我所做的)
supervacuo 2012年

1
@supervacuo Testisk可能会为您提供帮助。testdisk在发行版的软件数据库中搜索软件包。
rozcietrzewiacz 2012年

@supervacuo如果编号不同,则新分区与旧分区不在同一位置,您可能会破坏它们。如果您对磁盘没有执行任何其他操作,则可以还原希望备份的分区表,然后再开始尝试。如果不是,那么您最好希望正确的数字仍在控制台上的某个位置,或者您可以记住分区的确切大小和位置并计算出数字。
米歇尔·约翰逊

31

我只是以一种更简单的方式做到了这一点:

# sfdisk -d /dev/sdb > sdb.bkp

为了安全起见

# cp sdb.bkp sdb.new 

现在编辑sdb.new,仅更改行顺序和分区号,如我的情况:

# partition table of /dev/sdb
unit: sectors

/dev/sdb1 : start=  1026048, size=975747120, Id=83
/dev/sdb2 : start=     2048, size=   204800, Id=83
/dev/sdb3 : start=   206848, size=   819200, Id= b
/dev/sdb4 : start=        0, size=        0, Id= 0

# partition table of /dev/sdb
unit: sectors

/dev/sdb1 : start=     2048, size=   204800, Id=83
/dev/sdb2 : start=   206848, size=   819200, Id= b
/dev/sdb3 : start=  1026048, size=975747120, Id=83
/dev/sdb4 : start=        0, size=        0, Id= 0

然后把它扔回磁盘分区表?

# sfdisk /dev/sdb < sdb.new

在我缩小并右移唯一的分区(sdb1)以使用磁盘在磁盘的开头添加两个较小的分区之后,我的编号顺序受到了干扰gparted

如果最后一个命令不起作用,例如我的情况,请将其更改为:

# sfdisk --no-reread -f /dev/sdb < sdb.new

这对我有用,而我最终并不需要第二条命令。
亚伦·弗兰克

同样对我来说,谢谢;)...注意,请确保在命令之前已卸载所有分区
intika

3

您必须重写驱动器分区表以颠倒顺序,这样做有点冒险。如果您是我,那么我将解决使您想要交换设备名称顺序并将分区留空的问题。

例如,如果您有一个脚本需要在两台计算机上运行,​​并且希望它访问同一台设备,则可以在另一个目录(不是/ dev)中创建一个链接,该链接在两个服务器上都具有相同的名称,但是链接到/ dev / sda1在一个上,/ dev / sda2在另一个上。

您可以使用任何分区编辑器(fdiskcfdisk)来编辑分区,但是您需要写下当前设置或拍摄屏幕照片。删除两个分区,然后手动创建它们,并指定所有正确的值。使用LiveCD引导系统来执行此操作。


我什么都不能改变 我的系统是Xen DomU,问题出在Dom0中。我可以重新创建分区的顺序,但是在我的情况下更复杂。但是无论如何,我想知道如何更改顺序。
Rufo El Magufo 2011年

2

首先,这整个过程是尽力而为的事情,但是无论如何,这是您可以尝试的另一种方法。

注意:您没有提到从何处引导,并且此解决方案以及我在撰写本文时没有其他解决方案正在解决使LILO或GRUB正常工作所需的工作。

/dev/sda1/dev/sda2是块设备(8,1)和(8,2)。您可以尝试mknod简单地将两者互换。

telinit 1
(...)
rm -f /dev/sda{1,2}; mknod /dev/sda1 b 8 2; mknod /dev/sda2 b 8 1
chmod 640 /dev/sda{1,2}; chown root:disk /dev/sda{1,2}
reboot

只要记住,只有在你的分区包含此交换会发生/dev/在启动时加载的,所以initrd仍会有“正确”的人,除非你解决它有太多(读者练习-会mkinitrd?复制陌生感)这也不会解决SELinux上下文。


引导加载程序不是问题:)。感谢您的解决方案,但我需要更改分区表中的顺序,而不是系统中的顺序。
Rufo El Magufo 2011年

1
这在使用udev的任何系统上都行不通,并且仅在应用程序从名为的文件中读取/dev/sda(而不是直接读取磁盘)时才有帮助。
吉尔(Gilles)'所以

两者-同意。整个问题恕我直言是痛苦的运动。我不确定这些udev东西。显然,我研究的第一个系统ssh没有它。
亚伦·马拉斯科

2

我刚刚发现了一个解决这个问题的简单方法。假设您只剩下一个名为的分区/dev/sda3。您希望它被调用/dev/sda1。打开gdisk,将分区表转换为GPT,然后写入并退出。然后再次打开它,按sort(这会将GPT编号更改为1),然后通过专家选项将GPT转换回MBR。


1

-以根用户身份在终端中将/ dev / sda3分区编辑为/ dev / sda2-

  1. 备份分区表

    sfdisk -d / dev / sda> sda.bkp

  2. 将分区表备份复制到新的分区表

    cp sda.bkp sda.new

  3. 编辑新的分区表

    gedit sda.new

在此处输入图片说明

保存,关闭

  1. 重新安装新的分区表

    sfdisk --no-reread -f / dev / sda <sda.new

  2. 重新启动电脑


尽管这是可行的,但我还是建议使用GParted LiveCD
eyoung100

1
我认为您可以比使用非等宽字体,可见的插入点和可见的拼写检查器错误的文本编辑器截图更好。
米歇尔·约翰逊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.