2010-08-24 22 views
5

Linux có một tính năng được gọi là namespaces, cho phép bạn cung cấp một "chế độ xem" khác nhau của hệ thống tệp cho các quy trình khác nhau. Trong thuật ngữ Windows, điều này sẽ hữu ích cho ví dụ nếu bạn có một chương trình kế thừa "floyd" luôn tải cấu hình của nó từ C:\floyd\floyd.ini. Nếu Windows có không gian tên, bạn có thể viết một kịch bản trình bao để tạo ra một không gian tên để chạy floyd, làm cho nó khi Alice chạy tập lệnh, floyd sẽ khởi động trong môi trường có C:\floyd tồn tại nhưng thực sự chỉ đến C:\Users\Alice\Floyd.Windows tương đương với các không gian tên Linux (gắn kết hệ thống tập tin trên mỗi quá trình)?

Bây giờ bạn có thể nghĩ, "OK, chỉ cần sử dụng liên kết mềm hoặc cứng và đặt C:\floyd bí danh cho C:\Users\Alice". Nhưng với các không gian tên, Bob cũng có thể chạy tập lệnh khởi động, nhưng thể hiện của floyd (trên cùng một máy tính, chạy cùng lúc) sẽ thấy C:\floyd với nội dung của, chẳng hạn như C:\Users\Bob\Program Settings\Floyd Config (hoặc bất kỳ đường dẫn nào khác mà chúng tôi thích).

Bạn có thể thực hiện việc này trên Linux với các không gian tên. Có cái gì đó tương tự hoặc tương tự trên Windows? Sẽ tốt nếu nó yêu cầu viết một chương trình C và sẽ ổn nếu nó chỉ hoạt động trên các phiên bản Windows gần đây.

+0

Các bastards thực là tất nhiên những chương trình tải cấu hình của chúng từ một cái gì đó như '\ floyd \ floyd.ini' - một đường dẫn tương đối ổ đĩa hoạt động nếu directroy làm việc hiện tại ở bất kỳ đâu trên cùng ổ đĩa. Không thể thực sự khắc phục điều đó với các không gian tên. – MSalters

+1

Đây không thực sự là một câu hỏi lập trình, nhưng nó quá thú vị để đóng. – Gabe

Trả lời

3

Liên kết cứng NTFS thực sự là trường hợp đơn giản là reparse points. Điểm thô được nhập và có thể bao gồm hành vi nâng cao hơn. Ví dụ: chúng cũng được sử dụng cho "lưu trữ ngoại tuyến" (di chuyển trong suốt các tệp đến và từ bộ nhớ thứ cấp).Do đó, bạn cũng có thể sử dụng các điểm reparse để thực hiện các liên kết tượng trưng cho mỗi người dùng, bằng cách tạo một kiểu reparse mới.

Loại điểm phân bổ thậm chí còn có bit "Thay thế tên" rõ ràng, trong đó (nếu được đặt) cho biết các điểm thô của các loại đó là một loại liên kết tượng trưng.

Bạn thậm chí có thể có nhiều điểm cố định trong đường dẫn. Do đó, các tệp bên trong tên bảng biểu tượng của bạn vẫn có thể được di chuyển sang bộ nhớ thứ cấp - bạn chỉ có hai điểm reparse trong đường dẫn.

+1

Có bất kỳ công cụ nào liên quan đến chức năng này hay tôi phải xác định cơ bản thẻ "ứng dụng" của riêng mình cho loại dữ liệu điểm thô và viết bộ lọc hệ thống tệp của riêng mình để thực sự thực hiện hành vi của các liên kết tượng trưng cho mỗi người dùng? Tôi đánh giá cao câu trả lời rất nhiều khi chỉ cho tôi các bit thô tôi có thể sử dụng, nhưng trong nháy mắt, điều này dường như yêu cầu một số công việc khá đáng kể - chỉ muốn xác nhận ước tính của tôi phù hợp với bạn. –

+1

