
1. 环境准备先装个Linux再谈别的1.1 虚拟机还是实体机很多新手刚接触Linux时第一反应是在自己电脑上直接装双系统结果分区没搞明白就把Windows引导搞坏了心态直接崩掉。我的建议很简单别折腾实体机先用虚拟机。虚拟机方案里我首选VMware Workstation Player免费版就够用操作界面也比VirtualBox更顺手一些。装好之后去国内高校镜像站下载一个Ubuntu 22.04 LTS的ISO镜像这玩意儿是当下最适合新手的发行版网上能搜到的教程和踩坑记录也是最多的遇到问题更容易找到答案。安装虚拟机的时候有几点要注意。内存建议分2GB以上磁盘分20GB以上否则后面编译个东西、跑个容器都会卡到你怀疑人生。网络模式选NAT就行不用手动去配IP。安装Ubuntu的时候选“最小安装”不要选“完整安装”能省不少时间桌面环境等进去之后按需自己装就行。1.2 第一次开机后先干这几件事从0到1的第一步不是急着敲命令先把基础环境理顺。开机进系统之后我用终端CtrlAltT执行了下面几条命令sudo apt update sudo apt upgrade -y这两条命令会把软件源缓存刷新一遍然后升级系统里已有的软件包。如果你用的是Ubuntu刚装好的时候务必先做这一步不然后面装什么都会遇到依赖问题。这里面有个小细节值得多说一句sudo这个命令意味着“以管理员权限执行”后面跟的命令会以root身份运行。新手第一次用sudo会提示输入密码输入的时候屏幕不会显示任何字符这不是系统卡了是Linux的安全习惯——密码连星号都不显示。我第一次用的时候还以为键盘失灵了后来才知道这是正常的。另外我建议把软件源换成国内镜像源。Ubuntu默认连的是官方源在国内拉软件包慢到让人抓狂几分钟能等成大几分钟。换源的操作用一句话就可以完成编辑/etc/apt/sources.list把archive.ubuntu.com全部替换成mirrors.tuna.tsinghua.edu.cn然后重新执行sudo apt update。镜像站的选择其实无所谓清华、阿里、中科大几个大站的同步都很及时挑一个离自己近的就行。2. 目录与文件操作Linux世界的两条铁律2.1 一切皆文件目录是棵树Linux和Windows最大的思维差异在于在Windows里我们习惯用盘符C盘、D盘来组织文件而Linux里所有东西都挂在“根目录”这棵树上根目录用/表示下面延伸出/home、/etc、/var、/usr这些标准目录。新手必背的三个目录概念/home普通用户的家目录所在地你在终端里看到的~符号其实就是/home/用户名的简写。/etc系统配置文件的总部改系统配置基本都在这里操作。/var经常变化的文件比如日志、缓存都放这里。这棵树的结构好处在于路径是唯一的、确定的不存在“这个文件到底在哪个盘”的歧义。理解了这一点后面学绝对路径和相对路径就不会绕晕。2.2 高频文件命令实战先上最常用的命令清单跟着地址走ls # 查看当前目录内容 cd /home # 切换到指定目录 pwd # 打印当前所在路径 mkdir myproject # 创建文件夹 touch readme.txt # 创建空文件 cp readme.txt readme_backup.txt # 复制文件 mv readme.txt /home/user/docs/ # 移动文件 rm readme_backup.txt # 删除文件 find / -name readme.txt # 全盘找文件这里我特别想展开讲讲ls它是我用得最多的一条命令。带-l参数可以看文件权限、大小、修改时间带-a可以显示隐藏文件Linux里以.开头的文件默认隐藏带-h会把文件大小显示成人类可读的格式比如512M而不是一串字节数字。三条合起来是ls -lah这个组合键我几乎每天都要敲几十次。删除命令rm要敲得格外小心。rm -rf这三个字母的组合是Linux新手的“新手村杀手”——-r表示递归删除-f表示强制不询问。在错误目录下执行一次rm -rf目录里的东西连回收站都救不回来。我的经验是重要数据目录里的删除操作永远先用mv把文件移动到/tmp目录观察几天没问题再真正删。这个习惯救了我好几次。2.3 grep、find、管道组合起来才是威力单条命令只是基本功Linux命令真正的灵魂在于组合。grep -r error /var/log/nginx/ # 在nginx日志目录里递归搜索所有含error的行 find /var/log -name *.log -mtime 7 # 查找7天内修改过的日志文件 cat /var/log/syslog | grep ERROR | head -20第三条命令里出现了管道符|它的作用是把前面命令的输出结果作为输入传给后面的命令。可以理解为一条生产流水线cat负责把文件内容倒出来grep负责筛选出包含ERROR的行head -20负责只要前20行一步步筛下来最终得到我们关心的信息。嵌入式Linux开发场景里这种排查日志的方式尤其常用。设备跑起来后日志文件动辄几十MB用grep配合管道筛出关键字比在编辑器里翻页快得多。2.4 软链接和硬链接理解inode的小门槛ln命令用来创建链接文件新手一般先掌握软链接就够了ln -s /usr/bin/python3 /usr/bin/python # 以后敲python就等于敲python3软链接可以理解为Windows的快捷方式删除原文件后链接会失效。硬链接则可以理解为文件的另一个目录入口删除原文件后链接依然能够访问数据。硬链接只有普通文件支持目录不行跨文件系统也不行。我见过不少新手在这里栽跟头领导说“给这个可执行文件做个快捷方式”有人直接cp了一份结果原来程序更新了复制的那份还是老的折腾半天排查不出来。用软链接才是正解指向同一份原文件永远同步。3. 用户与权限多用户系统的立身之本3.1 为什么不直接用rootWindows的世界里管理员账户是默认的日常账户想干嘛就干嘛。但Linux世界的逻辑完全不同日常操作建议永远用普通用户只有需要系统级改动时才用sudo提升权限。这样做最关键的是安全考量。root权限能执行一切操作误删一个系统目录整个系统就崩了而且没法轻松恢复。普通用户则只能动自己的文件系统核心文件只有只读权限最大程度降低了误操作的风险。多用户场景下这种设计更重要。服务器上一个团队多人使用有人误执行了rm -rf /home如果是root身份执行大家的数据全没了如果所有人都用普通用户身份至少其他用户的家目录是被权限保护着的。3.2 useradd与passwd实操新建用户这件事我推荐用adduser而不是useradd。sudo adduser newuseradduser是个交互式命令会引导你设置密码并创建家目录对新手非常友好。useradd则是底层的系统命令参数复杂默认不会创建家目录熟手用都容易踩坑。新建用户后往往还要把sudo权限给用户让他能执行管理员命令sudo usermod -aG sudo newuser-aG的意思是把用户追加到sudo用户组注意务必带-a否则会把用户从其他组里踢掉。这个细节我踩过坑有一次写用户组配置时漏了-a直接把用户名写进了组字段结果是该用户原来所在的补充组全被清掉了一些服务权限当场失效。3.3 chmod与文件权限速查Linux文件权限由9位字符组成常见的显示格式是rwxr-xr--每三位一组分别代表文件属主、属组、其他用户的权限。r是可读w是可写x是可执行。用数字表示的话各权限的权重分别为r4w2x1。所以chmod 755表示属主有rwx4217属组和其他人只有rx415这是最常见的脚本和可执行文件的权限配置。关于目录权限这里有个新手容易搞混的点文件的x权限表示可执行目录的x权限表示“可进入”。如果目录只有r权限但没有x权限你能列出目录里的文件名但没法进入这个目录也没法操作里面的文件。很多新手配置网站目录时发现文件夹明明能看到文件名浏览器却报403权限错误多半就是目录少了x权限。3.4 chown修改归属sudo chown -R www-data:www-data /var/www/这个命令把/var/www/目录及里面所有文件-R递归的属主和属组都改成www-data用户。部署Web环境时这是高频操作——Nginx或Apache运行在www-data用户下如果网站文件属主还是root程序就无法正常读取写入文件。权限和归属问题是Linux运维排查里占了很大比例的问题源。文件在本地明明能读写部署到服务器上就不行十有八九是属主或权限不对用ls -lah看一眼立刻就能定位问题。4. 磁盘操作与挂载管理数据安全的心法4.1 df与du磁盘用到哪了df -h # 查看各分区磁盘占用情况 du -sh /home/user/ # 查看指定目录总占用大小 du -h --max-depth1 /home/user/ | sort -hr | headdf -h适合快速看磁盘剩余空间du -sh适合精确看某个目录占多少。第三条命令列出的用法我很常用列出指定目录下每个子目录的大小并按从大到小排序。系统磁盘报警的时候用这条命令一级一级往下钻很快就能找到是哪个目录在吃空间。日志目录/var/log、容器目录/var/lib/docker、包管理器缓存/var/cache是三个长期占据空间的大户清理时优先从这里下手。4.2 硬盘分区与格式化新加一块硬盘在Linux里要经过“识别→分区→格式化→挂载”四步。lsblk # 查看所有块设备 sudo fdisk /dev/sdb # 进入分区交互界面输入n新建分区w保存退出 sudo mkfs.ext4 /dev/sdb1 # 格式化为ext4文件系统这里重点讲一下mkfs.ext4这是把分区“格式化”成指定文件系统的命令。ext4是Linux最主流的文件系统兼容性、稳定性和性能都不错日常使用首选。如果你有特殊需求比如文件大小上限特别高、或需要更强的日志保护机制再考虑xfs或btrfs但那只针对有明确理由的场景。分区格式化之后的挂载命令是sudo mount /dev/sdb1 /mnt/data echo /dev/sdb1 /mnt/data ext4 defaults 0 2 | sudo tee -a /etc/fstab第二条命令很关键它把挂载配置写进了/etc/fstab文件这样每次重启系统时都会自动挂载这块盘。如果只执行mount不写fstab一重启挂载就丢了新手很容易在这里栽跟头。4.3 挂载NAS存储运维场景的标配技能企业环境里NAS网络附加存储几乎是标配。Linux挂载NAS的核心命令是mount -t nfs或者mount -t cifs具体用哪个取决于NAS端开的什么协议。我经常在公司内网环境里做这类操作大致命令形如sudo apt install nfs-common sudo mount -t nfs 192.168.1.100:/volume/backup /mnt/nas跟本地磁盘挂载的区别在于源地址变成了一个IP加冒号加共享路径IP地址换成你的NAS地址即可端口号、共享名称、认证方式这些参数需要和NAS侧配置对齐。挂载完成后NAS目录里的文件就和本地文件一样读写备份数据、共享文件都会方便很多。如果你遇到挂载报错切换协议是首要排查方向——NFS和SMB/CIFS是两套完全不同的协议NAS管理界面里显示支持的是哪个协议Linux这边就挂哪个混着用一定会失败。另外注意确认网络是否通用ping测一下NAS地址网络不通再调什么都白搭。4.4 卸载的安全姿势sudo umount /mnt/nas卸载之前要确认没有进程正在使用这个挂载点否则会报target is busy。如果实在确定没有程序在读写可以用lsof D /mnt/nas查看哪个进程占用了文件再决定是否安全卸载。还有一个常见错误是把命令敲成umount没有“n”这是Linux里少数的拼写反直觉的命令很多人第一次都敲成unmount然后报错正常记住就好。5. 进程与服务管理看清系统在干什么5.1 ps与top第一梯队排查工具ps -ef # 查看所有进程的完整信息 top # 动态刷新进程CPU和内存占用ps -ef是静态快照适合抓取某个时刻所有进程的列表。top则像Windows的任务管理器实时刷新。如果只想看某个进程配合grep过滤即可ps -ef | grep nginx这里有个容易犯的错grep自己的进程也会被搜出来比如命令本身带“nginx”字样搜索结果里会多出一行grep nginx。要排除这行可以在grep参数里加一个方括号技巧ps -ef | grep [n]ginx方括号让grep匹配的是“nnginx”的进程名命令自身的进程名则是“[n]ginx”这样就不会匹配到自己了。这是我做运维后学到的很有意思的写法。5.2 kill命令的正确打开方式杀进程要用kill别用kill -9直接莽kill 1234 # 优雅终止给进程机会清理资源 kill -9 1234 # 强制杀掉慎用kill命令本质是向进程发送信号默认信号是TERM15也就是请进程自己退出进程收到后可以执行清理工作。kill -9发送的是KILL信号内核直接回收进程不给任何机会。数据库、写日志的服务被kill -9是很容易丢数据的能优雅退出的操作就不要暴力解决。5.3 systemctl管理服务现在主流的Linux发行版都用systemd来管理系统服务对应的管理命令是systemctlsudo systemctl start nginx # 启动服务 sudo systemctl enable nginx # 设为开机自启 sudo systemctl status nginx # 查看运行状态 sudo systemctl restart nginx # 重启服务enable这个操作很实用它会在开机启动项里注册这个服务。很多人改了nginx配置后直接重启系统来验证其实不需要重启systemctl restart nginx就够了系统重启是运维的大忌能避免就避免。5.4 修改进程名称运维排查的隐藏技能进程名称默认显示的可执行文件名称但在某些场景下——比如用Python脚本跑了多个不同任务ps -ef看到的全是一长串python路径区分度极差。这时可以用setproctitle库来改进程显示名称。pip install setproctitleimport setproctitle setproctitle.setproctitle(data_collector_service)之后在ps -ef里看到的就不再是一串python路径而是直观的data_collector_service。排查问题、统计资源占用时立刻就能区分出不同任务。这个技巧在跑批任务、数据处理服务的场景里非常趁手属于那种不常用、但关键时刻极其好用的操作。6. 网络排查从入门到出门6.1 ping、ip、ss的日常用法网络命令是Linux排查的敲门砖我先列一份日常高频指令ping 192.168.1.1 # 测试本机和目标IP之间的网络连通性 ip addr # 查看本机IP地址配置 ip route # 查看路由表默认网关看这里 ss -tlnp # 查看本机监听的TCP端口 curl -I http://localhost # 测试本地HTTP服务可不可用ss -tlnp是排查端口占用问题的传统艺能。“这个端口到底谁在占用”是运维日常的高频问题这个命令立刻就能看到端口对应的进程。以前大家喜欢用netstat现在新版系统里ss是官方推荐替代方案输出更简洁、性能也更好。6.2 网络不通的排查顺序网络出问题排查方向比排查工具更重要。我的习惯是沿着网络链路一层层往下查先确认本机网卡状态和IP配置是否正确这时候用ip addr然后测网关通不通ping网关地址接着测外网域名解析正不正常nslookup baidu.com最后确认路由路径上有没有丢包用traceroute。这一套流程下来问题基本能锁定在“本机配置、内外网连通、DNS解析、链路质量”这几个层面里。新手最容易犯的错误是一上来就ping www.google.com然后报不通就断言“网络坏了”——实际上很可能是企业内网根本不让你出外网内网资源照样全通。因此排查的第一步永远是明确你的网络边界哪些地址应该在同一个内网不在同一个环境的地址测不通原因复杂得多。6.3 curl与wget命令行里的浏览器和下载器curl -I https://example.com # 只获取HTTP响应头 curl -X POST -d namevalue http://api.example.com/submit # 提交POST请求 wget https://example.com/file.tar.gz # 下载文件curl在排查Web服务时是利器。网站打开慢或报错我先curl -I看响应码200是正常的403是权限问题500是后端程序错误502是反向代理挂了503是服务过载。响应码能直接缩小排查范围。6.4 修改主机名sudo hostnamectl set-hostname myserver改了之后重新登录shell就能看到新主机名。主机名混乱是服务器管理的一大痛点有个明确的命名规范排查问题时能少不少沟通成本。7. Shell脚本入门把重复劳动交给机器7.1 第一个脚本的江湖规矩Linux基础命令学得七七八八之后写脚本是进阶的必经之路。脚本本质上就是把一串命令按逻辑组合起来让机器替你执行。新建脚本文件后头一件事是加执行权限chmod x myscript.sh然后脚本第一行固定写这行shebang#!/bin/bash这行不是注释。它的作用是告诉系统用什么解释器来运行这个脚本。写了这行之后直接./myscript.sh就能执行不写的话系统会默认用当前shell执行有些语法在别的shell里行为会不一样容易出现诡异报错。这个习惯从第一天就要养成。7.2 变量与控制结构#!/bin/bash LOG_DIR/var/log/nginx BACKUP_DIR/tmp/nginx_logs if [ ! -d $BACKUP_DIR ]; then mkdir -p $BACKUP_DIR fi cp $LOG_DIR/*.log $BACKUP_DIR/ echo 日志备份完成备份目录$BACKUP_DIR脚本里if判断条件那两边的空格是强制性的语法要求少了空格就会报command not found。这个细节对新手来说极其不友好很多人在if语句上卡了半小时最后发现是空格的问题。写脚本时养成随手检查空格的习惯可以省很多事。for循环是遍历文件、批量操作的好帮手for user in alice bob carol; do sudo useradd $user echo 创建用户 $user 完成 done7.3 定时任务crontab五段式脚本写好了配上定时任务才完整crontab -e文件里每行一个任务格式是“分 时 日 月 周 命令”。比如每天凌晨3点执行备份脚本0 3 * * * /home/user/backup.sh /var/log/backup.log 21这段配置里的时间依次表示第0分钟、第3小时、每个月的每一天、每个月、星期几。*就是“每”的意思。最后的 /var/log/backup.log 21很关键它的作用是把脚本的标准输出和错误输出都追加到日志文件避免脚本执行结果丢失。用crontab的标配动作是加这一行日志重定向不加的话脚本里输出的内容只会随执行结束而消失出了问题连痕迹都没有。7.4 写脚本的三个检查习惯脚本写完后执行前的自查清单语法检查bash -n script.sh如果语法有问题会直接报错没问题则静默返回。变量检查把脚本里所有变量列出来确认每个都有初始值或默认值空变量在[ ]判断里会出现意想不到的行为。危险操作确认凡是涉及rm、mv、覆盖写入的操作确保前面有路径判断或输出提示防止误操作把家目录清了。这个清单帮我在生产环境里避免了好几次重大事故。8. 综合实战一条命令链路干点实事8.1 场景统计超大目录里的大文件假设要排查某个分区磁盘吃紧的原因一条命令链路可以迅速定位大文件find /var -type f -size 100M -exec ls -lh {} \; 2/dev/null | awk {print $5, $9} | sort -hr | head -20我们来拆开这条命令新手看到这一连串符号会懵但理解了管道之后就清晰了find找出占用空间最大的文件路径ls把文件大小显示出来awk只提取大小和路径字段最后sort排序并取前20条。这样的链路思维是Linux命令用的越熟之后自然而然形成的习惯。8.2 场景日志文件被占满的清理技巧日志文件被进程占用直接rm是不能真正释放磁盘空间的。正确做法是truncate -s 0 /var/log/nginx/access.logtruncate -s 0作用是把文件内容清空但保留文件进程的文件指针依然有效日志会继续往这个空文件里写。如果直接rmnginx的文件句柄还指着旧文件空格子根本不会释放要重启服务才能真正回收空间。这个技巧对nginx、Tomcat这类长驻进程的日志文件都适用。8.3 场景批量重命名文件for file in *.txt; do mv $file ${file%.txt}_backup.txt done${file%.txt}的意思是从变量file的末尾去掉.txt再拼上_backup和后缀。这样report.txt会被改成report_backup.txt。批量改名需求里这套操作足够解决大部分“加前缀、改后缀、加时间戳”之类的场景不需要装任何额外的重命名工具。9. 高频报错与排查速查表9.1 常见报错一句话定位报错信息原因处理方式Permission denied权限不足或没有执行权限用ls -l检查权限必要时chmod加权限command not found命令不存在或不在PATH中确认拼写或使用绝对路径执行No such file or directory路径写错或文件不存在用ls和pwd确认实际路径Connection refused目标端口没有服务监听用ss -tlnp确认服务状态disk is full磁盘空间耗尽用df -h确认用du找到占用源并清理apt lock包管理器被占用重启系统或sudo rm /var/lib/apt/lists/lock清理锁文件9.2 报错排查的通用套路大多数Linux报错不是深奥晦涩的系统问题而是几个常见原因轮流转。我的排查顺序永远是磁盘空间→权限→路径→服务状态→资源限制。磁盘空间看df -h权限问题看ls -l的权限位路径问题用pwd和ls确认服务状态看systemctl status资源限制用ulimit -a查询。把这五步走一遍八成以上的问题当场就能定位。9.3 日志永远是你最好的老师排查问题最忌讳的是对着屏幕干瞪眼瞎猜。正确姿势是去看日志。系统级别看/var/log/syslogUbuntu系或/var/log/messagesCentOS系应用级别看各自业务目录下的日志文件。日志的位置有时候不好记但有一个通用套路journalctl -xe可以查看最近的系统日志和错误信息不需要知道具体日志文件在哪。它在systemd环境下基本都会有效果。10. 给新手的一些深度思考学了这么多命令之后一个重要的问题是Linux命令到底要不要背我的观点是不需要刻意背。重点不在于每个命令的每个参数都记下来而在于理解几条核心方法论一切皆文件、权限模型、管道与重定向、日志排查法。命令忘了没关系man手册就在那里--help参数就在那里知道用什么命令和去哪里查比记住命令本身更重要。我在带新人的时候经常让他们做一个练习给自己写一个“个人命令手册”每学到一个新命令就记录一句话说明加一个实际场景不用写参数大全只写自己真正用过的部分。三个月下来这本手册会成为你工作里最常用的参考资料。所谓从0到1上手Linux这个“1”不是背完所有命令而是建立起一套属于自己的排查思路和工具链能在遇到问题时知道从哪个方向下手。就我个人经验来说Linux基础命令入门最舒服的路径是“环境里泡出来”装个虚拟机、部署一次网站、写几个脚本解决自己的重复劳动、报错时报错时好好看日志。命令这东西用的多了自然就熟了完全不用急着把满汉全席都吃一遍。