10

When re-partitioning a USB Flash drive on CentOS 6.x got following error.

Disk /dev/sdb: 31.5 GB, 31466323968 bytes
255 heads, 63 sectors/track, 3825 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0e693bd9

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1        3826    30727808    c  W95 FAT32 (LBA)
[root@csc ~]# fdisk /dev/sdb

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): d
Selected partition 1

Command (m for help): 1
1: unknown command
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): d   
No partition is defined yet!

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-3825, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-3825, default 3825): 
Using default value 3825

Command (m for help): 
Command (m for help):  
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 86
Changed system type of partition 1 to 86 (NTFS volume set)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

7 Answers 7

18

Looks like this device is mounted. Run umount /dev/sdb1 and try again.

5
  • Concur. If the device wasn't mounted beforehand, please update the question to reflect that. If it was, try this and update the question with the results if it didn't work.
    – Shadur
    Jan 8, 2018 at 9:06
  • 2
    @Shadur I'm getting the error in a similar situation and the device is not mounted.
    – jhfrontz
    May 29, 2019 at 22:32
  • @jhfrontz possibly mdadm using it?
    – Suuuehgi
    Aug 25, 2020 at 9:14
  • @Suuuehgi I don't think so -- the device in question is a USB stick and (as far as I know) there is no mirroring enabled anywhere on the system.
    – jhfrontz
    Sep 8, 2020 at 16:33
  • It could also be another partition that is mounted from the same disk. Eg sdb2, so in that case use: umount /dev/sdb2 or sdb3, etc. 9 hours ago
6

Assuming that you're getting this as a result of automating (e.g., using expect) the fdisk operation (and that the partition isn't actually mounted), try adding a few seconds of delay after modifying the partition and before writing the partition able.

I got the same error when I was trying to automate a call to fdisk on Centos 7.6 a la:

# (echo "d"; echo "";
        echo "n"; echo ""; echo 3; echo 2001954; echo "";
        echo "w") | fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): Partition number (1-3, default 3): Partition 3 is deleted

Command (m for help): Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): Using default response p
Partition number (3,4, default 3): First sector (2001954-31116287, default 2002944): Last sector, +sectors or +size{K,M,G} (2001954-31116287, default 31116287): Using default value 31116287
Partition 3 of type Linux and of size 13.9 GiB is set

Command (m for help): The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.


My suspicion was that my piped-in command stream was surfacing a timing issue in fdisk (that wouldn't be triggered by slower/manual input) so I started sprinkling sleep commands to delay various inputs until the error went away. The problem in my case was that the w was happening too soon after the new partition was defined.

A sleep 5 before the w results in consistent success:

# (echo "d"; echo "";
        echo "n"; echo ""; echo 3; echo 2001954; echo "";
        sleep 5; echo "w") | fdisk /dev/sdb
1
  • Maybe you don't need echo "";. Aug 15, 2022 at 3:42
1

try o command at fdisk, it will building a new DOS disklabel.

or try partprobe or kpartx -a if you have this command.

1
  • partprobe command worked for me. kartx -a was asking more options. Feb 26, 2021 at 12:10
0

There is a pretty common way for previously used devices to be busy after they simply are plugged in to a machine if they were formerly members of an mdadm array. To see if this is the case, cat /proc/mdstat and look for your drives to show up in an array listed there.

If you find one or more you can do the following to free them up from their former array association.

mdadm --stop /dev/md1234

where /dev/md1234 is the array shown in /proc/mdadm. Do this for each such array associated with the drive(s) you're trying to re-partition. PLEASE BE CAREFUL TO SPECIFY ONLY OLD AND NO LONGER USED ARRAYS IN THE ABOVE COMMAND.

I had to do this once before running fdisk /dev/sdxy and then again after the subsequent fdisk command failed to get the kernel table to update. When that happened, I just did the `mdadm --stop ..." commands again and did the fdisk again, simply issuing the "w" command and changing nothing. The second time it worked fine.

2
  • There is no mention of mdadm or software RAID in the original question—which was about an USB stick. Dec 16, 2022 at 10:11
  • That's a fair point. If my answer isn't useful or applicable to the particular case, it's easy enough to ignore it. I offer it with the hope it might save someone some time.
    – Alan Mimms
    Dec 20, 2022 at 23:17
-1

try command: sudo resize2fs /dev/mmcblk0p2

3
  • 1
    what does it do? Jan 8, 2018 at 8:53
  • 7
    Please elaborate why you think this will help, because unless I'm missing something important the only thing this will do is potentially inflict further damage on the filesystem when it's already in an unknown state.
    – Shadur
    Jan 8, 2018 at 9:05
  • Looks like the intention of this is to extend the filesystem within a device that probably doesn't exist on the questioner's system. Not sure how this fix relates to the problem, but best case it will probably just give an error.
    – mwfearnley
    Oct 1, 2021 at 14:50
-1

May be you tried like "sudo fdisk /dev/sdc1"this

Solution:if you want to create a partition of /dev/sdc then command should be: "sudo fdisk /dev/sdc" not as "sudo fdisk /dev/sdc1".

1
  • Where's sdc in this situation, though?
    – Jeff Schaller
    Nov 21, 2018 at 15:19
-1

I face this issue as i mounted 1 partition and then try to create another partition. Umount initially created partition and then error gone.

1

Not the answer you're looking for? Browse other questions tagged or ask your own question.