2010-08-24 11 views
5

Linux ha una funzionalità chiamata namespaces, che consente di assegnare una "vista" diversa del filesystem a processi diversi. In termini Windows, questo sarebbe utile ad esempio se si avesse un programma legacy "floyd" che caricava sempre la sua configurazione da C:\floyd\floyd.ini. Se Windows avesse spazi dei nomi, potresti scrivere uno script wrapper che creerebbe uno spazio dei nomi in cui eseguire floyd, facendo in modo che quando Alice eseguisse lo script, floyd si avvierebbe in un ambiente in cui era presente C:\floyd ma in realtà puntava a C:\Users\Alice\Floyd.Windows equivalente agli spazi dei nomi di Linux (supporti per filesystem per processo)?

Ora si potrebbe pensare, "OK, basta usare collegamenti soft o hard e rendere C:\floyd un alias per C:\Users\Alice." Ma con gli spazi dei nomi, Bob può anche eseguire lo script di avvio, ma la sua istanza di floyd (sullo stesso computer, in esecuzione allo stesso tempo) vedrà C:\floyd con il contenuto di, ad esempio, C:\Users\Bob\Program Settings\Floyd Config (o qualsiasi altro percorso che ci piace).

È possibile farlo su Linux con spazi dei nomi. C'è qualcosa di simile o analogo su Windows? Va bene se richiede la scrittura di un programma in C, ed è OK se funziona solo su versioni recenti di Windows.

+0

I veri bastardi sono ovviamente quei programmi che caricano la loro configurazione da qualcosa come '\ floyd \ floyd.ini' - un percorso relativo all'unità che funziona se la directory di lavoro corrente è ovunque sulla stessa unità. Non posso davvero sistemarlo con i namespace. – MSalters

+1

Questa non è davvero una domanda di programmazione, ma è troppo interessante per chiudere. – Gabe

risposta

3

NTFS collegamenti reali sono davvero un semplice caso di reparse points. I punti di analisi vengono digitati e possono includere un comportamento più avanzato. Ad esempio, vengono anche utilizzati per "storage offline" (migrazione trasparente di file da e verso storage secondario).È quindi possibile utilizzare anche punti di analisi per implementare collegamenti simbolici per utente, creando un nuovo tipo di analisi.

Il tipo di punto di reparse ha anche un bit "Nome surrogato" esplicito, che (se impostato) indica che i punti di analisi di tali tipi sono una sorta di collegamento simbolico.

È anche possibile avere più punti di analisi in un percorso. Pertanto i file all'interno della propria area simbolica possono ancora essere migrati nell'archiviazione secondaria: si avranno solo due punti di analisi nel percorso.

+1

Esistono strumenti relativi a questa funzionalità, o dovrei definire fondamentalmente il mio tag "applicazione" per un tipo di dati di punto di analisi e scrivere il mio filtro di file system per implementare effettivamente il comportamento dei collegamenti simbolici per utente? Apprezzo molto la risposta per avermi indirizzato ai bit grezzi che potrei usare, ma a prima vista sembra richiedere un lavoro piuttosto consistente - voglio solo confermare che la mia stima corrisponda al tuo. –

+1

Non è banale, sì. Non penso che sia necessario un filtro per il filesystem (perché il tuo punto di analisi esegue solo un semplice reindirizzamento) ma hai bisogno di un componente di basso livello in grado di creare e interpretare il tuo tipo di punti di analisi. Toolwise, mi aspetterei più informazioni nell'SDK IFS o DDK. – MSalters

0

È possibile utilizzare gli hardlink per questo, ma solo con NTFS. http://en.wikipedia.org/wiki/Hard_link

Penso che Windows non abbia una vista virtuale per processo.

+0

non penso che sia nemmeno vicino ... –

+0

Windows ha sicuramente una vista virtuale di FS per sessione di login; I mapping di unità remote sono generalmente inaccessibili ad altri utenti sulla stessa macchina. – MSalters

+0

MSalters: i mapping delle unità remote possono essere diversi in diverse istanze, ad esempio un prompt dei comandi per un singolo utente? Oppure differiscono solo al livello della sessione terminale di un utente?In realtà voglio essere in grado di far sì che un utente loggato lanci la cosa in più di uno "spazio dei nomi" in alcuni casi (ad esempio, Alice e Bob potrebbero utilizzare la stessa sessione di login di Windows, semplicemente lanciando due script diversi). –

0

La cosa più rilevante sono probabilmente cartelle di ambiente speciali, come% temp%,% appdata%,% localappdata%. Non che siano equivalenti, ma soddisfano lo stesso scopo.

