2010-08-24 19 views
5

Linux tiene una función llamada namespaces, que le permite dar una "vista" diferente del sistema de archivos a diferentes procesos. En términos de Windows, esto sería útil, por ejemplo, si tuviera un programa heredado "floyd" que siempre cargó su configuración desde C:\floyd\floyd.ini. Si Windows tuviera espacios de nombres, podría escribir un script de contenedor que crearía un espacio de nombres para ejecutar floyd, haciendo que cuando Alice ejecutara el script, Floyd se iniciara en un entorno donde C:\floyd existía pero apuntaba a C:\Users\Alice\Floyd.Windows equivalente a los espacios de nombres de Linux (montajes del sistema de archivos por proceso)?

Ahora usted puede estar pensando, "OK, solo use enlaces suaves o duros y haga de C:\floyd un alias para C:\Users\Alice". Pero con espacios de nombres, Bob también puede ejecutar el script de inicio, pero su instancia de floyd (en la misma computadora, ejecutándose al mismo tiempo) verá C:\floyd con los contenidos de, digamos, C:\Users\Bob\Program Settings\Floyd Config (o cualquier otra ruta que nos guste).

Puede hacer esto en Linux con espacios de nombres. ¿Hay algo similar o análogo en Windows? Está bien si requiere escribir un programa en C, y está bien si solo funciona en versiones recientes de Windows.

+0

Los bastardos reales son, por supuesto, los programas que cargan su configuración de algo como '\ floyd \ floyd.ini' - una ruta relativa a la unidad que funciona si el directroy de trabajo actual está en cualquier lugar en la misma unidad. Realmente no puedo arreglar eso con espacios de nombres. – MSalters

+1

Esto no es realmente una pregunta de programación, pero es demasiado interesante para cerrar. – Gabe

Respuesta

3

NTFS enlaces duros son realmente un simple caso de reparse points. Los puntos de análisis se escriben y pueden incluir un comportamiento más avanzado. Por ejemplo, también se usan para "almacenamiento fuera de línea" (migración transparente de archivos hacia y desde el almacenamiento secundario).Por lo tanto, también puede usar puntos de reanálisis para implementar enlaces simbólicos por usuario, creando un nuevo tipo de análisis.

El tipo de punto de reanálisis incluso tiene un bit explícito de "Nombre sustituto", que (si está establecido) indica que los puntos de reanálisis de esos tipos son algún tipo de enlace simbólico.

Incluso puede tener múltiples puntos de reanálisis en una ruta. Por lo tanto, los archivos dentro de su espacio de nombre simbólico aún se pueden migrar a un almacenamiento secundario; solo tendría dos puntos de análisis en la ruta.

+1

¿Hay herramientas relacionadas con esta funcionalidad, o tendría que definir básicamente mi propia etiqueta de "aplicación" para un tipo de datos de punto de reanálisis, y escribir mi propio filtro del sistema de archivos para implementar realmente el comportamiento de los enlaces simbólicos por usuario? Aprecio mucho la respuesta por señalarme los bits crudos que podría usar, pero a simple vista parece que requiere un trabajo bastante sustancial; solo quiero confirmar que mi estimación coincide con la tuya. –

+1

No es trivial, sí. No creo que necesite un filtro de sistema de archivos (porque su punto de reanálisis solo realiza una redirección simple), pero sí necesita un componente de bajo nivel que pueda crear e interpretar su tipo de puntos de análisis. Toolwise, esperaría más información en IFS SDK o DDK. – MSalters

0

Puede usar enlaces duros para eso, pero solo con NTFS. http://en.wikipedia.org/wiki/Hard_link

Creo que Windows no tiene vista FS virtual por proceso.

+0

No creo que esté ni cerca ... –

+0

Windows ciertamente tiene una vista FS virtual por sesión de inicio de sesión; Las asignaciones de unidades remotas generalmente son inaccesibles para otros usuarios en la misma máquina. – MSalters

+0

MSalters: ¿las asignaciones de unidades remotas pueden ser diferentes en diferentes instancias de, por ejemplo, un símbolo del sistema para un solo usuario? ¿O solo difieren en el nivel de la sesión de la terminal de un usuario?De hecho, quiero poder tener un usuario conectado que inicie la cosa en más de un "espacio de nombre" en algunos casos (es decir, Alice y Bob podrían estar usando la misma sesión de inicio de sesión de Windows, simplemente iniciando dos scripts diferentes). –

0

Lo más relevante probablemente sean las carpetas especiales del entorno, como% temp%,% appdata%,% localappdata%. No es que sean equivalentes, pero cumplen el mismo propósito.

