Linux 入门

前言

  • 这篇解决三个问题:Linux 到底是什么(内核和发行版不是一回事)、它是怎么启动起来的、你现在怎么立刻弄到一个能敲命令的 Linux。
  • 环境说明:本文所有「实测」输出都在 Ubuntu 26.04.1 LTS(Resolute Raccoon)+ WSL2 上跑出来的,宿主机是 Windows 11 专业版 26H2(winver 里显示「操作系统版本 26300.9711」),WSL 引擎版本 3.0.3.0、Linux 内核 6.18.54.1-microsoft-standard-WSL2,日期 2026-11-03。服务器上的 Debian/Ubuntu 与它同族,命令基本一致;RHEL 系(CentOS/Rocky/AlmaLinux/TencentOS)的差异在「发行版怎么选」那节单独列了表。
  • 这里有个容易看错的地方,顺手说清:wsl --version 会打印 Windows 版本: 10.0.26300.9711,开头那个 10.0 是 NT 内核版本号,Windows 10 和 Windows 11 共用,不代表这台是 Windows 10(注册表里的 ProductName 甚至还写着 Windows 10 Pro,那是历史遗留字段)。

学 Linux 到底学什么

原笔记给的三句话方向没错,我把它拆成可执行清单:

学什么 具体到能做什么 熟练标准
常用命令 定位文件、看进程、改权限、打包解压、看日志、远程登录 不用查资料能把一个服务从「装好」折腾到「跑起来 + 出问题能查日志」
软件安装 会用发行版自带的包管理器(apt / dnf / yum),知道 .deb、.rpm、源码编译、snap/flatpak 各自什么时候用 能看懂「这个包为什么装不上」的报错
服务端架构 知道一台服务器上 nginx → 应用进程 → 数据库怎么串起来,端口、防火墙、systemd 服务、日志分别在哪一层 拿到一个陌生报错知道往哪一层去查

Linux 不是用来「背」的,是用来「试」的。同一个 chmod,你在真系统上把某个用户的目录权限改错、然后发现连不上了,这一下比背十遍都牢。所以本文后面专门讲怎么低成本弄一个可以随时搞坏的 Linux 环境。

什么是操作系统:内核 ≠ 发行版

  • 内核(kernel):真正管理 CPU、内存、进程、文件系统、设备驱动的那一层软件。它是操作系统的核心,但光有内核你什么也干不了——没有 shell、没有包管理器、没有编辑器、没有网络配置工具。
  • 发行版(distribution,简称 distro):内核 + 一整套配套软件(shell、coreutils、包管理器、systemd、桌面环境、常用工具),由某个组织打包、测试、发布,并负责安全更新。我们平时说「我装的是 Ubuntu」,指的是发行版。

这两层在系统里能直接看出来,实测:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 内核:由 Linux 那边发布,版本号在这里
$ uname -a
Linux Y9000P 6.18.54.1-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC Tue Oct 6 19:13:07 UTC 2026 x86_64 GNU/Linux

$ cat /proc/version
Linux version 6.18.54.1-microsoft-standard-WSL2 (root@9b80f41eb17c) (gcc (GCC) 13.2.0, GNU ld (GNU Binutils) 2.41) #1 SMP PREEMPT_DYNAMIC Tue Oct 6 19:13:07 UTC 2026

# 发行版:由 Ubuntu 发布,它决定你用什么包管理器、什么时候推送更新
$ lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 26.04.1 LTS
Release: 26.04
Codename: resolute

顺带把两个容易混的说法钉死:

  • 「Linux 内核」和「GNU/Linux」:内核只提供系统调用,shell、ls、gcc、bash 这些用户态工具绝大多数来自 GNU 计划,所以严格叫 GNU/Linux 更准确(GNU 的说明)。日常说 Linux 没问题,知道这层关系就行。
  • 内核版本和发行版版本毫无关系:6.18.54 是内核版本,26.04 是 Ubuntu 的发布日期编号(2026 年 4 月)。同一个 Ubuntu 26.04 里内核会因为安全更新从小版本往上跳,别拿它当「系统新旧」的依据。

