Necesito reducir un volumen ext4 grande y me gustaría hacerlo con el menor tiempo de inactividad posible. Con las pruebas que he realizado hasta ahora, parece que se podría desmontar para cambiar el tamaño hasta por una semana. ¿Hay alguna forma de desfragmentar el sistema de archivos en línea con anticipación para que resizefs no tenga que mover tantos bloques?
Actualizar: Me tomó algo de tiempo llegar a este punto, moví bastantes TB de datos en preparación para la reducción y he estado experimentando usando la información en la respuesta a continuación. Finalmente se me ocurrió la siguiente línea de comando que podría ser útil para otras personas en una situación similar con sólo modificaciones menores. También tenga en cuenta que debe ejecutarse como root para que los comandos filefrag y e4defrag funcionen correctamente; no afectará la propiedad del archivo. También funciona correctamente en archivos con múltiples enlaces físicos, de los cuales tengo muchos.
find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}' | xargs -n 1 -d '\n' e4defrag
Una explicación rápida para que a otros les resulte más fácil modificar/usar:
El primer comando 'buscar' crea la lista de archivos con los que trabajar. Posiblemente sea redundante ahora o podría hacerse de una mejor manera, pero mientras probaba tenía otros filtros allí y lo dejé como un lugar útil para modificar el alcance del resto del comando.
Luego pase cada archivo a través de 'filefrag -v' para obtener una lista de todos los bloques físicos utilizados por cada archivo.
El grep busca el último bloque utilizado por cada archivo (línea que termina en 'eof'), y donde ese bloque es un número de 10 dígitos que comienza con 3 o 4. En mi caso, el tamaño de mi nuevo sistema de archivos será de 2980024320 bloques de largo para que hace un trabajo bastante bueno al trabajar solo con archivos que se encuentran en el área del disco que se va a eliminar. Hacer que grep también incluya la siguiente línea (el '-A 1') también incluye el nombre del archivo en el resultado de la siguiente sección. Aquí es donde cualquiera que haga esto tendrá que modificar el comando dependiendo del tamaño de su sistema de archivos. Probablemente también se podría hacer de una manera mucho mejor, pero ahora me funciona y soy un vago.
awk extrae solo los nombres de los archivos de toda la demás basura que grep dejó en la salida del filefrag.
Y finalmente se llama e4defrag: no me importa el recuento de fragmentos real, pero tiene el efecto secundario de mover los bloques físicos (con suerte, a una parte inicial de la unidad) y funciona con archivos con múltiples enlaces físicos. sin ningún esfuerzo adicional.
Si solo desea saber qué archivos desfragmentará sin mover ningún dato, simplemente deje desactivada la última parte del comando.
find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}'
Respuesta1
Por lo que puedo decir,ext4fs admite la desfragmentación en línea(aparece en "listo", pero el campo de estado está vacío;el parche originales de finales de 2006) hastae4defrag en e2fsprogs 1.42 o posterior que cuando se ejecuta en Linux 2.6.28 o posteriorle permite consultar el estado de directorios o posiblemente sistemas de archivos, y al menos desfragmentar archivos individuales.e2fsprogsa día de hoy está en la versión 1.42.8.
No estoy seguro de si esto te ayuda o no, ya que lo que quieres hacer no parece ser tanto.desfragmentarlos datos comoconsolidarlos datos en el disco. Las dos a menudo se realizan juntas, pero son operaciones claramente diferentes.
Una forma sencilla de consolidar los datos, quepodríaEl trabajo, suponiendo que tenga una cantidad razonable de espacio libre, es copiar cada archivo a alguna otra lógica lógica en el mismo sistema de archivos y luego usar mv para reemplazar los datos señalados por el inodo con la nueva copia. Dependería en gran medida de cómo funciona exactamente el asignador ext4 en detalle, pero podría valer la pena intentarlo y debería ser bastante fácil de programar. Simplemente tenga cuidado con los archivos que están vinculados desde más de un lugar (con un esquema como este, podría ser más fácil simplemente ignorar cualquier archivo con un número de enlaces > 1 y dejar que resizefs se encargue de ellos).