重新读取分区表而不重启?


71

有时,当调整大小或以其他方式处理磁盘上的分区时,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在传递的设备上的所有分区上单独调用它,因此如果未使用单个分区,它应该可以工作。但是,我没有机会尝试。


1
man sfdisk说:Since version 2.26 sfdisk no longer provides the -R or --re-read option to force the kernel to reread the partition table. Use blockdev --rereadpt instead.
汤姆·黑尔

Answers:


66

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

partprobe /dev/sdX

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

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

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

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

这与各地flagellating后为我工作在CentOS 6 kpartxudevadm trigger10分钟。谢谢!
Mike Andrews

19

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

hdparm -z /dev/sda

要么

sfdisk -R /dev/sda

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


hdparm为我工作。
Falken教授

3
sfdisk -R选项不存在。
马特

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

...的确,它看起来像是sfdisk -R在util-linux 2.24.2和2.26.1之间的某个位置被删除了
Charles Duffy

1
man sfdisk说:Since version 2.26 sfdisk no longer provides the -R or --re-read option to force the kernel to reread the partition table. Use blockdev --rereadpt instead.
汤姆·黑尔


8

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

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


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

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

6

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

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

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


5

几天前,我(原始提问者)遇到了一种情况,其他任何答案(包括partprobe /dev/sdX,目前已被接受且投票最高的答案)均无效。什么工作,但是,是这样的:

blockdev --rereadpt /dev/sdX

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


5

我在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

以上所有命令对我也不起作用。
法迪·阿斯比

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

我不认为如果一个命令重新读取分区失败而全部失败,也并不罕见,另请参阅我的答案以消除这种情况的一些原因
maxschlepzig

3

卸载所有安装点后,运行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

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


公认的最高答案是不完整的:在现代systemd世界中,这是正确的答案。请注意,您还需要重新启动其中之一(或同时重新启动)systemd-udev-settlesystemd-udev-triggersystemd-udevd像Camp所说的那样重新启动对我来说还不够。但是重新启动另外两个也成功了!
Costin Gușă

1

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

blockdev: ioctl error on BLKRRPART: Device or resource busy

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

可能的原因/修复:

  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 -uvkpartxpartprobekpartprobe)以类似的方式失败,直到根本原因被消除。


0

您也可以尝试:

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

(但无法使用,请参见下面的评论)


3
这不会重新读取分区表。它仅更新几何信息,高速缓存模式等。正在发出SCSI IDENTIFY_DRIVE。
德米特里·丘巴罗夫

0

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


2
两次?您还运行“ sync; sync; sync”吗?smell我闻到了迷信…
泰迪

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

0

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


0

对我而言partprobeblockdev解决方案都无效。虽然,这一作品:

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

-3

如果您阅读“ 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.

2
...他没有提及使用oracleasm-scandisks
voretaq7 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.