常见的操作系统分类

场景 常见选择 说明
桌面 Windows、macOS、Linux 桌面版(Ubuntu Desktop、Fedora Workstation、deepin、麒麟) Linux 桌面份额小,但开发者用得多
服务器 Linux(Debian/Ubuntu Server、Rocky/AlmaLinux、TencentOS、Huawei Cloud EulerOS 等)、Windows Server、各类 Unix 云上绝大多数是 Linux
移动端 Android(内核就是 Linux)、iOS 手机数量上 Android 占大头
嵌入式/物联网 各种裁剪过的 Linux、FreeRTOS、Zephyr 路由器、摄像头、车机

一个值得记住的事实:Android 的内核就是 Linux,所以「Linux 只有服务器在用」是错的;反过来说,Android 上没有 GNU 用户态那一套,也别把它的操作经验往服务器 Linux 上套。

32 位与 64 位

本质区别是寄存器宽度和地址能表示的数量:

  • 32 位:地址 32 位宽,理论能寻址 2^32 = 4 GiB。而且这 4 GiB 还要分一部分给设备映射内存(MMIO),所以老 32 位系统上装 4 GB 内存通常只能看到 3.2–3.5 GB。
  • 64 位:地址 64 位宽,理论 2^64。但没有任何实现真的用满 64 位——做满宽地址译码太贵,实际只取其中若干位。

这一台机器的真实上限,lscpu 直接告诉你:

1
2
$ lscpu | grep "Address sizes"
Address sizes: 46 bits physical, 48 bits virtual

读法:物理地址 46 位 → 最多能编址 2^46 = 64 TiB 内存;虚拟地址 48 位 → 每个进程理论上可用 2^48 = 256 TiB 虚拟地址空间(Linux 默认对半分成用户态 128 TiB + 内核 128 TiB)。

怎么判断自己系统是不是 64 位(三个角度,实测值都列出来):

1
2
3
4
5
6
7
8
$ uname -m
x86_64 # 内核架构;aarch64 是 64 位 ARM,i686 才是 32 位 x86

$ getconf LONG_BIT
64 # C 语言 long 的位宽,最直接的「是不是 64 位」

$ dpkg --print-architecture
amd64 # Debian/Ubuntu 的包架构名(和 x86_64 是同一个东西)

顺带一个容易踩的坑:64 位系统可以装 32 位程序,反过来不行。所以下载软件时一律选 64 位(x86_64 / amd64 / x64 三种写法指的是同一类)。这台机器上 dpkg --print-foreign-architectures 返回空,说明没启用 i386 跨架构支持——真要跑 32 位老程序,得先 dpkg --add-architecture i386 再装对应的库。

Linux 从哪来:五大支柱

1991 年 Linus Torvalds 把内核发出来,能长成今天这个样子,靠的是这五件事:

支柱 它解决了什么
基于 Unix 的思想 一切皆文件、小工具组合、shell 与程序分离——这套设计范式是 Unix 留下的
参考 Minix Minix 是一个教学用的小 Unix,Linus 最初就是在它的启发(和不满)上写的内核
GNU 计划 提供了 shell、coreutils、gcc、glibc 等用户态工具,让内核「有用」;GPL 许可证保证这些工具能被自由再分发
POSIX 标准 规定了「符合 Unix 的系统该提供哪些接口」,程序才能在不同发行版之间迁移
互联网 内核靠全球协作者开发、靠网络分发源码,这在 1991 年前是不可想象的

版本号要看懂:现代 Linux 内核不再用奇偶区分稳定/开发,6.18.54 是「主版本 6、次版本 18、稳定补丁 54」,主版本大约每 2-3 个月出一个。发行版的编号规则各家不同:Ubuntu 的 26.04 是「年.月」,Debian 用 13 这种纯数字加代号,RHEL 系用大版本号。

