1. 从零开始:为什么每个新手都该亲手装一次Linux
先问一个很现实的问题:你手上那台电脑,或者那台刚买的云服务器,装完系统之后是不是就一直用默认设置“吃灰”?很多人对Linux的印象停留在“命令行黑框框”“大神专用”,但真正接触之后你会发现,它不过是一套和Windows、macOS平起平坐的操作系统,只是逻辑不同、习惯不同、自由度更高。
我第一次正经装Linux是在一台老掉牙的笔记本上,当时连分区表都看不懂,U盘启动也搞不明白,折腾了整整一个周末才把系统跑起来。现在回头看,那次“痛苦”特别值得,因为装系统这件事几乎是所有Linux技能的起点——你会被迫搞清楚硬盘怎么分、引导器怎么工作、网络怎么配置、服务怎么管理。这些知识在Windows里全被藏起来了,在Linux里全都要你亲手搞定。
这篇文章就围绕“Linux安装及管理程序”这条主线,从装系统到装软件、管服务、查日志,把一套完整流程拆给你看。不跳步、不藏坑,适合刚入门想自己折腾一台Linux机器的朋友,也适合准备用云服务器跑项目但对系统层还不熟的开发者。
2. 装系统前的核心思路与方案选型
2.1 确定你的真实场景:桌面、服务器还是虚拟环境
动手装系统之前,先想清楚一件事:这台Linux是拿来干什么的。
如果是为了日常办公、写代码、看视频,那装桌面版很合适,Ubuntu、Debian这类发行版对硬件的兼容性最好,装完能直接用图形界面,不用一上来就面对纯黑终端。如果是给服务器用的,那么桌面环境基本是多余的,装最小化系统反而更干净、更省资源,后面需要用啥装啥。
如果是学习或测试,别急着在真机上折腾,虚拟机是最友好的环境。VirtualBox或KVM里建一台虚拟机,系统装坏了直接删除重来,不用背任何心理负担。我见过很多新手第一次就直冲物理机,结果双系统引导坏了,Windows也进不去,心态直接崩。
我的建议是:第一次装Linux,优先虚拟机。等你把分区、引导、网络这些都搞明白了,再考虑物理机或云服务器,你会发现自己胆子大了很多,因为你知道每一步在做什么。
2.2 发行版选择:别盲目跟风,选对才是关键
桌面/服务器场景选发行版,思路完全不同。这里说点我自己的实际感受。
Ubuntu是新手最友好的选择,软件库全、教程多、遇到问题搜一下基本都有答案;Debian比Ubuntu更稳,软件版本旧一些但极其省心,适合服务器长期跑着不管它;CentOS Stream/Rocky Linux这类企业级发行版常用于商业服务器环境,如果你想走运维方向,尽早接触它们是加分项。
千万别听说某个发行版“极客专属”就跟风去装,比如从源码编译一切系统的Linux From Scratch。那是学习内核与系统组件关系的好教材,但不是让你第一天就拿来当日用系统的。
服务器上我比较推荐Debian稳定版,原因是它足够简朴,默认占用的内存极小,跑起来非常稳。资源就是钱,能省一点是一点。
2.3 提前规划硬盘:分区策略比想象中更重要
很多人到了装系统的分区那一步就开始凭感觉乱点,结果系统装完没几天就出现“某个目录满了但另一个分区还空着”这种尴尬问题。我的建议是:分区不要贪多,但关键的那几个必须单独分。
先看传统MBR和GPT的选择,现在绝大多数机器都支持UEFI+GPT,这是默认推荐方案,支持大硬盘、支持多个系统共存。如果你的机器特别老,才需要考虑Legacy BIOS+MBR。
分区方面,我习惯的做法是:
- EFI分区:用来放引导文件,一般512MB足够。
- /(根分区):系统和所有软件的存放地,给足空间,尤其是你要装很多软件或跑容器时。
- swap分区:内存不够时当作“紧急溢出区”,建议大小与物理内存相当,或者按实际负载调整。
- /home分区:独立分出来,好处是以后升级系统或重做系统时,个人数据不用跟着遭殃。
举个例子:一台512GB硬盘的笔记本,我可能会分200GB给/,16GB给swap,剩下约280GB给/home。这样的划分在重装系统时很舒服,只要不动/home,照片、代码、配置全都在,升级上版本后不会产生“数据搬不走”的麻烦。
当然,如果你完全不知道以后会装什么,那就保持一个根分区加一个swap的最小方案,剩余空间不分区,以后想挪哪里再挪哪里。
2.4 安装介质制作与启动设置
装Linux最常用的方式是U盘安装,制作启动盘的方法其实就三步:
第一步,下载对应发行版的ISO镜像文件,这个应该去官网下载,追求稳定就别用第三方打包版。
第二步,用启动盘制作工具把ISO写入U盘。Windows下面我习惯用Rufus,Linux下可以用dd命令直接写。需要提醒的是:dd命令写U盘会把目标设备整个覆盖,千万不要把盘符写错,否则后悔都来不及。操作时我会先执行lsblk看清楚哪个是U盘,确认后再动手。
第三步,重启电脑,开机时按启动热键进入Boot Menu,选择U盘启动。常见的启动热键因品牌而异,比如某些台式机是F12、某些笔记本是F2或ESC,这个可以在开机画面或主板说明书里确认。如果进不去U盘启动,一般还要进BIOS里把Secure Boot关掉,或者把启动顺序改成U盘优先。
进到安装界面后,选择语言、键盘布局、网络,接着就会走到让你选择安装方式这一步。只要不是特殊定制需求,就先用默认的“图形化安装”流程,跟着向导走最不容易出错。
3. 系统安装全流程实操拆解
3.1 从启动盘到安装器:常见界面与关键选择
当U盘引导成功,你会看到发行版提供的启动菜单。有的发行版默认进入实时桌面,有的发行版直接进入命令行安装器。不管哪种,核心都是让你先选语言,再看键盘布局。
我习惯把语言设置为简体中文,但键盘布局保持默认的英语(美国)。这样桌面环境里的菜单和帮助是中文的,操作时不容易卡壳,而终端里的命令输入又不会被输入法干扰。
网络这块能连就连有线网络,尤其是安装过程中要更新软件包时,网络不稳定会拖慢整体进度。虚拟机里安装时,我通常会选桥接网络或者NAT,总之让虚拟机有正常的互联网访问能力。
接下来会看到“安装选项”,一般有“完整安装”“最小安装”“手动分区”等选择。如果是新手或者第一次装,就选包含图形界面、常用驱动的完整安装,先把系统跑起来最重要。后续想精简,随时可以卸载组件,不需要在这个阶段纠结。
3.2 用户创建与root密码:权限体系的第一课
安装器还会让你设置root密码和创建普通用户。很多人不理解为什么Linux要分root和普通用户,直接统一一个账号不好吗?但Linux的哲学就是“权限最小化”,日常操作不用最高权限,只有特定管理命令才临时提权。
我建议的配置方式是:
- root密码要设置得复杂一些,因为它是系统最高权限入口。
- 日常使用的普通用户,用户名不要用admin这种太通用的名字,稍微个性化一点更容易记住。
- 如果系统让你选择“是否自动登录”,建议不要勾选,麻烦一点点但更安全。
在纯命令行安装里,会让你输入两次密码确认,然后选择是否让root可以SSH登录(服务器场景通常禁止root直接远程登录,这个后面涉及安全加固时再展开)。
3.3 安装过程实录与首次启动的个性化配置
等待安装的过程无需干等,可以顺便想好装完系统后的第一步操作。进度条走完后按键重启,此时要记得拔掉U盘,否则可能再次进入安装界面。
首次启动后,服务器系统通常直接进入登录终端,桌面系统会进入图形登录界面。输入账号密码登录后,建议按顺序做几件事:
第一,更新软件源并升级系统。Debian/Ubuntu系是apt update && apt upgrade,RHEL系是dnf update。更新前最好看一眼网络连接是否正常。
第二,设置时区、主机名等基础配置。时区用timedatectl set-timezone Asia/Shanghai这类命令修改,主机名可以用hostnamectl set-hostname修改。
第三,安装必要的基础工具,比如vim、curl、wget、git。这些是日常排查问题时的得力助手,装了没坏处。
如果你装的是桌面版,可能还会遇到输入法、显卡驱动、字体显示这些“软问题”。不用急,软件源里都有现成方案,我后面会谈到怎么高效地搜索和安装它们。
4. 程序管理:包管理器、软件源与依赖解析
4.1 什么是软件包,为什么Linux装软件比Windows“麻烦”
Windows装软件一般是去官网下载exe,双击安装,卸载时再去控制面板里找。Linux的思路完全不一样,它把软件和软件的运行依赖都打包成一个“软件包”,通过包管理器从软件源仓库下载并自动安装。
好处很明显:不用满网站找安装包,不用自己手动补运行库,包管理器会帮你处理好依赖关系。坏处是:如果你不懂包管理的基本逻辑,遇到依赖冲突、源不可用这些问题时会有点懵。
刚接触Linux的人常常在“这个软件怎么装”上卡住,其实只要抓住一个核心概念:先找到对应发行版的包管理器,再用正确的命令安装,大部分问题就解决了。
4.2 主流包管理器速查:apt、dnf/yum、zypper
不同的发行版家族使用不同的包管理器,它们的命令风格接近,但细节不同。我把常用的几个列一下:
- Debian/Ubuntu系用apt,常用命令是
apt update、apt install、apt remove、apt search。 - RHEL系及CentOS Stream用dnf,旧版本可能是yum,命令格式与apt很接近,比如
dnf install。 - openSUSE用zypper,比如
zypper install、zypper search。 - Arch Linux用pacman,比如
pacman -S、pacman -R。
如果你以后负责维护不同发行版的服务器,不需要把命令全背下来,记住“先update刷新源,再install装包”这个通用逻辑,再去查对应包管理器的具体语法就行。
4.3 软件源配置与镜像加速:离线也能“在线”装的思路
安装软件时,系统默认从官方软件源下载,官方源在全球的服务器很多,速度不一定快。国内一般会换成镜像源,比如清华、阿里或中科大镜像站。配置的方法很简单,就是把软件源配置文件里的地址替换成镜像站地址。
Debian系的源文件通常在/etc/apt/sources.list或/etc/apt/sources.list.d/目录下,修改前先备份原文件,然后用sed或手动编辑把官方地址替换为镜像地址,最后执行apt update刷新源缓存。
RHEL系则用dnf repolist查看当前源,通过dnf config-manager或直接编辑repo文件来调整。
这里有一个实操细节值得牢记:修改源之后一定要执行更新源缓存的命令。如果不更新,你会发现apt install根本找不到刚刚添加的软件包,因为索引还是旧的。
镜像源并不只存在于公网,在企业内网或机房离线环境里,你也可以搭建本地源服务器,把常用软件包缓存到内网机器上,其他机器配置指向这台内网源。这个思路对大规模服务器批量装软件很实用,我后面还会再提。
4.4 依赖地狱与常见冲突:包管理器帮你做了什么
当一个软件需要另一个库才能运行,而这个库的版本又与其他软件冲突时,就出现了所谓的“依赖地狱”。手工安装软件时这个问题最明显,比如你要装A,A依赖某个库的1.2版本,但系统的另一个程序已经用了该库的2.0版本,两者不兼容,你就得想办法同时共存。
包管理器解决这个问题的办法是:从仓库信息里计算出可行的安装方案,自动选出一组互相兼容的依赖版本,然后一起安装或升级。这也是为什么有包管理器时,普通软件的安装可以一键完成。
但依赖冲突在一些特殊情况下还是会出现,比如你装了一些不在官方源里的软件,或者手动安装过第三方包。遇到这类问题,我的排查顺序是:先看报错信息里提到哪个包,再用apt-cache depends或dnf deplist查看依赖关系,最后判断是升级某个包还是改用容器化部署。
后面我会详细讲一个常见场景:Python项目运行时缺依赖,是直接用系统包装,还是用虚拟环境隔离更合理。
5. 常用软件安装实战:从命令行工具到服务端程序
5.1 在Linux上安装Python及规划解释器环境
很多刚接触Linux的人第一件事就是装Python。不同发行版默认自带的Python版本不一样,有的系统自带Python3但版本较旧。为了项目兼容性,不建议直接动系统默认的Python解释器,因为系统的很多工具也依赖它。
个人推荐用虚拟环境或版本管理工具来管Python环境。实践中最常见的是这几个方案:
- 用系统包管理器安装Python本体,比如
apt install python3 python3-pip,方便快捷,适合使用系统自带版本的项目。 - 用virtualenv或python3 -m venv为每个项目创建独立环境,依赖库互不影响。
- 用pyenv管理多个Python版本,按项目需求切换。
我在服务器上跑Python项目时,几乎一定是先建一个venv再激活,然后才用pip装项目依赖。这样做的好处是:即便系统里其他服务把某个库升了级,也不会影响正在运行的项目。
如果你安装的是需要编译的Python库,比如包含C扩展的库,可能还会需要编译工具链,Debian系可以提前执行apt install build-essential,否则编译时会出现缺头文件的报错。
5.2 安装Docker:容器时代的基本操作
现在部署服务几乎离不开Docker,所以在Linux上装Docker也是程序管理环节里很实用的一课。
Docker的安装通常分几步:
第一步,更新系统并安装依赖包,比如ca-certificates、curl等。第二步,添加Docker官方GPG密钥和软件源,然后刷新源缓存。第三步,执行apt install docker-ce docker-ce-cli containerd.io安装社区版。第四步,启动Docker服务并设置开机自启,验证命令是docker --version和使用docker run hello-world测试。
有几个新手容易忽略的细节:
安装完成后,普通用户执行docker命令时可能会提示权限不足,这是因为docker的socket文件默认只允许root或docker组的用户访问。把当前用户加入docker组,然后重新登录,就能正常使用docker命令了。
hello-world镜像下载成功不代表容器网络正常,因为hello-world只是打印信息,真正验证网络可以跑一个临时nginx容器或者docker pull一个常用镜像。
如果拉取镜像很慢,可以考虑配置镜像加速,这部分在不同环境下的网络策略完全不同,我这里就不展开具体地址了,重点是明白加速原理就是把拉取远程镜像的请求换成使用更近的镜像仓库。
5.3 编译安装软件:理解configure、make、make install
包管理器虽好,但总有覆盖不到的场景。比如某些软件未打包到软件源,或者你需要自定义编译参数,这时就需要“从源码编译安装”。
源码安装的基本套路是:
第一步,获取源码包,通常是tar.gz或tar.xz格式。第二步,解压并进入源码目录。第三步,执行./configure生成Makefile,这一步可以指定安装路径和功能开关。第四步,执行make编译。第五步,执行make install把编译后的文件复制到系统路径。
有些源码包会写明“只需cmake方式构建”或“用meson构建”,但思路是一样的:先配置,再编译,再安装。
源码安装的好处是灵活,坏处是卸载困难,因为没有统一数据库记录安装内容。我的建议是:能用包管理器装的优先用包管理器;只有包管理器没有或版本太旧时,再考虑源码编译。
如果非要在服务器上源码安装,建议统一编译安装到/usr/local下,这样自己知道哪些是额外装的软件,出问题时也能快速定位。
5.4 安装图形化软件与桌面应用
如果你装的是桌面版Linux,安装图形软件通常比Windows更轻松。我起初用Linux桌面时,总觉得软件中心里的应用不如Windows丰富,后来发现只是搜索习惯不同。
Debian/Ubuntu系可以通过apt直接安装各种桌面软件,比如浏览器、办公软件、图像处理工具。也可以使用Flatpak或Snap,这些是跨发行版的软件包格式,能让你在不同Linux版本上安装相同版本的软件。
安装软件中心外的应用时,常见的来源是官方提供的deb/rpm包或AppImage文件。deb包用dpkg -i安装,rpm包用rpm -ivh安装,AppImage最方便,给予执行权限后直接运行,不需要安装。
这里有一个值得注意的事项:从第三方网站下载的deb/rpm包,安装前最好确认它的来源可靠性,否则可能引入不安全的软件或依赖问题。特别是那些“声称某个软件官方版”的站点,要特别留心域名是否真实。
6. 系统服务管理:让程序常驻后台
6.1 init与systemd:服务管理的前世今生
早期Linux用init作为系统启动的第一个进程,通过一系列脚本控制服务的启动和停止。后来systemd逐渐成为主流,它不只是服务管理器,还负责日志、定时任务、设备管理等,几乎所有现代发行版都在用它。
对于使用者来说,最直观的感受就是命令变了。以前可能是service nginx start,现在更标准的是systemctl start nginx。systemd的体系里,服务由一个“unit文件”来定义,它描述了服务如何启动、是否需要开机自启、依赖哪些资源等。
如果系统同时保底兼容init脚本,service命令也还能用。但我在实际操作中更推荐用systemctl,因为它的状态查询和错误信息更清晰。
6.2 systemctl常用操作速查:启动、停止、重启、设置开机自启
管理一个服务时,最常用的命令大概有以下这些:
systemctl start 服务名:立即启动服务。systemctl stop 服务名:停止服务。systemctl restart 服务名:重启服务,常用于修改配置后生效。systemctl reload 服务名:不中断运行的情况下平滑加载新配置,前提是服务支持。systemctl enable 服务名:开机自启。systemctl disable 服务名:取消开机自启。systemctl status 服务名:查看服务运行状态和最近日志。
这些命令中用到的“服务名”,一般是unit文件的名称,比如nginx.service也常直接写成nginx。查询时可以用systemctl list-unit-files --type=service查看系统上所有已知服务。
很多新手的疑惑是“我明明启动了服务,为什么浏览器还是访问不到”。这种情况多数不是服务本身没起来,而是防火墙、监听地址或端口没有放行,我在排查章节里会专门说。
6.3 编写一个简单systemd服务:把自定义脚本变成受管服务
当你写了一个Python脚本或一个自定义程序,希望它开机自己运行、崩溃后自动重启时,把它做成systemd服务是最好的选择。
举个例子,假设我有一个Python脚本放在/opt/myapp/app.py,希望开机启动并保持运行。那么我会在/etc/systemd/system/下新建一个文件,比如myapp.service,它的内容大致如下:
[Unit] Description=My custom application After=network.target [Service] WorkingDirectory=/opt/myapp ExecStart=/usr/bin/python3 /opt/myapp/app.py Restart=always User=myuser [Install] WantedBy=multi-user.target写完之后执行两步:
systemctl daemon-reload,让systemd重新读取unit文件。systemctl enable --now myapp,开机自启并立即启动服务。
检查运行状态用systemctl status myapp,查看日志用journalctl -u myapp -f。这样一条龙下来,你的自定义程序就不再是“裸跑”的进程了,而是能被系统统一监管的服务。
有一点要注意:ExecStart里的路径尽量写绝对路径,如果在脚本里还依赖环境变量,需要显式指定或写Environment变量,因为systemd默认环境比用户终端精简很多。我就曾踩过“脚本里用的命令在终端里能执行、在systemd里却找不到”的坑,后来发现是PATH变量不一样导致的。
6.4 开机自启与崩溃重启:让服务更可靠
Restart=always这个参数是系统服务的保命符。当进程意外退出时,systemd会自动尝试重新启动它,并做一些退避处理,避免疯狂重启。
除了always,还有Restart=on-failure,含义是只在异常退出时才重启,正常退出则不处理。如果某个脚本设计为执行完就退出,比如一次性任务,就不要设置always,否则它会不停重启,给系统带来压力。
对于真正需要高可用的服务,还可以配合RestartSec设置重启等待秒数,比如RestartSec=5表示崩溃后5秒再拉起。这个数值根据业务情况调整,太短可能引发服务反复快速重启,太长则影响恢复速度。
7. 服务进程的监控与排查技巧
7.1 查看进程与端口占用:常用命令组合
服务跑起来之后,免不了要确认它“到底跑没跑、监听在哪个端口、有没有吃光CPU内存”。
我常用的命令组合是这么几条:
ps aux | grep 进程名:快速筛选相关进程。pgrep -f 进程名:直接输出进程号,适合脚本里使用。top或htop:动态查看资源占用。ss -lntp或netstat -lntp:查看端口监听状态和对应进程。
比如我想确认nginx是否监听80端口,就会执行ss -lntp | grep :80,能看到监听地址和进程名称,基本就能判断服务层的网络状态。
如果端口看不出来,不要急着怀疑程序没有启动,先用systemctl status确认服务状态,再用ss排查端口,前后对应起来才能准确判断问题在哪里。
7.2 日志分析与journalctl使用
日志是排查问题最直接的入口。现代systemd系统会把服务的标准输出和标准错误收集到journal里,用journalctl可以统一查看。
常见用法如下:
journalctl -u 服务名:查看指定服务的全部日志。journalctl -u 服务名 -f:实时跟踪日志输出。journalctl -u 服务名 --since "10 minutes ago":只看最近10分钟。journalctl -p err -b:查看本次启动以来的错误级别日志。
如果你部署的程序本身还把日志写入自己的文件,比如/var/log/app.log,那也可以直接看那个文件。journal和日志文件是两套体系,很多程序两者都会写,看的时候别混淆。
我在排查问题时有一个习惯:先看服务状态,再看journal末尾几十行,最后才去看配置文件。这三步能解决绝大多数“为什么服务没生效”的问题。
7.3 常见故障定位思路:端口不通、服务起不来、权限拒绝
这里整理三类最容易遇到、也最容易定位的故障,附上排查思路。
第一类,端口不通。先确认服务确实在运行,再查看监听地址是否是0.0.0.0或对应网卡地址。如果只监听127.0.0.1,那外网当然访问不了。接着检查防火墙规则:Debian系常用ufw status,RHEL系用firewall-cmd --list-all。如果云服务器还要看看安全组规则是否放行。
第二类,服务起不来。用journalctl -u 服务名 -n 50看最近的错误日志,绝大多数情况下能直接看到原因,比如配置语法错误、端口被占用、文件权限不对。个别情况要检查磁盘是否满了,执行df -h看看使用率。
第三类,权限拒绝。常见于日志目录、配置目录或sock文件权限不对。Linux里提示Permission denied时,先用ls -l查看文件所有者和权限,再用id查看当前用户和组,绝大多数时候立刻就能定位。如果确实是需要更高权限的操作,用sudo或不直接去改系统关键目录的文件所有者。
8. 常见问题排查速查表
8.1 安装过程中的典型问题与解决办法
安装Linux时碰到问题很正常,很多问题本质上都是引导和分区的问题。这里挑几个高频场景说明:
- U盘启动后黑屏或花屏:优先尝试关闭图形加速参数,部分旧显卡在安装器下兼容性差。也可以先检查镜像文件的完整性。
- 安装时看不到硬盘:要先确认硬盘模式,SATA模式下的AHCI和旧IDE模式兼容性不同,部分机器需要切换SATA模式。
- 双系统引导丢失:装完Linux后Windows引导项不见了,多数是因为开机引导顺序被修改。解决办法是进入BIOS把默认启动项改回原系统所在硬盘,再用引导管理工具修复,或者用系统备用引导项。
- 安装过程卡住不动:常见原因是硬件驱动问题或下载更新时网络中断。安装时可选择不联网更新,装完再慢慢配源升级。
这些问题的共同点是需要冷静看提示信息。Linux安装器一般都会打印英文日志,有时虽然吓人,但仔细看就能发现具体原因。
8.2 软件安装与包管理中的常见问题
- 更新源时提示“无法解析域名”:大多是网络问题,检查DNS配置,可在
/etc/resolv.conf中配置可用的DNS地址。 - 安装时报“无法定位软件包”:先确认软件包名是否写错,再
apt update刷新源索引,还不行就搜索apt search 关键词确认确切包名。 - 提示“dpkg被中断”:说明上一次安装没有正常完成,一般执行
dpkg --configure -a修复。 - 手动安装deb后缺依赖:可用
apt install -f让包管理器尝试自动补齐。 - 软件源签名错误:发行版升级后有时会遇到源签名过期,需要先升级系统或更新GPG密钥。
碰到包管理问题,我的第一原则是“不要慌着卸载重装”,先看官方源里的同名软件是否存在、版本是否一致。很多问题可能只是因为源没刷新,或者包名不准确。
8.3 服务与进程运行时的常见问题
- 服务启动失败:用
systemctl status查看状态和日志。 - 服务显示active但访问不了:先查端口,
ss -lntp看监听情况,再查防火墙和安全组。 - 修改配置后不生效:先确认是否执行了reload或restart。很多服务只读启动时的配置,改完不重启不会生效。
- 日志无限增长占满磁盘:日志轮转配置在
/etc/logrotate.d/下,可以调整轮转周期或大小,避免系统盘被写满。 - 服务频繁重启:查看
Restart=策略和RestartSec设置,还要看日志里是否有崩溃堆栈。
服务类问题最容易犯的错是“只看状态不看日志”。状态显示active不代表业务正常,日志里的报错往往才是真正要解决的东西。
9. 安全与最佳实践:装完系统后必须做的事
9.1 账户安全与SSH加固
Linux装好后,第一件该做的就是加固账户安全。默认情况下root权限很大,如果服务器开了SSH远程登录,还允许root直接登录,那就等于敞开了大门。
常规做法是:
- 创建一个普通用户用于日常操作,并加入sudo组。
- 修改SSH配置,把
PermitRootLogin设置为no,禁止root直接远程登录。 - 不建议使用简单密码,如果条件允许,最好配置密钥登录并关闭密码登录。
- 修改默认SSH端口或至少不要使用非常弱的端口组合,并限制可以登录的用户。
这些操作看似基础,却是整个程序管理流程中容易被忽略的一环。软件装得再好,系统被入侵,一切归零。
9.2 定期更新与补丁管理
软件的生命周期里,“更新”是最日常也最必要的操作。单独说几个原则:
- 及时升级安全补丁,特别是系统核心、常见服务和依赖库。
- 生产环境不要盲目追新版本,先看兼容性和回归风险。
- 非生产环境可以体验新特性,但要留好回滚方案。
Debian系定期执行apt update && apt upgrade,RHEL系定期执行dnf update,这是最朴素的补丁管理。如果你维护多台机器,还可以考虑用定时任务自动提醒更新,而不是全部自动升级到最新版本。
9.3 版本控制与备份习惯
程序管理不仅指安装和启动,也包括“万一装坏了怎么回来”。
我在服务器上改动重要配置前,会先复制一份原文件备份,比如nginx.conf.bak,或者用系统自带的配置版本工具。这种习惯虽然简单,但在紧急恢复时非常救命。
数据库、用户数据、代码仓库这类不常变化的目录,可以定期打包备份到其他磁盘或远端存储。备份的恢复演练也很重要,隔几个月最好实际试一次“回滚恢复”,否则真出一个问题,可能才发现备份根本不可用。
如果已经把服务容器化,备份会相对轻松一些,因为配置和数据都在卷里,迁移起来更方便。但“卷”本身的备份策略依然不能省。
10. 从手动到自动:配置管理与脚本化思路
10.1 为什么需要脚本化与自动化
如果你只装一台机器,手动操作完全没问题。但当你需要同时部署三台五台甚至更多服务器时,再靠人一个一个装系统和配置软件,效率太低,还容易漏配。
自动化配置管理的思路是:把“安装哪些软件、改哪些配置、启动哪些服务”写成描述文件,让工具自动执行。主流工具有Ansible、SaltStack、Puppet等,其中Ansible通过SSH就能控制远端机器,不需要在目标机器上预装代理,对新手最友好。
即使不用这些重型工具,用几个简单的shell脚本也能把常用的安装步骤固定下来。比如把更新源、安装基础软件、关闭防火墙、设置时区这些操作写成一个脚本,新机器上跑一遍就能完成基础初始化。
10.2 一个简单的初始化脚本示例
假设你在Debian系服务器上希望完成基础初始化,脚本大致可以这样写:
#!/bin/bash set -e echo "Running system update..." apt update && apt upgrade -y echo "Installing basic packages..." apt install -y curl wget git vim ufw echo "Setting timezone..." timedatectl set-timezone Asia/Shanghai echo "Enabling firewall..." ufw enable echo "Done."实际执行前记得用bash -n 脚本名检查语法,用chmod +x赋予执行权限,再执行。第一次运行可能因为网络原因部分步骤失败,脚本里最好加判断或日志输出,方便排查。
10.3 容器化与基础设施编排带来的改变
再往外走一步,就是容器化和基础设施编排。既然程序可以打包为镜像,那么操作系统层的依赖就不再是“在每台机器上装”的问题,而是“镜像里已经包含了跑起来所需的一切”。
这种模式下,服务器的角色变得更纯粹,只需要运行容器运行时和一个负责调度的控制面,应用模块和基础依赖拆分成独立单元,升级、回滚、扩缩容都容易不少。
但容器化并不意味着可以完全不懂系统安装和程序管理。恰恰相反,构建镜像时仍需要处理软件源、依赖编译、目录权限、启动命令等问题。先把Linux本身学明白,容器和编排工具才能成为你真正顺手的能力,而不是另一个黑盒。
11. 个人经验总结与扩展建议
踩过这么多坑之后,我的体会是:Linux安装及管理程序这件事,本质上是“理解系统怎么组成、软件怎么跑起来、进程怎么被监管”的一套完整链路。很多人觉得装系统难,其实难的是不了解每一个选项背后的含义;很多人觉得管理程序麻烦,其实麻烦是没有形成一套固定的排查流程。
如果你刚入门,我的建议是先把虚拟机练手这条路走通:装系统、换软件源、装常用软件、写一个简单服务并设置为开机自启。这一套流程走完,Linux的基本功就扎下根了。
如果你已经能熟练装系统,下一步可以试着用脚本自动化初始化一台全新服务器,再把某个具体业务用容器方式部署起来。这样一来,你就不再是“会用命令”的层面,而是开始具备“设计一套可复制流程”的感觉。
最后分享一个特别实用的小技巧:在装系统或配置服务之前,先在记事本里把自己准备执行的操作步骤写下来,执行一步圈一步。这个习惯看起来很笨,但在多台服务器、时间紧急的情况下,它真的能帮你少出很多乱子。
Linux的世界不必一口气全部学完,把它当成工具箱就好,需要哪个工具就去学哪个工具的用法。最关键的是先跨过“亲手装一次系统”这道门,后面的一切都会越来越顺。