How Linux Works Chương 3 · Devices

Chương 3 · Thiết bị Chapter 3 · Devices

Nhân biến phần cứng thành tập tin — và đó là lý do bạn điều khiển được nó Trong Linux, cái ổ cứng cũng chỉ là một “tập tin” The kernel turns hardware into files — and that is why you can drive it

Ward mở chương này như một chuyến tham quan hạ tầng thiết bị do nhân cung cấp trong một hệ thống Linux đang chạy.1 Điểm khởi hành là một thiết kế rất cũ của Unix: nhân trình phần lớn giao diện nhập/xuất của thiết bị ra cho tiến trình người dùng dưới dạng tập tin.1 Nhờ vậy, thao tác với hầu hết thiết bị trên một hệ Unix trở nên dễ dàng: không cần là lập trình viên, bạn vẫn dùng được thiết bị bằng những chương trình thông thường như cat.1

Máy tính có nhiều đồ: ổ cứng, bàn phím, loa, USB. Linux có một mẹo rất hay: nó coi mỗi món đồ như một tập tin nằm trong thư mục /dev. Muốn nói chuyện với món đồ nào, bạn “ghi” vào tập tin của nó hoặc “đọc” từ nó — y như đọc ghi một tệp văn bản. Nhớ nhé: trong Linux, gần như mọi thứ đều là một tập tin.

Ward opens this chapter as a basic tour of the kernel-provided device infrastructure in a functioning Linux system.1 The starting point is a very old Unix design: the kernel presents most device I/O interfaces to user processes as files.1 That is what makes most devices on a Unix system easy to manipulate: you don't have to be a programmer to use a device, since some are also accessible to standard programs such as cat.1

Ông nói thẳng hai giới hạn ngay từ đầu, và đó là điều tách chương này khỏi khẩu hiệu “mọi thứ đều là tập tin”. Thứ nhất, có giới hạn cho những gì bạn làm được qua giao diện tập tin, nên không phải thiết bị nào hay khả năng nào của thiết bị cũng với tới được bằng nhập/xuất tệp tiêu chuẩn.1 Thứ hai, không phải thiết bị nào cũng có tập tin thiết bị: giao diện khối và ký tự không phù hợp trong mọi trường hợp — giao diện mạng là ví dụ, về lý thuyết có thể biểu diễn bằng một thiết bị ký tự nhưng sẽ rất khó dùng, nên nhân cung cấp giao diện nhập/xuất khác.1

Luận đề của chương: để làm chủ thiết bị trên Linux, bạn cần đọc được hai cây song song — /dev để dùng thiết bị, và /sys để xem và quản lý nó — cộng với hiểu biết về udev, cơ chế đưa quyền quản lý tập tin thiết bị ra khỏi nhân và giao cho không gian người dùng.1

Ý chính: có hai thư mục quan trọng. /dev là chỗ bạn dùng thiết bị. /sys là chỗ bạn xem thông tin về thiết bị. Và có một “người trực” tên là udev lo việc tạo tên cho thiết bị mới khi bạn cắm vào. Nhớ nhé: /dev để dùng, /sys để xem, udev để sắp xếp.

The chapter's thesis: to master devices on Linux you must read two parallel trees — /dev to use a device and /sys to view and manage it — plus udev, the mechanism that moves device-file management out of the kernel and into user space.1

Cụm khái niệm 01 Concept cluster 01

Tập tin thiết bị: bốn ký tự đầu dòng và hai con số Nhìn một dòng ls -l là biết đó là đồ gì Device files: four leading letters and two numbers

Tập tin thiết bị — đôi khi gọi là device node (nút thiết bị) — nằm trong thư mục /dev; chạy ls /dev sẽ thấy khá nhiều tệp ở đó.1 Linux dùng đúng thiết kế tập tin thiết bị như các nhánh Unix khác.1 Để nhận diện một thiết bị và xem quyền của nó, dùng ls -l và nhìn ký tự đầu tiên của chế độ tệp: nếu là b, c, p hoặc s thì tệp đó là một thiết bị.1

Trong thư mục /dev có rất nhiều tệp lạ. Gõ ls -l rồi nhìn chữ cái đầu tiên của mỗi dòng là bạn biết đó là loại gì: b, c, p hay s. Nhớ nhé: chữ cái đầu dòng chính là “nhãn dán” của thiết bị.

Device files — sometimes called device nodes — live in the /dev directory; running ls /dev reveals quite a few files there.1 Linux uses the same design for device files as other Unix flavors do.1 To identify a device and view its permissions, use ls -l and look at the first character of the file's mode: if it is b, c, p or s, the file is a device.1

Định nghĩa. Một tập tin thiết bị không chứa dữ liệu. Nó là một điểm vào: khi bạn ghi vào nó, nhân bỏ qua các thao tác tệp thông thường và chuyển dữ liệu cho một trình điều khiển thiết bị.1 Ward minh hoạ bằng echo blah blah > /dev/null: trông như chuyển hướng đầu ra vào một tệp, nhưng vì đích là một thiết bị, nhân chỉ đơn giản nhận dữ liệu rồi vứt đi.12

Nói đơn giản. Tập tin thiết bị là cái “cửa”, không phải cái “hộp”. Bạn đẩy chữ qua cửa /dev/null thì chữ biến mất luôn — đó là thùng rác của hệ thống. Nhớ nhé: nó là cửa dẫn tới đồ thật, không phải nơi chứa đồ.

Definition. A device file holds no data. It is an entry point: when you write to it, the kernel bypasses its usual file operations and hands the data to a device driver.1 Ward's illustration is echo blah blah > /dev/null: it looks like redirecting output into a file, but because the target is a device, the kernel simply accepts the input and throws it away.12

brw-rw---- root disk 8, 1 sda1
crw-rw-rw- root root 1, 3 null
prw-r--r-- root root   0 fdata
srw-rw-rw- root root   0 log

b = khối (đĩa)
c = ký tự (dòng chữ)
p = ống dẫn
s = ổ cắm

brw-rw---- root disk 8, 1 sda1
crw-rw-rw- root root 1, 3 null
prw-r--r-- root root   0 fdata
srw-rw-rw- root root   0 log

  1. block device

    Thiết bị khối — dữ liệu theo từng khúc cố định Thiết bị khối — như một cuốn sổ có đánh số trang Block device — data in fixed chunks

    Chương trình truy cập dữ liệu từ thiết bị khối theo từng khúc có kích thước cố định. sda1 trong ví dụ của Ward là một thiết bị đĩa, tức một loại thiết bị khối; đĩa dễ chia thành các khối dữ liệu.1 Vì tổng kích thước của thiết bị khối là cố định và dễ đánh chỉ mục, tiến trình có thể truy cập ngẫu nhiên rất nhanh tới bất kỳ khối nào, với sự trợ giúp của nhân.1

    Thiết bị khối giống một cuốn sổ đã đánh số trang sẵn. Bạn muốn đọc trang 57 thì lật thẳng tới trang 57, không cần đọc 56 trang trước đó. Ổ cứng và USB thuộc loại này. Nhớ nhé: khối = có đánh số trang, nhảy tới đâu cũng được.

    Programs access data from a block device in fixed chunks. The sda1 in Ward's example is a disk device, a type of block device; disks split easily into blocks of data.1 Because a block device's total size is fixed and easy to index, processes get quick random access to any block, with the kernel's help.1

    Bạn gặp nó ở đâuWhere you meet it Mọi phân vùng đĩa bạn gắn kết đều là thiết bị khối: /dev/sda1, /dev/nvme0n1p2, /dev/dm-0. Mỗi lần bạn cắm USB rồi mở nó ra xem tệp. Every disk partition you mount is a block device: /dev/sda1, /dev/nvme0n1p2, /dev/dm-0.

    Hai con số trước ngày tháng

    Trong danh sách ls -l của thiết bị khối và ký tự, các số đứng trước ngày tháng là số major và số minor mà nhân dùng để nhận diện thiết bị.1 Các thiết bị tương tự nhau thường có cùng số major, ví dụ sda3 và sdb1 — cả hai đều là phân vùng ổ cứng.1 Bảng chính thức của nhân xác nhận: đĩa SCSI mang major 8, còn các thiết bị bộ nhớ như /dev/null mang major 1 với minor 3.3

    Quy tắc minor của đĩa sd

    Trang man sd(4) ghi rõ công thức: đĩa SCSI có major 8 và minor dạng (16 × số_ổ) + số_phân_vùng; phân vùng 0 là toàn bộ ổ, 1–4 là các phân vùng “primary” kiểu DOS, 5–8 là các phân vùng “extended”.4 Vì vậy /dev/sda là 8:0 còn /dev/sdb3 là 8:19.4 Con số 8:1 trong ví dụ sda1 của Ward khớp chính xác với quy tắc này.14

  2. character device

    Thiết bị ký tự — dòng chảy không quay lại được Thiết bị ký tự — như một vòi nước Character device — a stream you cannot rewind

    Thiết bị ký tự làm việc với dòng dữ liệu. Bạn chỉ có thể đọc ký tự từ nó hoặc ghi ký tự vào nó, như /dev/null đã minh hoạ.1 Thiết bị ký tự không có kích thước; khi bạn đọc hoặc ghi, nhân thường thực hiện ngay một thao tác đọc hoặc ghi lên nó.1 Ward nhấn một điểm dễ bỏ qua: trong lúc tương tác với thiết bị ký tự, nhân không thể quay lại và xem lại dòng dữ liệu sau khi đã chuyển dữ liệu cho thiết bị hoặc tiến trình.1

    Thiết bị ký tự giống một vòi nước: nước chảy ra là chảy luôn, không hứng lại được. Máy in nối thẳng vào máy tính là kiểu này. Nhớ nhé: ký tự = chảy một chiều, không tua lại.

    Character devices work with data streams. You can only read characters from or write characters to them, as /dev/null demonstrated.1 Character devices have no size; when you read from or write to one, the kernel usually performs a read or write operation on it right away.1 Ward stresses a point that is easy to miss: during character device interaction, the kernel cannot back up and reexamine the data stream after it has passed data to a device or process.1

    Bạn gặp nó ở đâuWhere you meet it Máy in gắn trực tiếp vào máy tính được biểu diễn bằng thiết bị ký tự; /dev/null, /dev/zero và các terminal cũng vậy.1 Cửa sổ dòng lệnh bạn đang gõ cũng là một thiết bị ký tự đấy. Printers directly attached to your computer are represented by character devices; so are /dev/null, /dev/zero and terminals.1

    Vì sao “không tua lại được” lại quan trọng

    Đặc tính một chiều này quyết định điều bạn làm được. Với thiết bị khối, dd có thể bỏ qua phần đầu rồi xử lý một khúc ở giữa tệp (xem mục skip).1 Với thiết bị ký tự, khái niệm “ở giữa” không tồn tại — chỉ có “tiếp theo”.

    Thiết bị rỗng và nguồn byte 0

    Trang man null(4) mô tả cặp đôi mà chương này dùng liên tục: dữ liệu ghi vào /dev/null bị loại bỏ, còn đọc từ /dev/zero cho về một dòng byte 0 vô tận.2 Bảng major/minor của nhân gán cho chúng major 1, minor 3 và 5.3

  3. pipe device · socket device

    Ống dẫn và ổ cắm — đầu kia là một tiến trình Ống và ổ cắm — hai chương trình nói chuyện với nhau Pipe and socket — a process at the other end

    Ward xếp thêm hai loại nút nữa vào cùng bảng. Ống dẫn có tên (named pipe, ký tự p) giống thiết bị ký tự, chỉ khác là ở đầu kia của dòng nhập/xuất có một tiến trình khác thay vì một trình điều khiển của nhân.1 Ổ cắm (socket, ký tự s) là giao diện chuyên dụng, thường dùng cho giao tiếp liên tiến trình, và thường nằm ngoài thư mục /dev; các tệp socket này biểu diễn Unix domain socket.1

    Ống dẫn giống một cái ống nối hai chương trình: một bên đổ vào, bên kia hứng ra. Ổ cắm cũng vậy nhưng “xịn” hơn, và thường không nằm trong /dev. Nhớ nhé: p và s là để hai chương trình nói chuyện, không phải để nói với phần cứng.

    Ward folds two more node types into the same table. Named pipes (the p character) are like character devices, except that there is another process at the other end of the I/O stream instead of a kernel driver.1 Sockets (the s character) are special-purpose interfaces frequently used for interprocess communication, and are often found outside the /dev directory; socket files represent Unix domain sockets.1

    Bạn gặp nó ở đâuWhere you meet it Trong ví dụ ls -l của Ward, fdata là một ống dẫn có tên và log là một ổ cắm — cả hai đều hiện kích thước 0.1 Nhiều dịch vụ trong máy nói chuyện với nhau qua các “ổ cắm” như vậy. In Ward's ls -l sample, fdata is a named pipe and log is a socket — both showing size 0.1
  4. not every device has a file

    Ngoại lệ — giao diện mạng không có tập tin thiết bị Có món đồ không có tập tin The exception — network interfaces have no device file

    Đây là chú thích quan trọng nhất của mục 3.1. Không phải thiết bị nào cũng có tập tin thiết bị, vì giao diện nhập/xuất khối và ký tự không phù hợp trong mọi trường hợp.1 Giao diện mạng là ví dụ điển hình: về lý thuyết có thể tương tác với nó qua một thiết bị ký tự duy nhất, nhưng vì làm vậy sẽ rất khó, nhân cung cấp những giao diện nhập/xuất khác.1

    Không phải món đồ nào cũng hợp với kiểu “tập tin”. Card mạng chẳng hạn — bạn sẽ không tìm thấy /dev/eth0 đâu. Nhớ nhé: “mọi thứ là tập tin” đúng phần lớn, nhưng không phải tất cả.

    This is the most important note in section 3.1. Not all devices have device files, because the block and character I/O interfaces are not appropriate in all cases.1 Network interfaces are the standard example: it is theoretically possible to interact with one through a single character device, but because that would be difficult, the kernel offers other I/O interfaces.1

    Bạn gặp nó ở đâuWhere you meet it Lần đầu bạn tìm /dev/eth0 và không thấy gì — đó không phải lỗi hệ thống, đó là thiết kế. Tìm hoài không thấy card mạng trong /dev? Bình thường thôi. The first time you look for /dev/eth0 and find nothing — that isn't a broken system, it's the design.

