适用读者:有 C++/Qt 基础(熟悉 QDir / QFile),手边有一台云服务器(示例环境:Alibaba Cloud Linux,2 核 / 2G / 40G 系统盘)。 主线:每条命令都在真实服务器上跑过,边用边理解。

1. 根目录里都有什么

ls / 看到的目录(Alibaba Cloud Linux 实测):

bin  dev  home  lib64       media  opt   root  sbin  swapfile  tmp  var
boot etc  lib   lost+found  mnt    proc  run   srv   sys       usr

这些目录不是平级无关的文件夹,而是各司其职(FHS 标准约定):

目录放什么类比 Windows
/etc系统与服务配置文件C:\Windows\System32 配置
/usr系统软件与库(最大)C:\Program Files
/var经常变化的数据:日志、缓存C:\ProgramData 日志
/home普通用户的家目录C:\Users\
/rootroot 用户的家目录(不在 /home 里)—
/tmp临时文件,重启可能清空%TEMP%
/opt第三方大软件D:\Software
/boot启动引导文件—
/proc /sys /dev /run内存虚拟文件系统,不在磁盘上—
lost+foundext4 文件系统 fsck 修复碎片(有它说明 / 是 ext4)磁盘扫描碎片
swapfile交换文件(小内存机器用文件代替交换分区)虚拟内存 pagefile.sys

💡 /proc 里的数字目录就是进程 PID——内核把进程信息伪装成文件给你看,cat /proc/cpuinfo 就是读 CPU 信息。


2. 目录 ≠ 分区:磁盘与挂载

核心要点:Linux 只有一棵目录树,/ 是唯一顶点;磁盘分区是「外设」,用挂载的方式插到树的某个目录上。目录在哪个分区,取决于挂载配置。

2.1 两条查询命令

lsblk        # 树状列出所有块设备和挂载点
df -h /      # 直接看 / 在哪个设备上、用量多少

2.2 实测:云主机的磁盘布局

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0   40G  0 disk          ← 一块 40G 虚拟云盘
├─vda1 253:1    0    2M  0 part          ← BIOS 引导分区(不挂载)
├─vda2 253:2    0  200M  0 part /boot/efi ← EFI 启动分区
└─vda3 253:3    0 39.8G  0 part /         ← 根分区,承载整棵目录树

设备名解读:

  • vd = virtio disk(KVM 虚拟化云主机的虚拟盘;物理机一般是 sda)
  • a = 第一块盘;vda1/vda2/vda3 = 该盘的第 1/2/3 分区

df -h 输出解读:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda3        40G  8.1G   30G  22% /        ← 已用 8.1G,剩 30G

部署服务、拉镜像前先 df -h 看一眼空间。

2.3 与 Windows 的本质区别

WindowsLinux
结构一个分区 = 一个盘符,C:\ D:\ 平行多棵树只有一棵树 /
分区地位树本身树上挂的「零件」,挂载点 = 挂到哪个目录
找到分区看盘符lsblk / df -h

💡 关键顿悟:/ 像 QTreeWidget 的树,分区是 item,mount 就是把 item insert 到某个节点下。目录 ≠ 分区——/etc /usr 全在 vda3 上,只是普通文件夹;/boot/efi 才是独立分区挂上来的。


3. 基础导航:ls / cd / pwd

命令作用备注
ls列出当前目录内容ls -l 详细信息,ls -R 递归
cd 路径切换目录不带参数 = 回家
cd ..上一级在 / 下原地不动(顶点无父目录)
pwd显示当前绝对路径迷路了就敲它

提示符本身就是信息面板:

[ root  @  <你的主机名>  ~ ]  #
   ↑         ↑            ↑   ↑
 用户名     主机名       当前目录  # = root;普通用户是 $

路径:绝对 vs 相对

写法含义实测
cd /root绝对路径,从根出发任何位置都有效
cd root/相对路径,从当前位置出发只在 / 下有效
cd ~ / cd回当前用户家目录root 是 /root

💡 关键顿悟:~ 不是固定的 /root,而是「当前用户的家」——换普通用户登录,~ 就是 /home/用户名。写脚本、配服务时一律用绝对路径,因为脚本运行时的工作目录不确定。

