Error al volver a leer la tabla de particiones con el error 16: dispositivo o recurso ocupado

Error al volver a leer la tabla de particiones con el error 16: dispositivo o recurso ocupado

Al volver a particionar una unidad flash USB en CentOS 6.x apareció el siguiente 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.

Respuesta1

Parece que este dispositivo está montado. Ejecute umount /dev/sdb1y vuelva a intentarlo.

Respuesta2

Suponiendo que obtiene esto como resultado de automatizar (por ejemplo, usar expect) la fdiskoperación (y quela partición en realidad no está montada), intente agregar unos segundos de retraso después de modificar la partición y antes de escribir la partición.

Recibí el mismo error cuando intentaba automatizar una llamada fdisken 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.


Mi sospecha era que mi flujo de comandos canalizado estaba surgiendo un problema de sincronización fdisk(que no se activaría con una entrada más lenta/manual), así que comencé a distribuir sleepcomandos para retrasar varias entradas hasta que el error desapareciera. El problema en mi caso fue que esto wsucedía demasiado pronto después de que se definiera la nueva partición.

A sleep 5antes de los wresultados en un éxito constante:

# (echo "d"; echo "";
        echo "n"; echo ""; echo 3; echo 2001954; echo "";
        sleep 5; echo "w") | fdisk /dev/sdb

Respuesta3

Existe una forma bastante común de que los dispositivos utilizados anteriormente estén ocupados después de simplemente estar conectados a una máquina si anteriormente eran miembros de una mdadmmatriz. Para ver si este es el caso, cat /proc/mdstatbusque que sus unidades aparezcan en una matriz enumerada allí.

Si encuentra uno o más, puede hacer lo siguiente para liberarlos de su asociación de matriz anterior.

mdadm --stop /dev/md1234

¿Dónde /dev/md1234está la matriz que se muestra en /proc/mdadm? Haga esto para cada matriz asociada con las unidades que está intentando volver a particionar.TENGA CUIDADO DE ESPECIFICAR SÓLO ARRAYS ANTIGUOS Y YA NO UTILIZADOS EN EL COMANDO ANTERIOR.

Tuve que hacer esto una vez antes de ejecutar fdisk /dev/sdxyy luego nuevamente después de que el comando fdisk posterior no pudo actualizar la tabla del kernel. Cuando eso sucedió, simplemente volví a ejecutar los comandos `mdadm --stop..." e hice el fdisk nuevamente, simplemente emitiendo el comando "w" y sin cambiar nada. La segunda vez funcionó bien.

Respuesta4

Pruebe el comando: sudo resize2fs /dev/mmcblk0p2

información relacionada