发行版怎么选(2026 年的现实)

先纠正原笔记里已经过时的部分:CentOS 作为「RHEL 的免费重编译版」已经不存在了。2020 年 12 月 Red Hat 宣布 CentOS 转向 CentOS Stream——它变成 RHEL 的上游(比 RHEL 先动,不再等于 RHEL),CentOS 8 在 2021 年底停更、CentOS 7 在 2024 年 6 月停更。现在要「RHEL 兼容且免费」,实际选择是 Rocky Linux 或 AlmaLinux;云厂商自己的镜像(如 TencentOS Server)也属于这一族。

家族 代表发行版 包管理器 / 包格式 谁在用
Debian 系 Debian、Ubuntu(含 WSL 版)、麒麟、deepin apt + .deb 云上很常见,桌面/开发环境主流
RHEL 系 RHEL、CentOS Stream、Rocky、AlmaLinux、TencentOS Server、openEuler dnf/yum + .rpm 企业、国内云主机镜像
SUSE 系 openSUSE、SLES zypper + .rpm 欧洲企业、SAP 场景
Arch 系 Arch、Manjaro pacman 想要最新软件包的个人用户
其他 Alpine(apk,容器基础镜像常用)、Fedora(RHEL 的上游试验田) — —

选型建议:

  • 学习阶段:Ubuntu LTS(本文实测用的就是它),资料最多、apt 最好用,而且 Windows 上一条命令就能跑起来。
  • 跟着公司走:公司服务器是 TencentOS/Rocky 就用 dnf 那一套,别只在本地练 Ubuntu 命令,上服务器会一脸懵。
  • 容器里:Alpine 体积小但用的是 musl libc,和 glibc 有行为差异,别默认「和 Ubuntu 一样」。

两大阵营的命令差异(这份建议直接收藏,比记单个命令有用):

