Ted*_*ddy 78 linux partition fdisk
有时,在调整磁盘分区大小或以其他方式处理磁盘分区时,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
在通过的设备上的所有分区上单独调用它,所以如果单个分区未使用,它应该可以工作。但是,我还没有机会尝试。
小智 20
重新读取分区表信息并不总是有效,但请尝试
hdparm -z /dev/sda
Run Code Online (Sandbox Code Playgroud)
或者
sfdisk -R /dev/sda
Run Code Online (Sandbox Code Playgroud)
如果它有效,/proc/partitions 中的值将会改变。
小智 13
在 Centos7 上:
根据https://access.redhat.com/solutions/199573
你应该试试 :
partx -u <partition>
Run Code Online (Sandbox Code Playgroud)
它对我有用。
几天前,我(最初的提问者)遇到了一个情况,当时其他答案(包括partprobe /dev/sdX
目前已接受和投票最高的答案)都不起作用。什么做工作,但是,是这样的:
blockdev --rereadpt /dev/sdX
Run Code Online (Sandbox Code Playgroud)
(我不知道为什么这有效而其他人没有,但我很高兴它确实有效,因为它让我在繁忙的服务器上重新启动。)
注意:请假设我实际编辑的分区都没有打开、安装或以其他方式使用。
有了这个假设,分区表就可以成功重新扫描,问题就不会出现了。如果您收到的错误,这是因为分区表是目前使用的,因此不能没有创造不一致重新扫描。
它不是基于您正在编辑的分区。
假设您只有一个硬盘 ( /dev/sda
) 和两个分区 ( /dev/sda1
, /dev/sda2
),并且您只挂载了一个分区 ( /dev/sda1
)。如果您删除或更改其他甚至未安装的分区的任何内容(/dev/sda2
),您将收到重新读取分区表失败并且内核将使用旧表的错误。
但是,如果您有两个硬盘 ( /dev/sda
, /dev/sdb
) 并且 ( /dev/sdb
)的分区均未使用。然后你可以添加/删除/调整大小/编辑分区,/dev/sdb
它们将被重新读取,没有任何问题。但即使在更改期间挂载了 /dev/sdb 的一个分区。然后内核将继续使用旧表。
当类似命令blockdev --rereadpt /dev/sdX
失败时
blockdev: ioctl error on BLKRRPART: Device or resource busy
Run Code Online (Sandbox Code Playgroud)
这通常意味着某些(旧的)分区确实仍然被内核以某种方式使用。
可能的原因/修复:
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
小智 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)
突然我的磁盘又可用了,无需重新启动!