Linux系统核心概念用户、权限、环境变量与软硬链接命令背了一堆但遇到Permission denied还是懵看到软链接硬链接还是分不清。问题出在概念没吃透。本文把Linux最核心的四个概念一次讲清楚。一、Linux用户系统1.1 用户与用户组Linux是一个多用户多任务操作系统这意味着多个用户可以同时登录、各自独立工作。每个用户有唯一的身份标识——UIDUser ID。Linux用户分为三类用户类型UID范围说明超级用户root0拥有最高权限不受任何限制系统用户1~999系统服务运行的身份如www-data、sshd普通用户1000日常登录使用的用户每个用户可以属于一个或多个用户组组也有唯一标识GIDGroup 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的区别特性sudosu需要的密码当前用户密码目标用户密码权限范围单条命令整个会话安全性较高有日志审计较低使用场景临时执行管理员命令完整切换用户身份二、Linux权限模型2.1 权限的基本表示Linux中每个文件和目录都有三组权限分别对应三种身份rwx rwx rwx ──┬── ──┬── ──┬── │ │ │ │ │ └─ 其他用户Others │ └─ 所属组Group └─ 所有者User/Owner三种权限的含义权限文件目录r读查看文件内容列出目录中的文件名w写修改文件内容在目录中创建/删除文件x执行运行文件进入目录cd关键区别对目录来说r权限只能看到文件名列表要进入目录必须有x权限。所以目录的默认权限通常是755rwxr-xr-x而不是644。2.2 数字表示法r 4, w 2, x 1, - 0 常见权限值 7 (421) rwx 读写执行 6 (420) rw- 读写 5 (401) r-x 读执行 4 (400) r-- 只读 0 (000) --- 无权限常用组合速查数字字母含义典型用途755rwxr-xr-x所有者全权限其他人读执行目录、可执行程序644rw-r–r–所有者读写其他人只读普通配置文件600rw-------仅所有者读写私密文件如SSH密钥777rwxrwxrwx所有人全权限临时调试用不安全2.3 特殊权限位除了基本的rwxLinux还有三个特殊权限位SUIDSet 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。# 设置SUIDsudochmodus myprogram# 或数字方式4755sudochmod4755myprogramSGIDSet Group ID— 2对目录设置SGID后目录中新建的文件会自动继承目录的所属组而不是创建者的主组。这在团队共享目录中非常有用。sudochmodgs /opt/shared# 或数字方式2775sudochmod2775/opt/sharedSticky Bit — 1设置Sticky Bit的目录用户只能删除自己创建的文件。/tmp目录就是典型例子ls-ld/tmp# drwxrwxrwt ← 末尾的t表示Sticky Bitsudochmodt /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# 永久修改写入 ~/.bashrcechoumask 027~/.bashrc三、环境变量3.1 什么是环境变量环境变量是操作系统中存储配置信息的键值对进程启动时会继承这些变量。你每次在终端输入命令时Shell怎么知道ls在哪就是通过PATH环境变量找到的。3.2 查看环境变量# 查看所有环境变量envprintenv# 查看单个变量echo$PATHecho$HOMEecho$USERecho$SHELL# 查看Shell变量含环境变量和局部变量set3.3 常用环境变量变量名含义示例值PATH命令搜索路径/usr/bin:/bin:/usr/local/binHOME用户家目录/home/userUSER当前用户名userSHELL当前Shell路径/bin/bashPWD当前工作目录/home/user/projectLANG系统语言en_US.UTF-8LD_LIBRARY_PATH动态库搜索路径/usr/local/lib3.4 设置环境变量# 临时设置仅当前终端有效exportMY_VARhelloexportPATH$PATH:/opt/mytoolchain/bin# 追加路径到PATH# 查看是否生效echo$MY_VARecho$PATH# 删除变量unsetMY_VAR3.5 永久设置环境变量根据生效范围不同写入不同文件文件生效范围说明~/.bashrc当前用户每次打开终端时加载最常用~/.bash_profile当前用户登录时加载/etc/environment所有用户系统级环境变量/etc/profile所有用户所有用户登录时加载/etc/profile.d/*.sh所有用户模块化配置推荐方式# 方式一写入 ~/.bashrc推荐echoexport ARM_TOOLCHAIN/opt/gcc-arm/bin~/.bashrcechoexport 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它们地位平等删除其中一个其他文件仍然可以访问数据只有当所有硬链接都被删除时数据才真正被释放不能跨文件系统不能给不同分区的文件创建硬链接不能对目录创建硬链接系统限制# 实验验证echohellofile.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# 修改一个另一个也变因为指向同一数据echoworldhardlink.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无法访问# 实验验证echohellofile.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和权限模型很多以前遇到的报错都能自己解释清楚了。