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


Wrote partition table, but re-read table failed. Reboot to update table.


(其他分区也会发生这种情况工具,所以我认为这是Linux问题,而不是cfdisk问题。)为什么会这样,为什么它有时仅会发生,我该如何避免呢?

注意:请假设我实际上正在编辑的所有分区均未打开,未安装或正在使用中。


更新:

cfdisk使用ioctl(fd, BLKRRPART, NULL)告诉Linux重新读取分区表。到目前为止,推荐的其他两个工具(hdparm -z DEVICEsfdisk -R DEVICE)的功能完全相同。另一方面,partprobe DEVICE命令似乎使用了一个称为BLKPG的新ioctl,可能更好。我不知道。 (如果BLKPG失败,它也会退回到BLKRRPART上。)

BLKPG似乎是“此分区已更改;这是新的大小”操作,看起来像partprobe在所有分区已通过设备上的分区,因此如果未使用各个分区,它应该可以工作。但是,我没有机会尝试。

评论

man sfdisk说:自版本2.26以来,sfdisk不再提供-R或--re-read选项来强制内核重新读取分区表。请使用blockdev --rereadpt。

#1 楼

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

partprobe /dev/sdX


评论


我刚刚在Ubuntu Server下扩展了一个开发人员,这个开发人员是一个硬件突袭。在使用raidcontroller扩展了基础RAID之后,我卸载了文件系统并尝试了“ partprobe / dev / sda”-这不起作用。 “ fdisk -l”仍显示旧大小。然后,我运行了“ hdparm -z / dev / sda”,这成功了。然后,我可以不重新引导就挂载文件系统并调整其大小。我知道除了YMMV之外,我没有添加任何其他内容。

– Mwuanno
2014年5月28日13:30

我在centos 6.5上;内核2.6.32。以下所有命令均未使内核重新读取分区:-partprobe / dev / sda(warnikg:内核无法重新读取)

–最大
15年5月29日在7:56



@Max,我也注意到有时,有时partprobe也会打印出不起作用的错误。有时,重新启动是确定的唯一选择。很多时候它似乎确实对我有用。

–马特
2015年10月1日,下午3:38

这对我不起作用,因为仍然有一些目录挂载--bind。该分区本身已经被卸载,但是指向该分区的绑定安装仍然存在。奇怪的是,umount可以工作并且不能进行部分探测,但是在也删除了绑定安装后,我还可以对磁盘进行部分探测。

– Ethan Leroy
15年11月23日在19:32

在用kpartx和udevadm触发器鞭打10分钟后,这对我在CentOS 6上起作用了。谢谢!

–麦克·安德鲁斯(Mike Andrews)
16年4月15日在14:14

#2 楼

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

hdparm -z /dev/sda




sfdisk -R /dev/sda


如果可行/ proc / partitions中的值将更改。

评论


hdparm为我工作。

–法尔肯教授
2011年6月9日在22:03

sfdisk -R选项不存在。

–马特
2015年5月19日,0:09

应当注意,hdparm命令仅在未安装分区的情况下才有效。

–user66336
2015年11月16日23:45

...的确,看起来sfdisk -R已在util-linux 2.24.2和2.26.1之间的某个位置被删除

–查尔斯·达菲(Charles Duffy)
16年1月25日在16:21

man sfdisk说:自版本2.26以来,sfdisk不再提供-R或--re-read选项来强制内核重新读取分区表。请改用blockdev --rereadpt。

–汤姆·黑尔
17年1月18日在2:26

#3 楼

在Centos7上:

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

,您应该尝试:

partx -u <partition>


对我有用。

评论


那是唯一为我工作的人。非常感谢你的分享!!先生,最重要的一天!

–NotGaeL
16年4月8日在18:36

#4 楼


注意:请假设我实际上正在编辑的所有分区均未打开,安装或以其他方式使用。


假设,分区表可以重新扫描成功,不会出现此问题。如果遇到该错误,那是因为分区表当前正在使用中,因此如果不创建不一致项就无法重新扫描。

评论


可能正在使用某些分区,但是尽管实际上它们在同一个分区表中,但是这些分区都不是我实际上要更改的分区。

–泰迪
09年7月11日在1:22

内核不是那么聪明。如果表中有任何分区正在使用,则内核不会重新扫描。从另一个方向犯错可能是灾难性的,因此很安全。如果您想随意使用分区,请使用LVM。

–womble♦
09年7月11日在2:05

#5 楼

几天前,我(原始提问者)遇到了一种情况,其他答案(包括partprobe /dev/sdX,目前是公认的投票最高的答案)都没有起作用。但是,这是行得通的:

blockdev --rereadpt /dev/sdX


(我不知道为什么这行得通,而其他人却不行,但是我很高兴它行得通,因为它节省了我在繁忙服务器上的重启时间。)

#6 楼

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

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

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

#7 楼

我在centos 6.5 x64上;内核2.6.32。并且我正在测试fdisk技巧以调整大小。

/dev/sda1 /boot
/dev/sda2 /


以下所有命令均未使内核重新读取分区:



partprobe / dev / sda(警告:内核无法重新读取...。)

hdparm -z / dev / sda(BLKRRPART失败:设备或资源繁忙)

blockdev -rereadpt / dev / sda(BLKRRPART失败:设备或资源忙)

sfdisk -R / dev / sda(BLKRRPART失败:设备或资源忙)

我仍然需要重启才能使其正常工作

评论


这些都不对我有用(proxmox VM,centos 7,xfs分区,没有lvm)。 @uus答案确实有效,但是:serverfault.com/a/722386/102252

–NotGaeL
16年4月8日在18:37

以上所有命令对我也不起作用。

–法迪·阿斯比(Fadi Asbih)
17年3月15日在10:59

