Tập tin thiết bị

Trong các hệ điều hành tương tự Unix, **tập tin thiết bị** hoặc **tập tin đặc biệt** là giao diện tới driver thiết bị nằm trong hệ thống tập tin như một tập tin thông thường. Ngoài ra còn có các tập tin đặc biệt trong DOS, OS/2 và Windows. Các tập tin đặc biệt này cho phép ứng dụng chương trình tương tác với thiết bị bằng cách sử dụng driver thiết bị thông qua việc gọi các lệnh hệ thống đầu vào/đầu ra tiêu chuẩn. Sử dụng lệnh gọi hệ thống tiêu chuẩn giúp đơn giản hóa nhiều tác vụ lập trình và dẫn đến cơ chế nhập/xuất trong không gian người dùng được nhất quán bất kể tính năng và chức năng của thiết bị ra sao.

Tập tin thiết bị thường có giao diện đơn giản cho các thiết bị tiêu chuẩn (chẳng hạn như máy in và cổng nối tiếp) nhưng cũng có thể được sử dụng để truy cập các tài nguyên cụ thể duy nhất trên các thiết bị đó chẳng hạn như phân vùng đĩa. Ngoài ra các tập tin thiết bị cũng hữu ích trong việc truy cập tài nguyên hệ thống không kết nối tới bất kỳ thiết bị thực tế nào, chẳng hạn như các bồn chứa dữ liệu và trình khởi tạo số ngẫu nhiên.

Có hai loại tập tin thiết bị chung trong hệ điều hành tương tự Unix được gọi là *character special file* và *block special file*.  Sự khác biệt giữa chúng nằm ở lượng dữ liệu được đọc và ghi bởi hệ điều hành và phần cứng. Cả 2 có thể được gọi là **tập tin đặc biệt của thiết bị** trái ngược với các đường hầm có tên (named pipes) không được liên kết với thiết bị nhưng cũng không phải là tập tin thông thường.

MS-DOS mượn khái niệm tập tin đặc biệt từ Unix và đổi tên chúng thành *thiết bị' (device). Bởi vì các phiên bản đầu tiên của MS-DOS không hỗ trợ hệ thống phân cấp [[thư mục]], các thiết bị được phân biệt với các tập tin thông thường bằng tên được đặt từ [[từ dành riêng]], ví dụ: <code>CON</code>. Chúng được chọn để có tương thích mức độ với [[CP/M]] và vẫn tồn tại trong nhiều phiên bản Windows hiện đại để tương thích ngược.

Trong một số hệ thống tương tự Unix, hầu hết các tập tin thiết bị được quản lý như một phần của [[hệ thống tập tin ảo]] được thiết lập với nhau như bình thường trong <code>/dev</code>, có thể được liên kết với một daemon điều khiển để theo dõi việc thêm và bỏ phần cứng tại thời điểm chạy, thực hiện các thay đổi tương ứng với *'hệ thống tập tin thiết bị*' nếu điều đó không được thực hiện tự động bởi nhân hệ thống, có thể gọi các tập lệnh trong không gian hệ thống hoặc người dùng để xử lý các nhu cầu thiết bị đặc biệt. [[FreeBSD]], [[DragonFly BSD]] và [[Darwin (hệ điều hành)|Darwin]] có một hệ thống tập tin chuyên dụng là *devfs*; các nút thiết bị được quản lý tự động bởi hệ thống tập tin này, trong [[không gian kernel|không gian nhân]]. Linux đã từng triển khai một hệ thống *devfs* tương tự nhưng nó đã bị bỏ mặc không phát triển sau đó và sau đó bị loại bỏ hoàn toàn khỏi hệ thống kể từ phiên bản 2.6.17; Linux hiện nay triển khai tích hợp hệ thống được gọi là *udev* trong [[không gian người dùng]] nhưng nó cũng có nhiều biến thể.

Trong các hệ thống Unix hỗ trợ phân tách quy trình [[chroot]] chẳng hạn như [[Solaris Containers]], thông thường mỗi môi trường chroot cần có <code>/dev</code> của riêng nó; các điểm gắn kết này sẽ hiển thị trên hệ điều hành chủ tại các nút khác nhau trong cây hệ thống tập tin chung. Bằng cách hạn chế các nút thiết bị được đưa vào các phiên bản chroot của <code>/dev</code>, môi trường chroot có thể thực thi việc phân tách phần cứng (một chương trình không thể can thiệp vào phần cứng nếu nó không nhìn thấy hoặc đặt tên — một hình thức [[kiểm soát truy cập]] thậm chí còn mạnh hơn [[các quyền của hệ thống tập tin]] Unix).

