简介:这份《Linux基础学习篇》是一份面向入门到进阶读者的系统化学习资料,内容覆盖Linux发展历史、文件系统、进程管理、用户权限、网络管理与系统安全等核心模块,全书共二十四章,条理清晰、由浅入深,适合初学者系统建立知识框架,也适合日常查阅巩固。资源为单个PDF电子书,共940页,包体约21.98MB,阅读与检索均较为方便。目前已有989人学习使用。书中不仅详细讲解EXT系列、XFS文件系统、TCP/IP常见协议、Shell环境与常用命令,还包含一份按字母排序的指令与术语速查表,便于读者快速定位cd、chmod、grep、kill等命令对应的章节说明,整体上既可作为系统教程,也能充当随查随用的工具书,对希望夯实Linux基础的读者来说是一份扎实的参考材料。
1. 940页的Linux基础学习,真正该被拆解的是动手路径
一本叫《Linux基础学习篇》的940页PDF,躺在网盘里往往比被读完更有存在感。但Linux的基础很难靠“读”获得:一条lsblk看到的磁盘、分区、挂载点,比一整节图文更适合建立记忆。
这类大部头资料的真正价值是提供索引。先确定问题属于内核、Shell、权限还是网络,再回到对应章节查细节,比从头翻书更高效。如果只是跟着书敲命令,遇到Permission denied或DNS解析失败时,仍然不知道从哪里入手。
这份学习路径从分层认知开始,依次经过虚拟机安装、常用命令、用户权限、解压乱码、DNS配置、Docker/KVM和提权加固,最后交给你一份把资料变成私人手册的复习法。适合能摆弄cd和ls,但遇到故障时不知道去哪一页的人。
2. 从分层模型开始:选发行版、装虚拟机、跑通终端
2.1 发行版 / 内核 / Shell 三层的划分
Linux基础能不能学扎实,先看你能不能区分发行版、内核和Shell。这个分层没有建立起来时,apt install和dnf install会用不同的报错把你打懵;分层建立后,报错本身会变成线索。
当你执行cat /etc/os-release时,cat来自GNU coreutils,读写动作由内核完成,发行版则负责把内核、基础库和各种命令行工具打包。所以第一步是给系统“验明正身”:
uname -r cat /etc/os-release echo $SHELL参数说明:uname -r是内核版本,排查驱动问题时第一件事就是看它;cat /etc/os-release打印机器可读的发行版标识;echo $SHELL告诉你当前登录Shell是bash、zsh还是其他。后面看任何《Linux常用命令大全》,都要带回这三条输出里校验。
选择发行版不只是挑图标。Debian系用apt,Red Hat系用dnf,Arch系用pacman;国产系统里,很多基于openEuler的发行版沿用RPM封装,所以教科书里的/etc/yum.repos.d/路径依然适用。学习阶段优先选你熟悉教程最多的那个,关键是把包管理器记住。
| 家族 | 包管理器 | 软件包格式 | 常见发行版 |
|---|---|---|---|
| Debian | apt | .deb | Debian、Ubuntu |
| Red Hat | dnf/yum | .rpm | RHEL、Fedora、openEuler、Rocky |
| Arch | pacman | .pkg.tar.zst | Arch、Manjaro |
这张表用来做“系统类别”定位,不必背发行版官网的细节。装了Debian系却去查dnf命令,报错会很难受。
2.2 用虚拟机装一台最小Linux练习机
Windows或macOS上学习Linux,虚拟机是最安全、最容易还原的场地。VirtualBox适合桌面体验,KVM/QEMU适合接近生产性能;如果只是想练命令,虚拟机比裸机装双系统更值得推荐。
虚拟机安装Linux过程中最容易出现的两个现象:Windows蓝屏和KVM黑屏。前者通常是宿主机虚拟化开关没开,或Hyper-V和第三方虚拟化工具冲突;后者要通过egrep -c '(vmx|svm)' /proc/cpuinfo确认CPU虚拟化是否可用。egrep返回值大于0时,表示支持虚拟化;返回0时,说明这是被禁掉的虚拟机或老CPU。
egrep -c '(vmx|svm)' /proc/cpuinfo virsh list --allvirsh list是libvirt的命令行入口,安装libvirt-daemon-system后就会存在。学习KVM时,先用virsh list看有没有默认网络和正在运行的domain,再决定下一步操作。
装完系统后,建议立刻跑一轮基础更新和工具安装:
sudo apt update && sudo apt upgrade -y sudo apt install -y vim tmux htop net-tools tree lsblk ip addr showlsblk输出块设备和分区挂载点,比如/dev/sda1挂载到/boot,/dev/sda2挂载到/;ip addr show替代老ifconfig,主要看ens33这类接口是否拿到IP。如果apt update卡在软件源,先检查网络和DNS,后面第3节会专门处理DNS问题。
提示:虚拟机里安装系统时,不要把ISO镜像放在虚拟磁盘所在分区,否则后续做快照时可能造成空间占用异常。
2.3 终端和Shell的基本功
图形桌面上打开终端的快捷键通常是Ctrl+Alt+T,服务器上则通过ssh进入。终端不是给图形界面当陪衬的,它会加载一个Shell会话,把.bashrc里的所有配置应用进来。我一般建议先设置历史记录和别名:
echo 'HISTCONTROL=ignoreboth:erasedups' >> ~/.bashrc alias ll='ls -l --color=auto' alias grep='grep --color=auto' source ~/.bashrcHISTCONTROL=ignoreboth:erasedups会忽略以空格开头的命令,并去掉历史里的连续重复;alias ll是输出彩色长格式,source手动重新加载配置。做到这一步,Shell才会变成你训练肌肉记忆的地方,而不只是一个黑窗。
3. 常用命令、用户权限与中文解压:把基础操作做成可查表
3.1 建立自己的命令查找表
基础差的时候总想搜“Linux常用命令大全”,其实先学会man -k,那里面已经包含了大全。
man -k "copy files" apropos dnsman -k和apropos等价,它搜索所有手册页的名称和描述,返回匹配命令。比如apropos dns会显示dig、host、resolvectl等,再man进去看详情。另一个容易忽略的是man分章节:man 2 read是系统调用,man 1 read通常不存在;进阶排查段错误时,这个区分比多背20条命令重要。
下面的信息命令表适合贴到桌面:
| 命令 | 用途 | 典型用法 |
|---|---|---|
man 名称 | 查看手册页 | man ssh_config |
type 名称 | 判断是Shell内建还是外部命令 | type cd |
command -v 名称 | 输出命令路径或别名定义 | command -v python3 |
which -a 名称 | 查找PATH中的所有同名文件 | which -a docker |
history | 查看历史命令 | history | grep docker |
!! | 展开上一条命令 | sudo !! |
type和command -v的差别在于,type会额外说“alias”或“builtin”,command -v更安静,适合写脚本时判断依赖是否存在。遇到“command not found”,先用command -v看PATH,再用ls /usr/bin对比。
3.2 用户和用户组与权限
“Linux新建用户”是使用频率很高的操作,但useradd和adduser有本质区别。adduser是会交互的Perl脚本,自动创建家目录和邮件池;useradd是低层命令,只按参数干活。服务器自动化场景里,我更习惯用useradd:
useradd -m -d /home/deploy -s /bin/bash deploy passwd deploy usermod -aG sudo deploy id deploy-m表示创建家目录,-d指定家目录路径,-s指定登录Shell。执行完id deploy,能看到uid=1001(deploy) gid=1001(deploy) groups=1001(deploy),27(sudo),说明这个用户既在自己组里,也在sudo组。
权限设计上,先熟悉/etc/passwd的七个字段:用户名、密码占位符、UID、GID、描述、家目录、Shell。例如deploy:x:1001:1001::/home/deploy:/bin/bash中,x表示密码实际存储在/etc/shadow,这个设计避免了普通用户读取密码哈希。
修改权限时,我常用这套组合:
groupadd app usermod -aG app deploy chown root:app /srv/app chmod 750 /srv/appchmod 750的含义是:属主rwx,属组r-x,其他人无权限。数字分别对应读4、写2、执行1。chown root:app把属主设为root,属组设为app,这样用户组内的成员才能协作。如果目录里全是共享文件,还需要考虑setgid位,例如chmod 2770,让新文件自动继承目录属组。
3.3 解压文件乱码的根因与修正
Linux下解压Windows传来的zip,常见现象是文件名变成乱码。根因不是压缩文件坏,而是zip记录文件名用了GBK编码,解压工具默认按UTF-8解码。先用file看压缩包,再带上编码参数解压:
file 中文名.zip unzip -O GBK 中文名.zip -d target/ 7z x 中文名.zip -mcp=GBKunzip -O是修改文件名字符集,-d指定输出目录;7z则用-mcp=GBK。这两个选项不是所有发行版的默认包都支持,解压报“invalid option”时,要安装p7zip-full或使用unar自动识别编码。
如果已经把文件名解乱,可以用convmv整体转码:
convmv -f GBK -t UTF-8 --notest -r target/--notest表示真正改名,不加它只预览。目录里混有其他编码时,先convmv -f GBK -t UTF-8 --notest会误伤,建议先file抽样再执行。
下表是常见压缩格式的处理方式:
| 格式 | 常用命令 | 编码处理 |
|---|---|---|
| zip | unzip 文件.zip | unzip -O GBK |
| zip | 7z x 文件.zip | 7z x -mcp=GBK |
| tar.gz | tar xzf 文件.tar.gz | tar不涉及文件名编码,乱码后用convmv |
| tar.xz | tar xJf 文件.tar.xz | 同上 |
| rar | unrar x 文件.rar | rar5默认UTF-8,旧包少见 |
3.4 DNS配置问题排查
“Linux中配置DNS出现的问题”排在热门前几位,大多不是配置格式错,而是系统里有多层管理工具。传统做法改/etc/resolv.conf,但很多发行版用systemd-resolved接管它,改动会被覆盖。
先看它到底指向哪:
ls -l /etc/resolv.conf resolvectl status systemctl status systemd-resolved如果/etc/resolv.conf是指向/run/systemd/resolve/stub-resolv.conf的软链接,说明systemd-resolved在管理DNS。临时测试可以手动修改后立即执行resolvectl flush-caches,永久配置则推荐用nmcli,因为NetworkManager会同步多处配置:
nmcli con show nmcli con mod "Wired" ipv4.dns "223.5.5.5 1.1.1.1" ipv4.ignore-auto-dns yes nmcli con up "Wired"第一行拿到连接名,第二行把DNS设为两组地址,ipv4.ignore-auto-dns yes意思是忽略DHCP下发的DNS,第三行重连生效。验证时不要只ping,因为ICMP可能被禁:
getent hosts www.example.com curl -I http://www.example.comgetent hosts会走系统解析库,curl -I确认HTTP层能连通。如果多级失败,再用tcpdump -i any port 53看查询是否发到预期DNS服务器。
4. 从systemd到Docker/KVM:让基础理论跑成服务
4.1 用systemctl管理服务状态
Linux服务器的服务生命周期由PID 1启动,现代发行版上PID 1通常是systemd。它把服务封装成unit,让你能用统一命令操作。最常用的不是service,而是:
sudo systemctl enable --now nginx systemctl list-units --type=service --state=running journalctl -u nginx -fenable --now合成了“开机自启”和“立即启动”;list-units用来确认哪些服务在跑,journalctl -u nginx -f实时滚动日志。排除启动失败时,先看systemctl status nginx,再看journalctl -u nginx --no-pager。这些命令比翻940页资料里的“服务管理”一节更直接。
4.2 Docker最小部署
Docker不是Linux发行版的一部分,但它完全依赖Linux内核的namespace和cgroup。安装本身不难,关键是理解容器只是加了隔离的宿主进程。
sudo apt install -y docker.io sudo systemctl enable --now docker sudo usermod -aG docker $USER docker run -d --name web -p 8080:80 nginx:alpine docker exec -it web sh docker logs webdocker.io是Debian/Ubuntu仓库里的包名,usermod -aG docker让当前用户免sudo执行docker,但改完组要重新登录。-d后台运行,--name命名容器,-p 8080:80做端口映射,docker exec -it进入容器Shell。看到这里应该明白,“Linux安装Docker”本身只有三条命令,后面的手脚都在端口、存储和网络。
4.3 KVM网络基础
KVM的网络比Docker更容易把人绕晕,因为牵扯到宿主机网桥、虚拟交换机、NAT和防火墙。默认安装后virbr0就是一个NAT桥,虚拟机通过它上网,宿主机外面的设备看不到虚拟机。如果虚拟机需要被别的机器直接访问,需要改成桥接模式,让虚拟网卡直接绑到物理网卡。
排查KVM网络时,先看虚拟网络状态:
virsh net-list --all virsh net-dumpxml default ip addr show virbr0virsh net-dumpxml default输出默认网络的XML,里面定义了virbr0的IP段、DHCP范围和NAT规则。学习阶段不需要手写XML,但要能读懂<forward mode='nat'/>和<bridge name='virbr0'/>这两行。它们的区别可以用表格概括:
| 模式 | 虚拟网卡如何通信 | 适用场景 |
|---|---|---|
| NAT | 共享宿主机IP,出站通过iptables转发 | 学习、隔离不强求 |
| 桥接 | 虚拟网卡直接使用物理网卡 | 需要对外提供服务 |
| 隔离 | 只允许虚拟网卡之间通信 | 安全演练、离线测试 |
4.4 用cron和脚本固化常见检查
基础学习到一定阶段,你会发现很多命令重复出现。把这些重复写进脚本,是这个阶段最有价值的练习。下面是一个简单的健康检查脚本:
#!/bin/bash set -euo pipefail load=$(uptime | awk -F'load average:' '{print $2}') mem=$(free -h | awk '/^Mem:/{print $3"/"$2}') disk=$(df -h / | awk 'NR==2{print $5}') echo "[$(date '+%F %T')] load:$load mem:$mem disk:$disk"set -euo pipefail是常见安全开关,-e遇错退出,-u未定义变量报错,pipefail让管道中任一命令失败都算失败。awk分别取出负载、内存和根分区使用率,输出日志时能看到时间戳。
放到/usr/local/bin/check.sh后加执行权限,再用crontab定时:
chmod +x /usr/local/bin/check.sh crontab -e */5 * * * * /usr/local/bin/check.sh >> /var/log/check.log 2>&1cron的五个字段分别代表“分 时 日 月 周”,*/5是每5分钟。写完可以crontab -l验证。这比开着top盯屏幕更接近生产习惯。
注意:cron守护进程默认不会加载用户Shell的环境变量,脚本里涉及
PATH时要在脚本开头写完整路径。
5. 安全加固与把940页变成私人手册的复习法
5.1 从SUID和提权路径看权限边界
学习权限时只记chmod数字是不够的。提权漏洞经常利用SUID程序,因为SUID会让普通用户以属主身份执行文件。先用下面命令找出系统里的SUID程序:
find / -xdev -perm -4000 -type f 2>/dev/null-xdev限制不进入其他文件系统,-perm -4000匹配设置了SUID位的文件。看到/usr/bin/passwd这类程序正常,但如果多余出现可疑路径,就要立刻检查。Linux防病毒并不只在Windows里起作用,ClamAV可用于扫描常见恶意文件,clamscan能做按目录扫描。对这种问题,更该关注auditd,它能记录谁在什么时候访问了哪些文件。
内核动态加载也值得了解:LKM(可加载内核模块)通过file_operations结构注册read/write回调,透明加密和审计软件都会用到这个机制。学习方向应该是“如何用lsmod和/proc/modules审计已加载模块”,而不是仿写rootkit。另外,sysctl里的几个保护项建议打开:
sudo sysctl -w fs.protected_hardlinks=1 fs.protected_symlinks=1这和透明加密一样,属于“让权限系统在底层不被轻易绕过”的措施。涉及磁盘敏感数据时,LUKS/dm-crypt是更彻底的透明加密方案,用cryptsetup luksFormat前必须确认已备份磁盘。
5.2 把PDF章节改写成自己的故障映射表
940页的PDF不是让你记住每一页,而是把故障场景对应到相关章节。我建议维护一个Markdown表,每次排查完一个麻烦就往里补一行:
| 故障现象 | 一条验证命令 | 回到资料的位置 |
|---|---|---|
| 解压中文乱码 | unzip -O GBK | 压缩与编码章节 |
| DNS配置被覆盖 | ls -l /etc/resolv.conf | 网络服务章节 |
| 服务启动失败 | journalctl -u 服务名 | systemd与守护进程章节 |
| 端口被占用 | ss -lntp | 进程与Socket章节 |
填表时不要写“第100页”,而是写“目录关键词:profile/bashrc”或“权限章节”。这样做的好处是,下次遇到相似问题时,你会先想起这条命令,再回到对应章节补理论,而不是从头翻书。
5.3 每周末跑一遍自测命令流
最后分享一个我周五收尾时会用的自测命令块,它把用户、网络、服务、磁盘几个维度的状态一次性打出来:
echo "== user/group ==" && getent passwd | wc -l echo "== listening ==" && ss -lntp echo "== failed services ==" && systemctl --failed echo "== disk ==" && df -h /getent passwd | wc -l看用户数量,ss -lntp看监听端口和对应进程,systemctl --failed找启动失败的服务,df -h看根分区剩余空间。我通常把这四行放进/usr/local/bin/weekly.sh,遇到有疑问的输出,就把命令和现象抄进故障映射表。下次再看到systemctl --failed里有陌生服务名时,打开终端先ss -lntp看看端口是否在听;如果端口在听但连不上,再man 7 capabilities,那一页会用权限边界给你新的排查线索。
本文还有配套的精品资源,点击获取