0%

Unlike some operating systems, Linux doesn’t try to hide the important bits from you—it gives you full control of your computer. But to truly master Linux, you need to understand its internals, like how the system boots, how networking works, and what the kernel actually does.

In this third edition of the bestselling How Linux Works, author Brian Ward peels back the layers of this well-loved operating system to make Linux internals accessible. This edition has been thoroughly updated and expanded with added coverage of Logical Volume Manager (LVM), virtualization, and containers.

You'll learn:

•How Linux boots, from boot loaders to init (systemd)
•How the kernel manages devices, device drivers, and processes
•How networking, interfaces, firewalls, and servers work
•How development tools work and relate to shared libraries
•How to write effective shell scripts

You’ll also explore the kernel and examine key system tasks inside user space, including system calls, input and output, and filesystems. With its combination of background, theory, real-world examples, and patient explanations, How Linux Works, 3rd edition will teach you what you need to know to solve pesky problems and take control of your operating system.

Table of Contents

  1. Reviews for How Linux Works
  2. Title Page
  3. Copyright
  4. About the Author
  5. Acknowledgments
  6. Preface
    1. Who Should Read This Book?
    2. Prerequisites
    3. How to Read This Book
    4. A Hands-on Approach
    5. How This Book Is Organized
    6. What’s New in the Third Edition?
    7. A Note on Terminology
  7. Chapter 1: The Big Picture
    1. 1.1 Levels and Layers of Abstraction in a Linux System
    2. 1.2 Hardware: Understanding Main Memory
    3. 1.3 The Kernel
    4. 1.3.1 Process Management
    5. 1.3.2 Memory Management
    6. 1.3.3 Device Drivers and Management
    7. 1.3.4 System Calls and Support
    8. 1.4 User Space
    9. 1.5 Users
    10. 1.6 Looking Forward
  8. Chapter 2: Basic Commands and Directory Hierarchy
    1. 2.1 The Bourne Shell: /bin/sh
    2. 2.2 Using the Shell
    3. 2.2.1 The Shell Window
    4. 2.2.2 cat
    5. 2.2.3 Standard Input and Standard Output
    6. 2.3 Basic Commands
    7. 2.3.1 ls
    8. 2.3.2 cp
    9. 2.3.3 mv
    10. 2.3.4 touch
    11. 2.3.5 rm
    12. 2.3.6 echo
    13. 2.4 Navigating Directories
    14. 2.4.1 cd
    15. 2.4.2 mkdir
    16. 2.4.3 rmdir
    17. 2.4.4 Shell Globbing (“Wildcards”)
    18. 2.5 Intermediate Commands
    19. 2.5.1 grep
    20. 2.5.2 less
    21. 2.5.3 pwd
    22. 2.5.4 diff
    23. 2.5.5 file
    24. 2.5.6 find and locate
    25. 2.5.7 head and tail
    26. 2.5.8 sort
    27. 2.6 Changing Your Password and Shell
    28. 2.7 Dot Files
    29. 2.8 Environment and Shell Variables
    30. 2.9 The Command Path
    31. 2.10 Special Characters
    32. 2.11 Command-Line Editing
    33. 2.12 Text Editors
    34. 2.13 Getting Online Help
    35. 2.14 Shell Input and Output
    36. 2.14.1 Standard Error
    37. 2.14.2 Standard Input Redirection
    38. 2.15 Understanding Error Messages
    39. 2.15.1 Anatomy of a Unix Error Message
    40. 2.15.2 Common Errors
    41. 2.16 Listing and Manipulating Processes
    42. 2.16.1 ps Command Options
    43. 2.16.2 Process Termination
    44. 2.16.3 Job Control
    45. 2.16.4 Background Processes
    46. 2.17 File Modes and Permissions
    47. 2.17.1 Modifying Permissions
    48. 2.17.2 Working with Symbolic Links
    49. 2.18 Archiving and Compressing Files
    50. 2.18.1 gzip
    51. 2.18.2 tar
    52. 2.18.3 Compressed Archives (.tar.gz)
    53. 2.18.4 zcat
    54. 2.18.5 Other Compression Utilities
    55. 2.19 Linux Directory Hierarchy Essentials
    56. 2.19.1 Other Root Subdirectories
    57. 2.19.2 The /usr Directory
    58. 2.19.3 Kernel Location
    59. 2.20 Running Commands as the Superuser
    60. 2.20.1 sudo
    61. 2.20.2 /etc/sudoers
    62. 2.20.3 sudo Logs
    63. 2.21 Looking Forward
  9. Chapter 3: Devices
    1. 3.1 Device Files
    2. 3.2 The sysfs Device Path
    3. 3.3 dd and Devices
    4. 3.4 Device Name Summary
    5. 3.4.1 Hard Disks: /dev/sd*
    6. 3.4.2 Virtual Disks: /dev/xvd*, /dev/vd*
    7. 3.4.3 Non-Volatile Memory Devices: /dev/nvme*
    8. 3.4.4 Device Mapper: /dev/dm-*, /dev/mapper/*
    9. 3.4.5 CD and DVD Drives: /dev/sr*
    10. 3.4.6 PATA Hard Disks: /dev/hd*
    11. 3.4.7 Terminals: /dev/tty*, /dev/pts/*, and /dev/tty
    12. 3.4.8 Serial Ports: /dev/ttyS*, /dev/ttyUSB*, /dev/ttyACM*
    13. 3.4.9 Parallel Ports: /dev/lp0 and /dev/lp1
    14. 3.4.10 Audio Devices: /dev/snd/*, /dev/dsp, /dev/audio, and More
    15. 3.4.11 Device File Creation
    16. 3.5 udev
    17. 3.5.1 devtmpfs
    18. 3.5.2 udevd Operation and Configuration
    19. 3.5.3 udevadm
    20. 3.5.4 Device Monitoring
    21. 3.6 In-Depth: SCSI and the Linux Kernel
    22. 3.6.1 USB Storage and SCSI
    23. 3.6.2 SCSI and ATA
    24. 3.6.3 Generic SCSI Devices
    25. 3.6.4 Multiple Access Methods for a Single Device
  10. Chapter 4: Disks and Filesystems
    1. 4.1 Partitioning Disk Devices
    2. 4.1.1 Viewing a Partition Table
    3. 4.1.2 Modifying Partition Tables
    4. 4.1.3 Creating a Partition Table
    5. 4.1.4 Navigating Disk and Partition Geometry
    6. 4.1.5 Reading from Solid-State Disks
    7. 4.2 Filesystems
    8. 4.2.1 Filesystem Types
    9. 4.2.2 Creating a Filesystem
    10. 4.2.3 Mounting a Filesystem
    11. 4.2.4 Filesystem UUID
    12. 4.2.5 Disk Buffering, Caching, and Filesystems
    13. 4.2.6 Filesystem Mount Options
    14. 4.2.7 Remounting a Filesystem
    15. 4.2.8 The /etc/fstab Filesystem Table
    16. 4.2.9 Alternatives to /etc/fstab
    17. 4.2.10 Filesystem Capacity
    18. 4.2.11 Checking and Repairing Filesystems
    19. 4.2.12 Special-Purpose Filesystems
    20. 4.3 Swap Space
    21. 4.3.1 Using a Disk Partition as Swap Space
    22. 4.3.2 Using a File as Swap Space
    23. 4.3.3 Determining How Much Swap You Need
    24. 4.4 The Logical Volume Manager
    25. 4.4.2 Working with LVM
    26. 4.4.3 The LVM Implementation
    27. 4.5 Looking Forward: Disks and User Space
    28. 4.6 Inside a Traditional Filesystem
    29. 4.6.1 Inode Details and the Link Count
    30. 4.6.2 Block Allocation
    31. 4.6.3 Working with Filesystems in User Space
  11. Chapter 5: How the Linux Kernel Boots
    1. 5.1 Startup Messages
    2. 5.2 Kernel Initialization and Boot Options
    3. 5.3 Kernel Parameters
    4. 5.4 Boot Loaders
    5. 5.4.1 Boot Loader Tasks
    6. 5.4.2 Boot Loader Overview
    7. 5.5.1 Exploring Devices and Partitions with the GRUB Command Line
    8. 5.5.2 GRUB Configuration
    9. 5.5.3 GRUB Installation
    10. 5.6 UEFI Secure Boot Problems
    11. 5.7 Chainloading Other Operating Systems
    12. 5.8 Boot Loader Details
    13. 5.8.1 MBR Boot
    14. 5.8.2 UEFI Boot
    15. 5.8.3 How GRUB Works
  12. Chapter 6: How User Space Starts
    1. 6.2 Identifying Your init
    2. 6.3 systemd
    3. 6.3.1 Units and Unit Types
    4. 6.3.2 Booting and Unit Dependency Graphs
    5. 6.3.3 systemd Configuration
    6. 6.3.4 systemd Operation
    7. 6.3.5 systemd Process Tracking and Synchronization
    8. 6.3.6 systemd Dependencies
    9. 6.3.7 systemd On-Demand and Resource-Parallelized Startup
    10. 6.3.8 systemd Auxiliary Components
    11. 6.4 System V Runlevels
    12. 6.5 System V init
    13. 6.5.1 System V init: Startup Command Sequence
    14. 6.5.2 The System V init Link Farm
    15. 6.5.3 run-parts
    16. 6.5.4 System V init Control
    17. 6.5.5 systemd System V Compatibility
    18. 6.6 Shutting Down Your System
    19. 6.7 The Initial RAM Filesystem
    20. 6.8 Emergency Booting and Single-User Mode
    21. 6.9 Looking Forward
  13. Chapter 7: System Configuration: Logging, System Time, Batch Jobs, and Users
    1. 7.1 System Logging
    2. 7.1.1 Checking Your Log Setup
    3. 7.1.2 Searching and Monitoring Logs
    4. 7.1.3 Logfile Rotation
    5. 7.1.4 Journal Maintenance
    6. 7.1.5 A Closer Look at System Logging
    7. 7.2 The Structure of /etc
    8. 7.3 User Management Files
    9. 7.3.1 The /etc/passwd File
    10. 7.3.2 Special Users
    11. 7.3.3 The /etc/shadow File
    12. 7.3.4 Manipulating Users and Passwords
    13. 7.3.5 Working with Groups
    14. 7.4 getty and login
    15. 7.5 Setting the Time
    16. 7.5.1 Kernel Time Representation and Time Zones
    17. 7.5.2 Network Time
    18. 7.6 Scheduling Recurring Tasks with cron and Timer Units
    19. 7.6.1 Installing Crontab Files
    20. 7.6.2 System Crontab Files
    21. 7.6.3 Timer Units
    22. 7.6.4 cron vs. Timer Units
    23. 7.7 Scheduling One-Time Tasks with at
    24. 7.7.1 Timer Unit Equivalents
    25. 7.8 Timer Units Running as Regular Users
    26. 7.9 User Access Topics
    27. 7.9.1 User IDs and User Switching
    28. 7.9.2 Process Ownership, Effective UID, Real UID, and Saved UID
    29. 7.9.3 User Identification, Authentication, and Authorization
    30. 7.9.4 Using Libraries for User Information
    31. 7.10 Pluggable Authentication Modules
    32. 7.10.1 PAM Configuration
    33. 7.10.2 Tips on PAM Configuration Syntax
    34. 7.10.3 PAM and Passwords
    35. 7.11 Looking Forward
  14. Chapter 8: A Closer Look at Processes and Resource Utilization
    1. 8.1 Tracking Processes
    2. 8.2 Finding Open Files with lsof
    3. 8.2.1 Reading the lsof Output
    4. 8.2.2 Using lsof
    5. 8.3 Tracing Program Execution and System Calls
    6. 8.3.1 strace
    7. 8.3.2 ltrace
    8. 8.4 Threads
    9. 8.4.1 Single-Threaded and Multithreaded Processes
    10. 8.4.2 Viewing Threads
    11. 8.5.1 Measuring CPU Time
    12. 8.5.2 Adjusting Process Priorities
    13. 8.5.3 Measuring CPU Performance with Load Averages
    14. 8.5.4 Monitoring Memory Status
    15. 8.5.5 Monitoring CPU and Memory Performance with vmstat
    16. 8.5.6 I/O Monitoring
    17. 8.5.7 Per-Process Monitoring with pidstat
    18. 8.6 Control Groups (cgroups)
    19. 8.6.1 Differentiating Between cgroup Versions
    20. 8.6.2 Viewing cgroups
    21. 8.6.3 Manipulating and Creating cgroups
    22. 8.6.4 Viewing Resource Utilization
    23. 8.7 Further Topics
  15. Chapter 9: Understanding Your Network and Its Configuration
    1. 9.1 Network Basics
    2. 9.2 Packets
    3. 9.3 Network Layers
    4. 9.4 The Internet Layer
    5. 9.4.1 Viewing IP Addresses
    6. 9.4.2 Subnets
    7. 9.4.3 Common Subnet Masks and CIDR Notation
    8. 9.5 Routes and the Kernel Routing Table
    9. 9.6 The Default Gateway
    10. 9.7 IPv6 Addresses and Networks
    11. 9.7.1 Viewing IPv6 Configuration on Your System
    12. 9.7.2 Configuring Dual-Stack Networks
    13. 9.8 Basic ICMP and DNS Tools
    14. 9.8.1 ping
    15. 9.8.2 DNS and host
    16. 9.9 The Physical Layer and Ethernet
    17. 9.10 Understanding Kernel Network Interfaces
    18. 9.11.1 Manually Configuring Interfaces
    19. 9.11.2 Manually Adding and Deleting Routes
    20. 9.12 Boot-Activated Network Configuration
    21. 9.13 Problems with Manual and Boot-Activated Network Configuration
    22. 9.14 Network Configuration Managers
    23. 9.14.1 NetworkManager Operation
    24. 9.14.2 NetworkManager Interaction
    25. 9.14.3 NetworkManager Configuration
    26. 9.15 Resolving Hostnames
    27. 9.15.1 /etc/hosts
    28. 9.15.2 resolv.conf
    29. 9.15.3 Caching and Zero-Configuration DNS
    30. 9.15.4 /etc/nsswitch.conf
    31. 9.16 Localhost
    32. 9.17 The Transport Layer: TCP, UDP, and Services
    33. 9.17.1 TCP Ports and Connections
    34. 9.17.2 UDP
    35. 9.18 Revisiting a Simple Local Network
    36. 9.19 Understanding DHCP
    37. 9.19.1 Linux DHCP Clients
    38. 9.19.2 Linux DHCP Servers
    39. 9.20 Automatic IPv6 Network Configuration
    40. 9.21 Configuring Linux as a Router
    41. 9.22 Private Networks (IPv4)
    42. 9.23 Network Address Translation (IP Masquerading)
    43. 9.24 Routers and Linux
    44. 9.25 Firewalls
    45. 9.25.1 Linux Firewall Basics
    46. 9.25.2 Setting Firewall Rules
    47. 9.25.3 Firewall Strategies
    48. 9.26 Ethernet, IP, ARP, and NDP
    49. 9.27 Wireless Ethernet
    50. 9.27.1 iw
    51. 9.27.2 Wireless Security
    52. 9.28 Summary
  16. Chapter 10: Network Applications and Services
    1. 10.1 The Basics of Services
    2. 10.2 A Closer Look
    3. 10.3 Network Servers
    4. 10.3.1  Secure Shell
    5. 10.3.2  The sshd Server
    6. 10.3.3  fail2ban
    7. 10.3.4  The SSH Client
    8. 10.4 Pre-systemd Network Connection Servers: inetd/xinetd
    9. 10.5 Diagnostic Tools
    10. 10.5.1  lsof
    11. 10.5.2  tcpdump
    12. 10.5.3  netcat
    13. 10.5.4  Port Scanning
    14. 10.6 Remote Procedure Calls
    15. 10.7 Network Security
    16. 10.7.1  Typical Vulnerabilities
    17. 10.7.2  Security Resources
    18. 10.8 Looking Forward
    19. 10.9 Network Sockets
    20. 10.10 Unix Domain Sockets
  17. Chapter 11: Introduction to Shell Scripts
    1. 11.1 Shell Script Basics
    2. 11.1.1 Limitations of Shell Scripts
    3. 11.2 Quoting and Literals
    4. 11.2.1 Literals
    5. 11.2.2 Single Quotes
    6. 11.2.3 Double Quotes
    7. 11.2.4 Literal Single Quotes
    8. 11.3 Special Variables
    9. 11.3.1 Individual Arguments: $1, $2, and So On
    10. 11.3.2 Number of Arguments: $#
    11. 11.3.3 All Arguments: $@
    12. 11.3.4 Script Name: $0
    13. 11.3.5 Process ID: $$
    14. 11.3.6 Exit Code: $?
    15. 11.4 Exit Codes
    16. 11.5 Conditionals
    17. 11.5.1 A Workaround for Empty Parameter Lists
    18. 11.5.2 Other Commands for Tests
    19. 11.5.3 elif
    20. 11.5.4 Logical Constructs
    21. 11.5.5 Testing Conditions
    22. 11.5.6 case
    23. 11.6 Loops
    24. 11.6.1 for Loops
    25. 11.6.2 while Loops
    26. 11.7 Command Substitution
    27. 11.8 Temporary File Management
    28. 11.9 Here Documents
    29. 11.10 Important Shell Script Utilities
    30. 11.10.1  basename
    31. 11.10.2  awk
    32. 11.10.3  sed
    33. 11.10.4  xargs
    34. 11.10.5  expr
    35. 11.10.6  exec
    36. 11.11 Subshells
    37. 11.12 Including Other Files in Scripts
    38. 11.13 Reading User Input
    39. 11.14 When (Not) to Use Shell Scripts
  18. Chapter 12: Network File Transfer and Sharing
    1. 12.1 Quick Copy
    2. 12.2 rsync
    3. 12.2.1  Getting Started with rsync
    4. 12.2.2  Making Exact Copies of a Directory Structure
    5. 12.2.3  Using the Trailing Slash
    6. 12.2.4  Excluding Files and Directories
    7. 12.2.5  Checking Transfers, Adding Safeguards, and Using Verbose Mode
    8. 12.2.6  Compressing Data
    9. 12.2.7  Limiting Bandwidth
    10. 12.2.8  Transferring Files to Your Computer
    11. 12.2.9  Further rsync Topics
    12. 12.3.1  File Sharing Usage and Performance
    13. 12.3.2  File Sharing Security
    14. 12.4 Sharing Files with Samba
    15. 12.4.1  Server Configuration
    16. 12.4.2  Server Access Control
    17. 12.4.3  Passwords
    18. 12.4.4  Manual Server Startup
    19. 12.4.5  Diagnostics and Logfiles
    20. 12.4.6  File Share Configuration
    21. 12.4.7  Home Directories
    22. 12.4.8  Printer Sharing
    23. 12.4.9  The Samba Client
    24. 12.5 SSHFS
    25. 12.6 NFS
    26. 12.7 Cloud Storage
    27. 12.8 The State of Network File Sharing
  19. Chapter 13: User Environments
    1. 13.1 Guidelines for Creating Startup Files
    2. 13.2 When to Alter Startup Files
    3. 13.3 Shell Startup File Elements
    4. 13.3.1  The Command Path
    5. 13.3.2  The Manual Page Path
    6. 13.3.3  The Prompt
    7. 13.3.4  Aliases
    8. 13.3.5  The Permissions Mask
    9. 13.4 Startup File Order and Examples
    10. 13.4.1  The bash Shell
    11. 13.4.2  The tcsh Shell
    12. 13.5 Default User Settings
    13. 13.5.1  Shell Defaults
    14. 13.5.2  Editor
    15. 13.5.3  Pager
    16. 13.6 Startup File Pitfalls
    17. 13.7 Further Startup Topics
  20. Chapter 14: A Brief Survey of the Linux Desktop and Printing
    1. 14.1 Desktop Components
    2. 14.1.1  Framebuffers
    3. 14.1.2  The X Window System
    4. 14.1.3  Wayland
    5. 14.1.4  Window Managers
    6. 14.1.5  Toolkits
    7. 14.1.6  Desktop Environments
    8. 14.1.7  Applications
    9. 14.2 Are You Running Wayland or X?
    10. 14.3 A Closer Look at Wayland
    11. 14.3.1  The Compositing Window Manager
    12. 14.3.2  libinput
    13. 14.3.3  X Compatibility in Wayland
    14. 14.4 A Closer Look at the X Window System
    15. 14.4.1  Display Managers
    16. 14.4.2  Network Transparency
    17. 14.4.3 Ways of Exploring X Clients
    18. 14.4.4  X Events
    19. 14.4.5  X Input and Preference Settings
    20. 14.5 D-Bus
    21. 14.5.1  System and Session Instances
    22. 14.5.2  D-Bus Message Monitoring
    23. 14.6 Printing
    24. 14.6.1  CUPS
    25. 14.6.2  Format Conversion and Print Filters
    26. 14.7 Other Desktop Topics
  21. Chapter 15: Development Tools
    1. 15.1 The C Compiler
    2. 15.1.1  Compiling Multiple Source Files
    3. 15.1.2  Linking with Libraries
    4. 15.1.3 Working with Shared Libraries
    5. 15.1.4  Working with Header (Include) Files and Directories
    6. 15.2 make
    7. 15.2.1  A Sample Makefile
    8. 15.2.2  Built-in Rules
    9. 15.2.3  Final Program Build
    10. 15.2.4  Dependency Updates
    11. 15.2.5  Command-Line Arguments and Options
    12. 15.2.6  Standard Macros and Variables
    13. 15.2.7  Conventional Targets
    14. 15.2.8  Makefile Organization
    15. 15.3 Lex and Yacc
    16. 15.4 Scripting Languages
    17. 15.4.1  Python
    18. 15.4.2  Perl
    19. 15.4.3  Other Scripting Languages
    20. 15.5 Java
    21. 15.6 Looking Forward: Compiling Packages
  22. Chapter 16: Introduction to Compiling Software from C Source Code
    1. 16.1 Software Build Systems
    2. 16.2 Unpacking C Source Packages
    3. 16.3 GNU Autoconf
    4. 16.3.1  An Autoconf Example
    5. 16.3.2  Installation Using a Packaging Tool
    6. 16.3.3  configure Script Options
    7. 16.3.4  Environment Variables
    8. 16.3.5  Autoconf Targets
    9. 16.3.6  Autoconf Logfiles
    10. 16.3.7  pkg-config
    11. 16.4 Installation Practice
    12. 16.4.1  Where to Install
    13. 16.5 Applying a Patch
    14. 16.6 Troubleshooting Compiles and Installations
    15. 16.6.1  Specific Errors
    16. 16.7 Looking Forward
  23. Chapter 17: Virtualization
    1. 17.1 Virtual Machines
    2. 17.1.1  Hypervisors
    3. 17.1.2  Hardware in a Virtual Machine
    4. 17.1.3  Common Uses of Virtual Machines
    5. 17.1.4  Drawbacks of Virtual Machines
    6. 17.2 Containers
    7. 17.2.1  Docker, Podman, and Privileges
    8. 17.2.2  A Docker Example
    9. 17.2.3  LXC
    10. 17.2.4  Kubernetes
    11. 17.2.5  Pitfalls of Containers
    12. 17.3 Runtime-Based Virtualization
  24. Index
18.119.133.228