有时,当调整大小或以其他方式处理磁盘上的分区时,cfdisk 会说:
Wrote partition table, but re-read table failed. Reboot to update table.
(这也发生在其他分区工具上,所以我认为这是一个 Linux 问题而不是 cfdisk 问题。)为什么会这样,为什么它只是有时会发生,我能做些什么来避免它?
注意:请假设我实际编辑的分区都没有打开、安装或以其他方式使用。
更新:
cfdisk 用于ioctl(fd, BLKRRPART, NULL)
告诉 Linux 重新读取分区表。到目前为止推荐的其他两个工具 ( hdparm -z
DEVICE
, sfdisk -R
DEVICE
) 的作用完全相同。partprobe
DEVICE
另一方面,该命令似乎使用了一个名为 BLKPG 的新 ioctl,这可能会更好;我不知道。(如果 BLKPG 失败,它也会退回到 BLKRRPART。)
BLKPG 似乎是“此分区已更改;这是新的大小”操作,看起来像是partprobe
在通过的设备上的所有分区上单独调用它,因此如果各个分区未使用,它应该可以工作。但是,我还没有机会尝试。
恕我直言,最可靠/最好的答案是
重读分区表信息并不总是有效,但试试
或者
如果它有效,/proc/partitions 中的值将会改变。
几天前,我(最初的提问者)遇到了一种情况,当时没有其他答案(包括
partprobe /dev/sdX
目前被接受和投票率最高的答案)起作用。然而,起作用的是:(我不知道为什么这有效而其他无效,但我很高兴它确实有效,因为它让我在繁忙的服务器上重新启动。)
在 Centos7 上:
根据https://access.redhat.com/solutions/199573
你应该试试 :
它对我有用。
鉴于此假设,分区表可以成功重新扫描,并且不会出现问题。如果您收到该错误,那是因为分区表当前正在使用中,因此无法重新扫描而不会造成不一致。
它不是基于您正在编辑的分区。
假设您只有一个硬盘 (
/dev/sda
) 和两个分区 (/dev/sda1
,/dev/sda2
),并且您只挂载了一个分区 (/dev/sda1
)。如果您删除或更改了其他未挂载的分区的任何内容(/dev/sda2
),您将收到重新读取分区表失败并且内核将使用旧表的错误。但是如果你有两个硬盘 (
/dev/sda
,/dev/sdb
) 并且 ( ) 的分区/dev/sdb
都没有在使用中。然后您可以添加/删除/调整大小/编辑分区,/dev/sdb
它们将被重新读取而没有任何问题。但是即使在更改期间挂载了 /dev/sdb 的一个分区。然后内核将继续使用旧表。卸载所有挂载点,运行 Yocto 2.4:
在设备上删除分区后仍然无法重新加载分区表。还尝试过——但失败的是:
所有人都报告了类似的“BLKRRPART 失败:设备或资源繁忙...”错误,指示我重新启动。以前工作方法的这种失败是否可能是由于 udev 现在处于系统控制之下?沿着我尝试的这些思路思考:
突然间,我的磁盘再次可用,无需重新启动!
我在 centos 6.5 x64 上;内核 2.6.32 。我正在测试 fdisk 技巧来调整大小。
以下所有命令都没有使内核重新读取分区:
我仍然需要重新启动才能使其正常工作
当类似命令
blockdev --rereadpt /dev/sdX
失败时这通常意味着某些(旧)分区确实仍然以某种方式被内核使用。
可能的原因/修复:
sdX1
- 仍然挂载 - 检查mount
并卸载它/dev/sdX1
是软件突袭的一部分 - 检查cat /proc/mdstat
并可能停止相关阵列,例如mdadm --stop /dev/md126
/dev/sdX1
是 LVM 物理卷的一部分 - 检查pvdisplay
/vgdisplay
并可能停用vgchange
/dev/sdX1
是某些设备映射的一部分 - 例如通过cryptsetup
- 检查/dev/mapper
并lsblk
可能删除映射(例如cryptsetup luksClose
)ps
并可能杀死一个如果一个工具 - 比如说
blockdev --rereadpt
失败,通常类似的工具(如 (partx -uv
,kpartx
,partprobe
,kpartprobe
) 会以类似的方式失败,直到消除根本原因。你也可以试试:
(但可能不起作用,请参阅下面的评论)