¿Volver a leer la tabla de particiones sin reiniciar?


71

A veces, cuando se cambia el tamaño o de alguna otra manera muck con particiones en un disco, cfdisk dirá:

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

(Esto también sucede con otras herramientas de particionamiento, por lo que creo que este es un problema de Linux en lugar de un problema de cfdisk). ¿Por qué es esto y por qué solo ocurre a veces y qué puedo hacer para evitarlo?

Nota: Suponga que ninguna de las particiones que estoy editando están abiertas, montadas o en uso.


Actualizar:

cfdisk usa ioctl(fd, BLKRRPART, NULL)para decirle a Linux que vuelva a leer la tabla de particiones. Dos de las otras herramientas recomendadas hasta ahora ( hdparm -z DEVICE, sfdisk -R DEVICE) hacen exactamente lo mismo. El partprobe DEVICEcomando, por otro lado, parece usar un nuevo ioctl llamado BLKPG, que podría ser mejor; No lo sé. (También recurre a BLKRRPART si BLKPG falla).

BLKPG parece ser una operación de "esta partición ha cambiado; aquí está el nuevo tamaño", y parecía partprobellamada individualmente en todas las particiones en el dispositivo pasado, por lo que debería funcionar si las particiones individuales no se utilizan. Sin embargo, no he tenido la oportunidad de probarlo.


1
man sfdiskdice: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

Respuestas:


66

En mi humilde opinión la respuesta más confiable / mejor es

partprobe /dev/sdX

1
Acabo de expandir un desarrollador en Ubuntu Server, este desarrollador es una incursión de hardware. Después de expandir la incursión subyacente usando el controlador de incursión, desmonté el sistema de archivos e intenté "partprobe / dev / sda"; esto no funcionó. "fdisk -l" todavía mostraba el tamaño anterior. Luego ejecuté "hdparm -z / dev / sda" y esto funcionó. Luego podría montar y cambiar el tamaño de mi sistema de archivos sin reiniciar. Sé que no estoy agregando nada realmente que no sea YMMV.
Mwuanno

estoy en centos 6.5; kernel 2.6.32. todos los siguientes comandos no hicieron la partición de releer el kernel: - partprobe / dev / sda (warnikg: el kernel no pudo releer)
Max

@Max, también noté que a veces incluso la sonda parcial imprime un error que no funcionó. A veces un reinicio es la única opción para estar seguro. Sin embargo, muchas veces parece funcionar para mí.
Matt

Esto no funcionó para mí porque todavía había algunos directorios montados con --bind. La partición en sí ya estaba desmontada, pero los soportes de unión que apuntaban a esa partición todavía estaban allí. Es extraño que umount funcionara y la sonda no funcionara, pero después de desmontar también los soportes de unión, también pude sondear el disco.
Ethan Leroy

Esto funcionó para mí en CentOS 6 después de flagelar con kpartxy udevadm triggerdurante 10 minutos. ¡Gracias!
Mike Andrews

19

Volver a leer la información de la tabla de particiones no siempre funciona, pero intente

hdparm -z /dev/sda

o

sfdisk -R /dev/sda

Si funciona, los valores en / proc / partitions cambiarán.


hdparm funcionó para mí.
Prof. Falken

3
La opción sfdisk -R no existe.
Matt

Cabe señalar que el hdparmcomando solo funcionará si las particiones no están montadas.

... de hecho, parece que sfdisk -Rse eliminó en algún lugar entre util-linux 2.24.2 y 2.26.1
Charles Duffy el

1
man sfdiskdice: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


8

Nota: Suponga que ninguna de las particiones que estoy editando están abiertas, montadas o en uso.

Dado ese supuesto, la tabla de particiones se puede volver a analizar con éxito, y el problema no surgirá. Si obtiene ese error, es porque la tabla de particiones está actualmente en uso y, por lo tanto, no se puede volver a escanear sin crear inconsistencias.


Algunas particiones pueden estar en uso, pero ninguna de ellas son las que realmente estoy cambiando, aunque pueden estar en la misma tabla de particiones.
Teddy

8
El núcleo no es tan inteligente. Si alguna partición en la tabla está en uso, el núcleo no vuelve a escanear. Hacer eso mal en la otra dirección podría ser catastrófico, por lo que es seguro. Si desea rellenar con particiones a voluntad, use LVM.
womble

6

No se basa en la partición que está editando.

Supongamos que solo tiene un disco duro ( /dev/sda) y dos particiones ( /dev/sda1, /dev/sda2) y ha montado solo una partición ( /dev/sda1). Si elimina o cambia algo sobre otra partición que ni siquiera está montada ( /dev/sda2), recibirá el error de que la relectura de la tabla de particiones falló y el núcleo usará la tabla anterior.

Pero si tiene dos discos duros ( /dev/sda, /dev/sdb) y ninguna de las particiones de ( /dev/sdb) está en uso. Luego puede agregar / eliminar / cambiar el tamaño / editar particiones /dev/sdby se volverán a leer sin ningún problema. Pero incluso si se montó una partición de / dev / sdb durante el cambio. Entonces el núcleo seguirá usando la tabla anterior.


5

Yo (el interrogador original) tuve una situación hace unos días cuando ninguna de las otras respuestas (incluida partprobe /dev/sdX, actualmente, la respuesta aceptada y mejor votada) funcionó. Lo que funcionó, sin embargo, fue esto:

blockdev --rereadpt /dev/sdX

(No sé por qué funcionó esto y los otros no, pero estoy feliz de que funcionó, ya que me ahorró un reinicio en un servidor ocupado).


5

estoy en centos 6.5 x64; kernel 2.6.32. y estoy probando el truco de fdisk para cambiar el tamaño.

