5 votos

¿Cómo conseguir oflag=direct en dd en MacOS?

He instalado gdd en MacOS.

Me he dado cuenta de que ambos dd y gdd no apoyan oflag=direct opción.

 ‘direct’
      Use direct I/O for data, avoiding the buffer cache.  Note that
      the kernel may impose restrictions on read or write buffer
      sizes.  For example, with an ext4 destination file system and
      a Linux-based kernel, using ‘oflag=direct’ will cause writes
      to fail with ‘EINVAL’ if the output buffer size is not a
      multiple of 512.

de dd(1) en Linux

Y la incorporación de dd ni siquiera admite conv=fsync .

Me pregunto cómo conseguir oflag=direct en dd o gdd en MacOS?

13voto

Jose Chavez Puntos 645

La forma de conseguirlo depende de lo que se pretenda hacer:

Si sólo está tratando de copiar datos de un disco a otro, que es un caso de uso muy común para dd se suele conseguir algo similar a oflag=direct simplemente utilizando el dispositivo de bloque adecuado.

Es decir, por ejemplo, si copias así:

dd if=/dev/disk0 of=/dev/disk1 bs=1m

Se puede acelerar utilizando el acceso al disco en bruto de esta manera:

dd if=/dev/rdisk0 of=/dev/rdisk1 bs=1m

Tenga en cuenta que los nombres de los dispositivos de bloque llevan el prefijo "r", que significa dispositivo "en bruto".

Si no está copiando entre dispositivos de bloque como ese, todavía hay una manera de conseguir algo similar a oflag=direct en Linux:

La razón por la que no se implementa de la misma manera que en Linux, y por lo tanto no se porta directamente al portar GNU dd a MacOS, es que el kernel de MacOS simplemente no soporta el O_DIRECT bandera para fcntl .

La bandera llegó al kernel de Linux hace unos 20 años como una "inspiración" de la bandera de nombre similar en SGI IRIX. Se establece en un descriptor de archivo para evitar el subsistema de caché normal.

Sin embargo, MacOS originalmente no tenía su configuración de caché por descriptor de archivo, sino que la tenía por vnode . Piensa en esto como la diferencia entre tener la configuración de la caché establecida para un archivo per se, y tener la configuración de la caché establecida para una instancia particular de un archivo abierto. Es decir, en este último caso, dos programas diferentes podrían estar trabajando en el mismo archivo con diferentes configuraciones de caché.

Esto significaba que en aquel entonces (es decir, hace más de 20 años) MacOS no podía adoptar O_DIRECT de SGI IRIX como hizo Linux, sino que optaron por crear una opción llamada F_NOCACHE. Esto también desactiva el subsistema de caché ordinario, pero lo hace por archivo en lugar de por descriptor de archivo. Más tarde, MacOS cambió el funcionamiento del sistema operativo para tener la configuración de la caché por descriptor de archivo en lugar de por vnode Así que ahora es más o menos lo mismo.

Te preguntarás: ¿qué hacían los usuarios de Linux antes de tener O_DIRECT ? - En realidad, utilizaron el mismo tipo de dispositivos "en bruto" que también ofrece MacOS, y que he descrito anteriormente. En lugar de prefijarlos con "r" se prefijaban típicamente con "raw", pero por lo demás es el mismo concepto.

En la práctica, si sólo estás copiando discos con dd, es conveniente utilizar sólo los dispositivos en bruto. Si estás tratando de lograr algo más, probablemente pertenezcas a un caso de uso de nicho, que no está soportado directamente. A mí me parece que la forma más fácil de avanzar ahí sería cambiar el gdd y añadir un fcntl para F_NOCACHE de forma similar a la O_DIRECT uno que ha sido eliminado del puerto de MacOS.

Sin embargo, dependiendo de lo que intente hacer, debe tener en cuenta las ligeras diferencias en la semántica de las banderas. Por ejemplo, si quiere utilizar O_DIRECT para realizar la evaluación comparativa, hay que tener un cuidado adicional. F_NOCACHE es decir, diferente de O_DIRECT en el sentido de que, si bien no añade datos a la caché, leerá datos de la misma si ya están ahí por alguna razón. Esto aumentará el rendimiento, pero puede que no sea lo que quieres para la evaluación comparativa.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X