Cụm khái niệm 02 Concept cluster 02

sysfs trả lời “thiết bị này là gì”, còn dd là con dao mổ Một chỗ để tra thông tin, một công cụ để sao chép sysfs answers "what is this device", and dd is the scalpel

Thư mục /dev truyền thống của Unix là cách tiện lợi để tiến trình người dùng tham chiếu và giao tiếp với thiết bị, nhưng Ward gọi thẳng nó là một lược đồ rất đơn giản.1 Để cung cấp một cái nhìn thống nhất về các thiết bị đang gắn, dựa trên thuộc tính phần cứng thật của chúng, nhân Linux đưa ra giao diện sysfs qua một hệ thống tệp và thư mục; đường dẫn gốc cho thiết bị là /sys/devices.15

Thư mục /dev giống cái nắm cửa: bạn mở ra dùng được. Còn /sys giống tấm biển dán trên cửa: ghi rõ phòng này là phòng gì, của ai, nối với đâu. Nhớ nhé: /dev để mở cửa, /sys để đọc biển.

The traditional Unix /dev directory is a convenient way for user processes to reference and interface with devices, but Ward calls it plainly a very simplistic scheme.1 To provide a uniform view of attached devices based on their actual hardware attributes, the Linux kernel offers the sysfs interface as a system of files and directories; the base path for devices is /sys/devices.15

Định nghĩa. sysfs là một hệ thống tệp ảo phản chiếu mô hình thiết bị của nhân ra không gian người dùng: mỗi đối tượng trong nhân là một thư mục, mỗi thuộc tính là một tệp đọc/ghi được.56 Ward tóm gọn sự khác biệt bằng một câu: tệp trong /dev cho tiến trình người dùng dùng thiết bị, còn đường dẫn /sys/devices dùng để xem thông tin và quản lý thiết bị — nên không thể so sánh hai đường dẫn với nhau, vì chúng phục vụ mục đích khác nhau.1

Nói đơn giản. /sys là một “hồ sơ” do nhân viết ra, kể chi tiết từng món đồ đang cắm trong máy: nó nối vào đâu, to bao nhiêu, có tháo ra được không. Nhớ nhé: /sys là hồ sơ lý lịch của thiết bị.

Definition. sysfs is a virtual filesystem that exports the kernel's device model to user space: each kernel object is a directory, each attribute a readable/writable file.56 Ward sums the difference up in one sentence: the /dev file enables user processes to use the device, whereas the /sys/devices path is used to view information and manage it — so the two paths cannot really be compared, because they have different purposes.1

/dev/sda
  → dùng thiết bị

/sys/devices/pci0000:00/
  0000:00:17.0/ata3/host0/
  target0:0:0/0:0:0:0/block/sda
  → xem & quản lý

/dev/sda = nắm cửa
/sys/... = tấm biển
cat dev → 8:0

/dev/sda
  → use the device

/sys/devices/pci0000:00/
  0000:00:17.0/ata3/host0/
  target0:0:0/0:0:0:0/block/sda
  → view & manage

  1. sysfs device path

    Đường dẫn sysfs — dài, nhưng nói đúng sự thật Một địa chỉ dài kể cả đường đi The sysfs device path — long, but truthful

    Ward lấy ví dụ một ổ cứng SATA ở /dev/sda, trong sysfs có thể mang đường dẫn /sys/devices/pci0000:00/0000:00:17.0/ata3/host0/target0:0:0/0:0:0:0/block/sda.1 Đường dẫn này dài hơn hẳn tên /dev/sda, và bản thân nó là một thư mục.1 Liệt kê nội dung sẽ thấy các tệp như dev, size, removable, queue, uevent, cùng các thư mục con cho từng phân vùng sda1, sda2, sda5.1

    Tên /dev/sda ngắn nhưng chẳng kể gì. Còn địa chỉ trong /sys thì dài loằng ngoằng — vì nó kể luôn cả đường đi: qua khe cắm nào, qua bộ điều khiển nào, mới tới cái đĩa. Nhớ nhé: địa chỉ càng dài thì càng kể rõ nguồn gốc.

    Ward's example is a SATA hard disk at /dev/sda, which in sysfs might carry the path /sys/devices/pci0000:00/0000:00:17.0/ata3/host0/target0:0:0/0:0:0:0/block/sda.1 That is far longer than the /dev/sda filename, and it is itself a directory.1 Listing it shows files such as dev, size, removable, queue and uevent, plus subdirectories for each partition — sda1, sda2, sda5.1

    Bạn gặp nó ở đâuWhere you meet it Chạy cat dev trong thư mục đó sẽ in ra 8:0 — đúng bằng số major và minor của /dev/sda. Đó là sợi chỉ nối hai cây lại với nhau.1 Một tệp tên dev trong đó ghi 8:0 — chính là mã số của cái đĩa. Running cat dev in that directory prints 8:0 — exactly the major and minor numbers of /dev/sda. That is the thread tying the two trees together.1

    Các lối tắt trong /sys

    Ward cảnh báo về một cái bẫy nhỏ: trong /sys có vài lối tắt — chẳng hạn /sys/block đáng lẽ chứa mọi thiết bị khối của hệ thống, nhưng chúng chỉ là liên kết tượng trưng; phải chạy ls -l /sys/block mới lộ ra đường dẫn sysfs thật.1

    Đọc cho máy, không phải cho người

    Ông nói rõ các tệp và thư mục ở đây chủ yếu dành cho chương trình đọc, không phải cho con người; bạn chỉ nên nhìn vài ví dụ như tệp dev để hình dung chúng chứa gì.1 Tài liệu nhân mô tả đúng nguyên tắc đó: sysfs là nơi xuất mô hình thiết bị, mỗi thuộc tính nên chứa một giá trị duy nhất dạng văn bản.6

  2. udevadm info

    Cách bắc cầu từ /dev sang /sys Một câu lệnh tra ra tất cả Bridging from /dev to /sys

    Ward thừa nhận việc tìm vị trí sysfs của một thiết bị trong /dev có thể khó, và đưa ra một lệnh duy nhất để hiện ra đường dẫn cùng nhiều thuộc tính thú vị khác: udevadm info --query=all --name=/dev/sda.17

    Không biết cái đĩa của mình nằm ở đâu trong /sys? Có một câu lệnh hỏi hộ bạn, và nó trả về cả một bản khai lý lịch. Nhớ nhé: không biết thì hỏi udevadm.

    Ward admits it can be difficult to find the sysfs location of a device in /dev, and gives one command that shows the path and several other interesting attributes: udevadm info --query=all --name=/dev/sda.17

    Bạn gặp nó ở đâuWhere you meet it Đây là lệnh bạn sẽ gõ mỗi khi cần biết “cái /dev/sdb này thực ra cắm ở đâu, hãng nào, số sê-ri bao nhiêu”. Khi bạn muốn biết cái USB vừa cắm là cái nào trong đống. This is the command you reach for whenever you need to know "what is this /dev/sdb, really — where is it plugged, whose is it, what serial number".
  3. dd

    dd — đọc một luồng, ghi một luồng, và cắt được khúc giữa dd — cái xẻng xúc dữ liệu dd — read a stream, write a stream, slice the middle

    Ward mô tả dd là chương trình cực kỳ hữu ích khi làm việc với thiết bị khối và ký tự. Chức năng duy nhất của nó: đọc từ một tệp/luồng đầu vào và ghi ra một tệp/luồng đầu ra, có thể chuyển đổi mã hoá trên đường đi.1 Một đặc tính đặc biệt hữu ích với thiết bị khối là bạn có thể xử lý một khúc dữ liệu ở giữa tệp, bỏ qua phần trước và sau nó.18

    dd là cái xẻng: xúc dữ liệu từ chỗ này đổ sang chỗ kia, từng xẻng một. Hay ở chỗ nó xúc được đúng khúc giữa mà không đụng vào phần trước sau. Nhớ nhé: dd xúc dữ liệu theo từng xẻng, và xúc được khúc giữa.

    Ward describes dd as extremely useful when working with block and character devices. Its sole function: read from an input file or stream and write to an output file or stream, possibly doing some encoding conversion on the way.1 One particularly useful feature with block devices is that you can process a chunk of data in the middle of a file, ignoring what comes before or after.18

    Bạn gặp nó ở đâuWhere you meet it Ví dụ của Ward: dd if=/dev/zero of=new_file bs=1024 count=1 chép đúng một khối 1.024 byte từ /dev/zero — một dòng byte 0 liên tục — vào new_file.1 Tạo một tệp rỗng đúng 1.024 byte để thử nghiệm. Ward's example: dd if=/dev/zero of=new_file bs=1024 count=1 copies exactly one 1,024-byte block from /dev/zero — a continuous stream of zero bytes — into new_file.1

    Cú pháp kiểu JCL

    Ward giải thích vì sao dd trông lạ so với mọi lệnh Unix khác: định dạng tuỳ chọn của nó dựa trên lối JCL (Job Control Language) cũ của IBM. Thay vì dùng dấu gạch ngang - để báo hiệu một tuỳ chọn, bạn gọi tên tuỳ chọn rồi đặt giá trị bằng dấu =.18

    Sáu tuỳ chọn Ward liệt kê

    if= tệp đầu vào, mặc định là đầu vào chuẩn; of= tệp đầu ra, mặc định là đầu ra chuẩn; bs= kích thước khối, với b và k viết tắt cho 512 và 1.024 byte, nên bs=1024 có thể viết bs=1k; ibs=/obs= khi đầu vào và đầu ra cần kích thước khối khác nhau; count= tổng số khối cần chép; skip= bỏ qua num khối đầu của đầu vào.18

    Cảnh báo của tác giả

    Ward đặt một WARNING hiếm hoi ở đây: dd rất mạnh, nên hãy chắc chắn bạn biết mình đang làm gì. Một sai sót cẩu thả rất dễ làm hỏng tệp và dữ liệu trên thiết bị; nếu chưa chắc, hãy ghi đầu ra ra một tệp mới.1 Ông cũng nêu lý do kỹ thuật của count: với một tệp khổng lồ, hoặc một thiết bị cấp dòng dữ liệu vô tận như /dev/zero, bạn cần dd dừng ở một điểm cố định, nếu không sẽ phí rất nhiều dung lượng đĩa, thời gian CPU, hoặc cả hai.1