/dev/sda1 /boot
/dev/sda2 /

Todos los siguientes comandos no hicieron la partición releída del núcleo:

  • partprobe / dev / sda (advertencia: el núcleo no pudo volver a leer ...)
  • hdparm -z / dev / sda (BLKRRPART falló: dispositivo o recurso ocupado)
  • blockdev -rereadpt / dev / sda (BLKRRPART falló: dispositivo o recurso ocupado)
  • sfdisk -R / dev / sda (BLKRRPART falló: dispositivo o recurso ocupado)

Todavía necesito reiniciar para que funcione


nada de eso funcionó para mí (proxmox VM, centos 7, partición xfs, no lvm). Sin embargo, @uus respuesta funcionó: serverfault.com/a/722386/102252
NotGaeL

Todos los comandos anteriores tampoco funcionaron para mí.
Fadi Asbih

Creo que el kernel 2.6.32 tiene problemas, los utilicé antes en otras máquinas, funcionó bien, incluso al agregar particiones con números más altos entre particiones más antiguas. es decir, sdb1 sdb2 sdb3: elimine sdb2, luego sdb1 sdb4 sdb5 sdb3. Además de lo anterior, partx, kpartx, blockdev no funcionaron tan bien.
sdkks

No creo que sea inusual que si un comando falla al volver a leer las particiones, todos fallan; vea también mi respuesta sobre cómo eliminar algunas causas de esto .
maxschlepzig

3

Con todos los puntos de montaje desmontados, ejecutando Yocto 2.4:

partprobe /dev/sda 

Todavía no se pudo volver a cargar la tabla de particiones después de que las particiones se hayan eliminado en el dispositivo. También probé, y fallé:

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

Todos informaron errores similares de "BLKRRPART falló: dispositivo o recurso ocupado ..." que me indican que reinicie. ¿Es posible que esta falla de los métodos que funcionaban anteriormente se deba al hecho de que udev está ahora bajo control de systemd? Pensando en esas líneas intenté:

systemctl restart systemd-udevd.service

Y de repente mi disco vuelve a estar disponible, ¡ sin reiniciar!


La respuesta más aceptada es incompleta: en el systemdmundo moderno , ESTA es la respuesta correcta. Tenga en cuenta que también debe reiniciar uno de esos (o ambos) systemd-udev-settley systemd-udev-trigger. Reiniciar tal systemd-udevdcomo dijo Camp no fue suficiente para mí. ¡Pero reiniciar también los otros dos hizo el truco!
Costin Gușă

1

Cuando un comando como blockdev --rereadpt /dev/sdXfalla con

blockdev: ioctl error on BLKRRPART: Device or resource busy

esto generalmente significa que alguna partición (antigua) de hecho todavía es utilizada de alguna manera por el núcleo.

Posibles causas / soluciones:

  1. una partición sdX - digamos sdX1- todavía está montada - verifique mounty desmonte
  2. /dev/sdX1es parte de una redada de software: verifique cat /proc/mdstaty posiblemente detenga las matrices relevantes, por ejemplomdadm --stop /dev/md126
  3. /dev/sdX1es parte de un volumen físico LVM - verifique con pvdisplay/ vgdisplayy posiblemente desactive convgchange
  4. /dev/sdX1es parte de alguna asignación de dispositivos - por ejemplo, a través de cryptsetup- comprobar /dev/mappery lsblky quitar la asignación posiblemente (por ejemplo cryptsetup luksClose)
  5. Condición de carrera con algunas pruebas de udev: compruebe los procesos en ejecución con psy posiblemente elimine uno

Si una de las herramientas - decir blockdev --rereadptno queridos por lo general similares como ( partx -uv, kpartx, partprobe, kpartprobe) fallará de manera similar hasta que se elimina la causa raíz.


0

También puedes probar:

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

(Pero no funcionará, mira el comentario a continuación)


3
Esto no vuelve a leer la tabla de particiones. Simplemente actualiza la información de geometría, el modo de caché, etc. Se está emitiendo SCSI IDENTIFY_DRIVE.
Dmitri Chubarov

0

kpartx -a <partition> se puede ejecutar dos veces en una partición recién creada ... en lugar de reiniciar el sistema.


2
Dos veces? ¿También ejecutas " sync; sync; sync"? ☺ Huelo superstición ...
Teddy

1
Creo que esta superstición proviene del hecho de que verificas si estás sincronizado, haciendo una segunda sincronización. Excepto que el segundo solo es valioso para el operador, para confirmar que vuelve a aparecer de inmediato, lo que indica que la primera sincronización se completó como se esperaba. algunos blogs y tutoriales más tarde, y ...
JM Becker

0

Recuerde verificar que el servicio udev se esté ejecutando. Esto es especialmente útil cuando partprobe, hdparm, blockdev y varios otros comandos no parecen hacer ninguna diferencia sobre qué archivos de dispositivo están disponibles en el directorio / dev /.


0

Para mí no partprobeo blockdevsolución trabajado. Aunque, este funciona:

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

-3

Si lee la página de manual de 'man oracleasm-scandisks', observará el texto a continuación. oracleasm está usando / proc / partitions como la fuente de todos los escaneos que realiza. Debe obtener sus dispositivos sin formato en / proc / particiones antes de poder hacer un scandisk. Los parámetros Scanorder y Scanexclude que coloca en / etc / sysconfig / oracleasm se relacionan con los nombres encontrados en / proc / partitions (!!!!).

---------- hombre-oracleasm-scandisks ------ ...

CÓMO SUCEDE EL ESCANEO El escaneo continúa en cuatro etapas básicas.

   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
... no ha mencionado nada sobre el usooracleasm-scandisks
voretaq7
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.