Puede definir sus propias variables de entorno y luego usar '% myspecialplace% \ myfile.txt' para acceder a ellas.

+0

Creo que esto supone que puedo editar "floyd", lo que no puedo hacer. –

1

Creo que la Tienda virtual hace esto automáticamente para los programas heredados que intentan escribir en directorios no estándar. Por lo tanto, el programa heredado escribe en un directorio específico del usuario y del programa en lugar de C:\floyd.

+1

No creo que las carpetas aleatorias como 'C: \ floyd \' estén virtualizadas. El directorio de Windows y el directorio de Archivos de programa son ambos. – MSalters

+0

El enfoque de MSalter coincide con mi comprensión (limitada), lo que significa que no puedo usar esto para hacer lo que necesito. –

0

Esto suena como el file system virtualization de Windows Vista. Por ejemplo, puede redirigir silenciosamente c:\Program Files\Floyd a c:\Users\<username>\AppData\Local\VirtualStore\Program Files\Floyd. Sin embargo, la virtualización del sistema de archivos no es tan configurable como los espacios de nombres de Linux. Por lo que puedo decir de la lectura, la virtualización del sistema de archivos se debe aplicar cada vez que se abre un proceso interactivo de 32 bits para escribir un archivo, carpeta o clave de registro que solo pueden escribir los administradores. (Así que por lo general termina con algunos archivos de sólo lectura bajo c:\Program Files y algunos archivos de escritura de cada usuario bajo c:\Users\<username>\AppData\Local\VirtalStore.)

Un producto application virtualization puede probablemente también hacer esto, aunque son a menudo más complicado y más caro.

0

Como un horrible error (y aquí reservo mi pasaje al infierno de la programación), ¿podrías usar un NamedPipe para C: \ Floyd que mapeó las operaciones IO en un archivo específico para el usuario actual del proceso?

Sé que no es bonito y no sé lo suficiente sobre NamedPipes (FIFOs en otros dialectos) en Windows para saber cuán factible es esto.

Dan

+0

No; el nombre 'C: \ Floyd' se reconoce como un nombre compuesto, y' C: 'es (considerando la configuración) un enlace simbólico en el espacio de nombres del núcleo, refiriéndose a una partición (NTFS o FAT). Por lo tanto, la parte 'Floyd' se resuelve en relación con eso. – MSalters

+0

En Windows, todas las canalizaciones con nombre se crean en el directorio '\\. \ Pipe \', no pueden nombrarse como archivos normales. –

+0

Gracias por la información chicos. Probablemente sea lo mejor que esto no sea un enfoque viable. –

0

Me vienen varias cosas a la cabeza.

En primer lugar, puede crear un controlador de filtro del sistema de archivos (o usar un controlador listo, como nuestro producto CallbackFilter) que redirigiría todas las llamadas al sistema de archivos desde la aplicación a otra ubicación. Esto está cerca de la virtualización que mencionaste, pero esto no cambiará la lista de letras de unidad. Tal enfoque es a la vez poderoso y no trivial, así que vea la otra opción antes que nada.

Y la otra opción es: existen varios productos (Thinstall, Molebox si la memoria se sirve) que "envuelven" la aplicación redirigiendo su E/S de archivo a otra ubicación. También hubo algunos SDK para hacer lo mismo, pero no recuerdo su nombre en absoluto.

0

Hay una escasez de buenas soluciones para esto. Para simplificar, no puedo mejorar el uso de enlaces suaves NTFS (uniones) para esto, como usted señala correctamente, esto crea problemas si desea la configuración por usuario. Como dice correctamente MSalters, todos los enlaces blandos y duros NTFS son solo casos especiales de puntos de reanálisis, por lo que podría hacer algo más general al implementar un nuevo tipo de análisis, si no le importa trabajar en NTFS ...

(Junction es una herramienta bastante útil cuando se experimenta con enlaces suaves NTFS: http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx)

Puede tomar un enfoque directo: otorgue a cada usuario (o la inicialización de su programa si solo le interesa una pieza de software) un script de inicio de sesión que configura el enlace apropiado en su directorio de usuario (y asegúrese de limpiarlo después). Pero es torpe.

En general, el enfoque correcto de Windows es poner las cosas en las carpetas apuntadas por el% localappdata% (de Vista en) y, más generalmente,% userprofile% variables del sistema. La virtualización del sistema de archivos Win está destinada a garantizar esto en los casos en los que se aplica.

Cuestiones relacionadas