要做的事 Debian/Ubuntu(apt) RHEL/Rocky/TencentOS(dnf / yum)
更新索引 apt update dnf makecache(dnf update 会顺带升级)
装一个包 apt install nginx dnf install nginx
删包 apt remove nginx dnf remove nginx
升级全部 apt full-upgrade dnf update / dnf upgrade
查已装的包 dpkg -l / apt list --installed rpm -qa / dnf list installed
查文件属于哪个包 dpkg -S /usr/bin/ls rpm -qf /usr/bin/ls
查谁依赖它 apt rdepends 包名 dnf repoquery --reverserequires 包名
清理缓存 apt clean dnf clean all
防火墙命令 ufw(Ubuntu 上默认装) firewalld / firewall-cmd
SELinux 一般没启用 默认开启,权限诡异时先查它
网卡配置 /etc/netplan/*.yaml /etc/sysconfig/network-scripts/ 或 NetworkManager

先说清 dnf 和 yum 的关系,不然对着老教程会找不到命令:

  • yum(Yellowdog Updater, Modified)是 RHEL/CentOS 5-7 时代的包管理器,用 Python 写的。
  • RHEL 8、CentOS 8 起底层换成了 dnf(Dandified YUM),换掉了 yum 那个又慢又吃内存的依赖求解器。
  • 但 yum 这个命令没有被删掉:Red Hat 把它保留成 dnf 的兼容入口,所以在 RHEL 8/9、Rocky、AlmaLinux、TencentOS Server 3 上,yum install nginx 和 dnf install nginx 是同一回事,选项也通用(-y、remove、makecache、clean all)。腾讯云文档里也明确写着 TencentOS Server 3 同时支持 yum 和 dnf。
  • 真正的分水岭是老系统:RHEL/CentOS 7(以及 TencentOS Server 2.4)只有 yum,敲 dnf 会提示命令不存在。

所以这张表里的 dnf 列,你可以理解成「dnf,老系统上叫 yum」。本机(Ubuntu)实测两个都没有,判断自己站在哪一边就靠这一条:

1
2
3
4
5
$ for c in dnf yum rpm; do printf '%-6s %s
' "$c" "$(command -v $c || echo 未安装)"; done
dnf 未安装
yum 未安装
rpm 未安装

在 RHEL 8/9、Rocky、AlmaLinux、TencentOS Server 3 上,command -v yum 和 command -v dnf 会同时有结果,而且 ls -l $(command -v yum) 通常显示 yum 是指向 dnf 的软链接——这台 Ubuntu 上没有 RHEL 系环境,这一条是官方文档的说法,不是我实测的。

判断自己站在哪个家族,最快的办法是看两个文件(实测本机结果):

1
2
3
4
5
6
7
8
9
$ ls /etc/debian_version /etc/redhat-release 2>&1
ls: cannot access '/etc/redhat-release': No such file or directory
/etc/debian_version

$ for c in apt dnf yum rpm; do printf "%-6s %s\n" "$c" "$(command -v $c || echo 未安装)"; done
apt /usr/bin/apt
dnf 未安装
yum 未安装
rpm 未安装

这台是 Ubuntu 26.04,所以只有 apt 那一套;apt 版本实测是 apt 3.2.0 (amd64)。

系统启动流程

传统物理机的顺序,五步:

阶段 干什么 关键名词
上电自检 固件跑起来,检查 CPU/内存/设备 BIOS(老)或 UEFI(现在都是它)
找引导程序 固件按启动顺序读盘上的引导记录 MBR(BIOS + 老分区表)/ GPT + ESP 分区(UEFI)
引导加载器 显示菜单、加载内核和 initramfs GRUB(Linux 上最常见)
内核启动 解压内核、初始化驱动、挂载 initramfs 里的临时根 vmlinuz-*、initramfs
第一个用户态进程 内核启动 PID 1,由它把所有服务拉起来 PID 1 = systemd(/sbin/init 是它的符号链接)

原笔记写的是 BIOS + MBR 那条老路,现在新机器基本是 UEFI + GPT(区别见 Arch Wiki 的 UEFI 条目):MBR 只有 512 字节引导区、最多 4 个主分区、支持不了 2 TB 以上的盘;GPT 用独立分区表 + 备份表,UEFI 直接读 FAT 格式的 ESP 分区里的 .efi 引导文件。概念上还是那五步,只是「引导记录」换成了「ESP 里的引导程序」。

在真系统里能验证到这条链的尾巴——PID 1 到底是什么:

1
2
3
4
5
6
7
8
9
$ ls -l /sbin/init
lrwxrwxrwx 1 root root 22 Jul 28 04:44 /sbin/init -> ../lib/systemd/systemd

$ readlink -f /sbin/init
/usr/lib/systemd/systemd

$ ps -p 1 -o pid,comm,args
PID COMMAND COMMAND
1 systemd /sbin/init

也就是说:/sbin/init 这个名字是历史包袱(早期确实是这个程序),现在它只是个指向 systemd 的软链接,PID 1 的一切行为由 systemd 决定。

WSL2 是个例外,别把启动流程硬套上去

我这台是 WSL2:没有 BIOS、没有 MBR/GPT、没有 GRUB——Windows 通过轻量级虚拟机直接拉起内核,再执行一个 /init。内核命令行把这件事写得很清楚:

1
2
$ cat /proc/cmdline
initrd=\initrd.img WSL_ROOT_INIT=1 panic=-1 nr_cpus=8 hv_utils.timesync_implicit=1 printk.devkmsg=on page_reporting.page_reporting_order=5 hv_storvsc.storvsc_max_hw_queues=4 console=hvc0 debug pty.legacy_count=0 WSL_ENABLE_CRASH_DUMP=1

能读出来的信息:

  • initrd=\initrd.img + WSL_ROOT_INIT=1:由 WSL 自己的 init 接管,再切到发行版的根文件系统。
  • console=hvc0:控制台是虚拟机串口,不是物理 tty。
  • nr_cpus=8:内核只看到 8 个 CPU——这正是我在 WSL 设置里把处理器数限成 8 的结果(nproc 实测也是 8)。
  • hv_storvsc / hv_utils:Hyper-V 的驱动,说明底下是虚拟机。

所以「WSL 里为什么看不到 GRUB」「systemd-analyze 为什么只报 userspace 时间」都有了解释:它的启动不是从固件开始的。

启动耗时怎么看

1
2
3
$ systemd-analyze
Startup finished in 964ms (userspace)
graphical.target reached after 963ms in userspace.

物理机上这条还会带 kernel 和 initrd 两段。想知道是哪个服务慢,用 systemd-analyze blame(按耗时排序)和 systemd-analyze critical-chain 服务名(看依赖链)。

运行级别 → systemd target

老 SysV init 用「运行级别 0-6」表示系统状态,/etc/rcN.d/ 下放对应级别的脚本。systemd 用 target 取代它,但为了兼容留了一层映射:

旧运行级别 对应 target 含义
0 poweroff.target 关机
1 rescue.target 单用户/救援(挂载文件系统)
2 multi-user.target 多用户、无图形界面
3 multi-user.target 同上(Debian/Ubuntu 里 2 和 3 本来就等价)
4 multi-user.target 保留给自定义
5 graphical.target 多用户 + 图形界面
6 reboot.target 重启

原笔记教的查法是 runlevel 或 who -r。实测这两条在 Ubuntu 26.04 上都不好用:

1
2
3
4
5
$ runlevel
/bin/bash: line 1: runlevel: command not found

$ who -r
(没有任何输出)

原因有两层,都能验证:

  1. runlevel、telinit、last 属于 sysvinit-utils,现代 Ubuntu 镜像默认没装(command -v 逐个查,结果就是「未安装」)。
  2. systemd 编译时关掉了 utmp 支持——systemctl --version 第二行的特性列表里明确写着 -UTMP,/run/utmp 这个文件也确实不存在。所有依赖 utmp 的老命令(who -r、last)自然拿不到数据。

正确的查法(实测):

1
2
3
4
5
6
7
8
9
10
11
12
13
$ systemctl get-default
graphical.target

$ ls -l /lib/systemd/system/default.target
lrwxrwxrwx 1 root root 16 Jul 28 04:44 /lib/systemd/system/default.target -> graphical.target

$ systemctl is-system-running
running

$ systemctl list-units --type=target --no-legend --no-pager | grep -E "basic|multi-user|graphical"
basic.target loaded active active Basic System
graphical.target loaded active active Graphical Interface
multi-user.target loaded active active Multi-User System

改默认启动目标(等价于以前改 inittab 里的运行级别):

1
2
3
4
5
# 让下次启动进入「多用户无图形」——服务器上很常用
sudo systemctl set-default multi-user.target

# 临时切过去(不改默认值),等价于旧系统的 telinit 3
sudo systemctl isolate multi-user.target

至于「/etc/rc5.d 还在不在」:还在,但只是兼容层。实测这台机器上 /etc/init.d 下有 12 个脚本、/etc/rc5.d 下有 7 个(S01apport、S01chrony、S01console-setup.sh……),systemd 通过 systemd-sysv-generator 把它们包装成临时 unit 来跑。而原笔记提到的 Upstart 配置文件 /etc/init/rc-sysinit.conf 不存在——Upstart 早被 systemd 取代了(Ubuntu 6.10 到 14.10 用过它,之后全面转向 systemd)。

一句话总结:新系统里忘掉 runlevel,用 systemctl get-default / set-default / isolate + target。参考 Arch Wiki 的 systemd 条目 和 systemd.special 手册页。

弄一个能随便折腾的 Linux 环境

三条路,按上手成本从低到高:WSL2 → 虚拟机 → 云服务器。

方式一:Windows 上装 WSL2(最省事,本文实测环境就是这么来的)

WSL2 不是传统虚拟机:微软用一个轻量级 Hyper-V 虚拟机跑真正的 Linux 内核(实测 uname -r = 6.18.54.1-microsoft-standard-WSL2),命令行敲 wsl 就进去,Windows 和 Linux 的文件互相能访问。Ubuntu 官方也把它列为正式安装方式(ubuntu.com/wsl)。

完整流程(管理员 PowerShell):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 1) 只装 WSL 引擎,先不装发行版
> wsl --install --no-distribution
正在下载:适用于 Linux 的 Windows 子系统 3.0.3
正在安装:适用于 Linux 的 Windows 子系统 3.0.3
已安装 适用于 Linux 的 Windows 子系统 3.0.3。
操作成功完成。

# 2) 确认引擎到位(提示要重启就重启一次)
> wsl --version
WSL 版本: 3.0.3.0
内核版本: 6.18.54.1-1
WSLg 版本: 1.0.79
Windows 版本: 10.0.26300.9711

# 3) 看能装哪些发行版(带版本号的更稳)
> wsl --list --online
NAME FRIENDLY NAME
Ubuntu Ubuntu
Ubuntu-26.04 Ubuntu 26.04 LTS
Ubuntu-24.04 Ubuntu 24.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
openSUSE-Tumbleweed / openSUSE-Leap-16.0
RLCPlus-9 / RLCPlus-10 Rocky Linux Plus(CIQ)
AlmaLinux-8 / AlmaLinux-9 / AlmaLinux-10
FedoraLinux-43 / FedoraLinux-44
OracleLinux_7_9 / _8_10 / _9_5
SUSE-Linux-Enterprise-15-SP6 / -15-SP7 / -16.0
archlinux

# 4) 装指定版本,并把虚拟磁盘放到非 C 盘
> wsl --install -d Ubuntu-26.04 --location D:\wsl\Ubuntu-26.04
正在下载:Ubuntu 26.04 LTS
正在安装:Ubuntu 26.04 LTS
已成功安装分发。可以通过"wsl.exe -d Ubuntu-26.04"启动它
正在启动 Ubuntu-26.04...
Provisioning the new WSL instance Ubuntu-26.04
This might take a while...
Create a default Unix user account: loong
New password:
Retype new password:
passwd: password updated successfully
usermod: no changes

几个真实细节,踩过一次就记住了:

  • Ubuntu 和 Ubuntu-26.04 是两个不同的名字。前者指向「当前最新 LTS」,将来商店更新可能把你的环境换成下一代;后者锁死在 26.04。学习环境建议锁版本,资料才不会突然对不上。
  • 密码输入时屏幕完全不显示字符,连星号都没有,不是卡住了,盲打完回车即可。
  • 首次启动会问你是否参与 Ubuntu 的遥测上报(platform metrics collection),选 n 就行;已经选了 y 也能用 ubuntu-report -f send no 撤回。
  • --location 只对新建的发行版生效。已经建好的想挪盘,用 wsl --manage Ubuntu-26.04 --move D:\wsl\newpath(这个选项在 wsl --help 里能查到)。
  • 磁盘实际多大?D:\wsl\Ubuntu-26.04\ext4.vhdx 初始只有 1.39 GB;设置里那个「默认 VHD 大小 1 TB」是上限、稀疏增长,不会真占 1 TB。但 vhdx 只增不减,删了大量文件后要用 wsl --manage Ubuntu-26.04 --compact 压缩,或 --set-sparse true 打开自动回收。
  • 资源上限写在 C:\Users\你\.wslconfig(图形界面的「Windows 子系统设置」改的就是它),改完要 wsl --shutdown 才生效。我这台的配置与实测效果:
1
2
3
4
5
[wsl2]
processors=8 ; 实测 nproc -> 8,/proc/cmdline 里也能看到 nr_cpus=8
memory=8GB ; 实测 free -h -> 7.8Gi
swap=4GB
swapLocation=D:\wsl\swap.vhdx
  • systemd 在 WSL2 里默认开启(Ubuntu 26.04 实测),这也是为什么能在里面正常用 systemctl:
1
2
3
4
5
6
7
8
9
10
11
$ cat /etc/wsl.conf
[boot]
systemd=true

[user]
default=loong

$ systemctl status cron --no-pager | head -3
● cron.service - Regular background program processing daemon
Loaded: loaded (/usr/lib/systemd/system/cron.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-11-03 16:46:55 CST; 5min ago
  • 文件互通:Windows 的盘在 Linux 里挂成 /mnt/c、/mnt/d……(实测 /mnt 下有 c d e f wsl wslg),Linux 家目录从 Windows 侧走 \\wsl.localhost\Ubuntu-26.04\home\loong 访问。但别把工程放在 /mnt/... 下面编译:跨系统文件 IO 慢一个数量级,权限位也会失真,学习实验一律放在 Linux 自己的家目录里。
  • 官方文档:Install WSL、WSL 配置文件说明、Ubuntu on WSL。

方式二:虚拟机装 Ubuntu 桌面(要完整图形桌面、要练网络/磁盘时才选)

VMware Workstation Pro 已经免费(Broadcom 收购后从 2024 年起个人和商业使用都免费),版本也早过了 17.x,不存在「14 不支持你的 CPU 就退回 12」这种操作。其他选择:

方案 平台 说明
VMware Workstation Pro Windows/Linux 功能最全,现在免费
Hyper-V Windows 系统自带,和 WSL2 共用底层
VirtualBox 全平台 开源,体积小,够用
UTM / Parallels macOS Apple Silicon 上要选 ARM 版镜像

安装步骤本身没变,值得补的是几个新手必踩的点:

  1. 主板固件里先把 Intel VT-x / AMD-V 虚拟化打开,否则创建虚拟机时报「不支持 64 位」或启动直接失败。
  2. 网络选 NAT 就能上网;桥接是让虚拟机拿到局域网独立 IP,练服务器时才需要。
  3. 分区方案:/ 一个分区 + 一个 swap 分区(内存小于 4 GB 时 swap 很重要);纯练手直接「清除整个磁盘」最省心。
  4. 装完先做两件事:sudo apt update && sudo apt upgrade;如果分辨率不对或不能复制粘贴,装 open-vm-tools-desktop,别再挂 ISO 跑老的 vmware-install.pl。
  5. 快照是虚拟机最大的价值:装好干净系统立刻打一个快照,玩坏了 10 秒回滚。

方式三:一台云服务器

真要练「服务器」而不是「桌面 Linux」,最贴近生产的做法是拿一台云主机 SSH 上去。

安全提醒(很重要):

  • 云主机不要拿 root + 密码当唯一登录方式,改成密钥登录并关掉密码登录。
  • 不要把服务器密码或私钥写进会提交到 Git 的配置文件。仓库一旦公开,里面藏着 root 密码等于把服务器公开挂出去——密码要轮换,配置改用环境变量或不入库的本地文件。
  • 第一次登录先做三件事:adduser 建普通用户、usermod -aG sudo(RHEL 系是 wheel)给它提权、ufw allow OpenSSH 之后再 ufw enable。

第一次进入 Linux 先确认的几件事

拿到任何一个新 Linux(WSL、虚拟机、云主机都一样),先跑这几条,把「我在哪、有什么、谁在管」搞清楚。下面是我这台的真实输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 1) 我在哪个发行版上
$ lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 26.04.1 LTS
Release: 26.04
Codename: resolute

# 2) 哪个家族(决定你用 apt 还是 dnf)
$ ls /etc/debian_version /etc/redhat-release 2>&1
ls: cannot access '/etc/redhat-release': No such file or directory
/etc/debian_version

# 3) 内核、架构、位数
$ uname -mr
6.18.54.1-microsoft-standard-WSL2 x86_64
$ getconf LONG_BIT
64

# 4) 谁在管服务(PID 1)
$ ps -p 1 -o comm,args
COMMAND ARGS
systemd /sbin/init

# 5) 硬件资源与上限
$ nproc
8
$ free -h | head -2
total used free shared buff/cache available
Mem: 7.8Gi 587Mi 6.8Gi 4.1Mi 554Mi 7.2Gi

# 6) 包管理器版本
$ apt --version
apt 3.2.0 (amd64)

# 7) 时间与时区(排查日志、定时任务前必看)
$ timedatectl | head -4
Local time: Tue 2026-11-03 16:49:56 CST
Universal time: Tue 2026-11-03 08:49:56 UTC
RTC time: Tue 2026-11-03 08:49:56
Time zone: Asia/Shanghai (CST, +0800)

第 2 条那个「先判断家族」的习惯很值:apt 和 dnf 混着用是新手最常见的翻车点,而 /etc/debian_version、/etc/redhat-release 这两个文件的存在与否,比看发行版花名靠谱得多。

常见坑速查

  • 把「内核版本」当「系统版本」:uname -r 的 6.18.54 是内核,lsb_release -a 的 26.04 才是发行版。
  • 把 wsl --version 里的 10.0.26300.9711 读成 Windows 10:10.0 是 NT 内核版本号,Win10/Win11 共用;看产品名要用 Win32_OperatingSystem.Caption,看版本要用 DisplayVersion(26H2)+ CurrentBuild.UBR(26300.9711)。
  • 用 runlevel / who -r 看运行级别:新系统里可能没装或没数据(实测如此),改 systemctl get-default。
  • 照着 CentOS 教程在 Rocky/TencentOS 上敲 yum install:RHEL 9/10 上 yum 只是 dnf 的软链接,能用但选项不完全一样;而 Ubuntu 上 yum/dnf 根本没装。
  • 以为 WSL 就是普通虚拟机:它没有 BIOS/GRUB/分区表那一套(/proc/cmdline 里有 WSL_ROOT_INIT=1),所以「改 GRUB 进单用户模式」这类操作在 WSL 里不适用。
  • 工程放在 /mnt/c 下:跨系统 IO 慢、权限位失真,编译和 git 操作都会明显变慢。
  • WSL 不设资源上限:默认会吃掉一半内存和全部逻辑 CPU,跑大任务时 Windows 侧会卡;用 .wslconfig 限一下,改完 wsl --shutdown 生效。
  • vhdx 越用越大不缩:删文件不会还给 Windows,需要 wsl --manage <发行版> --compact 或开稀疏模式。
  • 在公开仓库里留服务器 root 密码:这不是「不规范」,这是事故。密码轮换 + 改用环境变量或不入库文件。
  • 一上来就装桌面环境练服务器:图形服务会把注意力从「命令、进程、服务、日志」上带走,先纯命令行。

练习

  1. 按本文的 WSL2 流程装一个 Ubuntu-26.04(锁版本、指定 --location),把 wsl --version、lsb_release -a、uname -a、nproc、free -h 的输出记下来,作为后续所有文章的「环境基线」。
  2. 用 command -v 逐个检查 apt、dnf、yum、rpm、systemctl、runlevel、ufw、firewalld 在你机器上是否存在,整理成一张「我的系统有什么」的表——这个动作比背命令有用。
  3. 把 systemctl get-default 换成 multi-user.target 再换回来,然后解释两件事:为什么它等价于旧系统的「运行级别 5 ↔ 3」,以及它实际改的是哪个文件(提示:ls -l /etc/systemd/system/default.target)。
  4. 从 /proc/cmdline 里找出 3 个能说明「这是虚拟机/WSL」的关键词并解释含义(nr_cpus、console=hvc0、WSL_ROOT_INIT 都是好例子)。
  5. 对照本文的 apt/dnf 表,在 Debian 系机器和 RHEL 系机器上各做一次「查包 → 装包 → 查它装了哪些文件 → 删包」,把两边命令并排记下来。

参考