Là số lớn, số phụ duy nhất


11

major, minorsố duy nhất?

Chúng tôi có bất kỳ trích dẫn và tham khảo về nó?

NAME   MAJ:MIN RM   SIZE RO MOUNTPOINT
sda      8:0    0 465.8G  0 
├─sda1   8:1    0 298.2M  0 
├─sda2   8:2    0     3G  0 
├─sda3   8:3    0 458.7G  0 /
├─sda4   8:4    0     1K  0 
└─sda5   8:5    0   3.8G  0 
sr0     11:0    1  1024M  0 

chuyên ngành là phần cứng, thứ yếu là bộ phận phụ của phần cứng chính
Kiwy

Câu trả lời:


20

Từ Giao diện lập trình Linux , §14.1

Mỗi tệp thiết bị có một số ID chính và một số ID phụ. ID chính xác định lớp chung của thiết bị và được nhân sử dụng để tra cứu trình điều khiển thích hợp cho loại thiết bị này. ID phụ xác định duy nhất một thiết bị cụ thể trong một lớp chung. ID chính và phụ của tệp thiết bị được hiển thị bằng lệnh ls -l.

[...]

Mỗi trình điều khiển thiết bị đăng ký liên kết của nó với một ID thiết bị chính cụ thể và liên kết này cung cấp kết nối giữa tệp đặc biệt của thiết bị và thiết bị. Tên của tệp thiết bị không có liên quan khi kernel tìm trình điều khiển thiết bị.

Xem thêm chương Trình điều khiển thiết bị Linux (2e) cũ (2001) này .

tức là ý định là cung cấp một ánh xạ duy nhất của chính: phụ cho thiết bị: ví dụ cho từng loại thiết bị. Nghiêm túc, bạn có thể có hai thiết bị riêng biệt có cùng một chính: thứ yếu, miễn là một là char và một là khối:

# ls -l /dev/ram1 /dev/mem
crw-r----- 1 root kmem 1, 1 Jan  1  1970 /dev/mem
brw-rw---- 1 root disk 1, 1 Jan  1  1970 /dev/ram1

Trên Linux, tại bất kỳ thời điểm nào trên một hệ thống, số chính: số phụ cho mỗi loại thiết bị là duy nhất. Tuy nhiên, các con số có thể thay đổi theo thời gian và không cần phải giống nhau trên các hệ thống Linux khác nhau (ngay cả cùng phân phối, nhân và phần cứng). Lưu ý rằng các thiết bị ký tự và khối có không gian đánh số riêng biệt, ví dụ: khối chính 1 được gán cho các đĩa RAM, char Major 1 được gán cho một bộ thiết bị kernel bao gồm null và zero.

Các chuyên ngành thiết bị trong lịch sử (hầu hết) được phân bổ tĩnh thông qua một sổ đăng ký (vẫn còn hiện diện, mặc dù không rõ ràng, trong nguồn kernel Documentation/devices.txt). Ngày nay, nhiều thiết bị được phân bổ động, điều này được quản lý bởi udev và ánh xạ có thể xem được /proc/devices. Các thiết bị cố định vẫn tồn tại incude/uapi/linux/major.h(được chuyển từ gần đây include/major.h)

Bây giờ mặc dù kết hợp chính: nhỏ xác định duy nhất các trường hợp thiết bị cụ thể, không có gì ngăn bạn tạo nhiều nút thiết bị (tệp) tham chiếu đến cùng một thiết bị. Chúng thậm chí không phải được tạo trong /dev(nhưng chúng phải nằm trên một hệ thống tệp hỗ trợ tạo các nút thiết bị và không được gắn với nodevtùy chọn).

Một cách sử dụng phổ biến là tạo các thiết bị ngẫu nhiên zero, null và ngẫu nhiên trong một chroot:

# find /dev /var/chroot -regextype posix-extended -regex ".*/(zero|null|random)" -type c | 
xargs ls -l
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /dev/zero
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /var/chroot/sendmail/dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /var/chroot/sendmail/dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /var/chroot/sendmail/dev/zero

Tên chỉ là bí danh, kernel không quan tâm nhiều đến hầu hết tên hoặc địa điểm, nó quan tâm đến số chính để nó có thể chọn trình điều khiển chính xác và trình điều khiển (thường) quan tâm đến số phụ để nó có thể chọn ví dụ đúng.

Hầu hết các tên chỉ đơn giản là quy ước (mặc dù một số được định nghĩa bởi POSIX ). Cũng lưu ý rằng một thiết bị có thể đăng ký nhiều số chính, kiểm tra sdtrình điều khiển trong /proc/devices; tên mô-đun trình điều khiển ( .ko) không cần giống với tên thiết bị và không cần giống với nút thiết bị /devvà một mô-đun trình điều khiển duy nhất có thể quản lý nhiều thiết bị logic / vật lý hoặc tên thiết bị.


