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# 退出rootexit

sudosu的区别:

特性sudosu
需要的密码当前用户密码目标用户密码
权限范围单条命令整个会话
安全性较高(有日志审计)较低
使用场景临时执行管理员命令完整切换用户身份

二、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) = --- 无权限

常用组合速查:

数字字母含义典型用途
755rwxr-xr-x所有者全权限,其他人读+执行目录、可执行程序
644rw-r–r–所有者读写,其他人只读普通配置文件
600rw-------仅所有者读写私密文件(如SSH密钥)
777rwxrwxrwx所有人全权限临时调试用,不安全

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# 或数字方式:4755sudochmod4755myprogram

SGID(Set Group ID)— 2

对目录设置SGID后,目录中新建的文件会自动继承目录的所属组,而不是创建者的主组。这在团队共享目录中非常有用。

sudochmodg+s /opt/shared# 或数字方式:2775sudochmod2775/opt/shared

Sticky Bit — 1

设置Sticky Bit的目录,用户只能删除自己创建的文件。/tmp目录就是典型例子:

ls-ld/tmp# drwxrwxrwt ← 末尾的t表示Sticky Bit
sudochmod+t /mydir# 或数字方式:1777sudochmod1777/mydir

2.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变量(含环境变量和局部变量)set

3.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_VAR

3.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 directory

4.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和权限模型,很多以前遇到的报错都能自己解释清楚了。