验证实验:在 /root 下 cd .. 到 /,再 ls 看到全部根目录——家目录也只是根下的普通目录,没有神秘之处。


4. 文件操作五件套

命令作用Qt 类比
mkdir 目录名新建目录QDir().mkdir()
mkdir -p a/b/c一次建多层,父目录自动补—
touch 文件新建空文件 / 更新时间戳QFile 打开不写
cp 源 目标复制(目录要 -r)拷贝构造
mv 源 目标移动;同目录 = 重命名QDir::rename()
rm 文件删除(目录要 -r)QFile::remove()

⚠️ Linux 的 rm 没有回收站:无确认提示、无 Ctrl+Z。带 -rf 前先 pwd 确认自己在哪。

查看文件内容:

命令场景
cat 文件小文件一次性全看
less 文件大文件分屏(空格翻页,q 退出)
head -n 20 / tail -n 20只看头 / 尾 20 行
tail -f 日志实时滚动看日志——部署服务后最常用

💡 关键顿悟:Linux 选项设计很统一——-r 几乎总是「递归对目录整体操作」(cp -r rm -r),-p 总是「缺什么补什么」(mkdir -p)。记住规律,新命令的选项能猜出大半。


5. 权限:10 个字符管住整个系统

5.1 权限串怎么读

ls -l 输出的第一列:

-  rwx  r-x  r-x
↑  ↑↑↑  ↑↑↑  ↑↑↑
│   │    │    └── 第 3 组:其他人(others)
│   │    └─────── 第 2 组:同组(group)
│   └──────────── 第 1 组:属主(owner)
└── 文件类型:- 文件 / d 目录 / l 软链接(占位,不是权限)
  • 第 1 位是类型占位,后 9 位三三分组,顺序固定:属主 → 组 → 其他人,组内固定 r w x
  • r=读(4) w=写(2) x=执行(1);- 表示该权限没有

5.2 数字表示法

每组按 4/2/1 加总:

数字权限串含义典型用途
755rwxr-xr-x自己全权,别人可读可进目录、可执行程序
644rw-r--r--自己读写,别人只读普通文件(touch 新建的默认)
600rw-------只有自己能读写私钥、密码文件

5.3 目录的 x 有特殊含义

  • 对文件,x = 可执行
  • 对目录,x = 可进入(cd);没有 x 进不去,没有 r 则进得去但 ls 不了

5.4 两个必会命令

chmod 755 server.conf          # 改权限(数字法)
chown root:root server.conf    # 改属主:属组

实测:touch 新建文件是 -rw-r--r--(644),chmod 755 后变 -rwxr-xr-x(755),三组各多了 x。

💡 关键顿悟:权限挂在文件上,不挂在用户手上——同一文件,属主、组、路人看到的权限可以完全不同。9 个 bit 管住整个系统的访问控制,比 Windows ACL 简洁。后端部署时「服务起不来」,权限不对是排错第一嫌疑人,ls -l 是第一诊断工具。


6. 实战:搭一个部署工作目录

后续 C++ 项目部署可以统一用这个结构:

cd ~
mkdir -p workspace/logs workspace/bin workspace/conf
touch workspace/conf/server.conf
ls -R workspace
workspace/
├── bin/    ← 放编译好的可执行文件
├── conf/   ← 配置文件(server.conf)
└── logs/   ← 运行日志

7. 小结:这一篇该掌握什么

  • 能说出 /etc /usr /var /home /root /proc 各放什么
  • 知道目录 ≠ 分区,会用 lsblk 和 df -h 查分区与挂载点
  • 能读懂自己服务器上的三分区布局(vda1 BIOS / vda2 EFI / vda3 根)
  • 熟练用 ls cd pwd 导航,分得清绝对 / 相对路径
  • 会 mkdir -p touch cp mv rm,知道 rm 无回收站
  • 能逐字符读权限串,会算 755/644/600,会用 chmod
  • 搭好 ~/workspace 这套部署目录结构

后续方向

  • chown 与服务部署的关系(为什么要给服务用户改属主)
  • 用户与用户组(useradd / su / sudo)
  • tail -f 看日志实战(把自己部署的服务跑起来之后)
  • 用 g++ + CMake 在服务器上编译部署自己的项目