Con gli hard disk attuali, no garanzia che un file sia effettivamente scritto su disco anche se il disco riporta la scrittura come completa al sistema operativo! Ciò è dovuto alla cache integrata nell'unità.
Su freeBSD puoi disabilitarlo impostando kern.cam.ada.write_cache sysctl a 0. Questo degraderà scrivere le prestazioni in modo significativo . L'ultima volta che l'ho misurato (disco rigido WDC WD5001ABYS-01YNA0 su un chipset ICH-7, FreeBSD 8.1 AMD64), prestazioni di scrittura continua (misurate con dd if=/dev/zero of=/tmp/foo bs=10M count=1000 ) è sceso da 75.000.000 byte/sec a 12.900.000 byte/sec.
Se vuoi essere assolutamente sicuro che i tuoi file siano scritti;
- Disabilita la cache in scrittura con
sysctl kern.cam.ada.write_cache=0seguito dacamcontrol reset <bus>:<target>:<lun>. - Apri il file con
O_SYNCopzione.
Nota:
- Le tue prestazioni di scrittura (su un HDD) ora faranno assolutamente schifo.
- Non montare la partizione con
syncopzione; questo causerà tutto I/O (incluse le letture) da eseguire in modo sincrono. - Non utilizzare
O_DIRECT. Proverà a bypassare del tutto la cache. Questo probabilmente influenzerà anche le letture.
O_DIRECT fondamentalmente esiste solo per Oracle per bypassare il livello della cache del buffer del kernel e fare il proprio caching. Ha una semantica mal definita, limitazioni arbitrarie sulla dimensione e l'allineamento delle letture che è possibile eseguire e generalmente non dovrebbe essere utilizzato. O_SYNC dovrebbe darti gli effetti che desideri, ma senza un filesystem sottostante che sia robusto contro interruzioni di corrente o arresti anomali, potrebbe comunque non essere sufficiente per le tue esigenze.