Cụm khái niệm 03 Concept cluster 03

Bảng tên thiết bị: đọc được /dev như đọc bản đồ Mỗi loại đồ có một kiểu tên riêng The device name summary: reading /dev like a map

Ward liệt kê năm cách tìm tên một thiết bị: hỏi udevd bằng udevadm; tìm trong /sys; đoán từ đầu ra của journalctl -k (in ra thông điệp nhân) hoặc nhật ký hệ thống của nhân; với đĩa đã hiện diện, xem đầu ra của mount; và chạy cat /proc/devices để thấy các thiết bị khối và ký tự mà hệ thống đang có trình điều khiển.1 Trong /proc/devices, mỗi dòng gồm một con số và một cái tên — con số chính là số major.13

Có năm cách để tìm tên một món đồ. Cách chắc nhất là hỏi udev. Các cách còn lại giống như đoán: xem nhật ký của máy, xem danh sách đĩa đang gắn, hoặc mở bảng mã số ra dò. Nhớ nhé: hỏi trước, đoán sau.

Ward lists five ways to find a device's name: query udevd with udevadm; look in /sys; guess from the output of journalctl -k (which prints kernel messages) or the kernel system log; for a disk already visible to the system, check the output of mount; and run cat /proc/devices to see the block and character devices for which your system currently has drivers.1 In /proc/devices, each line is a number and a name — the number being the major number.13

Cảnh báo đi kèm rất đáng ghi nhớ: nếu bạn rơi vào tình huống không có udev, hãy thử các cách khác, nhưng nhớ rằng nhân có thể không có tập tin thiết bị nào cho phần cứng của bạn cả.1 Nghĩa là sự vắng mặt của một tệp trong /dev không chứng minh thiết bị không tồn tại — nó chỉ chứng minh rằng chưa ai tạo nút cho nó.

Định nghĩa. Quy ước đặt tên trong /dev không phải ngẫu nhiên: tiền tố cho biết lớp trình điều khiển đang phục vụ thiết bị, chữ cái cho biết thứ tự phát hiện, và con số cho biết phân vùng hoặc chỉ số thứ tự.14

Nói đơn giản. Tên thiết bị đọc như biển số xe: mấy chữ đầu cho biết loại xe, chữ tiếp theo cho biết chiếc thứ mấy, số cuối cho biết khoang nào. Nhớ nhé: sda1 = đĩa loại sd, chiếc a, phân vùng 1.

Definition. The naming conventions in /dev are not arbitrary: the prefix tells you which driver class serves the device, the letter records the order of discovery, and the number gives the partition or an ordinal index.14

/dev/sd*   → đĩa SCSI (kể cả SATA, USB)
/dev/nvme* → SSD giao diện NVMe
/dev/sr*   → ổ quang, chỉ đọc
/dev/hd*   → đĩa PATA (cũ)
/dev/dm-*  → device mapper / LVM
/dev/tty*  → terminal
/dev/lp*   → cổng song song

sd = đĩa
nvme = SSD nhanh
sr = ổ đĩa quang
tty = màn hình gõ lệnh
lp = máy in cổng cũ

