Ruf*_*ufo 31 linux partition fdisk
我有一个有两个分区的磁盘:sda1 和 sda2。我想将 sda1 的数量更改为 sda2,将 sda2 的数量更改为 sda1。
有可能,但我不记得程序。即我的第一个分区将是 sda2 和第二个 sda1,所以我需要指定一个手动顺序,而不是像 fdisk -> x -> f 中的自动排序。
如何更改订单?也欢迎提供手册或教程的链接。
谢谢。
原因:我有一个应用程序需要从 sda1 读取数据,但数据在 sda2 中。更改分区表是解决此问题的最快方法。系统并不重要,但我不想让系统停止太长时间。
更新:OpenBSD 的 fdisk 版本包括这个功能。
小智 43
我只是以更简单的方式做到了这一点:
# sfdisk -d /dev/sdb > sdb.bkp
Run Code Online (Sandbox Code Playgroud)
为安全起见留一份副本
# cp sdb.bkp sdb.new
Run Code Online (Sandbox Code Playgroud)
现在编辑 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
Run Code Online (Sandbox Code Playgroud)
到
# 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
Run Code Online (Sandbox Code Playgroud)
然后把它扔回磁盘分区表?
# sfdisk /dev/sdb < sdb.new
Run Code Online (Sandbox Code Playgroud)
在我缩小并向右移动唯一的分区 (sdb1) 以使用gparted.
如果最后一个命令不起作用,就我而言,请将其更改为:
# sfdisk --no-reread -f /dev/sdb < sdb.new
Run Code Online (Sandbox Code Playgroud)
roz*_*acz 20
仅供参考,这是一个坏主意,您可能会失去一切。如果您仍然想这样做,请按以下步骤操作:
使用sfdisk工具:首先,使用
sfdisk -d /dev/sda > sda.out
Run Code Online (Sandbox Code Playgroud)
然后去吧:
sfdisk /dev/sda -O sda-partition-sectors.save
Run Code Online (Sandbox Code Playgroud)
你会看到这样的东西
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 :
Run Code Online (Sandbox Code Playgroud)现在它要求您提供“sda1”分区的新详细信息。所以你必须在这里给出 sda2 的数量。因此,我将“6 1012”放在这里并按 Enter 键:
/dev/sda1 :6 1012
/dev/sda1 6 1017 1012 3890128 83 Linux
/dev/sda2 :
Run Code Online (Sandbox Code Playgroud)
现在检查按下 Enter 后打印的数字是否与之前为 sda2 打印的数字完全相同。如果没问题,继续为 sda2 提供新数字:
/dev/sda2 :0
/dev/sda2 0+ 5 6- 23063+ 83 Linux
/dev/sda3 :
Run Code Online (Sandbox Code Playgroud)
这次在我的情况下输入“0”就足够了 - 但你必须确保你的数字没有搞砸。
接下来,以相同的方式继续处理其他分区。如果您已经到达磁盘的末尾,按 Enter 就足够了。最后,再次检查所有数字是否正常并保存分区表(或不保存)。如果你搞砸了什么,看看man sfdisk'-d'、'-O' 和 '-I' 选项的描述。
另请注意,一旦您进行了疯狂的更改,您可能需要运行“同步”,以便在尝试挂载分区之前重新读取分区。
所有现有的解决方案看起来都很安全,但结果却相当复杂。
我想对我所有的分区重新排序,以便它们井然有序。
如果您更有经验,拥有非必要或备份的数据,并且乐于解决任何问题,您可以从 Live CD 启动并按以下方式进行:
sudo fdisk /dev/sdX
Run Code Online (Sandbox Code Playgroud)
然后:
x 进入专家模式f修复驱动器顺序(i如果需要,可能会忽略任何警告)r 返回正常模式w 将更改写入磁盘并退出我不记得接下来的确切步骤,因为我只做过一次并且没有重新测试,但是当我也在移动安装时,我也安装了分区并复制了所有文件:
sudo mkdir /mnt/sda4
sudo mount /dev/sda4 /mnt/sda4
sudo mkdir /mnt/sda5
sudo mount /dev/sda5 /mnt/sda5
date;cp -a /mnt/sda4/* /mnt/sda5;date
Run Code Online (Sandbox Code Playgroud)
然后得到分区ID:
sudo blkid
Run Code Online (Sandbox Code Playgroud)
并更新了以下内容以反映新的分区 UUID 值:
/mnt/sda5/boot/grub/grub.cfg /mnt/sda5/etc/fstab 然后我更新了 GRUB2:
sudo grub-install --root-directory=/mnt/sda5 /dev/sda
Run Code Online (Sandbox Code Playgroud)