83

Sometimes, when resizing or otherwise mucking about with partitions on a disk, cfdisk will say:

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

(This also happens with other partitioning tools, so I'm thinking this is a Linux issue rather than a cfdisk issue.) Why is this, and why does it only happens sometimes, and what can I do to avoid it?

Note: Please assume that none of the partitions I am actually editing are opened, mounted or otherwise in use.


Update:

cfdisk uses ioctl(fd, BLKRRPART, NULL) to tell Linux to reread the partition table. Two of the other tools recommended so far (hdparm -z DEVICE, sfdisk -R DEVICE) does exactly the same thing. The partprobe DEVICE command, on the other hand, seems to use a new ioctl called BLKPG, which might be better; I don't know. (It also falls back on BLKRRPART if BLKPG fails.)

BLKPG seems to be a "this partition has changed; here is the new size" operation, and it looked like partprobe called it individually on all the partitions on the device passed, so it should work if the individual partitions are unused. However, I have not had the opportunity to try it.

Teddy
  • 5,134
  • 1
  • 22
  • 27
  • 1
    `man sfdisk` says: `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.` – Tom Hale Jan 18 '17 at 02:26

15 Answers15

80

IMHO the most reliable/best answer is

partprobe /dev/sdX
knweiss
  • 3,955
  • 23
  • 20
  • 1
    I just expanded a dev under Ubuntu Server, this dev is a hardware raid. After expanding the underlying raid using the raidcontroller, I dismounted the filesystem and tried "partprobe /dev/sda" - this did not work. "fdisk -l" still showed the old size. I then ran "hdparm -z /dev/sda" and this did the trick. I could then mount and resize my filesystem with no reboot. I know I'm not adding anything really other than YMMV. – Mwuanno May 28 '14 at 13:30
  • i'm on centos 6.5 ; kernel 2.6.32 . all the following commands did not make kernel reread partition : - partprobe /dev/sda (warnikg : kernel failed to reread) – Max May 29 '15 at 07:56
  • @Max, I've also noticed that sometimes even partprobe prints out an error that it didn't work. Sometimes a reboot is the only option to be certain. Many times it does seem to work for me though. – hookenz Oct 01 '15 at 03:38
  • This did not work for me because there were some directories still mounted with --bind. The partition itself was already unmounted but the bind-mounts pointing to that partition were still there. Strange that umount worked and partprobe not, but after umounting the bind-mounts too, I could also partprobe the disk. – Ethan Leroy Nov 23 '15 at 19:32
  • This worked for me on CentOS 6 after flagellating around with `kpartx` and `udevadm trigger` for 10 minutes. Thank you! – Mike Andrews Apr 15 '16 at 14:14
  • This works even if the device is mounted. Nice! This enabled me to resize a cloud disk, then repartition and resize the ext4 partition on it without interrupting a data import process. – mpartel Apr 19 '17 at 06:57
  • This doesn't work if some sdX partition is part of a [started software RAID array](https://serverfault.com/a/940531/63769) (tested under 4.18.18-300.fc29.x86_64). – maxschlepzig Nov 17 '18 at 21:00
22

Rereading partition table information doesn't always work, but try

hdparm -z /dev/sda

or

sfdisk -R /dev/sda

If it works the values in /proc/partitions will change.

ko-dos
  • 1,359
  • 8
  • 10
16

I (the original questioner) had a situation a few days ago when none of the other answers (including partprobe /dev/sdX, currently the accepted and highest-voted answer) worked. What did work, however, was this:

blockdev --rereadpt /dev/sdX

(I don't know why this worked and the others didn't, but I'm happy it did work, as it saved me a reboot on a busy server.)

Teddy
  • 5,134
  • 1
  • 22
  • 27
14

On Centos7 :

According to https://access.redhat.com/solutions/199573

You should try :

partx -u <partition>

It worked for me.

Edredon
  • 151
  • 1
  • 3
  • 2
    That was the only one that work for me. Thank you so much for sharing!! Top of the day to you, sir! – NotGaeL Apr 08 '16 at 18:36
8

Note: Please assume that none of the partitions I am actually editing are opened, mounted or otherwise in use.

Given that assumption, the partition table can be successfully rescanned, and the issue won't arise. If you're getting that error, it's because the partition table is currently in use, and hence can't be re-scanned without creating inconsistencies.

Giacomo1968
  • 3,522
  • 25
  • 38
womble
  • 95,029
  • 29
  • 173
  • 228
  • Some partitions might be in use, but none of them are the ones that I am actually changing, though they might be in the same partition table. – Teddy Jul 11 '09 at 01:22
  • 9
    The kernel isn't that smart. If any partition in the table is in use, the kernel doesn't rescan. Getting that wrong in the other direction could be catastrophic, so it's being safe. If you want to stuff around with partitions at will, use LVM. – womble Jul 11 '09 at 02:05
6

It is not based on partition that you are editing.

Suppose you have only one harddisk (/dev/sda) and two partitions (/dev/sda1, /dev/sda2) and you have mounted only one partition (/dev/sda1). If you delete or change anything about other partition which is not even mounted (/dev/sda2) you will get the error that re-reading of partition table failed and kernel will use old table.

But if you have two harddisks (/dev/sda, /dev/sdb) and none of the partitions of (/dev/sdb) are in use. Then you can add / delete / resize /edit partitions of /dev/sdb and they will be re-read without any problem. But even if one partition of /dev/sdb was mounted during change. Then kernel will keep using old table.

Giacomo1968
  • 3,522
  • 25
  • 38
Saurabh Barjatiya
  • 4,643
  • 2
  • 29
  • 34
5

With all mount points unmounted, running Yocto 2.4:

partprobe /dev/sda 

Still failed to re-load the partition table after partitions had been deleted on the device. Also tried -- and failed were:

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

All reported similar "BLKRRPART failed : device or resource busy..." errors instructing me to reboot. Is this failure of previously working methods possibly due to the fact that udev is now under systemd control? Thinking along those lines I tried:

systemctl restart systemd-udevd.service

And suddenly my disk is available again, without a reboot!

  • 1
    The top accepted answer is incomplete: in the modern `systemd` world, THIS is the correct answer. Please note you also need to restart one of those (or both) `systemd-udev-settle` and `systemd-udev-trigger`. Restarting just `systemd-udevd` like Camp said was not enough for me. But restarting also the other two did the trick! – Costin Gușă Feb 05 '19 at 18:03
  • `systemctl restart systemd-udev*` worked for me (although it printed a lot of warnings). – Alex Henrie Nov 08 '21 at 18:36
4

i'm on centos 6.5 x64 ; kernel 2.6.32 . and i'm testing the fdisk trick to resize.

/dev/sda1 /boot
/dev/sda2 /

All the following commands did not make kernel reread partition :

  • partprobe /dev/sda (warning : kernel failed to reread ....)
  • hdparm -z /dev/sda (BLKRRPART failed : device or resource busy)
  • blockdev -rereadpt /dev/sda (BLKRRPART failed : device or resource busy)
  • sfdisk -R /dev/sda (BLKRRPART failed : device or resource busy)

i still need a reboot to make it work

Max
  • 452
  • 4
  • 9
  • none of that worked for me either (proxmox VM, centos 7, xfs partition, no lvm). @uus answer did work, though: http://serverfault.com/a/722386/102252 – NotGaeL Apr 08 '16 at 18:37
  • All the above commands did not work for me either. – Fadi Asbih Mar 15 '17 at 10:59
  • I think kernel 2.6.32 has issue, I used these before on other machines, it worked just fine, even when adding partitions with higher numbers between older partitions. i.e. sdb1 sdb2 sdb3 - delete sdb2 , then sdb1 sdb4 sdb5 sdb3. In addition to above, partx, kpartx, blockdev didn't work as well. –  Jun 30 '17 at 13:45
  • I don't think that it's unusual that if one command fails rereading the partitions, all fail - [see also my answer for how to eliminate some causes for this](https://serverfault.com/a/940531/63769). – maxschlepzig Nov 17 '18 at 20:58
4

When a command like blockdev --rereadpt /dev/sdX fails with

blockdev: ioctl error on BLKRRPART: Device or resource busy

this usually means that some (old) partition is indeed still somehow used by the kernel.

Possible causes/fixes:

  1. an sdX partition - say sdX1 - is still mounted - check with mount and umount it
  2. /dev/sdX1 is part of a software raid - check cat /proc/mdstat and possibly stop the relevant arrays, e.g. mdadm --stop /dev/md126
  3. /dev/sdX1 is part of an LVM physical volume - check with pvdisplay/vgdisplay and possibly deactivate with vgchange
  4. /dev/sdX1 is part of some device mapping - e.g. via cryptsetup - check /dev/mapper and lsblk and possibly remove the mapping (e.g. cryptsetup luksClose)
  5. Race condition with some udev probing - check running processes with ps and possibly kill one

If one tool - say blockdev --rereadpt fails usually similar ones like (partx -uv, kpartx, partprobe, kpartprobe) fail in a similar way until the root cause is eliminated.

maxschlepzig
  • 694
  • 5
  • 16
3

You can also try:

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

(But might not work, see the comment below)

bogdano
  • 155
  • 3
  • 4
    This does not reread the partition table. It just updates the geometry information, cache mode, etc. SCSI IDENTIFY_DRIVE is being issued. – Dmitri Chubarov Jun 09 '12 at 08:27
  • 2
    This is the only solution, that helped me on vmware vm. – user3132194 Feb 11 '20 at 11:57
  • @user3132194, I assume you'd just resized the drive? Then you need to rescan the device, not reread the partition table. They're two completely different operations, and only the partition table reread is the one that's on-topic for this question. – Charles Duffy Nov 07 '20 at 01:12
2

in Alpine-Linux netboot mode , new partitions were shown in dmesg, main disks /dev/sda were present but no /dev/sdaX partition device files , tried all tricks above , finally


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

worked

https://wiki.alpinelinux.org/wiki/Alpine_Linux_in_a_chroot

1

For me neither partprobe or blockdev solution worked. Although, this one works:

udevadm settle --exit-if-exists=/dev/sdb1
Sibi
  • 111
  • 3
0

kpartx -a <partition> can be run two times on newly created partition .... instead of rebooting the system.

HBruijn
  • 72,524
  • 21
  • 127
  • 192
Kailas Kadam
  • 1
  • 1
  • 4
  • 2
    *Two* times? Do you also run “`sync; sync; sync`”? ☺ I smell superstition… – Teddy Mar 12 '15 at 13:04
  • 2
    I think this superstition came from the fact that you check if your sync, by doing a second sync. Except that the second one is only valuable for the operator, to confirm it returns to prompt immediately, thus indicating the first sync completed as expected. a few blogs and tutorials later, and .... – J. M. Becker Oct 05 '15 at 13:59
0

Remember to check udev service is running. This is especially useful when partprobe, hdparm, blockdev, and various other commands do not seem to make any difference what device files are available in /dev/ directory.

kerolasa
  • 121
  • 1
-5

If you read the manpage for 'man oracleasm-scandisks' you will note the text below. oracleasm is using /proc/partitions as the source of all scanning it performs. You must get your raw devices listed in /proc/partitions before you can do a scandisk. The Scanorder and Scanexclude parameters you place in /etc/sysconfig/oracleasm relate to the names found in /proc/partitions (!!!!).

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

HOW SCANNING HAPPENS The scan proceeds in four basic stages.

   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.
user168717
  • 665
  • 5
  • 2
  • 2
    ...he's mentioned nothing about using `oracleasm-scandisks` – voretaq7 Apr 26 '13 at 17:45
  • This is a separate piece of (Oracle-provided) software that's _reading_ `/proc/partitions`. The goal of this question is how to tell _the kernel itself_ to update the data it uses to _generate_ `/proc/partitions`. – Charles Duffy Nov 07 '20 at 01:13