从 init 到 Shell、从文件系统到 SELinux,再到几个日常命令。系统管理的手边参考。
一、启动与基础环境
SysVinit
SysVinit 用 /etc/inittab 定义运行级别,rcN.d 里 S/K 脚本按编号启停服务。每个脚本接受 start/stop/restart。chkconfig 管理符号链接。这是 systemd 之前 Linux 的主流 init。
Android 的 init 不是 SysV,而是自有 init.rc。嵌入式 Linux 或老发行版仍能见到。调试看 /var/log 与脚本 echo。依赖顺序只靠数字前缀,容易脆弱。
迁移到 systemd 时 unit 的 After/Requires 更清晰。写 SysV 脚本要注意 pidfile 与 LSB 头。不要在启动脚本里死循环占控制台。并行启动能力弱于 systemd。
BusyBox
BusyBox 把大量常见 Unix 工具压缩进一个可执行文件,通过不同的 applet 名称调用 ls、grep、sed、awk 等命令。它在嵌入式 Linux、路由器固件和 Android recovery 环境里非常常见,因为这些系统既缺少完整 GNU coreutils,又对体积敏感。
使用时要注意两件事:一是 applet 功能通常是精简实现,参数与 GNU 版本不完全兼容;二是编译时可通过 menuconfig 勾选需要的工具,避免把不必要的命令编进固件。在 Android 调试机上,BusyBox 常用于补齐缺希缺的 shell 能力,但应限制在可控环境,不要把其写入系统目录当常驻路径。
Shell
Shell 是命令解释器:bash/zsh 读脚本,展开变量、通配与管道。脚本开头用 #!/usr/bin/env bash,set -euo pipefail 能早失败。函数与子 shell 的变量作用域不同,管道在 bash 里右边是子进程。
引号很重要:未加引号的 $@ 会拆词。数组、here-doc、trap 清理临时文件。Android 的 mksh 功能比 bash 少。Windows 上 Git Bash 与 PowerShell 语法不通用。
调试 bash -x。不要用 ls 解析文件名,用 glob 或 find -print0。权限与 IFS 陷阱是脚本漏洞来源。复杂逻辑应换 Python。CI 里固定 shell 版本避免 dash 差异。
Cron表达式
Cron 表达式用五个或六个字段描述周期性任务:分、时、日、月、周,部分实现还有秒和年。Unix crontab 与 Spring Scheduler、Quartz 的字段含义并不完全一致,尤其是星期和问号的用法。
编写时要先确认时区,否则夏令时或容器 UTC 会导致任务偏移。避免同一分钟打满所有实例,可加抖动或分布式锁。月末与星期字段同时指定容易产生歧义,优先只填一个。监控下次执行时间和失败重试,不要默认任务一定跑过。复杂日历(交易日、节假日)不适合纯 Cron,应外挂日历服务。
二、内存与文件系统
mmap
mmap 把文件或设备映射到进程地址空间,之后像访问内存一样读写,内核在缺页时才真正读盘。顺序扫描大文件、共享内存、某些数据库的 WAL 都会用到它。对比 read/write,少一次用户态拷贝,但写回时机由内核决定,进程崩溃时未刷盘的页可能丢失。
使用要注意对齐、长度和 MAP_SHARED / MAP_PRIVATE。多进程共享要配同步,否则会出现撕裂写。不要把巨大稀疏文件无节制映射,虚拟地址也会耗尽。msync 可强制落盘,munmap 要成对。调试时用 pmap 看映射区间。消息队列和嵌入式存储里的 mmap 设计,核心都是用缺页换 I/O,而不是把整份文件一次性读进堆。
计算机操作系统 - 文件系统知识总结
文件系统把字节组织成目录与文件:inode 存元数据,数据块存内容。连续、链接、索引分配影响随机读写。目录是文件名到 inode 的映射。缓存与延迟写回让掉电可能丢数据,journal/COW 用来恢复。
Linux 常见 ext4、XFS、F2FS(闪存)。VFS 统一 open/read。权限 rwx 与 ACL。硬链接共享 inode,符号链接是路径。mmap 把文件映射进地址空间。
面试常考 inode 耗尽、软硬链接、缓冲与直接 IO。Android 上 userdata 多用 f2fs/ext4,分区只读 system。调试 df、du、lsof。不要在闪存上狂写小文件。
MBR和GPT(GUID)有什么区别呢?
MBR 把分区表放在磁盘首扇区,最多四个主分区,2TB 是经典上限,引导代码也挤在这 512 字节里。GPT 用 GUID 标识分区,表有主备两份,分区数量和容量上限都大得多,并与 UEFI 启动配套。
选哪种取决于固件与系统:现代 Windows / Linux 在 UEFI 下应使用 GPT;老机器或必须 Legacy 启动时才考虑 MBR。转换分区表会丢数据,先备份再操作。移动硬盘若要跨系统兼容,可看目标系统是否认 GPT。损坏恢复时 GPT 还有备份头,MBR 则几乎没有冗余。装双系统前先统一分区方案,避免引导程序互相覆盖。
三、安全与远程
SELinux
SELinux 是 Linux 的强制访问控制,按策略限制进程能碰哪些文件和端口。即使用户是 root,违反策略的操作也会被拒绝。Android 和许多发行版默认 enforcing。
排障先看审计日志里的 AVC denied,而不是直接 setenforce 0。开发机可临时 permissive,生产应写正确策略。文件上下文用 restorecon 恢复,不要长期 chmod 777 绕过。容器场景要理解类型转换。策略模块应版本化。关掉 SELinux 等于放弃一层纵深防御。学习路径是搞懂主体、客体、动作和布尔开关,再针对自己的服务补最小规则。
Linux scp命令
scp 基于 SSH 在主机间拷贝文件,语法接近 cp,可递归目录。适合偶发传输配置和日志,不适合作为持续同步工具。大文件传输中断后不会智能续传,这时更该用 rsync。
身份用密钥而不是把密码写进脚本。端口非 22 时用 -P。权限方面,拷过去的文件属主是登录用户,需要再 chown 给业务账号。通配符在本地展开,远程路径要小心引号。
自动化里优先 rsync 或对象存储。scp 留在应急和单次交付。传输敏感文件时确认 known_hosts,避免中间人把包接到别处。
SSH批量会话
SSH 批量会话指同时在多台主机上执行同一组命令,常见工具有 Ansible、pssh、tmux 同步窗和 ClusterSSH。运维排查时用来对比配置、拉日志或滚动重启,但风险是一条错误命令会被放大到整机群。
实践上应:用清单限制目标、先 dry-run、把变更做成幂等剧本,而不是交互式群发 rm。密钥走跳板机或证书登录,禁用 root 密码。输出要按主机归档,失败主机单独重试。涉及生产写操作时分批次金丝雀,先 1 台再 10%。能用配置管理系统就不要长期依赖手工批量 SSH,后者适合临时诊断而不是日常变更。
Linux 系统管理速查:init、BusyBox、文件系统与安全
https://lautung.com/archives/linux-system-admin
评论