Linux安装与程序管理全指南:从虚拟机到Docker实战
1. 安装方式选型不盲目折腾先把路子选对我接触Linux这些年发现一个特别有意思的现象大多数人卡住的地方根本不是命令记不住也不是配置看不懂而是从一开始就把安装方式选错了导致后面所有操作都在和环境问题较劲越学越痛苦。先说说物理机直装。如果你手里正好有一台闲置的老电脑或者工作机配置足够宽裕直接拿实体机装Linux是最彻底的方式。好处有两个一是性能完全释放虚拟机那层虚拟化损耗直接没有了二是逼你直面真实硬件的兼容问题比如显卡驱动、无线网卡固件、声卡识别这些才是生产环境里真正要命的东西。坏处也很明显万一你手头只有一台主力机装完发现某个硬件不兼容退回Windows又是一顿折腾。我建议新手不要一上来就搞物理机直装除非你身边有一台可以随便造的备用机器。虚拟机方案是我最推荐新手上路的路径。VMware Workstation、VirtualBox或者macOS上的UTM都行。核心原因就一个快照功能是Linux学习阶段的后悔药。系统折腾坏了一条命令恢复到之前的干净状态这比你在纠结我是不是要重装一遍要省一百倍时间。而且虚拟机的网络模式尤其NAT模式天然帮你挡掉一堆外部网络的干扰你只管安心敲命令就好。说到这里必须提醒一句虚拟机和宿主机之间的复制粘贴、共享文件夹功能依赖的是open-vm-tools或VBox Guest Additions这类增强工具很多人忘了装然后抱怨为什么拖不了文件其实装一下就解决。Windows用户还有一个非常实用的备选方案WSLWindows Subsystem for Linux。如果你现在还没准备好从Windows完全换到Linux又想快速体验Linux命令行环境WSL是个不错的选择。WSL 2是真正的轻量级虚拟机内核是微软官方维护的启动速度很快日常跑跑脚本、装个Python环境、测试Docker都没什么问题。它的坑在于跨文件系统读写性能有点慢如果你在/mnt/c下面编译大项目会觉得卡另外Docker Desktop依赖WSL 2后端版本匹配不对的话会提示WSL版本太旧。这个方案我自己用了挺长一段时间结论是适合过渡不适合长期搞内核模块、驱动开发这类和硬件打交道的活。虚拟机的磁盘和分区规划看一遍就懂的细节。很多人装Linux的时候面对分区界面一脸懵我的建议是直接用引导程序推荐的清除整个磁盘并安装Linux这是最省心的方案。别在装系统阶段手动画分区后面熟悉了再玩都能理解。只有两个细节值得你手动看一眼一个是交换分区swap如果你的内存小于8G建议swap给到内存的1到2倍如果是16G以上其实swap给4到8G就够甚至可以不建swap改用swapfile需要后续手动配置。另一个是/boot分区UEFI引导的机器会自动创建EFI分区只要保证它大小在512M以上一般不会出问题。这里有个我踩过的坑装Ubuntu时安装程序默认清除整个磁盘但你原本的系统引导程序比如Windows的Boot Manager会被覆盖导致开机直接进Linux没有双系统选择菜单。如果你确实需要双系统共存一定要手动选与Windows共存或者在分区里安装到现有空余空间并且先备份重要数据。物理机上双系统引导修复起来相当折磨虚拟机上完全没这个烦恼。2. 发行版怎么挑别被生态最好带偏说句实在话日常面对最多的问题就是我应该装哪个版本每次看到这种问题我都想反问一句你要拿来干嘛不同的场景正确答案完全不同。如果你是一个完全没接触过Linux的新手Ubuntu或者它的桌面版LTS长期支持版本我仍然敢说最适合上手。原因很简单社区最大、教程最多、找任何一个问题的解决方案Google一下基本都是Ubuntu路径。哪怕你只会复制粘贴命令Ubuntu的报错信息也更友好一些因为遇到坑的人多你遇到坑的时候基本都有人帮你踩过了。不过我建议你装LTS版本22.04、24.04这种不要追奇偶版本号桌面环境稳定才是第一位的。如果你拿Linux当服务器用生产环境追求稳定那Debian和Rocky Linux或者说RHEL系是更主流的选择。Debian的哲学是稳定压倒一切软件包版本往往比最新版落后一大截但好处是出问题的概率极低apt源里的包都是经过大量测试的。Rocky Linux是CentOS停更之后社区接棒维护的免费RHEL替代品和Ubuntu相比你可能要习惯yum/dnf命令体系而且默认软件源里没有那么多桌面软件它本来也不是装来当桌面的。国内这几年也有几个国产Linux系统在活跃推进比如统信UOS、麒麟、openEuler。它们的定位有几个方向一是党政办公场景环境优化和办公软件适配做得多二是服务器生态openEuler在华为的推动下服务器场景很活跃三是大数据、云原生领域的特定优化。平心而论国产系统这几年确实在走正道桌面体验和软件适配比几年前好不少但应用生态离主流发行版还有差距。如果你是普通开发者想搞游戏、剪辑、折腾开源软件建议还是老老实实Ubuntu/Debian如果你是在特定行业做信创适配那再按项目要求选择对应的国产发行版。选择标准永远是匹配使用场景而不是单纯比谁的口号响。选版本还有一个容易被忽略的角度CPU架构。x86架构的机器走主流发行版基本畅通无阻如果是ARM架构比如树莓派、Apple Silicon就要注意发行版是否提供对应的ARM镜像。很多老教程默认你用的是x86镜像直接复制到ARM机器上跑轻则缺包重则内核不匹配直接卡在开机引导。这一点对打算在嵌入式Linux方向深入的朋友尤其重要别问我怎么知道的。3. 上手先记命令程序管理的地基系统装好之后你迟早要面对一个问题怎么装程序、怎么卸程序、怎么让程序开机自启、怎么查看程序到底吃掉了多少内存。这些操作说到底是Linux下程序管理这门手艺的核心。我经常跟新朋友讲一个比喻Linux下的命令就像你熟悉的手机App你不需要背完所有图标只要记住最常用的那十来个就能cover掉日常工作的大部分场景。文件管理这块你至少要熟练这组命令pwd看当前在哪个目录防止我在哪儿的迷茫ls查看目录内容配合-la参数看隐藏文件和权限细节cd切换目录记住~是家目录/是根目录mkdir/rmdir建目录和删空目录cp/mv/rm复制、移动、删除注意rm -rf真的要慎重使用cat/less/head/tail查看文本文件内容日志排查最常用的就是tail -f这些命令看起来是基本功但很多老油条也会偶尔栽跟头。比如rm -rf /这个组合绝对不要在root权限下乱敲也别在脚本里写死。哪怕你是老手一个手滑加上变量没赋值最后变成rm -rf加根目录路径整个系统就没有然后了。我自己真实经历过一次教训就是高危命令前永远做一次pwd确认路径重要目录加个find再删。用户管理这块是很多教程忽略但实际很容易出问题的地方。你装完系统会有一个管理员账号安装时创建的那个用户日常操作就用它需要管理员权限时用sudo前缀执行。但要注意并不是所有程序都适合用管理员身份跑的尤其是从网上下的安装脚本管理员权限等于把整个系统钥匙全给了它。要新建用户用sudo useradd -m -s /bin/bash 用户名 sudo passwd 用户名-m参数会自动创建该用户的家目录-s指定登录Shell。然后可以用su 用户名切换到那个用户或者用sudo -i切换到root。这里有个权限问题经常让人困惑为什么我新建的用户不能执行sudo因为用户sudo权限不是默认拥有的得先把用户加入sudo组sudo usermod -aG sudo 用户名组管理这块groups命令看一下当前用户属于哪些组chown改文件属主、chmod改权限。我把这三条常用命令记在一个小本本上因为它们对大三阶段写脚本、搭服务太常用了chmod x 脚本.sh可以给脚本加执行权限chown -R 用户:用户 目录可以把整个目录的属主改成某用户做到文件隔离。systemctl是服务管理的核心。几乎每个Linux系统上都有systemd在做底层进程管理它用systemctl status 服务名看服务状态systemctl start/stop/restart 服务名启停服务systemctl enable 服务名设置开机自启。你如果用systemd管理自编译的程序可以把启动命令写进一个service文件放到/etc/systemd/system目录下这样它就能开机自动跑崩溃了也会自动拉起。这一步对后面装MySQL、装Docker、自定义服务特别重要别只会./程序跑前台。4. 软件包管理装程序的核心姿势Linux下装程序的途径主要有三条包管理器、源码编译、容器镜像。三条路的适用场景完全不同但逐一说透程序管理这块就已经拿下一半了。先讲包管理器。Debian系Ubuntu、Debian用aptRedHat系Rocky、CentOS、Fedora用yum或dnfArch系用pacman。命令虽然不同底层逻辑是相通的从软件源repository下载预编译好的二进制包然后处理依赖关系安装到系统对应目录。日常最常见的坑其实是包管理器该不该update之后再install。apt update是刷新软件源索引apt upgrade才是真正升级系统里已装软件包的版本。很多新手一上来直接apt install某个软件结果提示找不到包本质就是本地索引没有刷新源里可能已经有这个包但你不知道。所以我的习惯是安装任何新软件之前先跑一次apt update如果你正在用的镜像源比较慢还会看到一堆超时报错这时候就要考虑换个国内源。对于国内用户把Ubuntu apt源指向清华或者阿里云镜像是个立竿见影的提速方式。做法是把/etc/apt/sources.list里的archive.ubuntu.com替换成mirrors.aliyun.com这类国内镜像地址然后apt update。这里提醒一句如果你用的是某个特定版本比如20.04、22.04替换源的时候一定注意把版本代号jammy、focal这种保留正确不然会出现源不匹配的怪问题。包管理器的依赖处理是它存在的最大价值。你装AA依赖BB又依赖Capt会自动把B和C一起装上。但依赖冲突也经常发生你手里有个.deb包是旧依赖编译的装的时候它想覆盖系统里某个库的版本而系统里另一个软件需要旧版本库就打架了。这时候别硬着头皮apt install xxx.deb用apt --fix-broken install让系统试试自动修复往往能救回来。源码编译是另一条路适合做定制化场景你想加特定编译参数、你想跑最新版本来尝鲜、或者干脆源里没有这个包。过程说起来就是经典三步./configure --prefix/usr/local/xxx make make installconfigure这一步检查和生成编译配置文件make是实际编译过程make install把编译好的成果安装到指定目录。但源码编译有不少苦头编译依赖的库缺一个就报错make中途断掉还要手动清理编译时间动辄十分钟到半小时。所以我的原则是能走包管理器就优先包管理器只有包管理器搞不定才考虑源码别把时间浪费在无止境装编译依赖上。容器镜像是现代Linux程序管理的第三极。Docker这个概念大家都听过把程序、依赖、配置、运行环境整个打包成一个镜像在任何装了Docker的机器上都能跑起来隔离性非常好。热词里提到linux安装docker说明这块确实是大热点。Docker的核心命令很快能上手sudo apt update sudo apt install -y docker.io sudo systemctl status docker装好之后服务怎么用docker image ls看本地镜像docker search去Docker Hub找镜像docker pull nginx下载镜像docker run -d -p 8080:80 nginx跑一个nginx容器并把宿主机8080端口映射到容器80端口。这里有个必须要做的小优化配置镜像加速器。原因大家都懂直接访问Docker Hub拉镜像在国内网络环境下时快时慢把加速器地址写进/etc/docker/daemon.json之后再systemctl restart docker拉镜像的速度会显著提升。5. 实战拆解装Python、MySQL、Docker的完整过程5.1 Python环境安装别和系统自带Python打架Ubuntu系统自带的Python是系统级依赖比如apt本身可能就依赖某个版本的Python你别手贱把系统Python卸载或者替换。更稳妥的思路用apt install python3 python3-pip装正式版本然后用python3 -m pip install xxx装Python包。如果想管理多版本Python比如既要3.10又要3.12推荐用pyenv它会把各版本Python装到~/.pyenv/versions下完全不侵入系统环境切换版本也方便。一个典型操作是给pip换国内源。新建~/.pip/pip.conf[global] index-url https://mirrors.aliyun.com/pypi/simple/ trusted-host mirrors.aliyun.com之后pip install就快很多了。装Python包的时候最怕的是系统级Python环境被搞乱所以我一直用虚拟环境。在项目目录下执行python3 -m venv venv source venv/bin/activate看到命令行前面出现(venv)前缀就说明你已经在虚拟环境里了之后pip install装的一切包都在项目自己的环境里不再污染系统。5.2 Docker安装镜像加速器必须配好实测下来最省心的安装方式就是apt安装因为发行版官方源里的Docker版本虽然可能不是最新但稳定性和依赖完整性有保障。装完别急着跑容器第一步先验证服务状态systemctl status docker看它是active还是inactive。如果是inactive执行sudo systemctl start docker并顺手设置一下开机自启sudo systemctl enable docker就在你第一次docker pull的时候大概率会撞见那个经典报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection除了换源还能怎么办可以配置registry mirror国内可选的加速器源大家自己选可靠的就行一般是阿里云或者中科大镜像。然后在/etc/docker/daemon.json里写{ registry-mirrors: [https://你的加速器地址] }之后systemctl restart docker一般能稳定拉取镜像。这里有个时间成本上的体会不是加了加速器就一定快偶尔还是会遇到某个镜像层超时可以多换几个加速器地址交叉使用或者在docker pull的时候指定标签和仓库的完整路径来减少不必要的层拉取。5.3 MySQL安装装完必须做的四件事MySQL的安装在不同发行版上略有差异Ubuntu下最省事sudo apt update sudo apt install -y mysql-server sudo systemctl start mysql装完之后必修课是初始化安全配置。虽然新版Ubuntu装完MySQL默认是免密的但它会要求你设置一个root密码。执行sudo mysql进入MySQL然后ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的强密码; FLUSH PRIVILEGES;这里我建议你用强一点儿的密码至少包含大小写字母和数字别嫌麻烦。接下来是允许远程连接如果你有这需求的话编辑/etc/mysql/mysql.conf.d/mysqld.cnf把bind-address 127.0.0.1改成0.0.0.0然后创建远程登录用户CREATE USER appuser% IDENTIFIED BY 强密码; GRANT ALL PRIVILEGES ON *.* TO appuser%; FLUSH PRIVILEGES;这样外部机器才能连上这台MySQL。第四件事是设置开机自启一般apt安装的MySQL已经默认开启了但为了确认跑一下systemctl is-enabled mysql如果是enabled就没问题了。6. 常见问题与排查技巧你踩过的坑我都踩过6.1 依赖破损apt --fix-broken install这个报错十有八九是因为你混装了大版本不同的软件包或者某个.deb包安装中断了。最典型的表现就是apt install任何包都会提示unmet dependencies大片红字。解决办法很简单sudo apt --fix-broken install这个命令会尝试修复系统中所有已经存在的依赖问题。如果还不行就进一步清理残留的.deb缓存和半安装包用sudo dpkg --configure -a sudo apt clean6.2 锁文件问题/var/lib/dpkg/lock出现Could not get lock /var/lib/dpkg/lock通常是因为另一个apt进程还在后台运行或者上次安装中断了锁没释放。别急着一顿操作猛如虎把它删掉先确认没有其他apt进程ps aux | grep -i apt如果确实没有apt进程在跑再手动清理锁文件sudo rm -rf /var/lib/dpkg/lock sudo dpkg --configure -a6.3 软件源失效换了新源或者源服务器挂了执行apt update会报一堆404和“Failed to fetch”。我的处理方式是按提示里出现的具体URL去访问一下看是域名解析问题还是404区分清楚原因再解决。如果是域名解析超时检查DNS配置和网络如果是镜像源目录结构变了比如老源路径已经不存在换上清华或阿里云当前推荐的源地址即可。6.4 虚拟机装Linux蓝屏热词里出现虚拟机安装linux蓝屏这个场景基本是Windows宿主机上跑VMware或VirtualBox启动虚拟机时宿主物理机蓝屏或者虚拟机内Windows蓝屏。如果是宿主蓝屏常见原因有几个虚拟化技术冲突Hyper-V和VMware同时开着、BIOS里VT-x/AMD-V没开、内存资源分配过大超过了宿主可用物理内存。解决办法关掉Windows的Hyper-V和内核隔离功能重启后在BIOS里确认虚拟化开关是Enabled然后给虚拟机分配的内存在宿主机内存的一半以下别贪多。6.5 快照是救命稻草在虚拟机里折腾系统比物理机强最大的就是可以随时打快照。每完成一个阶段性配置比如装好Docker、配好源、装好python环境就拍一张快照。下次系统玩坏了直接从快照恢复几分钟回到之前的可用状态。这个习惯我强烈建议你养成它可以把一朝操作失误重装一整天变成恢复到快照点继续搞。顺便说说物理机的备份思路装完系统刚配好环境的时候用dd命令整盘备份成一个镜像文件或者用tar打包整个根目录排除/ proc、/sys、/dev、/tmp这些虚拟文件系统以后出了大问题恢复起来方便得多。备份命令大致长这样sudo tar -cvpzf 系统备份.tar.gz --exclude/proc --exclude/sys --exclude/dev --exclude/tmp --exclude/run --exclude/mnt --exclude/media /恢复到新环境的时候解包回去就行。记住一个原则备份永远在犯错之前不是之后。6.6 程序装好却不生效很多时候你装完某个软件执行命令却提示command not found这往往是安装目录不在PATH里。比如你源码编译装进了/usr/local/xxx/bin而系统默认没把这个路径加进PATH环境变量。临时生效可以export PATH$PATH:/usr/local/xxx/bin永久生效则写进/etc/profile.d/下新建的环境变量脚本里。记得chmod x那个脚本再重开终端。如果你是用systemctl管理服务的服务文件写完service文件后一定记得先sudo systemctl daemon-reload再systemctl start不然新配置不生效还会给你看一个莫名其妙的错误。这类程序装好却行为诡异的问题九成是环境变量没配置或服务没重载排查思路可以按这个顺序来先确认命令路径对不对which或者type命令看一眼再确认服务有没有在用你修改过的配置最后检查日志。7. 个人经验谈Linux这条路怎么走得顺写了这么多还是想再说点实在的。Linux不是一门靠看书就能学会的手艺它就是一个多用就会、不用就废的工具。我的建议是别贪多别想着把所有发行版都试一遍先把Ubuntu这一条线打穿。装完系统第一周什么都别学就干三件事通过包管理器装你常用的软件用systemctl管理它们的启停再自己写几个小脚本练练cron定时任务。等这些操作都形成肌肉记忆了再去接触Docker、服务编排、源码编译自然就不怕了。还有一个我自己的习惯遇到问题别立刻去抄命令先看一眼报错信息。很多新手一看英文报错就慌直接复制粘贴到搜索引擎结果搜出一堆无关答案。实际上Linux的报错信息往往已经把答案说清楚了比如Permission denied就是权限问题Command not found就是路径或安装问题学会读报错比学会记命令更值钱。我会在终端里的每个关键操作都自己敲一遍敲错一个字符再看它报什么错这种试错式学习比背命令快得多。最后再分享一个小技巧给每个开过的终端窗口取个有意义的名字比如server-setup、db-console用tmux或screen管理会话这样你在多个任务切换时不容易宕机。这属于纯个人习惯但对提高Linux日常效率帮助很大。