Lệnh mknod - Tạo tập tin thiết bị trong Linux

Trên Linux, mọi thứ đều là một tệp, ngay cả các thiết bị vật lý như ổ đĩa, đĩa CD/DVD và đĩa mềm cũng được đại diện bằng các tệp. Tuy nhiên, các tệp này không phải là các tệp dữ liệu thông thường. Thay vào đó, các tệp đặc biệt này được gọi là tệp thiết bị và chúng có thể tạo hoặc nhận dữ liệu.

Thường, tất cả các tệp đặc biệt đều có trong thư mục /dev. Một số ví dụ phổ biến về các tệp đặc biệt là /dev/null/dev/zero/dev/full, và /dev/sr0.

Các tệp đặc biệt có thể thuộc loại ký tự hoặc khối. Như tên gọi, các tệp ký tự xử lý một ký tự mỗi lần trong khi các tệp khối xử lý nhiều ký tự cùng một lúc.

Trong hướng dẫn nâng cao này, chúng ta sẽ thảo luận về cách tạo một tệp thiết bị bằng lệnh mknod. Sau khi làm theo hướng dẫn này, người dùng Linux sẽ có thể làm việc với các loại tệp thiết bị khác nhau một cách tự tin.

Cú pháp Lệnh mknod

Cú pháp của lệnh mknod khá khác so với các lệnh Linux khác. Sự khác biệt chính là chúng ta phải chỉ định số major và minor khi tạo các tệp thiết bị ký tự và khối:

$ mknod [OPTIONS]   [MAJOR] [MINOR] ...

Trong cú pháp trên, các dấu ngoặc vuông ([]) đại diện cho các đối số tùy chọn trong khi các dấu ngoặc nhọn () đại diện cho các đối số bắt buộc.

Trong Linux, số major được sử dụng để chỉ định trình điều khiển thiết bị cần sử dụng. Số này được gán khi đăng ký trình điều khiển thiết bị.

Theo cùng một cách, số minor được sử dụng để chỉ định thiết bị thực tế. Chúng ta có thể tìm thấy các số major và minor có sẵn trong tài liệu của kernel Linux.

1. Tạo Ống không đặt tên trên Linux

Trên Linux, chúng ta sử dụng ống để cho phép giao tiếp giữa các tiến trình. Trong Shell, ống được biểu thị bằng dấu thẳng đứng (|). Nó đọc đầu ra của quá trình trước đó và gửi nó làm đầu vào cho quá trình tiếp theo.

Hãy hiểu điều này qua một ví dụ đơn giản:

$ echo "tecmint.com" | wc -c

Trong ví dụ này, chúng tôi sử dụng ống để đọc đầu ra của lệnh echo và gửi nó làm đầu vào cho lệnh wc để xử lý tiếp.

Ở đây, chúng tôi đã sử dụng dấu thẳng đứng (|) để tạo một ống. Tuy nhiên, điều này tạo ra một ống không được đặt tên và phạm vi của nó chỉ giới hạn trong lệnh hiện tại. Trong ví dụ tiếp theo, chúng ta sẽ xem cách tạo một ống có tên.

2. Tạo một Ống có tên trên Linux

Chúng ta có thể sử dụng lệnh mknod để tạo một ống có tên. Ống có tên cư trú trên hệ thống tệp như bất kỳ tệp thông thường nào khác. Tuy nhiên, mục đích chính của nó là cho phép giao tiếp giữa các tiến trình không liên quan với nhau.

Đầu tiên, hãy xác định loại thiết bị là p để tạo ống có tên:

$ mknod /tmp/named-pipe p
$ ls -l /tmp/named-pipe 

Bây giờ, hãy thử đọc tệp:

$ cat /tmp/named-pipe

Ở đây, chúng ta có thể thấy rằng lệnh cat đang chờ vô tận:

Đọc Tệp Ống Có Tên

Tiếp theo, hãy mở một cửa sổ terminal khác và ghi một số dữ liệu vào tệp /tmp/named-pipe:

$ echo "tecmint.com" > /tmp/named-pipe

Cuối cùng, hãy chuyển đến cửa sổ terminal đầu tiên để xem kết quả:

Xem Tệp Ống Có Tên

Ở đây, chúng ta có thể thấy rằng các lệnh echo và cat có thể giao tiếp với nhau bằng ống có tên.