Tóm tắt lại: bạn có thể có hai hoặc nhiều nút thiết bị (trong /dev/hoặc ở nơi khác) có cùng số chính: số phụ, nhưng nếu chúng cùng loại thì chúng tham chiếu đến cùng một thiết bị. Bạn có thể có một trình điều khiển có thể xử lý nhiều phiên bản chính, nhưng trong nhân và trong trình điều khiển, đối với mỗi loại (char hoặc khối), số chính: số phụ được lấy để chỉ một thiết bị cụ thể (chính) và một phiên bản cụ thể ( nhỏ) của thiết bị.

Bạn không thể có hai nút thiết bị có cùng loại và chính: phụ và mong muốn chúng truy cập hai thiết bị logic hoặc vật lý khác nhau. Khi một thiết bị đang được truy cập, nhân chọn một trình điều khiển dựa trên loại và số chính (và không dựa trên tên nút của thiết bị) và theo quy ước, số phụ sẽ xác định chọn một thể hiện hoặc chức năng phụ cụ thể.


Cập nhật Một số lịch sử thú vị và một số phối cảnh * BSD có thể được tìm thấy trong bài thuyết trình BSDCon năm 2002 của Poul-Henning Kamp : https://www.usenix.org/legacy/events/bsdcon/full_ con / kamp / kamp_html /

Nếu bạn quay ngược thời gian về năm 1978 (với sự cho phép của Alcatel-Lucent, Tạp chí kỹ thuật hệ thống Bell tháng 7-8 / 1978), ' Hệ thống chia sẻ thời gian Unix ' sẽ nêu rõ (tr1937):

Các thiết bị được đặc trưng bởi một số thiết bị chính, một số thiết bị phụ và một lớp (khối hoặc ký tự). Đối với mỗi lớp, có một loạt các điểm vào trình điều khiển thiết bị. Số thiết bị chính được sử dụng để lập chỉ mục mảng khi gọi mã cho trình điều khiển thiết bị cụ thể. Số thiết bị nhỏ được truyền cho trình điều khiển thiết bị làm đối số. Số phụ không có ý nghĩa gì khác ngoài số được quy cho nó bởi người lái xe. Thông thường, trình điều khiển sử dụng số phụ để truy cập một trong một số thiết bị vật lý giống hệt nhau.


Vì vậy, chúng tôi có thể có hai thiết bị có cùng cặp hoặc MAJ:Minsố
Dipak Ingole

1
Vâng, với những ràng buộc. Cập nhật.
mr.spuratic

2

Khi một tập tin thiết bị được tạo bởi mknode, majorminorsố được cung cấp. Đây là cách Linux xác định thiết bị phần cứng cơ bản được liên kết với tệp thiết bị. Trong hầu hết các trường hợp, majorsố họ xác định trình điều khiển trong khi minorphân biệt các thiết bị khác nhau mà trình điều khiển điều khiển.

Do đó, các số phải là duy nhất cho mỗi thiết bị hoặc không thể tạo các tệp thiết bị chính xác cho tất cả các thiết bị.


0

Không, trên Linux chúng không phải lúc nào cũng độc đáo.

Linux đang sử dụng một devptshệ thống tệp ảo để cung cấp giả mã (ptys) và hệ thống tệp ảo đó có thể được gắn kết nhiều lần và ở những nơi khác nhau, điều này rất thiết thực khi thiết lập các thùng chứa không gian hoặc không gian tên. Mặc dù một major:minortuple là duy nhất trên một devptscá thể hệ thống tập tin, nhưng nó không phải là duy nhất trên một hệ thống đang chạy:

# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   34:3
# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   35:3

Trong ví dụ trên, script(1)lệnh tạo một thiết bị đầu cuối giả và chạy một lớp vỏ bên trong nó. Rõ ràng là thiết bị đầu cuối giả được tạo bởi scriptquy trình đầu tiên không giống với thiết bị được tạo bởi thứ hai, nhưng chúng có cùng tên và số chính, số phụ.

Để xác định duy nhất một giả ngẫu nhiên, bạn cần sử dụng device:inodebộ dữ liệu của họ hoặc kết hợp số thiết bị (của hệ thống tập tin devpts) với chúng major:minor. Vấn đề là trường "tty" của /proc/PID/stat(thứ 7, xem proc(5)trang chủ; đó là nơi các công cụ thích lsofhoặc pslấy thông tin của họ) chỉ chứa st_rdevphần tty (được đóng gói major:minor); nếu đó là một nô lệ đáng tiếc, không có dấu hiệu nào cho devptshệ thống tập tin cung cấp nó. Các vấn đề tương tự ảnh hưởng đến số thiết bị có thể đạt được với TIOCGDEVioctl.

AFAICS không có cách nào đáng tin cậy để xác định thiết bị đầu cuối kiểm soát của một quá trình trên Linux. Sửa chữa và đề nghị khác chào mừng!

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.