无需重启即可重新读取分区表?

Ted*_*ddy 78 linux partition fdisk

有时,在调整磁盘分区大小或以其他方式处理磁盘分区时,cfdi​​sk 会说:

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在通过的设备上的所有分区上单独调用它,所以如果单个分区未使用,它应该可以工作。但是,我还没有机会尝试。

knw*_*iss 74

恕我直言,最可靠/最好的答案是

partprobe /dev/sdX
Run Code Online (Sandbox Code Playgroud)


小智 20

重新读取分区表信息并不总是有效,但请尝试

hdparm -z /dev/sda
Run Code Online (Sandbox Code Playgroud)

或者

sfdisk -R /dev/sda
Run Code Online (Sandbox Code Playgroud)

如果它有效,/proc/partitions 中的值将会改变。

  • sfdisk -R 选项不存在。 (3认同)
  • `man sfdisk` 说:`自从 2.26 版 sfdisk 不再提供 -R 或 --re-read 选项来强制内核重新读取分区表。改用 blockdev --rereadpt。` (2认同)

小智 13

在 Centos7 上:

根据https://access.redhat.com/solutions/199573

你应该试试 :

partx -u <partition>
Run Code Online (Sandbox Code Playgroud)

它对我有用。

  • 那是唯一对我有用的方法。非常感谢你的分享!!最重要的是你,先生! (2认同)

Ted*_*ddy 9

几天前,我(最初的提问者)遇到了一个情况,当时其他答案(包括partprobe /dev/sdX目前已接受和投票最高的答案)都不起作用。什么工作,但是,是这样的:

blockdev --rereadpt /dev/sdX
Run Code Online (Sandbox Code Playgroud)

(我不知道为什么这有效而其他人没有,但我很高兴它确实有效,因为它让我在繁忙的服务器上重新启动。)


wom*_*ble 8

注意:请假设我实际编辑的分区都没有打开、安装或以其他方式使用。

有了这个假设,分区表可以成功重新扫描,问题就不会出现了。如果您收到的错误,这是因为分区表目前使用的,因此不能没有创造不一致重新扫描。

  • 内核不是那么聪明。如果表中的任何分区正在使用中,内核不会重新扫描。在另一个方向上出错可能是灾难性的,所以它是安全的。如果您想随意使用分区,请使用 LVM。 (9认同)

Sau*_*iya 6

它不是基于您正在编辑的分区。

假设您只有一个硬盘 ( /dev/sda) 和两个分区 ( /dev/sda1, /dev/sda2),并且您只挂载了一个分区 ( /dev/sda1)。如果您删除或更改其他甚至未安装的分区的任何内容(/dev/sda2),您将收到重新读取分区表失败并且内核将使用旧表的错误。

但是,如果您有两个硬盘 ( /dev/sda, /dev/sdb) 并且 ( /dev/sdb)的分区均未使用。然后你可以添加/删除/调整大小/编辑分区,/dev/sdb它们将被重新读取,没有任何问题。但即使在更改期间挂载了 /dev/sdb 的一个分区。然后内核将继续使用旧表。


max*_*zig 6

当类似命令blockdev --rereadpt /dev/sdX失败时

blockdev: ioctl error on BLKRRPART: Device or resource busy
Run Code Online (Sandbox Code Playgroud)

这通常意味着某些(旧的)分区确实仍然被内核以某种方式使用。

可能的原因/修复:

  1. 一个 sdX 分区 - 比如说sdX1- 仍然安装 - 检查mount并卸载它
  2. /dev/sdX1是软件袭击的一部分 - 检查cat /proc/mdstat并可能停止相关阵列,例如mdadm --stop /dev/md126
  3. /dev/sdX1是 LVM 物理卷的一部分 - 使用pvdisplay/检查vgdisplay并可能使用停用vgchange
  4. /dev/sdX1是某些设备映射的一部分 - 例如通过cryptsetup- 检查/dev/mapperlsblk可能删除映射(例如cryptsetup luksClose
  5. 一些 udev 探测的竞争条件 - 检查正在运行的进程ps并可能杀死一个进程

如果一种工具blockdev --rereadpt失败,通常类似的工具(如(partx -uv、、、、) )会以类似的方式失败kpartx,直到消除根本原因。partprobekpartprobe


小智 5

卸载所有挂载点后,运行 Yocto 2.4:

partprobe /dev/sda 
Run Code Online (Sandbox Code Playgroud)

在设备上删除分区后,仍然无法重新加载分区表。还尝试过但失败的是:

udevadm trigger --subsystem-match=block; udevadm settle
hdparm -z /dev/sda
blockdev --rereadpt /dev/sda
Run Code Online (Sandbox Code Playgroud)

所有报告都报告类似的“BLKRRPART 失败:设备或资源繁忙...”错误,指示我重新启动。以前工作方法的失败是否可能是由于 udev 现在处于 systemd 控制之下?我尝试按照这些思路思考:

systemctl restart systemd-udevd.service
Run Code Online (Sandbox Code Playgroud)

突然我的磁盘又可用了,无需重新启动!