Nó không tầm thường, vâng. Tôi không nghĩ rằng bạn cần một bộ lọc hệ thống tập tin (bởi vì điểm reparse của bạn chỉ thực hiện một chuyển hướng đơn giản) nhưng bạn cần một thành phần cấp thấp có thể tạo và giải thích loại điểm khan hiếm của bạn. Toolwise, tôi mong đợi nhiều thông tin hơn trong IFS SDK hoặc DDK. – MSalters

0

Bạn có thể sử dụng liên kết cứng cho điều đó, nhưng chỉ với NTFS. http://en.wikipedia.org/wiki/Hard_link

Tôi nghĩ rằng cửa sổ không có chế độ xem FS ảo cho mỗi quá trình.

+0

Tôi không nghĩ rằng đó là ngay cả gần ... –

+0

Windows chắc chắn có một FS xem ảo mỗi phiên đăng nhập; ánh xạ ổ đĩa từ xa thường không thể tiếp cận với những người dùng khác trên cùng một máy. – MSalters

+0

MSalters: ánh xạ ổ đĩa từ xa có thể khác nhau trong các trường hợp khác nhau của nói một dấu nhắc lệnh cho một người dùng duy nhất? Hay chúng chỉ khác nhau ở cấp phiên cuối của người dùng?Tôi thực sự muốn có một người dùng đã đăng nhập khởi chạy nội dung trong nhiều "không gian tên" trong một số trường hợp (tức là Alice và Bob có thể đang sử dụng cùng phiên đăng nhập Windows, chỉ cần khởi chạy hai tập lệnh khác nhau). –

0

Điều phù hợp nhất có thể là các thư mục môi trường đặc biệt, chẳng hạn như% temp%,% appdata%,% localappdata%. Không phải chúng tương đương nhau, nhưng chúng hoàn thành cùng một mục đích.

Bạn có thể xác định biến môi trường của riêng mình, sau đó sử dụng '% myspecialplace% \ myfile.txt' để truy cập chúng.

+0

Tôi nghĩ rằng điều này giả định tôi có thể chỉnh sửa "floyd", mà tôi không thể làm. –

1

Tôi nghĩ Cửa hàng ảo tự động thực hiện điều này cho các chương trình cũ mà cố gắng ghi vào các thư mục không chuẩn. Vì vậy, chương trình cũ ghi vào thư mục người dùng và chương trình cụ thể thay vì C:\floyd.

+1

Tôi không nghĩ rằng các thư mục ngẫu nhiên như 'C: \ floyd \' được ảo hóa. Thư mục Windows và thư mục Program Files đều là. – MSalters

+0

Việc MSalter thực hiện điều này phù hợp với sự hiểu biết của tôi (có giới hạn), có nghĩa là tôi không thể sử dụng điều này để làm những gì tôi cần. –

0

Điều này nghe giống như Windows Vista file system virtualization. Ví dụ: nó có thể chuyển hướng âm thầm c:\Program Files\Floyd đến c:\Users\<username>\AppData\Local\VirtualStore\Program Files\Floyd. Tuy nhiên, việc ảo hóa hệ thống tệp không gần như được cấu hình như các vùng tên Linux. Từ những gì tôi có thể nói từ đọc, ảo hóa hệ thống tệp sẽ áp dụng bất kỳ lúc nào một quá trình tương tác 32 bit mở ra để viết tệp, thư mục hoặc khóa đăng ký chỉ có thể ghi bởi quản trị viên. (Vì vậy, bạn thường kết thúc với một số tệp chỉ đọc theo số c:\Program Files và một số tệp có thể ghi trên mỗi người dùng theo c:\Users\<username>\AppData\Local\VirtalStore.)

Sản phẩm application virtualization cũng có thể phức tạp hơn và đắt hơn.

0

Là một kludge khủng khiếp (và ở đây tôi đặt đoạn văn của tôi vào địa chỉ lập trình) bạn có thể sử dụng một NamedPipe cho C: \ Floyd ánh xạ các hoạt động IO lên tệp cụ thể cho người dùng quy trình hiện tại không?

