Linux系统核心概念:用户、权限、环境变量与软硬链接
Linux系统核心概念:用户、权限、环境变量与软硬链接
命令背了一堆,但遇到"Permission denied"还是懵,看到软链接硬链接还是分不清。问题出在概念没吃透。本文把Linux最核心的四个概念一次讲清楚。
一、Linux用户系统
1.1 用户与用户组
Linux是一个多用户多任务操作系统,这意味着多个用户可以同时登录、各自独立工作。每个用户有唯一的身份标识——UID(User ID)。
Linux用户分为三类:
| 用户类型 | UID范围 | 说明 |
|---|---|---|
| 超级用户(root) | 0 | 拥有最高权限,不受任何限制 |
| 系统用户 | 1~999 | 系统服务运行的身份(如www-data、sshd) |
| 普通用户 | 1000+ | 日常登录使用的用户 |
每个用户可以属于一个或多个用户组,组也有唯一标识GID(Group ID)。用户组的作用是方便批量管理权限——把几个人放进同一个组,给组授权即可。
1.2 用户相关配置文件
/etc/passwd # 用户信息(所有用户可读) /etc/shadow # 密码哈希(仅root可读) /etc/group # 用户组信息看一行/etc/passwd的内容:
user:x:1000:1000:User,,,:/home/user:/bin/bash │ │ │ │ │ │ │ │ │ │ │ │ │ └─ 登录Shell │ │ │ │ │ └─ 家目录 │ │ │ │ └─ 用户全名/备注 │ │ │ └─ GID(主组ID) │ │ └─ UID │ └─ 密码占位符(实际密码在shadow中) └─ 用户名1.3 用户管理命令
# 添加用户sudouseradd-m-s/bin/bash newuser# -m创建家目录,-s指定Shellsudopasswdnewuser# 设置密码# 添加用户的更推荐方式(交互式,会自动创建家目录)sudoadduser devuser# 删除用户sudouserdel-rdevuser# -r同时删除家目录# 修改用户属性sudousermod-aGsudodevuser# 将用户加入sudo组(获得管理员权限)sudousermod-aGdialout devuser# 加入dialout组(串口设备访问权限)sudousermod-s/bin/zsh devuser# 修改登录Shell# 查看用户信息id# 查看当前用户的UID/GID/组信息iddevuser# 查看指定用户groups# 查看当前用户所属的组whoami# 查看当前用户名嵌入式场景:开发板上串口设备通常是
/dev/ttyUSB0或/dev/ttyACM0,默认只有root能访问。把当前用户加入dialout组即可免sudo操作串口:sudo usermod -aG dialout $USER,重新登录后生效。
1.4 sudo与su
# sudo:以管理员权限执行单条命令(需要输入自己的密码)sudoaptinstallvim# su:切换到其他用户su- root# 切换到root(需要root密码)su- devuser# 切换到devuser# sudo -i / sudo -s:获取root交互式Shellsudo-i# 进入root的登录Shell(加载root环境变量)sudo-s# 进入root的非登录Shell# 退出rootexitsudo与su的区别:
| 特性 | sudo | su |
|---|---|---|
| 需要的密码 | 当前用户密码 | 目标用户密码 |
| 权限范围 | 单条命令 | 整个会话 |
| 安全性 | 较高(有日志审计) | 较低 |
| 使用场景 | 临时执行管理员命令 | 完整切换用户身份 |
二、Linux权限模型
2.1 权限的基本表示
Linux中每个文件和目录都有三组权限,分别对应三种身份:
rwx rwx rwx ──┬── ──┬── ──┬── │ │ │ │ │ └─ 其他用户(Others) │ └─ 所属组(Group) └─ 所有者(User/Owner)三种权限的含义:
| 权限 | 文件 | 目录 |
|---|---|---|
| r(读) | 查看文件内容 | 列出目录中的文件名 |
| w(写) | 修改文件内容 | 在目录中创建/删除文件 |
| x(执行) | 运行文件 | 进入目录(cd) |
关键区别:对目录来说,
r权限只能看到文件名列表,要进入目录必须有x权限。所以目录的默认权限通常是755(rwxr-xr-x),而不是644。
2.2 数字表示法
r = 4, w = 2, x = 1, - = 0 常见权限值: 7 (4+2+1) = rwx 读写执行 6 (4+2+0) = rw- 读写 5 (4+0+1) = r-x 读执行 4 (4+0+0) = r-- 只读 0 (0+0+0) = --- 无权限常用组合速查:
| 数字 | 字母 | 含义 | 典型用途 |
|---|---|---|---|
| 755 | rwxr-xr-x | 所有者全权限,其他人读+执行 | 目录、可执行程序 |
| 644 | rw-r–r– | 所有者读写,其他人只读 | 普通配置文件 |
| 600 | rw------- | 仅所有者读写 | 私密文件(如SSH密钥) |
| 777 | rwxrwxrwx | 所有人全权限 | 临时调试用,不安全 |
2.3 特殊权限位
除了基本的rwx,Linux还有三个特殊权限位:
SUID(Set User ID)— 4
# 最经典的例子:passwd命令ls-l/usr/bin/passwd# -rwsr-xr-x 1 root root ... /usr/bin/passwd# ↑ s表示SUID位已设置SUID的作用:普通用户执行该程序时,临时获得文件所有者(root)的权限。passwd命令能修改/etc/shadow(只有root能写),就是因为SUID。
# 设置SUIDsudochmodu+s myprogram# 或数字方式:4755sudochmod4755myprogramSGID(Set Group ID)— 2
对目录设置SGID后,目录中新建的文件会自动继承目录的所属组,而不是创建者的主组。这在团队共享目录中非常有用。
sudochmodg+s /opt/shared# 或数字方式:2775sudochmod2775/opt/sharedSticky Bit — 1
设置Sticky Bit的目录,用户只能删除自己创建的文件。/tmp目录就是典型例子:
ls-ld/tmp# drwxrwxrwt ← 末尾的t表示Sticky Bitsudochmod+t /mydir# 或数字方式:1777sudochmod1777/mydir2.4 umask — 默认权限控制
umask决定新创建文件和目录的默认权限:
umask# 查看当前umask值(通常为022)计算规则:
目录默认权限 = 777 - umask 文件默认权限 = 666 - umask umask = 022时: 目录:777 - 022 = 755 (rwxr-xr-x) 文件:666 - 022 = 644 (rw-r--r--)# 临时修改umaskumask027# 目录750,文件640# 永久修改(写入 ~/.bashrc)echo"umask 027">>~/.bashrc三、环境变量
3.1 什么是环境变量?
环境变量是操作系统中存储配置信息的键值对,进程启动时会继承这些变量。你每次在终端输入命令时,Shell怎么知道ls在哪?就是通过PATH环境变量找到的。
3.2 查看环境变量
# 查看所有环境变量envprintenv# 查看单个变量echo$PATHecho$HOMEecho$USERecho$SHELL# 查看Shell变量(含环境变量和局部变量)set3.3 常用环境变量
| 变量名 | 含义 | 示例值 |
|---|---|---|
PATH | 命令搜索路径 | /usr/bin:/bin:/usr/local/bin |
HOME | 用户家目录 | /home/user |
USER | 当前用户名 | user |
SHELL | 当前Shell路径 | /bin/bash |
PWD | 当前工作目录 | /home/user/project |
LANG | 系统语言 | en_US.UTF-8 |
LD_LIBRARY_PATH | 动态库搜索路径 | /usr/local/lib |
3.4 设置环境变量
# 临时设置(仅当前终端有效)exportMY_VAR="hello"exportPATH=$PATH:/opt/mytoolchain/bin# 追加路径到PATH# 查看是否生效echo$MY_VARecho$PATH# 删除变量unsetMY_VAR3.5 永久设置环境变量
根据生效范围不同,写入不同文件:
| 文件 | 生效范围 | 说明 |
|---|---|---|
~/.bashrc | 当前用户 | 每次打开终端时加载(最常用) |
~/.bash_profile | 当前用户 | 登录时加载 |
/etc/environment | 所有用户 | 系统级环境变量 |
/etc/profile | 所有用户 | 所有用户登录时加载 |
/etc/profile.d/*.sh | 所有用户 | 模块化配置,推荐方式 |
# 方式一:写入 ~/.bashrc(推荐)echo'export ARM_TOOLCHAIN=/opt/gcc-arm/bin'>>~/.bashrcecho'export PATH=$PATH:$ARM_TOOLCHAIN'>>~/.bashrcsource~/.bashrc# 立即生效# 方式二:写入 /etc/profile.d/(系统级,推荐)sudovim/etc/profile.d/toolchain.sh# 写入以下内容:# export ARM_TOOLCHAIN=/opt/gcc-arm/bin# export PATH=$PATH:$ARM_TOOLCHAIN# 方式三:修改 /etc/environment(系统级,简单)# PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/mytoolchain/bin"嵌入式场景:安装交叉编译工具链后,必须把工具链的
bin目录加入PATH,否则系统找不到arm-linux-gnueabihf-gcc命令。
四、软链接与硬链接
4.1 什么是链接?
链接(Link)让一个文件有多个"入口"。Linux中有两种链接方式:硬链接和软链接(符号链接)。
4.2 inode:理解链接的前提
Linux文件系统中,每个文件有一个唯一的inode(索引节点),存储文件的元数据(权限、大小、数据块位置等)。文件名只是指向inode的一个"别名"。
文件名 ──→ inode ──→ 数据块 file1.c ──→ inode #12345 ──→ 磁盘数据一个inode可以被多个文件名指向,这就是硬链接的本质。
4.3 硬链接
# 创建硬链接lnoriginal.txt hardlink.txt硬链接的特点:
- 多个文件名指向同一个inode,它们地位平等
- 删除其中一个,其他文件仍然可以访问数据
- 只有当所有硬链接都被删除时,数据才真正被释放
- 不能跨文件系统(不能给不同分区的文件创建硬链接)
- 不能对目录创建硬链接(系统限制)
# 实验验证echo"hello">file.txtlnfile.txt hardlink.txtls-lifile.txt hardlink.txt# 输出:# 12345 -rw-r--r-- 2 user user 6 ... file.txt# 12345 -rw-r--r-- 2 user user 6 ... hardlink.txt# ↑ inode号相同 ↑ 硬链接数为2# 修改一个,另一个也变(因为指向同一数据)echo"world">>hardlink.txtcatfile.txt# 输出:hello world# 删除原文件,硬链接仍然可用rmfile.txtcathardlink.txt# 输出:hello world(数据还在)4.4 软链接
# 创建软链接(符号链接)ln-soriginal.txt softlink.txtln-s/opt/toolchain/bin/arm-gcc /usr/local/bin/arm-gcc软链接的特点:
- 软链接是一个独立的文件,有自己的inode,内容是指向目标文件的路径
- 类似Windows的快捷方式
- 可以跨文件系统
- 可以对目录创建软链接
- 如果目标文件被删除,软链接变为悬空链接(dangling link),无法访问
# 实验验证echo"hello">file.txtln-sfile.txt softlink.txtls-lifile.txt softlink.txt# 输出:# 12345 -rw-r--r-- 1 user user 6 ... file.txt# 67890 lrwxrwxrwx 1 user user 8 ... softlink.txt -> file.txt# ↑ inode号不同 ↑ l表示软链接# 删除原文件,软链接失效rmfile.txtcatsoftlink.txt# cat: softlink.txt: No such file or directory4.5 两种链接对比
| 特性 | 硬链接 | 软链接 |
|---|---|---|
| inode | 与原文件相同 | 独立的inode |
| 跨文件系统 | 不支持 | 支持 |
| 链接目录 | 不支持 | 支持 |
| 原文件删除后 | 仍可访问数据 | 失效(悬空链接) |
| 占用空间 | 几乎不占 | 占少量(存路径) |
| 创建命令 | ln 源 链接 | ln -s 源 链接 |
| 类比 | 同一个人的多个名字 | 快捷方式 |
4.6 嵌入式开发中的实际应用
# 场景1:工具链版本切换# 通过软链接指向当前需要的版本,切换时只改链接ln-s/opt/gcc-arm-10.2 /opt/gcc-arm-current# 以后PATH中只需加 /opt/gcc-arm-current/bin# 切换版本时:rm/opt/gcc-arm-currentln-s/opt/gcc-arm-12.1 /opt/gcc-arm-current# 场景2:库文件版本管理ln-slibfoo.so.1.2.3 libfoo.so.1# SONAME链接ln-slibfoo.so.1 libfoo.so# 开发链接# 场景3:配置文件统一管理ln-s/mnt/nfs/shared_config.conf /etc/app.conf五、总结
用户系统决定"你是谁",权限模型决定"你能做什么",环境变量决定"程序怎么运行",软硬链接决定"文件怎么组织"。这四个概念构成了Linux系统管理的核心知识体系。理解了inode和权限模型,很多以前遇到的报错都能自己解释清楚了。