我的Linux学习之路

我的Linux学习之路

我的Linux学习路途不同于其他人,也不同于一般的教材。

我从一开始,就以systemd套件为中心展开学习。

这样做有很多好处:

  1. systemd是当代既成的大部分Linux发行版的标准化服务管理套件,主流发行版几乎没有不使用systemd的
  2. systemd套件完整全面,涵盖了系统管理的各个方面,顺着systemd的脉络就可以学习到全面的系统管理知识。

我们开始吧。按顺序对每一个问题进行回答,这或许不能让你成为一个在学术上精通Linux的人,但是至少会让你谈论起来头头是道。

当然,最重要的是,坚持使用Linux内核的操作系统,经验总是在日常使用中积累的。

所有的问题几乎都可以在网上找到答案,耐下性子一点一点搜集,拼凑起来,你会发现这整个过程充满了乐趣。如果你不确定从哪里开始找的话,可以去看看Debian wikiArch wiki

注意,这些问题仅限于这种场景:个人。本地。单机。一些较为先进的应用不会写在这里,那是以后需要你自己琢磨的事情了。

建议使用的发行版为目前最新版本的Debian,stable或testing都可以。

预热

  1. 什么是Unix?什么是Linux?什么是GNU?什么是Linux发行版?
  2. 什么是Shell?什么是POSIX(Also known as SUSv4, ISO/IEC 9945, IEEE 1007.1)?什么是bash?
  3. 什么是GNU Coreutils?什么是Busybox?它们两个之间的关系是什么?把Coreutils的每一个命令都看一下,尽量记住,记不住也没关系。
  4. 什么是本地包管理器?什么是dpkg?什么是rpm?
  5. 什么是在线包管理器?什么是apt?什么是yum/dnf?什么是软件仓库(软件源)?
  6. 什么是FHS3.0?根下面的每个目录都是什么作用?为什么Linux社区要推行Usrmerge?
  7. 什么是LSB5.0?这个标准的历史意义是什么?
  8. 为什么我(作为普通用户)执行不了某条命令?什么是root用户?什么是sudo?

系统安装

  1. 什么是LiveCD?
  2. 什么是Swap(ZSwap)?为什么要设置Swap(ZSwap)?你可以参考为Swap辩护来辨析一些网上的错误观点。
  3. 什么是固件?为什么需要这东西来让网卡工作?你可以参考Firmware
  4. /dev下的设备命名是谁负责的?存储设备的命名是什么含义?为什么有的不是sda?
  5. 什么是文件系统?不同文件系统(xfs?ext4?btrfs?bcachefs?)有什么不同?
  6. 什么是分区表(MBR和GPT)?为什么要分区?不分区能不能使用磁盘?每种分区都有独特的类型编号,是什么含义?
  7. systemd提供了分区工具systemd-repart,试着看看。

系统引导与初始化

  1. 前引导阶段:什么是引导(Bootstrap)?什么是PC-98 BIOS(Legacy BIOS)和UEFI(最好读一下标准)?这些固件在引导阶段起什么作用?
  2. 引导管理器阶段:什么是UEFI Portable Executable(PE)程序?什么是GRUB?GRUB分别在BIOS模式与EFI模式下的工作原理与两个阶段?UEFI固件已经有一个Boot Manager了?为什么我还需要GRUB?我不使用GRUB直接通过UEFI启动Linux内核可行吗?什么是UKI?
  3. 内核阶段:什么是内核命令行参数(Kernel cmdline)?
  4. initramfs阶段:什么是initramfs?为什么我们需要initramfs来让系统启动?initramfs是怎么切换到实根(实际的根文件系统)的?
  5. 用户空间初始化阶段:什么是Init进程(PID1)?从systemd的视角分析系统初始化。(回去看看LSB5里面的Init脚本章节)
  6. systemd提供了系统引导程序systemd-boot,试着安装它。

进入系统

  1. 什么是tty?什么是pty?什么是getty?
  2. 什么是bash login shell?login shell的配置文件有哪些?
  3. 什么是SSH?SSH服务器有几种实现?客户端有几种实现?
  4. SSH支持哪些认证方式?如何配置密钥对认证?

核心管理套件

  1. 什么是守护进程(Daemon)?什么是服务(Service)?根据PEP 3143的内容对其进行辨析。
  2. systemd提供了完整的服务管理套件,试着使用systemctl对服务单元进行操作。
  3. systemd-run是快速启动程序并构建为服务的好帮手,试一试使用systemd-run运行一个程序。
  4. 什么是cron?怎么使用cron?
  5. systemd有一个非官方的cron实现systemd-cron,试着看看它的原理,以及分析systemd-timer如何替代cron。