MS-DOS quản lý xung đột thiết bị phần cứng (xem [[Chương trình kết thúc và lưu trú|TSR]]) bằng cách mở riêng từng tập tin thiết bị. Một ứng dụng cố gắng truy cập vào một thiết bị đã được sử dụng sẽ bị phát hiện và sẽ không thể mở được nút tập tin thiết bị. Nhiều ràng buộc [[driver thiết bị]] đã được định nghĩa trong Unix và Linux liên quan đến [[truy cập đồng thời]].

==Các hệ thống Unix và tương tự Unix==

Các nút thiết bị tương ứng với các tài nguyên mà [[Nhân (khoa học máy tính)|nhân]] của hệ điều hành đã được cấp phát. Unix xác định các tài nguyên đó bằng một *số chính* và một *số phụ*, cả hai đều được lưu trữ như một phần của cấu trúc [[nút (khoa học máy tính)|nút]]. Việc gán những con số này xảy ra duy nhất trong các [[hệ điều hành]] khác nhau và trên các [[nền tảng máy tính]] khác nhau. Nói chung, số chính xác định driver thiết bị và số phụ xác định một thiết bị cụ thể (nếu có nhiều thiết bị) mà driver đang phân phối: trong trường hợp này, hệ thống có thể chuyển số phụ cho driver. Tuy nhiên, điều này có thể không xảy ra trong trường hợp [[phân bổ số động]] (ví dụ: FreeBSD 5 trở lên).

Cũng như các loại tập tin đặc biệt khác, hệ thống máy tính truy cập các nút thiết bị bằng cách sử dụng các lệnh gọi hệ thống tiêu chuẩn và xử lý chúng như các tập tin máy tính thông thường. Hai loại tập tin thiết bị tiêu chuẩn tồn tại; Thật không may, tên của chúng khá phản trực giác vì những lý do lịch sử và kết quả còn lại ta có được là những giải thích không mấy chính xác về sự khác biệt giữa chúng.

===Character device===
*Character special file* hoặc *character device* không có bộ đệm, có quyền truy cập trực tiếp vào thiết bị phần cứng. Chúng không nhất thiết cho phép các chương trình đọc hoặc viết các ký tự đơn lẻ tại một thời điểm; điều đó tùy thuộc vào thiết bị truy cập. Ví dụ, character device cho đĩa cứng sẽ yêu cầu tất cả các lần đọc và ghi phải được căn chỉnh để chặn các ranh giới và chắc chắn sẽ không cho phép đọc một byte đơn lẻ.

Các character device đôi khi được gọi là *raw device* để tránh sự nhầm lẫn, sự thật là một character device cho phần cứng dựa trên khối thường sẽ yêu cầu các chương trình đọc và ghi các khối đã được căn chỉnh.

===Block device===
*Block special file* hay *block device* cung cấp quyền truy cập có đệm vào các thiết bị phần cứng và cung cấp một số thông tin tóm tắt từ các chi tiết cụ thể của chúng. Không giống như các character device, các block device sẽ luôn cho phép lập trình viên đọc hoặc ghi một khối có kích thước bất kỳ (bao gồm các ký tự hoạc byte đơn lẻ) và bất kỳ liên kết nào. Nhược điểm là bởi vì các block device được lưu vào bộ đệm, lập trình viên không biết sẽ mất bao lâu trước khi dữ liệu đã ghi được chuyển từ bộ đệm của nhân đến thiết bị thực hoặc phải theo thứ tự hai lần ghi riêng biệt mới đến thiết bị vật lý. Ngoài ra nếu cùng một phần cứng mà hiển thị cả character device và block device thì phần cứng đó sẽ có nguy cơ bị hỏng dữ liệu do khách hàng sử dụng character device không biết về những thay đổi được thực hiện trong bộ đệm của block device.

Hầu hết các hệ thống tạo ra cả block device và character device để đại diện cho phần cứng như đĩa cứng. Đáng chú ý điều đó không áp dụng với FreeBSD và Linux; người trước thì đã loại bỏ hỗ trợ cho các block device, trong khi người sau chỉ hỗ trợ tạo ra các block device. Trong Linux, để có được character device cho đĩa, người ta phải sử dụng một "raw" driver, mặc dù người ta có thể nhận được kết quả tương tự như sử dụng character device bằng cách mở block device bằng cờ <code>O_DIRECT</code>.

