1. 安装前的思路:别再纠结装哪个发行版,先想清楚拿它干嘛
最近后台收到不少关于Linux安装和程序管理的私信,大部分问题集中在“装到一半蓝屏”“软件装不上”“依赖冲突搞死人”这几类。说实话,这些坑我早期都踩过一遍,折腾多了就发现,大多数问题其实在安装系统之前就已经注定了。我自己的习惯是,动手之前先回答三个问题:这台机器装Linux是当服务器持续运行,还是个人日常桌面使用,还是临时学习验证一下命令;机器配置如何,尤其是内存和磁盘;软件来源偏好是什么,是走系统仓库稳定版,还是追新版本自己编译。
这三个问题的答案直接决定发行版选型。服务器场景我基本首推Debian系或者RHEL系,Ubuntu Server、Rocky Linux这类,胜在仓库成熟、运维资料多、出问题好查。个人日常使用倒是可以看看生态活跃的桌面发行版,像Ubuntu Desktop、Deepin、UOS这类,图形界面配置省心不少。如果只是临时测试,甚至不需要物理安装,开个虚拟机装上就行。
只是学习用的话,我更推荐先用虚拟机把整个流程跑通,再去碰物理机。虚拟化方案选VirtualBox或者VMware都行,两者区别不大,对初学者来说VirtualBox免费且跨平台,够用了。真要说踩坑点,很多人卡在一个特别低级的地方:ISO镜像下载下来是个压缩包,直接拿去引导启动,结果怎么都进不了安装界面。那当然进不了,ISO本身需要以“烧录”的方式写入U盘,不是解压复制进去就完事。Windows下面用Rufus,Linux下面用dd命令,这俩都顺手。Rufus选“DD镜像模式”写入,最后校验一下U盘引导是否正常,这一步能省掉后续不少麻烦。
还有一个很多人关心的问题,就是国产Linux值不值得试。像UOS、麒麟这类系统,这两年桌面完成度确实上来了,办公、影音、日常通讯基本都能覆盖。加上“豆包”这类应用也开始出Linux客户端,说明生态确实在往好的方向走。我的看法很直接:如果你所在环境有国产化要求,用就行,使用方式跟其他Linux发行版没有本质区别,照样是终端加包管理器那一套。如果没这个要求,那选哪个发行版纯看个人习惯,折腾越多,理解越深。
判断发行版活跃度有一个很朴素的土办法,去它的官方软件源看更新频率,再翻翻社区论坛最近三个月的帖子量。一个没人维护的系统,装完就是给自己找罪受。
2. 系统安装全流程:从ISO镜像到分区引导,一次说透
2.1 镜像下载与安装介质制作,别在源头翻车
选镜像源是个容易被忽视的细节。官方站点慢的时候,国内高校镜像站或者云厂商镜像站是首选,速度快很多。下载时注意看清楚架构标识,x86_64就是普通桌面和服务器CPU用的,ARM架构的机器得选对应的aarch64版本,下载错了安装阶段肯定报错。还有个细节,很多镜像站提供ISO的sha256校验值,下载完顺手校验一遍,我见过不少安装到一半报文件损坏的,多半是镜像没下完整或者U盘写入出错。
U盘写入这一步,Linux桌面环境我一般用启动盘制作工具,选好ISO和U盘,它会自动处理引导。Windows系统就Rufus,注意分区类型那一步默认GPT就行,较新的机器都是UEFI引导,老机器才需要MBR。容量太小的U盘也要留意,现在很多最小安装镜像也要2GB以上,建议备一个8GB以上的U盘,免得写一半空间不够。
物理机装系统时,BIOS设置里有两个必改项:关闭Secure Boot,开启UEFI引导。不关Secure Boot,很多第三方驱动和引导器会直接被拦截,安装完成率直线下降。装完系统之后再按需决定要不要重新打开,但安装过程里请务必关掉。
2.2 分区逻辑:给系统、数据、交换分区各留好位置
分区是安装过程中劝退率最高的环节。自动分区确实省事,但如果你以后要装数据库或者跑容器,自动方案往往会让你事后很痛苦。我个人的分层思路是:系统分区、数据分区、交换分区分开处理。
从使用频次和容错角度来拆解,系统分区放根目录和启动文件,容量建议50GB起步。如果磁盘空间紧张,30GB也够跑最小化安装加常用工具,但低于这个数,多半到后期日志一涨就告急。数据分区单独分出来,放数据库文件、容器存储、网站目录这些,好处是系统重装了数据还在,坏处是需要手动挂载,但这点麻烦值得。
交换分区在市面教程里争议不小。内存8GB以下的机器,交换分区强烈建议保留,大小设为内存的1到1.5倍。内存16GB以上完全可以只搞一个4GB的交换文件意思一下,或者干脆不配。装数据库的机器如果关了交换,OOM Killer会直接帮你杀进程,那酸爽谁试谁知道。
挂载点设置的时候,数据分区挂到数据目录时记得检查权限。我遇到过好几次分区挂载正常,结果程序写不进去,最后发现目录属主还是root。挂载配置写进/etc/fstab之前,先用mount命令手动挂载一遍验证参数无误,再写进配置文件,防止开机起不来。
2.3 引导部署与装机后的基础检查
安装向导跑到最后一步,一般会问引导程序装哪里。多系统共存的情况,引导器装到独立EFI分区就行;单Linux系统,默认选项直接装到磁盘开头。这里有个坑,有些主板对引导器很挑剔,装完引导器之后重启直接黑屏。我的土办法是拿到一台新机器装Linux时,先花两分钟在BIOS里确认启动顺序,把U盘或装好系统的那块盘调到第一位,省得硬等默认启动项超时。
装完系统重启之后,不管装的是桌面版还是服务器版,第一时间用常规检查项过一遍网络配置、主机名解析、软件源更新速度和基础目录结构确认。网络配置这个点特别容易在虚拟机里出问题,很多人装完虚拟机系统发现没网,十有八九是网卡没启用。Debian系的编辑网络配置文件把网卡设为开机自启,RHEL系的用nmcli把连接up起来,一套操作下来网就通了。软件源更新速度方面,把默认源换成本地镜像源,再执行一次仓库刷新,装软件的体验会好很多。
基础环境检查完事之后,我对新装的系统有一个小习惯,创建好日常用的非root用户,配置好sudo权限,然后直接锁掉root远程登录。这个习惯从安全角度考虑多一点,日常操作都用普通用户完成,需要提权的时候再sudo,能省掉很多“手滑删库”的痛苦。
3. 程序安装的三大途径:包管理器、RPM手动装、源码编译
3.1 包管理器是首选,但包管理器之间也有门道
系统装好了,接下来的核心需求就是装程序。Linux下装程序的方式基本可以归为三类:包管理器在线安装、下载离线包手动安装、源码编译安装。三条路线没有绝对优劣,只看你的场景适合哪一种。我用一张方式对比表来说清楚这个事。
| 安装方式 | 典型命令 | 适用场景 | 主要优势 | 主要风险 |
|---|---|---|---|---|
| 包管理器在线安装 | apt install、yum install、dnf install | 绝大多数常规场景 | 自动解决依赖、便于更新和卸载 | 仓库版本可能偏旧 |
| 离线包手动安装 | rpm -ivh、dpkg -i | 无外网环境、内网运维 | 装包粒度可控 | 依赖需要手工逐层解决 |
| 源码编译安装 | ./configure && make && make install | 需要特定版本、需要定制参数 | 参数可定制、版本可选 | 编译耗时长、依赖要求多 |
包管理器在线安装是日常使用频次最高的方案。Debian系里apt负责这个事,RHEL系里yum和dnf承接同样的角色。二者的工作逻辑其实差不多:从软件源拉取软件包元数据,解析依赖关系,逐个下载安装。这也是它最爽的地方,你装一个东西,它把依赖链条上缺的全给你补齐了。跑某服务缺了某个动态库,包管理器顺手就装掉了。
使用包管理器有几个高频操作值得记熟。搜索软件包用apt search或者yum search,确认已安装情况用dpkg -l或者rpm -qa,查看某个软件的详细信息用apt show或yum info。更新全系统软件包这件事,Debian系执行apt update加apt upgrade,RHEL系yum update一把梭。这里有个细节,apt update只是刷新软件源索引,并不升级软件,需要配合upgrade才是真正升级。很多新手只执行update后就以为升级完成了,实际上软件版本没动。
软件源配置文件在 /etc/apt/sources.list 或者 /etc/yum.repos.d/ 目录下,换源操作本质上就是把这些文件里的URL替换成本地镜像地址。操作前备份原文件,改完执行一次缓存刷新,遇到GPG密钥报错就重新导入一下对应公钥。这些都是我每次配服务器都会重复一遍的动作,熟练度拉满。
3.2 RPM离线安装:无外网环境下的手艺活
内网环境没有外网权限是运维常事,这时候离线包就成了必需品。RPM这套体系在设计上有点反人类:它不做依赖的自动解析,少一个依赖库就装不上,还会直白地告诉你缺什么。但反过来,这也逼着你把依赖关系理清楚,对理解程序安装本质挺有帮助。
拿装MySQL这类大型软件举例,离线安装时先要搞清楚它依赖哪些库,比如libaio、ncurses-compat-libs这些,一个不满足就装不下去。依赖检查手段是用rpm -qpR查包依赖列表,或者直接在安装时报错信息里看缺什么,然后逐个找对应rpm包补齐,这个过程循环往复。顺序上先装依赖,再装主程序,最后装配套工具包,一次成功的概率会高很多。手动安装的包不会自动注册进软件源索引,后续版本升级也得靠手动下载去覆盖,这点要留意。
3.3 源码编译:定制化程度最高,也最考验排查能力
源码编译安装的场景很明确:官方仓库的版本太老,或者你需要的功能默认包没有编译进去,又或者领导指定要用某某参数跑性能测试。下载源代码包,解压进入目录,常规三步是配置、编译、安装。
配置阶段五花八门的参数可以定制,最常见的是指定安装前缀改变软件安装路径,以及按需开关功能特性。编译阶段核心消耗的是CPU和内存,小内存机器编译大项目会让系统卡到怀疑人生,建议用make -j参数控制并发数,一次别把CPU核全拉满。安装阶段本质就是把编译产生的文件拷贝到目标目录,这一步需要管理员权限。
编译完并不意味着万事大吉。动态链接库是源码安装绕不开的坑,你自己装的程序找库的时候默认路径不一定有它。解决方案是把安装目录下的库文件路径写进 /etc/ld.so.conf.d/ 下的配置文件里,执行ldconfig刷新,让系统能找到它。这一步漏掉的话,程序启动时会提示找不到某个so文件,非常典型。我在编译程序这块给一句实在的忠告:如果源码包里没有明确的特殊说明,先看看包管理器里有没有接近的版本,有就优先用包管理器方案。源码编译当作进阶技能学习没问题,但生产环境请克制,编译一次带来的长期维护成本往往超过版本更新带来的收益。
4. 服务与程序管理:systemd是你绕不开的管家
4.1 管理思路的统一:systemd把启动、停止、自启全包了
Linux上装完程序以后,让它能开机自启、异常自动重启、日常随手启停,这些所有需求都指向systemd。早些年的SysVinit那套逻辑是脚本加运行级别,现在主流发行版都切到systemd了。systemd用单元文件来描述一个服务,服务单元文件决定程序由谁启动、以什么用户跑、什么时候启动、崩溃了怎么办。
单元文件常见存放路径有 /etc/systemd/system/ 下放管理员自定义的服务文件,/lib/systemd/system/ 下放发行版自带的默认单元。统一管理服务的命令集中在systemctl上。启动服务、设为开机自启、查看服务状态、查看启动日志,这套命令几乎每天都要用。查看状态时重点看Active行是否为active,再看日志里有没有报错,基本就能定位大多数服务起不来的原因。
systemd还提供一大批实用小功能。服务异常退出后自动重启有现成参数控制,服务启动依赖另一个服务也写得很直白,服务内存超限被系统杀掉后自动拉起都是基础能力。这些我建议新手写单元文件的时候顺手就把重启策略配上,能省下半夜爬起来拉服务的工夫。
4.2 一个标准的服务单元文件长什么样
自己写服务单元文件是这个环节最该掌握的技能。以守护一个App进程为例,一个典型的单元文件会包含基础信息区、服务定义区和安装定义区三块。
服务定义区里核心是ExecStart指定启动命令,写程序全路径最稳妥。WorkingDirectory指定工作目录,很多程序都要求工作目录正确才能读到相对路径的配置文件。Restart参数建议设成on-failure或者always,再配个RestartSec指定间隔秒数,这样进程崩了能快速自愈。User和Group指定运行身份,普通服务永远别用root去跑,权限分开是基本素养。安装定义区里加一行设为multi-user.target,就能让服务随系统正常启动。
写完文件之后记得执行daemon-reload重新加载配置,再用enable设置开机自启。说到自启动,很多系统装好以后喜欢手动执行systemctl disable掉用不到的自带服务,这个操作逻辑没问题,但关之前先确认它没有作为依赖被其他服务用到,我就遇到过关了某个服务导致依赖它的业务整个起不来的情况。
4.3 程序装完还要管好系统资源
服务跑起来之后,资源管理的需求随之而来。查看CPU和内存占用,top或者htop都顺手,磁盘情况用df -h看分区使用率,iostat看IO压力。定位某个端口被谁占用,用ss -lntp能直接看到进程PID。程序起不来先看日志,journalctl -u服务名 -f实时跟踪,日志文件再配合dmesg看内核报错,这俩组合能解决绝大多数的故障定位需求。
进程管理上还有一个容易被忽略的点是文件句柄数。高并发场景下程序报Too many open files是常态,默认文件句柄限制对很多服务来说不够用,需要调整。修改limits配置文件给指定用户提升上限,改完确认当前会话是否生效,有些服务还要在单元文件里显式声明LimitNOFILE。这类问题一般在项目上线跑流量之后才出现,提前配置好能省一次线上事故。
5. 高频问题与排查思路:照方抓药,少走弯路
5.1 软件安装与启动环节的典型报错
软件安装和启动阶段,问题数量占整个Linux使用过程的大头。我按日常遇到的频率整理了一套速查表:
| 报错现象 | 根本原因 | 排查方法 |
|---|---|---|
| 提示无法定位软件包 | 软件源索引未刷新 | 先执行apt update或yum makecache,再看包名拼写 |
| 安装时提示GPG密钥错误 | 软件源签名密钥未导入 | 导入对应公钥,或临时禁用签名校验确认问题范围 |
| 程序启动报缺少so文件 | 动态库路径未被识别 | 把库路径写入/etc/ld.so.conf.d/下文件,执行ldconfig |
| 端口被占用导致服务起不来 | 其他进程占用监听端口 | ss -lntp查占用,换端口或停冲突进程 |
| systemd服务显示failed | 启动命令或脚本出错 | journalctl -u服务名看日志,确认ExecStart路径 |
| 命令提示Permission denied | 权限不足或挂载参数限制 | 确认用户权限,检查挂载选项是否带了noexec |
| 磁盘空间假满但删除文件后没释放 | 文件被进程占用未释放 | lsof |
依赖冲突这个老生常谈的问题值得单独说。手动装了一个较新版本的库之后,系统仓库的老版本软件可能就起不来了。最干净的解决方案是优先从包管理器渠道装软件,让它自己维护依赖版本一致性。实在必须手动装某个包时,集中把自定义安装的软件放到独立前缀目录,并让系统动态库搜索顺序保持默认库优先,冲突概率能压到最低。
网络层面的坑也提醒一下。内网环境里DNS解析失败会导致软件源访问异常,报错往往是连接超时或者无法解析。配置好DNS服务器地址,确认代理环境变量没被意外设置,这两个排查点能覆盖大多数网络访问异常。
5.2 系统层面的常见坑
稍微进阶一点的问题集中在系统资源方面。内存不足会触发内核机制直接杀掉吃内存的进程,有时候数据库进程无端消失就是被它杀的。排查时先看系统日志里的相关记录,再查内存占用和交换分区使用情况。CPU长时间跑满又是另外一回事,找出CPU占用高的进程,用日志确认它的行为是否正常。如果是起服务的人自己写的脚本存在死循环式行为,处理掉就好。
时间同步是个容易被忽略的系统配置项。服务器时间偏差超过一定范围,会影响日志排错、证书校验甚至程序任务调度。配置好时间同步服务,再手动校准一次系统时间,日常稳定运行基本无忧。
大文件清理方面给个小贴士,用du命令找到占用空间最大的目录,再用find命令扫描超过指定大小的文件,处理掉不再需要的日志和临时文件。清理前先确认文件是否被进程占用,我见过删了日志文件但磁盘空间不释放的情况,原因就是进程还拿着文件句柄,重启进程才真正释放空间。
5.3 虚拟机环境的特殊问题速查
虚拟机装Linux的环境有自己的问题集。蓝屏这个问题在Windows宿主机上装虚拟机时经常被提及,排查思路先确认虚拟化开关是否在BIOS里打开,CPU虚拟化指令集是否可用。再把虚拟机内存和显存配置往上调一档,关掉3D加速,很多显示相关的问题就消失了。
虚拟机刚装完系统没有网络,问题排查按这个思路过一遍:先看虚拟网卡有没有被识别,再看网络配置文件和实际接口名是否一致,最后确认虚拟机网络模式与宿主机网络的兼容性。虚拟机网络模式这块比较简单,想要虚拟机访问外网选NAT模式,需要局域网内其他机器直接访问虚拟机就用桥接模式,两种模式用途不一样,别混着选。
WSL用户遇到“WSL版本过旧”之类的提示也别慌,在Windows功能里确认虚拟机平台和WSL服务均已启用,然后执行wsl --update升级到新版本组件,基本能解决。WSL本身是一个轻量办法,适合Windows用户快捷体验Linux环境,不需要完整装一台虚拟机,但深度系统实验我还是建议用完整虚拟机来做。
6. 最后分享一点我的使用心得
每次帮人排查Linux安装和程序管理的问题,我都觉得大多数坑不是技术多深,而是对“程序从安装到运行要经过哪些环节”缺少整体认知。装系统要考虑引导和分区,装程序要考虑依赖和权限,跑起来要考虑资源和日志,整条链路串起来,你就有能力自己推演问题出在哪一环。把包管理器当作默认安装通道,把systemd当作默认服务管家,把手动编译当作备选方案,这个习惯能让你少踩很多坑。真遇到问题也别慌,日志永远是第一现场,顺着日志的线索往前追,多数问题都能定位到具体环节。Linux这条路没有捷径,但踩过的每个坑都会变成你后面排错的本能反应,这也是它最有意思的地方。