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.