===Thiết bị giả===
Các nút thiết bị trên các hệ thống tương tự Unix không nhất thiết phải tương ứng với các [[thiết bị vật lý]]. Các nút thiếu sự tương ứng này tạo thành nhóm *thiết bị giả*. Chúng cung cấp các chức năng khác nhau do hệ điều hành xử lý. Một số thiết bị giả (dựa trên ký tự) được sử dụng phổ biến nhất bao gồm:

*  cho phép và từ chối tất cả đầu vào được ghi vào nó; cung cấp [[end-of-file|kết thúc tập tin]] mỗi khi được đọc.
*  cho phép và từ chối tất cả đầu vào được ghi vào nó; tạo ra một dòng liên tục các [[ký tự rỗng]] (byte có giá trị không) khi cố gắng đọc dữ liệu từ nó
*  tạo ra một dòng liên tục các ký tự rỗng (byte có giá trị không) khi cố gắng đọc dữ liệu từ nó và tạo ra lỗi  ("đầy bộ nhớ") khi cố gắng ghi vào nó.
*  tạo ra các byte được tạo bởi [[trình tạo số giả ngẫu nhiên an toàn bằng mật mã]] của nhân. Hành vi của nó thay đổi tùy theo cách triển khai và đôi khi các biến thể như  hay  cũng được sử dụng.

Ngoài ra, các thiết bị giả dành riêng cho BSD có giao diện  cũng có thể bao gồm:
*  cho phép các quy trình vùng người dùng kiểm soát [[PF (tường lửa)|PF]] thông qua giao diện .
*  cung cấp  quyền truy cập vào các thiết bị không được thấy dưới dạng nút của , được  sử dụng để triển khai quản lý [[RAID]] trong [[OpenBSD]] và [[NetBSD]].
*  được sử dụng bởi khung [[envsys]] của NetBSD để [[giám sát hệ thống|giám sát phần cứng]], được truy cập trong vùng người dùng thông qua  bởi tiện ích .

===Tạo nút===
Các nút được tạo bởi [[lệnh gọi hệ thống]] *mknod*. Chương trình dòng lệnh để tạo các nút còn được gọi là mknod. Các nút có thể được di chuyển hoặc xóa bằng các lệnh gọi hệ thống tập tin thông thường ([[đổi tên (máy tính)|rename]], [[unlink (Unix)|unlink]]) và [[lệnh (máy tính)|các lệnh]] ([[mv (Unix)|mv]], [[rm (Unix)|rm]]).

Một số phiên bản Unix có sẵn một tập lệnh có tên là *makedev* hay *MAKEDEV* để tạo tất cả các thiết bị cần thiết trong thư mục <code>/dev</code>. Nó chỉ có ý nghĩa trên các hệ thống có thiết bị được gán số chính tĩnh (ví dụ: bằng cách mã hóa cứng nó trong mô-đun nhân của hệ điều hành).

Trong khi một số hệ thống Unix khác như [[FreeBSD]] chỉ sử dụng quản lý nút thiết bị dựa trên nhân thông qua *devfs* và không hỗ trợ tạo nút thủ công. Lệnh gọi hệ thống *mknod(2)* và lệnh *mknod(8)* tồn tại để giữ khả năng tương thích với POSIX, các nút thiết bị được tạo thủ công bên ngoài *devfs* tất nhiên sẽ không hoạt động.

=== Quy ước đặt tên <span id=" inux naming conventions"></span> ===
Các tiền tố sau được sử dụng cho tên của một số thiết bị trong phân cấp <code>/dev</code> để xác định loại thiết bị:

* <code>lp</code>: [[in dòng]] (line printer, so sánh [[lp (Unix)|lp]])
* <code>pt</code>: [[terminal giả]] (terminal ảo)
* <code>tty</code>: [[Terminal máy tính|terminal]]

Một số tiền tố bổ sung đã được sử dụng phổ biến trong một số hệ điều hành:

* <code>fb</code>: [[bộ đệm khung]] (frame buffer)
* <code>fd</code>: (nền tảng) [[đĩa mềm]], mặc dù cách viết tắt tương tự này cũng thường được sử dụng để chỉ [[trình mô tả tập tin]]
* <code>hd</code>: ("cổ điển") driver [[Chuẩn giao tiếp dữ liệu ATA|IDE]] (trước đây được sử dụng cho [[ổ đĩa cứng]] ATA, [[ổ đĩa quang]] ATAPI,...)
** <code>hda</code>: thiết bị chính trên [[kênh ATA]] đầu tiên (thường được xác định bằng số chính 3 và số phụ 0)
** <code>hdb</code>: thiết bị phụ trên kênh ATA đầu tiên
** <code>hdc</code>: thiết bị chính trên kênh ATA thứ hai
** <code>hdd</code>: thiết bị phụ trên kênh ATA thứ hai
* <code>parport</code>, <code>pp</code>: các [[cổng song song]]
* <code>mem</code>: [[Bộ nhớ chính]] (character device)
* driver [[NVM Express|NVMe]]
** <code>nvme0</code>: driver của thiết bị đã đăng ký đầu tiên (character device)
** <code>nvme0n1</code>: không gian tên đầu tiên của thiết bị được đăng ký đầu tiên (block device)
** <code>nvme0n1p1</code>: phân vùng đầu tiên của không gian tên đầu tiên của thiết bị được đăng ký đầu tiên (block device)
* driver [[MultiMediaCard|MMC]]
** <code>mmcblk</code>: driver lưu trữ cho [[MultiMediaCard|MMC]] Media ([[thẻ SD]], chip eMMC trên máy tính xách tay,...)
*** <code>mmcblk0</code>: thiết bị đăng ký đầu tiên
*** <code>mmcblk0p1</code>: phân vùng đầu tiên của thiết bị được đăng ký đầu tiên
* driver [[SCSI]] cũng được sử dụng bởi [[libATA]] (driver [[Parallel ATA|PATA]]/[[Serial ATA|SATA]] hiện đại), [[Universal Serial Bus|USB]], [[IEEE 1394]],...
** <code>sd</code>: driver lưu trữ hàng loạt (block device)
*** <code>sda</code>: thiết bị đăng ký đầu tiên
*** <code>sdb, sdc</code>,...: thiết bị đã đăng ký thứ hai, thứ ba,...
** <code>ses</code>: Driver bọc
** <code>sg</code>: lớp SCSI chung
** <code>sr</code>: driver "ROM" (ổ đĩa quang định hướng dữ liệu; scd chỉ là một bí danh phụ)
** <code>st</code>: driver [[băng từ]] 
* <code>tty</code>: [[Terminal máy tính|terminal]]
** <code>ttyS</code>: (nền tảng) driver [[cổng nối tiếp]]
** <code>ttyUSB</code>: Bộ chuyển đổi nối tiếp USB, modem,...

Danh sách chuẩn của các tiền tố được sử dụng trong Linux có thể được thấy trong danh sách thiết bị Linux, sổ đăng ký chính thức của số thiết bị được phân bổ và các nút thư mục <code>/dev</code> cho hệ điều hành Linux.

Đối với hầu hết các thiết bị, tiền tố này được theo sau bởi một số nhận dạng thiết bị duy nhất cụ thể. Đối với ổ cứng, một ký tự được sử dụng để xác định thiết bị và theo sau là một số để xác định [[Phân vùng ổ đĩa|phân vùng]]. Vì vậy, một hệ thống tập tin có thể "biết" một khu vực trên đĩa là <code>/dev/sda3</code> chẳng hạn, hoặc "thấy" một terminal đã nối mạng được liên kết với <code>/dev/pts/14</code>.

Trên các đĩa sử dụng [[bản ghi khởi động chính]] của máy tính, số thiết bị của phân vùng chính và phân vùng mở rộng tùy chọn được đánh số từ 1 đến 4 trong khi chỉ mục của bất kỳ phân vùng logic nào là 5 trở đi, bất kể bố cục của phân vùng cũ (vùng đã sinh chúng mở rộng phân vùng không cần phải là phân vùng thứ 4 trên đĩa cũng như không cần phải tồn tại ở cả 4 phân vùng chính).

Tên thiết bị thường thay đổi giữa các biến thể hệ thống tương tự Unix khác nhau, ví dụ: trên một số hệ thống [[BSD]], thiết bị IDE được đặt tên là /dev/wd0, /dev/wd1,...

=== devfs ===
*devfs* là một hệ thống tích hợp của hệ thống tập tin thiết bị trên hệ điều hành tương tự Unix, được sử dụng để hiển thị tập tin thiết bị. Cơ chế triển khai cơ bản có thể khác nhau, tùy thuộc vào hệ điều hành.

Việc duy trì các tập tin đặc biệt này trên hệ thống tập tin được thực hiện *vật lý* (ví dụ như bằng ổ cứng,...) không thuận tiện và vì dù sao nó cũng cần hỗ trợ nhân nên ý tưởng về một hệ thống tệp *logic* có mục đích đặc biệt là để tránh lưu trữ vật lý.