3. Tạo Tệp Thiết Bị Ký Tự trên Linux

Theo cùng một cách, chúng ta có thể sử dụng loại thiết bị là c để tạo một thiết bị ký tự. Tuy nhiên, chúng ta phải sử dụng số major và minor khi tạo thiết bị ký tự.

Hãy sử dụng lệnh ls để tìm số major và minor của thiết bị /dev/full:

$ ls -l /dev/full
Tìm Số Major và Minor của Tệp

Trong đầu ra trên, cặp số phân tách bằng dấu phẩy tức là 17 đại diện cho số major và minor tương ứng.

Trên Linux, thiết bị /dev/full luôn trả về lỗi Không còn không gian trên thiết bị. Để hiểu điều này, hãy ghi một số dữ liệu vào thiết bị này:

$ echo "tecmint.com" > /dev/full
Ghi Dữ liệu vào Tệp Thiết Bị

Bây giờ, hãy sử dụng lệnh mknod để tạo một thiết bị mới hoạt động giống như thiết bị /dev/full:

$ sudo mknod /tmp/full-device c 1 7

Tiếp theo, hãy thay đổi quyền truy cập tệp:

$ sudo chmod 666 /tmp/full-device 
$ ls -l /tmp/full-device

Cuối cùng, hãy ghi một số dữ liệu vào thiết bị đã tạo:

$ echo "tecmint" > /tmp/full-device
Tạo Tệp Thiết Bị Mới

Chú ý quan trọng rằng, thiết bị ký tự mới tạo ra hoạt động giống như thiết bị /dev/full bởi vì có cùng số major và minor.

4. Tạo Tệp Thiết Bị Khối trên Linux

Ngoài ra, chúng ta có thể chỉ định loại thiết bị là b để tạo một thiết bị khối. Để tạo một thiết bị khối, chúng ta phải sử dụng số major và minor.

Trên Linux, /dev/sr0 đại diện cho thiết bị CD/DVD ROM. Bây giờ, hãy tạo một thiết bị khối mới hoạt động giống như thiết bị /dev/sr0.

Đầu tiên, hãy tìm số major và minor của /dev/sr0:

$ ls -l /dev/sr0
Kiểm tra số Major và Minor của Tệp Thiết Bị

Trong đầu ra trên, chúng ta có thể thấy số major và minor của nó là 11 và 0 tương ứng.

Bây giờ, hãy tạo một thiết bị khối mới với cùng số major và minor:

$ sudo mknod /tmp/dvd-rom b 11 0
$ ls -l /tmp/dvd-rom 
Tạo Thiết Bị Khối Mới

Tiếp theo, hãy gắn ảnh ISO từ CD/DVD ROM vào thư mục /mnt và xác minh rằng thao tác gắn thành công:

$ sudo mount /tmp/dvd-rom /mnt/
$ ls -1 /mnt/
Gắn Thiết Bị Khối Mới

Trong ví dụ này, chúng ta có thể thấy rằng thiết bị khối /tmp/dvd-rom có thể truy cập vào ảnh ISO từ CD/DVD ROM.

5. Tạo Một Tệp Thiết Bị Với Quyền Truy Cập

Đôi khi, chúng ta cần sửa đổi quyền truy cập của tệp thiết bị trước khi sử dụng nó. Trong những trường hợp như vậy, chúng ta phải sử dụng lệnh chmod. Tuy nhiên, chúng ta có thể đạt được cùng kết quả bằng cách sử dụng lệnh mknod thay vì sử dụng hai lệnh riêng biệt.

Để hiểu điều này, hãy sử dụng tùy chọn -m để đặt quyền truy cập khi tạo một ống có tên:

$ sudo mknod -m 444 /tmp/pipe-with-permissions p

Bây giờ, hãy xác minh rằng quyền truy cập đã được đặt đúng:

$ ls -l /tmp/pipe-with-permissions
Tạo Tệp Thiết Bị Với Quyền Truy Cập

Trong ví dụ này, chúng ta đã sử dụng tùy chọn -m với ống có tên. Tuy nhiên, chúng ta cũng có thể sử dụng nó cho các thiết bị ký tự và khối.

Bạn có biết ví dụ tốt khác của lệnh mknod trong Linux không? Hãy cho chúng tôi biết ý kiến của bạn trong phần bình luận dưới đây.