È possibile definire le proprie variabili di ambiente, quindi utilizzare "% myspecialplace% \ myfile.txt" per accedervi.

+0

Penso che questo supponga che posso modificare "floyd", che non posso fare. –

1

Penso che Virtual Store lo faccia automaticamente per i programmi legacy che tentano di scrivere su directory non standard. Quindi il programma legacy scrive su una directory specifica per utente e programma invece su C:\floyd.

+1

Non penso che le cartelle casuali come 'C: \ floyd \' siano virtualizzate. Entrambi sono la directory di Windows e Program Files. – MSalters

+0

Il modo in cui MSalter interpreta questo corrisponde alla mia (limitata) comprensione, il che significa che non posso usarlo per fare ciò di cui ho bisogno. –

0

Questo suona come file system virtualization di Windows Vista. Ad esempio, può reindirizzare automaticamente c:\Program Files\Floyd a c:\Users\<username>\AppData\Local\VirtualStore\Program Files\Floyd. Tuttavia, la virtualizzazione del file system non è quasi configurabile come i namespace di Linux. Da quello che posso dedurre dalla lettura, la virtualizzazione del file system dovrebbe applicarsi ogni volta che un processo interattivo a 32 bit si apre per scrivere un file, una cartella o una chiave di registro che è solo scrivibile dagli amministratori. (Così in genere si finisce con alcune file di sola lettura sotto c:\Program Files e alcuni file scrivibili per-utente in c:\Users\<username>\AppData\Local\VirtalStore.)

Un prodotto application virtualization probabilmente può fare anche questo, anche se questi sono spesso più complicato e più costoso.

0

Come horrid kludge (e qui prenoto il mio passaggio all'inferno di programmazione) potresti utilizzare NamedPipe per C: \ Floyd che ha mappato le operazioni di I/O su un file specifico per l'utente del processo corrente?

So che non è bello e non so abbastanza su NamedPipes (FIFO in altri dialetti) su Windows per sapere quanto sia fattibile.

Dan

+0

No; il nome 'C: \ Floyd' è riconosciuto come un nome composito, e' C: 'è (considerando la configurazione) un collegamento simbolico nello spazio dei nomi del kernel, facendo riferimento a una partizione (NTFS o FAT). Quindi la parte 'Floyd' è risolta relativamente a quello. – MSalters

+0

Su Windows, tutte le pipe denominate vengono create nella directory '\\. \ Pipe \', non possono essere denominate come normali file. –

+0

Grazie per l'informazione ragazzi. Probabilmente è meglio che questo non sia un approccio fattibile. –

0

Ci sono molte cose che mi vengono in mente.

Prima di tutto è possibile creare un driver di filtro del file system (o utilizzare un driver pronto, come il nostro prodotto CallbackFilter) che reindirizza tutte le chiamate al file system, provenienti dall'applicazione, in un'altra posizione. Questo è vicino alla virtualizzazione che hai menzionato, ma questo non cambierà comunque l'elenco delle lettere di unità. Tale approccio è sia potente che non banale, quindi vedi prima l'altra opzione.

E l'altra opzione è: esistono diversi prodotti (Thinstall, Molebox se serve la memoria) che "avvolgono" l'applicazione reindirizzando l'I/O del file in un'altra posizione. C'era anche un po 'di SDK per fare lo stesso, ma non ricordo affatto il suo nome.

0

C'è una carenza di buone soluzioni per questo. Per semplicità, non riesco a migliorare l'utilizzo dei collegamenti software NTFS (giunzioni) per questo, come si sottolinea correttamente, questo crea problemi se si desidera la configurazione per utente. Come dice correttamente MSalters, tutti i collegamenti soft e hard di NTFS sono solo casi speciali di reparse point, quindi potresti fare qualcosa di più generale inserendo un nuovo tipo di reparse, se non ti interessa lavorare in NTFS.

(Junction è uno strumento piuttosto utile quando si sperimentano i collegamenti software NTFS: http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx)

Si potrebbe semplicemente prendere un approccio diretto - dare ad ogni utente (o all'inizializzazione del programma se si interessa solo un pezzo di software) uno script di accesso che imposta la giunzione appropriata nella loro directory utente (e assicurati di pulirla in seguito). Ma è impacciato.

In generale, l'approccio corretto di Windows consiste nel mettere le cose nelle cartelle puntate da% localappdata% (da Vista in poi) e, più in generale,% userprofile% di variabili di sistema. La virtualizzazione del file system di Windows è concepita per garantire ciò nei casi in cui si applica.

Problemi correlati