Tôi có thể chia sẻ một thiết bị từ dưới / dev trên máy chủ không?


6

Đây là tình hình. Tôi có một thiết bị video /dev/video0trên VMware Server và tôi muốn truy cập thiết bị này từ bên trong một máy ảo. Tuy nhiên vì bất kỳ lý do gì tôi không thể kết nối thiết bị trực tiếp với VM, thiết bị phải được kết nối với máy chủ.

Vì theo triết lý unix, mọi thứ thực sự chỉ là một tệp, tôi có thể chia sẻ một thiết bị /devbằng cách sử dụng NFS, Samba, sshfs hoặc một số giao thức khác giữa hai máy chủ, để một linux trên một máy chủ có thể truy cập các thiết bị trên một máy chủ khác không?


3
Một trong số ít trường hợp mà suy nghĩ đầu tiên của tôi là: "Điều này sẽ dễ dàng hơn nếu bạn đang sử dụng Kế hoạch 9"
Steven D

@Steven D: Đó thực chất cũng là suy nghĩ đầu tiên của tôi :-)
SamB

Câu trả lời:


9

Không.

Bạn có thể xuất tệp thiết bị thông qua NFS hoặc một số hệ thống tệp mạng khác. Nhưng ý nghĩa của tập tin thiết bị phụ thuộc vào máy bạn mở nó. Nếu bạn xuất /dev/video0qua NFS từ máy chủ sang máy khách, máy khách sẽ chỉ nhìn thấy thiết bị ký tự 81: 0, và diễn giải nó như một thiết bị quay video của chính nó. Máy khách thậm chí không cần phải gán cùng số thiết bị với máy chủ; ví dụ, một máy khách OpenBSD sẽ thấy cùng một tệp với trình điều khiển thiết bị đầu cuối giả , bởi vì đó là những gì char 81: 0 nằm trong OpenBSD.

Những gì bạn đang yêu cầu sẽ rất tốt, nhưng cũng rất khó. Mọi yêu cầu trên máy khách sẽ phải được chuyển tiếp đến máy chủ và ngược lại. Sẽ phải có hỗ trợ cụ thể trong các trình điều khiển cá nhân. Ví dụ, một số trình điều khiển dựa vào bộ nhớ dùng chung giữa tiến trình và kernel, và hỗ trợ trong suốt trên mạng sẽ khó khăn và tốn kém trong nhiều trường hợp. Tôi không biết trình điều khiển quay video có sử dụng bộ nhớ dùng chung hay không, nhưng tôi cho rằng nó có khả năng truyền một lượng lớn dữ liệu không đồng bộ, tôi hy vọng nó sẽ được.

Linux có một số hỗ trợ cụ thể cho các thiết bị khối mạng . Họ không dựa vào một hệ thống tập tin mạng; tệp thiết bị chỉ tồn tại trên máy khách và trình nền trên máy chủ mô phỏng thiết bị khối vật lý (nó có thể chuyển tiếp các hoạt động đến và từ một thiết bị vật lý thực, nhưng thường nó đọc và ghi vào tệp hình ảnh).

Bạn nên tìm một giải pháp dành riêng cho việc quay video. Cố gắng chạy càng nhiều phần dữ liệu trên máy mà thiết bị vật lý được gắn vào. Hoặc tìm một giải pháp máy ảo hỗ trợ truy cập trực tiếp vào thiết bị vật lý từ bên trong máy ảo (Tôi không biết liệu có giải pháp máy chủ / máy khách nào không; các giải pháp dựa trên hypanneror có nhiều khả năng hơn).


Thiết bị chặn mạng. Cảm ơn vì lời khuyên đó! Chính xác những gì tôi đang tìm kiếm. Đó là một cách tuyệt vời để chuyển ddđĩa sang máy khác mà không cần dùng tuốc nơ vít.
Christian

1
@Christianssh root@othermachine cat /dev/sdb >/dev/sdc
Gilles 'SO- ngừng trở nên xấu xa'

1
Tôi biết điều đó thật ngu ngốc nhưng bằng cách nào đó tôi không tin tưởng vào catdữ liệu nhị phân quan trọng. Phải là một số chấn thương chôn sâu mà tôi không nhớ rõ. Và không, tôi không phải là một con chó; không phải vậy đâu
Christian

2
@Christian Một số hệ thống Unix cũ hơn có các công cụ xử lý văn bản không xử lý chính xác dữ liệu nhị phân, nhưng tôi nghi ngờ rằng đã từng áp dụng catvà trong mọi trường hợp catsẽ hoạt động trên tất cả các hệ thống hiện tại. Các tiện ích GNU (những tiện ích trên Linux) luôn xử lý dữ liệu nhị phân một cách chính xác, đó là mục tiêu thiết kế ngay từ đầu. Việc sử dụng dddữ liệu nhị phân là một thói quen được kế thừa từ thời của băng từ; trên các hệ thống Linux đương đại, không chỉ là một sự phức tạp không cần thiết, nó thậm chí còn có xu hướng chậm hơn .
Gilles 'SO- ngừng trở thành ác quỷ'

Ok, có lẽ tôi sẽ tích cực làm việc chống lại sự phản đối phi lý của mình sau đó;)
Christian

4

Ngoài câu trả lời của Gilles - miễn là bạn không có ý định thực hiện ioctls trên tệp, đó chỉ đơn giản là một luồng. Vì vậy, nếu bạn chạy từ khách

# mkfifo /dev/fakevideo0
# ssh host cat /dev/video0 > /dev/fakevideo0

/ dev / fakevideo0 sẽ hoạt động như một bộ đệm, vì vậy nếu bạn đọc từ nó, bạn sẽ nhận được luồng từ máy ảnh.


Thủ tục này sẽ làm việc cho truyền thông hai chiều? Ví dụ, tôi muốn làm điều này với một cổng nối tiếp.
portforwardpodcast

1
@portforwardpodcast Tôi không nghĩ rằng nó sẽ hoạt động đơn giản - có lẽ bạn sẽ cần phải bọc nó trong ống unix để bạn có thể cần phải viết chương trình / tập lệnh ở cả hai bên.
Maciej Piechotka

1
Cảm ơn vì bạn đã phản hồi. Tôi chỉ tìm thấy trang này mà hoạt động tuyệt vời cho hướng nối tiếp kép trên tcp / ip dest-unreach.org/socat/doc/socat-ttyovertcp.txt
portforwardpodcast

điều này sẽ không hoạt động tốt cho video, vì bộ đệm ống mặc định là 4K
h4unt3r

0

Điều này không trả lời câu hỏi của OP nhưng có công cụ này được gọi là netevent tại https://github.com/Blub/netevent cho phép bạn chia sẻ các thiết bị ioctl nằm /dev/input/event*giữa các máy. Cá nhân tôi đã thử nó và nó làm việc cho tôi.


Câu hỏi ban đầu của OP về / dev / video từ lâu không liên quan;) Tôi đã chuyển từ thiết lập cũ đó từ lâu. Nhưng netevent có vẻ thú vị cho các tình huống khác ...
Josh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.