日志记录套件

  1. 什么是日志?systemd提供了标准的日志组件systemd-journald,它会收集哪些日志?
  2. Syslog是什么协议?如何让它通过网络收集日志?
  3. 什么是systemd-journald?它可以独立工作,也可以和Syslog一起工作,这是怎么实现的?
  4. Syslog使用扇入扇出的模型,且导出内容是文本文件,这有什么不足?systemd-journald是怎么解决这些问题的?

用户/权限管理套件

  1. 什么是UNIX用户/组数据库?什么是shadow文件?为什么要用shadow文件?
  2. 每个用户都会放到一个独立的同名组,为什么不直接都放到一个user组呢?
  3. 什么是PAM?PAM是为了解决什么问题?
  4. 什么是八进制权限位?为什么要设置文件权限?怎么修改权限?
  5. ACL:什么是ACL?为什么要设置ACL?怎么设置ACL?(不要看SELinux)
  6. systemd提供了用户数据库解析工具systemd-userdbd及其客户端userdbctl,试着用它分析用户数据库。

语言管理套件

  1. 系统语言和GlibC有什么关系?为什么要用GlibC提供的localedef工具对语言进行编译后才能使用?
  2. LANG、LANGUAGE、LC_*这些语言相关的环境变量有什么区别?
  3. LANGUAGE=C和LANGUAGE=en_US.UTF-8有什么区别?为什么要用UTF-8编码?
  4. systemd提供了语言管理套件systemd-localed及其客户端localectl。试着使用localctl修改系统语言。

时间管理套件

  1. 什么是RTC?
  2. 什么是时区?它影响什么?什么是UTC?
  3. systemd提供了时区管理工具systemd-timedated及其客户端timedatectl,试着用它调整时区。
  4. 什么是NTP?为什么要用NTP?
  5. systemd提供了时间同步工具systemd-timesyncd,试着用它进行时间同步。

网络管理套件

  1. 利用iproute2与ss分析网络状况。它们替代了旧时代的net-tools工具组。
  2. 为什么我的网卡设备名不是eth0?什么是可预测网络接口命名法?为什么要用可预测的网络接口命名?
  3. 为什么我们需要一个网络管理套件(ifupdown, NetworkManager, netplan…)?网络管理套件覆盖了哪些功能?
  4. systemd提供了网络管理组件systemd-networkd和DNS管理组件systemd-resolved,试着用它们管理网络。

图形界面

  1. 什么是X?什么是X11?什么是X.org?
  2. 什么是Wayland?为什么Wayland更好?Wayland现在还有哪些不足?
  3. 为什么我的英伟达显卡需要另外安装驱动,而不是在Linux内核中包含或者发行版预装?
  4. 什么是Display Manager?
  5. 什么是Window Manager?
  6. 什么是桌面环境?
  7. 什么是fcitx?什么是ibus?输入框架和输入法的关系是什么?怎么配置输入法?
  8. 我该怎么进行远程连接?什么是VNC?什么是RDP?

高级系统管理

  1. 高级网络配置:什么是网口聚合(Bond)?什么是Linux网桥(Bridge)?什么是VLan?
  2. 为什么我们要使用池化存储管理?什么是LVM?什么是ZFS?
  3. 什么是RAID?RAID有几种模式?
  4. 什么是S.M.A.R.T.?
  5. 什么是CGroup(V1和V2有什么区别)?什么是容器?什么是系统容器?什么是应用容器(微服务容器)?LXC是哪类?Docker/Podman是哪类?什么是OCI标准?systemd提供了容器工具组systemd-nspawn,试着用它运行容器。
  6. 什么是虚拟机?什么是虚拟机管理器(VMM)?为什么有两类虚拟机管理器?什么是Incus?
  7. 什么是nftables?它为什么全面取代了iptables?
  8. 什么是NAT?如何实现NAT?
  9. 有哪些网络文件系统(NFS,CIFS,WebDAV)?如何选择网络文件系统?怎么挂载网络文件系统?
  10. 什么是Cockpit?为什么要使用网页面板?
  11. 什么是Web服务器?对比一下Apache2,Nginx和Caddy,选一个试着搭建网站。
  12. 试着看看AppArmor和SELinux。
  13. 为什么我们需要幂等的自动化运维方案?Ansible如何实现这样的效果?