我认为内核2.6.32有问题,我以前在其他计算机上使用过它们,即使在较旧的分区之间添加编号更高的分区时,它也能正常工作。即sdb1 sdb2 sdb3-删除sdb2,然后删除sdb1 sdb4 sdb5 sdb3。除上述以外,partx,kpartx,blockdev也无法正常工作。

–sdkks
17年6月30日在13:45

我不认为如果一个命令重新读取分区失败而全部失败,也并不罕见-有关如何消除某些原因的信息,请参见我的回答。

–maxschlepzig
18-11-17在20:58

#8 楼

在卸载所有安装点的情况下,运行Yocto 2.4:

partprobe /dev/sda 


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

udevadm trigger --subsystem-match=block; udevadm settle
hdparm -z /dev/sda
blockdev --rereadpt /dev/sda


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

systemctl restart systemd-udevd.service


突然间,我的磁盘再次可用,无需重新启动!

评论


公认的最高答案是不完整的:在现代系统世界中,THIS是正确的答案。请注意,您还需要重新启动systemd-udev-settle和systemd-udev-trigger(或两者)之一。像Camp所说的那样重新启动systemd-udevd对我来说还不够。但是重新启动另外两个也成功了!

– Costin Gușă
19-2-5在18:03



#9 楼

您也可以尝试:

echo 1 > /sys/block/sdX/device/rescan


(但可能不起作用,请参见下面的评论)

评论


这不会重新读取分区表。它仅更新几何信息,高速缓存模式等。正在发出SCSI IDENTIFY_DRIVE。

– Dmitri Chubarov
2012年6月9日在8:27

这是唯一对vmware vm有所帮助的解决方案。

–user3132194
20-2-11在11:57

@ user3132194,我想您只是要调整驱动器的大小?然后,您需要重新扫描设备,而不是重新读取分区表。这是两个完全不同的操作,只有重新读取分区表才是该问题的主题。

–查尔斯·达菲(Charles Duffy)
20年11月7日,1:12

#10 楼

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

blockdev: ioctl error on BLKRRPART: Device or resource busy


时,这通常意味着内核确实仍在使用某些(旧)分区。

可能的原因/修复:


sdX分区-说sdX1-仍在安装-检查mount并卸载它

/dev/sdX1是软件团队的一部分-检查cat /proc/mdstat并可能停止相关阵列,例如mdadm --stop /dev/md126是LVM物理卷的一部分-使用/dev/sdX1 / pvdisplay检查并可能通过vgdisplay停用


vgchange是某些设备的一部分映射-例如通过/dev/sdX1-检查cryptsetup/dev/mapper并可能删除映射(例如lsblk
使用udev探测来检查竞赛条件-使用cryptsetup luksClose检查运行的进程并可能杀死一个

如果使用一种工具-如说ps失败通常以类似的方式失败(blockdev --rereadptpartx -uvkpartxpartprobe)以类似的方式失败,直到根本原因得以消除。

#11 楼

在Alpine-Linux netboot模式下,
在dmesg中显示了新分区,
存在主磁盘/ dev / sda
,但没有/ dev / sdaX分区设备文件,
尝试了所有上面的技巧,
最后

mknod -m 660 ${chroot_dir}/dev/sda1 b 8 1
mknod -m 660 ${chroot_dir}/dev/sda2 b 8 2


工作了
https://wiki.alpinelinux.org/wiki/Alpine_Linux_in_a_chroot

评论


设备节点上的666不是特别明智。您不希望非管理用户直接进入基础块设备来绕过文件权限。

–查尔斯·达菲(Charles Duffy)
20-11-15在1:10



#12 楼

对我而言,partprobeblockdev解决方案均无效。虽然,这是可行的:

udevadm settle --exit-if-exists=/dev/sdb1


#13 楼

kpartx -a <partition>可以在新创建的分区上运行两次...。而不用重新启动系统。

评论


两次?您还会运行“同步”吗?同步;同步”? smell我闻到迷信…

–泰迪
15年3月12日在13:04

我认为这种迷信来自您通过执行第二次同步来检查是否同步的事实。除了第二个仅对操作员有价值之外,要确认第二个返回到立即提示,从而表明第一个同步已按预期完成。以后有一些博客和教程,以及....

– J. M. Becker
2015年10月5日13:59

#14 楼

请记住检查udev服务是否正在运行。当partprobe,hdparm,blockdev和其他各种命令似乎对/ dev /目录中可用的设备文件没有任何影响时,这尤其有用。

#15 楼

如果您阅读“ man oracleasm-scandisks”的手册页,则会注意到下面的内容。 oracleasm使用/ proc / partitions作为其执行的所有扫描的源。必须先在/ proc / partitions中列出原始设备,然后才能进行磁盘扫描。您在/ etc / sysconfig / oracleasm中放置的Scanorder和Scanexclude参数与在/ proc / partitions(!!!!)中找到的名称相关。

---------- man oracleasm-scandisks ------
...

如何进行扫描
扫描分为四个基本阶段。

   First, the list of disks to scan is created. If disks were specified on the command line, this is the list.
   If not, /proc/partitions is read, and each block device is added, subject to the -o and -x options.

   Second, the partition tables of each disk in the scan are reloaded unless the -s option was specified. Any
   disks that no longer exist are dropped.

   Third, the list of disks is recreated based on the new partition tables.

   Finally, each disk in the list is checked to see if it is marked for ASM use. Disks that are marked are
   instantiated.


评论


...他没有提到使用oracleasm-scandisks

–voretaq7
13年4月26日在17:45

这是单独的(Oracle提供的)软件,正在读取/ proc / partitions。这个问题的目的是如何告诉内核本身更新用于生成/ proc / partitions的数据。

–查尔斯·达菲(Charles Duffy)
20年11月7日,1:13