/dev/sd*   → SCSI disks (incl. SATA, USB)
/dev/nvme* → NVMe solid-state storage
/dev/sr*   → optical drives, read only
/dev/hd*   → PATA disks (older)
/dev/dm-*  → device mapper / LVM
/dev/tty*  → terminals
/dev/lp*   → parallel ports

  1. /dev/sd* · SCSI disk

    Đĩa cứng /dev/sd* — chữ “sd” là một di sản Ổ cứng tên là sda, sdb… Hard disks /dev/sd* — "sd" is an inheritance

    Phần lớn đĩa cứng gắn vào hệ Linux hiện nay tương ứng với tên thiết bị có tiền tố sd: /dev/sda, /dev/sdb… Những thiết bị này đại diện cho toàn bộ đĩa; nhân tạo các tệp riêng như /dev/sda1, /dev/sda2 cho các phân vùng.14 Phần sd viết tắt cho SCSI disk. Small Computer System Interface (SCSI) ban đầu được phát triển như một chuẩn phần cứng và giao thức để các thiết bị như đĩa và ngoại vi nói chuyện với nhau.1

    Ổ cứng trong Linux thường tên là sda, cái thứ hai là sdb, cứ thế. Phân vùng thì thêm số: sda1, sda2. Hai chữ sd là chữ tắt của một chuẩn rất cũ tên SCSI. Nhớ nhé: sd + chữ cái = cái đĩa thứ mấy; thêm số = phân vùng thứ mấy.

    Most hard disks attached to current Linux systems correspond to device names with an sd prefix: /dev/sda, /dev/sdb and so on. These represent entire disks; the kernel makes separate files such as /dev/sda1 and /dev/sda2 for the partitions.14 The sd portion stands for SCSI disk. Small Computer System Interface (SCSI) was originally developed as a hardware and protocol standard for communication between devices such as disks and other peripherals.1

    Bạn gặp nó ở đâuWhere you meet it Dù phần cứng SCSI truyền thống không còn được dùng trên hầu hết máy hiện đại, giao thức SCSI thì ở khắp nơi nhờ tính thích ứng của nó: thiết bị lưu trữ USB dùng nó để giao tiếp.1 Cái USB bạn vừa cắm cũng đang “nói tiếng SCSI”. Although traditional SCSI hardware isn't used in most modern machines, the SCSI protocol is everywhere thanks to its adaptability: USB storage devices use it to communicate.1

    SATA thì sao?

    Ward nói câu chuyện SATA (Serial ATA, bus lưu trữ phổ biến trên PC) phức tạp hơn một chút, nhưng nhân Linux vẫn dùng lệnh SCSI ở một thời điểm nhất định khi nói chuyện với chúng.1 Mục 3.6 của chương giải thích cơ chế dịch này qua thư viện libata.120

    lsscsi và thứ tự phát hiện

    Để liệt kê thiết bị SCSI, Ward giới thiệu lsscsi — công cụ đi qua các đường dẫn thiết bị do sysfs cung cấp, và là một trong những công cụ súc tích nhất.118 Cột đầu là địa chỉ thiết bị, cột hai mô tả loại thiết bị, cột cuối chỉ ra tập tin thiết bị; phần còn lại là thông tin nhà sản xuất.1 Ông cũng lưu ý bạn có thể phải cài lsscsi như một gói bổ sung.1

    Cái bẫy đánh số lại

    Linux gán thiết bị cho tập tin thiết bị theo thứ tự trình điều khiển gặp chúng, và Ward nói thẳng rằng lược đồ này vốn gây rắc rối khi cấu hình lại phần cứng.1 Ví dụ của ông: có ba đĩa sda, sdb, sdc; nếu sdb hỏng và bạn phải tháo nó ra, sdc cũ sẽ dời thành sdb và không còn sdc nữa — buộc bạn phải sửa fstab nếu trong đó tham chiếu trực tiếp tên thiết bị.1 Cách giải: nhiều hệ Linux dùng UUID và/hoặc ánh xạ thiết bị ổn định của LVM.110

  2. /dev/nvme* · /dev/xvd* · /dev/vd*

    NVMe và đĩa ảo — hai nhánh tên không thuộc họ SCSI SSD đời mới và đĩa của máy ảo NVMe and virtual disks — two names outside the SCSI family

    Một số hệ thống nay dùng giao diện Non-Volatile Memory Express (NVMe) để nói chuyện với vài loại lưu trữ thể rắn; trong Linux chúng xuất hiện ở /dev/nvme*, và lệnh nvme list cho bạn danh sách các thiết bị này.19 Riêng đĩa ảo: một số thiết bị đĩa được tối ưu cho máy ảo như các phiên bản AWS và VirtualBox — hệ ảo hoá Xen dùng tiền tố /dev/xvd, còn /dev/vd là một kiểu tương tự.1

    SSD đời mới không tên là sda nữa, mà là nvme0n1 — nhìn lạ nhưng đúng. Còn nếu bạn đang chạy trong một máy ảo, đĩa có thể tên là xvda hoặc vda. Nhớ nhé: thấy tên lạ thì chưa chắc sai — có thể chỉ là loại khác.

    Some systems now use the Non-Volatile Memory Express (NVMe) interface to talk to some kinds of solid-state storage; in Linux these show up at /dev/nvme*, and nvme list gives you a listing of them.19 As for virtual disks: some disk devices are optimised for virtual machines such as AWS instances and VirtualBox — the Xen virtualization system uses the /dev/xvd prefix, and /dev/vd is a similar type.1

    Bạn gặp nó ở đâuWhere you meet it Trên một laptop mua sau 2018, đĩa hệ thống của bạn gần như chắc chắn là /dev/nvme0n1 chứ không phải /dev/sda. Máy mới thì thường là nvme, máy cũ thì là sda. On a laptop bought after 2018 your system disk is almost certainly /dev/nvme0n1 rather than /dev/sda.
  3. /dev/dm-* · /dev/mapper/*

    Device mapper — một tầng nữa phía trên đĩa Một lớp trung gian phía trên đĩa Device mapper — one level above the disk

    Cao hơn đĩa và các dạng lưu trữ khối trực tiếp khác, một số hệ thống có LVM, thứ sử dụng một hệ thống của nhân gọi là device mapper.110 Nếu bạn thấy thiết bị khối bắt đầu bằng /dev/dm- và các liên kết tượng trưng trong /dev/mapper, hệ thống của bạn nhiều khả năng đang dùng nó.1

    Đôi khi cái “đĩa” bạn thấy không phải đĩa thật, mà là một cái đĩa giả do phần mềm ghép nhiều mảnh lại. Tên của nó bắt đầu bằng dm-. Nhớ nhé: thấy dm- là biết có một lớp trung gian ở giữa.

    A level up from disks and other direct block storage, some systems run LVM, which uses a kernel system called the device mapper.110 If you see block devices starting with /dev/dm- and symbolic links in /dev/mapper, your system probably uses it.1

    Bạn gặp nó ở đâuWhere you meet it Phân vùng mã hoá bằng LUKS và các nhóm khối LVM đều hiện ra ở đây; Ward hẹn giải thích đầy đủ ở Chương 4.1 Ổ đĩa được mã hoá cũng xuất hiện ở đây. LUKS-encrypted partitions and LVM volume groups both surface here; Ward promises the full account in Chapter 4.1
  4. /dev/sr* · /dev/hd*

    Ổ quang và đĩa PATA — chỉ đọc, và chế độ tương thích Ổ đĩa CD và đĩa cứng đời cũ Optical and PATA — read only, and compatibility mode

    Linux nhận phần lớn ổ lưu trữ quang là các thiết bị SCSI /dev/sr0, /dev/sr1…13 Các thiết bị /dev/sr* là chỉ đọc và chỉ dùng để đọc đĩa; để ghi và ghi lại, bạn dùng các thiết bị SCSI “generic” như /dev/sg0.1 Riêng PATA (Parallel ATA) là loại bus lưu trữ cũ hơn: các thiết bị khối /dev/hda đến /dev/hdd phổ biến trên bản nhân Linux cũ và phần cứng cũ, với gán cố định dựa trên các cặp thiết bị trên giao diện 0 và 1.13

    Ổ đĩa CD/DVD tên là sr0. Nó chỉ đọc được thôi — muốn ghi đĩa thì phải dùng một cửa khác tên sg0. Còn hda, hdb là tên của đĩa cứng đời rất cũ. Nhớ nhé: sr để đọc đĩa, sg để ghi đĩa.

    Linux recognises most optical storage drives as the SCSI devices /dev/sr0, /dev/sr1 and so on.13 The /dev/sr* devices are read only and are used only for reading discs; for the write and rewrite capabilities you use the "generic" SCSI devices such as /dev/sg0.1 PATA (Parallel ATA) is an older storage bus: the block devices /dev/hda through /dev/hdd are common on older kernels and older hardware, with fixed assignments based on the device pairs on interfaces 0 and 1.13

    Bạn gặp nó ở đâuWhere you meet it Nếu một ổ SATA hiện ra dưới tên /dev/hd*, Ward cảnh báo: nó đang chạy ở chế độ tương thích, điều này làm giảm hiệu năng — hãy kiểm tra thiết lập BIOS xem có chuyển bộ điều khiển SATA sang chế độ gốc được không.1 Thấy tên hda trên máy đời mới là dấu hiệu máy đang chạy chậm hơn mức nó có thể. If a SATA drive appears as /dev/hd*, Ward warns it is running in compatibility mode, which hinders performance — check your BIOS settings to see whether the SATA controller can be switched to its native mode.1
  5. /dev/tty* · /dev/pts/*

    Terminal — thiết bị chuyển ký tự giữa tiến trình và màn hình Cửa sổ gõ lệnh cũng là một thiết bị Terminals — devices that move characters

    Terminal là thiết bị chuyển ký tự giữa một tiến trình người dùng và một thiết bị nhập/xuất, thường là để xuất văn bản ra màn hình terminal; giao diện này có lịch sử rất dài, từ thời terminal còn là thiết bị kiểu máy đánh chữ và nhiều cái cùng gắn vào một máy.1 Ngày nay phần lớn terminal là thiết bị giả lập (pseudoterminal): thay vì nói chuyện với phần cứng thật, nhân trình giao diện nhập/xuất ra cho một phần mềm — chẳng hạn cửa sổ terminal bạn đang gõ lệnh vào.111

    Cái cửa sổ đen bạn gõ lệnh vào cũng là một thiết bị. Ngày xưa nó là cái máy đánh chữ thật, giờ chỉ là phần mềm giả làm máy đánh chữ. Nhớ nhé: terminal ngày nay là đồ giả, nhưng nhân vẫn đối xử với nó như đồ thật.

    Terminals are devices for moving characters between a user process and an I/O device, usually for text output to a terminal screen; the interface goes back a long way, to the days when terminals were typewriter-based devices and many were attached to a single machine.1 Today most terminals are pseudoterminal devices: rather than talk to a real piece of hardware, the kernel presents the I/O interface to a piece of software, such as the shell terminal window you type most of your commands into.111

    Bạn gặp nó ở đâuWhere you meet it Hai thiết bị terminal thường gặp là /dev/tty1 (console ảo đầu tiên) và /dev/pts/0 (thiết bị giả lập đầu tiên); bản thân thư mục /dev/pts là một hệ thống tệp riêng.125 Mở hai cửa sổ terminal là bạn có pts/0 và pts/1. Two common terminal devices are /dev/tty1 (the first virtual console) and /dev/pts/0 (the first pseudoterminal); the /dev/pts directory itself is a dedicated filesystem.125

    /dev/tty — cái tên trỏ vào chính mình

    Thiết bị /dev/tty là terminal điều khiển của tiến trình hiện tại: nếu một chương trình đang đọc và ghi lên một terminal, thiết bị này là tên đồng nghĩa của terminal đó.13 Ward thêm một câu ngắn mà quan trọng: một tiến trình không nhất thiết phải gắn với terminal nào cả.1

    Console ảo và hai chế độ hiển thị

    Linux có hai chế độ hiển thị chính: chế độ văn bản và chế độ đồ hoạ.1 Hệ thống Linux theo truyền thống khởi động ở chế độ văn bản, nhưng phần lớn bản phân phối nay dùng tham số nhân và các cơ chế hiển thị trung gian (bootsplash như plymouth) để giấu hoàn toàn chế độ văn bản trong lúc khởi động.1 Ở chế độ văn bản, bạn chuyển console bằng tổ hợp ALT–phím chức năng: ALT-F1 đưa bạn tới /dev/tty1, ALT-F2 tới /dev/tty2.1 Nhiều console trong số đó có thể đang bị một tiến trình getty chiếm để chạy dấu nhắc đăng nhập.1

    Khi ở chế độ đồ hoạ thì khác

    Một console ảo dùng ở chế độ đồ hoạ hơi khác: thay vì nhận phân bổ từ cấu hình init, môi trường đồ hoạ chiếm lấy một console ảo còn trống trừ khi được chỉ định cụ thể — ví dụ nếu getty đang chạy trên tty1 và tty2 thì môi trường đồ hoạ mới sẽ chiếm tty3.1 Và khi đã ở chế độ đồ hoạ, bạn thường phải bấm CTRL-ALT–phím chức năng thay vì chỉ ALT.1 Nếu cơ chế nhập bị trục trặc, có thể ép hệ thống đổi console bằng lệnh chvt chạy với quyền root — ví dụ chvt 1 để sang tty1.112 Ward cũng chú thích rằng một số bản phân phối dùng tty1 ở chế độ đồ hoạ, khi đó bạn phải thử các console khác.1

  6. /dev/ttyS* · /dev/ttyUSB* · /dev/ttyACM*

    Cổng nối tiếp — nơi bo mạch vi điều khiển xuất hiện Cổng nối tiếp — cắm bo mạch nhỏ vào đây Serial ports — where microcontroller boards show up

    Các cổng nối tiếp kiểu RS-232 cũ và tương tự được biểu diễn như thiết bị terminal thật.13 Ward nói bạn không làm được nhiều trên dòng lệnh với chúng vì có quá nhiều thiết lập phải lo — tốc độ baud, kiểm soát luồng — nhưng bạn có thể dùng lệnh screen để kết nối tới một terminal bằng cách thêm đường dẫn thiết bị làm tham số.113 Bạn có thể cần quyền đọc/ghi trên thiết bị; đôi khi đạt được bằng cách thêm chính mình vào một nhóm như dialout.1

    Cổng nối tiếp là kiểu cổng rất cũ, nhưng vẫn còn dùng — nhất là khi bạn cắm một bo mạch nhỏ để học lập trình. Dùng lệnh screen là nói chuyện được với nó. Nhớ nhé: cắm bo mạch vào, tìm ttyACM0, rồi gọi screen.

    Older RS-232-type and similar serial ports are represented as true terminal devices.13 Ward says you can't do much on the command line with them because there are too many settings to worry about — baud rate, flow control — but you can use the screen command to connect to a terminal by adding the device path as an argument.113 You may need read and write permission on the device; sometimes you get it by adding yourself to a group such as dialout.1

    Bạn gặp nó ở đâuWhere you meet it Cổng gọi là COM1 trên Windows chính là /dev/ttyS0, COM2 là /dev/ttyS1; bộ chuyển đổi nối tiếp USB cắm thêm hiện ra dưới tên /dev/ttyUSB0 và /dev/ttyACM0.1 Ví dụ tác giả thích nhất: truy cập console và vòng lặp đọc–tính–in của bo mạch CircuitPython qua giao diện nối tiếp USB — cắm vào, tìm thiết bị (thường là /dev/ttyACM0), rồi kết nối bằng screen.124 Cắm một bo mạch học lập trình vào là thấy ngay /dev/ttyACM0. The port known as COM1 on Windows is /dev/ttyS0, COM2 is /dev/ttyS1; plug-in USB serial adapters show up as /dev/ttyUSB0 and /dev/ttyACM0.1 The author's favourite example: reaching the console and read-eval-print loop of a CircuitPython board through a USB serial interface — plug one in, look for the device (usually /dev/ttyACM0), and connect with screen.124
  7. /dev/lp* · /dev/snd/* · /dev/dsp

    Cổng song song và thiết bị âm thanh — hai di tích còn sống Máy in cổng cũ và cái loa Parallel ports and audio — two living relics

    Cổng song song đại diện cho một loại giao diện phần lớn đã bị USB và mạng thay thế: các thiết bị một chiều /dev/lp0 và /dev/lp1 tương ứng với LPT1: và LPT2: trong Windows.114 Bạn có thể gửi thẳng tệp tới cổng song song bằng cat, nhưng có thể phải cấp thêm cho máy in một lệnh xuống dòng trang hoặc đặt lại sau đó; một máy chủ in như CUPS làm việc này tốt hơn nhiều.123 Cổng song song hai chiều là /dev/parport0 và /dev/parport1.1

    Ngày xưa máy in cắm vào một cổng to bè gọi là cổng song song, tên là lp0. Còn âm thanh thì có hai bộ tên: bộ mới nằm trong /dev/snd, bộ cũ là /dev/dsp. Nhớ nhé: lp là máy in cổ, snd là loa đời mới.

    Parallel ports represent an interface type largely replaced by USB and networks: the unidirectional devices /dev/lp0 and /dev/lp1 correspond to LPT1: and LPT2: in Windows.114 You can send files directly to a parallel port with cat, but you might need to give the printer an extra form feed or reset afterwards; a print server such as CUPS is much better at handling printer interaction.123 The bidirectional parallel ports are /dev/parport0 and /dev/parport1.1

    Bạn gặp nó ở đâuWhere you meet it Linux có hai bộ thiết bị âm thanh: bộ của Advanced Linux Sound Architecture (ALSA) nằm trong /dev/snd nhưng khó làm việc trực tiếp, và bộ Open Sound System (OSS) cũ hơn.115 Hệ Linux dùng ALSA vẫn hỗ trợ thiết bị OSS tương thích ngược nếu phần hỗ trợ OSS trong nhân đang được nạp.1 Muốn nghe thử? Máy sẽ phát bất kỳ tệp WAV nào bạn gửi tới /dev/dsp. Linux has two sets of audio devices: the Advanced Linux Sound Architecture (ALSA) devices in /dev/snd, which are difficult to work with directly, and the older Open Sound System (OSS).115 Linux systems using ALSA support OSS backward-compatible devices if the OSS kernel support is currently loaded.1

    Vì sao gửi WAV vào /dev/dsp thường thất bại

    Vài thao tác sơ đẳng vẫn làm được với thiết bị dsp và audio của OSS — máy sẽ phát bất kỳ tệp WAV nào bạn gửi tới /dev/dsp.1 Nhưng Ward liệt kê hai lý do nó thường không như bạn mong: phần cứng có thể phát sai do lệch tần số, và trên hầu hết hệ thống, thiết bị thường bận ngay khi bạn vừa đăng nhập.1

    Âm thanh Linux có nhiều tầng

    Ward thừa nhận thẳng rằng âm thanh trên Linux là một chủ đề lộn xộn vì có quá nhiều tầng liên quan: chương này mới chỉ nói về thiết bị ở mức nhân, còn thông thường còn có các máy chủ trong không gian người dùng như pulseaudio quản lý âm thanh từ nhiều nguồn và làm trung gian giữa thiết bị âm thanh với các tiến trình người dùng khác.1

  8. mknod

    Tạo tập tin thiết bị — việc bạn gần như không còn phải làm Tự tay tạo tập tin thiết bị (hiếm khi cần) Creating device files — something you barely ever do now

    Trên bất kỳ hệ Linux tương đối mới nào, bạn không tự tạo tập tin thiết bị; chúng được tạo bởi devtmpfs và udev.1 Nhưng Ward nói việc biết cách làm vẫn có tính giáo dục, và trong những dịp hiếm hoi bạn có thể cần tạo một ống dẫn có tên hoặc một tệp socket.1 Lệnh mknod tạo một thiết bị; bạn phải biết tên thiết bị cùng số major và minor của nó — ví dụ tạo /dev/sda1 là mknod /dev/sda1 b 8 1, trong đó b 8 1 chỉ định một thiết bị khối với major 8 và minor 1.116

    Ngày xưa người ta phải tự tay tạo từng tập tin thiết bị. Giờ máy tự làm hết. Nhưng biết cách làm vẫn hay, để hiểu rằng cái tệp đó chỉ là một cái tên gắn với hai con số. Nhớ nhé: một tập tin thiết bị = một cái tên + hai con số + một chữ cái loại.

    On any reasonably recent Linux system you do not create your own device files; they're created by devtmpfs and udev.1 But Ward says it is still instructive to see how, and on rare occasions you might need to create a named pipe or socket file.1 The mknod command creates one device; you must know the device name as well as its major and minor numbers — creating /dev/sda1 is mknod /dev/sda1 b 8 1, where b 8 1 specifies a block device with major 8 and minor 1.116

    Bạn gặp nó ở đâuWhere you meet it Với thiết bị ký tự hoặc ống dẫn có tên, dùng c hoặc p thay cho b — và bỏ số major/minor với ống dẫn có tên.116 Chữ cái quyết định loại: b, c hay p. For character or named pipe devices, use c or p instead of b — and omit the major and minor numbers for named pipes.116

    MAKEDEV và vì sao nó chết

    Ward kể lại lịch sử: trong các bản Unix và Linux cũ, duy trì thư mục /dev là một thách thức. Mỗi lần nâng cấp nhân hay thêm trình điều khiển đáng kể, nhân lại hỗ trợ thêm loại thiết bị mới, nghĩa là có thêm một bộ số major/minor phải gán cho tên tệp.1 Để đối phó, mỗi hệ thống có một chương trình MAKEDEV trong /dev để tạo hàng loạt thiết bị; khi nâng cấp, bạn phải tìm bản cập nhật của MAKEDEV rồi chạy nó.1

    devfs — nỗ lực đầu tiên, và thất bại

    Hệ thống tĩnh đó trở nên cồng kềnh nên cần một thứ thay thế. Nỗ lực đầu tiên là devfs, một hiện thực /dev nằm trong không gian nhân chứa mọi thiết bị mà nhân hiện tại hỗ trợ.1 Nhưng nó có một số giới hạn, và chính điều đó dẫn tới sự ra đời của udev và devtmpfs.1

Cụm khái niệm 04 Concept cluster 04

udev: nhân gửi tin, không gian người dùng quyết định Người trực tên udev: cắm vào là có tên udev: the kernel sends word, user space decides

Nhân Linux có thể gửi thông báo tới một tiến trình trong không gian người dùng tên là udevd khi phát hiện một thiết bị mới trên hệ thống — ví dụ khi ai đó cắm một USB flash vào.117 Tiến trình udevd này có thể khảo sát đặc tính của thiết bị mới, tạo một tập tin thiết bị, rồi thực hiện mọi khởi tạo cần thiết.1 Ward chú thích: bạn gần như chắc chắn sẽ thấy udevd chạy trên máy mình dưới tên systemd-udevd, vì nó là một phần của cơ chế khởi động.117

Khi bạn cắm một cái USB vào, nhân không tự lo hết. Nó chỉ nhắn ra ngoài: “có đồ mới nè!”. Một chương trình tên udevd nhận tin, xem đó là đồ gì, rồi đặt tên và đặt quyền cho nó. Nhớ nhé: nhân báo tin, udev làm việc.

The Linux kernel can send notifications to a user-space process called udevd upon detecting a new device on the system — when someone attaches a USB flash drive, say.117 That udevd process can examine the new device's characteristics, create a device file, and then perform any device initialization.1 Ward notes you'll almost certainly see udevd running on your system as systemd-udevd, because it is part of the startup mechanism.117

Ward gọi đó là “lý thuyết” — và lập tức nêu vấn đề làm lý thuyết đó không chạy được nguyên vẹn. Tập tin thiết bị cần thiết từ rất sớm trong quy trình khởi động, nên udevd cũng phải khởi động rất sớm. Nhưng để tạo tập tin thiết bị, udevd không thể phụ thuộc vào bất kỳ thiết bị nào mà chính nó phải tạo ra, và nó phải khởi động ban đầu thật nhanh để phần còn lại của hệ thống không bị giữ lại chờ.1 Toàn bộ thiết kế devtmpfs là câu trả lời cho cái vòng luẩn quẩn này.

Định nghĩa. devtmpfs là hệ thống tệp được phát triển để đáp lại chính vấn đề thiết bị phải có sẵn trong lúc khởi động. Nó giống devfs cũ nhưng đơn giản hơn: nhân tạo tập tin thiết bị khi cần, đồng thời báo cho udevd rằng có thiết bị mới.1 Nhận được tín hiệu đó, udevd không tạo tập tin thiết bị, mà thực hiện khởi tạo thiết bị, đặt quyền, báo cho các tiến trình khác, và tạo thêm một số liên kết tượng trưng trong /dev để nhận diện thiết bị rõ hơn.1

Nói đơn giản. Có một mẹo chia việc: nhân lo tạo tệp ngay lập tức để máy khởi động được, còn udev lo phần “trang trí” — đặt quyền, gắn thêm tên dễ nhớ. Nhớ nhé: nhân tạo tệp, udev đặt quyền và thêm tên phụ.

Definition. devtmpfs is the filesystem developed in response to exactly the problem of device availability during boot. It is similar to the older devfs but simplified: the kernel creates device files as necessary and also notifies udevd that a new device is available.1 On receiving that signal, udevd does not create the device files; it performs device initialization, sets permissions, notifies other processes, and additionally creates a number of symbolic links in /dev to further identify devices.1

kernel ── uevent ──> udevd
  1. nạp mọi thuộc tính
  2. phân tích luật
  3. lọc, cập nhật, hành động

/lib/udev/rules.d → mặc định
/etc/udev/rules.d → ghi đè

nhân → nhắn tin → udevd
udevd đọc luật
udevd đặt tên + quyền

kernel ── uevent ──> udevd
  1. load all attributes
  2. parse the rules
  3. filter, update, act

/lib/udev/rules.d → defaults
/etc/udev/rules.d → overrides

  1. uevent

    uevent — bức điện tín ba bước từ nhân uevent — tin nhắn báo có đồ mới uevent — the kernel's three-step telegram

    Ward mô tả hoạt động của udevd trong đúng ba bước. Một: nhân gửi cho udevd một sự kiện thông báo, gọi là uevent, qua một liên kết mạng nội bộ. Hai: udevd nạp tất cả thuộc tính trong uevent đó. Ba: udevd phân tích các luật của nó, lọc và cập nhật uevent theo luật, rồi thực hiện hành động hoặc đặt thêm thuộc tính cho phù hợp.119

    Ba bước thôi: nhân nhắn tin → udev đọc tin → udev tra sổ luật rồi làm theo. Nhớ nhé: nhắn tin, đọc tin, tra sổ.

    Ward describes udevd's operation in exactly three steps. One: the kernel sends udevd a notification event, called a uevent, through an internal network link. Two: udevd loads all of the attributes in the uevent. Three: udevd parses its rules, filters and updates the uevent based on those rules, and takes actions or sets more attributes accordingly.119

    Bạn gặp nó ở đâuWhere you meet it Một uevent đến từ nhân trông như một khối cặp khoá–giá trị: ACTION=change, DEVNAME=sde, DEVPATH=…, DEVTYPE=disk, MAJOR=8, MINOR=64, SEQNUM=2752, SUBSYSTEM=block.1 Sau khi nhận nó, udevd đã biết tên thiết bị, đường dẫn sysfs và nhiều thuộc tính khác — đủ để bắt đầu xử lý luật.1 Tin nhắn đó ghi rõ: tên gì, ở đâu, loại gì, số mấy. An incoming uevent looks like a block of key-value pairs: ACTION=change, DEVNAME=sde, DEVPATH=…, DEVTYPE=disk, MAJOR=8, MINOR=64, SEQNUM=2752, SUBSYSTEM=block.1 After receiving it, udevd knows the device name, the sysfs device path and a number of other attributes — enough to start processing rules.1

    Liên kết tượng trưng ổn định trong /dev/disk/by-id

    Kết quả nhìn thấy được của bước ba là thư mục /dev/disk/by-id, nơi mỗi đĩa đang gắn có một hoặc nhiều mục.1 udevd đặt tên các liên kết theo loại giao diện, rồi tới thông tin nhà sản xuất và model, số sê-ri, và phân vùng nếu có — ví dụ scsi-SATA_WDC_WD3200AAJS-_WD-WMAV2FU80671-part1 -> ../../sda1.1 Đây chính là lời giải cho cái bẫy đánh số lại ở mục trước: liên kết này không đổi khi bạn tháo một đĩa khác.

    Vì sao chữ “tmp” trong devtmpfs

    Ward giải thích: chữ “tmp” cho biết hệ thống tệp này nằm trong bộ nhớ chính và đọc/ghi được bởi tiến trình không gian người dùng — chính đặc tính đó cho phép udevd tạo các liên kết tượng trưng nói trên.1

  2. udev rules

    Luật udev — điều kiện dùng ==, chỉ thị dùng = Sổ luật: nếu… thì… udev rules — conditions use ==, directives use =

    Các tệp luật nằm trong hai thư mục /lib/udev/rules.d và /etc/udev/rules.d: luật trong /lib là mặc định, luật trong /etc là ghi đè.119 Ward thừa nhận giải thích đầy đủ hệ luật sẽ rất dài dòng và chỉ bạn tới trang man udev(7), nhưng nêu ba nguyên tắc đọc: udevd đọc luật từ đầu đến cuối tệp; sau khi đọc một luật và có thể đã thi hành hành động của nó, nó tiếp tục đọc tệp hiện tại để tìm các luật áp dụng được khác; và có những chỉ thị như GOTO để bỏ qua từng phần của tệp luật, thường đặt ở đầu tệp để nhảy qua cả tệp nếu nó không liên quan tới thiết bị đang xét.1

    Luật udev là một cuốn sổ kiểu “nếu… thì…”. Máy đọc từ đầu tới cuối, gặp luật nào đúng thì làm theo, rồi vẫn đọc tiếp. Có luật ghi sẵn của hệ thống, và luật riêng của bạn thì đè lên. Nhớ nhé: /lib là luật gốc, /etc là luật của bạn.

    The rules files live in /lib/udev/rules.d and /etc/udev/rules.d: the rules in /lib are the defaults, those in /etc are overrides.119 Ward admits a full explanation of the rules would be tedious and points to the udev(7) manual page, but gives three reading principles: udevd reads rules from start to finish of a rules file; after reading a rule and possibly executing its action it continues reading the current file for more applicable rules; and there are directives such as GOTO to skip over parts of rules files, usually placed at the top to skip an entire file irrelevant to the device being configured.1

    Bạn gặp nó ở đâuWhere you meet it Cách phân biệt quan trọng nhất, theo Ward: điều kiện được ký hiệu bằng hai dấu bằng == hoặc dấu chấm than bằng !=, còn chỉ thị bằng một dấu bằng =, một dấu cộng bằng +=, hoặc dấu hai chấm bằng :=.119 Hai dấu bằng là “hỏi”, một dấu bằng là “bảo”. The distinction Ward flags as most important: conditionals are denoted by two equal signs == or a bang equal !=, and directives by a single equal sign =, a plus equal +=, or a colon equal :=.119

    Nguồn khác nhau về số thư mục luật

    Sách nêu hai thư mục luật: /lib/udev/rules.d (mặc định) và /etc/udev/rules.d (ghi đè).1 Trang man udev(7) hiện hành liệt kê bốn nguồn được sắp xếp chung theo thứ tự từ điển bất kể nằm ở thư mục nào: /usr/lib/udev/rules.d, /usr/local/lib/udev/rules.d, thư mục chạy thời /run/udev/rules.d, và thư mục quản trị cục bộ /etc/udev/rules.d — trong đó tệp ở /etc/ có ưu tiên cao nhất.19 Bản văn không sai: trên nhiều bản phân phối /lib là liên kết tới /usr/lib, và thứ tự ưu tiên “mặc định rồi ghi đè” vẫn đúng; chỉ là bản đồ đầy đủ rộng hơn hai mục.

    Đọc một luật thật: 60-persistent-storage.rules

    Các liên kết trong ví dụ /dev/sda được định nghĩa bởi luật trong /lib/udev/rules.d/60-persistent-storage.rules.1 Ý tưởng của luật ATA đầu tiên: udevd tìm thiết bị bắt đầu bằng sd hoặc sr nhưng không có số — biểu thức KERNEL=="sd*[!0-9]|sr*" — cộng với hệ con SUBSYSTEMS=="scsi" và vài thuộc tính khác tuỳ loại thiết bị.1 Nếu mọi điều kiện đúng, udevd chuyển tới biểu thức cuối — không phải điều kiện mà là chỉ thị: IMPORT{program}="ata_id --export $devnode", tức nhập biến từ lệnh /lib/udev/ata_id.1

    Mẹo ID_SERIAL — luật tự vô hiệu hoá chính mình

    Trong cả hai luật ATA, điều kiện thứ hai là ENV{ID_SERIAL}!="?*", biểu thức này đúng khi ID_SERIAL chưa được đặt; nếu nó đã được đặt thì điều kiện sai, cả luật không áp dụng, và udevd chuyển sang luật kế tiếp.1 Mục đích của hai luật này là chạy ata_id để tìm số sê-ri rồi thêm các thuộc tính đó vào bản sao đang làm việc của uevent — Ward nói bạn sẽ gặp khuôn mẫu chung này trong rất nhiều luật udev.1 Kết quả nhập vào đặt sẵn các biến như ID_TYPE=disk, ID_BUS=ata, ID_MODEL=WDC_WD3200AAJS-22L7A0.1

    Và đây là nơi liên kết tượng trưng ra đời

    Với ENV{ID_SERIAL} đã được đặt, udevd nay có thể khớp một luật ở phần sau tệp, tìm mọi đĩa SCSI đang gắn; luật đó đòi ENV{ID_SERIAL} phải có giá trị và mang đúng một chỉ thị: SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}".1 Chỉ thị này bảo udevd thêm một liên kết tượng trưng cho thiết bị đang đến — và đó chính là nguồn gốc của các liên kết bạn thấy trong /dev/disk/by-id.1

  3. udevadm info · udevadm monitor

    udevadm — tra cứu và theo dõi thời gian thực udevadm — vừa tra vừa xem trực tiếp udevadm — query and live monitoring

    udevadm là công cụ quản trị cho udevd: bạn có thể nạp lại luật và kích hoạt sự kiện, nhưng theo Ward, hai tính năng mạnh nhất là khả năng tìm và khám phá thiết bị hệ thống và khả năng theo dõi uevent ngay khi udevd nhận chúng từ nhân.17 Ông cũng thừa nhận cú pháp lệnh có thể khá phức tạp, với dạng dài và dạng ngắn cho hầu hết tuỳ chọn — trong sách ông dùng dạng dài.1

    Một lệnh, hai việc: tra thông tin một món đồ, và ngồi xem trực tiếp mỗi khi có đồ mới cắm vào. Cắm USB rồi nhìn màn hình chạy chữ — rất vui. Nhớ nhé: info để tra, monitor để xem.

    udevadm is the administration tool for udevd: you can reload rules and trigger events, but Ward says its two most powerful features are the ability to search for and explore system devices and the ability to monitor uevents as udevd receives them from the kernel.17 He also grants that the command syntax can be somewhat complicated, with long and short forms for most options — the book uses the long ones.1

    Bạn gặp nó ở đâuWhere you meet it Đầu ra của udevadm info --query=all --name=/dev/sda dùng tiền tố để phân loại từng dòng: P: là đường dẫn thiết bị sysfs, N: là nút thiết bị (tên của tệp trong /dev), S: là liên kết tượng trưng mà udevd đặt trong /dev theo luật của nó, và E: là thông tin thiết bị bổ sung được trích ra trong luật.17 P là đường dẫn, N là tên, S là tên phụ, E là thông tin thêm. The output of udevadm info --query=all --name=/dev/sda uses prefixes to classify each line: P: is the sysfs device path, N: the device node (the name given to the /dev file), S: a symbolic link to the node that udevd placed in /dev according to its rules, and E: additional device information extracted in the rules.17

    Vì sao monitor in mỗi thông điệp hai lần

    Chạy udevadm monitor rồi cắm một thẻ nhớ, bạn thấy mỗi thông điệp xuất hiện hai bản. Lý do: hành vi mặc định là in cả thông điệp đến từ nhân (đánh dấu KERNEL) lẫn thông điệp xử lý từ udevd (đánh dấu UDEV).17 Muốn chỉ xem sự kiện nhân, thêm --kernel; chỉ xem xử lý của udevd, dùng --udev; muốn thấy toàn bộ uevent kèm thuộc tính, dùng --property; và --udev cùng --property cho bạn uevent sau khi đã xử lý.1

    Lọc theo hệ con

    Bạn cũng có thể lọc sự kiện theo hệ con — ví dụ để chỉ thấy thông điệp nhân liên quan tới thay đổi trong hệ con SCSI: udevadm monitor --kernel --subsystem-match=scsi.17 Ward đóng mục bằng một gợi ý về hệ sinh thái rộng hơn: còn có một dịch vụ nền tên udisksd lắng nghe sự kiện để tự động gắn đĩa và báo cho các tiến trình khác rằng có đĩa mới.1

Cụm khái niệm 05 Concept cluster 05

SCSI trong nhân: ba tầng trình điều khiển và những cây cầu Vì sao USB, SATA, CD đều đi chung một đường SCSI in the kernel: three driver layers and their bridges

Ward dùng hệ con SCSI làm cửa sổ nhìn vào kiến trúc nhân Linux, và nói trước hai điều: bạn không cần biết gì trong mục này để dùng đĩa, và nội dung ở đây nâng cao và thiên về lý thuyết hơn mọi thứ trước đó.1 Bối cảnh lịch sử: cấu hình SCSI phần cứng truyền thống là một bộ điều hợp chủ (host adapter) nối với một chuỗi thiết bị qua một bus SCSI; bộ điều hợp chủ gắn vào máy tính, và cả bộ điều hợp lẫn các thiết bị đều có một SCSI ID — có thể có 8 hoặc 16 ID trên mỗi bus, tuỳ phiên bản SCSI.1

Phần này là phần khó nhất chương — chính tác giả cũng bảo thế. Ý chính rất gọn: trong nhân có một “trạm trung chuyển” tên SCSI, và gần như mọi loại ổ đĩa đều được dịch sang tiếng SCSI để đi qua trạm này. Nhớ nhé: SCSI là ngôn ngữ chung của các ổ đĩa trong Linux.

Ward uses the SCSI subsystem as a window onto Linux kernel architecture, and says two things up front: you don't need any of this to use disks, and the material here is more advanced and theoretical than anything before it.1 The historical background: a traditional SCSI hardware setup is a host adapter linked with a chain of devices over a SCSI bus; the host adapter attaches to the computer, and the adapter and devices each have a SCSI ID — there can be 8 or 16 IDs per bus, depending on the SCSI version.1

Một thuật ngữ đáng nhớ trước khi đi tiếp: một số quản trị viên dùng từ SCSI target để chỉ một thiết bị cùng SCSI ID của nó, vì một đầu của phiên làm việc trong giao thức SCSI được gọi là target.1 Trong thuật ngữ chính thức của SCSI, đầu kia — bên phát lệnh — là initiator; tài liệu nhân định nghĩa một “host” là cầu nối giữa một bus nhập/xuất của máy tính (ví dụ PCI) với một cổng initiator SCSI.21 Chính quan hệ ngang hàng đó cho phép bất kỳ thiết bị nào cũng giao tiếp được với thiết bị khác qua bộ lệnh SCSI; máy tính không gắn trực tiếp vào chuỗi thiết bị, nên nó phải đi qua bộ điều hợp chủ để nói chuyện với đĩa.1

Định nghĩa. Hệ con SCSI trong nhân có ba tầng trình điều khiển. Tầng trên xử lý thao tác cho một lớp thiết bị — ví dụ trình điều khiển sd (SCSI disk) biết cách dịch yêu cầu từ giao diện thiết bị khối của nhân thành lệnh SCSI đặc thù cho đĩa, và ngược lại. Tầng giữa điều phối và định tuyến thông điệp SCSI giữa tầng trên và tầng dưới, đồng thời theo dõi mọi bus và thiết bị SCSI gắn vào hệ thống. Tầng dưới xử lý hành động đặc thù phần cứng: gửi thông điệp giao thức SCSI đi tới bộ điều hợp chủ cụ thể, và trích thông điệp đến từ phần cứng.121

Nói đơn giản. Ba tầng giống ba người trong một bưu điện: người trên cùng biết gói hàng là loại gì, người giữa biết chuyển cho ai, người dưới cùng biết nhét gói vào đúng xe. Nhớ nhé: trên hiểu hàng, giữa chia đường, dưới chạy xe.

Definition. The kernel's SCSI subsystem has three layers of drivers. The top layer handles operations for a class of device — the sd (SCSI disk) driver, for instance, knows how to translate requests from the kernel block device interface into disk-specific SCSI commands, and back. The middle layer moderates and routes SCSI messages between the top and bottom layers and keeps track of all the SCSI buses and devices attached to the system. The bottom layer handles hardware-specific actions: sending outgoing SCSI protocol messages to specific host adapters, and extracting incoming messages from the hardware.121

[0:0:0:0] disk ATA … /dev/sda
[2:0:0:3] disk USB2.0 … /dev/sde

= host adapter : bus
  : SCSI ID : LUN

4 số trong ngoặc =
bộ điều hợp : bus
: mã thiết bị : khoang

[0:0:0:0] disk ATA … /dev/sda
[2:0:0:3] disk USB2.0 … /dev/sde

= host adapter : bus
  : SCSI ID : LUN

  1. lsscsi · LUN

    Bốn con số trong ngoặc vuông — đọc được là hiểu cả cây Bốn con số như địa chỉ nhà The four bracketed numbers — read them and you read the tree

    Các con số trong ngoặc vuông của lsscsi, từ trái sang phải, là: số bộ điều hợp chủ SCSI, số bus SCSI, SCSI ID của thiết bị, và LUN (logical unit number) — một phân chia nhỏ hơn nữa của một thiết bị.118 Trong ví dụ của Ward có bốn bộ điều hợp (scsi0 đến scsi3), mỗi bộ có một bus duy nhất (đều mang số bus 0), và chỉ một thiết bị trên mỗi bus (đều là target 0).1

    Bốn con số giống địa chỉ: quận, phường, số nhà, tầng. Nhìn vào là biết món đồ nằm ở đâu trong hệ thống. Nhớ nhé: bốn số = bốn cấp địa chỉ.

    The numbers in lsscsi's square brackets are, left to right: the SCSI host adapter number, the SCSI bus number, the device SCSI ID, and the LUN (logical unit number), a further subdivision of a device.118 In Ward's example there are four attached adapters (scsi0 through scsi3), each with a single bus (all bus number 0), and just one device per bus (all target 0).1

    Bạn gặp nó ở đâuWhere you meet it Đầu đọc thẻ USB ở địa chỉ 2:0:0 trong ví dụ có bốn đơn vị logic — mỗi loại thẻ nhớ cắm vào được một đơn vị — và nhân gán một tập tin thiết bị khác nhau cho mỗi đơn vị logic: /dev/sdb tới /dev/sde.1 Một đầu đọc thẻ bốn khe sẽ hiện ra thành bốn ổ khác nhau. The USB card reader at 2:0:0 in the example has four logical units — one for each kind of flash card that can be inserted — and the kernel assigns a different device file to each logical unit: /dev/sdb through /dev/sde.1

    Ngoại lệ NVMe

    Ward ghi một ngoại lệ dễ gây bối rối: dù không phải thiết bị SCSI, thiết bị NVMe đôi khi vẫn hiện ra trong đầu ra lsscsi với chữ N làm số bộ điều hợp.19

    Thứ tự dòng = thứ tự phát hiện

    Nhắc lại từ mục 3.4.1 và nay có ý nghĩa rõ hơn: Linux gán thiết bị cho tập tin thiết bị theo thứ tự trình điều khiển gặp chúng, nên trong ví dụ đầu chương, nhân tìm thấy đĩa trước và ổ flash sau.1

  2. USB storage bridge

    USB và SCSI — hai hệ con ba tầng soi gương nhau USB cũng có ba tầng y hệt USB and SCSI — two three-layer subsystems mirroring each other

    Một ổ USB flash hiện ra ở /dev/sdf hiểu lệnh SCSI, nhưng để thật sự giao tiếp với nó, nhân cần biết cách nói qua hệ thống USB.1 Ward chỉ ra rằng ở mức trừu tượng, USB khá giống SCSI — cũng có lớp thiết bị, bus, và bộ điều khiển chủ — nên không ngạc nhiên khi nhân Linux có một hệ con USB ba tầng rất giống hệ con SCSI: trình điều khiển theo lớp thiết bị ở trên, lõi quản lý bus ở giữa, trình điều khiển bộ điều khiển chủ ở dưới.122 Thậm chí có cả lệnh lsusb tương tự lsscsi.1

    USB và SCSI được xây theo cùng một kiểu ba tầng. Nên nhân chỉ cần một “người phiên dịch” nhỏ là hai bên hiểu nhau. Nhớ nhé: giống cấu trúc thì dễ bắc cầu.

    A USB flash drive appearing as /dev/sdf understands SCSI commands, but to actually talk to it the kernel needs to know how to speak through the USB system.1 Ward points out that in the abstract USB is quite similar to SCSI — it too has device classes, buses and host controllers — so it's no surprise the Linux kernel includes a three-layer USB subsystem closely resembling the SCSI one: device-class drivers at the top, a bus management core in the middle, host controller drivers at the bottom.122 There is even an lsusb command similar to lsscsi.1

    Bạn gặp nó ở đâuWhere you meet it Trình điều khiển lưu trữ USB ở tầng trên hoạt động như một người phiên dịch: một đầu nói SCSI, đầu kia nói USB. Vì phần cứng lưu trữ gói sẵn lệnh SCSI bên trong thông điệp USB, công việc của nó tương đối nhẹ — chủ yếu là đóng gói lại dữ liệu.1 Nó chỉ bóc gói ra rồi gói lại thôi, không phải dịch từng chữ. The USB storage driver at the top acts as a translator: on one end it speaks SCSI, on the other USB. Because the storage hardware includes SCSI commands inside its USB messages, the driver has a relatively easy job — it mostly repackages data.1

    Mắt xích cuối cùng: cây cầu SCSI tầng dưới

    Với cả hệ con SCSI lẫn USB đã sẵn sàng, bạn gần như có đủ mọi thứ để nói chuyện với ổ flash — nhưng vẫn thiếu trình điều khiển tầng dưới trong hệ con SCSI, vì trình điều khiển lưu trữ USB thuộc hệ con USB chứ không thuộc SCSI.1 Ward nêu lý do rất thẳng: vì lý do tổ chức, hai hệ con không nên dùng chung một trình điều khiển.1 Cách nối: một trình điều khiển cầu SCSI tầng dưới đơn giản kết nối sang trình điều khiển lưu trữ của hệ con USB.1

    Một thiết bị, một trên, một dưới

    Tầng trên và tầng dưới chứa nhiều trình điều khiển khác nhau, nhưng Ward nhấn mạnh điều cần nhớ: với bất kỳ tập tin thiết bị nào trên hệ thống, nhân (gần như luôn luôn) dùng một trình điều khiển tầng trên và một trình điều khiển tầng dưới.1 Với đĩa /dev/sda trong ví dụ, đó là trình điều khiển tầng trên sd và cây cầu ATA ở tầng dưới.1

  3. libata

    SCSI và ATA — dịch nguyên văn so với dịch thật sự Ổ CD chỉ cần chép lại, ổ cứng thì phải dịch SCSI and ATA — transcription versus real translation

    Đĩa cứng SATA và ổ quang trong sơ đồ của Ward dùng chung một giao diện SATA, nhưng để nối các trình điều khiển SATA của nhân với hệ con SCSI, nhân dùng một trình điều khiển cầu — như với USB, nhưng bằng cơ chế khác và phức tạp hơn.1 Lý do: ổ quang nói ATAPI, một phiên bản lệnh SCSI được mã hoá trong giao thức ATA; còn đĩa cứng thì không dùng ATAPI và không mã hoá bất kỳ lệnh SCSI nào cả.1 Nhân dùng một phần của thư viện libata để hoà giải các ổ SATA (và ATA) với hệ con SCSI.120

    Ổ CD đã nói sẵn “tiếng SCSI” rồi, chỉ cần bóc gói ra là xong. Còn ổ cứng SATA nói một thứ tiếng hoàn toàn khác, phải dịch thật. Có một thư viện tên libata làm người dịch đó. Nhớ nhé: cùng một sợi cáp, nhưng hai mức khó khác hẳn nhau.

    The SATA hard disk and the optical drive in Ward's schematic use the same SATA interface, but to connect the kernel's SATA-specific drivers to the SCSI subsystem, the kernel employs a bridge driver — as with USB, but by a different mechanism and with additional complications.1 The reason: the optical drive speaks ATAPI, a version of SCSI commands encoded in the ATA protocol; the hard disk does not use ATAPI and does not encode any SCSI commands.1 The kernel uses part of a library called libata to reconcile SATA (and ATA) drives with the SCSI subsystem.120

    Bạn gặp nó ở đâuWhere you meet it Phép so sánh của chính tác giả: công việc với ổ quang giống gõ lại một quyển sách tiếng Anh vào máy tính — bạn không cần hiểu quyển sách nói gì, thậm chí không cần biết tiếng Anh. Còn công việc với đĩa cứng giống đọc một quyển sách tiếng Đức rồi gõ vào máy dưới dạng bản dịch tiếng Anh: bạn phải hiểu cả hai thứ tiếng lẫn nội dung quyển sách.1 Một bên là chép lại, một bên là dịch — khó hơn hẳn. The author's own comparison: the optical drive's job is like typing an English book into a computer — you need not understand what the book is about, nor even English. The hard disk's job is more like reading a German book and typing it in as an English translation: you need both languages and the book's content.1

    Khi phần cứng tự dịch

    Ward lưu ý đĩa SATA cũng xuất hiện trên hệ thống như thiết bị SCSI, nhưng hơi khác vì phần lớn chúng giao tiếp qua một tầng dịch trong thư viện libata; một số bộ điều khiển SATA — đặc biệt là bộ điều khiển RAID hiệu năng cao — thực hiện phép dịch này ngay trong phần cứng.120

    Sơ đồ đã được giản lược

    Ông thừa nhận libata làm được việc này và nhờ đó gắn được giao diện và thiết bị ATA/SATA vào hệ con SCSI — nhưng thường có nhiều trình điều khiển tham gia hơn là chỉ một trình điều khiển chủ SATA như trong hình; chúng không được vẽ ra cho đơn giản.1 Đây là lời nhắc rằng sơ đồ trong sách là một trừu tượng hoá, đúng tinh thần Chương 1.

  4. generic SCSI device (sg)

    Thiết bị generic — cửa sau để bỏ qua lớp thiết bị Một cửa phụ nói thẳng với ổ đĩa Generic devices — the back door past the class driver

    Khi một tiến trình người dùng giao tiếp với hệ con SCSI, thông thường nó đi qua tầng thiết bị khối và/hoặc một dịch vụ nhân khác nằm trên một trình điều khiển lớp thiết bị SCSI (như sd hoặc sr); nói cách khác, phần lớn tiến trình người dùng không bao giờ cần biết gì về thiết bị SCSI hay lệnh của chúng.1 Nhưng tiến trình người dùng có thể bỏ qua trình điều khiển lớp thiết bị và đưa lệnh giao thức SCSI thẳng tới thiết bị qua thiết bị generic của chúng.126

    Bình thường bạn đi cửa chính: mở tệp, đọc, ghi. Nhưng có một cửa phụ cho phép chương trình ra lệnh thẳng cho ổ đĩa. Cửa phụ đó tên là /dev/sg*. Nhớ nhé: sg là cửa phụ dành cho việc khó.

    When a user-space process communicates with the SCSI subsystem it normally does so through the block device layer and/or another kernel service sitting on top of a SCSI device class driver (such as sd or sr); in other words, most user processes never need to know anything about SCSI devices or their commands.1 But user processes can bypass the device class drivers and give SCSI protocol commands directly to devices through their generic devices.126

    Bạn gặp nó ở đâuWhere you meet it Thêm tuỳ chọn -g vào lsscsi để hiện các thiết bị generic: ngoài tập tin thiết bị khối quen thuộc, mỗi mục liệt kê thêm một tập tin thiết bị SCSI generic ở cột cuối — ví dụ thiết bị generic của ổ quang /dev/sr0 là /dev/sg1.118 Mỗi ổ đĩa có hai tên: một tên thường và một tên “cửa phụ”. Add the -g option to lsscsi to show generic devices: alongside the usual block device file, each entry lists a SCSI generic device file in the last column — the generic device for the optical drive at /dev/sr0 is /dev/sg1.118

    Lý do thật sự: giữ nhân cho gọn

    Ward đặt câu hỏi “vì sao lại muốn dùng thiết bị generic?” và trả lời bằng độ phức tạp của mã trong nhân: tác vụ càng phức tạp thì càng nên để nó ra ngoài nhân.1 Đọc một đĩa quang là thao tác khá đơn giản và có một trình điều khiển chuyên dụng trong nhân. Nhưng ghi một đĩa quang khó hơn đọc rất nhiều, và không có dịch vụ hệ thống thiết yếu nào phụ thuộc vào hành động ghi — không có lý do gì đe doạ không gian nhân bằng hoạt động đó.1 Vì vậy, để ghi đĩa trong Linux, bạn chạy một chương trình không gian người dùng nói chuyện với một thiết bị SCSI generic như /dev/sg1; chương trình này có thể kém hiệu quả hơn một trình điều khiển nhân, nhưng dễ xây dựng và bảo trì hơn nhiều.1

    sg là một trong bốn trình điều khiển mức cao

    Tài liệu nhân xác nhận vị trí của sg: nó là một trong bốn trình điều khiển thiết bị SCSI “mức cao”, cùng với sd, st và sr (đĩa, băng từ và CD-ROM); sg tổng quát hơn các anh em của nó và thường dùng cho thiết bị không khớp vào các hạng mục đã có — máy quét, đầu ghi CD, và đọc CD nhạc dưới dạng số.26

  5. multiple access methods

    Hai lối vào một thiết bị — sr để đọc, sg để ghi Một cái ổ, hai lối đi vào Two ways into one device — sr reads, sg writes

    Đây là hình cuối của chương và cũng là ý chốt: một ổ quang có hai điểm truy cập từ không gian người dùng. Tiến trình A đọc từ ổ bằng trình điều khiển sr, còn tiến trình B ghi đĩa bằng trình điều khiển sg.1 Ward thêm một cảnh báo thực tế: những tiến trình như vậy thường không chạy đồng thời để truy cập cùng một thiết bị.1

    Một cái ổ đĩa CD có hai lối vào: lối đọc và lối ghi. Nhưng đừng dùng cả hai cùng lúc nhé. Nhớ nhé: hai lối vào, nhưng đi một lối thôi.

    This is the chapter's final figure and its closing point: an optical drive has two points of access from user space. Process A reads from the drive using the sr driver, while process B writes discs with the sg driver.1 Ward adds a practical caveat: processes like these would not normally run simultaneously to access the same device.1

    Bạn gặp nó ở đâuWhere you meet it Câu hỏi Ward tự đặt rồi tự trả lời: trong hình, tiến trình A đọc từ thiết bị khối — nhưng tiến trình người dùng có thật sự đọc dữ liệu kiểu đó không? Thông thường là không, không trực tiếp: còn nhiều tầng nữa phía trên thiết bị khối và thậm chí nhiều điểm truy cập hơn nữa với đĩa cứng, như chương sau sẽ chỉ ra.1 Thật ra vẫn còn mấy tầng nữa ở trên — chương sau sẽ kể. The question Ward poses and answers himself: in the figure, process A reads from the block device — but do user processes really read data this way? Normally no, not directly: there are more layers on top of the block devices, and even more points of access for hard disks, as the next chapter shows.1

Đính chính Corrections

Ba ngộ nhận mà người đọc lần đầu hay mắc Ba chỗ hay hiểu nhầm Three misconceptions first readers hit

Phần này thuộc mức đọc Đầy đủ: nó đối chiếu điều người đọc thường nghĩ với điều bản văn thật sự nói.

Phần này hơi khó, bạn có thể bỏ qua và quay lại sau. Nhớ nhé: hiểu chậm mà chắc vẫn hơn.

This block belongs to the Đầy đủ (full) reading level: it sets what readers usually assume against what the text actually says.

“Trong Linux, mọi thứ đều là tập tin” "In Linux, everything is a file"

Ngộ nhận: mọi phần cứng trong máy đều có một tệp tương ứng trong /dev.

Bản văn nói: không phải thiết bị nào cũng có tập tin thiết bị, vì giao diện nhập/xuất khối và ký tự không phù hợp trong mọi trường hợp; giao diện mạng là ví dụ Ward nêu đích danh.1 Ông còn nói rõ ngay ở mục 3.1 rằng có giới hạn cho những gì bạn làm được với giao diện tập tin, nên không phải mọi khả năng của thiết bị đều với tới được bằng nhập/xuất tệp tiêu chuẩn.1

Misconception: every piece of hardware in the machine has a corresponding file in /dev.

The text says: not all devices have device files, because the block and character I/O interfaces are not appropriate in all cases; network interfaces are the example Ward names.1 He states plainly in section 3.1 that there is a limit to what you can do with a file interface, so not all device capabilities are reachable with standard file I/O.1

“/dev/sda luôn là cùng một cái đĩa” "/dev/sda is always the same disk"

Ngộ nhận: tên thiết bị trong /dev gắn chặt với một phần cứng cụ thể, nên dùng nó trong fstab là an toàn.

Bản văn nói: nhân gán thiết bị theo thứ tự nó tìm thấy chúng, nên một thiết bị có thể mang tên khác nhau giữa các lần khởi động.1 Ward dựng hẳn một kịch bản: nếu /dev/sdb hỏng và bị tháo ra, /dev/sdc cũ dời thành /dev/sdb và bạn phải sửa fstab nếu đã tham chiếu trực tiếp tên thiết bị.1 Lời giải mà nhiều hệ Linux dùng: UUID và/hoặc ánh xạ thiết bị ổn định của LVM.110 Cùng tinh thần đó, trang man udev(7) nói thẳng rằng nhân thường chỉ gán những cái tên khó đoán dựa trên thứ tự phát hiện, và các liên kết tượng trưng có nghĩa mới là cách nhận diện thiết bị đáng tin cậy.19

Misconception: a name in /dev is bound to one specific piece of hardware, so using it in fstab is safe.

The text says: the kernel assigns devices in the order in which they are found, so a device may have a different name between reboots.1 Ward builds the scenario out: if /dev/sdb dies and you remove it, the former /dev/sdc moves to /dev/sdb and you must edit fstab if you referred to device names directly.1 The fix many Linux systems use: UUIDs and/or LVM's stable disk device mapping.110 In the same spirit, the udev(7) page states that the kernel usually just assigns unpredictable names based on the order of discovery, and meaningful symlinks are what make devices reliably identifiable.19

“udev tạo ra các tập tin trong /dev” "udev creates the files in /dev"

Ngộ nhận: udevd là chương trình sinh ra nút thiết bị; không có nó thì /dev rỗng.

Bản văn nói: trong thiết kế devtmpfs, nhân tạo tập tin thiết bị khi cần và báo cho udevd; nhận tín hiệu đó, udevd không tạo tập tin thiết bị mà thực hiện khởi tạo, đặt quyền, báo cho tiến trình khác, và tạo thêm liên kết tượng trưng.1 Sự phân vai này tồn tại chính vì cái vòng luẩn quẩn Ward mô tả: udevd phải chạy rất sớm, nhưng không thể phụ thuộc vào bất kỳ thiết bị nào mà chính nó phải tạo.1

Misconception: udevd is the program that brings device nodes into being; without it /dev is empty.

The text says: under devtmpfs, the kernel creates device files as necessary and notifies udevd; on receiving that signal udevd does not create the device files — it performs initialization, sets permissions, notifies other processes and adds symbolic links.1 The split exists precisely because of the circularity Ward describes: udevd must start very early, yet cannot depend on any devices that it is supposed to create.1

Tự kiểm tra Self-check

Bạn đã đọc được /dev chưa? Thử trả lời xem nào Can you read /dev yet?

Trả lời bằng lời của bạn, không tra sách. Nếu một câu khiến bạn ngập ngừng, đó chính là mục bạn nên đọc lại.

Thử trả lời miệng thôi, không cần giở lại. Câu nào bí thì quay lại đọc phần đó nhé. Nhớ nhé: chỗ bí chính là chỗ cần học.

Answer in your own words, without looking back. Whichever question makes you hesitate points at the section you should reread.

  1. Bốn ký tự đầu dòng nào cho bạn biết một tệp là thiết bị, và mỗi ký tự nghĩa là gì?

    Gợi ý sâu hơn: loại nào không mang số major và minor trong danh sách ls -l?

  2. Khác biệt về mục đích giữa /dev/sda và đường dẫn /sys/devices/... tương ứng là gì?

    Gợi ý sâu hơn: tệp nào trong thư mục sysfs của thiết bị nối hai cây lại với nhau, và nó chứa gì?

  3. Vì sao Ward đặt cảnh báo cho dd, và tuỳ chọn nào giữ bạn khỏi việc chép vô tận từ /dev/zero?

    Gợi ý sâu hơn: cú pháp if=/of= bắt nguồn từ đâu, và vì sao nó không giống mọi lệnh Unix khác?

  4. Trong lược đồ devtmpfs, ai tạo tập tin thiết bị — nhân hay udevd? Và bên còn lại làm gì?

    Gợi ý sâu hơn: nêu cái vòng luẩn quẩn về thời điểm khởi động mà thiết kế này giải quyết.

  5. Trong một luật udev, làm sao phân biệt một điều kiện với một chỉ thị chỉ bằng mắt?

    Gợi ý sâu hơn: biểu thức ENV{ID_SERIAL}!="?*" đúng khi nào, và vì sao luật lại cần nó?

  6. Vì sao một ổ USB flash lại hiện ra với tên bắt đầu bằng sd, dù nó không phải đĩa SCSI?

    Gợi ý sâu hơn: mắt xích nào nối hệ con USB với hệ con SCSI, và vì sao hai hệ không dùng chung một trình điều khiển?

  7. Vì sao Linux ghi đĩa quang bằng chương trình không gian người dùng qua /dev/sg* thay vì một trình điều khiển trong nhân?

    Gợi ý sâu hơn: lập luận này lặp lại nguyên tắc nào của Chương 1 về độ phức tạp trong nhân?

  1. Thư mục /dev dùng để làm gì, và /sys dùng để làm gì?

  2. Chữ cái đầu dòng trong ls -l cho bạn biết điều gì?

  3. Ghi vào /dev/null thì dữ liệu đi đâu?

  4. Khi bạn cắm một cái USB vào máy, ai là người đặt tên cho nó?

  5. Vì sao tên sda, sdb có thể đổi giữa các lần khởi động?

  6. dd dùng để làm gì, và vì sao phải cẩn thận với nó?

  1. Which four leading characters tell you a file is a device, and what does each mean?

  2. What is the difference in purpose between /dev/sda and its corresponding /sys/devices/... path?

  3. Why does Ward attach a warning to dd, and which option keeps you from copying endlessly from /dev/zero?

  4. Under devtmpfs, who creates the device files — the kernel or udevd? And what does the other one do?

  5. In a udev rule, how do you tell a conditional from a directive at a glance?

  6. Why does a USB flash drive show up with an sd name when it isn't a SCSI disk?

  7. Why does Linux burn optical discs with a user-space program through /dev/sg* rather than a kernel driver?

Khép lại chương Closing the chapter

Nhân trình thiết bị ra như tập tin để bạn dùng được chúng mà không cần là lập trình viên; sysfs trình chúng ra như thuộc tính để bạn biết chúng thực sự là gì; và udev đứng giữa, đưa quyết định ra khỏi nhân và trao cho không gian người dùng.1 Nhưng ngay cả hình cuối cùng của chương cũng chưa phải toàn cảnh — còn nhiều tầng nữa phía trên thiết bị khối.1

Nhân biến đồ thật thành tập tin để bạn dùng được mà không cần biết lập trình; /sys kể cho bạn đó là đồ gì; udev thì đặt tên và đặt quyền. Và phía trên tất cả vẫn còn mấy tầng nữa. Nhớ nhé: /dev để dùng, /sys để xem, udev để sắp xếp — và chương sau còn hay hơn.

The kernel presents devices as files so you can use them without being a programmer; sysfs presents them as attributes so you can know what they really are; and udev stands between, moving the decisions out of the kernel and into user space.1 Yet even the chapter's last figure is not the whole picture — there are more layers on top of the block devices.1