
1. 站在入门门槛前Ubuntu装机初体验很多朋友接触Linux的第一站就是Ubuntu原因很简单资料多、软件源丰富、遇到问题随便一搜就有答案。但真正从零开始跑起来的人大概率会在装系统这一步就卡一会儿不是镜像选错就是双系统和虚拟机之间来回纠结。所以聊命令之前先花点时间把系统装好这件事说透后面敲命令才有意义。1.1 选镜像和安装方式是第一个坑Ubuntu镜像下载最稳的渠道是官网和各大高校镜像站。官网的下载速度看网络情况国内用户走阿里云、清华、中科大这些镜像站会快很多。版本上目前主流是Ubuntu 24.04 LTSLTS意思是长期支持桌面版支持三年服务器版支持五年普通学习或生产环境优先选它肯定错不了。安装方式就比较个性化了主要分三种物理机单系统、双系统、虚拟机。物理机单系统适合旧电脑改造、专门的服务器机器U盘启动后一路Next就行。双系统适合Windows为主但又想深度体验Linux的同学。装之前最好先在Windows里用Disk Management压缩出一块空闲分区然后U盘启动安装时选择Install alongside WindowsUbuntu会自动识别缩出来的空间。虚拟机适合只是想快速上手、不想动宿主机分区的人。VMware或VirtualBox新建虚拟机加载ISO镜像分配2核CPU、4GB内存、40GB磁盘就足够入门了。虚拟机安装的坑最常见的是安装过程中蓝屏或者启动时卡在某个界面。这类问题大多是虚拟化设置不对。以VMware为例Ubuntu 24.04建议在虚拟机设置里开启虚拟化引擎VirtIO或者硬件虚拟化并且给到的内存不能低于2GB否则安装器起不来。还有一次我遇到的奇葩情况虚拟机里安装时选了3D加速结果图形界面一直黑屏关掉这个选项重新装就正常了。1.2 装完系统先别急着敲命令先做三件事系统装完进入桌面很多人第一反应是打开终端开始敲命令但我个人建议先做三件事能让后续少很多折腾。第一件事是换软件源。默认源在国外apt安装东西动不动就卡住或者超时。打开Software Updates把源从Server for United States换成阿里云或中科大镜像然后终端里跑一次sudo apt update sudo apt upgrade把系统包刷新到最新。这一步做完你后续装GCC、Docker、Python这些才会顺畅。第二件事是配置中文输入法。很多人装完系统发现没法打中文其实Ubuntu桌面版自带iBus输入法框架只需要在Settings - Keyboard - Input Sources里添加Chinese (Intelligent Pinyin)就行。如果你要装搜狗输入法那需要先安装fcitx框架再下载搜狗Linux版安装包然后用im-config -n fcitx切换输入法框架注销重新登录才生效。这个坑我踩过装了搜狗却切不过去就是因为没有执行im-config切换。第三件事是确认系统架构和内核版本后面的命令都要基于这个来选。终端里执行uname -a uname -m lscpuuname -m会输出x86_64Intel/AMD 64位或者aarch64ARM架构树莓派、飞腾等这决定了你下载软件包时选x64还是arm64版本。很多人在下载Miniconda、Docker、VS Code时选错架构装了一堆不兼容的包根源就在于没有先看架构。做完这三件事系统才算真正准备好接下来所有的命令操作都会顺畅很多。2. 文件与目录操作一天至少有八成的命令敲在这文件操作是Linux命令的基础也是每天敲得最多的部分。很多新手一上来就去学高深的grep、awk结果最基本的ls和cd反而用不熟。我见过不少同事连ls -lh这种最实用的组合都不认识一看就是没认真研究过命令参数。文件操作这块把每个命令的常用参数吃透效率能提升一大截。2.1 ls和cd用参数把家底看清ls说它是Linux里执行次数最多的命令也不夸张。裸敲ls只能看到当前目录的文件名但实际工作中经常要看的远不止这些ls -l ls -a ls -lh ls -lt ls -l /etc/nginx/-l长格式列出权限、属主、大小、修改时间这是最核心的用法。-a显示隐藏文件配置文件的隐藏属性全靠它发现。-h配合-l把文件大小显示为K、M、G看着直观。-t按修改时间排序找最新改动的文件特别好用日志目录里定位问题经常用。我习惯用ls -lah组合不加任何额外输出也能把目录情况摸个八九不离十。cd大家都会但有两个细节非常实用。cd -能快速返回上一次所在目录在深目录和浅目录之间来回切换时省时省力。cd ~返回当前用户家目录比cd /home/用户名快得多。还有一个很多人不知道的技巧cd只能进目录如果想直接切到某个带有空格或特殊字符的目录用Tab自动补全最靠谱手动敲很容易出错。2.2 增删改查四件套mkdir、cp、mv、rm这四个命令是文件操作的骨架每个都有必须掌握的参数。mkdir创建目录mkdir test # 创建单个目录 mkdir -p a/b/c # 递归创建多级目录 mkdir -m 755 dir # 创建并指定权限-p参数非常关键创建多级嵌套目录时没有它直接报错。我见过一个人写部署脚本创建/opt/app/logs这个路径时只写了mkdir /opt/app后面又单独建logs结果脚本跑一半就崩了原因就是没理解-p的价值。cp复制文件或目录cp file.txt bak/ cp -r project/ backup/ # 复制目录必须加-r cp -a dir/ target/ # 保留权限和属性完整复制 cp file1.txt file2.txt # 复制并重命名cp -r是复制目录的标配不加就报omitting directory。-a是归档模式等于-r加上保留权限、时间戳、符号链接属性备份场景优先用。mv移动或重命名mv old.txt new.txt # 重命名 mv file.txt /tmp/ # 移动文件 mv /src/dir /dest/ # 移动整个目录mv在同一个文件系统内就是改个指针的事速度极快。跨文件系统移动时实际是复制加删除大文件会显得慢。我原来的同事有个经典误操作写脚本移动日志文件路径写错导致mv把重要日志丢到了错误位置排查半天。后来学乖了移动前先ls一次目标路径确认存在。rm删除rm file.txt rm -r dir/ rm -f file.log # 强制删除不提示 rm -rf dir/ # 最有威力也最危险rm -rf是Linux世界里最能锻炼心态的命令。删掉重要数据的人十个有九个都敲过它。我的建议是不要在root用户下随意敲rm -rf不要在参数里出现/这种绝对路径的根目录能加-i交互提示就加-i。真要删重要目录先用mv dir /tmp/移走观察几天再删这个习惯救了我好几次。2.3 高效查找文件find才是真正的大杀器find是查找文件的首选。它的逻辑就是给一个起点路径按条件往下找。常用格式find /var/log -name *.log find /home -type f -size 100M find /etc -name *.conf -mtime -7 find / -name nginx.conf 2/dev/null find . -type d -empty几个关键参数-name按文件名匹配-type指定f文件或d目录-size 100M表示大于100MB的文件-mtime -7表示7天内修改过的文件。每次全盘搜索之前最好加上2/dev/null把权限报错丢掉否则满屏的Permission denied会干扰视线。find还能直接执行操作find /tmp -name *.tmp -exec rm {} \; find /tmp -type f -mtime 30 -delete第一个命令把找到的临时文件逐个删除{}代表每个匹配项第二个直接把30天前的文件清掉。这种用法在清理日志和临时文件时非常高频。我自己写清理脚本时固定用-mtime 30 -delete比手动一个个删高效太多。不过还是那句老话先跑一遍不加-delete的版本确认匹配到哪些文件再真正执行删除。3. 系统信息与硬件状态先把机器摸透新拿到一台Linux机器或者接手一个服务器第一步绝对不是急着跑业务而是先把机器本身的底细摸清楚。系统什么架构、内核版本多少、CPU几核、内存多大、磁盘还剩多少、显卡有没有驱动这些信息决定了你后续安装软件、调参、排障的方向。命令就那一两个但看懂输出才是关键。3.1 系统架构和内核版本uname算是系统信息查询的一库最常用的组合是uname -a # 输出全部内核和系统信息 uname -r # 内核版本比如6.8.0-31-generic uname -m # 机器架构x86_64或aarch64内核版本和架构这两项信息之所以重要是因为很多软件安装包要对应架构和内核版本。比如CUDA工具包、NVIDIA驱动这类底层组件版本不对轻则功能缺失重则启动直接崩。我见过有人在x86机器上硬装arm版本的Docker镜像跑是跑起来了性能惨不忍睹查了半天才发现架构选错了。另外uname -r还能辅助判断当前内核是否太旧Ubuntu 24.04默认内核是6.8如果你还在4.x老内核上跑很多新特性不支持建议直接升级系统版本。查看发行版信息用的是cat /etc/os-release lsb_release -a/etc/os-release输出NAME、VERSION、ID这些字段脚本里判断系统类型时非常常用。比如写部署脚本时需要区分Ubuntu和CentOSgrep -i ubuntu /etc/os-release就是标准的判断方式。3.2 内存、磁盘和CPU状态系统性能这类问题终端命令最直接。内存查看free -h-h参数很关键把内存数值显示成G或M级别一眼看懂。输出里重点关注available一列它才是真正可用的内存大小而free列是未分配的内存两者差很多。available接近0的时候说明内存吃紧再跑大程序就可能触发OOM杀进程。我原来排一个Java服务频繁崩溃的问题free -h一看available只剩几十MB罪魁祸首是另一个进程把内存吃光了杀掉之后服务立刻恢复。磁盘查看df -h磁盘使用率的判断df -h的输出明白人扫一眼就知道问题在哪。重点看/挂载点的Use%超过80%就该清理了。数据库服务器如果磁盘满直接导致写入失败甚至数据库宕机这个是运维事故的重灾区。另外du -sh看指定目录占用比如du -sh /var/log能快速找出哪个目录把磁盘吃光了。CPU状态top uptimetop命令打开后是个动态界面按CPU占用率排序。第一行的load average三个数值分别代表1分钟、5分钟、15分钟的平均负载经验值是数值不超过CPU核心数就基本健康超过4倍说明系统已经忙不过来了。top里按P按CPU排序按M按内存排序按q退出。uptime就是快速看一眼负载和开机时长适合写脚本或远程排查时第一眼确定机器状态。3.3 显卡驱动Ubuntu用户绕不开的坑现在很多入门Linux的人是为了学习和做AI、跑深度学习来的显卡这块是绕不过去的坎。先看有没有装驱动nvidia-smi lspci | grep -i nvidianvidia-smi能显示GPU型号、驱动版本、显存占用如果命令报command not found说明驱动没装好。lspci | grep -i nvidia则从硬件层面看到底有没有NVIDIA显卡被系统识别。注意lspci可能需要先安装pciutils包。Ubuntu下安装NVIDIA驱动最推荐的方式是sudo apt update sudo apt install nvidia-driver-535 sudo reboot装完重启后执行nvidia-smi验证。也有很多人喜欢从NVIDIA官网下载.run驱动手动装但手动装的坑极多因内核版本和GCC版本不匹配导致编译失败开普勒和英伟达新驱动版本不兼容把系统搞到图形界面起不来的案例数不胜数。我的建议是能走apt就走apt简单、稳、卸得干净手动方式留给有特殊需求的人。顺手提一句查看系统时间是否跟服务器同步用timedatectl。输出里有NTP synchronized: yes/no字段如果显示no执行sudo timedatectl set-ntp true sudo systemctl restart systemd-timesyncd时间不同步对日志排障和定时任务影响极大我遇到过线上证书突然失效的问题排查了半天发现是服务器时间慢了两分钟硬生生错过证书有效期窗口。4. 软件安装与包管理apt这套组合拳Ubuntu的软件管理核心就是apt。很多Windows转过来的用户一开始不太习惯软件不是双击安装这件事但apt这套包管理机制的逻辑性其实更强软件包依赖关系由系统自动处理安装、升级、卸载都有统一接口。搞懂apt的几个核心命令基本就能应付90%的软件需求。4.1 apt update、install、remove的完整链路apt最常用的命令组是sudo apt update sudo apt upgrade sudo apt install 包名 sudo apt remove 包名 sudo apt purge 包名 sudo apt autoremove sudo apt search 关键词apt update是从软件源更新软件列表它本身不装任何软件但如果没有这一步install的时候搜不到最新软件包。upgrade才是真正升级已安装的软件。这两者的关系很多新人都搞混其实记住一句话就行update先刷新索引upgrade再执行升级。apt install能自动处理依赖你装一个软件它会自动把依赖库一起装好。remove卸载软件但保留配置文件purge连配置文件一起删干净。autoremove清理那些没用的自动安装依赖时间久了能释放不少空间。安装完成后如果想看某个软件能提供哪些文件用dpkg -L 包名比如dpkg -L nginx会列出nginx安装后所有的文件路径。排查配置文件在哪这个问题时这条命令比到处翻目录高效多了。4.2 安装编译工具链GCC失败的经典解法装GCC是Linux入门者的必经之路但很多人都会遇到安装失败的情况。最常见的失败场景是sudo apt install build-essential然后终端输出一长串依赖错误或者提示Unable to locate package build-essential。前一种情况基本是软件源列表没更新sudo apt update sudo apt install build-essential如果update之后还是提示找不到包检查一下软件源配置文件/etc/apt/sources.list确认源地址没写错。我遇到过源被改成了无效地址update时一堆404错误改了源马上就好了。更复杂的一种失败是依赖关系炸了sudo apt --fix-broken install sudo dpkg --configure -a这类情况通常是之前某个安装中断导致的--fix-broken尝试修复破损的依赖dpkg --configure -a重新配置所有未完成的安装。执行完再跑一次apt install基本能解决。如果还不行检查是否安装了不该装的第三方源软件包用apt remove卸了再装。验证GCC安装成功gcc --version grep --version能正常输出版本号说明编译链可用。我个人的习惯是装完build-essential后立刻顺手装make、cmake、git后面写代码、拉项目、编译第三方库都用得上省得每次缺什么都现装。4.3 中文输入法和常用软件的安装思路中文输入法这个事前面提过一嘴这里展开说说。Ubuntu桌面版不自带拼音输入法需要手动加。最省心的是先把语言包补上sudo apt install language-pack-zh-hans然后设置里添加输入源就行。如果你更喜欢搜狗输入法流程是先装fcitx框架再下载搜狗Linux版deb包sudo dpkg -i 文件名.deb安装最后用im-config -n fcitx切换。但这里有个大坑搜狗输入法的安装包对Ubuntu 24.04这种新版本的兼容性不一定好装上之后可能无法启动图形界面输入我在24.04上就吃过这个亏。当时我卸载搜狗、把输入法框架切回iBus重新添加拼音源才恢复正常。Ubuntu生态里还有很多软件需求比如微信、同花顺这类国产软件。微信有Linux官方版直接在官网下载deb包安装用起来基本功能没问题。同花顺也有Linux版但体验和Windows版有差距如果只是看行情浏览器走网页版也够用。至于Windows独占的软件想跑起来只能靠Wine但Wine的兼容性实在一言难尽装个简单的小工具还行大型软件就别指望了。我的建议是日常主力软件尽量找原生Linux版找不着就用网页版或虚拟机兜底别在Wine上浪费时间。还有一个软件安装的热门场景是Docker。现在很多项目都容器化了Ubuntu下装Docker官方推荐用社区版源sudo apt update sudo apt install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg这一串命令就是先把Docker官方源加进去再导入GPG密钥然后apt install docker-ce docker-ce-cli containerd.io。装完用systemctl status docker确认服务状态再跑一个docker run hello-world验证。Docker的安装命令有点多我一般直接复制官方文档的步骤但加源时确实要确认Ubuntu版本代号要和源对应上不然404报错。5. 网络配置与远程连接SSH上不去的自救流程Linux服务器几乎都是拿SSH远程管理的网络配置和SSH掉线是日常最头疼的问题之一。很多新手第一次接触云服务器或虚拟机时配置完网络发现SSH连不上第一反应是重装系统其实大多数问题都能靠几条命令定位出来。5.1 查IP和网关的基本命令查看当前系统IP和网络状态ip addr ip route ip linkip addr查看所有网络接口的IP地址重点看ens33或eth0这类接口下的inet字段。ip route看默认路由默认网关就在default via后面。ip link查看接口状态UP表示接口已启用DOWN则说明网络接口被关闭了。老牌的ifconfig现在很多系统已经不默认安装了需要额外装net-tools才有。我个人的习惯是用ip命令输出更清晰而且新系统都自带。测试网络连通性ping -c 3 baidu.com注意ping不能无限制地跑-c 3限制次数。如果域名不通但IP通说明DNS解析出问题检查/etc/resolv.conf里的nameserver配置。DNS查询工具dig和nslookup也很好用但有些系统不自带需要apt install dnsutils。排查域名解析问题、确认解析记录生效应该优先用它们。5.2 SSH无法连接的排查思路SSH连不上是Linux日常报障中最常见的场景。我的排查顺序是固定的第一步看服务端有没有开SSH服务。sudo systemctl status ssh如果显示inactive (dead)先启动sudo systemctl start ssh sudo systemctl enable ssh第二步确认端口和防火墙状态。sudo ss -tlnp | grep 22 sudo ufw statusss显示监听端口如果22端口没监听说明服务没起来或被改到别的端口。ufw status是Ubuntu自带的防火墙管理工具如果显示active需要放行22端口sudo ufw allow 22/tcp第三步检查SSH配置文件。/etc/ssh/sshd_config里的Port字段是否改成了非22端口、PermitRootLogin是否设置为prohibit-password等。改完配置要重启服务sudo systemctl restart ssh还有一种常见情况是云服务器的安全组规则没放行22端口这个就要去云厂商控制台排查终端里看不到问题。我遇到过虚拟机怎么都连不上最后发现是宿主机的安全组忘了配入站规则这种情况终端命令帮不了忙只能去控制台改。排查完上面这些八成问题都能定位。很多人一SSH失败就重装系统其实多数情况就是服务没启动或者防火墙拦了十几秒就能修好。5.3 系统时间和网络时间同步那点事日志同步和定时任务依赖正确的时间时间错乱会导致各种诡异现象。查看当前时间和时区date timedatectltimedatectl输出里看Time zone和NTP synchronized两项。时间不对时先执行sudo timedatectl set-timezone Asia/Shanghai sudo timedatectl set-ntp true sudo systemctl restart systemd-timesyncd设置完再用date验证。时间同步这块还有个小技巧排查问题时要养成看服务器时间的习惯我几次排查线上故障最终根因都是服务器时间偏了好几秒导致证书校验不过、日志时间对不上号。把时间同步做好这些问题可以在源头避免。6. 用户、权限与安全sudo不是万能钥匙Linux是多用户系统用户和权限管理是系统安全的基础。很多新人都习惯sudo一把梭所有操作都用管理员身份执行短时间内很爽但带来的隐患很明显误删系统文件、修改错误配置、日志审计无从下手。真正的老手会主动管理用户、按需分配权限sudo只在必要时刻才用。6.1 用户管理和切换创建新用户sudo adduser zhangsanadduser是交互式向导自动创建家目录、设置密码、填写用户信息比useradd这种底层命令更适合日常使用。还有一种情况是创建系统用户用于运行服务sudo useradd -r -s /usr/sbin/nologin appuser-r创建系统用户-s指定登录Shell为nologin禁止这个用户登录终端是服务运行账号的标准做法。切换用户su - zhangsansu -后面加横线会加载目标用户的环境变量并切换到其家目录不加横线则保留当前环境。这两者的区别是初学者容易混的点但实际影响很大。还有一种切换用户执行单条命令的方式sudo -u zhangsan whoamisudo -u指定以某个用户身份执行命令不切换登录会话。写脚本时需要在不同用户权限下执行操作这个命令是利器。sudo的权限配置在/etc/sudoers里改动时必须用visudo命令打开编辑器因为它会做语法检查坏掉的文件会导致所有sudo操作失效。给用户添加管理员权限在sudoers文件里加一行zhangsan ALL(ALL:ALL) ALL不过我更推荐把用户加入sudo组sudo usermod -aG sudo zhangsan这样zhangsan自动获得sudo权限省得手动改配置文件。6.2 chmod和chown权限改错了会出大事Linux的权限模型用三组rwx表示属主、属组、其他人的读、写、执行权限。查看权限用ls -l第一列类似drwxr-xr-xd表示目录后面九个字符是三组权限。修改权限的基本操作chmod 755 script.sh chmod x tool.sh chmod -R 777 /var/www/html/数字法里r4w2x1。755表示属主可读写执行、属组和其他人可读可执行是常见的可执行文件权限。chmod x是给文件添加执行权限。-R递归应用于目录下所有文件。777权限是最容易被新手拿来解决问题的万能药把目录改成777写入报错立刻消失。但这个习惯非常危险任何用户都可以修改目录内容等于把系统敞开给所有人。我见过一台测试服务器上网站目录被改成777被人拿webshell直接上传了恶意文件。正确的解法是搞清楚哪些用户需要什么权限然后精准分配。比如Nginx需要读取网站目录那就chown -R www-data:www-data /var/www然后目录权限755、文件权限644这才是合理的配置。修改属主和属组chown -R zhangsan:zhangsan /home/zhangsan/projectchown第一个zhangsan是属主第二个zhangsan是属组。Recursive操作时-R必加不然只改顶层目录。这个命令在编译源码时尤其常用源码目录属主如果不是当前用户编译生成的文件会写不进去执行前先把整个目录chown给当前用户能省去大量权限报错。一个常见的坑是用户明明有权限但操作还是提示Permission denied原因可能是SElinux在捣乱也可能是文件在挂载的特殊文件系统上比如NTFS分区默认权限受限。这时候先mount | grep 挂载点看看有没有noexec或user选项再考虑权限本身的问题。6.3 忘记密码后的恢复套路忘记登录密码是每个Linux用户都会遇到的时刻。Windows忘记密码重装系统Linux有更优雅的恢复办法。Ubuntu系统在GRUB启动界面时选择要启动的内核按e进入编辑模式找到以linux开头的那一行在末尾加上init/bin/bash然后按CtrlX或F10启动系统会直接进入root的bash不用密码。接下来重新挂载根文件系统为读写模式mount -o remount,rw / passwd username输入两次新密码然后重启系统即可。实测在Ubuntu 24.04上用这个方法恢复密码完全可行。但要注意的是如果磁盘是全盘加密的LUKS没密码进不了解密环节这个方法就没用。这种时候只能靠备份密钥或者重装了。这个恢复方式也暴露了一个安全问题任何能物理接触到机器的人按下e就能改内核启动参数进入root。所以生产服务器一定要设置BIOS/UEFI密码并且开启GRUB密码保护用grub-mkpasswd-pbkdf2生成加密密码写入/etc/grub.d/40_custom配置。日常使用中倒是没必要过度恐惧但意识到物理接触完全控制这一点很重要。7. 进程、服务与系统日志系统出问题就看这里服务器变慢、服务崩溃、程序异常退出这些都是Linux运维的高频故障。处理这些问题靠的就是进程管理、服务管理和日志排查这三板斧。把这三块命令用熟很多疑难杂症都能快速定位。7.1 进程查看和终结查看进程最常用的命令是psps aux ps -ef ps aux | grep nginxps aux会以用户格式显示所有进程包含CPU、内存占用和启动命令。ps -ef显示所有进程的完整信息配合grep过滤是定位特定进程的标准组合拳。这里我要特别强调管道符|的作用把左边命令的输出当作右边命令的输入。ps aux | grep nginx就是把进程列表交给grep筛选出nginx相关的行。这是Linux命令操作的基本功后面所有命令的组合都离不开它。动态查看进程状态用top实时刷新CPU和内存占用。top里还支持按P按CPU排序、按M按内存排序直接找出谁在吃资源。不过更推荐的现代工具是htop显示效果更友好支持鼠标操作和树状进程关系没装的话sudo apt install htop装一下。终止进程用killkill PID kill -9 PID pkill -f 进程名kill默认发送TERM信号请求进程正常退出kill -9发送KILL信号强制杀死进程。先尝试TERM不行再KILL这是标准操作顺序。pkill -f nginx按进程名匹配杀掉所有相关进程批量操作时很省事。但pkill -f有个风险匹配的是一整条命令行如果误匹配到无关进程就麻烦了。我在生产环境从来都是先用ps aux | grep确定PID再kill PID宁可多敲几条命令也不冒误杀的风险。7.2 systemctl管理服务现代Ubuntu的服务管理已经全面转向systemd日常操作命令是systemctlsudo systemctl start 服务名 sudo systemctl stop 服务名 sudo systemctl restart 服务名 sudo systemctl status 服务名 sudo systemctl enable 服务名 sudo systemctl disable 服务名start和stop是启停restart重启但status才是排障时最重要的入口它会显示服务当前状态、最近日志和进程PID。服务启动失败时第一件事永远是systemctl status它会提示你错误原因大多数人忽略了这个关键信息。enable设置开机自启disable取消开机自启。我经常遇到的问题是服务手动启动没问题重启机器后服务没了这就是因为漏了enable。记住一句话start只管当前enable管的是以后每次开机。查看所有运行中的服务systemctl list-units --typeservice --staterunning这个命令能快速看到机器上到底跑了哪些服务排查多出来的进程是什么时候启动的非常有用。7.3 日志排障的关键命令日志是排障的最终依据。Ubuntu的日志主要走journald同时很多服务也会把日志写到/var/log/目录。查看系统日志sudo journalctl -xe sudo journalctl -u nginx.service sudo journalctl -u nginx.service -f sudo journalctl --since 1 hour ago-xe是最近错误并解释的组合参数故障发生时先跑它能直接看到最近的错误日志。-u指定服务查看单个服务的日志-f是实时跟踪模式服务启动卡住时开一个终端挂着看日志、开另一个终端操作服务非常实用。--since按时间范围过滤日志排查半夜发生的崩溃用journalctl --since 2024-11-20 02:00:00 --until 2024-11-20 03:00:00这种写法很高效。传统日志文件也值得留意tail -f /var/log/syslog tail -n 50 /var/log/syslog grep error /var/log/syslog/var/log/syslog是系统级日志所有程序的消息都会写进去。/var/log/auth.log记录登录认证事件排查暴力破解和登录异常时必看。tail -f实时跟踪日志输出是边操作边看日志的核心工具。日志排障有个很重要的经验遇到问题时先看journalctl -xe这个命令会给出错误提示然后顺着提示去找对应服务的日志通常不用十分钟就能定位根因。有一次我排查一个数据库无法启动的问题journalctl -u mysql提示磁盘空间不足df -h一看确实满了清理日志后数据库立刻恢复正常。整个过程一分钟都没花到。8. 文本处理与脚本化从当面敲到批量跑Linux的另一个核心能力是文本处理。日志分析、配置修改、数据提取全都离不开文本处理三剑客grep、sed、awk。再进一步把常用命令写成脚本一键执行效率又上升一个台阶。这块内容对于入门者来说可能稍微有点门槛但学下来的回报非常可观。8.1 grep在命令行里找线索grep在文件里搜索匹配文本是日志分析的基础工具。常用写法grep error /var/log/syslog grep -i error /var/log/syslog # 忽略大小写 grep -rn listen 80 /etc/nginx/ # 递归搜索目录 grep -v ^# /etc/ssh/sshd_config # 排除空行和注释 grep -E error|warning /var/log/syslog # 正则匹配多个词-r递归搜索目录-n显示行号-i忽略大小写-v反选-E启用扩展正则。组合起来能实现很强大的搜索。排查日志时grep -i error是第一步操作。grep配合管道使用场景极多比如ps aux | grep python journalctl -u nginx | grep error history | grep apt从进程列表里找python进程、从nginx日志里筛错误、在命令历史里回溯之前的操作全是靠这种组合完成的。可以说grep和管道符是Linux命令操作的双轮缺一个都不转。8.2 sed和awk处理文本的顺手工具sed被称为流编辑器用来替换和修改文本。最经典的用法是替换sed -i s/old/new/g file.txt-i是直接修改原文件s/是替换命令g是全局替换。修改配置文件、批量替换代码里的版本号它都是首选工具。但-i误用会把文件改坏所以我的习惯是先不加-i跑一遍看输出结果确认无误再加-i真正修改。这个教训是被一次删掉配置文件关键内容逼出来的从那以后每次都先看后改。awk是文本分析和数据处理工具。最常用的场景是按列提取awk {print $1} access.log awk {print $2, $4} access.log awk -F : {print $1} /etc/passwd默认按空白分隔$1是第一列$2是第二列-F指定分隔符。从日志里提取IP、从/etc/passwd里提取用户名都是awk的经典应用。awk还能配合条件过滤awk $9 500 {print $1, $9} access.log找出HTTP状态码大于等于500的请求对应的IP和状态码这在分析访问日志、定位异常请求时非常好用。虽然awk的完整语法很复杂但入门阶段掌握按列提取条件过滤这两个能力就够用。8.3 把常用命令写成脚本当命令敲多了就会发现很多组合是固定重复的。把这些组合写进脚本一条命令就能完成一堆工作。最简单的脚本就是一个可执行文件里面放一组命令。写个清理临时文件的脚本#!/bin/bash # 清理超过7天的临时文件 TMP_DIR/tmp/cleanup find $TMP_DIR -type f -mtime 7 -delete echo 清理完成: $(date %Y-%m-%d %H:%M:%S)第一行#!/bin/bash是shebang指定解释器注释以#开头$()是命令替换把date的输出放到echo里。写完脚本后赋予执行权限chmod x cleanup.sh ./cleanup.sh执行脚本直接./cleanup.sh。如果脚本在PATH里也可以直接输名字运行。代码风格上变量加双引号是必须的防止路径带空格时出问题。脚本里还会用到几个逻辑控制结构。if判断if [ -f /etc/nginx/nginx.conf ]; then echo 配置文件存在 else echo 配置文件不存在 fifor循环for user in zhangsan lisi wangwu; do sudo useradd $user echo 用户 $user 已创建 done这些结构的语法细节记不住没关系网上资料很多但写多了自然就熟练了。我最常写的就是备份脚本和日志清理脚本把原来手动敲5分钟的操作变成一行./backup.sh效果立竿见影。另外一个建议是写下脚本前先手动敲一遍命令确保正确再用history把命令捞出来整理成脚本。这样做能减少大量试错。9. 常见问题速查这些都是我踩过的坑这一节是给所有看完前面内容的读者准备的一份速查表。问题都来自真实使用场景把现象、命令和解决思路放在一起用到的时候查起来方便。我挑的是出现频率最高、最典型的一批。问题现象排查命令解决思路apt安装软件报依赖错误sudo apt --fix-broken install先修复依赖再dpkg --configure -a重配未完成安装安装gcc提示找不到包cat /etc/apt/sources.list先apt update刷新索引确认源地址正确且未失效SSH连不上卡在超时systemctl status ssh、ss -tlnp | grep 22确认sshd运行、22端口监听、防火墙和云安全组放行磁盘满导致服务写入失败df -h、du -sh /var/log定位大目录清日志或迁移数据启用日志轮转PATH配置错误导致命令找不到/usr/bin/ls、export PATH/usr/bin:/bin用绝对路径恢复正常操作重新修正环境变量配置忘记登录密码GRUB编辑加init/bin/bash进入单用户模式重新passwd中文输入法切不出来im-config -n fcitx检查输入法框架切换注销重登必要时删配置重新配置系统时间偏差大timedatectl开启NTP自动同步重置时区显卡驱动不生效nvidia-smi、lspci | grep -i nvidiaapt安装对应版本驱动重启避免手动.run包踩坑服务开机不自启systemctl enable 服务名启停只对当前会话生效enable才是设开机自启还有一个容易忽略的点就是环境变量配置错误会导致终端命令大面积失效。PATH这个东西如果写错了比如export PATH/wrong/path连ls、sudo都会变成command not found。遇到这种情况先别慌用绝对路径修复/usr/bin/export PATH/usr/bin:/bin:/usr/sbin:/sbin然后把错误配置从~/.bashrc或/etc/environment里改回来。这种问题看似吓人其实修复方式很简单真正难的是要意识到可以用绝对路径绕开PATH问题。虚拟机安装Linux蓝屏这个问题我也被问过很多次。点开虚拟机设置把内存加到4GB以上关闭3D加速关闭嵌套虚拟化以外的奇怪选项再把系统镜像重新校验一下MD5绝大多数蓝屏都能解决。装的时候记得用官方镜像别用网上来路不明的精简版精简版镜像缺什么组件不好说出了问题很难排查。Ubuntu下查看系统架构这个需求其实用uname -m一行就搞定了。但很多人会把它和查看CPU型号混淆查看CPU详细信息用lscpu里面Model name、Architecture写得清清楚楚。这两个命令各管各的别搞混。配套参考站点方面我常用的有Ask Ubuntu英文问答社区、Ubuntu官方文档、Linux命令大全网站、以及各类个人博客。遇到问题时先自己想清楚描述再去搜效率最高。另外man命令本身就是最好的帮助文档man ls会输出ls的所有参数解释信息最权威也最完整。所有看到命令不会用的瞬间第一选择都应该是man而不是打开浏览器搜索。最后再分享一个个人习惯我在终端里敲命令的时候从不盲目复制网上的长命令尤其涉及rm -rf、curl ... | bash这类危险操作时会先拆开看每一段在干什么。这个习惯帮我在各种一键脚本遍布的年代避免了好几次灾难。Linux的可爱之处就在于它给你绝对的自由同时也要求你为自己的每一个操作负责。