Bản đồ toàn cuốn · 17 chương · 5 mạch Whole-book map · 17 chapters · 5 movements
Mười bảy chương, một động tác lặp lại Cả cuốn sách vẽ gọn trên một trang Seventeen chapters, one move repeated
Đọc tuần tự, How Linux Works trông như mười bảy chủ đề rời nhau: lệnh, thiết bị, đĩa, khởi động, tiến trình, mạng, kịch bản, desktop, trình biên dịch, ảo hoá. Đọc như một lập luận thì nó là một động tác được lặp lại: nhân gom một đám hiện thực lộn xộn lại sau đúng một giao diện thống nhất, rồi để không gian người dùng làm phần còn lại.1 Trang này bày cả mười bảy chương ra cùng lúc để nhìn thấy động tác đó — và gọi tên những sợi chỉ chạy xuyên nhiều chương mà lối đọc tuần tự dễ bỏ sót.
Cuốn sách có mười bảy chương, nghe thì nhiều. Nhưng chúng kể cùng một câu chuyện: máy tính có rất nhiều loại đồ khác nhau, và Linux làm cho chúng trông giống nhau để bạn dùng cùng một cách. Trang này vẽ cả câu chuyện ra một lần. Nhớ nhé: nhìn cả khu rừng trước, rồi hãy bước vào từng cái cây.
Read sequentially, How Linux Works looks like seventeen separate subjects: commands, devices, disks, booting, processes, networking, scripts, the desktop, compilers, virtualization. Read as an argument, it is one move repeated: the kernel gathers a messy plurality of implementations behind a single uniform interface, and lets user space do the rest.1 This page lays all seventeen chapters out at once so that move becomes visible — and names the threads running across chapters that sequential reading tends to miss.
Điều làm lập luận này không phải là suy diễn của trang này: Ward tự nói ra sự song song ấy ít nhất hai lần. Ở Chương 4 ông viết rằng lớp trừu tượng Virtual File System (VFS) đảm bảo mọi hiện thực hệ thống tập tin đều hỗ trợ một giao diện chuẩn, “giống như cách phân hệ SCSI chuẩn hoá giao tiếp giữa các loại thiết bị khác nhau”.1 Ở Chương 9 ông mở đầu bằng nhận xét rằng nhân Linux xử lý mạng “theo cách tương tự phân hệ SCSI đã mô tả ở Chương 3”.1 Hai câu đó khâu Chương 3, Chương 4 và Chương 9 lại thành một ý duy nhất.
Luận đề của bản đồ: mọi chương của cuốn sách hoặc (a) đặt tên cho một tầng, hoặc (b) đi một chuỗi xuyên qua các tầng, hoặc (c) chỉ cho bạn tập tin và lệnh để soi vào một tầng. Biết một chủ đề thuộc loại nào là đã biết phải đọc nó thế nào.
Ý chính: mỗi chương làm một trong ba việc — đặt tên cho một tầng, kể một chuỗi việc xảy ra, hoặc dạy bạn lệnh để nhìn vào bên trong. Nhớ nhé: ba kiểu chương, thế thôi.
The map's thesis: every chapter either (a) names a layer, (b) walks a sequence through the layers, or (c) shows you the file and the command that let you look inside a layer. Knowing which kind a subject is tells you how to read it.
Lập luận · 00 The argument · 00
Cuốn sách không dạy mười bảy chủ đề — nó dạy một cách nhìn, mười bảy lần Một cách nhìn duy nhất, được dùng đi dùng lại The book does not teach seventeen subjects — it teaches one way of looking, seventeen times
Ward mở sách bằng trừu tượng hoá: bỏ qua phần lớn chi tiết cấu tạo của một bộ phận để tập trung vào mục đích và cách vận hành cơ bản của nó. Từ đó ông cắt hệ thống đang chạy thành ba tầng — phần cứng, nhân, không gian người dùng — và nói thẳng rằng “phần lớn hành động thật sự trên một hệ thống Linux diễn ra ở không gian người dùng”.1 Mười sáu chương còn lại là mười sáu lần áp cùng động tác cắt tầng đó vào một vùng khác của hệ thống.
Ward bắt đầu bằng một mẹo: đừng cố hiểu hết một lúc, hãy bỏ bớt chi tiết và chỉ giữ lại “cái này để làm gì”. Rồi ông chia máy thành ba tầng: máy thật, nhân, và chỗ chương trình của bạn chạy. Nhớ nhé: cả cuốn sách chỉ là dùng đúng mẹo đó mười bảy lần.
Ward opens with abstraction: ignore most of the details that make up a piece and concentrate on its basic purpose and operation. From there he cuts the running system into three levels — hardware, kernel, user space — and says plainly that "most of the real action on a Linux system happens in user space."1 The remaining sixteen chapters are sixteen applications of that same cut to a different region of the system.
Ba kiểu chương. (a) Đặt tên cho một tầng — Chương 1, 3, 4, 9, 14 vẽ ra một ngăn xếp và gọi tên từng nấc. (b) Đi một chuỗi — Chương 5, 6, 16 kể một trình tự có thứ tự, từ đầu đến cuối. (c) Đưa bạn dụng cụ soi — Chương 2, 7, 8, 10, 11, 12, 13, 15 phần lớn là tập tin cấu hình và lệnh chẩn đoán. Chương 17 là chương duy nhất làm cả ba cùng lúc.
Nói đơn giản. Có chương vẽ bản đồ, có chương kể chuyện theo thứ tự, có chương đưa bạn cái đèn pin để soi. Nhớ nhé: biết chương thuộc loại nào thì biết nên đọc nhanh hay đọc chậm.
Three kinds of chapter. (a) Naming a layer — Chapters 1, 3, 4, 9 and 14 draw a stack and name each rung. (b) Walking a sequence — Chapters 5, 6 and 16 narrate an ordered series from start to finish. (c) Handing you the instruments — Chapters 2, 7, 8, 10, 11, 12, 13 and 15 are mostly configuration files and diagnostic commands. Chapter 17 is the only one that does all three at once.
phần cứng → nhân (chế độ nhân) → lời gọi hệ thống → không gian người dùng (chế độ người dùng)
máy thật → nhân → cánh cửa → chương trình của bạn
hardware → kernel (kernel mode) → system call → user space (user mode)
Đường ranh giới duy nhất đó có một định nghĩa công khai: trang syscalls(2) gọi lời gọi hệ thống là “giao diện nền tảng giữa một ứng dụng và nhân Linux”.3 Mọi thứ trong cuốn sách nằm ở đúng một phía của ranh giới ấy.
Cách dùng trang này. Năm mạch bên dưới gom mười bảy chương theo lập luận, không theo mục lục: mỗi mạch nói rõ nó thêm gì vào cái trước. Mỗi thẻ chương mở thẳng vào trang đồng hành của chương đó. Nếu bạn đang truy một khái niệm cụ thể, mục Sợi chỉ xuyên suốt chỉ ra nó xuất hiện ở những chương nào — vì hầu hết khái niệm quan trọng của cuốn sách xuất hiện nhiều hơn một lần, dưới nhiều cái tên khác nhau.
Bấm vào tên chương là mở cả chương. Nếu bạn muốn tìm một ý, kéo xuống mục “Sợi chỉ xuyên suốt” — ở đó ghi ý đó nằm ở những chương nào. Nhớ nhé: không bắt buộc phải đọc theo thứ tự 1, 2, 3.
How to use this page. The five movements below group the seventeen chapters by argument, not by table of contents: each says what it adds to the one before. Every chapter card opens that chapter's companion page directly. If you are hunting a specific idea, the through-lines section names every chapter it appears in — because most of the book's important ideas appear more than once, under more than one name.
Mạch 1 · Chương 1–2 Movement 1 · Chapters 1–2
Một ý tưởng, hai chế độ, và bộ lệnh để đi lại giữa chúng Ba tầng, và những lệnh đầu tiên One idea, two modes, and the commands that walk between them
Hai chương này thêm vào từ vựng. Chương 1 cho ba tầng và ranh giới chế độ nhân / chế độ người dùng; Chương 2 cho bộ động từ để đi lại trong không gian người dùng. Ward nói rõ Chương 2 là “tài liệu sơ bộ”, nhưng đáng lật qua — nhất là phần cấu trúc thư mục ở Mục 2.19 — vì nhiều lệnh trong đó tương ứng trực tiếp với lời gọi hệ thống, nên biết lệnh cũng là biết nhân.1
Hai chương đầu dạy bạn từ vựng. Chương 1 cho bạn cái bản đồ ba tầng; Chương 2 cho bạn mấy chục lệnh để tự đi lại. Nhớ nhé: học từ trước, rồi mới nói thành câu.
These two chapters supply the vocabulary. Chapter 1 gives the three levels and the kernel-mode/user-mode boundary; Chapter 2 gives the verbs for moving around user space. Ward calls Chapter 2 "preliminary material" but worth flipping through — especially the directory hierarchy in Section 2.19 — because many of its commands correspond directly to system calls, so knowing the commands boosts your understanding of the kernel.1
Điều mạch này thêm vào: một trục toạ độ. Sau hai chương này, mọi câu hỏi về Linux đều có thể hỏi lại thành “thứ đó nằm ở tầng nào, và ở phía nào của ranh giới chế độ?”
Nói đơn giản. Bạn có một cái thước để đo: thứ này nằm tầng trên hay tầng dưới? Nhớ nhé: hỏi đúng câu hỏi là xong một nửa.
What this movement adds: a coordinate system. After these two chapters, every Linux question can be restated as "which level does this live on, and which side of the mode boundary?"
trừu tượng hoá → tầng → ba tầng → chế độ nhân | chế độ người dùng → lệnh ≈ lời gọi hệ thống
bỏ bớt chi tiết → xếp thành tầng → ba tầng → lệnh để soi từng tầng
abstraction → layers → three levels → kernel mode | user mode → command ≈ system call
-
Chapter 1
Ba tầng, và ranh giới duy nhất đáng nhớ Máy Linux là một toà nhà ba tầng Three levels, and the one boundary worth memorising
Phần cứng ở dưới, nhân ở giữa, không gian người dùng ở trên. Nhân chạy ở chế độ nhân với quyền truy cập không hạn chế vào bộ xử lý; tiến trình người dùng chạy ở chế độ người dùng, bị giới hạn vào một tập nhỏ hơn nhiều.1 Ward khẳng định rằng phần lớn hành động thật sự diễn ra ở tầng trên cùng.1
Tầng dưới là máy thật. Tầng giữa là nhân — người trọng tài. Tầng trên là chỗ trình duyệt, trò chơi, cửa sổ dòng lệnh của bạn chạy. Nhớ nhé: gần như mọi thứ bạn thấy đều ở tầng trên cùng.
Hardware at the base, the kernel in the middle, user space on top. The kernel runs in kernel mode with unrestricted access to the processor; user processes run in user mode, restricted to a much smaller subset.1 Ward insists most of the real action happens on the top level.1
Dùng khi nàoWhere you use it Khoanh vùng sự cố: loại trừ từng tầng một, đúng như Ward loại trừ xe, cách lái, rồi mặt đường.1 Narrowing a fault: eliminate one level at a time, exactly as Ward eliminates the car, the driving, then the road.1
-
Chapter 2
Lệnh Unix và cấu trúc thư mục Những lệnh đầu tiên phải biết Unix commands and the directory hierarchy
Ward dạy lệnh Unix chứ không phải lệnh riêng của Linux — vì Linux “về bản chất là một nhánh Unix”, và các mở rộng giao diện riêng của từng bản phân phối thường kém ổn định.1 Kèm theo là shell, đường dẫn tìm lệnh, quyền truy cập, và cây thư mục gốc.
Chương này dạy mấy chục lệnh cơ bản: xem thư mục, đổi thư mục, đọc tập tin, tìm chữ. Nó cũng dạy bạn thư mục của hệ thống bày biện ra sao. Nhớ nhé: đây là chương để lật qua chứ không phải để học thuộc.
Ward teaches Unix commands rather than Linux-specific ones — because Linux "is a Unix flavor at heart," and distribution-specific interface extensions tend to be unstable.1 Along with them come the shell, the command path, permissions, and the root directory tree.
Dùng khi nàoWhere you use it Mọi chương sau. Quyền truy cập học ở đây quay lại thành cơ chế cô lập ở Chương 8 và Chương 17. Every later chapter. The permissions learned here come back as an isolation mechanism in Chapters 8 and 17.
Mạch 2 · Chương 3–4 Movement 2 · Chapters 3–4
Nhân biến phần cứng thành thứ bạn có thể cat được
Ổ cứng, chuột, máy in — tất cả hiện ra thành tập tin
The kernel turns hardware into something you can cat
Đây là chỗ động tác trung tâm của cuốn sách lộ ra lần đầu. Ward viết rằng thao tác với hầu hết thiết bị trên hệ Unix là dễ, vì nhân trình bày nhiều giao diện I/O của thiết bị cho tiến trình người dùng dưới dạng tập tin.1 Chương 4 làm đúng động tác đó một lần nữa, chỉ đổi đối tượng: lớp Virtual File System bắt mọi hiện thực hệ thống tập tin phải hỗ trợ một giao diện chuẩn, để ứng dụng truy cập tập tin và thư mục theo cùng một cách.16
Linux có một mẹo rất lớn: nó làm cho mọi thứ trông giống một tập tin. Loa, ổ cứng, cái ổ USB bạn vừa cắm — đều nằm trong thư mục /dev và mở ra như tập tin. Nhớ nhé: biết mở tập tin là gần như biết dùng cả máy.
This is where the book's central move first shows itself. Ward writes that it is easy to manipulate most devices on a Unix system because the kernel presents many device I/O interfaces to user processes as files.1 Chapter 4 performs the same move on a different object: the Virtual File System layer makes every filesystem implementation support one standard interface, so applications reach files and directories the same way regardless.16
Điều mạch này thêm vào: một hình dạng. Tầng ở Mạch 1 còn trừu tượng; ở đây nó có mặt mũi cụ thể — một đường dẫn trong /dev, một mục trong /sys, một điểm gắn kết trong cây thư mục.
Nói đơn giản. Tầng giờ có hình: nó là một cái tên trong thư mục. Nhớ nhé: cái gì cũng có đường dẫn.
What this movement adds: a shape. The levels of Movement 1 were still abstract; here they acquire a concrete face — a path under /dev, an entry under /sys, a mount point in the directory tree.
Hai hệ thống tập tin giả trong mạch này làm hai việc khác nhau và rất dễ lẫn. /dev là nơi thao tác với thiết bị qua các phép đọc/ghi thông thường; /sys (sysfs) là nơi xem cấu trúc dữ liệu của nhân — trang sysfs(5) mô tả nó là một hệ thống tập tin giả cung cấp giao diện tới các cấu trúc dữ liệu bên trong nhân.4 Ward dựng đúng sự phân công đó: tập tin thiết bị truyền thống trước, rồi sysfs như nguồn thông tin cấu hình.1
phần cứng → trình điều khiển → tập tin thiết bị /dev · sysfs /sys → udev → tiến trình người dùng
ổ cứng → nhân → một cái tên trong /dev → chương trình của bạn
hardware → driver → device file /dev · sysfs /sys → udev → user process
bảng phân vùng → phân vùng → hệ thống tập tin → VFS → open(), read()
partition table → partition → filesystem → VFS → open(), read()
-
Chapter 3
Thiết bị: tập tin, sysfs, và udev Thiết bị hiện ra thành tập tin Devices: files, sysfs, and udev
Ward bắt đầu bằng hệ thống tập tin thiết bị truyền thống, rồi chuyển sang
sysfs— nơi nhân công bố thông tin cấu hình thiết bị.14 Mắt xích còn lại là udev: nhân gửi một thông điệp lên một tiến trình không gian người dùng, và tiến trình đó tự động cấu hình thiết bị mới.15Cắm ổ USB vào, tự nhiên nó hiện ra. Ai làm việc đó? Nhân báo tin, rồi một chương trình tên udev nghe tin và dựng sẵn mọi thứ cho bạn. Nhớ nhé: nhân báo tin, chương trình ở tầng trên mới quyết định làm gì.
Ward starts from the traditional system of device files, then moves to
sysfs, through which the kernel publishes device configuration information.14 The remaining link is udev: the kernel sends a message to a user-space process, and that process automatically configures the new device.15Điểm nốiWhere it connects Phân hệ SCSI ba tầng trình bày ở đây là khuôn mẫu mà Chương 4 và Chương 9 sẽ mượn lại nguyên vẹn.1 The three-layer SCSI subsystem laid out here is the template Chapters 4 and 9 borrow wholesale.1
-
Chapter 4
Đĩa và hệ thống tập tin: bốn nấc từ đĩa tới tập tin Ổ cứng biến thành thư mục thế nào Disks and filesystems: four rungs from disk to file
Ward vẽ một sơ đồ đĩa Linux điển hình với các nấc lồng nhau: bảng phân vùng, phân vùng, cấu trúc dữ liệu của hệ thống tập tin, rồi dữ liệu tập tin.1 Lên trên cùng là VFS — lớp trừu tượng khiến số lượng hệ thống tập tin mà Linux hỗ trợ có thể lớn bất thường mà ứng dụng không phải biết gì.16
Một cái ổ cứng được chia thành mấy mảnh, mỗi mảnh được “định dạng”, rồi mới gắn vào cây thư mục để bạn mở ra xem. Nhớ nhé: đĩa → mảnh → định dạng → thư mục, bốn nấc là hết.
Ward draws a typical Linux disk as nested rungs: partition table, partition, filesystem data structures, then file data.1 Above them sits VFS — the abstraction layer that has let Linux support an extraordinarily large number of filesystems without applications noticing.16
Điểm nốiWhere it connects Ward nói thẳng rằng VFS làm với hệ thống tập tin đúng việc mà phân hệ SCSI làm với thiết bị.1 Cùng một câu đó sẽ xuất hiện lại ở đầu Chương 9. Ward says outright that VFS does for filesystems what the SCSI subsystem does for devices.1 The same sentence reappears at the head of Chapter 9.
Mạch 3 · Chương 5–8 Movement 3 · Chapters 5–8
Từ nguồn điện tới dấu nhắc đăng nhập — rồi ai chia tài nguyên Bấm nút nguồn xong thì chuyện gì xảy ra From power-on to a login prompt — and who divides the resources afterwards
Đây là mạch theo thời gian, và là mạch duy nhất trong sách có một trình tự bắt buộc. Ward tóm cả quá trình khởi động thành bảy bước, trong đó bước thứ năm — nhân khởi chạy một chương trình tên init với mã tiến trình bằng 1 — được ông đánh dấu là điểm bắt đầu của không gian người dùng.1 Trang boot(7) chia cùng một trình tự thành các pha phần cứng → bộ nạp hệ điều hành → nhân → tiến trình người dùng gốc, khớp với cách kể của Ward.7
Máy không “tự nhiên” chạy được. Nó đi qua từng bước có tên: phần cứng tỉnh dậy → một chương trình nhỏ tìm nhân → nhân dựng thiết bị và mở ổ đĩa → nhân gọi chương trình đầu tiên → chương trình đó gọi mọi chương trình khác. Nhớ nhé: bảy bước, và bước thứ năm là lúc “phần của bạn” bắt đầu.
This is the temporal movement, and the only one in the book with a mandatory order. Ward compresses the whole boot into seven steps, of which the fifth — the kernel starting a program called init with process ID 1 — he marks as the user space start.1 The boot(7) manual page divides the same sequence into hardware → OS loader → kernel → root user-space process phases, matching Ward's telling.7
Điều mạch này thêm vào: thứ tự và sự khan hiếm. Chương 5–7 cho biết cái gì xảy ra trước cái gì; Chương 8 cho biết sau khi mọi thứ đã chạy thì ai phân xử khi chúng tranh nhau CPU, bộ nhớ và I/O.1
Nói đơn giản. Đầu tiên là “ai chạy trước”, sau đó là “ai được bao nhiêu”. Nhớ nhé: thứ tự trước, chia phần sau.
What this movement adds: order and scarcity. Chapters 5–7 establish what happens before what; Chapter 8 establishes who arbitrates once everything is running and they start competing for CPU, memory and I/O.1
Chỗ dễ bỏ sót: Ward viết rằng bản thân nhân cũng là một tài nguyên — một tài nguyên phần mềm mà tiến trình dùng để làm những việc như tạo tiến trình mới và liên lạc với tiến trình khác.1 Nhận xét nhỏ đó là bản lề nối Chương 8 với Chương 17: nếu nhân là tài nguyên chia sẻ được, thì nhiều “hệ thống” có thể dùng chung một nhân — và đó đúng là định nghĩa của container.1
firmware → bộ nạp khởi động → nhân → gắn hệ thống tập tin gốc → init (PID 1) → dịch vụ → dấu nhắc đăng nhập
bật nguồn → tìm nhân → nhân tỉnh dậy → chương trình số 1 → mọi chương trình khác
firmware → boot loader → kernel → mount root filesystem → init (PID 1) → services → login prompt
tài nguyên = CPU | bộ nhớ | I/O + nhân (tài nguyên phần mềm)
resources = CPU | memory | I/O + the kernel (a software resource)
-
Chapter 5
Nhân khởi động: bảy bước, và bốn bước đầu bị giấu Nhân tỉnh dậy thế nào The kernel boots: seven steps, the first four hidden
Bộ nạp khởi động tìm ảnh nhân trên đĩa, nạp vào bộ nhớ, khởi chạy; nhân khởi tạo thiết bị và trình điều khiển, gắn hệ thống tập tin gốc, rồi gọi
init.1 Ward cảnh báo rằng hành vi mặc định của nhiều bản phân phối khiến vài giai đoạn đầu gần như không thể quan sát khi chúng đang diễn ra — bạn thường chỉ xem lại được sau khi đã đăng nhập.1Có một chương trình tí hon nằm sẵn trên ổ đĩa, nhiệm vụ duy nhất của nó là tìm và bật “nhân” lên. Sau đó nhân mới dựng phần còn lại. Nhớ nhé: mấy bước đầu chạy quá nhanh, nên phải xem lại nhật ký chứ khó nhìn trực tiếp.
The boot loader finds the kernel image on disk, loads it into memory and starts it; the kernel initialises devices and drivers, mounts the root filesystem, then starts
init.1 Ward warns that default distribution behaviour makes the first few stages nearly impossible to watch as they happen — usually you only get a good look after logging in.1Điểm nốiWhere it connects Bước “nhân khởi tạo thiết bị và trình điều khiển” chính là Chương 3 đang chạy; bước “gắn hệ thống tập tin gốc” chính là Chương 4 đang chạy. The step "the kernel initialises devices and drivers" is Chapter 3 executing; "mounts the root filesystem" is Chapter 4 executing.
-
Chapter 6
Không gian người dùng khởi động: năm nấc, và một đồ thị phụ thuộc Chương trình đầu tiên gọi mọi chương trình khác User space starts: five rungs, and a dependency graph
Thứ tự đại lược:
init→ dịch vụ cấp thấp thiết yếu (udevd,syslogd) → cấu hình mạng → dịch vụ tầng giữa và tầng cao (cron, in ấn) → dấu nhắc đăng nhập, giao diện đồ hoạ, ứng dụng cấp cao.1 Trên mọi bản phát hành hiện thời của các bản phân phối lớn, hiện thực chuẩn củainitlà systemd.19Sau khi nhân xong việc, một chương trình tên init nhận nhiệm vụ gọi tất cả chương trình khác dậy — theo thứ tự, cái nào cần cái nào thì gọi trước. Nhớ nhé: init là “người quản lý” chứ không phải người làm.
The rough order:
init→ essential low-level services (udevd,syslogd) → network configuration → mid- and high-level services (cron, printing) → login prompts, GUIs and high-level applications.1 On all current releases of the major distributions, the standard implementation ofinitis systemd.19Điểm nốiWhere it connects systemd không chỉ quản tiến trình: nó quản cả điểm gắn kết hệ thống tập tin, socket mạng và bộ hẹn giờ — nghĩa là nó ăn vào Chương 4, Chương 9 và Chương 7 cùng lúc.18 systemd manages more than processes: it manages filesystem mounts, network sockets and timers too — so it reaches into Chapters 4, 9 and 7 at once.18
-
Chapter 7
Cấu hình hệ thống: nhật ký, thời gian, tác vụ định kỳ, người dùng Thư mục
/etcvà mấy tập tin thật sự quan trọng System configuration: logging, time, batch jobs, usersWard trấn an ngay từ câu đầu: nhìn vào
/etcthì choáng, nhưng chỉ vài tập tin là cơ bản.1 Chương này lấy hạ tầng của Chương 4 và đưa nó tới phần mềm không gian người dùng mà ta thật sự dùng hằng ngày. Sự lan rộng của systemd đã giảm số lượng daemon độc lập — chẳng hạnsyslogdnay phần lớn được thay bằngjournaldnằm sẵn trong systemd.1Thư mục
/etclà “tủ hồ sơ” của máy: ai được đăng nhập, mấy giờ, việc gì chạy lúc nửa đêm, nhật ký ghi ở đâu. Nhìn thì rối, nhưng chỉ vài tờ là quan trọng. Nhớ nhé: sửa máy thường là sửa một tập tin trong/etc.Ward reassures you in his first sentence:
/etclooks overwhelming, but only a few files are fundamental.1 The chapter takes the infrastructure of Chapter 4 and makes it available to the user-space software we actually interact with. The spread of systemd has reduced the number of independent daemons —syslogd, for instance, is now largely replaced byjournald, built into systemd.1Lưu ý bố cụcA note on placement Ward cố ý không đặt mạng vào chương này: mạng là “một khối xây dựng riêng của hệ thống”, để dành cho Chương 9.1 Ward deliberately keeps networking out of this chapter: the network is "a separate building block of the system," saved for Chapter 9.1
-
Chapter 8
Tiến trình và tài nguyên: ba thứ khan hiếm, một trọng tài Ai được dùng máy bao nhiêu Processes and resources: three scarce things, one arbiter
Có ba loại tài nguyên phần cứng cơ bản — CPU, bộ nhớ, I/O — và việc của nhân là phân bổ chúng một cách công bằng.1 Công cụ giới hạn hiện đại là cgroup: bạn đặt nhiều tiến trình vào một nhóm rồi áp trần cho cả nhóm.110 Ward nhấn mạnh cgroup nằm ở không gian nhân, dù trên thực tế phần lớn cgroup trên máy bạn do systemd quản.1
Máy chỉ có từng ấy sức: bộ xử lý, bộ nhớ, và đường ra đĩa. Nhân là người chia lượt sao cho không ai chiếm hết. Nhớ nhé: máy chậm không phải lúc nào cũng vì yếu — có khi chỉ vì một chương trình đang giành phần.
There are three basic kinds of hardware resource — CPU, memory and I/O — and the kernel's job is to allocate them fairly.1 The modern limiting tool is the cgroup: you place several processes into a group and cap the group as a whole.110 Ward stresses that cgroups live in kernel space, even though most cgroups on your machine are in practice managed by systemd.1
Lời khuyên dễ bị bỏ quaThe advice most readers skip Ward dặn: đừng để bị cuốn vào tối ưu hoá. Chỉnh một hệ thống vốn đang chạy đúng là phí thời gian; hãy hiểu công cụ đang đo cái gì.1 Ward's warning: don't get distracted by performance. Tuning a system that already works correctly is a waste of time; understand what the tools actually measure instead.1
cgroups v1 vs v2
Ward ghi rõ rằng cả hai phiên bản cgroup đều đang được dùng song song, và điều đó gây lẫn lộn thật sự khi đọc
/sys/fs/cgroup.1 Tài liệu nhân mô tả riêng giao diện v2 hợp nhất.22Nơi nhìn thấy tiến trình
Mọi con số mà
psvàtophiển thị đều lấy từ hệ thống tập tin giả/proc— một biểu hiện nữa của cùng động tác “trình bày trạng thái nhân dưới dạng tập tin”.20
Mạch 4 · Chương 9–12 Movement 4 · Chapters 9–12
Mạng: lại là tầng, lại là tập tin — chỉ khác là tầng nằm trên hai máy Máy của bạn nói chuyện với máy khác bằng cách nào Networking: layers again, files again — only now the stack spans two machines
Ward mở Chương 9 bằng hai câu hỏi nền tảng: máy gửi làm sao biết gửi đi đâu, và máy nhận làm sao biết mình vừa nhận cái gì. Câu trả lời là một loạt thành phần được xếp thành tầng mạng chồng lên nhau — và ông nói ngay rằng nhân Linux xử lý mạng theo cách tương tự phân hệ SCSI ở Chương 3.1 Vì mỗi tầng khá độc lập, có thể ghép rất nhiều tổ hợp thành phần khác nhau — và chính điều đó làm cấu hình mạng trở nên rắc rối.1
Muốn gửi thư thì phải có địa chỉ, và người nhận phải hiểu được thư viết gì. Mạng máy tính giải quyết hai chuyện đó bằng cách chia việc thành từng tầng, mỗi tầng lo một phần. Nhớ nhé: mạng cũng chia tầng y hệt phần còn lại của hệ thống.
Ward opens Chapter 9 with two fundamental questions: how does the sending computer know where to send, and how does the receiving computer know what it just got. The answer is a series of components arranged into network layers stacked on each other — and he says immediately that the Linux kernel handles networking in a similar way to the SCSI subsystem of Chapter 3.1 Because each layer is fairly independent, components combine in many ways — which is exactly what makes network configuration complicated.1
Điều mạch này thêm vào: máy thứ hai. Mọi thứ học ở bốn mạch trước đều nằm trong một máy. Từ đây, ranh giới nhân / không gian người dùng được kéo dài ra thành một ranh giới thứ hai — giữa hai máy — và Ward chỉ đúng chỗ nó cắt: xử lý tầng ứng dụng diễn ra ở không gian người dùng, còn tầng vận chuyển và mọi tầng dưới chủ yếu do nhân lo.1
Nói đơn giản. Đến đây mới có máy thứ hai. Phần “nói chuyện” do chương trình của bạn lo, phần “đóng gói và gửi đi” do nhân lo. Nhớ nhé: bạn viết thư, nhân lo bưu điện.
What this movement adds: a second machine. Everything in the first four movements lives inside one box. From here the kernel/user-space boundary is stretched into a second boundary — between two hosts — and Ward marks exactly where it cuts: application layer processing happens in user space, while the transport layer and everything below are primarily handled by the kernel.1
Ward cũng cảnh báo rằng các tầng “đôi khi thấm sang nhau theo những cách kỳ lạ”, vì xử lý tuần tự đủ cả bốn tầng có thể không hiệu quả; ông lấy ví dụ TLS — tên là Transport Layer Security nhưng thực tế nằm cao hơn một tầng, ở tầng ứng dụng.1 Đây là một trong vài chỗ hiếm hoi trong sách mà mô hình tầng được thừa nhận là xấp xỉ, không phải sự thật.
tầng ứng dụng (không gian người dùng) → tầng vận chuyển TCP/UDP → tầng mạng IP → tầng vật lý
chương trình → đóng gói → tìm đường → dây mạng hoặc sóng Wi-Fi
application layer (user space) → transport layer TCP/UDP → internet layer IP → physical layer
Dữ liệu đi qua ngăn xếp ít nhất hai lần trước khi tới được chương trình ở đầu kia: xuống hết các tầng ở máy gửi, qua môi trường vật lý, rồi ngược lên ở máy nhận.1
-
Chapter 9
Mạng và cấu hình: bốn tầng, và biết tầng là biết lệnh Gói tin đi qua bốn tầng Your network and its configuration: four layers, and the layer tells you the command
Ngăn xếp internet điển hình, từ trên xuống: ứng dụng, vận chuyển, mạng (internet), vật lý.1 Tầng mạng được thiết kế độc lập phần cứng, nên một máy có thể chạy đồng thời nhiều tầng mạng độc lập — IPv4, IPv6 và các họ khác.116
Bốn tầng, từ trên xuống: chương trình nói gì, chia thư ra sao, đi đường nào, và cuối cùng là dây hay sóng. Nhớ nhé: khi mạng hỏng, hỏi trước “hỏng ở tầng nào”.
The typical internet stack, top to bottom: application, transport, network (internet), physical.1 The internet layer is meant to be hardware independent, so one host can run several independent network layers at once — IPv4, IPv6 and others.116
Điểm nốiWhere it connects Mỗi thiết lập mạng thuộc về đúng một tầng. Đó là lý do bản đồ tầng ở Chương 1 trả cổ tức ngay tại đây. Every piece of network configuration belongs to exactly one layer. That is where the layer map of Chapter 1 pays off.
-
Chapter 10
Ứng dụng mạng: tầng trên cùng, và là tầng dễ thở nhất Máy chủ và máy khách Network applications: the top layer, and the friendliest one
Máy khách và máy chủ chạy ở không gian người dùng, ngay tầng ứng dụng. Ward nói thẳng rằng vì tầng này nằm trên cùng, sát người dùng cuối, bạn có thể thấy nó dễ tiếp cận hơn Chương 9.1 Ông mở đầu bằng cách nối thẳng tới một máy chủ web không mã hoá ở cổng TCP 80 để nhìn dữ liệu di chuyển.115
Trình duyệt là “máy khách”, còn chỗ nó xin trang web là “máy chủ”. Chương này cho bạn gõ tay đúng những gì trình duyệt vẫn gửi. Nhớ nhé: máy chủ chỉ là một chương trình đang ngồi đợi ở một cái cổng có số.
Clients and servers run in user space, right at the application layer. Ward says plainly that because this layer sits at the top of the stack, close to end users, you may find it more accessible than Chapter 9.1 He opens by talking directly to an unencrypted web server on TCP port 80 to watch data move.115
Điểm nốiWhere it connects Giao diện mà chương trình dùng để chạm vào mạng vẫn là một mô tả tập tin —
socket(7)gọi socket là điểm cuối của liên lạc, được thao tác bằng chính các lời gọi hệ thống của Chương 1.143 The interface a program uses to touch the network is still a file descriptor —socket(7)calls a socket an endpoint of communication, worked through the very system calls of Chapter 1.143 -
Chapter 11
Kịch bản shell: chất keo dán toàn bộ phần còn lại Gõ được lệnh là viết được kịch bản Shell scripts: the glue holding the rest together
Ward mở chương bằng một câu gần như là lời mời: nếu bạn gõ được lệnh vào shell thì bạn viết được kịch bản shell.1 Kịch bản bắt đầu bằng dòng
#!/bin/sh— phần#!gọi là shebang — và chỉ chạy được khi đặt cả bit đọc lẫn bit thực thi.118Kịch bản chỉ là một tờ giấy ghi sẵn dãy lệnh, để máy đọc lại giúp bạn. Bạn gõ được lệnh nào thì viết được lệnh đó vào giấy. Nhớ nhé: không cần học ngôn ngữ mới, chỉ cần chép lại việc mình vẫn làm.
Ward opens the chapter with something close to an invitation: if you can enter commands into the shell, you can write shell scripts.1 A script starts with
#!/bin/sh— the#!part is called a shebang — and runs only once both the read and the execute bits are set.118Vì sao chương này ở đâyWhy the chapter sits here Ward đã báo trước từ Chương 2 rằng nhiều phần quan trọng của hệ thống thực ra là kịch bản shell.1 Nó không phải phụ lục: nó là một trong những cơ chế thi hành của hệ thống. Ward flags it back in Chapter 2: many important parts of the system are shell scripts.1 This is not an appendix; it is one of the system's execution mechanisms.
-
Chapter 12
Truyền và chia sẻ tập tin: kéo dài giao diện tập tin ra khỏi máy Chép và dùng chung tập tin giữa các máy File transfer and sharing: stretching the file interface past the machine
Ward mở chương bằng một bảng kịch bản → giải pháp: chia sẻ tạm thời,
rsyncđể sao chép định kỳ, Samba và CIFS cho thế giới Windows, SSHFS cho chia sẻ quy mô nhỏ, NFS cho hệ thống tập tin lớn trên mạng nội bộ tin cậy, và các hệ thống tập tin dựa trên FUSE cho lưu trữ đám mây.1 Điểm đáng chú ý: ông nói phần lý thuyết mới là phần đáng đọc nhất, vì nó giải thích vì sao danh sách lại dài đến thế.1Có rất nhiều cách đưa tập tin từ máy này sang máy kia, và chương này xếp chúng thành một bảng: muốn làm gì thì dùng cái nào. Nhớ nhé: nhiều lựa chọn không có nghĩa là lựa chọn nào cũng hợp với bạn.
Ward opens with a scenario-to-solution table: temporary sharing,
rsyncfor regular copying, Samba and CIFS for the Windows world, SSHFS for small-scale sharing, NFS for larger filesystems on a trusted local network, and FUSE-based filesystems for cloud storage.1 Notably, he says the theoretical sections are the ones worth most, because they explain why the list is so long.1Điểm nốiWhere it connects NFS, CIFS, SSHFS đều gắn vào cây thư mục qua đúng lớp VFS của Chương 4 — giao diện tập tin không đổi, chỉ có hiện thực bên dưới đi qua dây mạng.6 NFS, CIFS and SSHFS all attach to the directory tree through the same VFS layer of Chapter 4 — the file interface is unchanged, only the implementation beneath it now runs over a wire.6
Mạch 5 · Chương 13–17 Movement 5 · Chapters 13–17
Nơi hệ thống gặp con người — rồi cả hệ thống co lại thành một tiến trình Phần gần bạn nhất, và chương cuối gói lại tất cả Where the system meets a person — then the whole system shrinks into one process
Ward nói rõ trọng tâm của sách là những phần nằm bên dưới tiến trình máy chủ và phiên làm việc tương tác, “nhưng rốt cuộc hệ thống và người dùng phải gặp nhau ở đâu đó” — và chỗ gặp ấy là các tập tin khởi động.1 Từ đó mạch này mở rộng dần: desktop, rồi công cụ tạo ra phần mềm, rồi ảo hoá — nơi định nghĩa của chính chữ “ảo” hoá ra là cùng một định nghĩa với trừu tượng hoá ở Chương 1.1
Phần cuối nói về những thứ gần bạn nhất: cấu hình cá nhân, màn hình đồ hoạ, máy in. Rồi nó mở rộng sang cách người ta làm ra phần mềm, và cuối cùng là chạy cả một máy bên trong máy. Nhớ nhé: chương cuối dùng lại đúng mọi thứ bạn đã học.
Ward is explicit that the book's focus is what lies beneath server processes and interactive sessions, "but eventually, the system and the user have to meet somewhere" — and that meeting place is the startup files.1 From there the movement widens: the desktop, then the tools that make software, then virtualization — where the definition of "virtual" turns out to be the same definition as abstraction in Chapter 1.1
Điều mạch này thêm vào: nguồn gốc và sự đóng gói. Chương 15–16 trả lời “mấy tập tin nhị phân trên máy tôi từ đâu ra”; Chương 17 trả lời “làm sao cho nhiều hệ thống cùng chạy mà không giẫm chân nhau”.1
Nói đơn giản. Hai câu hỏi cuối: chương trình từ đâu ra, và làm sao nhét nhiều hệ thống vào một máy. Nhớ nhé: chương cuối không có gì mới — nó chỉ ghép lại.
What this movement adds: provenance and packaging. Chapters 15–16 answer "where did the binaries on my machine come from"; Chapter 17 answers "how do several systems run at once without clashing."1
Định nghĩa Ward đưa ra ở đầu Chương 17 đáng đọc cạnh định nghĩa trừu tượng hoá ở Chương 1: chữ ảo chỉ “một trung gian dịch một tầng bên dưới phức tạp hoặc phân mảnh thành một giao diện đơn giản hoá mà nhiều bên dùng chung được”.1 Đó chính là câu văn mô tả VFS, mô tả phân hệ SCSI, và mô tả ngăn xếp mạng — chỉ áp lên toàn bộ cỗ máy thay vì một bộ phận.
mã nguồn → trình biên dịch → tập tin đối tượng → bộ liên kết → tập tin thực thi + thư viện chia sẻ → ld.so lúc chạy
mã người viết → dịch sang tiếng máy → ghép lại → chương trình chạy được
source → compiler → object files → linker → executable + shared libraries → ld.so at run time
chroot + rlimit + cgroup + namespace = container (một nhân, nhiều không gian người dùng)
chroot + rlimit + cgroup + namespace = container (one kernel, many user spaces)
-
Chapter 13
Môi trường người dùng: chỗ hệ thống chạm vào một con người Mấy tập tin cấu hình riêng của bạn User environments: where the system touches a person
Tập tin khởi động đặt mặc định cho shell và các chương trình tương tác, tức là quyết định hệ thống cư xử ra sao khi ai đó đăng nhập.1 Ward đưa đúng hai nguyên tắc khi viết chúng cho người khác: đơn giản — ít tập tin, ngắn, dễ sửa mà khó hỏng — và dễ đọc, chú thích đầy đủ.1
Những tập tin bắt đầu bằng dấu chấm trong thư mục nhà của bạn là “thói quen” của máy dành riêng cho bạn. Theo thời gian chúng phình ra và sinh lỗi. Nhớ nhé: viết càng ngắn càng ít hỏng.
Startup files set defaults for the shell and other interactive programs — they determine how the system behaves when a user logs in.1 Ward gives exactly two rules for writing them for other people: simplicity — few files, short, easy to modify but hard to break — and readability, with extensive comments.1
Điểm nốiWhere it connects Đây là phiên bản cá nhân của Chương 7: cùng ý “cấu hình là một tập tin”, chỉ chuyển từ
/etcsang thư mục nhà. This is the personal edition of Chapter 7: the same "configuration is a file" idea, moved from/etcinto your home directory. -
Chapter 14
Desktop và in ấn: chương duy nhất không có ngăn xếp sâu Màn hình đồ hoạ và máy in Desktop and printing: the one chapter with no deep stack
Đây là ngoại lệ có chủ ý trong lập luận của cuốn sách. Ward viết rằng khác với lưu trữ hay mạng, dựng một cấu trúc desktop không kéo theo một ngăn xếp tầng đồ sộ; thay vào đó mỗi thành phần làm một việc cụ thể và trao đổi với thành phần khác khi cần.1 Chỗ nối chung là D-Bus, dịch vụ liên lạc giữa các tiến trình dùng ở nhiều nơi trong hệ thống.119
Phần đồ hoạ của Linux không xếp tầng như ổ đĩa hay mạng. Nó giống một nhóm bạn: mỗi người làm một việc và gọi nhau khi cần. Nhớ nhé: không phải phần nào của Linux cũng là tháp tầng.
This is a deliberate exception inside the book's argument. Ward writes that unlike storage or networking, building a desktop structure does not involve an extensive hierarchy of layers; instead each component performs a specific task and communicates with others as necessary.1 The common joint is D-Bus, an interprocess communication service used across the system.119
Vì sao ngoại lệ này quan trọngWhy the exception matters Nó chứng minh mô hình tầng là công cụ chứ không phải giáo điều: Ward bỏ nó ngay khi nó không mô tả đúng đối tượng. It shows the layer model is a tool, not dogma: Ward drops it the moment it stops describing the object.
-
Chapter 15
Công cụ phát triển: thư viện chia sẻ là phần quan trọng nhất Chương trình được tạo ra thế nào Development tools: shared libraries are the part that matters
Ward nói thẳng rằng trong cả chương, phần thư viện chia sẻ nhiều khả năng là điều quan trọng nhất bạn cần biết — nhưng muốn hiểu thư viện chia sẻ từ đâu ra thì trước hết phải biết chương trình được dựng thế nào.1 Liên kết tĩnh chép mã vào tập tin thực thi; liên kết chia sẻ chỉ để lại tham chiếu, nên một lỗ hổng vá được một lần cho tất cả.117
Nhiều chương trình dùng chung những đoạn mã giống nhau, nên người ta để chúng ra ngoài thành “thư viện”. Nhớ nhé: sửa thư viện một lần là mọi chương trình cùng được sửa.
Ward says outright that in this chapter the shared libraries discussion is likely the most important thing you need to know — but that to see where shared libraries come from you first need some background on building programs.1 Static linking copies the code into the executable; shared linking leaves only references, so one flaw is patched once for everybody.117
Điểm nốiWhere it connects Cách
ld.sođi tìm thư viện — đường tìm kiếm dựng sẵn trong tập tin thực thi, rồi bộ nhớ đệm/etc/ld.so.cache— lại là mô típ “một tập tin cấu hình quyết định hành vi” của Chương 7.117 Howld.sohunts for a library — the executable's built-in search path, then the/etc/ld.so.cachecache — is the "a config file decides the behaviour" motif of Chapter 7 again.117 -
Chapter 16
Biên dịch từ mã nguồn: vì sao phần mềm Unix phát hành dưới dạng nguồn Tự dựng phần mềm từ mã nguồn Compiling from source: why Unix software ships as source
Ward đưa hai lý do. Thứ nhất là thực dụng: Unix và Linux có quá nhiều biến thể và kiến trúc, phát hành nhị phân cho mọi tổ hợp là bất khả thi. Thứ hai — theo ông ít nhất cũng quan trọng ngang thế — là việc phát tán mã nguồn rộng rãi khuyến khích người dùng đóng góp sửa lỗi và tính năng, làm cho cụm từ “mã nguồn mở” có nghĩa.1
Phần mềm Unix thường phát cho bạn “bản vẽ” chứ không phải “sản phẩm đúc sẵn”, vì có quá nhiều loại máy khác nhau — và vì ai xem được bản vẽ thì cũng sửa được lỗi. Nhớ nhé: nguồn mở không chỉ là miễn phí, mà là xem được và sửa được.
Ward gives two reasons. The first is practical: Unix and Linux have so many flavours and architectures that shipping binaries for every combination is impractical. The second — at least as important, he says — is that widespread source distribution encourages users to contribute bug fixes and features, giving the term "open source" its meaning.1
Điểm nốiWhere it connects Kịch bản
configuremà bạn chạy ở đây là một kịch bản shell rất lớn — Chương 11 đang được dùng ở quy mô công nghiệp.18 Theconfigurescript you run here is a very large shell script — Chapter 11 at industrial scale.18 -
Chapter 17
Ảo hoá: chương duy nhất dùng lại mọi chương trước Chạy cả một máy bên trong máy Virtualization: the chapter that reuses every chapter before it
Ward định nghĩa ảo là một trung gian dịch một tầng bên dưới phức tạp hoặc phân mảnh thành một giao diện đơn giản hoá mà nhiều bên dùng chung được — rồi nói mục đích thực tế của nó là tạo môi trường cô lập để nhiều hệ thống chạy mà không giẫm chân nhau.1 Container được ông định nghĩa lỏng là một môi trường chạy bị hạn chế dành cho một nhóm tiến trình, và ông nhấn mạnh một máy chạy container vẫn chỉ có một nhân Linux bên dưới.111
Container giống như dựng vách ngăn trong một căn phòng: mỗi nhóm có góc riêng, đồ riêng, không nhìn thấy nhau — nhưng vẫn chung một cái nhà. Nhớ nhé: nhiều container, vẫn chỉ một nhân.
Ward defines virtual as an intermediary translating a complex or fragmented underlying layer into a simplified interface usable by multiple consumers — then says its practical purpose is creating isolated environments so several systems run without clashing.1 A container he defines loosely as a restricted runtime environment for a set of processes, stressing that a machine running containers still has only one underlying Linux kernel.111
Điểm nốiWhere it connects Ward liệt kê thẳng các viên gạch:
chroot()đổi thư mục gốc, giới hạn tài nguyênrlimit, cgroup riêng, thiết bị và hệ thống tập tin riêng, giao diện mạng riêng, và không thấy được tiến trình khác.11213 Ward names the bricks outright:chroot()to change the root directory, therlimitresource limits, their own cgroups, their own devices and filesystem, their own network interfaces, and no visibility of other processes.11213Namespace là cơ chế còn lại
Ward mô tả không gian tên mạng (netns) khi kể cách Docker dựng mạng cho container.1 Trang
namespaces(7)nêu nguyên lý chung: một không gian tên bọc một tài nguyên toàn cục trong một trừu tượng, khiến các tiến trình bên trong tưởng như đang có bản riêng của tài nguyên đó.11 Đúng chữ trừu tượng của Chương 1, dùng làm rào chắn.
Sợi chỉ xuyên suốt · 6 sợi Through-lines · six threads
Sáu ý quay lại ở nhiều chương, dưới nhiều cái tên Sáu ý lặp đi lặp lại trong cả cuốn sách Six ideas that keep returning, under different names
Đây là phần mà lối đọc tuần tự hay bỏ lỡ. Mỗi sợi dưới đây xuất hiện ở ít nhất ba chương, thường mang tên khác nhau mỗi lần — nên nếu chỉ đọc một chương, bạn thấy một kỹ thuật; đọc cả sáu chỗ, bạn thấy một nguyên lý.
Có sáu ý cứ quay đi quay lại trong sách, mỗi lần đổi tên một chút. Nếu chỉ đọc một chương thì tưởng là mẹo vặt; đọc cả sáu chỗ mới thấy đó là một quy tắc. Nhớ nhé: thấy quen quen thì đúng là bạn đã gặp rồi.
This is the part sequential reading misses. Each thread below appears in at least three chapters, usually under a different name each time — so one chapter shows you a technique, while all six sites show you a principle.
-
Thread 01
Một giao diện, nhiều hiện thực Nhiều thứ khác nhau, một cách dùng One interface, many implementations
Sợi chỉ mà Ward tự gọi tên. Phân hệ SCSI chuẩn hoá giao tiếp giữa nhiều loại thiết bị; VFS làm y như vậy cho hệ thống tập tin; ngăn xếp mạng được xử lý “theo cách tương tự phân hệ SCSI”.1 Tài liệu nhân mô tả VFS là lớp phần mềm cung cấp giao diện hệ thống tập tin cho chương trình không gian người dùng đồng thời cho phép nhiều hiện thực khác nhau cùng tồn tại — đúng công thức đó.6
Ổ cứng, ổ USB, đĩa quang khác nhau lắm, nhưng bạn mở chúng theo cùng một cách. Đó là mẹo lớn nhất của Linux. Nhớ nhé: một cách làm cho tất cả — đó là lý do bạn học một lần dùng được mãi.
The thread Ward names himself. The SCSI subsystem standardises communication across device types; VFS does the same for filesystems; networking is handled "in a similar way to the SCSI subsystem."1 Kernel documentation describes VFS as the software layer providing the filesystem interface to userspace while letting different implementations coexist — the same formula.6
-
Thread 02
Ranh giới nhân / không gian người dùng — và nó được kéo qua kéo lại Cái gì do nhân làm, cái gì do chương trình làm The kernel/user-space boundary — and how it keeps being redrawn
Chương 1 dựng ranh giới bằng hai chế độ chạy.1 Sau đó gần như chương nào cũng hỏi lại “việc này nằm phía nào”: udev đẩy chính sách thiết bị sang không gian người dùng dù nhân vẫn phát hiện thiết bị; systemd là chương trình không gian người dùng như mọi chương trình khác; cgroup nằm ở không gian nhân dù systemd quản; tầng ứng dụng mạng nằm ở không gian người dùng còn tầng vận chuyển trở xuống chủ yếu ở nhân.1
Có hai bên: bên nhân và bên chương trình. Gần như mọi chương đều hỏi “việc này của bên nào”. Nhớ nhé: hỏi được câu đó là bạn đang đọc đúng cách.
Chapter 1 erects the boundary out of two execution modes.1 Nearly every chapter afterwards re-asks "which side is this on": udev pushes device policy into user space although the kernel still detects the device; systemd is a user-space program like any other; cgroups live in kernel space even when systemd manages them; the network application layer is user space while transport and below are mostly kernel.1
Ranh giới ấy có một danh sách chính thức:
syscalls(2)liệt kê toàn bộ các lời gọi hệ thống và gọi chúng là giao diện nền tảng giữa ứng dụng và nhân Linux.3 Khi phân vân một công cụ thuộc bên nào, câu hỏi kiểm chứng là: nó có phải đi qua một lời gọi hệ thống không? -
Thread 03
Cấu hình là một tập tin văn bản, và luôn có một thư mục
.dMuốn đổi hành vi thì sửa một tờ giấy Configuration is a text file — and there is always a.ddirectoryQuy tắc quản trị Linux gói gọn: hành vi của một thành phần nằm trong một tập tin văn bản đọc được, và tập tin đó thường kéo thêm cả một thư mục con. Ward chỉ ra mô típ này ở
/etc, ở tập tin unit của systemd, ở tập tin khởi động trong thư mục nhà, và ởld.so.conf— nơi ông ghi chú rằng nó “như điển hình của nhiều tập tin cấu hình Linux bạn đã gặp” có thể nạp thêm tập tin từ/etc/ld.so.conf.d.117Muốn máy làm khác đi, bạn hiếm khi phải lập trình — thường chỉ cần sửa một tập tin chữ. Nhớ nhé: tìm đúng tập tin là xong 90% việc.
The rule of Linux administration in one line: a component's behaviour lives in a readable text file, and that file usually drags a whole subdirectory along. Ward points at the motif in
/etc, in systemd unit files, in home-directory startup files, and inld.so.conf— where he notes it may, "as is typical of many of the Linux configuration files that you've seen," include further files from/etc/ld.so.conf.d.117 -
Thread 04
Cô lập và giới hạn: cùng một ý, ba lần leo thang Làm sao ngăn một chương trình phá cả máy Isolation and limits: one idea, escalated three times
Bắt đầu ở Chương 2 bằng quyền truy cập tập tin — hàng rào thô sơ nhất. Leo lên Chương 8 với
rlimitvà cgroup — giới hạn lượng tài nguyên.110 Rồi tới Chương 17 vớichroot()và không gian tên — giới hạn tầm nhìn. Ward tóm chính xác: container được dựng trên ý “bạn thay đổi môi trường và hạn chế tài nguyên mà tiến trình chạy trong đó”.1Ba mức rào: ai được mở tập tin nào; ai được dùng bao nhiêu sức máy; và ai được nhìn thấy những gì. Nhớ nhé: container chỉ là ba cái rào đó cùng lúc.
It starts in Chapter 2 with file permissions — the crudest fence. It escalates in Chapter 8 to
rlimitand cgroups — limiting the amount of resource.110 Then Chapter 17 addschroot()and namespaces — limiting the view. Ward's own summary is exact: containers are built on the idea that "you're altering the environment and restricting the resources with which processes run."1 -
Thread 05
Mọi tầng đều có đúng một lệnh để soi vào nó Mỗi tầng có một cái đèn pin riêng Every layer has exactly one command that looks into it
Đây là sợi chỉ thực hành nhất, và là lý do cuốn sách hữu dụng lâu hơn tuổi thọ của bất kỳ bản phân phối nào. Cách học của Ward luôn là: đặt tên tầng, rồi đưa ngay công cụ nhìn vào tầng đó. Ở Chương 8 ông nói rõ tinh thần ấy — đừng sa vào tối ưu hoá, hãy hiểu công cụ đang đo cái gì, và bạn sẽ hiểu luôn nhân làm việc thế nào.1
Mỗi tầng có một lệnh để nhìn vào bên trong: xem nhật ký, xem ổ đĩa, xem tiến trình, xem kết nối mạng. Nhớ nhé: học lệnh “nhìn” trước khi học lệnh “sửa”.
The most practical thread, and the reason the book outlives any particular distribution. Ward's pattern is always: name the layer, then hand you the instrument that reads it. In Chapter 8 he states the spirit outright — don't sink into tuning, understand what the tool measures, and you will understand how the kernel works.1
Phần lớn các công cụ ấy không nói chuyện trực tiếp với nhân: chúng đọc một hệ thống tập tin giả.
psvàtopđọc/proc;20 công cụ thiết bị đọc/sys;4 công cụ cgroup đọccgroupfs.10 Nghĩa là Sợi 05 thật ra là Sợi 01 nhìn từ phía người dùng: soi một tầng cũng chỉ là đọc một tập tin.Xuất hiện ở:Appears in: Ch 4, Ch 5, Ch 7, Ch 8, Ch 10, Ch 14, Ch 15
-
Thread 06
Shell là cơ chế, không phải tiện nghi Cửa sổ dòng lệnh không chỉ để gõ cho nhanh The shell is a mechanism, not a convenience
Người mới thường coi shell là chỗ gõ lệnh cho nhanh. Ward đặt nó cao hơn hẳn: shell là “một trong những phần quan trọng nhất của hệ thống Unix”, vừa chạy lệnh vừa là một môi trường lập trình nhỏ, và nhiều phần quan trọng của hệ thống chính là kịch bản shell.1 Sợi chỉ này chạy từ Chương 2 sang Chương 11, rồi xuất hiện lại thành tập tin khởi động ở Chương 13 và kịch bản
configureở Chương 16.18Nhiều bộ phận của Linux thật ra là kịch bản shell, chứ không phải chương trình viết bằng C. Nhớ nhé: học shell là học một phần ruột của hệ thống, không phải học một mẹo vặt.
Newcomers treat the shell as a fast way to type commands. Ward places it far higher: the shell is "one of the most important parts of a Unix system," both a command runner and a small programming environment, and many important parts of the system are shell scripts.1 The thread runs from Chapter 2 into Chapter 11, then resurfaces as startup files in Chapter 13 and the
configurescript in Chapter 16.18
Lộ trình · 3 cách đọc Routes · three ways through
Ba lộ trình xuyên mười bảy chương Nên đọc chương nào trước? Three routes through seventeen chapters
Thứ tự 1→17 là lộ trình mặc định và là lộ trình tốt nhất cho lần đọc đầu. Nhưng cuốn sách chịu được ba đường đi khác nhau, vì Ward viết mỗi chương gần như đứng một mình — ông còn chủ động mời bạn bỏ qua phần nâng cao và quay lại sau.1
Đọc từ đầu đến cuối là cách chắc nhất. Nhưng nếu bạn đang cần giải quyết một việc cụ thể, có đường tắt. Nhớ nhé: được phép nhảy cóc, miễn là biết mình đang bỏ qua gì.
1→17 is the default route and the best one for a first pass. But the book survives three different paths, because Ward writes each chapter to stand nearly alone — he even invites you to skip the advanced material and come back later.1
Người mới hoàn toàn Complete newcomer
1 → 2 → 4 → 5 → 6 → 8. Lấy bản đồ ba tầng, học bộ lệnh, hiểu đĩa biến thành thư mục thế nào, rồi đi hết chuỗi khởi động. Chương 3 và Chương 9 để dành cho lần hai — cả hai đều đậm đặc chi tiết hơn mức cần cho lần đầu.
Đọc 1, 2, 4, 5, 6, 8 trước. Đây là đường ngắn nhất để hiểu máy của bạn. Nhớ nhé: chưa cần đụng tới mạng vội.
1 → 2 → 4 → 5 → 6 → 8. Take the three-level map, learn the command set, see how a disk becomes a directory, then walk the whole boot sequence. Save Chapters 3 and 9 for a second pass — both are denser than a first reading needs.
Người vừa nhận một máy chủ Someone just handed a server
6 → 7 → 8 → 9 → 10 → 11. Lộ trình vận hành: dịch vụ nào đang chạy, nhật ký ở đâu, ai ăn hết tài nguyên, mạng cấu hình ở tầng nào, cổng nào đang mở, và viết kịch bản để khỏi làm lại bằng tay. Quay lại Chương 4 khi đĩa đầy, Chương 12 khi cần chia sẻ tập tin.
Đọc 6, 7, 8, 9, 10, 11. Đây là bộ đồ nghề để trông coi một máy đang chạy thật. Nhớ nhé: xem nhật ký trước khi sửa bất cứ thứ gì.
6 → 7 → 8 → 9 → 10 → 11. The operations route: what is running, where the logs are, who is eating the resources, which layer the network is configured at, which ports are open, and how to script it so you never do it by hand twice. Return to Chapter 4 when a disk fills, Chapter 12 when you need file sharing.
Lập trình viên muốn hiểu bên dưới A programmer looking underneath
1 → 8 → 15 → 16 → 17 → 3. Lộ trình “mã của tôi chạm vào hệ thống ở đâu”: ranh giới lời gọi hệ thống, tiến trình và bộ nhớ, thư viện chia sẻ và bộ liên kết, cách một gói nguồn tự dựng, rồi container. Kết thúc ở Chương 3 vì thiết bị là chỗ trừu tượng hoá mỏng nhất và dễ thấy nhất.
Đọc 1, 8, 15, 16, 17, rồi 3. Đây là đường đi cho người viết mã muốn biết mã của mình chạm vào đâu. Nhớ nhé: thư viện chia sẻ là chương đáng đọc kỹ nhất.
1 → 8 → 15 → 16 → 17 → 3. The "where does my code touch the system" route: the system-call boundary, processes and memory, shared libraries and the linker, how a source package builds itself, then containers. It ends at Chapter 3 because devices are where the abstraction is thinnest and easiest to see through.
Khép lại bản đồ Closing the map
Mười bảy chương không phải mười bảy chủ đề. Chúng là một động tác duy nhất — dồn một đám hiện thực lộn xộn lại sau một giao diện thống nhất — được lặp lại ở thiết bị, ở đĩa, ở mạng, ở tiến trình, và cuối cùng ở cả cỗ máy.
Cả cuốn sách chỉ nói một điều: Linux làm cho nhiều thứ rất khác nhau trông giống nhau, để bạn chỉ cần học một cách dùng. Nhớ nhé: học một lần, dùng được khắp nơi.
Seventeen chapters are not seventeen subjects. They are one move — gathering a messy plurality behind a single uniform interface — repeated at the device, at the disk, at the network, at the process, and finally at the whole machine.