Tôi biết nó không đẹp và tôi không biết đủ về NamedPipes (FIFO ở các phương ngữ khác) trên Windows để biết khả năng này là như thế nào.

Dan

+0

Không; tên 'C: \ Floyd' được công nhận là một tên hỗn hợp, và' C: 'là (xem xét thiết lập) một liên kết tượng trưng trong không gian tên hạt nhân, tham chiếu tới phân vùng (NTFS hoặc FAT). Do đó phần 'Floyd' được giải quyết liên quan đến điều đó. – MSalters

+0

Trên Windows, tất cả các đường ống có tên được tạo trong thư mục '\\. \ Pipe \', chúng không thể được đặt tên như các tệp thông thường. –

+0

Cảm ơn các bạn đã biết. Có lẽ tốt nhất là đây không phải là cách tiếp cận khả thi. –

0

ví dụ: http://www.msigeek.com/4819/file-re-direction-using-correctfilepaths-shim-to-fix-broken-applications

Nhưng tôi nghĩ rằng nó không thể định cấu hình cho mỗi người dùng, mặc dù mục tiêu có thể thay đổi theo người dùng dựa trên thay thế biến môi trường.

Hầu hết các chương trình, tuy nhiên, lưu cấu hình trong sổ đăng ký, trong trường hợp này RegOverridePredefKey sẽ thực hiện thủ thuật.

0

Có một số điều nảy sinh trong đầu tôi.

Trước hết bạn có thể tạo trình điều khiển bộ lọc hệ thống tệp (hoặc sử dụng trình điều khiển sẵn sàng, chẳng hạn như sản phẩm CallbackFilter) sẽ chuyển hướng tất cả các cuộc gọi hệ thống tệp đến từ vị trí khác. Điều này là gần với ảo hóa mà bạn đã đề cập nhưng điều này sẽ không thay đổi danh sách các ký tự ổ đĩa mặc dù. Cách tiếp cận này vừa mạnh mẽ vừa không tầm thường, vì vậy hãy xem tùy chọn khác trước hết.

Và tùy chọn khác là: có tồn tại một số sản phẩm (Thinstall, Molebox nếu bộ nhớ phục vụ) rằng "bọc" ứng dụng chuyển hướng tệp I/O đến một số vị trí khác. Ngoài ra còn có một số SDK để làm như vậy, nhưng tôi không nhớ tên của nó cả.

0

Có sự thiếu hụt các giải pháp tốt cho việc này. Để đơn giản, tôi không thể cải thiện việc sử dụng các liên kết mềm (các nút nối) NTFS cho điều này - như bạn đã chỉ ra một cách chính xác, điều này tạo ra các vấn đề nếu bạn muốn cấu hình cho mỗi người dùng. Như MSalters nói chính xác, tất cả các liên kết mềm và cứng NTFS chỉ là trường hợp đặc biệt của các điểm reparse, vì vậy bạn có thể làm một cái gì đó tổng quát hơn bằng cách impplementing một loại reparse mới, nếu bạn không nhớ một số công việc đào vào NTFS ..

(Junction là một công cụ khá hữu ích khi thử nghiệm với NTFS liên kết mềm: http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx)

bạn chỉ có thể tham gia một cách tiếp cận trực tiếp - cung cấp cho mỗi người dùng (hoặc khởi tạo chương trình của bạn nếu bạn chỉ quan tâm đến một phần của phần mềm) một kịch bản đăng nhập mà thiết lập đường giao nhau thích hợp vào thư mục người dùng của họ (và chắc chắn rằng bạn dọn dẹp nó sau đó). Nhưng đó là vụng về.

Nói chung, cách tiếp cận đúng của Windows là đưa mọi thứ vào các thư mục được chỉ bởi% localappdata% (từ Vista) và, nói chung,% userprofile% biến hệ thống. Tối ưu hóa hệ thống tệp ảo nhằm đảm bảo điều này trong trường hợp áp dụng.

Các vấn đề liên quan