Ngoài ra, việc xác định thời điểm các thiết bị sẵn sàng xuất hiện không hoàn toàn là chuyện nhỏ. Cách tiếp cận của 'devfs' tới driver thiết bị là yêu cầu tạo và xóa các mục 'devfs' liên quan đến thiết bị mà nó kích hoạt hoặc vô hiệu hóa.

==PC DOS, TOS, OS/2 và Windows==
Tập tin thiết bị là một từ khóa dành riêng được sử dụng trong hệ thống [[IBM PC DOS|PC DOS]], [[TOS (Atari)|TOS]], [[OS/2]] và [[Windows]] để cho phép truy cập vào một số cổng và thiết bị nhất định.

[[MS-DOS]] mượn khái niệm tập tin đặc biệt từ Unix nhưng đổi tên chúng thành *các thiết bị' (device)'. Bởi vì các phiên bản đầu tiên của MS-DOS không hỗ trợ hệ thống phân cấp thư mục, các thiết bị được phân biệt với các tập tin thông thường bằng tên được đặt từ từ dành riêng. Điều này có nghĩa là một số tên tập tin nhất định được dành riêng cho các thiết bị và không được dùng để đặt tên cho các tập tin hoặc thư mục mới. Bản thân các tên dành riêng đã được chọn để tương thích với việc xử lý "tập tin đặt biệt" của lệnh `[[PIP (CP/M)|PIP]]` trong CP/M. Có hai loại thiết bị trong DOS: Block Device (được sử dụng cho ổ đĩa) và Character Device (nói chung là tất cả các thiết bị khác, bao gồm cả thiết bị COM và PRN).

DOS sử dụng các tập tin thiết bị để truy cập máy in và cổng. Hầu hết các phiên bản Windows cũng có hỗ trợ điều này, nó có thể gây nhầm lẫn khi cố gắng tạo các tập tin và thư mục có tên tương tự vì chúng không thể có những tên này. Các phiên bản 2.x của MS-DOS cung cấp tham số `[[AVAILDEV]]` trong CONFIG.SYS, nếu được đặt thành `FALSE` thì các tên đặc biệt này chỉ hoạt động nếu có tiền tố là `\DEV\`, do đó hệ thống cho phép các tệp thông thường được tạo với các tên này

GEMDOS, một phần giống DOS của Atari TOS, hỗ trợ các tên thiết bị tương tự như DOS nhưng không giống hoàn toàn như DOS, nó yêu cầu ký tự ":" ở cuối (đây là tùy chọn trên DOS) để xác định chúng là thiết bị khác với tên tập tin thông thường (do đó "CON:" sẽ hoạt động trên cả DOS và TOS, nhưng "CON" sẽ chỉ là tên của một tập tin thông thường trên TOS, nhưng trên DOS nó là tập tin driver thiết bị). Trong MiNT và MagiC, chế độ xem hệ thống tập tin hợp nhất tương tự UNIX đặc biệt được sử dụng thông qua ký tự ổ đĩa "U:", cụ thể là trong "U:\DEV".

Sử dụng shell chuyển hướng và các đường hầm, dữ liệu có thể được gửi đến hoặc nhận từ một thiết bị. Ví dụ: nhập nội dung sau sẽ gửi tệp `c:\data.txt` đến máy in:

```
TYPE c:\data.txt > PRN
```


PIPE, MAILSLOT và MUP là các thiết bị Windows tiêu chuẩn khác.

## IOCS
Hệ điều hành 8-bit của máy tính bỏ tủi Sharp như PC-E500, PC-E500S... sử dụng trình thông dịch BASIC, một hệ thống kiểm soát tập tin 12-bit FAT của DOS 2 (FCS) và Hệ thống kiểm soát đầu vào/đầu ra (IOCS) của BIOS triển khai một số driver character device và block device tiêu chuẩn cũng như các tập tin đặc biệt bao gồm STDO:/SCRN: (hiển thị), STDI:/KYBD: (bàn phím), COM: (Serial I/O), STDL:/PRN: (trình in), CAS: (băng cassette), E:/F:/G: (tập tin bộ nhớ), S1:/S2:/S3: (thẻ nhớ), X:/Y: (đĩa mềm), SYSTM: (hệ thống) và NIL: (chức năng).

## Tích hợp

## Xem thêm

* devfsd
* sysfs
* Kích thước khối
* Chặn
* Đệm
* Hệ thống tập tin
* Phần cứng trừu tượng
* Mạng khu vực lưu trữ
* Không gian người dùng
* Các loại tệp Unix
* udev

## Tham khảo

## Đọc thêm
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
*